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