1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.dumprendertree;
18
19import android.os.Bundle;
20import android.os.Handler;
21import android.os.Message;
22import android.webkit.MockGeolocation;
23import android.webkit.WebStorage;
24
25import java.util.HashMap;
26
27public class CallbackProxy extends Handler implements EventSender, LayoutTestController {
28
29    private EventSender mEventSender;
30    private LayoutTestController mLayoutTestController;
31
32    private static final int EVENT_DOM_LOG = 1;
33    private static final int EVENT_FIRE_KBD = 2;
34    private static final int EVENT_KEY_DOWN_1 = 3;
35    private static final int EVENT_KEY_DOWN_2 = 4;
36    private static final int EVENT_LEAP = 5;
37    private static final int EVENT_MOUSE_CLICK = 6;
38    private static final int EVENT_MOUSE_DOWN = 7;
39    private static final int EVENT_MOUSE_MOVE = 8;
40    private static final int EVENT_MOUSE_UP = 9;
41    private static final int EVENT_TOUCH_START = 10;
42    private static final int EVENT_TOUCH_MOVE = 11;
43    private static final int EVENT_TOUCH_END = 12;
44    private static final int EVENT_TOUCH_CANCEL = 13;
45    private static final int EVENT_ADD_TOUCH_POINT = 14;
46    private static final int EVENT_UPDATE_TOUCH_POINT = 15;
47    private static final int EVENT_RELEASE_TOUCH_POINT = 16;
48    private static final int EVENT_CLEAR_TOUCH_POINTS = 17;
49    private static final int EVENT_CANCEL_TOUCH_POINT = 18;
50    private static final int EVENT_SET_TOUCH_MODIFIER = 19;
51
52    private static final int LAYOUT_CLEAR_LIST = 20;
53    private static final int LAYOUT_DISPLAY = 21;
54    private static final int LAYOUT_DUMP_TEXT = 22;
55    private static final int LAYOUT_DUMP_HISTORY = 23;
56    private static final int LAYOUT_DUMP_CHILD_SCROLL = 24;
57    private static final int LAYOUT_DUMP_EDIT_CB = 25;
58    private static final int LAYOUT_DUMP_SEL_RECT = 26;
59    private static final int LAYOUT_DUMP_TITLE_CHANGES = 27;
60    private static final int LAYOUT_KEEP_WEB_HISTORY = 28;
61    private static final int LAYOUT_NOTIFY_DONE = 29;
62    private static final int LAYOUT_QUEUE_BACK_NAV = 30;
63    private static final int LAYOUT_QUEUE_FWD_NAV = 31;
64    private static final int LAYOUT_QUEUE_LOAD = 32;
65    private static final int LAYOUT_QUEUE_RELOAD = 33;
66    private static final int LAYOUT_QUEUE_SCRIPT = 34;
67    private static final int LAYOUT_REPAINT_HORZ = 35;
68    private static final int LAYOUT_SET_ACCEPT_EDIT = 36;
69    private static final int LAYOUT_MAIN_FIRST_RESP = 37;
70    private static final int LAYOUT_SET_WINDOW_KEY = 38;
71    private static final int LAYOUT_TEST_REPAINT = 39;
72    private static final int LAYOUT_WAIT_UNTIL_DONE = 40;
73    private static final int LAYOUT_DUMP_DATABASE_CALLBACKS = 41;
74    private static final int LAYOUT_SET_CAN_OPEN_WINDOWS = 42;
75    private static final int SET_GEOLOCATION_PERMISSION = 43;
76    private static final int OVERRIDE_PREFERENCE = 44;
77
78    CallbackProxy(EventSender eventSender,
79            LayoutTestController layoutTestController) {
80        mEventSender = eventSender;
81        mLayoutTestController = layoutTestController;
82    }
83
84    public void handleMessage(Message msg) {
85        switch (msg.what) {
86        case EVENT_DOM_LOG:
87            mEventSender.enableDOMUIEventLogging(msg.arg1);
88            break;
89        case EVENT_FIRE_KBD:
90            mEventSender.fireKeyboardEventsToElement(msg.arg1);
91            break;
92        case EVENT_KEY_DOWN_1:
93            HashMap map = (HashMap) msg.obj;
94            mEventSender.keyDown((String) map.get("character"),
95                    (String[]) map.get("withModifiers"));
96            break;
97
98        case EVENT_KEY_DOWN_2:
99            mEventSender.keyDown((String)msg.obj);
100            break;
101
102        case EVENT_LEAP:
103            mEventSender.leapForward(msg.arg1);
104            break;
105
106        case EVENT_MOUSE_CLICK:
107            mEventSender.mouseClick();
108            break;
109
110        case EVENT_MOUSE_DOWN:
111            mEventSender.mouseDown();
112            break;
113
114        case EVENT_MOUSE_MOVE:
115            mEventSender.mouseMoveTo(msg.arg1, msg.arg2);
116            break;
117
118        case EVENT_MOUSE_UP:
119            mEventSender.mouseUp();
120            break;
121
122        case EVENT_TOUCH_START:
123            mEventSender.touchStart();
124            break;
125
126        case EVENT_TOUCH_MOVE:
127            mEventSender.touchMove();
128            break;
129
130        case EVENT_TOUCH_END:
131            mEventSender.touchEnd();
132            break;
133
134        case EVENT_TOUCH_CANCEL:
135            mEventSender.touchCancel();
136            break;
137
138        case EVENT_ADD_TOUCH_POINT:
139            mEventSender.addTouchPoint(msg.arg1, msg.arg2);
140            break;
141
142        case EVENT_UPDATE_TOUCH_POINT:
143            Bundle args = (Bundle) msg.obj;
144            int x = args.getInt("x");
145            int y = args.getInt("y");
146            int id = args.getInt("id");
147            mEventSender.updateTouchPoint(id, x, y);
148            break;
149
150        case EVENT_SET_TOUCH_MODIFIER:
151            Bundle modifierArgs = (Bundle) msg.obj;
152            String modifier = modifierArgs.getString("modifier");
153            boolean enabled = modifierArgs.getBoolean("enabled");
154            mEventSender.setTouchModifier(modifier, enabled);
155            break;
156
157        case EVENT_RELEASE_TOUCH_POINT:
158            mEventSender.releaseTouchPoint(msg.arg1);
159            break;
160
161        case EVENT_CLEAR_TOUCH_POINTS:
162            mEventSender.clearTouchPoints();
163            break;
164
165        case EVENT_CANCEL_TOUCH_POINT:
166            mEventSender.cancelTouchPoint(msg.arg1);
167            break;
168
169        case LAYOUT_CLEAR_LIST:
170            mLayoutTestController.clearBackForwardList();
171            break;
172
173        case LAYOUT_DISPLAY:
174            mLayoutTestController.display();
175            break;
176
177        case LAYOUT_DUMP_TEXT:
178            mLayoutTestController.dumpAsText();
179            break;
180
181        case LAYOUT_DUMP_HISTORY:
182            mLayoutTestController.dumpBackForwardList();
183            break;
184
185        case LAYOUT_DUMP_CHILD_SCROLL:
186            mLayoutTestController.dumpChildFrameScrollPositions();
187            break;
188
189        case LAYOUT_DUMP_EDIT_CB:
190            mLayoutTestController.dumpEditingCallbacks();
191            break;
192
193        case LAYOUT_DUMP_SEL_RECT:
194            mLayoutTestController.dumpSelectionRect();
195            break;
196
197        case LAYOUT_DUMP_TITLE_CHANGES:
198            mLayoutTestController.dumpTitleChanges();
199            break;
200
201        case LAYOUT_KEEP_WEB_HISTORY:
202            mLayoutTestController.keepWebHistory();
203            break;
204
205        case LAYOUT_NOTIFY_DONE:
206            mLayoutTestController.notifyDone();
207            break;
208
209        case LAYOUT_QUEUE_BACK_NAV:
210            mLayoutTestController.queueBackNavigation(msg.arg1);
211            break;
212
213        case LAYOUT_QUEUE_FWD_NAV:
214            mLayoutTestController.queueForwardNavigation(msg.arg1);
215            break;
216
217        case LAYOUT_QUEUE_LOAD:
218            HashMap<String, String> loadMap =
219                (HashMap<String, String>) msg.obj;
220            mLayoutTestController.queueLoad(loadMap.get("Url"),
221                    loadMap.get("frameTarget"));
222            break;
223
224        case LAYOUT_QUEUE_RELOAD:
225            mLayoutTestController.queueReload();
226            break;
227
228        case LAYOUT_QUEUE_SCRIPT:
229            mLayoutTestController.queueScript((String)msg.obj);
230            break;
231
232        case LAYOUT_REPAINT_HORZ:
233            mLayoutTestController.repaintSweepHorizontally();
234            break;
235
236        case LAYOUT_SET_ACCEPT_EDIT:
237            mLayoutTestController.setAcceptsEditing(
238                    msg.arg1 == 1 ? true : false);
239            break;
240        case LAYOUT_MAIN_FIRST_RESP:
241            mLayoutTestController.setMainFrameIsFirstResponder(
242                    msg.arg1 == 1 ? true : false);
243            break;
244
245        case LAYOUT_SET_WINDOW_KEY:
246            mLayoutTestController.setWindowIsKey(
247                    msg.arg1 == 1 ? true : false);
248            break;
249
250        case LAYOUT_TEST_REPAINT:
251            mLayoutTestController.testRepaint();
252            break;
253
254        case LAYOUT_WAIT_UNTIL_DONE:
255            mLayoutTestController.waitUntilDone();
256            break;
257
258        case LAYOUT_DUMP_DATABASE_CALLBACKS:
259            mLayoutTestController.dumpDatabaseCallbacks();
260            break;
261
262        case LAYOUT_SET_CAN_OPEN_WINDOWS:
263            mLayoutTestController.setCanOpenWindows();
264            break;
265
266        case SET_GEOLOCATION_PERMISSION:
267            mLayoutTestController.setGeolocationPermission(
268                    msg.arg1 == 1 ? true : false);
269            break;
270
271        case OVERRIDE_PREFERENCE:
272            String key = msg.getData().getString("key");
273            boolean value = msg.getData().getBoolean("value");
274            mLayoutTestController.overridePreference(key, value);
275            break;
276        }
277    }
278
279    // EventSender Methods
280
281    public void enableDOMUIEventLogging(int DOMNode) {
282        obtainMessage(EVENT_DOM_LOG, DOMNode, 0).sendToTarget();
283    }
284
285    public void fireKeyboardEventsToElement(int DOMNode) {
286        obtainMessage(EVENT_FIRE_KBD, DOMNode, 0).sendToTarget();
287    }
288
289    public void keyDown(String character, String[] withModifiers) {
290        // TODO Auto-generated method stub
291        HashMap map = new HashMap();
292        map.put("character", character);
293        map.put("withModifiers", withModifiers);
294        obtainMessage(EVENT_KEY_DOWN_1, map).sendToTarget();
295    }
296
297    public void keyDown(String character) {
298        obtainMessage(EVENT_KEY_DOWN_2, character).sendToTarget();
299    }
300
301    public void leapForward(int milliseconds) {
302        obtainMessage(EVENT_LEAP, milliseconds, 0).sendToTarget();
303    }
304
305    public void mouseClick() {
306        obtainMessage(EVENT_MOUSE_CLICK).sendToTarget();
307    }
308
309    public void mouseDown() {
310        obtainMessage(EVENT_MOUSE_DOWN).sendToTarget();
311    }
312
313    public void mouseMoveTo(int X, int Y) {
314        obtainMessage(EVENT_MOUSE_MOVE, X, Y).sendToTarget();
315    }
316
317    public void mouseUp() {
318        obtainMessage(EVENT_MOUSE_UP).sendToTarget();
319    }
320
321    public void touchStart() {
322        obtainMessage(EVENT_TOUCH_START).sendToTarget();
323    }
324
325    public void addTouchPoint(int x, int y) {
326        obtainMessage(EVENT_ADD_TOUCH_POINT, x, y).sendToTarget();
327    }
328
329    public void updateTouchPoint(int id, int x, int y) {
330        Bundle map = new Bundle();
331        map.putInt("x", x);
332        map.putInt("y", y);
333        map.putInt("id", id);
334        obtainMessage(EVENT_UPDATE_TOUCH_POINT, map).sendToTarget();
335    }
336
337    public void setTouchModifier(String modifier, boolean enabled) {
338        Bundle map = new Bundle();
339        map.putString("modifier", modifier);
340        map.putBoolean("enabled", enabled);
341        obtainMessage(EVENT_SET_TOUCH_MODIFIER, map).sendToTarget();
342    }
343
344    public void touchMove() {
345        obtainMessage(EVENT_TOUCH_MOVE).sendToTarget();
346    }
347
348    public void releaseTouchPoint(int id) {
349        obtainMessage(EVENT_RELEASE_TOUCH_POINT, id, 0).sendToTarget();
350    }
351
352    public void touchEnd() {
353        obtainMessage(EVENT_TOUCH_END).sendToTarget();
354    }
355
356    public void touchCancel() {
357        obtainMessage(EVENT_TOUCH_CANCEL).sendToTarget();
358    }
359
360
361    public void clearTouchPoints() {
362        obtainMessage(EVENT_CLEAR_TOUCH_POINTS).sendToTarget();
363    }
364
365    public void cancelTouchPoint(int id) {
366        obtainMessage(EVENT_CANCEL_TOUCH_POINT, id, 0).sendToTarget();
367    }
368
369    // LayoutTestController Methods
370
371    public void clearBackForwardList() {
372        obtainMessage(LAYOUT_CLEAR_LIST).sendToTarget();
373    }
374
375    public void display() {
376        obtainMessage(LAYOUT_DISPLAY).sendToTarget();
377    }
378
379    public void dumpAsText() {
380        obtainMessage(LAYOUT_DUMP_TEXT).sendToTarget();
381    }
382
383    public void dumpBackForwardList() {
384        obtainMessage(LAYOUT_DUMP_HISTORY).sendToTarget();
385    }
386
387    public void dumpChildFrameScrollPositions() {
388        obtainMessage(LAYOUT_DUMP_CHILD_SCROLL).sendToTarget();
389    }
390
391    public void dumpEditingCallbacks() {
392        obtainMessage(LAYOUT_DUMP_EDIT_CB).sendToTarget();
393    }
394
395    public void dumpSelectionRect() {
396        obtainMessage(LAYOUT_DUMP_SEL_RECT).sendToTarget();
397    }
398
399    public void dumpTitleChanges() {
400        obtainMessage(LAYOUT_DUMP_TITLE_CHANGES).sendToTarget();
401    }
402
403    public void keepWebHistory() {
404        obtainMessage(LAYOUT_KEEP_WEB_HISTORY).sendToTarget();
405    }
406
407    public void notifyDone() {
408        obtainMessage(LAYOUT_NOTIFY_DONE).sendToTarget();
409    }
410
411    public void queueBackNavigation(int howfar) {
412        obtainMessage(LAYOUT_QUEUE_BACK_NAV, howfar, 0).sendToTarget();
413    }
414
415    public void queueForwardNavigation(int howfar) {
416        obtainMessage(LAYOUT_QUEUE_FWD_NAV, howfar, 0).sendToTarget();
417    }
418
419    public void queueLoad(String Url, String frameTarget) {
420        HashMap <String, String>map = new HashMap<String, String>();
421        map.put("Url", Url);
422        map.put("frameTarget", frameTarget);
423        obtainMessage(LAYOUT_QUEUE_LOAD, map).sendToTarget();
424    }
425
426    public void queueReload() {
427        obtainMessage(LAYOUT_QUEUE_RELOAD).sendToTarget();
428    }
429
430    public void queueScript(String scriptToRunInCurrentContext) {
431        obtainMessage(LAYOUT_QUEUE_SCRIPT,
432                scriptToRunInCurrentContext).sendToTarget();
433    }
434
435    public void repaintSweepHorizontally() {
436        obtainMessage(LAYOUT_REPAINT_HORZ).sendToTarget();
437    }
438
439    public void setAcceptsEditing(boolean b) {
440        obtainMessage(LAYOUT_SET_ACCEPT_EDIT, b ? 1 : 0, 0).sendToTarget();
441    }
442
443    public void setMainFrameIsFirstResponder(boolean b) {
444        obtainMessage(LAYOUT_MAIN_FIRST_RESP, b ? 1 : 0, 0).sendToTarget();
445    }
446
447    public void setWindowIsKey(boolean b) {
448        obtainMessage(LAYOUT_SET_WINDOW_KEY, b ? 1 : 0, 0).sendToTarget();
449    }
450
451    public void testRepaint() {
452        obtainMessage(LAYOUT_TEST_REPAINT).sendToTarget();
453    }
454
455    public void waitUntilDone() {
456        obtainMessage(LAYOUT_WAIT_UNTIL_DONE).sendToTarget();
457    }
458
459    public void dumpDatabaseCallbacks() {
460        obtainMessage(LAYOUT_DUMP_DATABASE_CALLBACKS).sendToTarget();
461    }
462
463    public void clearAllDatabases() {
464        WebStorage.getInstance().deleteAllData();
465    }
466
467    public void setDatabaseQuota(long quota) {
468        WebStorage.getInstance().setQuotaForOrigin("file://", quota);
469    }
470
471    public void setAppCacheMaximumSize(long size) {
472        WebStorage.getInstance().setAppCacheMaximumSize(size);
473    }
474
475    public void setCanOpenWindows() {
476        obtainMessage(LAYOUT_SET_CAN_OPEN_WINDOWS).sendToTarget();
477    }
478
479    public void setMockGeolocationPosition(double latitude,
480                                           double longitude,
481                                           double accuracy) {
482        MockGeolocation.getInstance().setPosition(latitude,
483                                                  longitude,
484                                                  accuracy);
485    }
486
487    public void setMockGeolocationError(int code, String message) {
488        MockGeolocation.getInstance().setError(code, message);
489    }
490
491    public void setGeolocationPermission(boolean allow) {
492        obtainMessage(SET_GEOLOCATION_PERMISSION, allow ? 1 : 0, 0).sendToTarget();
493    }
494
495    public void overridePreference(String key, boolean value) {
496        Message message = obtainMessage(OVERRIDE_PREFERENCE);
497        message.getData().putString("key", key);
498        message.getData().putBoolean("value", value);
499        message.sendToTarget();
500    }
501}
502