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