appium-espresso-driver 1.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/LICENSE +201 -0
- package/README.md +864 -0
- package/build/index.js +48 -0
- package/build/lib/commands/execute.js +67 -0
- package/build/lib/commands/general.js +337 -0
- package/build/lib/commands/idling-resources.js +31 -0
- package/build/lib/commands/index.js +26 -0
- package/build/lib/commands/services.js +27 -0
- package/build/lib/desired-caps.js +65 -0
- package/build/lib/driver.js +475 -0
- package/build/lib/espresso-runner.js +381 -0
- package/build/lib/logger.js +18 -0
- package/build/lib/server-builder.js +213 -0
- package/build/lib/server.js +39 -0
- package/build/lib/utils.js +85 -0
- package/espresso-server/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk +0 -0
- package/espresso-server/app/build/outputs/apk/androidTest/debug/output-metadata.json +18 -0
- package/espresso-server/app/build.gradle.kts +153 -0
- package/espresso-server/app/proguard-rules.pro +25 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/EspressoServerRunnerTest.kt +93 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/AppDriver.kt +29 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/ComposeDriver.kt +73 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/DriverContext.kt +35 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/EspressoDriver.kt +70 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/AcceptAlert.kt +32 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Back.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Clear.kt +40 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Click.kt +27 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/CreateSession.kt +58 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DeleteSession.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DismissAlert.kt +32 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DrawerActionHandler.kt +45 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementEquals.kt +19 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementScreenshot.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementValue.kt +85 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindActive.kt +32 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindElement.kt +29 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindElements.kt +43 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetAlertText.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetAttribute.kt +101 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetClipboard.kt +65 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetDeviceInfo.kt +44 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetDisplayed.kt +28 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetEnabled.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetLocation.kt +32 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetLocationInView.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetName.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetOrientation.kt +44 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetRect.kt +38 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetRotation.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSelected.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSession.kt +34 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSessions.kt +41 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSettings.kt +25 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSize.kt +32 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetToastVisibility.kt +34 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetWindowRect.kt +43 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetWindowSize.kt +42 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/HideKeyboard.kt +29 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Keys.kt +82 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ListIdlingResources.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileBackdoor.kt +42 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileClickAction.kt +49 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileSwipe.kt +71 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileViewFlash.kt +50 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MoveTo.kt +50 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MultiTouchAction.kt +50 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NavigateTo.kt +42 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NoSessionCommandHandler.kt +4 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NotYetImplemented.kt +28 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/OpenNotifications.kt +28 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformAction.kt +42 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformAutofillDismissal.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformEditorAction.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PointerEventHandler.kt +281 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PressKeyCode.kt +90 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/RegisterIdlingResources.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ReleaseActions.kt +41 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/RequestHandler.kt +43 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ScreenshotHandler.kt +29 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ScrollToPage.kt +60 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetClipboard.kt +64 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetDate.kt +41 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetOrientation.kt +61 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetRotation.kt +46 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetTime.kt +41 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Source.kt +29 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StartActivity.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StartService.kt +40 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Status.kt +26 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StopService.kt +37 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Text.kt +28 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/TouchAction.kt +49 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Uiautomator.kt +68 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UiautomatorPageSource.kt +35 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UnregisterIdlingResources.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UpdateSettings.kt +35 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/WebAtoms.kt +69 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/AppiumException.kt +40 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/DuplicateRouteException.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/ElementNotVisibleException.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidArgumentException.kt +35 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidElementStateException.kt +41 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidSelectorException.kt +35 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/MoveTargetOutOfBoundsException.kt +39 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoAlertOpenException.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoSuchDriverException.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoSuchElementException.kt +34 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NotYetImplementedException.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/ScreenCaptureException.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/SessionNotCreatedException.kt +34 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/StaleElementException.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/XPathLookupException.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AccessibilityServiceState.kt +15 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ActivityHelpers.kt +125 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ActivityOptionsHelpers.kt +60 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AlertHelpers.kt +170 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AndroidLogger.kt +45 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AssertHelpers.kt +17 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AutofillHelpers.kt +44 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/BackdoorUtils.java +49 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ClipboardHelper.kt +51 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ComposeNodeFinder.kt +59 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/DeviceInfoHelper.kt +148 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/EspressoViewsCache.kt +57 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/GsonParserHelpers.kt +72 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/IMEHelpers.kt +88 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/IntentHelpers.kt +336 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/InteractionHelper.kt +40 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/InvocationOperation.java +80 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/LocaleHelpers.kt +46 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/Logger.kt +25 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/NotificationListener.kt +87 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/Rect.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ReflectionUtils.kt +64 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ScreenshotsHelper.kt +59 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/StringHelpers.kt +42 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ThreadHelpers.kt +15 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/UiAutomationWrapper.kt +48 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ViewFinder.kt +316 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/XMLHelpers.kt +56 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/extensions/Semaphore.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/ArrayUtils.java +110 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/ClassUtils.java +180 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/MethodUtils.java +155 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/Validate.java +34 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/BaseW3CActionAdapter.kt +71 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/DummyW3CActionAdapter.kt +133 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/W3CActionAdapter.kt +71 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/AndroidKeyEvent.kt +271 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/AndroidMotionEvent.kt +90 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/EspressoW3CActionAdapter.kt +147 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/Helpers.kt +71 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/MotionEventBuilder.kt +153 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/MultiTouchState.kt +132 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/TouchState.kt +7 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/caps/CapsUtils.kt +96 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/BaseDispatchResult.kt +14 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/DispatchPointerMoveResult.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/KeyDispatch.kt +151 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/PointerDispatch.kt +286 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/W3CKeyEvent.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyCodeMapper.kt +169 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyLocationMapper.kt +50 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyNormalizer.kt +84 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/NormalizedKeys.kt +60 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/ActionObject.kt +138 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/ActionSequence.kt +112 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Actions.kt +89 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/InputSource.kt +173 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Origin.kt +24 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/OriginDeserializer.kt +25 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Tick.kt +62 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/ActionsProcessor.kt +93 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/KeyProcessor.kt +57 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/PauseProcessor.kt +59 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/PointerProcessor.kt +115 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/ProcessorHelpers.kt +35 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/ActiveInputSources.kt +62 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/InputState.kt +6 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/InputStateTable.kt +95 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/KeyInputState.kt +82 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/PointerInputState.kt +45 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/RouteDefinition.kt +67 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/RouteMap.kt +51 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/Router.kt +250 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/Server.kt +109 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/response/AppiumResponse.kt +61 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/response/BaseResponse.kt +25 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/AlertParams.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/AppiumParams.kt +55 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/BackdoorMethodArg.kt +3 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ClipboardDataType.kt +18 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/DrawerActionParams.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/EditorActionParams.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Element.kt +169 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/GetClipboardParams.kt +27 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/GlobalSession.kt +64 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/HamcrestMatcher.kt +144 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/IdlingResourcesParams.kt +66 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/KeyEventParams.kt +23 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/LocaleParams.kt +34 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Location.kt +19 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Locator.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MatcherJson.kt +37 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileBackdoorMethod.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileBackdoorParams.kt +20 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileClickActionParams.kt +81 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileSwipeParams.kt +106 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MotionEventParams.kt +37 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MoveToParams.kt +26 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MultiTouchActionsParams.kt +5 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/NavigateToParams.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/OrientationParams.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/OrientationType.kt +6 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Rect.kt +24 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/RotationParams.kt +38 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ScrollToPageParams.kt +36 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SessionParams.kt +23 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetClipboardParams.kt +29 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetDateParams.kt +23 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetTimeParams.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SettingsParams.kt +19 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Size.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SourceDocument.kt +286 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StartActivityParams.kt +9 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StartServiceParams.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StopServiceParams.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Strategy.kt +49 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TextValueParams.kt +6 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ToastLookupParams.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TouchAction.kt +178 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TouchActionsParams.kt +5 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/UiautomatorParams.kt +123 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewAttributesEnum.kt +51 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewElement.kt +204 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewFlashParams.kt +9 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewText.kt +12 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/WindowRect.kt +24 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/WindowSize.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/AbstractSetting.kt +23 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/DriverSetting.kt +40 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/SettingType.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtom.kt +26 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomDeserializer.kt +99 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomsMethods.kt +4 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomsParams.kt +9 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/OrientationChange.kt +47 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ScrollTo.kt +48 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/UiControllerPerformer.kt +67 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/UiControllerRunnable.kt +25 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ViewGetter.kt +79 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ViewTextGetter.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/RegexpTextMatcher.kt +38 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/WithView.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/WithXPath.kt +55 -0
- package/espresso-server/app/src/main/AndroidManifest.xml +7 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/Helpers.kt +20 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/backdoor-methods.json +51 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/key-actions.json +15 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/multi-touch-actions.json +28 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/GsonParserHelpersTest.kt +41 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/IntentCreationTests.kt +115 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/InvocationOperationTest.java +97 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/KReflectionUtilsTest.kt +108 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/XpathQueryParserTests.kt +42 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ActionSequenceTest.kt +220 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ActionsTest.kt +76 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/CapsUtilsTest.kt +76 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/Helpers.kt +7 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/InputSourceTest.kt +153 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/InputStateTableTest.kt +72 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/KeyDispatchTest.kt +133 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/KeyInputStateTest.kt +74 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/PointerDispatchTest.kt +370 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ProcessorTest.kt +320 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/TickTest.kt +265 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/adapter/AndroidKeyEventTest.kt +114 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/adapter/HelpersTest.kt +31 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/http/RouteDefinitionTest.kt +74 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/HamcrestMatcherTest.kt +112 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MatcherJsonTest.kt +20 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileBackdoorMethodTest.java +110 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileClickTest.kt +46 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileSwipeTest.kt +68 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/TouchActionTest.kt +56 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/web/WebAtomTest.kt +68 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/web/WebAtomsTest.kt +96 -0
- package/espresso-server/build.gradle.kts +33 -0
- package/espresso-server/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/espresso-server/gradle/wrapper/gradle-wrapper.properties +5 -0
- package/espresso-server/gradle.properties +26 -0
- package/espresso-server/gradlew +185 -0
- package/espresso-server/gradlew.bat +89 -0
- package/espresso-server/lint.xml +4 -0
- package/espresso-server/settings.gradle.kts +1 -0
- package/index.js +29 -0
- package/lib/commands/execute.js +72 -0
- package/lib/commands/general.js +321 -0
- package/lib/commands/idling-resources.js +52 -0
- package/lib/commands/index.js +16 -0
- package/lib/commands/services.js +50 -0
- package/lib/desired-caps.js +55 -0
- package/lib/driver.js +566 -0
- package/lib/espresso-runner.js +340 -0
- package/lib/logger.js +6 -0
- package/lib/server-builder.js +194 -0
- package/lib/server.js +18 -0
- package/lib/utils.js +74 -0
- package/package.json +105 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
package io.appium.espressoserver.lib.helpers.w3c.adapter.espresso
|
|
2
|
+
|
|
3
|
+
import android.os.SystemClock
|
|
4
|
+
import android.view.MotionEvent
|
|
5
|
+
import android.view.MotionEvent.PointerProperties
|
|
6
|
+
import androidx.test.espresso.InjectEventSecurityException
|
|
7
|
+
import androidx.test.espresso.UiController
|
|
8
|
+
import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
|
|
9
|
+
import io.appium.espressoserver.lib.handlers.exceptions.MoveTargetOutOfBoundsException
|
|
10
|
+
import io.appium.espressoserver.lib.helpers.AndroidLogger
|
|
11
|
+
import io.appium.espressoserver.lib.helpers.w3c.models.InputSource
|
|
12
|
+
|
|
13
|
+
class MotionEventBuilder {
|
|
14
|
+
private val motionEventParams: MotionEventParams
|
|
15
|
+
fun withX(x: List<Long>?): MotionEventBuilder = apply { motionEventParams.x = x }
|
|
16
|
+
fun withY(y: List<Long>?): MotionEventBuilder = apply { motionEventParams.y = y }
|
|
17
|
+
fun withX(x: Long): MotionEventBuilder = apply { motionEventParams.x = listOf(x) }
|
|
18
|
+
fun withY(y: Long): MotionEventBuilder = apply { motionEventParams.y = listOf(y) }
|
|
19
|
+
fun withDownTime(downTime: Long): MotionEventBuilder = apply { motionEventParams.downTime = downTime }
|
|
20
|
+
fun withEventTime(eventTime: Long): MotionEventBuilder = apply { motionEventParams.eventTime = eventTime }
|
|
21
|
+
fun withAction(action: Int): MotionEventBuilder = apply { motionEventParams.action = action }
|
|
22
|
+
fun withMetaState(metaState: Int): MotionEventBuilder = apply { motionEventParams.metaState = metaState }
|
|
23
|
+
fun withButtonState(buttonState: Int): MotionEventBuilder = apply { motionEventParams.buttonState = buttonState }
|
|
24
|
+
fun withXPrecision(xPrecision: Float): MotionEventBuilder = apply { motionEventParams.xPrecision = xPrecision }
|
|
25
|
+
fun withYPrecision(yPrecision: Float): MotionEventBuilder = apply { motionEventParams.yPrecision = yPrecision }
|
|
26
|
+
fun withDeviceId(deviceId: Int): MotionEventBuilder = apply { motionEventParams.deviceId = deviceId }
|
|
27
|
+
fun withSource(source: Int): MotionEventBuilder = apply { motionEventParams.source = source }
|
|
28
|
+
fun withEdgeFlags(edgeFlags: Int): MotionEventBuilder = apply { motionEventParams.edgeFlags = edgeFlags }
|
|
29
|
+
fun withPointerType(pointerType: InputSource.PointerType?): MotionEventBuilder = apply { motionEventParams.pointerType = pointerType }
|
|
30
|
+
|
|
31
|
+
fun build(): MotionEventRunner {
|
|
32
|
+
return MotionEventRunner(motionEventParams)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
class MotionEventParams {
|
|
36
|
+
var downTime: Long = 0
|
|
37
|
+
var action = 0
|
|
38
|
+
var x: List<Long>? = null
|
|
39
|
+
var y: List<Long>? = null
|
|
40
|
+
var metaState = 0
|
|
41
|
+
var xPrecision = 0f
|
|
42
|
+
var yPrecision = 0f
|
|
43
|
+
var deviceId = 0
|
|
44
|
+
var edgeFlags = 0
|
|
45
|
+
var buttonState = 0
|
|
46
|
+
var source = 0
|
|
47
|
+
var pointerType: InputSource.PointerType? = null
|
|
48
|
+
var eventTime: Long = 0
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
class MotionEventRunner(private val motionEventParams: MotionEventParams) {
|
|
52
|
+
@Throws(AppiumException::class)
|
|
53
|
+
fun run(uiController: UiController): MotionEvent? {
|
|
54
|
+
var pointerCount = if (motionEventParams.x == null) 0 else motionEventParams.x!!.size
|
|
55
|
+
|
|
56
|
+
// Don't do anything if no pointers were provided
|
|
57
|
+
if (pointerCount == 0 && motionEventParams.action != MotionEvent.ACTION_CANCEL) {
|
|
58
|
+
return null
|
|
59
|
+
}
|
|
60
|
+
val pointerCoords = arrayOfNulls<MotionEvent.PointerCoords>(pointerCount)
|
|
61
|
+
val pointerProperties = arrayOfNulls<PointerProperties>(pointerCount)
|
|
62
|
+
for (pointerIndex in 0 until pointerCount) {
|
|
63
|
+
// Set pointer coordinates
|
|
64
|
+
pointerCoords[pointerIndex] = MotionEvent.PointerCoords()
|
|
65
|
+
pointerCoords[pointerIndex]!!.let {
|
|
66
|
+
it.clear()
|
|
67
|
+
it.pressure = 1f
|
|
68
|
+
it.size = 1f
|
|
69
|
+
it.x = motionEventParams.x!![pointerIndex].toFloat()
|
|
70
|
+
it.y = motionEventParams.y!![pointerIndex].toFloat()
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Set pointer properties
|
|
74
|
+
pointerProperties[pointerIndex] = PointerProperties()
|
|
75
|
+
pointerProperties[pointerIndex]!!.let {
|
|
76
|
+
it.toolType = getToolType(motionEventParams.pointerType)
|
|
77
|
+
it.id = pointerIndex
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ACTION_POINTER_DOWN and ACTION_POINTER_UP need a bit mask
|
|
82
|
+
var action = motionEventParams.action
|
|
83
|
+
if (pointerCount > 1 && (action == MotionEvent.ACTION_POINTER_DOWN || action == MotionEvent.ACTION_POINTER_UP)) {
|
|
84
|
+
action += pointerProperties[1]!!.id shl MotionEvent.ACTION_POINTER_INDEX_SHIFT
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// ACTION_DOWN and ACTION_UP and ACTION_CANCEL has a pointer count of 1
|
|
88
|
+
if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
|
|
89
|
+
pointerCount = if (motionEventParams.x != null && motionEventParams.y != null) {
|
|
90
|
+
1
|
|
91
|
+
} else {
|
|
92
|
+
0
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
val eventTime = if (motionEventParams.eventTime > 0) motionEventParams.eventTime else SystemClock.uptimeMillis()
|
|
96
|
+
AndroidLogger.info(String.format(
|
|
97
|
+
"Running Android MotionEvent.obtain with parameters: " +
|
|
98
|
+
"downTime=[%s], eventTime=[%s], action=[%s], pointerCount=[%s], " + "" +
|
|
99
|
+
"pointerProperties=[%s], pointerCoords=[%s], metaState=[%s], buttonState=[%s], " +
|
|
100
|
+
"xPrecision=[%s], yPrecision=[%s], deviceId=[%s], edgeFlags=[%s], source=[%s], " +
|
|
101
|
+
"flags=[%s]",
|
|
102
|
+
"For more information, see https://developer.android.com/reference/android/view/MotionEvent#obtain(long,%20long,%20int,%20int,%20android.view.MotionEvent.PointerProperties[],%20android.view.MotionEvent.PointerCoords[],%20int,%20int,%20float,%20float,%20int,%20int,%20int,%20int)",
|
|
103
|
+
motionEventParams.downTime,
|
|
104
|
+
eventTime,
|
|
105
|
+
action,
|
|
106
|
+
pointerCount,
|
|
107
|
+
pointerProperties.contentToString(),
|
|
108
|
+
pointerCoords.contentToString(),
|
|
109
|
+
motionEventParams.metaState,
|
|
110
|
+
motionEventParams.buttonState,
|
|
111
|
+
motionEventParams.xPrecision,
|
|
112
|
+
motionEventParams.yPrecision,
|
|
113
|
+
motionEventParams.deviceId,
|
|
114
|
+
motionEventParams.edgeFlags,
|
|
115
|
+
motionEventParams.source,
|
|
116
|
+
0
|
|
117
|
+
))
|
|
118
|
+
val evt = MotionEvent.obtain(
|
|
119
|
+
motionEventParams.downTime,
|
|
120
|
+
eventTime,
|
|
121
|
+
action,
|
|
122
|
+
pointerCount,
|
|
123
|
+
pointerProperties,
|
|
124
|
+
pointerCoords,
|
|
125
|
+
motionEventParams.metaState,
|
|
126
|
+
motionEventParams.buttonState,
|
|
127
|
+
motionEventParams.xPrecision,
|
|
128
|
+
motionEventParams.yPrecision,
|
|
129
|
+
motionEventParams.deviceId,
|
|
130
|
+
motionEventParams.edgeFlags,
|
|
131
|
+
motionEventParams.source,
|
|
132
|
+
0 // MotionEvent flags. Don't think we need to set these.
|
|
133
|
+
)
|
|
134
|
+
try {
|
|
135
|
+
val success = uiController.injectMotionEvent(evt)
|
|
136
|
+
if (!success) {
|
|
137
|
+
throw AppiumException("Could not complete pointer operation")
|
|
138
|
+
}
|
|
139
|
+
} catch (e: InjectEventSecurityException) {
|
|
140
|
+
throw MoveTargetOutOfBoundsException(String.format(
|
|
141
|
+
"Could not complete pointer operation. Pointer operation is within the viewport but is not within bounds of the app-under-test. Cause: %s",
|
|
142
|
+
e.cause
|
|
143
|
+
))
|
|
144
|
+
}
|
|
145
|
+
return evt
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
init {
|
|
151
|
+
motionEventParams = MotionEventParams()
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
package io.appium.espressoserver.lib.helpers.w3c.adapter.espresso
|
|
2
|
+
|
|
3
|
+
import android.os.SystemClock
|
|
4
|
+
import android.view.MotionEvent
|
|
5
|
+
import androidx.test.espresso.UiController
|
|
6
|
+
import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
|
|
7
|
+
import io.appium.espressoserver.lib.helpers.w3c.adapter.espresso.AndroidMotionEvent.Companion.getTouchMotionEvent
|
|
8
|
+
import io.appium.espressoserver.lib.helpers.w3c.models.InputSource
|
|
9
|
+
import io.appium.espressoserver.lib.helpers.w3c.state.KeyInputState
|
|
10
|
+
import java.util.*
|
|
11
|
+
|
|
12
|
+
class MultiTouchState {
|
|
13
|
+
private val touchStateSet: MutableMap<String, TouchState> = LinkedHashMap()
|
|
14
|
+
private var globalKeyInputState: KeyInputState? = null
|
|
15
|
+
private var button = 0
|
|
16
|
+
private var downEvent: MotionEvent? = null
|
|
17
|
+
private var touchPhase: TouchPhase? = null
|
|
18
|
+
fun updateTouchState(actionType: Int,
|
|
19
|
+
sourceId: String,
|
|
20
|
+
x: Long?, y: Long?,
|
|
21
|
+
globalKeyInputState: KeyInputState?,
|
|
22
|
+
button: Int?) {
|
|
23
|
+
|
|
24
|
+
// Lazily get the touch state of the input with given sourceId
|
|
25
|
+
if (!touchStateSet.containsKey(sourceId)) {
|
|
26
|
+
val touchState = TouchState()
|
|
27
|
+
touchStateSet[sourceId] = touchState
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Update x and y coordinates
|
|
31
|
+
val touchState = touchStateSet[sourceId]!!
|
|
32
|
+
touchState.x = x!!
|
|
33
|
+
touchState.y = y!!
|
|
34
|
+
|
|
35
|
+
// Update to global key input state
|
|
36
|
+
this.globalKeyInputState = globalKeyInputState
|
|
37
|
+
if (button != null) {
|
|
38
|
+
this.button = button
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Record if we're in the TOUCH_DOWN or TOUCH_UP phase
|
|
42
|
+
if (actionType == MotionEvent.ACTION_DOWN) {
|
|
43
|
+
touchPhase = TouchPhase.DOWN
|
|
44
|
+
} else if (actionType == MotionEvent.ACTION_UP) {
|
|
45
|
+
touchPhase = TouchPhase.UP
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Get the x coordinates for all inputs in the same order they were entered
|
|
51
|
+
* @return X coordinates as a list
|
|
52
|
+
*/
|
|
53
|
+
private val xCoords: List<Long>
|
|
54
|
+
get() { return touchStateSet.values.map { it.x } }
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Get the y coordinates for all inputs in the same order they were entered
|
|
58
|
+
* @return Y coordinates as a list
|
|
59
|
+
*/
|
|
60
|
+
private val yCoords: List<Long>
|
|
61
|
+
get() { return touchStateSet.values.map { it.y } }
|
|
62
|
+
|
|
63
|
+
@Throws(AppiumException::class)
|
|
64
|
+
fun pointerDown(uiController: UiController) {
|
|
65
|
+
val androidMotionEvent = getTouchMotionEvent(uiController)
|
|
66
|
+
val eventTime = SystemClock.uptimeMillis()
|
|
67
|
+
val xCoords = xCoords
|
|
68
|
+
val yCoords = yCoords
|
|
69
|
+
downEvent = androidMotionEvent.pointerEvent(
|
|
70
|
+
xCoords, yCoords,
|
|
71
|
+
MotionEvent.ACTION_DOWN, button, InputSource.PointerType.TOUCH, globalKeyInputState!!, null, eventTime)
|
|
72
|
+
if (xCoords.size > 1) {
|
|
73
|
+
androidMotionEvent.pointerEvent(xCoords, yCoords,
|
|
74
|
+
MotionEvent.ACTION_POINTER_DOWN, button, InputSource.PointerType.TOUCH, globalKeyInputState!!, downEvent, eventTime)
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@Throws(AppiumException::class)
|
|
79
|
+
fun pointerUp(uiController: UiController) {
|
|
80
|
+
val androidMotionEvent = getTouchMotionEvent(uiController)
|
|
81
|
+
val eventTime = SystemClock.uptimeMillis()
|
|
82
|
+
val xCoords = xCoords
|
|
83
|
+
val yCoords = yCoords
|
|
84
|
+
if (xCoords.size > 1) {
|
|
85
|
+
androidMotionEvent.pointerEvent(
|
|
86
|
+
xCoords, yCoords,
|
|
87
|
+
MotionEvent.ACTION_POINTER_UP, button, InputSource.PointerType.TOUCH, globalKeyInputState!!, downEvent, eventTime)
|
|
88
|
+
}
|
|
89
|
+
androidMotionEvent.pointerEvent(
|
|
90
|
+
xCoords, yCoords,
|
|
91
|
+
MotionEvent.ACTION_UP, button, InputSource.PointerType.TOUCH, globalKeyInputState!!, downEvent, eventTime)
|
|
92
|
+
downEvent = null
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@Throws(AppiumException::class)
|
|
96
|
+
fun pointerCancel(uiController: UiController) {
|
|
97
|
+
val xCoords = xCoords
|
|
98
|
+
val yCoords = yCoords
|
|
99
|
+
getTouchMotionEvent(uiController).pointerEvent(
|
|
100
|
+
xCoords, yCoords,
|
|
101
|
+
MotionEvent.ACTION_CANCEL, button, InputSource.PointerType.TOUCH, globalKeyInputState!!, downEvent, SystemClock.uptimeMillis()
|
|
102
|
+
)
|
|
103
|
+
downEvent = null
|
|
104
|
+
touchPhase = TouchPhase.NONE
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
@Throws(AppiumException::class)
|
|
108
|
+
fun pointerMove(uiController: UiController) {
|
|
109
|
+
if (isDown) {
|
|
110
|
+
val androidMotionEvent = getTouchMotionEvent(uiController)
|
|
111
|
+
androidMotionEvent.pointerMove(
|
|
112
|
+
xCoords, yCoords, InputSource.PointerType.TOUCH, globalKeyInputState!!, downEvent)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
val isDown: Boolean
|
|
117
|
+
get() = downEvent != null
|
|
118
|
+
|
|
119
|
+
@Throws(AppiumException::class)
|
|
120
|
+
fun perform(uiController: UiController) {
|
|
121
|
+
if (touchPhase == TouchPhase.DOWN) {
|
|
122
|
+
pointerDown(uiController)
|
|
123
|
+
} else if (touchPhase == TouchPhase.UP) {
|
|
124
|
+
pointerUp(uiController)
|
|
125
|
+
}
|
|
126
|
+
touchPhase = TouchPhase.NONE
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
enum class TouchPhase {
|
|
130
|
+
DOWN, UP, NONE
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
* you may not use this file except in compliance with the License.
|
|
4
|
+
* See the NOTICE file distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
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 io.appium.espressoserver.lib.helpers.w3c.caps
|
|
18
|
+
|
|
19
|
+
import io.appium.espressoserver.lib.helpers.AndroidLogger
|
|
20
|
+
import io.appium.espressoserver.lib.handlers.exceptions.InvalidArgumentException
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
val STANDARD_CAPS = listOf(
|
|
24
|
+
"browserName",
|
|
25
|
+
"browserVersion",
|
|
26
|
+
"platformName",
|
|
27
|
+
"acceptInsecureCerts",
|
|
28
|
+
"pageLoadStrategy",
|
|
29
|
+
"proxy",
|
|
30
|
+
"setWindowRect",
|
|
31
|
+
"timeouts",
|
|
32
|
+
"unhandledPromptBehavior"
|
|
33
|
+
)
|
|
34
|
+
const val APPIUM_PREFIX = "appium"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
fun isStandardCap(capName: String): Boolean = STANDARD_CAPS.any { it.toLowerCase() == capName.toLowerCase() }
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
fun mergeCaps(primary: Map<String, Any?>, secondary: Map<String, Any?>): Map<String, Any?> {
|
|
41
|
+
val result = primary.toMutableMap()
|
|
42
|
+
secondary.mapValues {
|
|
43
|
+
if (result[it.key] != null) {
|
|
44
|
+
throw InvalidArgumentException(
|
|
45
|
+
"Property '${it.key}' should not exist on both primary ($primary) and secondary ($secondary) objects")
|
|
46
|
+
}
|
|
47
|
+
result[it.key] = it.value
|
|
48
|
+
}
|
|
49
|
+
return result
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
fun stripPrefixes(caps: Map<String, Any?>): Map<String, Any?> {
|
|
54
|
+
val prefix = "$APPIUM_PREFIX:"
|
|
55
|
+
val badPrefixedCaps = caps.keys
|
|
56
|
+
.filter { it.startsWith(prefix) }
|
|
57
|
+
.fold(mutableListOf<String>(), { acc, capName ->
|
|
58
|
+
val strippedName = capName.substring(prefix.length)
|
|
59
|
+
if (isStandardCap(strippedName)) {
|
|
60
|
+
acc.add(strippedName)
|
|
61
|
+
}
|
|
62
|
+
acc
|
|
63
|
+
})
|
|
64
|
+
if (badPrefixedCaps.isNotEmpty()) {
|
|
65
|
+
throw InvalidArgumentException(
|
|
66
|
+
"The capabilities $badPrefixedCaps are standard capabilities and should not have the '$prefix' prefix")
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return caps.map {
|
|
70
|
+
if (it.key.startsWith(prefix) && it.key.length > prefix.length)
|
|
71
|
+
it.key.substring(prefix.length) to it.value
|
|
72
|
+
else
|
|
73
|
+
it.key to it.value
|
|
74
|
+
}.toMap()
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
fun parseCapabilities(firstMatchValue: List<Map<String, Any?>>?,
|
|
79
|
+
alwaysMatchValue: Map<String, Any?>?): Map<String, Any?> {
|
|
80
|
+
val alwaysMatch = alwaysMatchValue ?: mapOf()
|
|
81
|
+
val firstMatch = firstMatchValue ?: listOf()
|
|
82
|
+
|
|
83
|
+
val allFirstMatchCaps = if (firstMatch.isNotEmpty()) firstMatch else listOf<Map<*, *>>(mapOf<String, Any?>())
|
|
84
|
+
val requiredCaps = stripPrefixes(alwaysMatch)
|
|
85
|
+
@Suppress("UNCHECKED_CAST")
|
|
86
|
+
(allFirstMatchCaps as List<Map<String, Any?>>)
|
|
87
|
+
.map { stripPrefixes(it) }
|
|
88
|
+
.forEach {
|
|
89
|
+
try {
|
|
90
|
+
return mergeCaps(requiredCaps, it)
|
|
91
|
+
} catch (e: Exception) {
|
|
92
|
+
AndroidLogger.warn(e)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
throw InvalidArgumentException("Could not find matching capabilities from {$firstMatch, $alwaysMatch}")
|
|
96
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
package io.appium.espressoserver.lib.helpers.w3c.dispatcher
|
|
2
|
+
|
|
3
|
+
import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
|
|
4
|
+
import java.util.concurrent.Callable
|
|
5
|
+
|
|
6
|
+
abstract class BaseDispatchResult {
|
|
7
|
+
var next: Callable<BaseDispatchResult>? = null
|
|
8
|
+
operator fun hasNext(): Boolean {
|
|
9
|
+
return next != null
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
@Throws(AppiumException::class)
|
|
13
|
+
abstract fun perform()
|
|
14
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
package io.appium.espressoserver.lib.helpers.w3c.dispatcher
|
|
2
|
+
|
|
3
|
+
import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
|
|
4
|
+
import io.appium.espressoserver.lib.helpers.w3c.adapter.W3CActionAdapter
|
|
5
|
+
import io.appium.espressoserver.lib.helpers.w3c.models.InputSource
|
|
6
|
+
import io.appium.espressoserver.lib.helpers.w3c.state.KeyInputState
|
|
7
|
+
|
|
8
|
+
class DispatchPointerMoveResult(private val dispatcherAdapter: W3CActionAdapter,
|
|
9
|
+
private val sourceId: String,
|
|
10
|
+
private val pointerType: InputSource.PointerType,
|
|
11
|
+
private val currentX: Float, private val currentY: Float,
|
|
12
|
+
private val x: Float, private val y: Float,
|
|
13
|
+
private val buttons: Set<Int>,
|
|
14
|
+
private val globalKeyInputState: KeyInputState?) : BaseDispatchResult() {
|
|
15
|
+
@Throws(AppiumException::class)
|
|
16
|
+
override fun perform() {
|
|
17
|
+
if (currentX != x || currentY != y) {
|
|
18
|
+
dispatcherAdapter.pointerMove(sourceId, pointerType, currentX, currentY, x, y, buttons, globalKeyInputState)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
package io.appium.espressoserver.lib.helpers.w3c.dispatcher
|
|
2
|
+
|
|
3
|
+
import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
|
|
4
|
+
import io.appium.espressoserver.lib.helpers.w3c.adapter.W3CActionAdapter
|
|
5
|
+
import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.KeyNormalizer
|
|
6
|
+
import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys
|
|
7
|
+
import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.getCode
|
|
8
|
+
import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.getLocation
|
|
9
|
+
import io.appium.espressoserver.lib.helpers.w3c.models.ActionObject
|
|
10
|
+
import io.appium.espressoserver.lib.helpers.w3c.models.InputSource
|
|
11
|
+
import io.appium.espressoserver.lib.helpers.w3c.state.InputStateTable
|
|
12
|
+
import io.appium.espressoserver.lib.helpers.w3c.state.KeyInputState
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Implement key dispatch events (https://www.w3.org/TR/webdriver/#keyboard-actions)
|
|
16
|
+
*/
|
|
17
|
+
@Throws(AppiumException::class)
|
|
18
|
+
private fun dispatchKeyEvent(dispatcherAdapter: W3CActionAdapter,
|
|
19
|
+
actionObject: ActionObject,
|
|
20
|
+
inputState: KeyInputState,
|
|
21
|
+
inputStateTable: InputStateTable,
|
|
22
|
+
@Suppress("UNUSED_PARAMETER") tickDuration: Float,
|
|
23
|
+
down: Boolean): W3CKeyEvent {
|
|
24
|
+
// Get the base Key Event
|
|
25
|
+
val keyEvent = getKeyEvent(dispatcherAdapter, actionObject.value!!)
|
|
26
|
+
val key = keyEvent.key!!
|
|
27
|
+
|
|
28
|
+
// 3. If the input state's pressed property contains key, let repeat be true, otherwise let repeat be false.
|
|
29
|
+
if (inputState.isPressed(key)) {
|
|
30
|
+
keyEvent.isRepeat = true
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// 6. Let charCode, keyCode and which be the implementation-specific values of the charCode,
|
|
34
|
+
// keyCode and which properties.
|
|
35
|
+
// Omiting this for now until there's an implementation that needs it.
|
|
36
|
+
|
|
37
|
+
// 7-10: Set the alt, shift, ctrl meta key state
|
|
38
|
+
dispatcherAdapter.logger.info(String.format(
|
|
39
|
+
"Dispatching '%s' event on input source with id %s with properties '%s'",
|
|
40
|
+
if (down) "keyDown" else "keyUp", actionObject.id, keyEvent.logMessage()
|
|
41
|
+
))
|
|
42
|
+
if (down) {
|
|
43
|
+
inputState.isAlt = inputState.isAlt || key == NormalizedKeys.ALT
|
|
44
|
+
inputState.isShift = inputState.isShift || key == NormalizedKeys.SHIFT
|
|
45
|
+
inputState.isCtrl = inputState.isCtrl || key == NormalizedKeys.CONTROL
|
|
46
|
+
inputState.isMeta = inputState.isMeta || key == NormalizedKeys.META
|
|
47
|
+
} else {
|
|
48
|
+
inputState.isAlt = inputState.isAlt && key != NormalizedKeys.ALT
|
|
49
|
+
inputState.isShift = inputState.isShift && key != NormalizedKeys.SHIFT
|
|
50
|
+
inputState.isCtrl = inputState.isCtrl && key != NormalizedKeys.CONTROL
|
|
51
|
+
inputState.isMeta = inputState.isMeta && key != NormalizedKeys.META
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Set the alt, shift, ctrl and meta states on the Key Event
|
|
55
|
+
keyEvent.isAltKey = inputState.isAlt
|
|
56
|
+
keyEvent.isCtrlKey = inputState.isCtrl
|
|
57
|
+
keyEvent.isShiftKey = inputState.isShift
|
|
58
|
+
keyEvent.isMetaKey = inputState.isMeta
|
|
59
|
+
|
|
60
|
+
// 11: Add key to the set corresponding to input state's pressed property
|
|
61
|
+
if (down) {
|
|
62
|
+
inputState.addPressed(key)
|
|
63
|
+
} else {
|
|
64
|
+
inputState.removePressed(key)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Must lock the dispatcherAdapter in-case other threads are also using it
|
|
68
|
+
dispatcherAdapter.lockAdapter()
|
|
69
|
+
try {
|
|
70
|
+
if (down) {
|
|
71
|
+
|
|
72
|
+
// 12: Append action object with subtype property changed to 'keyUp' to cancel list
|
|
73
|
+
val cancelActionObject = ActionObject(actionObject)
|
|
74
|
+
cancelActionObject.subType = InputSource.ActionType.KEY_UP
|
|
75
|
+
inputStateTable.addActionToCancel(cancelActionObject)
|
|
76
|
+
|
|
77
|
+
// 13: Call implementation specific key-down event
|
|
78
|
+
dispatcherAdapter.keyDown(keyEvent)
|
|
79
|
+
} else {
|
|
80
|
+
// 13: Call implementation specific key-up event
|
|
81
|
+
dispatcherAdapter.keyUp(keyEvent)
|
|
82
|
+
}
|
|
83
|
+
} finally {
|
|
84
|
+
dispatcherAdapter.unlockAdapter()
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Log the updated keyboard state
|
|
88
|
+
dispatcherAdapter.logger.info(String.format(
|
|
89
|
+
"Current state of key input source with id: %s",
|
|
90
|
+
inputState.logMessage()
|
|
91
|
+
))
|
|
92
|
+
return keyEvent
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Dispatch a key down event (in accordance with https://www.w3.org/TR/webdriver/#keyboard-actions)
|
|
97
|
+
*
|
|
98
|
+
* @param dispatcherAdapter Adapter that has implementation specific keyDown event
|
|
99
|
+
* @param actionObject W3C Action Object
|
|
100
|
+
* @param inputState State of the input source
|
|
101
|
+
* @param inputStateTable All of the input states for this session
|
|
102
|
+
* @param tickDuration How long the 'tick' is. This is unused currently but may be used in the future
|
|
103
|
+
* @return W3CKeyEvent (for testing purposes). 'null' if the dispatch failed.
|
|
104
|
+
*/
|
|
105
|
+
@Throws(AppiumException::class)
|
|
106
|
+
fun dispatchKeyDown(dispatcherAdapter: W3CActionAdapter,
|
|
107
|
+
actionObject: ActionObject, inputState: KeyInputState,
|
|
108
|
+
inputStateTable: InputStateTable, tickDuration: Float = 0f): W3CKeyEvent? =
|
|
109
|
+
dispatchKeyEvent(dispatcherAdapter, actionObject, inputState, inputStateTable, tickDuration, true)
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Dispatch a key up event (in accordance with https://www.w3.org/TR/webdriver/#keyboard-actions)
|
|
113
|
+
*
|
|
114
|
+
* @param dispatcherAdapter Adapter that has implementation specific keyDown event
|
|
115
|
+
* @param actionObject W3C Action Object
|
|
116
|
+
* @param inputState State of the input source
|
|
117
|
+
* @param inputStateTable All of the input states for this session
|
|
118
|
+
* @param tickDuration How long the 'tick' is. This is unused currently but may be used in the future
|
|
119
|
+
* @return W3CKeyEvent (for testing purposes). 'null' if the dispatch failed.
|
|
120
|
+
*/
|
|
121
|
+
@Throws(AppiumException::class)
|
|
122
|
+
fun dispatchKeyUp(dispatcherAdapter: W3CActionAdapter,
|
|
123
|
+
actionObject: ActionObject, inputState: KeyInputState,
|
|
124
|
+
inputStateTable: InputStateTable, tickDuration: Float = 0f): W3CKeyEvent? =
|
|
125
|
+
dispatchKeyEvent(dispatcherAdapter, actionObject, inputState, inputStateTable, tickDuration, false)
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Helper method to get a Key Event that has common attributes between KeyUp and KeyDispatch
|
|
129
|
+
* @param rawKey The value of the key stroke
|
|
130
|
+
* @return W3CKeyEvent Key event info used by adapter
|
|
131
|
+
*/
|
|
132
|
+
@Throws(AppiumException::class)
|
|
133
|
+
fun getKeyEvent(dispatcherAdapter: W3CActionAdapter, rawKey: String): W3CKeyEvent = W3CKeyEvent().apply {
|
|
134
|
+
// 1. Let raw key be action's value property
|
|
135
|
+
|
|
136
|
+
// 2. Let key be equal to the normalised key value for raw key
|
|
137
|
+
this.key = KeyNormalizer.toNormalizedKey(rawKey)
|
|
138
|
+
|
|
139
|
+
// 4. Let code be 'code' for raw keypress
|
|
140
|
+
this.code = getCode(rawKey)
|
|
141
|
+
|
|
142
|
+
// 5. Let location be the key location for raw key
|
|
143
|
+
this.location = getLocation(rawKey)
|
|
144
|
+
|
|
145
|
+
// 6. Let charCode, keyCode and which be the implementation-specific values of the charCode,
|
|
146
|
+
// keyCode and which properties appropriate for a key with key key and location location on
|
|
147
|
+
// a 102 key US keyboard
|
|
148
|
+
this.keyCode = dispatcherAdapter.getKeyCode(this.key, this.location)
|
|
149
|
+
this.charCode = dispatcherAdapter.getCharCode(this.code, this.location)
|
|
150
|
+
this.which = dispatcherAdapter.getWhich(this.key, this.location)
|
|
151
|
+
}
|