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 17 package com.android.dumprendertree; 18 19 import android.os.Bundle; 20 import android.os.Handler; 21 import android.os.Message; 22 import android.webkit.MockGeolocation; 23 import android.webkit.WebStorage; 24 25 import java.util.HashMap; 26 27 public 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 private static final int LAYOUT_DUMP_CHILD_FRAMES_TEXT = 45; 78 private static final int SET_XSS_AUDITOR_ENABLED = 46; 79 CallbackProxy(EventSender eventSender, LayoutTestController layoutTestController)80 CallbackProxy(EventSender eventSender, 81 LayoutTestController layoutTestController) { 82 mEventSender = eventSender; 83 mLayoutTestController = layoutTestController; 84 } 85 handleMessage(Message msg)86 public void handleMessage(Message msg) { 87 switch (msg.what) { 88 case EVENT_DOM_LOG: 89 mEventSender.enableDOMUIEventLogging(msg.arg1); 90 break; 91 case EVENT_FIRE_KBD: 92 mEventSender.fireKeyboardEventsToElement(msg.arg1); 93 break; 94 case EVENT_KEY_DOWN_1: 95 HashMap map = (HashMap) msg.obj; 96 mEventSender.keyDown((String) map.get("character"), 97 (String[]) map.get("withModifiers")); 98 break; 99 100 case EVENT_KEY_DOWN_2: 101 mEventSender.keyDown((String)msg.obj); 102 break; 103 104 case EVENT_LEAP: 105 mEventSender.leapForward(msg.arg1); 106 break; 107 108 case EVENT_MOUSE_CLICK: 109 mEventSender.mouseClick(); 110 break; 111 112 case EVENT_MOUSE_DOWN: 113 mEventSender.mouseDown(); 114 break; 115 116 case EVENT_MOUSE_MOVE: 117 mEventSender.mouseMoveTo(msg.arg1, msg.arg2); 118 break; 119 120 case EVENT_MOUSE_UP: 121 mEventSender.mouseUp(); 122 break; 123 124 case EVENT_TOUCH_START: 125 mEventSender.touchStart(); 126 break; 127 128 case EVENT_TOUCH_MOVE: 129 mEventSender.touchMove(); 130 break; 131 132 case EVENT_TOUCH_END: 133 mEventSender.touchEnd(); 134 break; 135 136 case EVENT_TOUCH_CANCEL: 137 mEventSender.touchCancel(); 138 break; 139 140 case EVENT_ADD_TOUCH_POINT: 141 mEventSender.addTouchPoint(msg.arg1, msg.arg2); 142 break; 143 144 case EVENT_UPDATE_TOUCH_POINT: 145 Bundle args = (Bundle) msg.obj; 146 int x = args.getInt("x"); 147 int y = args.getInt("y"); 148 int id = args.getInt("id"); 149 mEventSender.updateTouchPoint(id, x, y); 150 break; 151 152 case EVENT_SET_TOUCH_MODIFIER: 153 Bundle modifierArgs = (Bundle) msg.obj; 154 String modifier = modifierArgs.getString("modifier"); 155 boolean enabled = modifierArgs.getBoolean("enabled"); 156 mEventSender.setTouchModifier(modifier, enabled); 157 break; 158 159 case EVENT_RELEASE_TOUCH_POINT: 160 mEventSender.releaseTouchPoint(msg.arg1); 161 break; 162 163 case EVENT_CLEAR_TOUCH_POINTS: 164 mEventSender.clearTouchPoints(); 165 break; 166 167 case EVENT_CANCEL_TOUCH_POINT: 168 mEventSender.cancelTouchPoint(msg.arg1); 169 break; 170 171 case LAYOUT_CLEAR_LIST: 172 mLayoutTestController.clearBackForwardList(); 173 break; 174 175 case LAYOUT_DISPLAY: 176 mLayoutTestController.display(); 177 break; 178 179 case LAYOUT_DUMP_TEXT: 180 mLayoutTestController.dumpAsText(msg.arg1 == 1); 181 break; 182 183 case LAYOUT_DUMP_CHILD_FRAMES_TEXT: 184 mLayoutTestController.dumpChildFramesAsText(); 185 break; 186 187 case LAYOUT_DUMP_HISTORY: 188 mLayoutTestController.dumpBackForwardList(); 189 break; 190 191 case LAYOUT_DUMP_CHILD_SCROLL: 192 mLayoutTestController.dumpChildFrameScrollPositions(); 193 break; 194 195 case LAYOUT_DUMP_EDIT_CB: 196 mLayoutTestController.dumpEditingCallbacks(); 197 break; 198 199 case LAYOUT_DUMP_SEL_RECT: 200 mLayoutTestController.dumpSelectionRect(); 201 break; 202 203 case LAYOUT_DUMP_TITLE_CHANGES: 204 mLayoutTestController.dumpTitleChanges(); 205 break; 206 207 case LAYOUT_KEEP_WEB_HISTORY: 208 mLayoutTestController.keepWebHistory(); 209 break; 210 211 case LAYOUT_NOTIFY_DONE: 212 mLayoutTestController.notifyDone(); 213 break; 214 215 case LAYOUT_QUEUE_BACK_NAV: 216 mLayoutTestController.queueBackNavigation(msg.arg1); 217 break; 218 219 case LAYOUT_QUEUE_FWD_NAV: 220 mLayoutTestController.queueForwardNavigation(msg.arg1); 221 break; 222 223 case LAYOUT_QUEUE_LOAD: 224 HashMap<String, String> loadMap = 225 (HashMap<String, String>) msg.obj; 226 mLayoutTestController.queueLoad(loadMap.get("Url"), 227 loadMap.get("frameTarget")); 228 break; 229 230 case LAYOUT_QUEUE_RELOAD: 231 mLayoutTestController.queueReload(); 232 break; 233 234 case LAYOUT_QUEUE_SCRIPT: 235 mLayoutTestController.queueScript((String)msg.obj); 236 break; 237 238 case LAYOUT_REPAINT_HORZ: 239 mLayoutTestController.repaintSweepHorizontally(); 240 break; 241 242 case LAYOUT_SET_ACCEPT_EDIT: 243 mLayoutTestController.setAcceptsEditing( 244 msg.arg1 == 1 ? true : false); 245 break; 246 case LAYOUT_MAIN_FIRST_RESP: 247 mLayoutTestController.setMainFrameIsFirstResponder( 248 msg.arg1 == 1 ? true : false); 249 break; 250 251 case LAYOUT_SET_WINDOW_KEY: 252 mLayoutTestController.setWindowIsKey( 253 msg.arg1 == 1 ? true : false); 254 break; 255 256 case LAYOUT_TEST_REPAINT: 257 mLayoutTestController.testRepaint(); 258 break; 259 260 case LAYOUT_WAIT_UNTIL_DONE: 261 mLayoutTestController.waitUntilDone(); 262 break; 263 264 case LAYOUT_DUMP_DATABASE_CALLBACKS: 265 mLayoutTestController.dumpDatabaseCallbacks(); 266 break; 267 268 case LAYOUT_SET_CAN_OPEN_WINDOWS: 269 mLayoutTestController.setCanOpenWindows(); 270 break; 271 272 case SET_GEOLOCATION_PERMISSION: 273 mLayoutTestController.setGeolocationPermission( 274 msg.arg1 == 1 ? true : false); 275 break; 276 277 case OVERRIDE_PREFERENCE: 278 String key = msg.getData().getString("key"); 279 boolean value = msg.getData().getBoolean("value"); 280 mLayoutTestController.overridePreference(key, value); 281 break; 282 283 case SET_XSS_AUDITOR_ENABLED: 284 mLayoutTestController.setXSSAuditorEnabled(msg.arg1 == 1); 285 break; 286 } 287 } 288 289 // EventSender Methods 290 enableDOMUIEventLogging(int DOMNode)291 public void enableDOMUIEventLogging(int DOMNode) { 292 obtainMessage(EVENT_DOM_LOG, DOMNode, 0).sendToTarget(); 293 } 294 fireKeyboardEventsToElement(int DOMNode)295 public void fireKeyboardEventsToElement(int DOMNode) { 296 obtainMessage(EVENT_FIRE_KBD, DOMNode, 0).sendToTarget(); 297 } 298 keyDown(String character, String[] withModifiers)299 public void keyDown(String character, String[] withModifiers) { 300 // TODO Auto-generated method stub 301 HashMap map = new HashMap(); 302 map.put("character", character); 303 map.put("withModifiers", withModifiers); 304 obtainMessage(EVENT_KEY_DOWN_1, map).sendToTarget(); 305 } 306 keyDown(String character)307 public void keyDown(String character) { 308 obtainMessage(EVENT_KEY_DOWN_2, character).sendToTarget(); 309 } 310 leapForward(int milliseconds)311 public void leapForward(int milliseconds) { 312 obtainMessage(EVENT_LEAP, milliseconds, 0).sendToTarget(); 313 } 314 mouseClick()315 public void mouseClick() { 316 obtainMessage(EVENT_MOUSE_CLICK).sendToTarget(); 317 } 318 mouseDown()319 public void mouseDown() { 320 obtainMessage(EVENT_MOUSE_DOWN).sendToTarget(); 321 } 322 mouseMoveTo(int X, int Y)323 public void mouseMoveTo(int X, int Y) { 324 obtainMessage(EVENT_MOUSE_MOVE, X, Y).sendToTarget(); 325 } 326 mouseUp()327 public void mouseUp() { 328 obtainMessage(EVENT_MOUSE_UP).sendToTarget(); 329 } 330 touchStart()331 public void touchStart() { 332 obtainMessage(EVENT_TOUCH_START).sendToTarget(); 333 } 334 addTouchPoint(int x, int y)335 public void addTouchPoint(int x, int y) { 336 obtainMessage(EVENT_ADD_TOUCH_POINT, x, y).sendToTarget(); 337 } 338 updateTouchPoint(int id, int x, int y)339 public void updateTouchPoint(int id, int x, int y) { 340 Bundle map = new Bundle(); 341 map.putInt("x", x); 342 map.putInt("y", y); 343 map.putInt("id", id); 344 obtainMessage(EVENT_UPDATE_TOUCH_POINT, map).sendToTarget(); 345 } 346 setTouchModifier(String modifier, boolean enabled)347 public void setTouchModifier(String modifier, boolean enabled) { 348 Bundle map = new Bundle(); 349 map.putString("modifier", modifier); 350 map.putBoolean("enabled", enabled); 351 obtainMessage(EVENT_SET_TOUCH_MODIFIER, map).sendToTarget(); 352 } 353 touchMove()354 public void touchMove() { 355 obtainMessage(EVENT_TOUCH_MOVE).sendToTarget(); 356 } 357 releaseTouchPoint(int id)358 public void releaseTouchPoint(int id) { 359 obtainMessage(EVENT_RELEASE_TOUCH_POINT, id, 0).sendToTarget(); 360 } 361 touchEnd()362 public void touchEnd() { 363 obtainMessage(EVENT_TOUCH_END).sendToTarget(); 364 } 365 touchCancel()366 public void touchCancel() { 367 obtainMessage(EVENT_TOUCH_CANCEL).sendToTarget(); 368 } 369 370 clearTouchPoints()371 public void clearTouchPoints() { 372 obtainMessage(EVENT_CLEAR_TOUCH_POINTS).sendToTarget(); 373 } 374 cancelTouchPoint(int id)375 public void cancelTouchPoint(int id) { 376 obtainMessage(EVENT_CANCEL_TOUCH_POINT, id, 0).sendToTarget(); 377 } 378 379 // LayoutTestController Methods 380 clearBackForwardList()381 public void clearBackForwardList() { 382 obtainMessage(LAYOUT_CLEAR_LIST).sendToTarget(); 383 } 384 display()385 public void display() { 386 obtainMessage(LAYOUT_DISPLAY).sendToTarget(); 387 } 388 dumpAsText()389 public void dumpAsText() { 390 obtainMessage(LAYOUT_DUMP_TEXT, 0).sendToTarget(); 391 } 392 dumpAsText(boolean enablePixelTests)393 public void dumpAsText(boolean enablePixelTests) { 394 obtainMessage(LAYOUT_DUMP_TEXT, enablePixelTests ? 1 : 0).sendToTarget(); 395 } 396 dumpChildFramesAsText()397 public void dumpChildFramesAsText() { 398 obtainMessage(LAYOUT_DUMP_CHILD_FRAMES_TEXT).sendToTarget(); 399 } 400 dumpBackForwardList()401 public void dumpBackForwardList() { 402 obtainMessage(LAYOUT_DUMP_HISTORY).sendToTarget(); 403 } 404 dumpChildFrameScrollPositions()405 public void dumpChildFrameScrollPositions() { 406 obtainMessage(LAYOUT_DUMP_CHILD_SCROLL).sendToTarget(); 407 } 408 dumpEditingCallbacks()409 public void dumpEditingCallbacks() { 410 obtainMessage(LAYOUT_DUMP_EDIT_CB).sendToTarget(); 411 } 412 dumpSelectionRect()413 public void dumpSelectionRect() { 414 obtainMessage(LAYOUT_DUMP_SEL_RECT).sendToTarget(); 415 } 416 dumpTitleChanges()417 public void dumpTitleChanges() { 418 obtainMessage(LAYOUT_DUMP_TITLE_CHANGES).sendToTarget(); 419 } 420 keepWebHistory()421 public void keepWebHistory() { 422 obtainMessage(LAYOUT_KEEP_WEB_HISTORY).sendToTarget(); 423 } 424 notifyDone()425 public void notifyDone() { 426 obtainMessage(LAYOUT_NOTIFY_DONE).sendToTarget(); 427 } 428 queueBackNavigation(int howfar)429 public void queueBackNavigation(int howfar) { 430 obtainMessage(LAYOUT_QUEUE_BACK_NAV, howfar, 0).sendToTarget(); 431 } 432 queueForwardNavigation(int howfar)433 public void queueForwardNavigation(int howfar) { 434 obtainMessage(LAYOUT_QUEUE_FWD_NAV, howfar, 0).sendToTarget(); 435 } 436 queueLoad(String Url, String frameTarget)437 public void queueLoad(String Url, String frameTarget) { 438 HashMap <String, String>map = new HashMap<String, String>(); 439 map.put("Url", Url); 440 map.put("frameTarget", frameTarget); 441 obtainMessage(LAYOUT_QUEUE_LOAD, map).sendToTarget(); 442 } 443 queueReload()444 public void queueReload() { 445 obtainMessage(LAYOUT_QUEUE_RELOAD).sendToTarget(); 446 } 447 queueScript(String scriptToRunInCurrentContext)448 public void queueScript(String scriptToRunInCurrentContext) { 449 obtainMessage(LAYOUT_QUEUE_SCRIPT, 450 scriptToRunInCurrentContext).sendToTarget(); 451 } 452 repaintSweepHorizontally()453 public void repaintSweepHorizontally() { 454 obtainMessage(LAYOUT_REPAINT_HORZ).sendToTarget(); 455 } 456 setAcceptsEditing(boolean b)457 public void setAcceptsEditing(boolean b) { 458 obtainMessage(LAYOUT_SET_ACCEPT_EDIT, b ? 1 : 0, 0).sendToTarget(); 459 } 460 setMainFrameIsFirstResponder(boolean b)461 public void setMainFrameIsFirstResponder(boolean b) { 462 obtainMessage(LAYOUT_MAIN_FIRST_RESP, b ? 1 : 0, 0).sendToTarget(); 463 } 464 setWindowIsKey(boolean b)465 public void setWindowIsKey(boolean b) { 466 obtainMessage(LAYOUT_SET_WINDOW_KEY, b ? 1 : 0, 0).sendToTarget(); 467 } 468 testRepaint()469 public void testRepaint() { 470 obtainMessage(LAYOUT_TEST_REPAINT).sendToTarget(); 471 } 472 waitUntilDone()473 public void waitUntilDone() { 474 obtainMessage(LAYOUT_WAIT_UNTIL_DONE).sendToTarget(); 475 } 476 dumpDatabaseCallbacks()477 public void dumpDatabaseCallbacks() { 478 obtainMessage(LAYOUT_DUMP_DATABASE_CALLBACKS).sendToTarget(); 479 } 480 clearAllDatabases()481 public void clearAllDatabases() { 482 WebStorage.getInstance().deleteAllData(); 483 } 484 setDatabaseQuota(long quota)485 public void setDatabaseQuota(long quota) { 486 WebStorage.getInstance().setQuotaForOrigin("file://", quota); 487 } 488 setAppCacheMaximumSize(long size)489 public void setAppCacheMaximumSize(long size) { 490 WebStorage.getInstance().setAppCacheMaximumSize(size); 491 } 492 setCanOpenWindows()493 public void setCanOpenWindows() { 494 obtainMessage(LAYOUT_SET_CAN_OPEN_WINDOWS).sendToTarget(); 495 } 496 setMockGeolocationPosition(double latitude, double longitude, double accuracy)497 public void setMockGeolocationPosition(double latitude, 498 double longitude, 499 double accuracy) { 500 MockGeolocation.getInstance().setPosition(latitude, 501 longitude, 502 accuracy); 503 } 504 setMockGeolocationError(int code, String message)505 public void setMockGeolocationError(int code, String message) { 506 MockGeolocation.getInstance().setError(code, message); 507 } 508 setGeolocationPermission(boolean allow)509 public void setGeolocationPermission(boolean allow) { 510 obtainMessage(SET_GEOLOCATION_PERMISSION, allow ? 1 : 0, 0).sendToTarget(); 511 } 512 setMockDeviceOrientation(boolean canProvideAlpha, double alpha, boolean canProvideBeta, double beta, boolean canProvideGamma, double gamma)513 public void setMockDeviceOrientation(boolean canProvideAlpha, double alpha, 514 boolean canProvideBeta, double beta, boolean canProvideGamma, double gamma) { 515 // Configuration is in WebKit, so stay on WebCore thread, but go via the TestShellActivity 516 // as we need access to the Webview. 517 mLayoutTestController.setMockDeviceOrientation(canProvideAlpha, alpha, canProvideBeta, beta, 518 canProvideGamma, gamma); 519 } 520 overridePreference(String key, boolean value)521 public void overridePreference(String key, boolean value) { 522 Message message = obtainMessage(OVERRIDE_PREFERENCE); 523 message.getData().putString("key", key); 524 message.getData().putBoolean("value", value); 525 message.sendToTarget(); 526 } 527 setXSSAuditorEnabled(boolean flag)528 public void setXSSAuditorEnabled(boolean flag) { 529 obtainMessage(SET_XSS_AUDITOR_ENABLED, flag ? 1 : 0, 0).sendToTarget(); 530 } 531 } 532