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