1d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon/* 2d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * Copyright (C) 2012 The Android Open Source Project 3d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * 4d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * Licensed under the Apache License, Version 2.0 (the "License"); 5d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * you may not use this file except in compliance with the License. 6d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * You may obtain a copy of the License at 7d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * 8d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * http://www.apache.org/licenses/LICENSE-2.0 9d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * 10d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * Unless required by applicable law or agreed to in writing, software 11d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * distributed under the License is distributed on an "AS IS" BASIS, 12d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * See the License for the specific language governing permissions and 14d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * limitations under the License. 15d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon */ 16d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 17d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixonpackage android.webkit; 18d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 19d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixonimport android.os.Handler; 20d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixonimport android.os.Message; 21d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 22d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixonimport java.util.HashMap; 23d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixonimport java.util.Map; 24d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixonimport java.util.Set; 25d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixonimport java.util.Vector; 26d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 27d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon// This class is the Java counterpart of the WebKit C++ GeolocationPermissions 28d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon// class. It simply marshals calls from the UI thread to the WebKit thread. 29d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixonfinal class GeolocationPermissionsClassic extends GeolocationPermissions { 30d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private Handler mHandler; 31d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private Handler mUIHandler; 32d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 33d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // A queue to store messages until the handler is ready. 34d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private Vector<Message> mQueuedMessages; 35d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 36d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // Message ids 37d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon static final int GET_ORIGINS = 0; 38d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon static final int GET_ALLOWED = 1; 39d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon static final int CLEAR = 2; 40d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon static final int ALLOW = 3; 41d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon static final int CLEAR_ALL = 4; 42d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 43d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // Message ids on the UI thread 44d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon static final int RETURN_ORIGINS = 0; 45d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon static final int RETURN_ALLOWED = 1; 46d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 47d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private static final String ORIGINS = "origins"; 48d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private static final String ORIGIN = "origin"; 49d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private static final String CALLBACK = "callback"; 50d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private static final String ALLOWED = "allowed"; 51d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 52d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // Global instance 53d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private static GeolocationPermissionsClassic sInstance; 54d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 55d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon public static GeolocationPermissionsClassic getInstance() { 56d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon if (sInstance == null) { 57d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon sInstance = new GeolocationPermissionsClassic(); 58d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 59d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon return sInstance; 60d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 61d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 62d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon /** 63d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * Creates the UI message handler. Must be called on the UI thread. 64d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * @hide 65d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon */ 66d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon public void createUIHandler() { 67d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon if (mUIHandler == null) { 68d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon mUIHandler = new Handler() { 69d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon @Override 70d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon public void handleMessage(Message msg) { 71d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // Runs on the UI thread. 72d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon switch (msg.what) { 73d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon case RETURN_ORIGINS: { 74d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon Map values = (Map) msg.obj; 75d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon Set<String> origins = (Set<String>) values.get(ORIGINS); 76d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon ValueCallback<Set<String> > callback = (ValueCallback<Set<String> >) values.get(CALLBACK); 77d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon callback.onReceiveValue(origins); 78d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } break; 79d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon case RETURN_ALLOWED: { 80d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon Map values = (Map) msg.obj; 81d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon Boolean allowed = (Boolean) values.get(ALLOWED); 82d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon ValueCallback<Boolean> callback = (ValueCallback<Boolean>) values.get(CALLBACK); 83d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon callback.onReceiveValue(allowed); 84d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } break; 85d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 86d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 87d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon }; 88d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 89d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 90d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 91d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon /** 92d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * Creates the message handler. Must be called on the WebKit thread. 93d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * @hide 94d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon */ 95d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon public synchronized void createHandler() { 96d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon if (mHandler == null) { 97d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon mHandler = new Handler() { 98d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon @Override 99d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon public void handleMessage(Message msg) { 100d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // Runs on the WebKit thread. 101d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon switch (msg.what) { 102d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon case GET_ORIGINS: { 103d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon Set origins = nativeGetOrigins(); 104d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon ValueCallback callback = (ValueCallback) msg.obj; 105d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon Map values = new HashMap<String, Object>(); 106d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon values.put(CALLBACK, callback); 107d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon values.put(ORIGINS, origins); 108d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon postUIMessage(Message.obtain(null, RETURN_ORIGINS, values)); 109d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } break; 110d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon case GET_ALLOWED: { 111d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon Map values = (Map) msg.obj; 112d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon String origin = (String) values.get(ORIGIN); 113d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon ValueCallback callback = (ValueCallback) values.get(CALLBACK); 114d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon boolean allowed = nativeGetAllowed(origin); 115d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon Map retValues = new HashMap<String, Object>(); 116d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon retValues.put(CALLBACK, callback); 117d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon retValues.put(ALLOWED, Boolean.valueOf(allowed)); 118d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon postUIMessage(Message.obtain(null, RETURN_ALLOWED, retValues)); 119d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } break; 120d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon case CLEAR: 121d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon nativeClear((String) msg.obj); 122d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon break; 123d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon case ALLOW: 124d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon nativeAllow((String) msg.obj); 125d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon break; 126d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon case CLEAR_ALL: 127d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon nativeClearAll(); 128d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon break; 129d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 130d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 131d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon }; 132d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 133d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // Handle the queued messages 134d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon if (mQueuedMessages != null) { 135d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon while (!mQueuedMessages.isEmpty()) { 136d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon mHandler.sendMessage(mQueuedMessages.remove(0)); 137d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 138d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon mQueuedMessages = null; 139d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 140d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 141d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 142d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 143d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon /** 144d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * Utility function to send a message to our handler. 145d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon */ 146d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private synchronized void postMessage(Message msg) { 147d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon if (mHandler == null) { 148d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon if (mQueuedMessages == null) { 149d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon mQueuedMessages = new Vector<Message>(); 150d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 151d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon mQueuedMessages.add(msg); 152d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } else { 153d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon mHandler.sendMessage(msg); 154d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 155d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 156d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 157d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon /** 158d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon * Utility function to send a message to the handler on the UI thread 159d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon */ 160d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private void postUIMessage(Message msg) { 161d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon if (mUIHandler != null) { 162d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon mUIHandler.sendMessage(msg); 163d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 164d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 165d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 166d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // Note that we represent the origins as strings. These are created using 167d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // WebCore::SecurityOrigin::toString(). As long as all 'HTML 5 modules' 168d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // (Database, Geolocation etc) do so, it's safe to match up origins based 169d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // on this string. 170d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon @Override 171d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon public void getOrigins(ValueCallback<Set<String> > callback) { 172d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon if (callback != null) { 173d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon if (WebViewCore.THREAD_NAME.equals(Thread.currentThread().getName())) { 174d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon Set origins = nativeGetOrigins(); 175d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon callback.onReceiveValue(origins); 176d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } else { 177d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon postMessage(Message.obtain(null, GET_ORIGINS, callback)); 178d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 179d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 180d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 181d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 182d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon @Override 183d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon public void getAllowed(String origin, ValueCallback<Boolean> callback) { 184d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon if (callback == null) { 185d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon return; 186d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 187d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon if (origin == null) { 188d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon callback.onReceiveValue(null); 189d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon return; 190d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 191d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon if (WebViewCore.THREAD_NAME.equals(Thread.currentThread().getName())) { 192d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon boolean allowed = nativeGetAllowed(origin); 193d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon callback.onReceiveValue(Boolean.valueOf(allowed)); 194d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } else { 195d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon Map values = new HashMap<String, Object>(); 196d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon values.put(ORIGIN, origin); 197d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon values.put(CALLBACK, callback); 198d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon postMessage(Message.obtain(null, GET_ALLOWED, values)); 199d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 200d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 201d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 202d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // This method may be called before the WebKit 203d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // thread has intialized the message handler. Messages will be queued until 204d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // this time. 205d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon @Override 206d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon public void clear(String origin) { 207d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // Called on the UI thread. 208d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon postMessage(Message.obtain(null, CLEAR, origin)); 209d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 210d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 211d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // This method may be called before the WebKit 212d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // thread has intialized the message handler. Messages will be queued until 213d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // this time. 214d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon @Override 215d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon public void allow(String origin) { 216d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // Called on the UI thread. 217d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon postMessage(Message.obtain(null, ALLOW, origin)); 218d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 219d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 220d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon @Override 221d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon public void clearAll() { 222d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // Called on the UI thread. 223d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon postMessage(Message.obtain(null, CLEAR_ALL)); 224d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon } 225d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 226d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon GeolocationPermissionsClassic() {} 227d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon 228d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon // Native functions, run on the WebKit thread. 229d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private static native Set nativeGetOrigins(); 230d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private static native boolean nativeGetAllowed(String origin); 231d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private static native void nativeClear(String origin); 232d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private static native void nativeAllow(String origin); 233d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon private static native void nativeClearAll(); 234d3101b1d300f5942fdb7dfa323dc8830c4edc007Jonathan Dixon} 235