1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_ANDROID_H_
6#define CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_ANDROID_H_
7
8// The flow for geolocation permissions on Android needs to take into account
9// the global geolocation settings so it differs from the desktop one. It
10// works as follows.
11// GeolocationPermissionContextAndroid::DecidePermission intercepts the flow in
12// the UI thread, and posts a task to the blocking pool to CheckSystemLocation.
13// CheckSystemLocation will in fact check several possible settings
14//     - The global system geolocation setting
15//     - The Google location settings on pre KK devices
16//     - An old internal Chrome setting on pre-JB MR1 devices
17// With all that information it will decide if system location is enabled.
18// If enabled, it proceeds with the per site flow via
19// GeolocationPermissionContext (which will check per site permissions, create
20// infobars, etc.).
21//
22// Otherwise the permission is already decided.
23
24// There is a bit of thread jumping since some of the permissions (like the
25// per site settings) are queried on the UI thread while the system level
26// permissions are considered I/O and thus checked in the blocking thread pool.
27
28#include "chrome/browser/geolocation/geolocation_permission_context.h"
29#include "components/content_settings/core/common/permission_request_id.h"
30#include "url/gurl.h"
31
32namespace content {
33class WebContents;
34}
35
36class GoogleLocationSettingsHelper;
37
38
39class GeolocationPermissionContextAndroid
40    : public GeolocationPermissionContext {
41 public:
42  explicit GeolocationPermissionContextAndroid(Profile* profile);
43
44 private:
45  struct PermissionRequestInfo {
46    PermissionRequestInfo();
47
48    PermissionRequestID id;
49    GURL requesting_frame;
50    bool user_gesture;
51    GURL embedder;
52  };
53
54  friend class GeolocationPermissionContext;
55
56  virtual ~GeolocationPermissionContextAndroid();
57
58  // GeolocationPermissionContext implementation:
59  virtual void DecidePermission(content::WebContents* web_contents,
60                                const PermissionRequestID& id,
61                                const GURL& requesting_frame,
62                                bool user_gesture,
63                                const GURL& embedder,
64                                base::Callback<void(bool)> callback) OVERRIDE;
65
66  void ProceedDecidePermission(content::WebContents* web_contents,
67                               const PermissionRequestInfo& info,
68                               base::Callback<void(bool)> callback);
69
70  scoped_ptr<GoogleLocationSettingsHelper> google_location_settings_helper_;
71
72 private:
73  void CheckSystemLocation(content::WebContents* web_contents,
74                           const PermissionRequestInfo& info,
75                           base::Callback<void(bool)> callback);
76
77  DISALLOW_COPY_AND_ASSIGN(GeolocationPermissionContextAndroid);
78};
79
80#endif  // CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_ANDROID_H_
81