• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 package org.chromium.android_webview;
6 
7 import android.content.SharedPreferences;
8 import android.webkit.ValueCallback;
9 
10 import org.chromium.base.ThreadUtils;
11 import org.chromium.net.GURLUtils;
12 
13 import java.util.HashSet;
14 import java.util.Set;
15 
16 /**
17  * This class is used to manage permissions for the WebView's Geolocation JavaScript API.
18  *
19  * Callbacks are posted on the UI thread.
20  */
21 public final class AwGeolocationPermissions {
22 
23     private static final String PREF_PREFIX =
24             "AwGeolocationPermissions%";
25     private final SharedPreferences mSharedPreferences;
26 
AwGeolocationPermissions(SharedPreferences sharedPreferences)27     public AwGeolocationPermissions(SharedPreferences sharedPreferences) {
28         mSharedPreferences = sharedPreferences;
29     }
30 
31     /**
32      * Set one origin to be allowed.
33      */
allow(String origin)34     public void allow(String origin) {
35         String key = getOriginKey(origin);
36         if (key != null) {
37             mSharedPreferences.edit().putBoolean(key, true).apply();
38         }
39     }
40 
41     /**
42      * Set one origin to be denied.
43      */
deny(String origin)44     public void deny(String origin) {
45         String key = getOriginKey(origin);
46         if (key != null) {
47             mSharedPreferences.edit().putBoolean(key, false).apply();
48         }
49     }
50 
51     /**
52      * Clear the stored permission for a particular origin.
53      */
clear(String origin)54     public void clear(String origin) {
55         String key = getOriginKey(origin);
56         if (key != null) {
57             mSharedPreferences.edit().remove(key).apply();
58         }
59     }
60 
61     /**
62      * Clear stored permissions for all origins.
63      */
clearAll()64     public void clearAll() {
65         SharedPreferences.Editor editor = null;
66         for (String name : mSharedPreferences.getAll().keySet()) {
67             if (name.startsWith(PREF_PREFIX)) {
68                 if (editor == null) {
69                     editor = mSharedPreferences.edit();
70                 }
71                 editor.remove(name);
72             }
73         }
74         if (editor != null) {
75             editor.apply();
76         }
77     }
78 
79     /**
80      * Synchronous method to get if an origin is set to be allowed.
81      */
isOriginAllowed(String origin)82     public boolean isOriginAllowed(String origin) {
83         return mSharedPreferences.getBoolean(getOriginKey(origin), false);
84     }
85 
86     /**
87      * Returns true if the origin is either set to allowed or denied.
88      */
hasOrigin(String origin)89     public boolean hasOrigin(String origin) {
90         return mSharedPreferences.contains(getOriginKey(origin));
91     }
92 
93     /**
94      * Asynchronous method to get if an origin set to be allowed.
95      */
getAllowed(String origin, final ValueCallback<Boolean> callback)96     public void getAllowed(String origin, final ValueCallback<Boolean> callback) {
97         final boolean finalAllowed = isOriginAllowed(origin);
98         ThreadUtils.postOnUiThread(new Runnable() {
99             @Override
100             public void run() {
101                 callback.onReceiveValue(finalAllowed);
102             }
103         });
104     }
105 
106     /**
107      * Async method to get the domains currently allowed or denied.
108      */
getOrigins(final ValueCallback<Set<String>> callback)109     public void getOrigins(final ValueCallback<Set<String>> callback) {
110         final Set<String> origins = new HashSet<String>();
111         for (String name : mSharedPreferences.getAll().keySet()) {
112             if (name.startsWith(PREF_PREFIX)) {
113                 origins.add(name.substring(PREF_PREFIX.length()));
114             }
115         }
116         ThreadUtils.postOnUiThread(new Runnable() {
117             @Override
118             public void run() {
119                 callback.onReceiveValue(origins);
120             }
121         });
122     }
123 
124     /**
125      * Get the domain of an URL using the GURL library.
126      */
getOriginKey(String url)127     private String getOriginKey(String url) {
128         String origin = GURLUtils.getOrigin(url);
129         if (origin.isEmpty()) {
130             return null;
131         }
132 
133         return PREF_PREFIX + origin;
134     }
135 }
136