Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.android_webview; | 5 package org.chromium.android_webview; |
| 6 | 6 |
| 7 import android.content.SharedPreferences; | 7 import android.content.SharedPreferences; |
| 8 import android.webkit.ValueCallback; | 8 import android.webkit.ValueCallback; |
| 9 | 9 |
| 10 import org.chromium.base.ThreadUtils; | 10 import org.chromium.base.ThreadUtils; |
| 11 import org.chromium.net.GURLUtils; | 11 import org.chromium.net.GURLUtils; |
| 12 | 12 |
| 13 import java.util.HashSet; | 13 import java.util.HashSet; |
| 14 import java.util.Set; | 14 import java.util.Set; |
| 15 | 15 |
| 16 /** | 16 /** |
| 17 * This class is used to manage permissions for the WebView's Geolocation JavaSc ript API. | 17 * This class is used to manage permissions for the WebView's Geolocation JavaSc ript API. |
| 18 * | 18 * |
| 19 * Callbacks are posted on the UI thread. | 19 * Callbacks are posted on the UI thread. |
| 20 */ | 20 */ |
| 21 public final class AwGeolocationPermissions { | 21 public final class AwGeolocationPermissions { |
| 22 | 22 |
| 23 private static final String PREF_PREFIX = | 23 private static final String PREF_PREFIX = |
| 24 AwGeolocationPermissions.class.getCanonicalName() + "%"; | 24 AwGeolocationPermissions.class.getCanonicalName() + "%"; |
| 25 private final SharedPreferences mSharedPreferences; | 25 private final SharedPreferences mSharedPreferences; |
| 26 | 26 |
| 27 private static AwGeolocationPermissions sInstance; | |
|
joth
2013/02/06 22:09:51
crumbs more statics. I'll make a patch to avoid th
Kristian Monsen
2013/02/08 00:07:44
OK.
| |
| 28 | |
| 29 // TODO(kristianm): Make this private once framework is updated to use getIn stance | |
|
boliu
2013/02/06 20:29:54
Sorry I don't understand this comment. What framew
Kristian Monsen
2013/02/08 00:07:44
Android -> framework/webview. That is where this i
| |
| 27 public AwGeolocationPermissions(SharedPreferences sharedPreferences) { | 30 public AwGeolocationPermissions(SharedPreferences sharedPreferences) { |
| 28 mSharedPreferences = sharedPreferences; | 31 mSharedPreferences = sharedPreferences; |
| 32 sInstance = this; | |
| 29 } | 33 } |
| 30 | 34 |
| 35 /** | |
| 36 * Get the static instance after it has been created | |
| 37 */ | |
| 38 public static synchronized AwGeolocationPermissions getInstance() { | |
|
boliu
2013/02/06 20:29:54
Can we use synchronized blocks instead of having t
Kristian Monsen
2013/02/08 00:07:44
Done.
| |
| 39 if (sInstance == null) { | |
| 40 throw new IllegalStateException("This should only be called after cr eteInstance."); | |
| 41 } | |
| 42 return sInstance; | |
| 43 } | |
| 44 | |
| 45 /** | |
| 46 * Create the static instance of this class | |
| 47 */ | |
| 48 public static synchronized AwGeolocationPermissions createInstance( | |
|
boliu
2013/02/06 20:29:54
getInstance vs createInstance? I'm confused if thi
Kristian Monsen
2013/02/08 00:07:44
It needs a SharedPreference when creating the stat
| |
| 49 SharedPreferences sharedPreferences) { | |
| 50 if (sInstance != null) { | |
| 51 throw new IllegalStateException("This should only be called once."); | |
| 52 } | |
| 53 sInstance = new AwGeolocationPermissions(sharedPreferences); | |
|
boliu
2013/02/06 20:29:54
sInstance is set here and in the constructor, dupl
Kristian Monsen
2013/02/08 00:07:44
Yes, done.
I wanted it here, but had to be in the
| |
| 54 return sInstance; | |
| 55 } | |
| 56 | |
| 57 /** | |
| 58 * Set one origin to be allowed. | |
| 59 */ | |
| 31 public void allow(String origin) { | 60 public void allow(String origin) { |
| 32 String key = getOriginKey(origin); | 61 String key = getOriginKey(origin); |
| 33 if (key != null) { | 62 if (key != null) { |
| 34 mSharedPreferences.edit().putBoolean(key, true).apply(); | 63 mSharedPreferences.edit().putBoolean(key, true).apply(); |
| 35 } | 64 } |
| 36 } | 65 } |
| 37 | 66 |
| 67 /** | |
| 68 * Set one origin to be denied. | |
| 69 */ | |
| 38 public void deny(String origin) { | 70 public void deny(String origin) { |
| 39 String key = getOriginKey(origin); | 71 String key = getOriginKey(origin); |
| 40 if (key != null) { | 72 if (key != null) { |
| 41 mSharedPreferences.edit().putBoolean(key, false).apply(); | 73 mSharedPreferences.edit().putBoolean(key, false).apply(); |
| 42 } | 74 } |
| 43 } | 75 } |
| 44 | 76 |
| 77 /** | |
| 78 * Clear one origin from being allowed and denied. | |
| 79 */ | |
| 45 public void clear(String origin) { | 80 public void clear(String origin) { |
| 46 String key = getOriginKey(origin); | 81 String key = getOriginKey(origin); |
| 47 if (key != null) { | 82 if (key != null) { |
| 48 mSharedPreferences.edit().remove(key).apply(); | 83 mSharedPreferences.edit().remove(key).apply(); |
| 49 } | 84 } |
| 50 } | 85 } |
| 51 | 86 |
| 87 /** | |
| 88 * Clear all origins set to allowed or denied. | |
| 89 */ | |
| 52 public void clearAll() { | 90 public void clearAll() { |
| 53 SharedPreferences.Editor editor = null; | 91 SharedPreferences.Editor editor = null; |
| 54 for (String name : mSharedPreferences.getAll().keySet()) { | 92 for (String name : mSharedPreferences.getAll().keySet()) { |
| 55 if (name.startsWith(PREF_PREFIX)) { | 93 if (name.startsWith(PREF_PREFIX)) { |
| 56 if (editor == null) { | 94 if (editor == null) { |
| 57 editor = mSharedPreferences.edit(); | 95 editor = mSharedPreferences.edit(); |
| 58 } | 96 } |
| 59 editor.remove(name); | 97 editor.remove(name); |
| 60 } | 98 } |
| 61 } | 99 } |
| 62 if (editor != null) { | 100 if (editor != null) { |
| 63 editor.apply(); | 101 editor.apply(); |
| 64 } | 102 } |
| 65 } | 103 } |
| 66 | 104 |
| 67 public void getAllowed(String origin, final ValueCallback<Boolean> callback) { | 105 /** |
| 106 * Sync method to get if an origin set to be allowed. | |
| 107 */ | |
| 108 public boolean getAllowed(String origin) { | |
|
joth
2013/02/06 22:09:51
I think isOriginAllowed / isOriginDenied would be
Kristian Monsen
2013/02/08 00:07:44
Done.
| |
| 68 boolean allowed = false; | 109 boolean allowed = false; |
| 69 try { | 110 try { |
| 70 String key = getOriginKey(origin); | 111 String key = getOriginKey(origin); |
| 71 if (key != null) { | 112 if (key != null) { |
| 72 allowed = mSharedPreferences.getBoolean(key, false); | 113 allowed = mSharedPreferences.getBoolean(key, false); |
| 73 } | 114 } |
| 74 } catch (ClassCastException e) { | 115 } catch (ClassCastException e) { |
| 75 // Want to return false in this case, do nothing here | 116 // Want to return false in this case, do nothing here |
| 76 } | 117 } |
| 77 final boolean finalAllowed = allowed; | 118 return allowed; |
|
joth
2013/02/06 22:09:51
AIUI passing key == null to getFoo() is fine so yo
Kristian Monsen
2013/02/08 00:07:44
Done.
| |
| 119 } | |
| 120 | |
| 121 /** | |
| 122 * Sync method to get if an origin set to be denied. | |
| 123 */ | |
| 124 public boolean getDenied(String origin) { | |
| 125 boolean allowed = true; | |
| 126 try { | |
| 127 String key = getOriginKey(origin); | |
| 128 if (key != null) { | |
| 129 allowed = mSharedPreferences.getBoolean(key, true); | |
|
joth
2013/02/06 22:09:51
the 'true' here & above looks very odd.
This come
Kristian Monsen
2013/02/08 00:07:44
Updated as it makes the only callsite clearer, but
joth
2013/02/08 02:15:01
agreed. we might as well invent an enum (int const
| |
| 130 } | |
| 131 } catch (ClassCastException e) { | |
| 132 // Want to return false in this case, do nothing here | |
| 133 } | |
| 134 return !allowed; | |
| 135 } | |
| 136 | |
| 137 /** | |
| 138 * ASync method to get if an origin set to be allowed. | |
| 139 */ | |
| 140 public void getAllowed(String origin, final ValueCallback<Boolean> callback) { | |
| 141 final boolean finalAllowed = getAllowed(origin); | |
|
boliu
2013/02/06 20:29:54
given this is async, should this be more async tha
Kristian Monsen
2013/02/08 00:07:44
I felt this was better as the result will reflect
joth
2013/02/08 02:15:01
Seems reasonable. Otherwise, calling this sequence
| |
| 78 ThreadUtils.postOnUiThread(new Runnable() { | 142 ThreadUtils.postOnUiThread(new Runnable() { |
| 79 @Override | 143 @Override |
| 80 public void run() { | 144 public void run() { |
| 81 callback.onReceiveValue(finalAllowed); | 145 callback.onReceiveValue(finalAllowed); |
| 82 } | 146 } |
| 83 }); | 147 }); |
| 84 } | 148 } |
| 85 | 149 |
| 150 /** | |
| 151 * ASync method to get the domains currently allowed or denied. | |
| 152 */ | |
| 86 public void getOrigins(final ValueCallback<Set<String>> callback) { | 153 public void getOrigins(final ValueCallback<Set<String>> callback) { |
| 87 final Set<String> origins = new HashSet<String>(); | 154 final Set<String> origins = new HashSet<String>(); |
| 88 for (String name : mSharedPreferences.getAll().keySet()) { | 155 for (String name : mSharedPreferences.getAll().keySet()) { |
| 89 if (name.startsWith(PREF_PREFIX)) { | 156 if (name.startsWith(PREF_PREFIX)) { |
| 90 origins.add(name.substring(PREF_PREFIX.length())); | 157 origins.add(name.substring(PREF_PREFIX.length())); |
| 91 } | 158 } |
| 92 } | 159 } |
| 93 ThreadUtils.postOnUiThread(new Runnable() { | 160 ThreadUtils.postOnUiThread(new Runnable() { |
| 94 @Override | 161 @Override |
| 95 public void run() { | 162 public void run() { |
| 96 callback.onReceiveValue(origins); | 163 callback.onReceiveValue(origins); |
| 97 } | 164 } |
| 98 }); | 165 }); |
| 99 } | 166 } |
| 100 | 167 |
| 168 /** | |
| 169 * Get the domain of an URL using the GURL library. | |
| 170 */ | |
| 101 private String getOriginKey(String url) { | 171 private String getOriginKey(String url) { |
| 102 String origin = GURLUtils.getOrigin(url); | 172 String origin = GURLUtils.getOrigin(url); |
| 103 if (origin.isEmpty()) { | 173 if (origin.isEmpty()) { |
| 104 return null; | 174 return null; |
| 105 } | 175 } |
| 106 | 176 |
| 107 return PREF_PREFIX + origin; | 177 return PREF_PREFIX + origin; |
| 108 } | 178 } |
| 109 } | 179 } |
| OLD | NEW |