| Index: chrome/browser/geolocation/chrome_geolocation_permission_context_android.cc
|
| diff --git a/chrome/browser/geolocation/chrome_geolocation_permission_context_android.cc b/chrome/browser/geolocation/chrome_geolocation_permission_context_android.cc
|
| index bcdb52f9e2242ce5ea1e09ed9872d124ad7067d3..ec2c0f7ce152f8fc036bc47bcaf068fba677ef05 100644
|
| --- a/chrome/browser/geolocation/chrome_geolocation_permission_context_android.cc
|
| +++ b/chrome/browser/geolocation/chrome_geolocation_permission_context_android.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include "base/prefs/pref_service.h"
|
| #include "chrome/browser/android/google_location_settings_helper.h"
|
| +#include "chrome/browser/content_settings/permission_request_id.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/common/pref_names.h"
|
| #include "content/public/browser/browser_thread.h"
|
| @@ -22,24 +23,80 @@ ChromeGeolocationPermissionContextAndroid::
|
| ~ChromeGeolocationPermissionContextAndroid() {
|
| }
|
|
|
| -void ChromeGeolocationPermissionContextAndroid::DecidePermission(
|
| +void ChromeGeolocationPermissionContextAndroid::ProceedDecidePermission(
|
| content::WebContents* web_contents,
|
| const PermissionRequestID& id,
|
| const GURL& requesting_frame,
|
| const GURL& embedder,
|
| + const std::string& accept_button_label,
|
| base::Callback<void(bool)> callback) {
|
| + // Super class implementation expects everything in UI thread instead.
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| + ChromeGeolocationPermissionContext::DecidePermission(
|
| + web_contents, id, requesting_frame, embedder,
|
| + accept_button_label, callback);
|
| +}
|
|
|
| +void ChromeGeolocationPermissionContextAndroid::CheckMasterLocation(
|
| + content::WebContents* web_contents,
|
| + const PermissionRequestID& id,
|
| + const GURL& requesting_frame,
|
| + const GURL& embedder,
|
| + base::Callback<void(bool)> 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.
|
| - if (!google_location_settings_helper_->IsMasterLocationSettingEnabled()) {
|
| - PermissionDecided(id, requesting_frame, embedder, callback, false);
|
| - return;
|
| + bool enabled =
|
| + google_location_settings_helper_->IsMasterLocationSettingEnabled();
|
| +
|
| + // The flow for geolocation permission on android is:
|
| + // - ChromeGeolocationPermissionContextAndroid::DecidePermission
|
| + // intercepts the flow in the UI thread, and posts task
|
| + // to the blocking pool to CheckMasterLocation (in order to
|
| + // avoid strict-mode violation).
|
| + // - At this point the master location permission is either:
|
| + // -- enabled, in which we case it proceeds the normal flow
|
| + // via ChromeGeolocationPermissionContext (which may create infobars, etc.).
|
| + // -- disabled, in which case the permission is already decided.
|
| + //
|
| + // In either case, ChromeGeolocationPermissionContext expects these
|
| + // in the UI thread.
|
| + base::Closure ui_closure;
|
| + if (enabled) {
|
| + bool allow_label = google_location_settings_helper_->IsAllowLabel();
|
| + std::string accept_button_label =
|
| + google_location_settings_helper_->GetAcceptButtonLabel(allow_label);
|
| + ui_closure = base::Bind(
|
| + &ChromeGeolocationPermissionContextAndroid::ProceedDecidePermission,
|
| + this, web_contents, id, requesting_frame, embedder,
|
| + accept_button_label, callback);
|
| + } else {
|
| + ui_closure = base::Bind(
|
| + &ChromeGeolocationPermissionContextAndroid::PermissionDecided,
|
| + this, id, requesting_frame, embedder, callback, false);
|
| }
|
|
|
| - ChromeGeolocationPermissionContext::DecidePermission(
|
| - web_contents, id, requesting_frame, embedder, callback);
|
| + // This method is executed from the BlockingPool, post the result
|
| + // back to the UI thread.
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::UI, FROM_HERE, ui_closure);
|
| +}
|
| +
|
| +void ChromeGeolocationPermissionContextAndroid::DecidePermission(
|
| + content::WebContents* web_contents,
|
| + const PermissionRequestID& id,
|
| + const GURL& requesting_frame,
|
| + const GURL& embedder,
|
| + const std::string& accept_button_label,
|
| + base::Callback<void(bool)> callback) {
|
| +
|
| + // 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(
|
| + &ChromeGeolocationPermissionContextAndroid::CheckMasterLocation,
|
| + this, web_contents, id, requesting_frame, embedder, callback));
|
| }
|
|
|
| void ChromeGeolocationPermissionContextAndroid::PermissionDecided(
|
| @@ -48,13 +105,12 @@ void ChromeGeolocationPermissionContextAndroid::PermissionDecided(
|
| const GURL& embedder,
|
| base::Callback<void(bool)> callback,
|
| bool allowed) {
|
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| // If Google Apps Location setting is turned off then we ignore
|
| // the 'allow' website setting for this site and instead show
|
| // the infobar to go back to the 'settings' to turn it back on.
|
| if (allowed &&
|
| !google_location_settings_helper_->IsGoogleAppsLocationSettingEnabled()) {
|
| - QueueController()->CreateInfoBarRequest(id, requesting_frame, embedder,
|
| + QueueController()->CreateInfoBarRequest(id, requesting_frame, embedder, "",
|
| callback);
|
| return;
|
| }
|
|
|