| Index: chrome/browser/geolocation/geolocation_permission_context_android.cc | 
| diff --git a/chrome/browser/geolocation/geolocation_permission_context_android.cc b/chrome/browser/geolocation/geolocation_permission_context_android.cc | 
| index cf05eaf4850a9be88b46741f01847a14edb5967a..00bf741c306f7d0bba602530e1e628a698263301 100644 | 
| --- a/chrome/browser/geolocation/geolocation_permission_context_android.cc | 
| +++ b/chrome/browser/geolocation/geolocation_permission_context_android.cc | 
| @@ -14,13 +14,15 @@ | 
| GeolocationPermissionContextAndroid:: | 
| PermissionRequestInfo::PermissionRequestInfo() | 
| : id(0, 0, 0, GURL()), | 
| -      user_gesture(false) {} | 
| +      user_gesture(false) { | 
| +} | 
|  | 
| GeolocationPermissionContextAndroid:: | 
| GeolocationPermissionContextAndroid(Profile* profile) | 
| : GeolocationPermissionContext(profile), | 
| google_location_settings_helper_( | 
| -          GoogleLocationSettingsHelper::Create()) { | 
| +          GoogleLocationSettingsHelper::Create()), | 
| +      weak_factory_(this) { | 
| } | 
|  | 
| GeolocationPermissionContextAndroid::~GeolocationPermissionContextAndroid() { | 
| @@ -30,31 +32,60 @@ void GeolocationPermissionContextAndroid::ProceedDecidePermission( | 
| content::WebContents* web_contents, | 
| const PermissionRequestInfo& info, | 
| base::Callback<void(bool)> callback) { | 
| -  // Super class implementation expects everything in UI thread instead. | 
| -  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 
| -  GeolocationPermissionContext::DecidePermission( | 
| -      web_contents, info.id, info.requesting_frame, info.user_gesture, | 
| -      info.embedder, callback); | 
| + | 
| +  // The super class implementation expects everything in UI thread. | 
| +  DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 
| +  GeolocationPermissionContext::RequestPermission( | 
| +      web_contents, info.id, | 
| +      info.requesting_origin, | 
| +      info.user_gesture, | 
| +      callback); | 
| } | 
|  | 
| -void GeolocationPermissionContextAndroid::CheckSystemLocation( | 
| + | 
| +// UI thread | 
| +void GeolocationPermissionContextAndroid::RequestPermission( | 
| +    content::WebContents* web_contents, | 
| +     const PermissionRequestID& id, | 
| +     const GURL& requesting_frame_origin, | 
| +     bool user_gesture, | 
| +     const BrowserPermissionCallback& callback) { | 
| +  PermissionRequestInfo info; | 
| +  info.id = id; | 
| +  info.requesting_origin = requesting_frame_origin; | 
| +  info.embedder_origin = web_contents->GetLastCommittedURL().GetOrigin(); | 
| +  info.user_gesture = user_gesture; | 
| + | 
| +  // Called on the UI thread. However, do the work on a separate thread | 
| +  // to avoid strict mode violation. | 
| +  DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 
| +  content::BrowserThread::PostBlockingPoolTask(FROM_HERE, | 
| +      base::Bind( | 
| +          &GeolocationPermissionContextAndroid::CheckMasterLocation, | 
| +          weak_factory_.GetWeakPtr(), web_contents, info, callback)); | 
| +} | 
| + | 
| +// Blocking pool thread | 
| +void GeolocationPermissionContextAndroid::CheckMasterLocation( | 
| content::WebContents* web_contents, | 
| const PermissionRequestInfo& info, | 
| -    base::Callback<void(bool)> callback) { | 
| +    const BrowserPermissionCallback& callback) { | 
| // Check to see if the feature in its entirety has been disabled. | 
| // This must happen before other services (e.g. tabs, extensions) | 
| // get an opportunity to allow the geolocation request. | 
| -  bool enabled = google_location_settings_helper_->IsSystemLocationEnabled(); | 
| +  bool enabled = | 
| +      google_location_settings_helper_->IsSystemLocationEnabled(); | 
|  | 
| base::Closure ui_closure; | 
| if (enabled) { | 
| ui_closure = base::Bind( | 
| &GeolocationPermissionContextAndroid::ProceedDecidePermission, | 
| -        this, web_contents, info, callback); | 
| +        base::Unretained(this), web_contents, info, callback); | 
| } else { | 
| ui_closure = base::Bind( | 
| &GeolocationPermissionContextAndroid::PermissionDecided, | 
| -        this, info.id, info.requesting_frame, info.embedder, callback, false); | 
| +        base::Unretained(this), info.id, info.requesting_origin, | 
| +        info.embedder_origin, callback, false, false); | 
| } | 
|  | 
| // This method is executed from the BlockingPool, post the result | 
| @@ -63,25 +94,8 @@ void GeolocationPermissionContextAndroid::CheckSystemLocation( | 
| content::BrowserThread::UI, FROM_HERE, ui_closure); | 
| } | 
|  | 
| -void GeolocationPermissionContextAndroid::DecidePermission( | 
| -    content::WebContents* web_contents, | 
| -    const PermissionRequestID& id, | 
| -    const GURL& requesting_frame, | 
| -    bool user_gesture, | 
| -    const GURL& embedder, | 
| -    base::Callback<void(bool)> callback) { | 
| - | 
| -  PermissionRequestInfo info; | 
| -  info.id = id; | 
| -  info.requesting_frame = requesting_frame; | 
| -  info.user_gesture = user_gesture; | 
| -  info.embedder = embedder; | 
|  | 
| -  // Called on the UI thread. However, do the work on a separate thread | 
| -  // to avoid strict mode violation. | 
| -  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 
| -  content::BrowserThread::PostBlockingPoolTask(FROM_HERE, | 
| -      base::Bind( | 
| -          &GeolocationPermissionContextAndroid::CheckSystemLocation, | 
| -          this, web_contents, info, callback)); | 
| +void GeolocationPermissionContextAndroid::InterceptPermissionCheck( | 
| +    const BrowserPermissionCallback& callback, bool granted) { | 
| +  callback.Run(granted); | 
| } | 
|  |