| Index: chrome/browser/geolocation/geolocation_permission_context.cc | 
| diff --git a/chrome/browser/geolocation/geolocation_permission_context.cc b/chrome/browser/geolocation/geolocation_permission_context.cc | 
| index d9e03732662382d2a1c3aac5cbf6bcffd343b37c..af63c43a31795cb6d5cd6f5a578b0a910e06887e 100644 | 
| --- a/chrome/browser/geolocation/geolocation_permission_context.cc | 
| +++ b/chrome/browser/geolocation/geolocation_permission_context.cc | 
| @@ -4,339 +4,78 @@ | 
|  | 
| #include "chrome/browser/geolocation/geolocation_permission_context.h" | 
|  | 
| -#include <functional> | 
| -#include <string> | 
| -#include <vector> | 
| - | 
| #include "base/bind.h" | 
| -#include "base/prefs/pref_service.h" | 
| -#include "base/strings/utf_string_conversions.h" | 
| -#include "chrome/browser/content_settings/host_content_settings_map.h" | 
| #include "chrome/browser/content_settings/tab_specific_content_settings.h" | 
| #include "chrome/browser/profiles/profile.h" | 
| -#include "chrome/browser/tab_contents/tab_util.h" | 
| -#include "chrome/browser/ui/website_settings/permission_bubble_manager.h" | 
| -#include "chrome/browser/ui/website_settings/permission_bubble_request.h" | 
| -#include "chrome/common/pref_names.h" | 
| -#include "chrome/grit/generated_resources.h" | 
| #include "components/content_settings/core/common/permission_request_id.h" | 
| #include "content/public/browser/browser_thread.h" | 
| -#include "content/public/browser/render_process_host.h" | 
| -#include "content/public/browser/render_view_host.h" | 
| #include "content/public/browser/web_contents.h" | 
| -#include "grit/theme_resources.h" | 
| -#include "net/base/net_util.h" | 
| -#include "ui/base/l10n/l10n_util.h" | 
| - | 
| -class GeolocationPermissionRequest : public PermissionBubbleRequest { | 
| - public: | 
| -  GeolocationPermissionRequest(GeolocationPermissionContext* context, | 
| -                               const PermissionRequestID& id, | 
| -                               const GURL& requesting_frame, | 
| -                               const GURL& embedder, | 
| -                               bool user_gesture, | 
| -                               base::Callback<void(bool)> callback, | 
| -                               const std::string& display_languages); | 
| -  virtual ~GeolocationPermissionRequest(); | 
| - | 
| -  // PermissionBubbleDelegate: | 
| -  virtual int GetIconID() const OVERRIDE; | 
| -  virtual base::string16 GetMessageText() const OVERRIDE; | 
| -  virtual base::string16 GetMessageTextFragment() const OVERRIDE; | 
| -  virtual bool HasUserGesture() const OVERRIDE; | 
| -  virtual GURL GetRequestingHostname() const OVERRIDE; | 
| -  virtual void PermissionGranted() OVERRIDE; | 
| -  virtual void PermissionDenied() OVERRIDE; | 
| -  virtual void Cancelled() OVERRIDE; | 
| -  virtual void RequestFinished() OVERRIDE; | 
| - | 
| - private: | 
| -  GeolocationPermissionContext* context_; | 
| -  PermissionRequestID id_; | 
| -  GURL requesting_frame_; | 
| -  GURL embedder_; | 
| -  bool user_gesture_; | 
| -  base::Callback<void(bool)> callback_; | 
| -  std::string display_languages_; | 
| -}; | 
| - | 
| -GeolocationPermissionRequest::GeolocationPermissionRequest( | 
| -    GeolocationPermissionContext* context, | 
| -    const PermissionRequestID& id, | 
| -    const GURL& requesting_frame, | 
| -    const GURL& embedder, | 
| -    bool user_gesture, | 
| -    base::Callback<void(bool)> callback, | 
| -    const std::string& display_languages) | 
| -    : context_(context), | 
| -      id_(id), | 
| -      requesting_frame_(requesting_frame), | 
| -      embedder_(embedder), | 
| -      user_gesture_(user_gesture), | 
| -      callback_(callback), | 
| -      display_languages_(display_languages) {} | 
| - | 
| -GeolocationPermissionRequest::~GeolocationPermissionRequest() {} | 
| - | 
| -int GeolocationPermissionRequest::GetIconID() const { | 
| -  return IDR_INFOBAR_GEOLOCATION; | 
| -} | 
| - | 
| -base::string16 GeolocationPermissionRequest::GetMessageText() const { | 
| -  return l10n_util::GetStringFUTF16( | 
| -      IDS_GEOLOCATION_INFOBAR_QUESTION, | 
| -      net::FormatUrl(requesting_frame_.GetOrigin(), display_languages_, | 
| -                     net::kFormatUrlOmitUsernamePassword | | 
| -                     net::kFormatUrlOmitTrailingSlashOnBareHostname, | 
| -                     net::UnescapeRule::SPACES, NULL, NULL, NULL)); | 
| -} | 
| - | 
| -base::string16 GeolocationPermissionRequest::GetMessageTextFragment() const { | 
| -  return l10n_util::GetStringUTF16(IDS_GEOLOCATION_INFOBAR_PERMISSION_FRAGMENT); | 
| -} | 
| - | 
| -bool GeolocationPermissionRequest::HasUserGesture() const { | 
| -  return user_gesture_; | 
| -} | 
| - | 
| -GURL GeolocationPermissionRequest::GetRequestingHostname() const { | 
| -  return requesting_frame_; | 
| -} | 
| - | 
| -void GeolocationPermissionRequest::PermissionGranted() { | 
| -  context_->QueueController()->UpdateContentSetting( | 
| -      requesting_frame_, embedder_, true); | 
| -  context_->NotifyPermissionSet(id_, requesting_frame_, callback_, true); | 
| -} | 
| - | 
| -void GeolocationPermissionRequest::PermissionDenied() { | 
| -  context_->QueueController()->UpdateContentSetting( | 
| -      requesting_frame_, embedder_, false); | 
| -  context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false); | 
| -} | 
| - | 
| -void GeolocationPermissionRequest::Cancelled() { | 
| -} | 
| - | 
| -void GeolocationPermissionRequest::RequestFinished() { | 
| -  // Deletes 'this'. | 
| -  context_->RequestFinished(this); | 
| -} | 
|  | 
|  | 
| GeolocationPermissionContext::GeolocationPermissionContext( | 
| Profile* profile) | 
| -    : profile_(profile), | 
| -      shutting_down_(false), | 
| +    : PermissionContextBase(profile, CONTENT_SETTINGS_TYPE_GEOLOCATION), | 
| extensions_context_(profile) { | 
| } | 
|  | 
| GeolocationPermissionContext::~GeolocationPermissionContext() { | 
| -  // GeolocationPermissionContext may be destroyed on either the UI thread | 
| -  // or the IO thread, but the PermissionQueueController must have been | 
| -  // destroyed on the UI thread. | 
| -  DCHECK(!permission_queue_controller_.get()); | 
| } | 
|  | 
| -void GeolocationPermissionContext::RequestGeolocationPermission( | 
| +void GeolocationPermissionContext::RequestPermission( | 
| content::WebContents* web_contents, | 
| -    int bridge_id, | 
| -    const GURL& requesting_frame, | 
| +    const PermissionRequestID& id, | 
| +    const GURL& requesting_frame_origin, | 
| bool user_gesture, | 
| -    base::Callback<void(bool)> result_callback, | 
| -    base::Closure* cancel_callback) { | 
| -  GURL requesting_frame_origin = requesting_frame.GetOrigin(); | 
| -  if (shutting_down_) | 
| -    return; | 
| - | 
| -  int render_process_id = web_contents->GetRenderProcessHost()->GetID(); | 
| -  int render_view_id = web_contents->GetRenderViewHost()->GetRoutingID(); | 
| -  if (cancel_callback) { | 
| -    *cancel_callback = base::Bind( | 
| -        &GeolocationPermissionContext::CancelGeolocationPermissionRequest, | 
| -        this, render_process_id, render_view_id, bridge_id); | 
| -  } | 
| - | 
| -  const PermissionRequestID id( | 
| -      render_process_id, render_view_id, bridge_id, GURL()); | 
| +    const BrowserPermissionCallback& callback) { | 
| +  DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 
| +  GURL embedder_origin = web_contents->GetLastCommittedURL().GetOrigin(); | 
|  | 
| bool permission_set; | 
| bool new_permission; | 
| if (extensions_context_.RequestPermission( | 
| -          web_contents, id, bridge_id, requesting_frame, user_gesture, | 
| -          result_callback, &permission_set, &new_permission)) { | 
| +      web_contents, id, id.bridge_id(), requesting_frame_origin, user_gesture, | 
| +      callback, &permission_set, &new_permission)) { | 
| if (permission_set) { | 
| -      NotifyPermissionSet(id, requesting_frame_origin, result_callback, | 
| -                          new_permission); | 
| +      NotifyPermissionSet(id, requesting_frame_origin, embedder_origin, | 
| +                          callback, true, new_permission); | 
| } | 
| return; | 
| } | 
|  | 
| -  GURL embedder = web_contents->GetLastCommittedURL().GetOrigin(); | 
| -  if (!requesting_frame_origin.is_valid() || !embedder.is_valid()) { | 
| +  if (!requesting_frame_origin.is_valid() || !embedder_origin.is_valid()) { | 
| LOG(WARNING) << "Attempt to use geolocation from an invalid URL: " | 
| -                 << requesting_frame_origin << "," << embedder | 
| -                 << " (geolocation is not supported in popups)"; | 
| -    NotifyPermissionSet(id, requesting_frame_origin, result_callback, false); | 
| +        << requesting_frame_origin << "," << embedder_origin | 
| +        << " (geolocation is not supported in popups)"; | 
| +    NotifyPermissionSet(id, requesting_frame_origin, embedder_origin, | 
| +                        callback, false /* persist */, false /* allowed */); | 
| return; | 
| } | 
|  | 
| -  DecidePermission(web_contents, id, requesting_frame_origin, user_gesture, | 
| -                   embedder, result_callback); | 
| -} | 
| - | 
| -void GeolocationPermissionContext::CancelGeolocationPermissionRequest( | 
| -    int render_process_id, | 
| -    int render_view_id, | 
| -    int bridge_id) { | 
| -  content::WebContents* web_contents = tab_util::GetWebContentsByID( | 
| -        render_process_id, render_view_id); | 
| -  if (extensions_context_.CancelPermissionRequest(web_contents, bridge_id)) | 
| -    return; | 
| - | 
| -  CancelPendingInfobarRequest(PermissionRequestID( | 
| -      render_process_id, render_view_id, bridge_id, GURL())); | 
| +  PermissionContextBase::RequestPermission(web_contents, id, | 
| +                                           requesting_frame_origin, | 
| +                                           user_gesture, | 
| +                                           callback); | 
| } | 
|  | 
| -void GeolocationPermissionContext::DecidePermission( | 
| +void GeolocationPermissionContext::CancelPermissionRequest( | 
| content::WebContents* web_contents, | 
| -    const PermissionRequestID& id, | 
| -    const GURL& requesting_frame, | 
| -    bool user_gesture, | 
| -    const GURL& embedder, | 
| -    base::Callback<void(bool)> callback) { | 
| -  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 
| - | 
| -  ContentSetting content_setting = | 
| -      profile_->GetHostContentSettingsMap() | 
| -          ->GetContentSettingAndMaybeUpdateLastUsage( | 
| -              requesting_frame, | 
| -              embedder, | 
| -              CONTENT_SETTINGS_TYPE_GEOLOCATION, | 
| -              std::string()); | 
| -  switch (content_setting) { | 
| -    case CONTENT_SETTING_BLOCK: | 
| -      PermissionDecided(id, requesting_frame, embedder, callback, false); | 
| -      break; | 
| -    case CONTENT_SETTING_ALLOW: | 
| -      PermissionDecided(id, requesting_frame, embedder, callback, true); | 
| -      break; | 
| -    default: | 
| -      if (PermissionBubbleManager::Enabled()) { | 
| -        PermissionBubbleManager* mgr = | 
| -            PermissionBubbleManager::FromWebContents(web_contents); | 
| -        if (mgr) { | 
| -          scoped_ptr<GeolocationPermissionRequest> request_ptr( | 
| -              new GeolocationPermissionRequest( | 
| -                  this, id, requesting_frame, embedder, user_gesture, callback, | 
| -                  profile_->GetPrefs()->GetString(prefs::kAcceptLanguages))); | 
| -          GeolocationPermissionRequest* request = request_ptr.get(); | 
| -          pending_requests_.add(id.ToString(), request_ptr.Pass()); | 
| -          mgr->AddRequest(request); | 
| -        } | 
| -      } else { | 
| -        // setting == ask. Prompt the user. | 
| -        QueueController()->CreateInfoBarRequest( | 
| -            id, requesting_frame, embedder, | 
| -                base::Bind( | 
| -                    &GeolocationPermissionContext::NotifyPermissionSet, | 
| -                base::Unretained(this), id, requesting_frame, callback)); | 
| -      } | 
| -  } | 
| -} | 
| - | 
| -void GeolocationPermissionContext::CreateInfoBarRequest( | 
| -    const PermissionRequestID& id, | 
| -    const GURL& requesting_frame, | 
| -    const GURL& embedder, | 
| -    base::Callback<void(bool)> callback) { | 
| -    QueueController()->CreateInfoBarRequest( | 
| -        id, requesting_frame, embedder, base::Bind( | 
| -            &GeolocationPermissionContext::NotifyPermissionSet, | 
| -            base::Unretained(this), id, requesting_frame, callback)); | 
| -} | 
| +    const PermissionRequestID& id) { | 
|  | 
| -void GeolocationPermissionContext::RequestFinished( | 
| -    GeolocationPermissionRequest* request) { | 
| -  base::ScopedPtrHashMap<std::string, | 
| -                         GeolocationPermissionRequest>::iterator it; | 
| -  for (it = pending_requests_.begin(); it != pending_requests_.end(); ++it) { | 
| -    if (it->second == request) { | 
| -      pending_requests_.take_and_erase(it); | 
| +    if (extensions_context_.CancelPermissionRequest( | 
| +        web_contents, id.bridge_id())) | 
| return; | 
| -    } | 
| -  } | 
| +    PermissionContextBase::CancelPermissionRequest(web_contents, id); | 
| } | 
|  | 
| - | 
| -void GeolocationPermissionContext::ShutdownOnUIThread() { | 
| -  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 
| -  permission_queue_controller_.reset(); | 
| -  shutting_down_ = true; | 
| -} | 
| - | 
| -void GeolocationPermissionContext::PermissionDecided( | 
| +void GeolocationPermissionContext::UpdateTabContext( | 
| const PermissionRequestID& id, | 
| const GURL& requesting_frame, | 
| -    const GURL& embedder, | 
| -    base::Callback<void(bool)> callback, | 
| bool allowed) { | 
| -  NotifyPermissionSet(id, requesting_frame, callback, allowed); | 
| -} | 
| - | 
| -void GeolocationPermissionContext::NotifyPermissionSet( | 
| -    const PermissionRequestID& id, | 
| -    const GURL& requesting_frame, | 
| -    base::Callback<void(bool)> callback, | 
| -    bool allowed) { | 
| -  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 
| - | 
| // WebContents may have gone away (or not exists for extension). | 
| TabSpecificContentSettings* content_settings = | 
| TabSpecificContentSettings::Get(id.render_process_id(), | 
| id.render_view_id()); | 
| -  if (content_settings) { | 
| -    content_settings->OnGeolocationPermissionSet(requesting_frame.GetOrigin(), | 
| -                                                 allowed); | 
| -  } | 
| - | 
| -  callback.Run(allowed); | 
| -} | 
| - | 
| -PermissionQueueController* | 
| -    GeolocationPermissionContext::QueueController() { | 
| -  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 
| -  DCHECK(!shutting_down_); | 
| -  if (!permission_queue_controller_) | 
| -    permission_queue_controller_.reset(CreateQueueController()); | 
| -  return permission_queue_controller_.get(); | 
| -} | 
| - | 
| -PermissionQueueController* | 
| -    GeolocationPermissionContext::CreateQueueController() { | 
| -  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 
| -  return new PermissionQueueController(profile(), | 
| -                                       CONTENT_SETTINGS_TYPE_GEOLOCATION); | 
| -} | 
| - | 
| -void GeolocationPermissionContext::CancelPendingInfobarRequest( | 
| -    const PermissionRequestID& id) { | 
| -  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 
| -  if (shutting_down_) | 
| -    return; | 
| - | 
| -  if (PermissionBubbleManager::Enabled()) { | 
| -    GeolocationPermissionRequest* cancelling = | 
| -        pending_requests_.get(id.ToString()); | 
| -    content::WebContents* web_contents = tab_util::GetWebContentsByID( | 
| -        id.render_process_id(), id.render_view_id()); | 
| -    if (cancelling != NULL && web_contents != NULL && | 
| -        PermissionBubbleManager::FromWebContents(web_contents) != NULL) { | 
| -      PermissionBubbleManager::FromWebContents(web_contents)-> | 
| -          CancelRequest(cancelling); | 
| -    } | 
| -    return; | 
| -  } | 
| - | 
| -  QueueController()->CancelInfoBarRequest(id); | 
| +  if (content_settings) | 
| +    content_settings->OnGeolocationPermissionSet( | 
| +        requesting_frame.GetOrigin(), allowed); | 
| } | 
|  |