15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_ANDROID_H_ 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_ANDROID_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The flow for geolocation permissions on Android needs to take into account 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// the global geolocation settings so it differs from the desktop one. It 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// works as follows. 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// GeolocationPermissionContextAndroid::DecidePermission intercepts the flow in 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// the UI thread, and posts a task to the blocking pool to CheckSystemLocation. 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// CheckSystemLocation will in fact check several possible settings 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// - The global system geolocation setting 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// - The Google location settings on pre KK devices 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// - An old internal Chrome setting on pre-JB MR1 devices 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// With all that information it will decide if system location is enabled. 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// If enabled, it proceeds with the per site flow via 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// GeolocationPermissionContext (which will check per site permissions, create 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// infobars, etc.). 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Otherwise the permission is already decided. 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// There is a bit of thread jumping since some of the permissions (like the 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// per site settings) are queried on the UI thread while the system level 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// permissions are considered I/O and thus checked in the blocking thread pool. 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/geolocation/geolocation_permission_context.h" 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/permission_request_id.h" 30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "url/gurl.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content { 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class WebContents; 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GoogleLocationSettingsHelper; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class GeolocationPermissionContextAndroid 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : public GeolocationPermissionContext { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) explicit GeolocationPermissionContextAndroid(Profile* profile); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch struct PermissionRequestInfo { 46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch PermissionRequestInfo(); 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch PermissionRequestID id; 49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GURL requesting_frame; 50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool user_gesture; 51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GURL embedder; 52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch }; 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) friend class GeolocationPermissionContext; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~GeolocationPermissionContextAndroid(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // GeolocationPermissionContext implementation: 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DecidePermission(content::WebContents* web_contents, 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const PermissionRequestID& id, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& requesting_frame, 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool user_gesture, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& embedder, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Callback<void(bool)> callback) OVERRIDE; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void ProceedDecidePermission(content::WebContents* web_contents, 67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const PermissionRequestInfo& info, 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Callback<void(bool)> callback); 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<GoogleLocationSettingsHelper> google_location_settings_helper_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void CheckSystemLocation(content::WebContents* web_contents, 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const PermissionRequestInfo& info, 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Callback<void(bool)> callback); 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GeolocationPermissionContextAndroid); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_ANDROID_H_ 81