172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/geolocation_permission_context.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <functional> 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <string> 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <vector> 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/geolocation/geolocation_content_settings_map.h" 144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/google/google_util.h" 153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h" 1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/tab_contents/confirm_infobar_delegate.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/tab_util.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h" 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/geolocation/geolocation_provider.h" 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_process_host.h" 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h" 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/geolocation_messages.h" 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h" 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h" 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h" 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/locale_settings.h" 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/theme_resources.h" 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_util.h" 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h" 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// GeolocationInfoBarQueueController ------------------------------------------ 384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class controls the geolocation infobar queue per profile, and it's an 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// internal class to GeolocationPermissionContext. 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// An alternate approach would be to have this queue per tab, and use 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notifications to broadcast when permission is set / listen to notification to 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// cancel pending requests. This may be specially useful if there are other 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// things listening for such notifications. 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// For the time being this class is self-contained and it doesn't seem pulling 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the notification infrastructure would simplify. 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass GeolocationInfoBarQueueController : NotificationObserver { 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GeolocationInfoBarQueueController( 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GeolocationPermissionContext* geolocation_permission_context, 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile); 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ~GeolocationInfoBarQueueController(); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The InfoBar will be displayed immediately if the tab is not already 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // displaying one, otherwise it'll be queued. 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void CreateInfoBarRequest(int render_process_id, 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id, 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& requesting_frame, 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& emebedder); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Cancels a specific infobar request. 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void CancelInfoBarRequest(int render_process_id, 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id); 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called by the InfoBarDelegate to notify it's closed. It'll display a new 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // InfoBar if there's any request pending for this tab. 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void OnInfoBarClosed(int render_process_id, 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id); 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called by the InfoBarDelegate to notify permission has been set. 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // It'll notify and dismiss any other pending InfoBar request for the same 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |requesting_frame| and embedder. 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void OnPermissionSet(int render_process_id, 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id, 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& requesting_frame, 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& embedder, 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool allowed); 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // NotificationObserver 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void Observe(NotificationType type, 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const NotificationSource& source, 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const NotificationDetails& details); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct PendingInfoBarRequest; 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen class RequestEquals; 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::vector<PendingInfoBarRequest> PendingInfoBarRequests; 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Shows the first pending infobar for this tab. 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ShowQueuedInfoBar(int render_process_id, int render_view_id); 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Cancels an InfoBar request and returns the next iterator position. 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PendingInfoBarRequests::iterator CancelInfoBarRequestInternal( 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PendingInfoBarRequests::iterator i); 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NotificationRegistrar registrar_; 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GeolocationPermissionContext* const geolocation_permission_context_; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* const profile_; 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PendingInfoBarRequests pending_infobar_requests_; 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// GeolocationConfirmInfoBarDelegate ------------------------------------------ 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GeolocationConfirmInfoBarDelegate : public ConfirmInfoBarDelegate { 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GeolocationConfirmInfoBarDelegate( 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TabContents* tab_contents, 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GeolocationInfoBarQueueController* controller, 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_process_id, 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id, 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& requesting_frame_url, 12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& display_languages); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual ~GeolocationConfirmInfoBarDelegate(); 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // ConfirmInfoBarDelegate: 12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void InfoBarClosed(); 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual SkBitmap* GetIcon() const; 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual Type GetInfoBarType() const; 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual string16 GetMessageText() const; 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual string16 GetButtonLabel(InfoBarButton button) const; 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual bool Accept(); 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual bool Cancel(); 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual string16 GetLinkText(); 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual bool LinkClicked(WindowOpenDisposition disposition); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContents* tab_contents_; 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GeolocationInfoBarQueueController* controller_; 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int render_process_id_; 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int render_view_id_; 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int bridge_id_; 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL requesting_frame_url_; 1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string display_languages_; 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(GeolocationConfirmInfoBarDelegate); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGeolocationConfirmInfoBarDelegate::GeolocationConfirmInfoBarDelegate( 15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TabContents* tab_contents, 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GeolocationInfoBarQueueController* controller, 15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_process_id, 15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id, 15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& requesting_frame_url, 15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& display_languages) 15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : ConfirmInfoBarDelegate(tab_contents), 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_(tab_contents), 15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen controller_(controller), 16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen render_process_id_(render_process_id), 16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen render_view_id_(render_view_id), 16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bridge_id_(bridge_id), 16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen requesting_frame_url_(requesting_frame_url), 16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen display_languages_(display_languages) { 16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGeolocationConfirmInfoBarDelegate::~GeolocationConfirmInfoBarDelegate() { 16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationConfirmInfoBarDelegate::InfoBarClosed() { 17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen controller_->OnInfoBarClosed(render_process_id_, render_view_id_, 17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bridge_id_); 17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen delete this; 17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSkBitmap* GeolocationConfirmInfoBarDelegate::GetIcon() const { 17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return ResourceBundle::GetSharedInstance().GetBitmapNamed( 17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen IDR_GEOLOCATION_INFOBAR_ICON); 17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenInfoBarDelegate::Type 18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GeolocationConfirmInfoBarDelegate::GetInfoBarType() const { 18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return PAGE_ACTION_TYPE; 18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 GeolocationConfirmInfoBarDelegate::GetMessageText() const { 18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return l10n_util::GetStringFUTF16(IDS_GEOLOCATION_INFOBAR_QUESTION, 18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen net::FormatUrl(requesting_frame_url_.GetOrigin(), display_languages_)); 18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 GeolocationConfirmInfoBarDelegate::GetButtonLabel( 19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InfoBarButton button) const { 19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return l10n_util::GetStringUTF16((button == BUTTON_OK) ? 19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen IDS_GEOLOCATION_ALLOW_BUTTON : IDS_GEOLOCATION_DENY_BUTTON); 19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool GeolocationConfirmInfoBarDelegate::Accept() { 19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen controller_->OnPermissionSet(render_process_id_, render_view_id_, bridge_id_, 19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen requesting_frame_url_, tab_contents_->GetURL(), true); 20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return true; 20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool GeolocationConfirmInfoBarDelegate::Cancel() { 20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen controller_->OnPermissionSet(render_process_id_, render_view_id_, bridge_id_, 20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen requesting_frame_url_, tab_contents_->GetURL(), false); 20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return true; 20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 GeolocationConfirmInfoBarDelegate::GetLinkText() { 21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return l10n_util::GetStringUTF16(IDS_LEARN_MORE); 21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool GeolocationConfirmInfoBarDelegate::LinkClicked( 21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen WindowOpenDisposition disposition) { 21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const char kGeolocationLearnMoreUrl[] = 21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_CHROMEOS) 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "https://www.google.com/support/chromeos/bin/answer.py?answer=142065"; 21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#else 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "https://www.google.com/support/chrome/bin/answer.py?answer=142065"; 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif 22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Ignore the click disposition and always open in a new top level tab. 22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_->OpenURL( 22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen google_util::AppendGoogleLocaleParam(GURL(kGeolocationLearnMoreUrl)), 22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK); 22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return false; // Do not dismiss the info bar. 22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// GeolocationInfoBarQueueController::PendingInfoBarRequest ------------------- 23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct GeolocationInfoBarQueueController::PendingInfoBarRequest { 23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public: 23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PendingInfoBarRequest(int render_process_id, 23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id, 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& requesting_frame, 240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& embedder); 24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool IsForTab(int p_render_process_id, int p_render_view_id) const; 24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool IsForPair(const GURL& p_requesting_frame, 24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& p_embedder) const; 24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool Equals(int p_render_process_id, 24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int p_render_view_id, 24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int p_bridge_id) const; 24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int render_process_id; 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int render_view_id; 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int bridge_id; 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL requesting_frame; 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL embedder; 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InfoBarDelegate* infobar_delegate; 25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}; 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGeolocationInfoBarQueueController::PendingInfoBarRequest::PendingInfoBarRequest( 25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_process_id, 25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id, 261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& requesting_frame, 262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& embedder) 26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : render_process_id(render_process_id), 26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen render_view_id(render_view_id), 26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bridge_id(bridge_id), 26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen requesting_frame(requesting_frame), 26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen embedder(embedder), 26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen infobar_delegate(NULL) { 26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool GeolocationInfoBarQueueController::PendingInfoBarRequest::IsForTab( 27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int p_render_process_id, 27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int p_render_view_id) const { 27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return (render_process_id == p_render_process_id) && 27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen (render_view_id == p_render_view_id); 27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool GeolocationInfoBarQueueController::PendingInfoBarRequest::IsForPair( 27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& p_requesting_frame, 28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& p_embedder) const { 28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return (requesting_frame == p_requesting_frame) && (embedder == p_embedder); 28272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 28472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool GeolocationInfoBarQueueController::PendingInfoBarRequest::Equals( 28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int p_render_process_id, 28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int p_render_view_id, 28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int p_bridge_id) const { 28872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return IsForTab(p_render_process_id, p_render_view_id) && 28972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen (bridge_id == p_bridge_id); 29072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 29172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 29272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 29372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// GeolocationInfoBarQueueController::RequestEquals --------------------------- 29472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 29572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Useful predicate for checking PendingInfoBarRequest equality. 29672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass GeolocationInfoBarQueueController::RequestEquals 29772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : public std::unary_function<PendingInfoBarRequest, bool> { 29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public: 29972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RequestEquals(int render_process_id, int render_view_id, int bridge_id); 30072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 30172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool operator()(const PendingInfoBarRequest& request) const; 30272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private: 30472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_process_id_; 30572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id_; 30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id_; 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 30972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGeolocationInfoBarQueueController::RequestEquals::RequestEquals( 31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_process_id, 31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id) 31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : render_process_id_(render_process_id), 31472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen render_view_id_(render_view_id), 31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bridge_id_(bridge_id) { 31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 31772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 31872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool GeolocationInfoBarQueueController::RequestEquals::operator()( 31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const PendingInfoBarRequest& request) const { 32072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return request.Equals(render_process_id_, render_view_id_, bridge_id_); 32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 32272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 32472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// GeolocationInfoBarQueueController ------------------------------------------ 32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGeolocationInfoBarQueueController::GeolocationInfoBarQueueController( 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GeolocationPermissionContext* geolocation_permission_context, 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile) 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : geolocation_permission_context_(geolocation_permission_context), 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_(profile) { 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGeolocationInfoBarQueueController::~GeolocationInfoBarQueueController() { 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationInfoBarQueueController::CreateInfoBarRequest( 33772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_process_id, 33872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 33972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id, 34072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& requesting_frame, 34172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& embedder) { 34272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 34372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 34472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // We shouldn't get duplicate requests. 34572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(std::find_if(pending_infobar_requests_.begin(), 34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pending_infobar_requests_.end(), 34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RequestEquals(render_process_id, render_view_id, bridge_id)) == 34872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pending_infobar_requests_.end()); 34972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 35072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pending_infobar_requests_.push_back(PendingInfoBarRequest(render_process_id, 35172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen render_view_id, bridge_id, requesting_frame, embedder)); 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowQueuedInfoBar(render_process_id, render_view_id); 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationInfoBarQueueController::CancelInfoBarRequest( 35672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_process_id, 35772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 35872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id) { 35972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 36072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 36172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PendingInfoBarRequests::iterator i = std::find_if( 36272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pending_infobar_requests_.begin(), pending_infobar_requests_.end(), 36372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RequestEquals(render_process_id, render_view_id, bridge_id)); 36472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // TODO(pkasting): Can this conditional become a DCHECK()? 36572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (i != pending_infobar_requests_.end()) 36672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CancelInfoBarRequestInternal(i); 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationInfoBarQueueController::OnInfoBarClosed(int render_process_id, 37072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 37172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id) { 372731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 37372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 37472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PendingInfoBarRequests::iterator i = std::find_if( 37572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pending_infobar_requests_.begin(), pending_infobar_requests_.end(), 37672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RequestEquals(render_process_id, render_view_id, bridge_id)); 37772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (i != pending_infobar_requests_.end()) 37872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pending_infobar_requests_.erase(i); 37972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowQueuedInfoBar(render_process_id, render_view_id); 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationInfoBarQueueController::OnPermissionSet( 38472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_process_id, 38572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 38672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id, 38772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& requesting_frame, 38872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& embedder, 38972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool allowed) { 390731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 39172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ContentSetting content_setting = 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch allowed ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_->GetGeolocationContentSettingsMap()->SetContentSetting( 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame.GetOrigin(), embedder.GetOrigin(), content_setting); 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); 39872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen i != pending_infobar_requests_.end(); ) { 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (i->IsForPair(requesting_frame, embedder)) { 40072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Cancel this request first, then notify listeners. TODO(pkasting): Why 40172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // is this order important? 40272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // NOTE: If the pending request had an infobar, TabContents will close it 40372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // either synchronously or asynchronously, which will then pump the queue 40472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // via OnInfoBarClosed(). 40572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PendingInfoBarRequest copied_request = *i; 40672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Don't let CancelInfoBarRequestInternal() call RemoveInfoBar() on the 40772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // delegate that's currently calling us. That delegate is in either 40872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Accept() or Cancel(), so its owning InfoBar will call RemoveInfoBar() 40972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // later on in this callstack anyway; and if we do it here, and it causes 41072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // the delegate to be deleted, our GURL& args will point to garbage and we 41172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // may also cause other problems during stack unwinding. 41272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (i->Equals(render_process_id, render_view_id, bridge_id)) 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i->infobar_delegate = NULL; 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i = CancelInfoBarRequestInternal(i); 41572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_permission_context_->NotifyPermissionSet( 41772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen copied_request.render_process_id, copied_request.render_view_id, 41872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen copied_request.bridge_id, copied_request.requesting_frame, allowed); 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ++i; 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 42572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationInfoBarQueueController::Observe( 42672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NotificationType type, const NotificationSource& source, 42772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const NotificationDetails& details) { 42872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen registrar_.Remove(this, NotificationType::TAB_CONTENTS_DESTROYED, 42972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen source); 43072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TabContents* tab_contents = Source<TabContents>(source).ptr(); 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); 4323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick i != pending_infobar_requests_.end();) { 43372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (i->infobar_delegate == NULL && 43472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents == tab_util::GetTabContentsByID(i->render_process_id, 43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen i->render_view_id)) { 4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick i = pending_infobar_requests_.erase(i); 43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 43872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ++i; 4393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 44372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid GeolocationInfoBarQueueController::ShowQueuedInfoBar(int render_process_id, 44472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id) { 44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TabContents* tab_contents = 44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_util::GetTabContentsByID(render_process_id, render_view_id); 44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); 44872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen i != pending_infobar_requests_.end(); ) { 44972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (i->IsForTab(render_process_id, render_view_id)) { 45072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!tab_contents) { 45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen i = pending_infobar_requests_.erase(i); 45272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen continue; 45372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 45472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 45572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!i->infobar_delegate) { 45672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!registrar_.IsRegistered(this, 45772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NotificationType::TAB_CONTENTS_DESTROYED, 45872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Source<TabContents>(tab_contents))) { 45972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen registrar_.Add(this, NotificationType::TAB_CONTENTS_DESTROYED, 46072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Source<TabContents>(tab_contents)); 46172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 46272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen i->infobar_delegate = new GeolocationConfirmInfoBarDelegate( 46372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents, this, render_process_id, render_view_id, i->bridge_id, 46472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen i->requesting_frame, 46572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); 46672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents->AddInfoBar(i->infobar_delegate); 46772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 4683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick break; 46972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 47072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ++i; 471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGeolocationInfoBarQueueController::PendingInfoBarRequests::iterator 475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GeolocationInfoBarQueueController::CancelInfoBarRequestInternal( 47672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PendingInfoBarRequests::iterator i) { 47772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InfoBarDelegate* delegate = i->infobar_delegate; 47872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!delegate) 47972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return pending_infobar_requests_.erase(i); 48072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContents* tab_contents = 482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_util::GetTabContentsByID(i->render_process_id, i->render_view_id); 48372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!tab_contents) 484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return pending_infobar_requests_.erase(i); 48572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 48672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // TabContents will destroy the InfoBar, which will remove from our vector 48772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // asynchronously. 48872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents->RemoveInfoBar(i->infobar_delegate); 48972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return ++i; 490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 49372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// GeolocationPermissionContext ----------------------------------------------- 49472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 495c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGeolocationPermissionContext::GeolocationPermissionContext( 496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile) 497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : profile_(profile), 49872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ALLOW_THIS_IN_INITIALIZER_LIST(geolocation_infobar_queue_controller_( 49972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new GeolocationInfoBarQueueController(this, profile))) { 500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 502c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGeolocationPermissionContext::~GeolocationPermissionContext() { 503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationPermissionContext::RequestGeolocationPermission( 506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int render_process_id, int render_view_id, int bridge_id, 507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& requesting_frame) { 508731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 50972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, NewRunnableMethod( 51072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this, &GeolocationPermissionContext::RequestGeolocationPermission, 51172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen render_process_id, render_view_id, bridge_id, requesting_frame)); 512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 514731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 51621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ExtensionService* extensions = profile_->GetExtensionService(); 517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (extensions) { 518513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* ext = extensions->GetExtensionByURL(requesting_frame); 519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!ext) 520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ext = extensions->GetExtensionByWebExtent(requesting_frame); 521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ext && ext->HasApiPermission(Extension::kGeolocationPermission)) { 522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionProcessManager* epm = profile_->GetExtensionProcessManager(); 523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RenderProcessHost* process = epm->GetExtensionProcess(requesting_frame); 524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (process && process->id() == render_process_id) { 525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotifyPermissionSet(render_process_id, render_view_id, bridge_id, 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame, true); 527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContents* tab_contents = 533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_util::GetTabContentsByID(render_process_id, render_view_id); 534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!tab_contents) { 535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The tab may have gone away, or the request may not be from a tab at all. 536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(WARNING) << "Attempt to use geolocation tabless renderer: " 53772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen << render_process_id << "," << render_view_id << "," 53872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen << bridge_id << " (can't prompt user without a visible tab)"; 539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotifyPermissionSet(render_process_id, render_view_id, bridge_id, 540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame, false); 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL embedder = tab_contents->GetURL(); 545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!requesting_frame.is_valid() || !embedder.is_valid()) { 546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(WARNING) << "Attempt to use geolocation from an invalid URL: " 54772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen << requesting_frame << "," << embedder 54872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen << " (geolocation is not supported in popups)"; 549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotifyPermissionSet(render_process_id, render_view_id, bridge_id, 550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame, false); 551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ContentSetting content_setting = 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_->GetGeolocationContentSettingsMap()->GetContentSetting( 556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame, embedder); 557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (content_setting == CONTENT_SETTING_BLOCK) { 558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotifyPermissionSet(render_process_id, render_view_id, bridge_id, 559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame, false); 560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (content_setting == CONTENT_SETTING_ALLOW) { 561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotifyPermissionSet(render_process_id, render_view_id, bridge_id, 562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch requesting_frame, true); 56372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { // setting == ask. Prompt the user. 564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch geolocation_infobar_queue_controller_->CreateInfoBarRequest( 565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch render_process_id, render_view_id, bridge_id, requesting_frame, 566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch embedder); 567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationPermissionContext::CancelGeolocationPermissionRequest( 57172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_process_id, 57272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 57372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id, 574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& requesting_frame) { 575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CancelPendingInfoBarRequest(render_process_id, render_view_id, bridge_id); 576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationPermissionContext::NotifyPermissionSet( 57972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_process_id, 58072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 58172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id, 58272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& requesting_frame, 58372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool allowed) { 584731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContents* tab_contents = 587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_util::GetTabContentsByID(render_process_id, render_view_id); 588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TabContents may have gone away (or not exists for extension). 590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (tab_contents) { 591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabSpecificContentSettings* content_settings = 592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents->GetTabSpecificContentSettings(); 593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch content_settings->OnGeolocationPermissionSet(requesting_frame.GetOrigin(), 594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch allowed); 595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 597dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen RenderViewHost* r = RenderViewHost::FromID(render_process_id, render_view_id); 598dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (r) { 599ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen r->Send(new GeolocationMsg_PermissionSet( 600dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen render_view_id, bridge_id, allowed)); 601dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 602dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (allowed) { 60472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, NewRunnableMethod( 60572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this, &GeolocationPermissionContext::NotifyArbitratorPermissionGranted, 60672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen requesting_frame)); 607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationPermissionContext::NotifyArbitratorPermissionGranted( 611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& requesting_frame) { 612731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 613731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GeolocationProvider::GetInstance()->OnPermissionGranted(requesting_frame); 614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GeolocationPermissionContext::CancelPendingInfoBarRequest( 61772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_process_id, 61872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int render_view_id, 61972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int bridge_id) { 620731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 62172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, NewRunnableMethod( 62272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this, &GeolocationPermissionContext::CancelPendingInfoBarRequest, 62372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen render_process_id, render_view_id, bridge_id)); 624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 626731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 62772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen geolocation_infobar_queue_controller_->CancelInfoBarRequest(render_process_id, 62872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen render_view_id, bridge_id); 629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 630