appium-android-driver 5.4.3 → 5.5.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.
Files changed (68) hide show
  1. package/build/index.js +1 -9
  2. package/build/lib/android-helpers.js +10 -194
  3. package/build/lib/android-helpers.js.map +1 -1
  4. package/build/lib/bootstrap.js +4 -45
  5. package/build/lib/bootstrap.js.map +1 -1
  6. package/build/lib/commands/actions.js +3 -78
  7. package/build/lib/commands/actions.js.map +1 -1
  8. package/build/lib/commands/alert.js +3 -10
  9. package/build/lib/commands/alert.js.map +1 -1
  10. package/build/lib/commands/app-management.js +4 -32
  11. package/build/lib/commands/app-management.js.map +1 -1
  12. package/build/lib/commands/context.js +6 -78
  13. package/build/lib/commands/context.js.map +1 -1
  14. package/build/lib/commands/coverage.js +1 -6
  15. package/build/lib/commands/coverage.js.map +1 -1
  16. package/build/lib/commands/element.js +4 -47
  17. package/build/lib/commands/element.js.map +1 -1
  18. package/build/lib/commands/emu-console.js +2 -7
  19. package/build/lib/commands/emu-console.js.map +1 -1
  20. package/build/lib/commands/execute.js +1 -13
  21. package/build/lib/commands/execute.js.map +1 -1
  22. package/build/lib/commands/file-actions.js +3 -44
  23. package/build/lib/commands/file-actions.js.map +1 -1
  24. package/build/lib/commands/find.js +3 -16
  25. package/build/lib/commands/find.js.map +1 -1
  26. package/build/lib/commands/general.js +32 -91
  27. package/build/lib/commands/general.js.map +1 -1
  28. package/build/lib/commands/ime.js +3 -14
  29. package/build/lib/commands/ime.js.map +1 -1
  30. package/build/lib/commands/index.js +3 -27
  31. package/build/lib/commands/index.js.map +1 -1
  32. package/build/lib/commands/intent.js +1 -40
  33. package/build/lib/commands/intent.js.map +1 -1
  34. package/build/lib/commands/log.js +3 -35
  35. package/build/lib/commands/log.js.map +1 -1
  36. package/build/lib/commands/media-projection.js +2 -47
  37. package/build/lib/commands/media-projection.js.map +1 -1
  38. package/build/lib/commands/network.js +4 -40
  39. package/build/lib/commands/network.js.map +1 -1
  40. package/build/lib/commands/performance.js +5 -57
  41. package/build/lib/commands/performance.js.map +1 -1
  42. package/build/lib/commands/recordscreen.js +1 -59
  43. package/build/lib/commands/recordscreen.js.map +1 -1
  44. package/build/lib/commands/shell.js +1 -15
  45. package/build/lib/commands/shell.js.map +1 -1
  46. package/build/lib/commands/streamscreen.js +7 -74
  47. package/build/lib/commands/streamscreen.js.map +1 -1
  48. package/build/lib/commands/system-bars.js +1 -23
  49. package/build/lib/commands/system-bars.js.map +1 -1
  50. package/build/lib/commands/touch.js +13 -79
  51. package/build/lib/commands/touch.js.map +1 -1
  52. package/build/lib/desired-caps.js +3 -4
  53. package/build/lib/desired-caps.js.map +1 -1
  54. package/build/lib/driver.js +8 -97
  55. package/build/lib/driver.js.map +1 -1
  56. package/build/lib/logger.js +1 -5
  57. package/build/lib/logger.js.map +1 -1
  58. package/build/lib/uiautomator.js +3 -24
  59. package/build/lib/uiautomator.js.map +1 -1
  60. package/build/lib/unlock-helpers.js +1 -61
  61. package/build/lib/unlock-helpers.js.map +1 -1
  62. package/build/lib/utils.js +1 -7
  63. package/build/lib/utils.js.map +1 -1
  64. package/build/lib/webview-helpers.js +1 -94
  65. package/build/lib/webview-helpers.js.map +1 -1
  66. package/lib/android-helpers.js +2 -1
  67. package/lib/commands/general.js +34 -15
  68. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":["CHROMEDRIVER_AUTODOWNLOAD_FEATURE","commands","helpers","extensions","getCurrentContext","curContext","defaultContextName","getContexts","webviewsMapping","webviewHelpers","getWebViewsMapping","adb","opts","assignContexts","setContext","name","util","hasValue","WEBVIEW_WIN","defaultWebviewName","contexts","_","includes","errors","NoSuchContextError","switchContext","mobileGetContexts","androidDeviceSocket","ensureWebviewsHavePages","webviewDevtoolsPort","enableWebviewDetailsCollection","Object","assign","isChromeSession","webviews","parseWebviewNames","NATIVE_WIN","log","debug","JSON","stringify","isChromedriverContext","startChromedriverProxy","recreateChromeDriverSessions","stopChromedriverProxies","suspendChromedriverProxy","Error","WEBVIEW_BASE","appPackage","isWebContext","context","cd","sessionChromedrivers","setupExistingChromedriver","cloneDeep","chromeUseRunningApp","extractChromeAndroidPackageFromContextName","androidPackage","match","length","chromeAndroidPackage","has","map","wm","webviewName","knownPackage","KNOWN_CHROME_PACKAGE_NAMES","appState","queryAppState","APP_STATE","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","info","setupNewChromedriver","curDeviceId","on","Chromedriver","EVENT_CHANGED","msg","state","STATE_STOPPED","onChromedriverStop","chromedriver","proxyReqRes","proxyReq","bind","proxyCommand","jwproxy","command","jwpProxyActive","warn","err","startUnexpectedShutdown","keys","removeAllListeners","stop","message","viewName","CHROMIUM_WIN","shouldDismissChromeWelcome","chromeOptions","isArray","args","dismissChromeWelcome","activity","getCurrentActivity","el","findElOrEls","click","ELEMENT","e","startChromeSession","knownPackages","chromeBundleId","chromeAndroidActivity","appActivity","hasWorkingWebview","restart","getChromedriverPort","portSpec","getPort","B","promisify","PortFinder","port","foundPort","potentialPort","stopPort","parseInt","isChromedriverAutodownloadEnabled","isFeatureEnabled","chromeDriverPort","chromedriverPort","chromedriverPorts","details","getWebviewDetails","undefined","isEmpty","executable","chromedriverExecutable","cmdArgs","chromedriverArgs","verbose","showChromedriverLog","executableDir","chromedriverExecutableDir","mappingPath","chromedriverChromeMappingFile","bundleId","useSystemExecutable","chromedriverUseSystemExecutable","disableBuildCheck","chromedriverDisableBuildCheck","isAutodownloadEnabled","opt","endsWith","merge","caps","createChromedriverCaps","start"],"sources":["../../../lib/commands/context.js"],"sourcesContent":["import _ from 'lodash';\nimport Chromedriver from 'appium-chromedriver';\nimport PortFinder from 'portfinder';\nimport B from 'bluebird';\nimport { util } from 'appium/support';\nimport { errors } from 'appium/driver';\nimport {\n default as webviewHelpers,\n NATIVE_WIN, WEBVIEW_BASE, WEBVIEW_WIN, CHROMIUM_WIN, KNOWN_CHROME_PACKAGE_NAMES\n} from '../webview-helpers';\nimport { APP_STATE } from '../android-helpers';\n\nconst CHROMEDRIVER_AUTODOWNLOAD_FEATURE = 'chromedriver_autodownload';\n\nlet commands = {}, helpers = {}, extensions = {};\n\n\n/* -------------------------------\n * Actual MJSONWP command handlers\n * ------------------------------- */\ncommands.getCurrentContext = async function getCurrentContext () { // eslint-disable-line require-await\n // if the current context is `null`, indicating no context\n // explicitly set, it is the default context\n return this.curContext || this.defaultContextName();\n};\n\ncommands.getContexts = async function getContexts () {\n const webviewsMapping = await webviewHelpers.getWebViewsMapping(this.adb, this.opts);\n return this.assignContexts(webviewsMapping);\n};\n\ncommands.setContext = async function setContext (name) {\n if (!util.hasValue(name)) {\n name = this.defaultContextName();\n } else if (name === WEBVIEW_WIN) {\n // handle setContext \"WEBVIEW\"\n name = this.defaultWebviewName();\n }\n // if we're already in the context we want, do nothing\n if (name === this.curContext) {\n return;\n }\n\n const webviewsMapping = await webviewHelpers.getWebViewsMapping(this.adb, this.opts);\n const contexts = this.assignContexts(webviewsMapping);\n // if the context we want doesn't exist, fail\n if (!_.includes(contexts, name)) {\n throw new errors.NoSuchContextError();\n }\n\n await this.switchContext(name, webviewsMapping);\n this.curContext = name;\n};\n\n/**\n * @typedef {Object} WebviewsMapping\n * @property {string} proc The name of the Devtools Unix socket\n * @property {string} webview The web view alias. Looks like `WEBVIEW_`\n * prefix plus PID or package name\n * @property {?Object} info Webview information as it is retrieved by\n * /json/version CDP endpoint\n * @property {?Array<Object>} pages Webview pages list as it is retrieved by\n * /json/list CDP endpoint\n * @propery {?string} webviewName An actual webview name for switching context.\n * This value becomes null when failing to find a PID for a webview.\n *\n * The following json demonstrates the example of WebviewsMapping object.\n * Note that `description` in `page` can be an empty string most likely when it comes to Mobile Chrome)\n * {\n * \"proc\": \"@webview_devtools_remote_22138\",\n * \"webview\": \"WEBVIEW_22138\",\n * \"info\": {\n * \"Android-Package\": \"io.appium.settings\",\n * \"Browser\": \"Chrome/74.0.3729.185\",\n * \"Protocol-Version\": \"1.3\",\n * \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; Android SDK built for x86 Build/QSR1.190920.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.185 Mobile Safari/537.36\",\n * \"V8-Version\": \"7.4.288.28\",\n * \"WebKit-Version\": \"537.36 (@22955682f94ce09336197bfb8dffea991fa32f0d)\",\n * \"webSocketDebuggerUrl\": \"ws://127.0.0.1:10900/devtools/browser\"\n * },\n * \"pages\": [\n * {\n * \"description\": \"{\\\"attached\\\":true,\\\"empty\\\":false,\\\"height\\\":1458,\\\"screenX\\\":0,\\\"screenY\\\":336,\\\"visible\\\":true,\\\"width\\\":1080}\",\n * \"devtoolsFrontendUrl\": \"http://chrome-devtools-frontend.appspot.com/serve_rev/@22955682f94ce09336197bfb8dffea991fa32f0d/inspector.html?ws=127.0.0.1:10900/devtools/page/27325CC50B600D31B233F45E09487B1F\",\n * \"id\": \"27325CC50B600D31B233F45E09487B1F\",\n * \"title\": \"Releases · appium/appium · GitHub\",\n * \"type\": \"page\",\n * \"url\": \"https://github.com/appium/appium/releases\",\n * \"webSocketDebuggerUrl\": \"ws://127.0.0.1:10900/devtools/page/27325CC50B600D31B233F45E09487B1F\"\n * }\n * ],\n * \"webviewName\": \"WEBVIEW_com.io.appium.setting\"\n * }\n */\n\n/**\n * Returns a webviewsMapping based on CDP endpoints\n *\n * @return {Array<WebviewsMapping>} webviewsMapping\n */\ncommands.mobileGetContexts = async function mobileGetContexts () {\n const opts = {\n androidDeviceSocket: this.opts.androidDeviceSocket,\n ensureWebviewsHavePages: true,\n webviewDevtoolsPort: this.opts.webviewDevtoolsPort,\n enableWebviewDetailsCollection: true\n };\n return await webviewHelpers.getWebViewsMapping(this.adb, opts);\n};\n\nhelpers.assignContexts = function assignContexts (webviewsMapping) {\n const opts = Object.assign({isChromeSession: this.isChromeSession}, this.opts);\n const webviews = webviewHelpers.parseWebviewNames(webviewsMapping, opts);\n this.contexts = [NATIVE_WIN, ...webviews];\n this.log.debug(`Available contexts: ${JSON.stringify(this.contexts)}`);\n return this.contexts;\n};\n\nhelpers.switchContext = async function switchContext (name, webviewsMapping) {\n // We have some options when it comes to webviews. If we want a\n // Chromedriver webview, we can only control one at a time.\n if (this.isChromedriverContext(name)) {\n // start proxying commands directly to chromedriver\n await this.startChromedriverProxy(name, webviewsMapping);\n } else if (this.isChromedriverContext(this.curContext)) {\n // if we're moving to a non-chromedriver webview, and our current context\n // _is_ a chromedriver webview, if caps recreateChromeDriverSessions is set\n // to true then kill chromedriver session using stopChromedriverProxies or\n // else simply suspend proxying to the latter\n if (this.opts.recreateChromeDriverSessions) {\n this.log.debug('recreateChromeDriverSessions set to true; killing existing chromedrivers');\n await this.stopChromedriverProxies();\n } else {\n await this.suspendChromedriverProxy();\n }\n } else {\n throw new Error(`Didn't know how to handle switching to context '${name}'`);\n }\n};\n\n\n/* ---------------------------------\n * On-object context-related helpers\n * --------------------------------- */\n\n// The reason this is a function and not just a constant is that both android-\n// driver and selendroid-driver use this logic, and each one returns\n// a different default context name\nhelpers.defaultContextName = function defaultContextName () {\n return NATIVE_WIN;\n};\n\nhelpers.defaultWebviewName = function defaultWebviewName () {\n return WEBVIEW_BASE + this.opts.appPackage;\n};\n\nhelpers.isWebContext = function isWebContext () {\n return this.curContext !== null && this.curContext !== NATIVE_WIN;\n};\n\n// Turn on proxying to an existing Chromedriver session or a new one\nhelpers.startChromedriverProxy = async function startChromedriverProxy (context, webviewsMapping) {\n this.log.debug(`Connecting to chrome-backed webview context '${context}'`);\n\n let cd;\n if (this.sessionChromedrivers[context]) {\n // in the case where we've already set up a chromedriver for a context,\n // we want to reconnect to it, not create a whole new one\n this.log.debug(`Found existing Chromedriver for context '${context}'. Using it.`);\n cd = this.sessionChromedrivers[context];\n await setupExistingChromedriver(this.log, cd);\n } else {\n let opts = _.cloneDeep(this.opts);\n opts.chromeUseRunningApp = true;\n\n // if requested, tell chromedriver to attach to the android package we have\n // associated with the context name, rather than the package of the AUT.\n // And turn this on by default for chrome--if chrome pops up with a webview\n // and someone wants to switch to it, we should let chromedriver connect to\n // chrome rather than staying stuck on the AUT\n if (opts.extractChromeAndroidPackageFromContextName || context === `${WEBVIEW_BASE}chrome`) {\n let androidPackage = context.match(`${WEBVIEW_BASE}(.+)`);\n if (androidPackage && androidPackage.length > 0) {\n opts.chromeAndroidPackage = androidPackage[1];\n }\n if (!opts.extractChromeAndroidPackageFromContextName) {\n if (_.has(this.opts, 'enableWebviewDetailsCollection') && !this.opts.enableWebviewDetailsCollection) {\n // When enableWebviewDetailsCollection capability is explicitly disabled, try to identify\n // chromeAndroidPackage based on contexts, known chrome variant packages and queryAppState result\n // since webviewsMapping does not have info object\n const contexts = webviewsMapping.map((wm) => wm.webviewName);\n for (const knownPackage of KNOWN_CHROME_PACKAGE_NAMES) {\n if (_.includes(contexts, `${WEBVIEW_BASE}${knownPackage}`)) {\n continue;\n }\n const appState = await this.queryAppState(knownPackage);\n if (_.includes([APP_STATE.RUNNING_IN_BACKGROUND, APP_STATE.RUNNING_IN_FOREGROUND], appState)) {\n opts.chromeAndroidPackage = knownPackage;\n this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` +\n `for context '${context}' by querying states of Chrome app packages`);\n break;\n }\n }\n } else {\n for (const wm of webviewsMapping) {\n if (wm.webviewName === context && _.has(wm?.info, 'Android-Package')) {\n opts.chromeAndroidPackage = wm.info['Android-Package'];\n this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` +\n `for context '${context}' by CDP`);\n break;\n }\n }\n }\n }\n }\n\n cd = await this.setupNewChromedriver(opts, this.adb.curDeviceId, this.adb, context);\n // bind our stop/exit handler, passing in context so we know which\n // one stopped unexpectedly\n cd.on(Chromedriver.EVENT_CHANGED, (msg) => {\n if (msg.state === Chromedriver.STATE_STOPPED) {\n this.onChromedriverStop(context);\n }\n });\n // save the chromedriver object under the context\n this.sessionChromedrivers[context] = cd;\n }\n // hook up the local variables so we can proxy this biz\n this.chromedriver = cd;\n this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);\n this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);\n this.jwpProxyActive = true;\n};\n\n// Stop proxying to any Chromedriver\nhelpers.suspendChromedriverProxy = function suspendChromedriverProxy () {\n this.chromedriver = null;\n this.proxyReqRes = null;\n this.proxyCommand = null;\n this.jwpProxyActive = false;\n};\n\n// Handle an out-of-band Chromedriver stop event\nhelpers.onChromedriverStop = async function onChromedriverStop (context) {\n this.log.warn(`Chromedriver for context ${context} stopped unexpectedly`);\n if (context === this.curContext) {\n // we exited unexpectedly while automating the current context and so want\n // to shut down the session and respond with an error\n let err = new Error('Chromedriver quit unexpectedly during session');\n await this.startUnexpectedShutdown(err);\n } else {\n // if a Chromedriver in the non-active context barfs, we don't really\n // care, we'll just make a new one next time we need the context.\n this.log.warn(\"Chromedriver quit unexpectedly, but it wasn't the active \" +\n 'context, ignoring');\n delete this.sessionChromedrivers[context];\n }\n};\n\n// Intentionally stop all the chromedrivers currently active, and ignore\n// their exit events\nhelpers.stopChromedriverProxies = async function stopChromedriverProxies () {\n this.suspendChromedriverProxy(); // make sure we turn off the proxy flag\n for (let context of _.keys(this.sessionChromedrivers)) {\n let cd = this.sessionChromedrivers[context];\n this.log.debug(`Stopping chromedriver for context ${context}`);\n // stop listening for the stopped state event\n cd.removeAllListeners(Chromedriver.EVENT_CHANGED);\n try {\n await cd.stop();\n } catch (err) {\n this.log.warn(`Error stopping Chromedriver: ${err.message}`);\n }\n delete this.sessionChromedrivers[context];\n }\n};\n\nhelpers.isChromedriverContext = function isChromedriverContext (viewName) {\n return _.includes(viewName, WEBVIEW_WIN) || viewName === CHROMIUM_WIN;\n};\n\nhelpers.shouldDismissChromeWelcome = function shouldDismissChromeWelcome () {\n return !!this.opts.chromeOptions &&\n _.isArray(this.opts.chromeOptions.args) &&\n this.opts.chromeOptions.args.includes('--no-first-run');\n};\n\nhelpers.dismissChromeWelcome = async function dismissChromeWelcome () {\n this.log.info('Trying to dismiss Chrome welcome');\n let activity = await this.getCurrentActivity();\n if (activity !== 'org.chromium.chrome.browser.firstrun.FirstRunActivity') {\n this.log.info('Chrome welcome dialog never showed up! Continuing');\n return;\n }\n let el = await this.findElOrEls('id', 'com.android.chrome:id/terms_accept', false);\n await this.click(el.ELEMENT);\n try {\n let el = await this.findElOrEls('id', 'com.android.chrome:id/negative_button', false);\n await this.click(el.ELEMENT);\n } catch (e) {\n // DO NOTHING, THIS DEVICE DIDNT LAUNCH THE SIGNIN DIALOG\n // IT MUST BE A NON GMS DEVICE\n this.log.warn(`This device did not show Chrome SignIn dialog, ${e.message}`);\n }\n};\n\nhelpers.startChromeSession = async function startChromeSession () {\n this.log.info('Starting a chrome-based browser session');\n let opts = _.cloneDeep(this.opts);\n\n const knownPackages = [\n 'org.chromium.chrome.shell',\n 'com.android.chrome',\n 'com.chrome.beta',\n 'org.chromium.chrome',\n 'org.chromium.webview_shell',\n ];\n\n if (_.includes(knownPackages, this.opts.appPackage)) {\n opts.chromeBundleId = this.opts.appPackage;\n } else {\n opts.chromeAndroidActivity = this.opts.appActivity;\n }\n this.chromedriver = await this.setupNewChromedriver(opts, this.adb.curDeviceId, this.adb);\n this.chromedriver.on(Chromedriver.EVENT_CHANGED, (msg) => {\n if (msg.state === Chromedriver.STATE_STOPPED) {\n this.onChromedriverStop(CHROMIUM_WIN);\n }\n });\n\n // Now that we have a Chrome session, we ensure that the context is\n // appropriately set and that this chromedriver is added to the list\n // of session chromedrivers so we can switch back and forth\n this.curContext = CHROMIUM_WIN;\n this.sessionChromedrivers[CHROMIUM_WIN] = this.chromedriver;\n this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);\n this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);\n this.jwpProxyActive = true;\n\n if (this.shouldDismissChromeWelcome()) {\n // dismiss Chrome welcome dialog\n await this.dismissChromeWelcome();\n }\n};\n\n\n/* --------------------------\n * Internal library functions\n * -------------------------- */\n\nasync function setupExistingChromedriver (log, chromedriver) {\n // check the status by sending a simple window-based command to ChromeDriver\n // if there is an error, we want to recreate the ChromeDriver session\n if (!await chromedriver.hasWorkingWebview()) {\n log.debug('ChromeDriver is not associated with a window. ' +\n 'Re-initializing the session.');\n await chromedriver.restart();\n }\n return chromedriver;\n}\n\n/**\n * Find a free port to have Chromedriver listen on.\n *\n * @param {array} portSpec - Array which is a list of ports. A list item may\n * also itself be an array of length 2 specifying a start and end port of\n * a range. Some valid port specs:\n * - [8000, 8001, 8002]\n * - [[8000, 8005]]\n * - [8000, [9000, 9100]]\n * @param {Object?} log Logger instance\n *\n * @return {number} A free port\n */\nasync function getChromedriverPort (portSpec, log = null) {\n const getPort = B.promisify(PortFinder.getPort, {context: PortFinder});\n\n // if the user didn't give us any specific information about chromedriver\n // port ranges, just find any free port\n if (!portSpec) {\n const port = await getPort();\n log?.debug(`A port was not given, using random free port: ${port}`);\n return port;\n }\n\n // otherwise find the free port based on a list or range provided by the user\n log?.debug(`Finding a free port for chromedriver using spec ${JSON.stringify(portSpec)}`);\n let foundPort = null;\n for (const potentialPort of portSpec) {\n let port, stopPort;\n if (_.isArray(potentialPort)) {\n ([port, stopPort] = potentialPort);\n } else {\n port = parseInt(potentialPort, 10); // ensure we have a number and not a string\n stopPort = port;\n }\n try {\n log?.debug(`Checking port range ${port}:${stopPort}`);\n foundPort = await getPort({port, stopPort});\n break;\n } catch (e) {\n log?.debug(`Nothing in port range ${port}:${stopPort} was available`);\n }\n }\n\n if (foundPort === null) {\n throw new Error(`Could not find a free port for chromedriver using ` +\n `chromedriverPorts spec ${JSON.stringify(portSpec)}`);\n }\n\n log?.debug(`Using free port ${foundPort} for chromedriver`);\n return foundPort;\n}\n\nhelpers.isChromedriverAutodownloadEnabled = function isChromedriverAutodownloadEnabled () {\n if (this.isFeatureEnabled(CHROMEDRIVER_AUTODOWNLOAD_FEATURE)) {\n return true;\n }\n this?.log?.debug(`Automated Chromedriver download is disabled. ` +\n `Use '${CHROMEDRIVER_AUTODOWNLOAD_FEATURE}' server feature to enable it`);\n return false;\n};\n\nhelpers.setupNewChromedriver = async function setupNewChromedriver (opts, curDeviceId, adb, context = null) {\n if (opts.chromeDriverPort) {\n this?.log?.warn(`The 'chromeDriverPort' capability is deprecated. Please use 'chromedriverPort' instead`);\n opts.chromedriverPort = opts.chromeDriverPort;\n }\n\n if (opts.chromedriverPort) {\n this?.log?.debug(`Using user-specified port ${opts.chromedriverPort} for chromedriver`);\n } else {\n // if a single port wasn't given, we'll look for a free one\n opts.chromedriverPort = await getChromedriverPort(opts.chromedriverPorts, this?.log);\n }\n\n const details = context ? webviewHelpers.getWebviewDetails(adb, context) : undefined;\n if (!_.isEmpty(details)) {\n this?.log?.debug('Passing web view details to the Chromedriver constructor: ' +\n JSON.stringify(details, null, 2));\n }\n\n const chromedriver = new Chromedriver({\n port: opts.chromedriverPort,\n executable: opts.chromedriverExecutable,\n adb,\n cmdArgs: opts.chromedriverArgs,\n verbose: !!opts.showChromedriverLog,\n executableDir: opts.chromedriverExecutableDir,\n mappingPath: opts.chromedriverChromeMappingFile,\n bundleId: opts.chromeBundleId,\n useSystemExecutable: opts.chromedriverUseSystemExecutable,\n disableBuildCheck: opts.chromedriverDisableBuildCheck,\n details,\n isAutodownloadEnabled: this?.isChromedriverAutodownloadEnabled?.()\n });\n\n // make sure there are chromeOptions\n opts.chromeOptions = opts.chromeOptions || {};\n // try out any prefixed chromeOptions,\n // and strip the prefix\n for (const opt of _.keys(opts)) {\n if (opt.endsWith(':chromeOptions')) {\n this?.log?.warn(`Merging '${opt}' into 'chromeOptions'. This may cause unexpected behavior`);\n _.merge(opts.chromeOptions, opts[opt]);\n }\n }\n\n const caps = webviewHelpers.createChromedriverCaps(opts, curDeviceId, details);\n this?.log?.debug(`Before starting chromedriver, androidPackage is '${caps.chromeOptions.androidPackage}'`);\n await chromedriver.start(caps);\n return chromedriver;\n};\nconst setupNewChromedriver = helpers.setupNewChromedriver;\n\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers, setupNewChromedriver };\nexport default extensions;\n"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAIA;;;;;;AAEA,MAAMA,iCAAiC,GAAG,2BAA1C;AAEA,IAAIC,QAAQ,GAAG,EAAf;AAAA,IAAmBC,OAAO,GAAG,EAA7B;AAAA,IAAiCC,UAAU,GAAG,EAA9C;;;;AAMAF,QAAQ,CAACG,iBAAT,GAA6B,eAAeA,iBAAf,GAAoC;EAG/D,OAAO,KAAKC,UAAL,IAAmB,KAAKC,kBAAL,EAA1B;AACD,CAJD;;AAMAL,QAAQ,CAACM,WAAT,GAAuB,eAAeA,WAAf,GAA8B;EACnD,MAAMC,eAAe,GAAG,MAAMC,uBAAA,CAAeC,kBAAf,CAAkC,KAAKC,GAAvC,EAA4C,KAAKC,IAAjD,CAA9B;EACA,OAAO,KAAKC,cAAL,CAAoBL,eAApB,CAAP;AACD,CAHD;;AAKAP,QAAQ,CAACa,UAAT,GAAsB,eAAeA,UAAf,CAA2BC,IAA3B,EAAiC;EACrD,IAAI,CAACC,aAAA,CAAKC,QAAL,CAAcF,IAAd,CAAL,EAA0B;IACxBA,IAAI,GAAG,KAAKT,kBAAL,EAAP;EACD,CAFD,MAEO,IAAIS,IAAI,KAAKG,2BAAb,EAA0B;IAE/BH,IAAI,GAAG,KAAKI,kBAAL,EAAP;EACD;;EAED,IAAIJ,IAAI,KAAK,KAAKV,UAAlB,EAA8B;IAC5B;EACD;;EAED,MAAMG,eAAe,GAAG,MAAMC,uBAAA,CAAeC,kBAAf,CAAkC,KAAKC,GAAvC,EAA4C,KAAKC,IAAjD,CAA9B;EACA,MAAMQ,QAAQ,GAAG,KAAKP,cAAL,CAAoBL,eAApB,CAAjB;;EAEA,IAAI,CAACa,eAAA,CAAEC,QAAF,CAAWF,QAAX,EAAqBL,IAArB,CAAL,EAAiC;IAC/B,MAAM,IAAIQ,cAAA,CAAOC,kBAAX,EAAN;EACD;;EAED,MAAM,KAAKC,aAAL,CAAmBV,IAAnB,EAAyBP,eAAzB,CAAN;EACA,KAAKH,UAAL,GAAkBU,IAAlB;AACD,CArBD;;AAqEAd,QAAQ,CAACyB,iBAAT,GAA6B,eAAeA,iBAAf,GAAoC;EAC/D,MAAMd,IAAI,GAAG;IACXe,mBAAmB,EAAE,KAAKf,IAAL,CAAUe,mBADpB;IAEXC,uBAAuB,EAAE,IAFd;IAGXC,mBAAmB,EAAE,KAAKjB,IAAL,CAAUiB,mBAHpB;IAIXC,8BAA8B,EAAE;EAJrB,CAAb;EAMA,OAAO,MAAMrB,uBAAA,CAAeC,kBAAf,CAAkC,KAAKC,GAAvC,EAA4CC,IAA5C,CAAb;AACD,CARD;;AAUAV,OAAO,CAACW,cAAR,GAAyB,SAASA,cAAT,CAAyBL,eAAzB,EAA0C;EACjE,MAAMI,IAAI,GAAGmB,MAAM,CAACC,MAAP,CAAc;IAACC,eAAe,EAAE,KAAKA;EAAvB,CAAd,EAAuD,KAAKrB,IAA5D,CAAb;;EACA,MAAMsB,QAAQ,GAAGzB,uBAAA,CAAe0B,iBAAf,CAAiC3B,eAAjC,EAAkDI,IAAlD,CAAjB;;EACA,KAAKQ,QAAL,GAAgB,CAACgB,0BAAD,EAAa,GAAGF,QAAhB,CAAhB;EACA,KAAKG,GAAL,CAASC,KAAT,CAAgB,uBAAsBC,IAAI,CAACC,SAAL,CAAe,KAAKpB,QAApB,CAA8B,EAApE;EACA,OAAO,KAAKA,QAAZ;AACD,CAND;;AAQAlB,OAAO,CAACuB,aAAR,GAAwB,eAAeA,aAAf,CAA8BV,IAA9B,EAAoCP,eAApC,EAAqD;EAG3E,IAAI,KAAKiC,qBAAL,CAA2B1B,IAA3B,CAAJ,EAAsC;IAEpC,MAAM,KAAK2B,sBAAL,CAA4B3B,IAA5B,EAAkCP,eAAlC,CAAN;EACD,CAHD,MAGO,IAAI,KAAKiC,qBAAL,CAA2B,KAAKpC,UAAhC,CAAJ,EAAiD;IAKtD,IAAI,KAAKO,IAAL,CAAU+B,4BAAd,EAA4C;MAC1C,KAAKN,GAAL,CAASC,KAAT,CAAe,0EAAf;MACA,MAAM,KAAKM,uBAAL,EAAN;IACD,CAHD,MAGO;MACL,MAAM,KAAKC,wBAAL,EAAN;IACD;EACF,CAXM,MAWA;IACL,MAAM,IAAIC,KAAJ,CAAW,mDAAkD/B,IAAK,GAAlE,CAAN;EACD;AACF,CApBD;;AA8BAb,OAAO,CAACI,kBAAR,GAA6B,SAASA,kBAAT,GAA+B;EAC1D,OAAO8B,0BAAP;AACD,CAFD;;AAIAlC,OAAO,CAACiB,kBAAR,GAA6B,SAASA,kBAAT,GAA+B;EAC1D,OAAO4B,4BAAA,GAAe,KAAKnC,IAAL,CAAUoC,UAAhC;AACD,CAFD;;AAIA9C,OAAO,CAAC+C,YAAR,GAAuB,SAASA,YAAT,GAAyB;EAC9C,OAAO,KAAK5C,UAAL,KAAoB,IAApB,IAA4B,KAAKA,UAAL,KAAoB+B,0BAAvD;AACD,CAFD;;AAKAlC,OAAO,CAACwC,sBAAR,GAAiC,eAAeA,sBAAf,CAAuCQ,OAAvC,EAAgD1C,eAAhD,EAAiE;EAChG,KAAK6B,GAAL,CAASC,KAAT,CAAgB,gDAA+CY,OAAQ,GAAvE;EAEA,IAAIC,EAAJ;;EACA,IAAI,KAAKC,oBAAL,CAA0BF,OAA1B,CAAJ,EAAwC;IAGtC,KAAKb,GAAL,CAASC,KAAT,CAAgB,4CAA2CY,OAAQ,cAAnE;IACAC,EAAE,GAAG,KAAKC,oBAAL,CAA0BF,OAA1B,CAAL;IACA,MAAMG,yBAAyB,CAAC,KAAKhB,GAAN,EAAWc,EAAX,CAA/B;EACD,CAND,MAMO;IACL,IAAIvC,IAAI,GAAGS,eAAA,CAAEiC,SAAF,CAAY,KAAK1C,IAAjB,CAAX;;IACAA,IAAI,CAAC2C,mBAAL,GAA2B,IAA3B;;IAOA,IAAI3C,IAAI,CAAC4C,0CAAL,IAAmDN,OAAO,KAAM,GAAEH,4BAAa,QAAnF,EAA4F;MAC1F,IAAIU,cAAc,GAAGP,OAAO,CAACQ,KAAR,CAAe,GAAEX,4BAAa,MAA9B,CAArB;;MACA,IAAIU,cAAc,IAAIA,cAAc,CAACE,MAAf,GAAwB,CAA9C,EAAiD;QAC/C/C,IAAI,CAACgD,oBAAL,GAA4BH,cAAc,CAAC,CAAD,CAA1C;MACD;;MACD,IAAI,CAAC7C,IAAI,CAAC4C,0CAAV,EAAsD;QACpD,IAAInC,eAAA,CAAEwC,GAAF,CAAM,KAAKjD,IAAX,EAAiB,gCAAjB,KAAsD,CAAC,KAAKA,IAAL,CAAUkB,8BAArE,EAAqG;UAInG,MAAMV,QAAQ,GAAGZ,eAAe,CAACsD,GAAhB,CAAqBC,EAAD,IAAQA,EAAE,CAACC,WAA/B,CAAjB;;UACA,KAAK,MAAMC,YAAX,IAA2BC,0CAA3B,EAAuD;YACrD,IAAI7C,eAAA,CAAEC,QAAF,CAAWF,QAAX,EAAsB,GAAE2B,4BAAa,GAAEkB,YAAa,EAApD,CAAJ,EAA4D;cAC1D;YACD;;YACD,MAAME,QAAQ,GAAG,MAAM,KAAKC,aAAL,CAAmBH,YAAnB,CAAvB;;YACA,IAAI5C,eAAA,CAAEC,QAAF,CAAW,CAAC+C,yBAAA,CAAUC,qBAAX,EAAkCD,yBAAA,CAAUE,qBAA5C,CAAX,EAA+EJ,QAA/E,CAAJ,EAA8F;cAC5FvD,IAAI,CAACgD,oBAAL,GAA4BK,YAA5B;cACA,KAAK5B,GAAL,CAASC,KAAT,CAAgB,uCAAsC1B,IAAI,CAACgD,oBAAqB,IAAjE,GACZ,gBAAeV,OAAQ,6CAD1B;cAEA;YACD;UACF;QACF,CAjBD,MAiBO;UACL,KAAK,MAAMa,EAAX,IAAiBvD,eAAjB,EAAkC;YAChC,IAAIuD,EAAE,CAACC,WAAH,KAAmBd,OAAnB,IAA8B7B,eAAA,CAAEwC,GAAF,CAAME,EAAN,aAAMA,EAAN,uBAAMA,EAAE,CAAES,IAAV,EAAgB,iBAAhB,CAAlC,EAAsE;cACpE5D,IAAI,CAACgD,oBAAL,GAA4BG,EAAE,CAACS,IAAH,CAAQ,iBAAR,CAA5B;cACA,KAAKnC,GAAL,CAASC,KAAT,CAAgB,uCAAsC1B,IAAI,CAACgD,oBAAqB,IAAjE,GACZ,gBAAeV,OAAQ,UAD1B;cAEA;YACD;UACF;QACF;MACF;IACF;;IAEDC,EAAE,GAAG,MAAM,KAAKsB,oBAAL,CAA0B7D,IAA1B,EAAgC,KAAKD,GAAL,CAAS+D,WAAzC,EAAsD,KAAK/D,GAA3D,EAAgEuC,OAAhE,CAAX;IAGAC,EAAE,CAACwB,EAAH,CAAMC,2BAAA,CAAaC,aAAnB,EAAmCC,GAAD,IAAS;MACzC,IAAIA,GAAG,CAACC,KAAJ,KAAcH,2BAAA,CAAaI,aAA/B,EAA8C;QAC5C,KAAKC,kBAAL,CAAwB/B,OAAxB;MACD;IACF,CAJD;IAMA,KAAKE,oBAAL,CAA0BF,OAA1B,IAAqCC,EAArC;EACD;;EAED,KAAK+B,YAAL,GAAoB/B,EAApB;EACA,KAAKgC,WAAL,GAAmB,KAAKD,YAAL,CAAkBE,QAAlB,CAA2BC,IAA3B,CAAgC,KAAKH,YAArC,CAAnB;EACA,KAAKI,YAAL,GAAoB,KAAKJ,YAAL,CAAkBK,OAAlB,CAA0BC,OAA1B,CAAkCH,IAAlC,CAAuC,KAAKH,YAAL,CAAkBK,OAAzD,CAApB;EACA,KAAKE,cAAL,GAAsB,IAAtB;AACD,CAvED;;AA0EAvF,OAAO,CAAC2C,wBAAR,GAAmC,SAASA,wBAAT,GAAqC;EACtE,KAAKqC,YAAL,GAAoB,IAApB;EACA,KAAKC,WAAL,GAAmB,IAAnB;EACA,KAAKG,YAAL,GAAoB,IAApB;EACA,KAAKG,cAAL,GAAsB,KAAtB;AACD,CALD;;AAQAvF,OAAO,CAAC+E,kBAAR,GAA6B,eAAeA,kBAAf,CAAmC/B,OAAnC,EAA4C;EACvE,KAAKb,GAAL,CAASqD,IAAT,CAAe,4BAA2BxC,OAAQ,uBAAlD;;EACA,IAAIA,OAAO,KAAK,KAAK7C,UAArB,EAAiC;IAG/B,IAAIsF,GAAG,GAAG,IAAI7C,KAAJ,CAAU,+CAAV,CAAV;IACA,MAAM,KAAK8C,uBAAL,CAA6BD,GAA7B,CAAN;EACD,CALD,MAKO;IAGL,KAAKtD,GAAL,CAASqD,IAAT,CAAc,8DACZ,mBADF;IAEA,OAAO,KAAKtC,oBAAL,CAA0BF,OAA1B,CAAP;EACD;AACF,CAdD;;AAkBAhD,OAAO,CAAC0C,uBAAR,GAAkC,eAAeA,uBAAf,GAA0C;EAC1E,KAAKC,wBAAL;;EACA,KAAK,IAAIK,OAAT,IAAoB7B,eAAA,CAAEwE,IAAF,CAAO,KAAKzC,oBAAZ,CAApB,EAAuD;IACrD,IAAID,EAAE,GAAG,KAAKC,oBAAL,CAA0BF,OAA1B,CAAT;IACA,KAAKb,GAAL,CAASC,KAAT,CAAgB,qCAAoCY,OAAQ,EAA5D;IAEAC,EAAE,CAAC2C,kBAAH,CAAsBlB,2BAAA,CAAaC,aAAnC;;IACA,IAAI;MACF,MAAM1B,EAAE,CAAC4C,IAAH,EAAN;IACD,CAFD,CAEE,OAAOJ,GAAP,EAAY;MACZ,KAAKtD,GAAL,CAASqD,IAAT,CAAe,gCAA+BC,GAAG,CAACK,OAAQ,EAA1D;IACD;;IACD,OAAO,KAAK5C,oBAAL,CAA0BF,OAA1B,CAAP;EACD;AACF,CAdD;;AAgBAhD,OAAO,CAACuC,qBAAR,GAAgC,SAASA,qBAAT,CAAgCwD,QAAhC,EAA0C;EACxE,OAAO5E,eAAA,CAAEC,QAAF,CAAW2E,QAAX,EAAqB/E,2BAArB,KAAqC+E,QAAQ,KAAKC,4BAAzD;AACD,CAFD;;AAIAhG,OAAO,CAACiG,0BAAR,GAAqC,SAASA,0BAAT,GAAuC;EAC1E,OAAO,CAAC,CAAC,KAAKvF,IAAL,CAAUwF,aAAZ,IACA/E,eAAA,CAAEgF,OAAF,CAAU,KAAKzF,IAAL,CAAUwF,aAAV,CAAwBE,IAAlC,CADA,IAEA,KAAK1F,IAAL,CAAUwF,aAAV,CAAwBE,IAAxB,CAA6BhF,QAA7B,CAAsC,gBAAtC,CAFP;AAGD,CAJD;;AAMApB,OAAO,CAACqG,oBAAR,GAA+B,eAAeA,oBAAf,GAAuC;EACpE,KAAKlE,GAAL,CAASmC,IAAT,CAAc,kCAAd;EACA,IAAIgC,QAAQ,GAAG,MAAM,KAAKC,kBAAL,EAArB;;EACA,IAAID,QAAQ,KAAK,uDAAjB,EAA0E;IACxE,KAAKnE,GAAL,CAASmC,IAAT,CAAc,mDAAd;IACA;EACD;;EACD,IAAIkC,EAAE,GAAG,MAAM,KAAKC,WAAL,CAAiB,IAAjB,EAAuB,oCAAvB,EAA6D,KAA7D,CAAf;EACA,MAAM,KAAKC,KAAL,CAAWF,EAAE,CAACG,OAAd,CAAN;;EACA,IAAI;IACF,IAAIH,EAAE,GAAG,MAAM,KAAKC,WAAL,CAAiB,IAAjB,EAAuB,uCAAvB,EAAgE,KAAhE,CAAf;IACA,MAAM,KAAKC,KAAL,CAAWF,EAAE,CAACG,OAAd,CAAN;EACD,CAHD,CAGE,OAAOC,CAAP,EAAU;IAGV,KAAKzE,GAAL,CAASqD,IAAT,CAAe,kDAAiDoB,CAAC,CAACd,OAAQ,EAA1E;EACD;AACF,CAjBD;;AAmBA9F,OAAO,CAAC6G,kBAAR,GAA6B,eAAeA,kBAAf,GAAqC;EAChE,KAAK1E,GAAL,CAASmC,IAAT,CAAc,yCAAd;;EACA,IAAI5D,IAAI,GAAGS,eAAA,CAAEiC,SAAF,CAAY,KAAK1C,IAAjB,CAAX;;EAEA,MAAMoG,aAAa,GAAG,CACpB,2BADoB,EAEpB,oBAFoB,EAGpB,iBAHoB,EAIpB,qBAJoB,EAKpB,4BALoB,CAAtB;;EAQA,IAAI3F,eAAA,CAAEC,QAAF,CAAW0F,aAAX,EAA0B,KAAKpG,IAAL,CAAUoC,UAApC,CAAJ,EAAqD;IACnDpC,IAAI,CAACqG,cAAL,GAAsB,KAAKrG,IAAL,CAAUoC,UAAhC;EACD,CAFD,MAEO;IACLpC,IAAI,CAACsG,qBAAL,GAA6B,KAAKtG,IAAL,CAAUuG,WAAvC;EACD;;EACD,KAAKjC,YAAL,GAAoB,MAAM,KAAKT,oBAAL,CAA0B7D,IAA1B,EAAgC,KAAKD,GAAL,CAAS+D,WAAzC,EAAsD,KAAK/D,GAA3D,CAA1B;EACA,KAAKuE,YAAL,CAAkBP,EAAlB,CAAqBC,2BAAA,CAAaC,aAAlC,EAAkDC,GAAD,IAAS;IACxD,IAAIA,GAAG,CAACC,KAAJ,KAAcH,2BAAA,CAAaI,aAA/B,EAA8C;MAC5C,KAAKC,kBAAL,CAAwBiB,4BAAxB;IACD;EACF,CAJD;EASA,KAAK7F,UAAL,GAAkB6F,4BAAlB;EACA,KAAK9C,oBAAL,CAA0B8C,4BAA1B,IAA0C,KAAKhB,YAA/C;EACA,KAAKC,WAAL,GAAmB,KAAKD,YAAL,CAAkBE,QAAlB,CAA2BC,IAA3B,CAAgC,KAAKH,YAArC,CAAnB;EACA,KAAKI,YAAL,GAAoB,KAAKJ,YAAL,CAAkBK,OAAlB,CAA0BC,OAA1B,CAAkCH,IAAlC,CAAuC,KAAKH,YAAL,CAAkBK,OAAzD,CAApB;EACA,KAAKE,cAAL,GAAsB,IAAtB;;EAEA,IAAI,KAAKU,0BAAL,EAAJ,EAAuC;IAErC,MAAM,KAAKI,oBAAL,EAAN;EACD;AACF,CArCD;;AA4CA,eAAelD,yBAAf,CAA0ChB,GAA1C,EAA+C6C,YAA/C,EAA6D;EAG3D,IAAI,EAAC,MAAMA,YAAY,CAACkC,iBAAb,EAAP,CAAJ,EAA6C;IAC3C/E,GAAG,CAACC,KAAJ,CAAU,mDACG,8BADb;IAEA,MAAM4C,YAAY,CAACmC,OAAb,EAAN;EACD;;EACD,OAAOnC,YAAP;AACD;;AAeD,eAAeoC,mBAAf,CAAoCC,QAApC,EAA8ClF,GAAG,GAAG,IAApD,EAA0D;EACxD,MAAMmF,OAAO,GAAGC,iBAAA,CAAEC,SAAF,CAAYC,mBAAA,CAAWH,OAAvB,EAAgC;IAACtE,OAAO,EAAEyE;EAAV,CAAhC,CAAhB;;EAIA,IAAI,CAACJ,QAAL,EAAe;IACb,MAAMK,IAAI,GAAG,MAAMJ,OAAO,EAA1B;IACAnF,GAAG,SAAH,IAAAA,GAAG,WAAH,YAAAA,GAAG,CAAEC,KAAL,CAAY,iDAAgDsF,IAAK,EAAjE;IACA,OAAOA,IAAP;EACD;;EAGDvF,GAAG,SAAH,IAAAA,GAAG,WAAH,YAAAA,GAAG,CAAEC,KAAL,CAAY,mDAAkDC,IAAI,CAACC,SAAL,CAAe+E,QAAf,CAAyB,EAAvF;EACA,IAAIM,SAAS,GAAG,IAAhB;;EACA,KAAK,MAAMC,aAAX,IAA4BP,QAA5B,EAAsC;IACpC,IAAIK,IAAJ,EAAUG,QAAV;;IACA,IAAI1G,eAAA,CAAEgF,OAAF,CAAUyB,aAAV,CAAJ,EAA8B;MAC3B,CAACF,IAAD,EAAOG,QAAP,IAAmBD,aAApB;IACD,CAFD,MAEO;MACLF,IAAI,GAAGI,QAAQ,CAACF,aAAD,EAAgB,EAAhB,CAAf;MACAC,QAAQ,GAAGH,IAAX;IACD;;IACD,IAAI;MACFvF,GAAG,SAAH,IAAAA,GAAG,WAAH,YAAAA,GAAG,CAAEC,KAAL,CAAY,uBAAsBsF,IAAK,IAAGG,QAAS,EAAnD;MACAF,SAAS,GAAG,MAAML,OAAO,CAAC;QAACI,IAAD;QAAOG;MAAP,CAAD,CAAzB;MACA;IACD,CAJD,CAIE,OAAOjB,CAAP,EAAU;MACVzE,GAAG,SAAH,IAAAA,GAAG,WAAH,YAAAA,GAAG,CAAEC,KAAL,CAAY,yBAAwBsF,IAAK,IAAGG,QAAS,gBAArD;IACD;EACF;;EAED,IAAIF,SAAS,KAAK,IAAlB,EAAwB;IACtB,MAAM,IAAI/E,KAAJ,CAAW,oDAAD,GACC,0BAAyBP,IAAI,CAACC,SAAL,CAAe+E,QAAf,CAAyB,EAD7D,CAAN;EAED;;EAEDlF,GAAG,SAAH,IAAAA,GAAG,WAAH,YAAAA,GAAG,CAAEC,KAAL,CAAY,mBAAkBuF,SAAU,mBAAxC;EACA,OAAOA,SAAP;AACD;;AAED3H,OAAO,CAAC+H,iCAAR,GAA4C,SAASA,iCAAT,GAA8C;EAAA;;EACxF,IAAI,KAAKC,gBAAL,CAAsBlI,iCAAtB,CAAJ,EAA8D;IAC5D,OAAO,IAAP;EACD;;EACD,8DAAMqC,GAAN,wDAAWC,KAAX,CAAkB,+CAAD,GACd,QAAOtC,iCAAkC,+BAD5C;EAEA,OAAO,KAAP;AACD,CAPD;;AASAE,OAAO,CAACuE,oBAAR,GAA+B,eAAeA,oBAAf,CAAqC7D,IAArC,EAA2C8D,WAA3C,EAAwD/D,GAAxD,EAA6DuC,OAAO,GAAG,IAAvE,EAA6E;EAAA;;EAC1G,IAAItC,IAAI,CAACuH,gBAAT,EAA2B;IAAA;;IACzB,+DAAM9F,GAAN,0DAAWqD,IAAX,CAAiB,wFAAjB;IACA9E,IAAI,CAACwH,gBAAL,GAAwBxH,IAAI,CAACuH,gBAA7B;EACD;;EAED,IAAIvH,IAAI,CAACwH,gBAAT,EAA2B;IAAA;;IACzB,+DAAM/F,GAAN,0DAAWC,KAAX,CAAkB,6BAA4B1B,IAAI,CAACwH,gBAAiB,mBAApE;EACD,CAFD,MAEO;IAELxH,IAAI,CAACwH,gBAAL,GAAwB,MAAMd,mBAAmB,CAAC1G,IAAI,CAACyH,iBAAN,EAAyB,IAAzB,aAAyB,IAAzB,uBAAyB,KAAMhG,GAA/B,CAAjD;EACD;;EAED,MAAMiG,OAAO,GAAGpF,OAAO,GAAGzC,uBAAA,CAAe8H,iBAAf,CAAiC5H,GAAjC,EAAsCuC,OAAtC,CAAH,GAAoDsF,SAA3E;;EACA,IAAI,CAACnH,eAAA,CAAEoH,OAAF,CAAUH,OAAV,CAAL,EAAyB;IAAA;;IACvB,+DAAMjG,GAAN,0DAAWC,KAAX,CAAiB,+DACfC,IAAI,CAACC,SAAL,CAAe8F,OAAf,EAAwB,IAAxB,EAA8B,CAA9B,CADF;EAED;;EAED,MAAMpD,YAAY,GAAG,IAAIN,2BAAJ,CAAiB;IACpCgD,IAAI,EAAEhH,IAAI,CAACwH,gBADyB;IAEpCM,UAAU,EAAE9H,IAAI,CAAC+H,sBAFmB;IAGpChI,GAHoC;IAIpCiI,OAAO,EAAEhI,IAAI,CAACiI,gBAJsB;IAKpCC,OAAO,EAAE,CAAC,CAAClI,IAAI,CAACmI,mBALoB;IAMpCC,aAAa,EAAEpI,IAAI,CAACqI,yBANgB;IAOpCC,WAAW,EAAEtI,IAAI,CAACuI,6BAPkB;IAQpCC,QAAQ,EAAExI,IAAI,CAACqG,cARqB;IASpCoC,mBAAmB,EAAEzI,IAAI,CAAC0I,+BATU;IAUpCC,iBAAiB,EAAE3I,IAAI,CAAC4I,6BAVY;IAWpClB,OAXoC;IAYpCmB,qBAAqB,EAAE,IAAF,aAAE,IAAF,gDAAE,KAAMxB,iCAAR,0DAAE;EAZa,CAAjB,CAArB;EAgBArH,IAAI,CAACwF,aAAL,GAAqBxF,IAAI,CAACwF,aAAL,IAAsB,EAA3C;;EAGA,KAAK,MAAMsD,GAAX,IAAkBrI,eAAA,CAAEwE,IAAF,CAAOjF,IAAP,CAAlB,EAAgC;IAC9B,IAAI8I,GAAG,CAACC,QAAJ,CAAa,gBAAb,CAAJ,EAAoC;MAAA;;MAClC,+DAAMtH,GAAN,0DAAWqD,IAAX,CAAiB,YAAWgE,GAAI,4DAAhC;;MACArI,eAAA,CAAEuI,KAAF,CAAQhJ,IAAI,CAACwF,aAAb,EAA4BxF,IAAI,CAAC8I,GAAD,CAAhC;IACD;EACF;;EAED,MAAMG,IAAI,GAAGpJ,uBAAA,CAAeqJ,sBAAf,CAAsClJ,IAAtC,EAA4C8D,WAA5C,EAAyD4D,OAAzD,CAAb;;EACA,+DAAMjG,GAAN,0DAAWC,KAAX,CAAkB,oDAAmDuH,IAAI,CAACzD,aAAL,CAAmB3C,cAAe,GAAvG;EACA,MAAMyB,YAAY,CAAC6E,KAAb,CAAmBF,IAAnB,CAAN;EACA,OAAO3E,YAAP;AACD,CAjDD;;AAkDA,MAAMT,oBAAoB,GAAGvE,OAAO,CAACuE,oBAArC;;AAGA1C,MAAM,CAACC,MAAP,CAAc7B,UAAd,EAA0BF,QAA1B,EAAoCC,OAApC;eAEeC,U"}
1
+ {"version":3,"file":"context.js","names":["CHROMEDRIVER_AUTODOWNLOAD_FEATURE","commands","helpers","extensions","getCurrentContext","curContext","defaultContextName","getContexts","webviewsMapping","webviewHelpers","getWebViewsMapping","adb","opts","assignContexts","setContext","name","util","hasValue","WEBVIEW_WIN","defaultWebviewName","contexts","_","includes","errors","NoSuchContextError","switchContext","mobileGetContexts","androidDeviceSocket","ensureWebviewsHavePages","webviewDevtoolsPort","enableWebviewDetailsCollection","Object","assign","isChromeSession","webviews","parseWebviewNames","NATIVE_WIN","log","debug","JSON","stringify","isChromedriverContext","startChromedriverProxy","recreateChromeDriverSessions","stopChromedriverProxies","suspendChromedriverProxy","Error","WEBVIEW_BASE","appPackage","isWebContext","context","cd","sessionChromedrivers","setupExistingChromedriver","cloneDeep","chromeUseRunningApp","extractChromeAndroidPackageFromContextName","androidPackage","match","length","chromeAndroidPackage","has","map","wm","webviewName","knownPackage","KNOWN_CHROME_PACKAGE_NAMES","appState","queryAppState","APP_STATE","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","info","setupNewChromedriver","curDeviceId","on","Chromedriver","EVENT_CHANGED","msg","state","STATE_STOPPED","onChromedriverStop","chromedriver","proxyReqRes","proxyReq","bind","proxyCommand","jwproxy","command","jwpProxyActive","warn","err","startUnexpectedShutdown","keys","removeAllListeners","stop","message","viewName","CHROMIUM_WIN","shouldDismissChromeWelcome","chromeOptions","isArray","args","dismissChromeWelcome","activity","getCurrentActivity","el","findElOrEls","click","ELEMENT","e","startChromeSession","knownPackages","chromeBundleId","chromeAndroidActivity","appActivity","hasWorkingWebview","restart","getChromedriverPort","portSpec","getPort","B","promisify","PortFinder","port","foundPort","potentialPort","stopPort","parseInt","isChromedriverAutodownloadEnabled","isFeatureEnabled","chromeDriverPort","chromedriverPort","chromedriverPorts","details","getWebviewDetails","undefined","isEmpty","executable","chromedriverExecutable","cmdArgs","chromedriverArgs","verbose","showChromedriverLog","executableDir","chromedriverExecutableDir","mappingPath","chromedriverChromeMappingFile","bundleId","useSystemExecutable","chromedriverUseSystemExecutable","disableBuildCheck","chromedriverDisableBuildCheck","isAutodownloadEnabled","opt","endsWith","merge","caps","createChromedriverCaps","start"],"sources":["../../../lib/commands/context.js"],"sourcesContent":["import _ from 'lodash';\nimport Chromedriver from 'appium-chromedriver';\nimport PortFinder from 'portfinder';\nimport B from 'bluebird';\nimport { util } from 'appium/support';\nimport { errors } from 'appium/driver';\nimport {\n default as webviewHelpers,\n NATIVE_WIN, WEBVIEW_BASE, WEBVIEW_WIN, CHROMIUM_WIN, KNOWN_CHROME_PACKAGE_NAMES\n} from '../webview-helpers';\nimport { APP_STATE } from '../android-helpers';\n\nconst CHROMEDRIVER_AUTODOWNLOAD_FEATURE = 'chromedriver_autodownload';\n\nlet commands = {}, helpers = {}, extensions = {};\n\n\n/* -------------------------------\n * Actual MJSONWP command handlers\n * ------------------------------- */\ncommands.getCurrentContext = async function getCurrentContext () { // eslint-disable-line require-await\n // if the current context is `null`, indicating no context\n // explicitly set, it is the default context\n return this.curContext || this.defaultContextName();\n};\n\ncommands.getContexts = async function getContexts () {\n const webviewsMapping = await webviewHelpers.getWebViewsMapping(this.adb, this.opts);\n return this.assignContexts(webviewsMapping);\n};\n\ncommands.setContext = async function setContext (name) {\n if (!util.hasValue(name)) {\n name = this.defaultContextName();\n } else if (name === WEBVIEW_WIN) {\n // handle setContext \"WEBVIEW\"\n name = this.defaultWebviewName();\n }\n // if we're already in the context we want, do nothing\n if (name === this.curContext) {\n return;\n }\n\n const webviewsMapping = await webviewHelpers.getWebViewsMapping(this.adb, this.opts);\n const contexts = this.assignContexts(webviewsMapping);\n // if the context we want doesn't exist, fail\n if (!_.includes(contexts, name)) {\n throw new errors.NoSuchContextError();\n }\n\n await this.switchContext(name, webviewsMapping);\n this.curContext = name;\n};\n\n/**\n * @typedef {Object} WebviewsMapping\n * @property {string} proc The name of the Devtools Unix socket\n * @property {string} webview The web view alias. Looks like `WEBVIEW_`\n * prefix plus PID or package name\n * @property {?Object} info Webview information as it is retrieved by\n * /json/version CDP endpoint\n * @property {?Array<Object>} pages Webview pages list as it is retrieved by\n * /json/list CDP endpoint\n * @propery {?string} webviewName An actual webview name for switching context.\n * This value becomes null when failing to find a PID for a webview.\n *\n * The following json demonstrates the example of WebviewsMapping object.\n * Note that `description` in `page` can be an empty string most likely when it comes to Mobile Chrome)\n * {\n * \"proc\": \"@webview_devtools_remote_22138\",\n * \"webview\": \"WEBVIEW_22138\",\n * \"info\": {\n * \"Android-Package\": \"io.appium.settings\",\n * \"Browser\": \"Chrome/74.0.3729.185\",\n * \"Protocol-Version\": \"1.3\",\n * \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; Android SDK built for x86 Build/QSR1.190920.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.185 Mobile Safari/537.36\",\n * \"V8-Version\": \"7.4.288.28\",\n * \"WebKit-Version\": \"537.36 (@22955682f94ce09336197bfb8dffea991fa32f0d)\",\n * \"webSocketDebuggerUrl\": \"ws://127.0.0.1:10900/devtools/browser\"\n * },\n * \"pages\": [\n * {\n * \"description\": \"{\\\"attached\\\":true,\\\"empty\\\":false,\\\"height\\\":1458,\\\"screenX\\\":0,\\\"screenY\\\":336,\\\"visible\\\":true,\\\"width\\\":1080}\",\n * \"devtoolsFrontendUrl\": \"http://chrome-devtools-frontend.appspot.com/serve_rev/@22955682f94ce09336197bfb8dffea991fa32f0d/inspector.html?ws=127.0.0.1:10900/devtools/page/27325CC50B600D31B233F45E09487B1F\",\n * \"id\": \"27325CC50B600D31B233F45E09487B1F\",\n * \"title\": \"Releases · appium/appium · GitHub\",\n * \"type\": \"page\",\n * \"url\": \"https://github.com/appium/appium/releases\",\n * \"webSocketDebuggerUrl\": \"ws://127.0.0.1:10900/devtools/page/27325CC50B600D31B233F45E09487B1F\"\n * }\n * ],\n * \"webviewName\": \"WEBVIEW_com.io.appium.setting\"\n * }\n */\n\n/**\n * Returns a webviewsMapping based on CDP endpoints\n *\n * @return {Array<WebviewsMapping>} webviewsMapping\n */\ncommands.mobileGetContexts = async function mobileGetContexts () {\n const opts = {\n androidDeviceSocket: this.opts.androidDeviceSocket,\n ensureWebviewsHavePages: true,\n webviewDevtoolsPort: this.opts.webviewDevtoolsPort,\n enableWebviewDetailsCollection: true\n };\n return await webviewHelpers.getWebViewsMapping(this.adb, opts);\n};\n\nhelpers.assignContexts = function assignContexts (webviewsMapping) {\n const opts = Object.assign({isChromeSession: this.isChromeSession}, this.opts);\n const webviews = webviewHelpers.parseWebviewNames(webviewsMapping, opts);\n this.contexts = [NATIVE_WIN, ...webviews];\n this.log.debug(`Available contexts: ${JSON.stringify(this.contexts)}`);\n return this.contexts;\n};\n\nhelpers.switchContext = async function switchContext (name, webviewsMapping) {\n // We have some options when it comes to webviews. If we want a\n // Chromedriver webview, we can only control one at a time.\n if (this.isChromedriverContext(name)) {\n // start proxying commands directly to chromedriver\n await this.startChromedriverProxy(name, webviewsMapping);\n } else if (this.isChromedriverContext(this.curContext)) {\n // if we're moving to a non-chromedriver webview, and our current context\n // _is_ a chromedriver webview, if caps recreateChromeDriverSessions is set\n // to true then kill chromedriver session using stopChromedriverProxies or\n // else simply suspend proxying to the latter\n if (this.opts.recreateChromeDriverSessions) {\n this.log.debug('recreateChromeDriverSessions set to true; killing existing chromedrivers');\n await this.stopChromedriverProxies();\n } else {\n await this.suspendChromedriverProxy();\n }\n } else {\n throw new Error(`Didn't know how to handle switching to context '${name}'`);\n }\n};\n\n\n/* ---------------------------------\n * On-object context-related helpers\n * --------------------------------- */\n\n// The reason this is a function and not just a constant is that both android-\n// driver and selendroid-driver use this logic, and each one returns\n// a different default context name\nhelpers.defaultContextName = function defaultContextName () {\n return NATIVE_WIN;\n};\n\nhelpers.defaultWebviewName = function defaultWebviewName () {\n return WEBVIEW_BASE + this.opts.appPackage;\n};\n\nhelpers.isWebContext = function isWebContext () {\n return this.curContext !== null && this.curContext !== NATIVE_WIN;\n};\n\n// Turn on proxying to an existing Chromedriver session or a new one\nhelpers.startChromedriverProxy = async function startChromedriverProxy (context, webviewsMapping) {\n this.log.debug(`Connecting to chrome-backed webview context '${context}'`);\n\n let cd;\n if (this.sessionChromedrivers[context]) {\n // in the case where we've already set up a chromedriver for a context,\n // we want to reconnect to it, not create a whole new one\n this.log.debug(`Found existing Chromedriver for context '${context}'. Using it.`);\n cd = this.sessionChromedrivers[context];\n await setupExistingChromedriver(this.log, cd);\n } else {\n let opts = _.cloneDeep(this.opts);\n opts.chromeUseRunningApp = true;\n\n // if requested, tell chromedriver to attach to the android package we have\n // associated with the context name, rather than the package of the AUT.\n // And turn this on by default for chrome--if chrome pops up with a webview\n // and someone wants to switch to it, we should let chromedriver connect to\n // chrome rather than staying stuck on the AUT\n if (opts.extractChromeAndroidPackageFromContextName || context === `${WEBVIEW_BASE}chrome`) {\n let androidPackage = context.match(`${WEBVIEW_BASE}(.+)`);\n if (androidPackage && androidPackage.length > 0) {\n opts.chromeAndroidPackage = androidPackage[1];\n }\n if (!opts.extractChromeAndroidPackageFromContextName) {\n if (_.has(this.opts, 'enableWebviewDetailsCollection') && !this.opts.enableWebviewDetailsCollection) {\n // When enableWebviewDetailsCollection capability is explicitly disabled, try to identify\n // chromeAndroidPackage based on contexts, known chrome variant packages and queryAppState result\n // since webviewsMapping does not have info object\n const contexts = webviewsMapping.map((wm) => wm.webviewName);\n for (const knownPackage of KNOWN_CHROME_PACKAGE_NAMES) {\n if (_.includes(contexts, `${WEBVIEW_BASE}${knownPackage}`)) {\n continue;\n }\n const appState = await this.queryAppState(knownPackage);\n if (_.includes([APP_STATE.RUNNING_IN_BACKGROUND, APP_STATE.RUNNING_IN_FOREGROUND], appState)) {\n opts.chromeAndroidPackage = knownPackage;\n this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` +\n `for context '${context}' by querying states of Chrome app packages`);\n break;\n }\n }\n } else {\n for (const wm of webviewsMapping) {\n if (wm.webviewName === context && _.has(wm?.info, 'Android-Package')) {\n opts.chromeAndroidPackage = wm.info['Android-Package'];\n this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` +\n `for context '${context}' by CDP`);\n break;\n }\n }\n }\n }\n }\n\n cd = await this.setupNewChromedriver(opts, this.adb.curDeviceId, this.adb, context);\n // bind our stop/exit handler, passing in context so we know which\n // one stopped unexpectedly\n cd.on(Chromedriver.EVENT_CHANGED, (msg) => {\n if (msg.state === Chromedriver.STATE_STOPPED) {\n this.onChromedriverStop(context);\n }\n });\n // save the chromedriver object under the context\n this.sessionChromedrivers[context] = cd;\n }\n // hook up the local variables so we can proxy this biz\n this.chromedriver = cd;\n this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);\n this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);\n this.jwpProxyActive = true;\n};\n\n// Stop proxying to any Chromedriver\nhelpers.suspendChromedriverProxy = function suspendChromedriverProxy () {\n this.chromedriver = null;\n this.proxyReqRes = null;\n this.proxyCommand = null;\n this.jwpProxyActive = false;\n};\n\n// Handle an out-of-band Chromedriver stop event\nhelpers.onChromedriverStop = async function onChromedriverStop (context) {\n this.log.warn(`Chromedriver for context ${context} stopped unexpectedly`);\n if (context === this.curContext) {\n // we exited unexpectedly while automating the current context and so want\n // to shut down the session and respond with an error\n let err = new Error('Chromedriver quit unexpectedly during session');\n await this.startUnexpectedShutdown(err);\n } else {\n // if a Chromedriver in the non-active context barfs, we don't really\n // care, we'll just make a new one next time we need the context.\n this.log.warn(\"Chromedriver quit unexpectedly, but it wasn't the active \" +\n 'context, ignoring');\n delete this.sessionChromedrivers[context];\n }\n};\n\n// Intentionally stop all the chromedrivers currently active, and ignore\n// their exit events\nhelpers.stopChromedriverProxies = async function stopChromedriverProxies () {\n this.suspendChromedriverProxy(); // make sure we turn off the proxy flag\n for (let context of _.keys(this.sessionChromedrivers)) {\n let cd = this.sessionChromedrivers[context];\n this.log.debug(`Stopping chromedriver for context ${context}`);\n // stop listening for the stopped state event\n cd.removeAllListeners(Chromedriver.EVENT_CHANGED);\n try {\n await cd.stop();\n } catch (err) {\n this.log.warn(`Error stopping Chromedriver: ${err.message}`);\n }\n delete this.sessionChromedrivers[context];\n }\n};\n\nhelpers.isChromedriverContext = function isChromedriverContext (viewName) {\n return _.includes(viewName, WEBVIEW_WIN) || viewName === CHROMIUM_WIN;\n};\n\nhelpers.shouldDismissChromeWelcome = function shouldDismissChromeWelcome () {\n return !!this.opts.chromeOptions &&\n _.isArray(this.opts.chromeOptions.args) &&\n this.opts.chromeOptions.args.includes('--no-first-run');\n};\n\nhelpers.dismissChromeWelcome = async function dismissChromeWelcome () {\n this.log.info('Trying to dismiss Chrome welcome');\n let activity = await this.getCurrentActivity();\n if (activity !== 'org.chromium.chrome.browser.firstrun.FirstRunActivity') {\n this.log.info('Chrome welcome dialog never showed up! Continuing');\n return;\n }\n let el = await this.findElOrEls('id', 'com.android.chrome:id/terms_accept', false);\n await this.click(el.ELEMENT);\n try {\n let el = await this.findElOrEls('id', 'com.android.chrome:id/negative_button', false);\n await this.click(el.ELEMENT);\n } catch (e) {\n // DO NOTHING, THIS DEVICE DIDNT LAUNCH THE SIGNIN DIALOG\n // IT MUST BE A NON GMS DEVICE\n this.log.warn(`This device did not show Chrome SignIn dialog, ${e.message}`);\n }\n};\n\nhelpers.startChromeSession = async function startChromeSession () {\n this.log.info('Starting a chrome-based browser session');\n let opts = _.cloneDeep(this.opts);\n\n const knownPackages = [\n 'org.chromium.chrome.shell',\n 'com.android.chrome',\n 'com.chrome.beta',\n 'org.chromium.chrome',\n 'org.chromium.webview_shell',\n ];\n\n if (_.includes(knownPackages, this.opts.appPackage)) {\n opts.chromeBundleId = this.opts.appPackage;\n } else {\n opts.chromeAndroidActivity = this.opts.appActivity;\n }\n this.chromedriver = await this.setupNewChromedriver(opts, this.adb.curDeviceId, this.adb);\n this.chromedriver.on(Chromedriver.EVENT_CHANGED, (msg) => {\n if (msg.state === Chromedriver.STATE_STOPPED) {\n this.onChromedriverStop(CHROMIUM_WIN);\n }\n });\n\n // Now that we have a Chrome session, we ensure that the context is\n // appropriately set and that this chromedriver is added to the list\n // of session chromedrivers so we can switch back and forth\n this.curContext = CHROMIUM_WIN;\n this.sessionChromedrivers[CHROMIUM_WIN] = this.chromedriver;\n this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);\n this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);\n this.jwpProxyActive = true;\n\n if (this.shouldDismissChromeWelcome()) {\n // dismiss Chrome welcome dialog\n await this.dismissChromeWelcome();\n }\n};\n\n\n/* --------------------------\n * Internal library functions\n * -------------------------- */\n\nasync function setupExistingChromedriver (log, chromedriver) {\n // check the status by sending a simple window-based command to ChromeDriver\n // if there is an error, we want to recreate the ChromeDriver session\n if (!await chromedriver.hasWorkingWebview()) {\n log.debug('ChromeDriver is not associated with a window. ' +\n 'Re-initializing the session.');\n await chromedriver.restart();\n }\n return chromedriver;\n}\n\n/**\n * Find a free port to have Chromedriver listen on.\n *\n * @param {array} portSpec - Array which is a list of ports. A list item may\n * also itself be an array of length 2 specifying a start and end port of\n * a range. Some valid port specs:\n * - [8000, 8001, 8002]\n * - [[8000, 8005]]\n * - [8000, [9000, 9100]]\n * @param {Object?} log Logger instance\n *\n * @return {number} A free port\n */\nasync function getChromedriverPort (portSpec, log = null) {\n const getPort = B.promisify(PortFinder.getPort, {context: PortFinder});\n\n // if the user didn't give us any specific information about chromedriver\n // port ranges, just find any free port\n if (!portSpec) {\n const port = await getPort();\n log?.debug(`A port was not given, using random free port: ${port}`);\n return port;\n }\n\n // otherwise find the free port based on a list or range provided by the user\n log?.debug(`Finding a free port for chromedriver using spec ${JSON.stringify(portSpec)}`);\n let foundPort = null;\n for (const potentialPort of portSpec) {\n let port, stopPort;\n if (_.isArray(potentialPort)) {\n ([port, stopPort] = potentialPort);\n } else {\n port = parseInt(potentialPort, 10); // ensure we have a number and not a string\n stopPort = port;\n }\n try {\n log?.debug(`Checking port range ${port}:${stopPort}`);\n foundPort = await getPort({port, stopPort});\n break;\n } catch (e) {\n log?.debug(`Nothing in port range ${port}:${stopPort} was available`);\n }\n }\n\n if (foundPort === null) {\n throw new Error(`Could not find a free port for chromedriver using ` +\n `chromedriverPorts spec ${JSON.stringify(portSpec)}`);\n }\n\n log?.debug(`Using free port ${foundPort} for chromedriver`);\n return foundPort;\n}\n\nhelpers.isChromedriverAutodownloadEnabled = function isChromedriverAutodownloadEnabled () {\n if (this.isFeatureEnabled(CHROMEDRIVER_AUTODOWNLOAD_FEATURE)) {\n return true;\n }\n this?.log?.debug(`Automated Chromedriver download is disabled. ` +\n `Use '${CHROMEDRIVER_AUTODOWNLOAD_FEATURE}' server feature to enable it`);\n return false;\n};\n\nhelpers.setupNewChromedriver = async function setupNewChromedriver (opts, curDeviceId, adb, context = null) {\n if (opts.chromeDriverPort) {\n this?.log?.warn(`The 'chromeDriverPort' capability is deprecated. Please use 'chromedriverPort' instead`);\n opts.chromedriverPort = opts.chromeDriverPort;\n }\n\n if (opts.chromedriverPort) {\n this?.log?.debug(`Using user-specified port ${opts.chromedriverPort} for chromedriver`);\n } else {\n // if a single port wasn't given, we'll look for a free one\n opts.chromedriverPort = await getChromedriverPort(opts.chromedriverPorts, this?.log);\n }\n\n const details = context ? webviewHelpers.getWebviewDetails(adb, context) : undefined;\n if (!_.isEmpty(details)) {\n this?.log?.debug('Passing web view details to the Chromedriver constructor: ' +\n JSON.stringify(details, null, 2));\n }\n\n const chromedriver = new Chromedriver({\n port: opts.chromedriverPort,\n executable: opts.chromedriverExecutable,\n adb,\n cmdArgs: opts.chromedriverArgs,\n verbose: !!opts.showChromedriverLog,\n executableDir: opts.chromedriverExecutableDir,\n mappingPath: opts.chromedriverChromeMappingFile,\n bundleId: opts.chromeBundleId,\n useSystemExecutable: opts.chromedriverUseSystemExecutable,\n disableBuildCheck: opts.chromedriverDisableBuildCheck,\n details,\n isAutodownloadEnabled: this?.isChromedriverAutodownloadEnabled?.()\n });\n\n // make sure there are chromeOptions\n opts.chromeOptions = opts.chromeOptions || {};\n // try out any prefixed chromeOptions,\n // and strip the prefix\n for (const opt of _.keys(opts)) {\n if (opt.endsWith(':chromeOptions')) {\n this?.log?.warn(`Merging '${opt}' into 'chromeOptions'. This may cause unexpected behavior`);\n _.merge(opts.chromeOptions, opts[opt]);\n }\n }\n\n const caps = webviewHelpers.createChromedriverCaps(opts, curDeviceId, details);\n this?.log?.debug(`Before starting chromedriver, androidPackage is '${caps.chromeOptions.androidPackage}'`);\n await chromedriver.start(caps);\n return chromedriver;\n};\nconst setupNewChromedriver = helpers.setupNewChromedriver;\n\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers, setupNewChromedriver };\nexport default extensions;\n"],"mappings":"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"}
@@ -4,12 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.commands = void 0;
7
-
8
7
  require("source-map-support/register");
9
-
10
8
  const commands = {};
11
9
  exports.commands = commands;
12
-
13
10
  commands.endCoverage = async function endCoverage(intentToBroadcast, ecOnDevicePath) {
14
11
  try {
15
12
  await this.adb.rimraf(ecOnDevicePath);
@@ -18,10 +15,8 @@ commands.endCoverage = async function endCoverage(intentToBroadcast, ecOnDeviceP
18
15
  } catch (err) {
19
16
  this.log.warn(`Error ending test coverage: ${err.message}`);
20
17
  }
21
-
22
18
  return '';
23
19
  };
24
-
25
20
  var _default = commands;
26
21
  exports.default = _default;
27
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImVuZENvdmVyYWdlIiwiaW50ZW50VG9Ccm9hZGNhc3QiLCJlY09uRGV2aWNlUGF0aCIsImFkYiIsInJpbXJhZiIsImJyb2FkY2FzdFByb2Nlc3NFbmQiLCJhcHBQcm9jZXNzIiwicHVsbEZpbGUiLCJlcnIiLCJsb2ciLCJ3YXJuIiwibWVzc2FnZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9jb3ZlcmFnZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBjb21tYW5kcyA9IHt9O1xuXG5cbmNvbW1hbmRzLmVuZENvdmVyYWdlID0gYXN5bmMgZnVuY3Rpb24gZW5kQ292ZXJhZ2UgKGludGVudFRvQnJvYWRjYXN0LCBlY09uRGV2aWNlUGF0aCkge1xuICB0cnkge1xuICAgIC8vIGVuc3VyZSB0aGUgZWMgd2UncmUgcHVsbGluZyBpcyBuZXdseSBjcmVhdGVkIGFzIGEgcmVzdWx0IG9mIHRoZSBpbnRlbnQuXG4gICAgYXdhaXQgdGhpcy5hZGIucmltcmFmKGVjT25EZXZpY2VQYXRoKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RQcm9jZXNzRW5kKGludGVudFRvQnJvYWRjYXN0LCB0aGlzLmFwcFByb2Nlc3MpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnB1bGxGaWxlKGVjT25EZXZpY2VQYXRoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5sb2cud2FybihgRXJyb3IgZW5kaW5nIHRlc3QgY292ZXJhZ2U6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuICcnO1xufTtcblxuXG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE1BQU1BLFFBQVEsR0FBRyxFQUFqQjs7O0FBR0FBLFFBQVEsQ0FBQ0MsV0FBVCxHQUF1QixlQUFlQSxXQUFmLENBQTRCQyxpQkFBNUIsRUFBK0NDLGNBQS9DLEVBQStEO0VBQ3BGLElBQUk7SUFFRixNQUFNLEtBQUtDLEdBQUwsQ0FBU0MsTUFBVCxDQUFnQkYsY0FBaEIsQ0FBTjtJQUNBLE1BQU0sS0FBS0MsR0FBTCxDQUFTRSxtQkFBVCxDQUE2QkosaUJBQTdCLEVBQWdELEtBQUtLLFVBQXJELENBQU47SUFDQSxPQUFPLE1BQU0sS0FBS0MsUUFBTCxDQUFjTCxjQUFkLENBQWI7RUFDRCxDQUxELENBS0UsT0FBT00sR0FBUCxFQUFZO0lBQ1osS0FBS0MsR0FBTCxDQUFTQyxJQUFULENBQWUsK0JBQThCRixHQUFHLENBQUNHLE9BQVEsRUFBekQ7RUFDRDs7RUFDRCxPQUFPLEVBQVA7QUFDRCxDQVZEOztlQWNlWixRIn0=
22
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImVuZENvdmVyYWdlIiwiaW50ZW50VG9Ccm9hZGNhc3QiLCJlY09uRGV2aWNlUGF0aCIsImFkYiIsInJpbXJhZiIsImJyb2FkY2FzdFByb2Nlc3NFbmQiLCJhcHBQcm9jZXNzIiwicHVsbEZpbGUiLCJlcnIiLCJsb2ciLCJ3YXJuIiwibWVzc2FnZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9jb3ZlcmFnZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBjb21tYW5kcyA9IHt9O1xuXG5cbmNvbW1hbmRzLmVuZENvdmVyYWdlID0gYXN5bmMgZnVuY3Rpb24gZW5kQ292ZXJhZ2UgKGludGVudFRvQnJvYWRjYXN0LCBlY09uRGV2aWNlUGF0aCkge1xuICB0cnkge1xuICAgIC8vIGVuc3VyZSB0aGUgZWMgd2UncmUgcHVsbGluZyBpcyBuZXdseSBjcmVhdGVkIGFzIGEgcmVzdWx0IG9mIHRoZSBpbnRlbnQuXG4gICAgYXdhaXQgdGhpcy5hZGIucmltcmFmKGVjT25EZXZpY2VQYXRoKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RQcm9jZXNzRW5kKGludGVudFRvQnJvYWRjYXN0LCB0aGlzLmFwcFByb2Nlc3MpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnB1bGxGaWxlKGVjT25EZXZpY2VQYXRoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5sb2cud2FybihgRXJyb3IgZW5kaW5nIHRlc3QgY292ZXJhZ2U6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuICcnO1xufTtcblxuXG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxNQUFNQSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQUM7QUFHcEJBLFFBQVEsQ0FBQ0MsV0FBVyxHQUFHLGVBQWVBLFdBQVcsQ0FBRUMsaUJBQWlCLEVBQUVDLGNBQWMsRUFBRTtFQUNwRixJQUFJO0lBRUYsTUFBTSxJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsTUFBTSxDQUFDRixjQUFjLENBQUM7SUFDckMsTUFBTSxJQUFJLENBQUNDLEdBQUcsQ0FBQ0UsbUJBQW1CLENBQUNKLGlCQUFpQixFQUFFLElBQUksQ0FBQ0ssVUFBVSxDQUFDO0lBQ3RFLE9BQU8sTUFBTSxJQUFJLENBQUNDLFFBQVEsQ0FBQ0wsY0FBYyxDQUFDO0VBQzVDLENBQUMsQ0FBQyxPQUFPTSxHQUFHLEVBQUU7SUFDWixJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsSUFBSSxDQUFFLCtCQUE4QkYsR0FBRyxDQUFDRyxPQUFRLEVBQUMsQ0FBQztFQUM3RDtFQUNBLE9BQU8sRUFBRTtBQUNYLENBQUM7QUFBQyxlQUlhWixRQUFRO0FBQUEifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"coverage.js","names":["commands","endCoverage","intentToBroadcast","ecOnDevicePath","adb","rimraf","broadcastProcessEnd","appProcess","pullFile","err","log","warn","message"],"sources":["../../../lib/commands/coverage.js"],"sourcesContent":["const commands = {};\n\n\ncommands.endCoverage = async function endCoverage (intentToBroadcast, ecOnDevicePath) {\n try {\n // ensure the ec we're pulling is newly created as a result of the intent.\n await this.adb.rimraf(ecOnDevicePath);\n await this.adb.broadcastProcessEnd(intentToBroadcast, this.appProcess);\n return await this.pullFile(ecOnDevicePath);\n } catch (err) {\n this.log.warn(`Error ending test coverage: ${err.message}`);\n }\n return '';\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":";;;;;;;;;AAAA,MAAMA,QAAQ,GAAG,EAAjB;;;AAGAA,QAAQ,CAACC,WAAT,GAAuB,eAAeA,WAAf,CAA4BC,iBAA5B,EAA+CC,cAA/C,EAA+D;EACpF,IAAI;IAEF,MAAM,KAAKC,GAAL,CAASC,MAAT,CAAgBF,cAAhB,CAAN;IACA,MAAM,KAAKC,GAAL,CAASE,mBAAT,CAA6BJ,iBAA7B,EAAgD,KAAKK,UAArD,CAAN;IACA,OAAO,MAAM,KAAKC,QAAL,CAAcL,cAAd,CAAb;EACD,CALD,CAKE,OAAOM,GAAP,EAAY;IACZ,KAAKC,GAAL,CAASC,IAAT,CAAe,+BAA8BF,GAAG,CAACG,OAAQ,EAAzD;EACD;;EACD,OAAO,EAAP;AACD,CAVD;;eAceZ,Q"}
1
+ {"version":3,"file":"coverage.js","names":["commands","endCoverage","intentToBroadcast","ecOnDevicePath","adb","rimraf","broadcastProcessEnd","appProcess","pullFile","err","log","warn","message"],"sources":["../../../lib/commands/coverage.js"],"sourcesContent":["const commands = {};\n\n\ncommands.endCoverage = async function endCoverage (intentToBroadcast, ecOnDevicePath) {\n try {\n // ensure the ec we're pulling is newly created as a result of the intent.\n await this.adb.rimraf(ecOnDevicePath);\n await this.adb.broadcastProcessEnd(intentToBroadcast, this.appProcess);\n return await this.pullFile(ecOnDevicePath);\n } catch (err) {\n this.log.warn(`Error ending test coverage: ${err.message}`);\n }\n return '';\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":";;;;;;;AAAA,MAAMA,QAAQ,GAAG,CAAC,CAAC;AAAC;AAGpBA,QAAQ,CAACC,WAAW,GAAG,eAAeA,WAAW,CAAEC,iBAAiB,EAAEC,cAAc,EAAE;EACpF,IAAI;IAEF,MAAM,IAAI,CAACC,GAAG,CAACC,MAAM,CAACF,cAAc,CAAC;IACrC,MAAM,IAAI,CAACC,GAAG,CAACE,mBAAmB,CAACJ,iBAAiB,EAAE,IAAI,CAACK,UAAU,CAAC;IACtE,OAAO,MAAM,IAAI,CAACC,QAAQ,CAACL,cAAc,CAAC;EAC5C,CAAC,CAAC,OAAOM,GAAG,EAAE;IACZ,IAAI,CAACC,GAAG,CAACC,IAAI,CAAE,+BAA8BF,GAAG,CAACG,OAAQ,EAAC,CAAC;EAC7D;EACA,OAAO,EAAE;AACX,CAAC;AAAC,eAIaZ,QAAQ;AAAA"}
@@ -1,26 +1,19 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.helpers = exports.default = exports.commands = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _androidHelpers = _interopRequireDefault(require("../android-helpers"));
13
-
14
10
  var _asyncbox = require("asyncbox");
15
-
16
11
  var _support = require("appium/support");
17
-
18
12
  let commands = {},
19
- helpers = {},
20
- extensions = {};
13
+ helpers = {},
14
+ extensions = {};
21
15
  exports.helpers = helpers;
22
16
  exports.commands = commands;
23
-
24
17
  commands.getAttribute = async function getAttribute(attribute, elementId) {
25
18
  let p = {
26
19
  attribute,
@@ -28,30 +21,23 @@ commands.getAttribute = async function getAttribute(attribute, elementId) {
28
21
  };
29
22
  return await this.bootstrap.sendAction('element:getAttribute', p);
30
23
  };
31
-
32
24
  commands.getName = async function getName(elementId) {
33
25
  return await this.getAttribute('className', elementId);
34
26
  };
35
-
36
27
  commands.elementDisplayed = async function elementDisplayed(elementId) {
37
28
  return (await this.getAttribute('displayed', elementId)) === 'true';
38
29
  };
39
-
40
30
  commands.elementEnabled = async function elementEnabled(elementId) {
41
31
  return (await this.getAttribute('enabled', elementId)) === 'true';
42
32
  };
43
-
44
33
  commands.elementSelected = async function elementSelected(elementId) {
45
34
  return (await this.getAttribute('selected', elementId)) === 'true';
46
35
  };
47
-
48
36
  helpers.setElementValue = async function setElementValue(keys, elementId, replace = false) {
49
37
  let text = keys;
50
-
51
38
  if (keys instanceof Array) {
52
39
  text = keys.join('');
53
40
  }
54
-
55
41
  let params = {
56
42
  elementId,
57
43
  text,
@@ -64,45 +50,37 @@ helpers.setElementValue = async function setElementValue(keys, elementId, replac
64
50
  helpers.doSetElementValue = async function doSetElementValue(params) {
65
51
  return await this.bootstrap.sendAction('element:setText', params);
66
52
  };
67
-
68
53
  commands.setValue = async function setValue(keys, elementId) {
69
54
  return await this.setElementValue(keys, elementId, false);
70
55
  };
71
-
72
56
  commands.replaceValue = async function replaceValue(keys, elementId) {
73
57
  return await this.setElementValue(keys, elementId, true);
74
58
  };
75
-
76
59
  commands.setValueImmediate = async function setValueImmediate(keys, elementId) {
77
60
  let text = keys;
78
-
79
61
  if (keys instanceof Array) {
80
62
  text = keys.join('');
81
63
  }
82
64
 
83
65
  await this.click(elementId);
66
+
84
67
  await this.adb.inputText(text);
85
68
  };
86
-
87
69
  commands.getText = async function getText(elementId) {
88
70
  return await this.bootstrap.sendAction('element:getText', {
89
71
  elementId
90
72
  });
91
73
  };
92
-
93
74
  commands.clear = async function clear(elementId) {
94
75
  let text = (await this.getText(elementId)) || '';
95
76
  let length = text.length;
96
-
97
77
  if (length === 0) {
98
78
  length = 100;
99
79
  }
100
-
101
80
  await this.click(elementId);
102
81
  this.log.debug(`Sending up to ${length} clear characters to device`);
103
82
  return await (0, _asyncbox.retryInterval)(5, 500, async () => {
104
83
  let remainingLength = length;
105
-
106
84
  while (remainingLength > 0) {
107
85
  let lengthToSend = remainingLength < 50 ? remainingLength : 50;
108
86
  this.log.debug(`Sending ${lengthToSend} clear characters to device`);
@@ -111,35 +89,29 @@ commands.clear = async function clear(elementId) {
111
89
  }
112
90
  });
113
91
  };
114
-
115
92
  commands.click = async function click(elementId) {
116
93
  return await this.bootstrap.sendAction('element:click', {
117
94
  elementId
118
95
  });
119
96
  };
120
-
121
97
  commands.getLocation = async function getLocation(elementId) {
122
98
  return await this.bootstrap.sendAction('element:getLocation', {
123
99
  elementId
124
100
  });
125
101
  };
126
-
127
102
  commands.getLocationInView = async function getLocationInView(elementId) {
128
103
  return await this.getLocation(elementId);
129
104
  };
130
-
131
105
  commands.getSize = async function getSize(elementId) {
132
106
  return await this.bootstrap.sendAction('element:getSize', {
133
107
  elementId
134
108
  });
135
109
  };
136
-
137
110
  commands.getElementRect = async function getElementRect(elementId) {
138
111
  return await this.bootstrap.sendAction('element:getRect', {
139
112
  elementId
140
113
  });
141
114
  };
142
-
143
115
  commands.touchLongClick = async function touchLongClick(elementId, x, y, duration) {
144
116
  let params = {
145
117
  elementId,
@@ -147,60 +119,46 @@ commands.touchLongClick = async function touchLongClick(elementId, x, y, duratio
147
119
  y,
148
120
  duration
149
121
  };
150
-
151
122
  _androidHelpers.default.removeNullProperties(params);
152
-
153
123
  return await this.bootstrap.sendAction('element:touchLongClick', params);
154
124
  };
155
-
156
125
  commands.touchDown = async function touchDown(elementId, x, y) {
157
126
  let params = {
158
127
  elementId,
159
128
  x,
160
129
  y
161
130
  };
162
-
163
131
  _androidHelpers.default.removeNullProperties(params);
164
-
165
132
  return await this.bootstrap.sendAction('element:touchDown', params);
166
133
  };
167
-
168
134
  commands.touchUp = async function touchUp(elementId, x, y) {
169
135
  let params = {
170
136
  elementId,
171
137
  x,
172
138
  y
173
139
  };
174
-
175
140
  _androidHelpers.default.removeNullProperties(params);
176
-
177
141
  return await this.bootstrap.sendAction('element:touchUp', params);
178
142
  };
179
-
180
143
  commands.touchMove = async function touchMove(elementId, x, y) {
181
144
  let params = {
182
145
  elementId,
183
146
  x,
184
147
  y
185
148
  };
186
-
187
149
  _androidHelpers.default.removeNullProperties(params);
188
-
189
150
  return await this.bootstrap.sendAction('element:touchMove', params);
190
151
  };
191
-
192
152
  commands.complexTap = async function complexTap(tapCount, touchCount, duration, x, y) {
193
153
  return await this.bootstrap.sendAction('click', {
194
154
  x,
195
155
  y
196
156
  });
197
157
  };
198
-
199
158
  commands.tap = async function (elementId = null, x = null, y = null, count = 1) {
200
159
  if (!_support.util.hasValue(elementId) && !_support.util.hasValue(x) && !_support.util.hasValue(y)) {
201
160
  throw new Error(`Either element to tap or both absolute coordinates should be defined`);
202
161
  }
203
-
204
162
  for (let i = 0; i < count; i++) {
205
163
  if (_support.util.hasValue(elementId)) {
206
164
  await this.bootstrap.sendAction('element:click', {
@@ -216,8 +174,7 @@ commands.tap = async function (elementId = null, x = null, y = null, count = 1)
216
174
  }
217
175
  }
218
176
  };
219
-
220
177
  Object.assign(extensions, commands, helpers);
221
178
  var _default = extensions;
222
179
  exports.default = _default;
223
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZ2V0QXR0cmlidXRlIiwiYXR0cmlidXRlIiwiZWxlbWVudElkIiwicCIsImJvb3RzdHJhcCIsInNlbmRBY3Rpb24iLCJnZXROYW1lIiwiZWxlbWVudERpc3BsYXllZCIsImVsZW1lbnRFbmFibGVkIiwiZWxlbWVudFNlbGVjdGVkIiwic2V0RWxlbWVudFZhbHVlIiwia2V5cyIsInJlcGxhY2UiLCJ0ZXh0IiwiQXJyYXkiLCJqb2luIiwicGFyYW1zIiwidW5pY29kZUtleWJvYXJkIiwib3B0cyIsImRvU2V0RWxlbWVudFZhbHVlIiwic2V0VmFsdWUiLCJyZXBsYWNlVmFsdWUiLCJzZXRWYWx1ZUltbWVkaWF0ZSIsImNsaWNrIiwiYWRiIiwiaW5wdXRUZXh0IiwiZ2V0VGV4dCIsImNsZWFyIiwibGVuZ3RoIiwibG9nIiwiZGVidWciLCJyZXRyeUludGVydmFsIiwicmVtYWluaW5nTGVuZ3RoIiwibGVuZ3RoVG9TZW5kIiwiY2xlYXJUZXh0RmllbGQiLCJnZXRMb2NhdGlvbiIsImdldExvY2F0aW9uSW5WaWV3IiwiZ2V0U2l6ZSIsImdldEVsZW1lbnRSZWN0IiwidG91Y2hMb25nQ2xpY2siLCJ4IiwieSIsImR1cmF0aW9uIiwiYW5kcm9pZEhlbHBlcnMiLCJyZW1vdmVOdWxsUHJvcGVydGllcyIsInRvdWNoRG93biIsInRvdWNoVXAiLCJ0b3VjaE1vdmUiLCJjb21wbGV4VGFwIiwidGFwQ291bnQiLCJ0b3VjaENvdW50IiwidGFwIiwiY291bnQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJFcnJvciIsImkiLCJPYmplY3QiLCJhc3NpZ24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZWxlbWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYW5kcm9pZEhlbHBlcnMgZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuXG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29tbWFuZHMuZ2V0QXR0cmlidXRlID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXR0cmlidXRlIChhdHRyaWJ1dGUsIGVsZW1lbnRJZCkge1xuICBsZXQgcCA9IHthdHRyaWJ1dGUsIGVsZW1lbnRJZH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OmdldEF0dHJpYnV0ZScsIHApO1xufTtcblxuY29tbWFuZHMuZ2V0TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hbWUgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ2NsYXNzTmFtZScsIGVsZW1lbnRJZCk7XG59O1xuXG5jb21tYW5kcy5lbGVtZW50RGlzcGxheWVkID0gYXN5bmMgZnVuY3Rpb24gZWxlbWVudERpc3BsYXllZCAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldEF0dHJpYnV0ZSgnZGlzcGxheWVkJywgZWxlbWVudElkKSA9PT0gJ3RydWUnO1xufTtcblxuY29tbWFuZHMuZWxlbWVudEVuYWJsZWQgPSBhc3luYyBmdW5jdGlvbiBlbGVtZW50RW5hYmxlZCAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldEF0dHJpYnV0ZSgnZW5hYmxlZCcsIGVsZW1lbnRJZCkgPT09ICd0cnVlJztcbn07XG5cbmNvbW1hbmRzLmVsZW1lbnRTZWxlY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIGVsZW1lbnRTZWxlY3RlZCAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnLCBlbGVtZW50SWQpID09PSAndHJ1ZSc7XG59O1xuXG5oZWxwZXJzLnNldEVsZW1lbnRWYWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldEVsZW1lbnRWYWx1ZSAoa2V5cywgZWxlbWVudElkLCByZXBsYWNlID0gZmFsc2UpIHtcbiAgbGV0IHRleHQgPSBrZXlzO1xuICBpZiAoa2V5cyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgdGV4dCA9IGtleXMuam9pbignJyk7XG4gIH1cblxuICBsZXQgcGFyYW1zID0ge1xuICAgIGVsZW1lbnRJZCxcbiAgICB0ZXh0LFxuICAgIHJlcGxhY2UsXG4gICAgdW5pY29kZUtleWJvYXJkOiB0aGlzLm9wdHMudW5pY29kZUtleWJvYXJkXG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZG9TZXRFbGVtZW50VmFsdWUocGFyYW1zKTtcbn07XG5cbi8qKlxuICogUmVhc29uIGZvciBpc29sYXRpbmcgZG9TZXRFbGVtZW50VmFsdWUgZnJvbSBzZXRFbGVtZW50VmFsdWUgaXMgZm9yIHJldXNpbmcgc2V0RWxlbWVudFZhbHVlXG4gKiBhY3Jvc3MgYW5kcm9pZC1kcml2ZXJzIChsaWtlIGFwcGl1bS11aWF1dG9tYXRvcjItZHJpdmVyKSBhbmQgdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbi5cbiAqIE90aGVyIGFuZHJvaWQtZHJpdmVycyAobGlrZSBhcHBpdW0tdWlhdXRvbWF0b3IyLWRyaXZlcikgbmVlZCB0byBvdmVycmlkZSBkb1NldEVsZW1lbnRWYWx1ZVxuICogdG8gZmFjaWxpdGF0ZSBzZXRFbGVtZW50VmFsdWUuXG4gKi9cbmhlbHBlcnMuZG9TZXRFbGVtZW50VmFsdWUgPSBhc3luYyBmdW5jdGlvbiBkb1NldEVsZW1lbnRWYWx1ZSAocGFyYW1zKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnNldFRleHQnLCBwYXJhbXMpO1xufTtcblxuY29tbWFuZHMuc2V0VmFsdWUgPSBhc3luYyBmdW5jdGlvbiBzZXRWYWx1ZSAoa2V5cywgZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNldEVsZW1lbnRWYWx1ZShrZXlzLCBlbGVtZW50SWQsIGZhbHNlKTtcbn07XG5cbmNvbW1hbmRzLnJlcGxhY2VWYWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VWYWx1ZSAoa2V5cywgZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNldEVsZW1lbnRWYWx1ZShrZXlzLCBlbGVtZW50SWQsIHRydWUpO1xufTtcblxuY29tbWFuZHMuc2V0VmFsdWVJbW1lZGlhdGUgPSBhc3luYyBmdW5jdGlvbiBzZXRWYWx1ZUltbWVkaWF0ZSAoa2V5cywgZWxlbWVudElkKSB7XG4gIGxldCB0ZXh0ID0ga2V5cztcbiAgaWYgKGtleXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHRleHQgPSBrZXlzLmpvaW4oJycpO1xuICB9XG5cbiAgLy8gZmlyc3QsIG1ha2Ugc3VyZSB3ZSBhcmUgZm9jdXNlZCBvbiB0aGUgZWxlbWVudFxuICBhd2FpdCB0aGlzLmNsaWNrKGVsZW1lbnRJZCk7XG5cbiAgLy8gdGhlbiBzZW5kIHRocm91Z2ggYWRiXG4gIGF3YWl0IHRoaXMuYWRiLmlucHV0VGV4dCh0ZXh0KTtcbn07XG5cbmNvbW1hbmRzLmdldFRleHQgPSBhc3luYyBmdW5jdGlvbiBnZXRUZXh0IChlbGVtZW50SWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6Z2V0VGV4dCcsIHtlbGVtZW50SWR9KTtcbn07XG5cbmNvbW1hbmRzLmNsZWFyID0gYXN5bmMgZnVuY3Rpb24gY2xlYXIgKGVsZW1lbnRJZCkge1xuICBsZXQgdGV4dCA9IChhd2FpdCB0aGlzLmdldFRleHQoZWxlbWVudElkKSkgfHwgJyc7XG4gIGxldCBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcbiAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgIC8vIGlmIGxlbmd0aCBpcyB6ZXJvIHRoZXJlIGFyZSB0d28gcG9zc2liaWxpdGllczpcbiAgICAvLyAgIDEuIHRoZXJlIGlzIG5vdGhpbmcgaW4gdGhlIHRleHQgZmllbGRcbiAgICAvLyAgIDIuIGl0IGlzIGEgcGFzc3dvcmQgZmllbGRcbiAgICAvLyBzaW5jZSB0aGVyZSBpcyBsaXR0bGUgb3ZlcmhlYWQgdG8gdGhlIGFkYiBjYWxsLCBkZWxldGUgMTAwIGVsZW1lbnRzXG4gICAgLy8gaWYgd2UgZ2V0IHplcm8sIGp1c3QgaW4gY2FzZSBpdCBpcyAjMlxuICAgIGxlbmd0aCA9IDEwMDtcbiAgfVxuICBhd2FpdCB0aGlzLmNsaWNrKGVsZW1lbnRJZCk7XG4gIHRoaXMubG9nLmRlYnVnKGBTZW5kaW5nIHVwIHRvICR7bGVuZ3RofSBjbGVhciBjaGFyYWN0ZXJzIHRvIGRldmljZWApO1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbCg1LCA1MDAsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgcmVtYWluaW5nTGVuZ3RoID0gbGVuZ3RoO1xuICAgIHdoaWxlIChyZW1haW5pbmdMZW5ndGggPiAwKSB7XG4gICAgICBsZXQgbGVuZ3RoVG9TZW5kID0gcmVtYWluaW5nTGVuZ3RoIDwgNTAgPyByZW1haW5pbmdMZW5ndGggOiA1MDtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZW5kaW5nICR7bGVuZ3RoVG9TZW5kfSBjbGVhciBjaGFyYWN0ZXJzIHRvIGRldmljZWApO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuY2xlYXJUZXh0RmllbGQobGVuZ3RoVG9TZW5kKTtcbiAgICAgIHJlbWFpbmluZ0xlbmd0aCAtPSBsZW5ndGhUb1NlbmQ7XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbW1hbmRzLmNsaWNrID0gYXN5bmMgZnVuY3Rpb24gY2xpY2sgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpjbGljaycsIHtlbGVtZW50SWR9KTtcbn07XG5cbmNvbW1hbmRzLmdldExvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYXRpb24gKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpnZXRMb2NhdGlvbicsIHtlbGVtZW50SWR9KTtcbn07XG5cbmNvbW1hbmRzLmdldExvY2F0aW9uSW5WaWV3ID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYXRpb25JblZpZXcgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbGVtZW50SWQpO1xufTtcblxuY29tbWFuZHMuZ2V0U2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNpemUgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpnZXRTaXplJywge2VsZW1lbnRJZH0pO1xufTtcblxuY29tbWFuZHMuZ2V0RWxlbWVudFJlY3QgPSBhc3luYyBmdW5jdGlvbiBnZXRFbGVtZW50UmVjdCAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OmdldFJlY3QnLCB7ZWxlbWVudElkfSk7XG59O1xuXG5jb21tYW5kcy50b3VjaExvbmdDbGljayA9IGFzeW5jIGZ1bmN0aW9uIHRvdWNoTG9uZ0NsaWNrIChlbGVtZW50SWQsIHgsIHksIGR1cmF0aW9uKSB7XG4gIGxldCBwYXJhbXMgPSB7ZWxlbWVudElkLCB4LCB5LCBkdXJhdGlvbn07XG4gIGFuZHJvaWRIZWxwZXJzLnJlbW92ZU51bGxQcm9wZXJ0aWVzKHBhcmFtcyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnRvdWNoTG9uZ0NsaWNrJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLnRvdWNoRG93biA9IGFzeW5jIGZ1bmN0aW9uIHRvdWNoRG93biAoZWxlbWVudElkLCB4LCB5KSB7XG4gIGxldCBwYXJhbXMgPSB7ZWxlbWVudElkLCB4LCB5fTtcbiAgYW5kcm9pZEhlbHBlcnMucmVtb3ZlTnVsbFByb3BlcnRpZXMocGFyYW1zKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6dG91Y2hEb3duJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLnRvdWNoVXAgPSBhc3luYyBmdW5jdGlvbiB0b3VjaFVwIChlbGVtZW50SWQsIHgsIHkpIHtcbiAgbGV0IHBhcmFtcyA9IHtlbGVtZW50SWQsIHgsIHl9O1xuICBhbmRyb2lkSGVscGVycy5yZW1vdmVOdWxsUHJvcGVydGllcyhwYXJhbXMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDp0b3VjaFVwJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLnRvdWNoTW92ZSA9IGFzeW5jIGZ1bmN0aW9uIHRvdWNoTW92ZSAoZWxlbWVudElkLCB4LCB5KSB7XG4gIGxldCBwYXJhbXMgPSB7ZWxlbWVudElkLCB4LCB5fTtcbiAgYW5kcm9pZEhlbHBlcnMucmVtb3ZlTnVsbFByb3BlcnRpZXMocGFyYW1zKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6dG91Y2hNb3ZlJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLmNvbXBsZXhUYXAgPSBhc3luYyBmdW5jdGlvbiBjb21wbGV4VGFwICh0YXBDb3VudCwgdG91Y2hDb3VudCwgZHVyYXRpb24sIHgsIHkpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2NsaWNrJywge3gsIHl9KTtcbn07XG5cbmNvbW1hbmRzLnRhcCA9IGFzeW5jIGZ1bmN0aW9uIChlbGVtZW50SWQgPSBudWxsLCB4ID0gbnVsbCwgeSA9IG51bGwsIGNvdW50ID0gMSkge1xuICBpZiAoIXV0aWwuaGFzVmFsdWUoZWxlbWVudElkKSAmJiAhdXRpbC5oYXNWYWx1ZSh4KSAmJiAhdXRpbC5oYXNWYWx1ZSh5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRWl0aGVyIGVsZW1lbnQgdG8gdGFwIG9yIGJvdGggYWJzb2x1dGUgY29vcmRpbmF0ZXMgc2hvdWxkIGJlIGRlZmluZWRgKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBpZiAodXRpbC5oYXNWYWx1ZShlbGVtZW50SWQpKSB7XG4gICAgICAvLyBGSVhNRTogYm9vdHN0cmFwIGlnbm9yZXMgcmVsYXRpdmUgY29vcmRpbmF0ZXNcbiAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6Y2xpY2snLCB7ZWxlbWVudElkLCB4LCB5fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2NsaWNrJywge3gsIHl9KTtcbiAgICB9XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBR0EsSUFBSUEsUUFBUSxHQUFHLEVBQWY7QUFBQSxJQUFtQkMsT0FBTyxHQUFHLEVBQTdCO0FBQUEsSUFBaUNDLFVBQVUsR0FBRyxFQUE5Qzs7OztBQUVBRixRQUFRLENBQUNHLFlBQVQsR0FBd0IsZUFBZUEsWUFBZixDQUE2QkMsU0FBN0IsRUFBd0NDLFNBQXhDLEVBQW1EO0VBQ3pFLElBQUlDLENBQUMsR0FBRztJQUFDRixTQUFEO0lBQVlDO0VBQVosQ0FBUjtFQUNBLE9BQU8sTUFBTSxLQUFLRSxTQUFMLENBQWVDLFVBQWYsQ0FBMEIsc0JBQTFCLEVBQWtERixDQUFsRCxDQUFiO0FBQ0QsQ0FIRDs7QUFLQU4sUUFBUSxDQUFDUyxPQUFULEdBQW1CLGVBQWVBLE9BQWYsQ0FBd0JKLFNBQXhCLEVBQW1DO0VBQ3BELE9BQU8sTUFBTSxLQUFLRixZQUFMLENBQWtCLFdBQWxCLEVBQStCRSxTQUEvQixDQUFiO0FBQ0QsQ0FGRDs7QUFJQUwsUUFBUSxDQUFDVSxnQkFBVCxHQUE0QixlQUFlQSxn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
180
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZ2V0QXR0cmlidXRlIiwiYXR0cmlidXRlIiwiZWxlbWVudElkIiwicCIsImJvb3RzdHJhcCIsInNlbmRBY3Rpb24iLCJnZXROYW1lIiwiZWxlbWVudERpc3BsYXllZCIsImVsZW1lbnRFbmFibGVkIiwiZWxlbWVudFNlbGVjdGVkIiwic2V0RWxlbWVudFZhbHVlIiwia2V5cyIsInJlcGxhY2UiLCJ0ZXh0IiwiQXJyYXkiLCJqb2luIiwicGFyYW1zIiwidW5pY29kZUtleWJvYXJkIiwib3B0cyIsImRvU2V0RWxlbWVudFZhbHVlIiwic2V0VmFsdWUiLCJyZXBsYWNlVmFsdWUiLCJzZXRWYWx1ZUltbWVkaWF0ZSIsImNsaWNrIiwiYWRiIiwiaW5wdXRUZXh0IiwiZ2V0VGV4dCIsImNsZWFyIiwibGVuZ3RoIiwibG9nIiwiZGVidWciLCJyZXRyeUludGVydmFsIiwicmVtYWluaW5nTGVuZ3RoIiwibGVuZ3RoVG9TZW5kIiwiY2xlYXJUZXh0RmllbGQiLCJnZXRMb2NhdGlvbiIsImdldExvY2F0aW9uSW5WaWV3IiwiZ2V0U2l6ZSIsImdldEVsZW1lbnRSZWN0IiwidG91Y2hMb25nQ2xpY2siLCJ4IiwieSIsImR1cmF0aW9uIiwiYW5kcm9pZEhlbHBlcnMiLCJyZW1vdmVOdWxsUHJvcGVydGllcyIsInRvdWNoRG93biIsInRvdWNoVXAiLCJ0b3VjaE1vdmUiLCJjb21wbGV4VGFwIiwidGFwQ291bnQiLCJ0b3VjaENvdW50IiwidGFwIiwiY291bnQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJFcnJvciIsImkiLCJPYmplY3QiLCJhc3NpZ24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZWxlbWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYW5kcm9pZEhlbHBlcnMgZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuXG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29tbWFuZHMuZ2V0QXR0cmlidXRlID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXR0cmlidXRlIChhdHRyaWJ1dGUsIGVsZW1lbnRJZCkge1xuICBsZXQgcCA9IHthdHRyaWJ1dGUsIGVsZW1lbnRJZH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OmdldEF0dHJpYnV0ZScsIHApO1xufTtcblxuY29tbWFuZHMuZ2V0TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hbWUgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ2NsYXNzTmFtZScsIGVsZW1lbnRJZCk7XG59O1xuXG5jb21tYW5kcy5lbGVtZW50RGlzcGxheWVkID0gYXN5bmMgZnVuY3Rpb24gZWxlbWVudERpc3BsYXllZCAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldEF0dHJpYnV0ZSgnZGlzcGxheWVkJywgZWxlbWVudElkKSA9PT0gJ3RydWUnO1xufTtcblxuY29tbWFuZHMuZWxlbWVudEVuYWJsZWQgPSBhc3luYyBmdW5jdGlvbiBlbGVtZW50RW5hYmxlZCAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldEF0dHJpYnV0ZSgnZW5hYmxlZCcsIGVsZW1lbnRJZCkgPT09ICd0cnVlJztcbn07XG5cbmNvbW1hbmRzLmVsZW1lbnRTZWxlY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIGVsZW1lbnRTZWxlY3RlZCAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnLCBlbGVtZW50SWQpID09PSAndHJ1ZSc7XG59O1xuXG5oZWxwZXJzLnNldEVsZW1lbnRWYWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldEVsZW1lbnRWYWx1ZSAoa2V5cywgZWxlbWVudElkLCByZXBsYWNlID0gZmFsc2UpIHtcbiAgbGV0IHRleHQgPSBrZXlzO1xuICBpZiAoa2V5cyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgdGV4dCA9IGtleXMuam9pbignJyk7XG4gIH1cblxuICBsZXQgcGFyYW1zID0ge1xuICAgIGVsZW1lbnRJZCxcbiAgICB0ZXh0LFxuICAgIHJlcGxhY2UsXG4gICAgdW5pY29kZUtleWJvYXJkOiB0aGlzLm9wdHMudW5pY29kZUtleWJvYXJkXG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZG9TZXRFbGVtZW50VmFsdWUocGFyYW1zKTtcbn07XG5cbi8qKlxuICogUmVhc29uIGZvciBpc29sYXRpbmcgZG9TZXRFbGVtZW50VmFsdWUgZnJvbSBzZXRFbGVtZW50VmFsdWUgaXMgZm9yIHJldXNpbmcgc2V0RWxlbWVudFZhbHVlXG4gKiBhY3Jvc3MgYW5kcm9pZC1kcml2ZXJzIChsaWtlIGFwcGl1bS11aWF1dG9tYXRvcjItZHJpdmVyKSBhbmQgdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbi5cbiAqIE90aGVyIGFuZHJvaWQtZHJpdmVycyAobGlrZSBhcHBpdW0tdWlhdXRvbWF0b3IyLWRyaXZlcikgbmVlZCB0byBvdmVycmlkZSBkb1NldEVsZW1lbnRWYWx1ZVxuICogdG8gZmFjaWxpdGF0ZSBzZXRFbGVtZW50VmFsdWUuXG4gKi9cbmhlbHBlcnMuZG9TZXRFbGVtZW50VmFsdWUgPSBhc3luYyBmdW5jdGlvbiBkb1NldEVsZW1lbnRWYWx1ZSAocGFyYW1zKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnNldFRleHQnLCBwYXJhbXMpO1xufTtcblxuY29tbWFuZHMuc2V0VmFsdWUgPSBhc3luYyBmdW5jdGlvbiBzZXRWYWx1ZSAoa2V5cywgZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNldEVsZW1lbnRWYWx1ZShrZXlzLCBlbGVtZW50SWQsIGZhbHNlKTtcbn07XG5cbmNvbW1hbmRzLnJlcGxhY2VWYWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VWYWx1ZSAoa2V5cywgZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNldEVsZW1lbnRWYWx1ZShrZXlzLCBlbGVtZW50SWQsIHRydWUpO1xufTtcblxuY29tbWFuZHMuc2V0VmFsdWVJbW1lZGlhdGUgPSBhc3luYyBmdW5jdGlvbiBzZXRWYWx1ZUltbWVkaWF0ZSAoa2V5cywgZWxlbWVudElkKSB7XG4gIGxldCB0ZXh0ID0ga2V5cztcbiAgaWYgKGtleXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHRleHQgPSBrZXlzLmpvaW4oJycpO1xuICB9XG5cbiAgLy8gZmlyc3QsIG1ha2Ugc3VyZSB3ZSBhcmUgZm9jdXNlZCBvbiB0aGUgZWxlbWVudFxuICBhd2FpdCB0aGlzLmNsaWNrKGVsZW1lbnRJZCk7XG5cbiAgLy8gdGhlbiBzZW5kIHRocm91Z2ggYWRiXG4gIGF3YWl0IHRoaXMuYWRiLmlucHV0VGV4dCh0ZXh0KTtcbn07XG5cbmNvbW1hbmRzLmdldFRleHQgPSBhc3luYyBmdW5jdGlvbiBnZXRUZXh0IChlbGVtZW50SWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6Z2V0VGV4dCcsIHtlbGVtZW50SWR9KTtcbn07XG5cbmNvbW1hbmRzLmNsZWFyID0gYXN5bmMgZnVuY3Rpb24gY2xlYXIgKGVsZW1lbnRJZCkge1xuICBsZXQgdGV4dCA9IChhd2FpdCB0aGlzLmdldFRleHQoZWxlbWVudElkKSkgfHwgJyc7XG4gIGxldCBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcbiAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgIC8vIGlmIGxlbmd0aCBpcyB6ZXJvIHRoZXJlIGFyZSB0d28gcG9zc2liaWxpdGllczpcbiAgICAvLyAgIDEuIHRoZXJlIGlzIG5vdGhpbmcgaW4gdGhlIHRleHQgZmllbGRcbiAgICAvLyAgIDIuIGl0IGlzIGEgcGFzc3dvcmQgZmllbGRcbiAgICAvLyBzaW5jZSB0aGVyZSBpcyBsaXR0bGUgb3ZlcmhlYWQgdG8gdGhlIGFkYiBjYWxsLCBkZWxldGUgMTAwIGVsZW1lbnRzXG4gICAgLy8gaWYgd2UgZ2V0IHplcm8sIGp1c3QgaW4gY2FzZSBpdCBpcyAjMlxuICAgIGxlbmd0aCA9IDEwMDtcbiAgfVxuICBhd2FpdCB0aGlzLmNsaWNrKGVsZW1lbnRJZCk7XG4gIHRoaXMubG9nLmRlYnVnKGBTZW5kaW5nIHVwIHRvICR7bGVuZ3RofSBjbGVhciBjaGFyYWN0ZXJzIHRvIGRldmljZWApO1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbCg1LCA1MDAsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgcmVtYWluaW5nTGVuZ3RoID0gbGVuZ3RoO1xuICAgIHdoaWxlIChyZW1haW5pbmdMZW5ndGggPiAwKSB7XG4gICAgICBsZXQgbGVuZ3RoVG9TZW5kID0gcmVtYWluaW5nTGVuZ3RoIDwgNTAgPyByZW1haW5pbmdMZW5ndGggOiA1MDtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZW5kaW5nICR7bGVuZ3RoVG9TZW5kfSBjbGVhciBjaGFyYWN0ZXJzIHRvIGRldmljZWApO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuY2xlYXJUZXh0RmllbGQobGVuZ3RoVG9TZW5kKTtcbiAgICAgIHJlbWFpbmluZ0xlbmd0aCAtPSBsZW5ndGhUb1NlbmQ7XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbW1hbmRzLmNsaWNrID0gYXN5bmMgZnVuY3Rpb24gY2xpY2sgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpjbGljaycsIHtlbGVtZW50SWR9KTtcbn07XG5cbmNvbW1hbmRzLmdldExvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYXRpb24gKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpnZXRMb2NhdGlvbicsIHtlbGVtZW50SWR9KTtcbn07XG5cbmNvbW1hbmRzLmdldExvY2F0aW9uSW5WaWV3ID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYXRpb25JblZpZXcgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbGVtZW50SWQpO1xufTtcblxuY29tbWFuZHMuZ2V0U2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNpemUgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpnZXRTaXplJywge2VsZW1lbnRJZH0pO1xufTtcblxuY29tbWFuZHMuZ2V0RWxlbWVudFJlY3QgPSBhc3luYyBmdW5jdGlvbiBnZXRFbGVtZW50UmVjdCAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OmdldFJlY3QnLCB7ZWxlbWVudElkfSk7XG59O1xuXG5jb21tYW5kcy50b3VjaExvbmdDbGljayA9IGFzeW5jIGZ1bmN0aW9uIHRvdWNoTG9uZ0NsaWNrIChlbGVtZW50SWQsIHgsIHksIGR1cmF0aW9uKSB7XG4gIGxldCBwYXJhbXMgPSB7ZWxlbWVudElkLCB4LCB5LCBkdXJhdGlvbn07XG4gIGFuZHJvaWRIZWxwZXJzLnJlbW92ZU51bGxQcm9wZXJ0aWVzKHBhcmFtcyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnRvdWNoTG9uZ0NsaWNrJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLnRvdWNoRG93biA9IGFzeW5jIGZ1bmN0aW9uIHRvdWNoRG93biAoZWxlbWVudElkLCB4LCB5KSB7XG4gIGxldCBwYXJhbXMgPSB7ZWxlbWVudElkLCB4LCB5fTtcbiAgYW5kcm9pZEhlbHBlcnMucmVtb3ZlTnVsbFByb3BlcnRpZXMocGFyYW1zKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6dG91Y2hEb3duJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLnRvdWNoVXAgPSBhc3luYyBmdW5jdGlvbiB0b3VjaFVwIChlbGVtZW50SWQsIHgsIHkpIHtcbiAgbGV0IHBhcmFtcyA9IHtlbGVtZW50SWQsIHgsIHl9O1xuICBhbmRyb2lkSGVscGVycy5yZW1vdmVOdWxsUHJvcGVydGllcyhwYXJhbXMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDp0b3VjaFVwJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLnRvdWNoTW92ZSA9IGFzeW5jIGZ1bmN0aW9uIHRvdWNoTW92ZSAoZWxlbWVudElkLCB4LCB5KSB7XG4gIGxldCBwYXJhbXMgPSB7ZWxlbWVudElkLCB4LCB5fTtcbiAgYW5kcm9pZEhlbHBlcnMucmVtb3ZlTnVsbFByb3BlcnRpZXMocGFyYW1zKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6dG91Y2hNb3ZlJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLmNvbXBsZXhUYXAgPSBhc3luYyBmdW5jdGlvbiBjb21wbGV4VGFwICh0YXBDb3VudCwgdG91Y2hDb3VudCwgZHVyYXRpb24sIHgsIHkpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2NsaWNrJywge3gsIHl9KTtcbn07XG5cbmNvbW1hbmRzLnRhcCA9IGFzeW5jIGZ1bmN0aW9uIChlbGVtZW50SWQgPSBudWxsLCB4ID0gbnVsbCwgeSA9IG51bGwsIGNvdW50ID0gMSkge1xuICBpZiAoIXV0aWwuaGFzVmFsdWUoZWxlbWVudElkKSAmJiAhdXRpbC5oYXNWYWx1ZSh4KSAmJiAhdXRpbC5oYXNWYWx1ZSh5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRWl0aGVyIGVsZW1lbnQgdG8gdGFwIG9yIGJvdGggYWJzb2x1dGUgY29vcmRpbmF0ZXMgc2hvdWxkIGJlIGRlZmluZWRgKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBpZiAodXRpbC5oYXNWYWx1ZShlbGVtZW50SWQpKSB7XG4gICAgICAvLyBGSVhNRTogYm9vdHN0cmFwIGlnbm9yZXMgcmVsYXRpdmUgY29vcmRpbmF0ZXNcbiAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6Y2xpY2snLCB7ZWxlbWVudElkLCB4LCB5fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2NsaWNrJywge3gsIHl9KTtcbiAgICB9XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBR0EsSUFBSUEsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFBQztBQUFBO0FBRWpERixRQUFRLENBQUNHLFlBQVksR0FBRyxlQUFlQSxZQUFZLENBQUVDLFNBQVMsRUFBRUMsU0FBUyxFQUFFO0VBQ3pFLElBQUlDLENBQUMsR0FBRztJQUFDRixTQUFTO0lBQUVDO0VBQVMsQ0FBQztFQUM5QixPQUFPLE1BQU0sSUFBSSxDQUFDRSxTQUFTLENBQUNDLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRUYsQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFFRE4sUUFBUSxDQUFDUyxPQUFPLEdBQUcsZUFBZUEsT0FBTyxDQUFFSixTQUFTLEVBQUU7RUFDcEQsT0FBTyxNQUFNLElBQUksQ0FBQ0YsWUFBWSxDQUFDLFdBQVcsRUFBRUUsU0FBUyxDQUFDO0FBQ3hELENBQUM7QUFFREwsUUFBUSxDQUFDVSxnQkFBZ0IsR0FBRyxlQUFlQSxnQkFB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
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","names":["commands","helpers","extensions","getAttribute","attribute","elementId","p","bootstrap","sendAction","getName","elementDisplayed","elementEnabled","elementSelected","setElementValue","keys","replace","text","Array","join","params","unicodeKeyboard","opts","doSetElementValue","setValue","replaceValue","setValueImmediate","click","adb","inputText","getText","clear","length","log","debug","retryInterval","remainingLength","lengthToSend","clearTextField","getLocation","getLocationInView","getSize","getElementRect","touchLongClick","x","y","duration","androidHelpers","removeNullProperties","touchDown","touchUp","touchMove","complexTap","tapCount","touchCount","tap","count","util","hasValue","Error","i","Object","assign"],"sources":["../../../lib/commands/element.js"],"sourcesContent":["import androidHelpers from '../android-helpers';\nimport { retryInterval } from 'asyncbox';\nimport { util } from 'appium/support';\n\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.getAttribute = async function getAttribute (attribute, elementId) {\n let p = {attribute, elementId};\n return await this.bootstrap.sendAction('element:getAttribute', p);\n};\n\ncommands.getName = async function getName (elementId) {\n return await this.getAttribute('className', elementId);\n};\n\ncommands.elementDisplayed = async function elementDisplayed (elementId) {\n return await this.getAttribute('displayed', elementId) === 'true';\n};\n\ncommands.elementEnabled = async function elementEnabled (elementId) {\n return await this.getAttribute('enabled', elementId) === 'true';\n};\n\ncommands.elementSelected = async function elementSelected (elementId) {\n return await this.getAttribute('selected', elementId) === 'true';\n};\n\nhelpers.setElementValue = async function setElementValue (keys, elementId, replace = false) {\n let text = keys;\n if (keys instanceof Array) {\n text = keys.join('');\n }\n\n let params = {\n elementId,\n text,\n replace,\n unicodeKeyboard: this.opts.unicodeKeyboard\n };\n\n return await this.doSetElementValue(params);\n};\n\n/**\n * Reason for isolating doSetElementValue from setElementValue is for reusing setElementValue\n * across android-drivers (like appium-uiautomator2-driver) and to avoid code duplication.\n * Other android-drivers (like appium-uiautomator2-driver) need to override doSetElementValue\n * to facilitate setElementValue.\n */\nhelpers.doSetElementValue = async function doSetElementValue (params) {\n return await this.bootstrap.sendAction('element:setText', params);\n};\n\ncommands.setValue = async function setValue (keys, elementId) {\n return await this.setElementValue(keys, elementId, false);\n};\n\ncommands.replaceValue = async function replaceValue (keys, elementId) {\n return await this.setElementValue(keys, elementId, true);\n};\n\ncommands.setValueImmediate = async function setValueImmediate (keys, elementId) {\n let text = keys;\n if (keys instanceof Array) {\n text = keys.join('');\n }\n\n // first, make sure we are focused on the element\n await this.click(elementId);\n\n // then send through adb\n await this.adb.inputText(text);\n};\n\ncommands.getText = async function getText (elementId) {\n return await this.bootstrap.sendAction('element:getText', {elementId});\n};\n\ncommands.clear = async function clear (elementId) {\n let text = (await this.getText(elementId)) || '';\n let length = text.length;\n if (length === 0) {\n // if length is zero there are two possibilities:\n // 1. there is nothing in the text field\n // 2. it is a password field\n // since there is little overhead to the adb call, delete 100 elements\n // if we get zero, just in case it is #2\n length = 100;\n }\n await this.click(elementId);\n this.log.debug(`Sending up to ${length} clear characters to device`);\n return await retryInterval(5, 500, async () => {\n let remainingLength = length;\n while (remainingLength > 0) {\n let lengthToSend = remainingLength < 50 ? remainingLength : 50;\n this.log.debug(`Sending ${lengthToSend} clear characters to device`);\n await this.adb.clearTextField(lengthToSend);\n remainingLength -= lengthToSend;\n }\n });\n};\n\ncommands.click = async function click (elementId) {\n return await this.bootstrap.sendAction('element:click', {elementId});\n};\n\ncommands.getLocation = async function getLocation (elementId) {\n return await this.bootstrap.sendAction('element:getLocation', {elementId});\n};\n\ncommands.getLocationInView = async function getLocationInView (elementId) {\n return await this.getLocation(elementId);\n};\n\ncommands.getSize = async function getSize (elementId) {\n return await this.bootstrap.sendAction('element:getSize', {elementId});\n};\n\ncommands.getElementRect = async function getElementRect (elementId) {\n return await this.bootstrap.sendAction('element:getRect', {elementId});\n};\n\ncommands.touchLongClick = async function touchLongClick (elementId, x, y, duration) {\n let params = {elementId, x, y, duration};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchLongClick', params);\n};\n\ncommands.touchDown = async function touchDown (elementId, x, y) {\n let params = {elementId, x, y};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchDown', params);\n};\n\ncommands.touchUp = async function touchUp (elementId, x, y) {\n let params = {elementId, x, y};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchUp', params);\n};\n\ncommands.touchMove = async function touchMove (elementId, x, y) {\n let params = {elementId, x, y};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchMove', params);\n};\n\ncommands.complexTap = async function complexTap (tapCount, touchCount, duration, x, y) {\n return await this.bootstrap.sendAction('click', {x, y});\n};\n\ncommands.tap = async function (elementId = null, x = null, y = null, count = 1) {\n if (!util.hasValue(elementId) && !util.hasValue(x) && !util.hasValue(y)) {\n throw new Error(`Either element to tap or both absolute coordinates should be defined`);\n }\n for (let i = 0; i < count; i++) {\n if (util.hasValue(elementId)) {\n // FIXME: bootstrap ignores relative coordinates\n await this.bootstrap.sendAction('element:click', {elementId, x, y});\n } else {\n await this.bootstrap.sendAction('click', {x, y});\n }\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
1
+ {"version":3,"file":"element.js","names":["commands","helpers","extensions","getAttribute","attribute","elementId","p","bootstrap","sendAction","getName","elementDisplayed","elementEnabled","elementSelected","setElementValue","keys","replace","text","Array","join","params","unicodeKeyboard","opts","doSetElementValue","setValue","replaceValue","setValueImmediate","click","adb","inputText","getText","clear","length","log","debug","retryInterval","remainingLength","lengthToSend","clearTextField","getLocation","getLocationInView","getSize","getElementRect","touchLongClick","x","y","duration","androidHelpers","removeNullProperties","touchDown","touchUp","touchMove","complexTap","tapCount","touchCount","tap","count","util","hasValue","Error","i","Object","assign"],"sources":["../../../lib/commands/element.js"],"sourcesContent":["import androidHelpers from '../android-helpers';\nimport { retryInterval } from 'asyncbox';\nimport { util } from 'appium/support';\n\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.getAttribute = async function getAttribute (attribute, elementId) {\n let p = {attribute, elementId};\n return await this.bootstrap.sendAction('element:getAttribute', p);\n};\n\ncommands.getName = async function getName (elementId) {\n return await this.getAttribute('className', elementId);\n};\n\ncommands.elementDisplayed = async function elementDisplayed (elementId) {\n return await this.getAttribute('displayed', elementId) === 'true';\n};\n\ncommands.elementEnabled = async function elementEnabled (elementId) {\n return await this.getAttribute('enabled', elementId) === 'true';\n};\n\ncommands.elementSelected = async function elementSelected (elementId) {\n return await this.getAttribute('selected', elementId) === 'true';\n};\n\nhelpers.setElementValue = async function setElementValue (keys, elementId, replace = false) {\n let text = keys;\n if (keys instanceof Array) {\n text = keys.join('');\n }\n\n let params = {\n elementId,\n text,\n replace,\n unicodeKeyboard: this.opts.unicodeKeyboard\n };\n\n return await this.doSetElementValue(params);\n};\n\n/**\n * Reason for isolating doSetElementValue from setElementValue is for reusing setElementValue\n * across android-drivers (like appium-uiautomator2-driver) and to avoid code duplication.\n * Other android-drivers (like appium-uiautomator2-driver) need to override doSetElementValue\n * to facilitate setElementValue.\n */\nhelpers.doSetElementValue = async function doSetElementValue (params) {\n return await this.bootstrap.sendAction('element:setText', params);\n};\n\ncommands.setValue = async function setValue (keys, elementId) {\n return await this.setElementValue(keys, elementId, false);\n};\n\ncommands.replaceValue = async function replaceValue (keys, elementId) {\n return await this.setElementValue(keys, elementId, true);\n};\n\ncommands.setValueImmediate = async function setValueImmediate (keys, elementId) {\n let text = keys;\n if (keys instanceof Array) {\n text = keys.join('');\n }\n\n // first, make sure we are focused on the element\n await this.click(elementId);\n\n // then send through adb\n await this.adb.inputText(text);\n};\n\ncommands.getText = async function getText (elementId) {\n return await this.bootstrap.sendAction('element:getText', {elementId});\n};\n\ncommands.clear = async function clear (elementId) {\n let text = (await this.getText(elementId)) || '';\n let length = text.length;\n if (length === 0) {\n // if length is zero there are two possibilities:\n // 1. there is nothing in the text field\n // 2. it is a password field\n // since there is little overhead to the adb call, delete 100 elements\n // if we get zero, just in case it is #2\n length = 100;\n }\n await this.click(elementId);\n this.log.debug(`Sending up to ${length} clear characters to device`);\n return await retryInterval(5, 500, async () => {\n let remainingLength = length;\n while (remainingLength > 0) {\n let lengthToSend = remainingLength < 50 ? remainingLength : 50;\n this.log.debug(`Sending ${lengthToSend} clear characters to device`);\n await this.adb.clearTextField(lengthToSend);\n remainingLength -= lengthToSend;\n }\n });\n};\n\ncommands.click = async function click (elementId) {\n return await this.bootstrap.sendAction('element:click', {elementId});\n};\n\ncommands.getLocation = async function getLocation (elementId) {\n return await this.bootstrap.sendAction('element:getLocation', {elementId});\n};\n\ncommands.getLocationInView = async function getLocationInView (elementId) {\n return await this.getLocation(elementId);\n};\n\ncommands.getSize = async function getSize (elementId) {\n return await this.bootstrap.sendAction('element:getSize', {elementId});\n};\n\ncommands.getElementRect = async function getElementRect (elementId) {\n return await this.bootstrap.sendAction('element:getRect', {elementId});\n};\n\ncommands.touchLongClick = async function touchLongClick (elementId, x, y, duration) {\n let params = {elementId, x, y, duration};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchLongClick', params);\n};\n\ncommands.touchDown = async function touchDown (elementId, x, y) {\n let params = {elementId, x, y};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchDown', params);\n};\n\ncommands.touchUp = async function touchUp (elementId, x, y) {\n let params = {elementId, x, y};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchUp', params);\n};\n\ncommands.touchMove = async function touchMove (elementId, x, y) {\n let params = {elementId, x, y};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchMove', params);\n};\n\ncommands.complexTap = async function complexTap (tapCount, touchCount, duration, x, y) {\n return await this.bootstrap.sendAction('click', {x, y});\n};\n\ncommands.tap = async function (elementId = null, x = null, y = null, count = 1) {\n if (!util.hasValue(elementId) && !util.hasValue(x) && !util.hasValue(y)) {\n throw new Error(`Either element to tap or both absolute coordinates should be defined`);\n }\n for (let i = 0; i < count; i++) {\n if (util.hasValue(elementId)) {\n // FIXME: bootstrap ignores relative coordinates\n await this.bootstrap.sendAction('element:click', {elementId, x, y});\n } else {\n await this.bootstrap.sendAction('click', {x, y});\n }\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
@@ -4,13 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.commands = void 0;
7
-
8
7
  require("source-map-support/register");
9
-
10
8
  var _driver = require("appium/driver");
11
-
12
9
  const EMU_CONSOLE_FEATURE = 'emulator_console';
13
10
  const commands = {};
11
+
14
12
  exports.commands = commands;
15
13
 
16
14
  commands.mobileExecEmuConsoleCommand = async function mobileExecEmuConsoleCommand(opts = {}) {
@@ -21,18 +19,15 @@ commands.mobileExecEmuConsoleCommand = async function mobileExecEmuConsoleComman
21
19
  connTimeout,
22
20
  initTimeout
23
21
  } = opts;
24
-
25
22
  if (!command) {
26
23
  throw new _driver.errors.InvalidArgumentError(`The 'command' argument is mandatory`);
27
24
  }
28
-
29
25
  return await this.adb.execEmuConsoleCommand(command, {
30
26
  execTimeout,
31
27
  connTimeout,
32
28
  initTimeout
33
29
  });
34
30
  };
35
-
36
31
  var _default = commands;
37
32
  exports.default = _default;
38
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFTVVfQ09OU09MRV9GRUFUVVJFIiwiY29tbWFuZHMiLCJtb2JpbGVFeGVjRW11Q29uc29sZUNvbW1hbmQiLCJvcHRzIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJjb21tYW5kIiwiZXhlY1RpbWVvdXQiLCJjb25uVGltZW91dCIsImluaXRUaW1lb3V0IiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJhZGIiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZW11LWNvbnNvbGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IEVNVV9DT05TT0xFX0ZFQVRVUkUgPSAnZW11bGF0b3JfY29uc29sZSc7XG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRXhlY09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IUFycmF5PHN0cmluZz58c3RyaW5nfSBjb21tYW5kIC0gVGhlIGFjdHVhbCBjb21tYW5kIHRvIGV4ZWN1dGUuIFNlZVxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc3R1ZGlvL3J1bi9lbXVsYXRvci1jb25zb2xlIGZvciBtb3JlIGRldGFpbHNcbiAqIG9uIGF2YWlsYWJsZSBjb21tYW5kc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGV4ZWNUaW1lb3V0IFs2MDAwMF0gQSB0aW1lb3V0IHVzZWQgdG8gd2FpdCBmb3IgYSBzZXJ2ZXJcbiAqIHJlcGx5IHRvIHRoZSBnaXZlbiBjb21tYW5kIGluIG1pbGxpc2Vjb25kc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvbm5UaW1lb3V0IFs1MDAwXSBDb25zb2xlIGNvbm5lY3Rpb24gdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbml0VGltZW91dCBbNTAwMF0gVGVsbmV0IGNvbnNvbGUgaW5pdGlhbGl6YXRpb24gdGltZW91dFxuICogaW4gbWlsbGlzZWNvbmRzICh0aGUgdGltZSBiZXR3ZWVuIHRoZSBjb25uZWN0aW9uIGhhcHBlbnMgYW5kIHRoZSBjb21tYW5kIHByb21wdFxuICogaXMgYXZhaWxhYmxlKVxuICovXG5cbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kIHRocm91Z2ggZW11bGF0b3IgdGVsbmV0IGNvbnNvbGUgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGl0cyBvdXRwdXQuXG4gKiBUaGUgYGVtdWxhdG9yX2NvbnNvbGVgIHNlcnZlciBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCBpbiBvcmRlciB0byB1c2UgdGhpcyBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtFeGVjT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbW1hbmQgb3V0cHV0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNvbm5lY3RpbmcgdG8gdGhlIFRlbG5ldCBjb25zb2xlXG4gKiBvciBpZiB0aGUgZ2l2ZW4gY29tbWFuZCByZXR1cm5lZCBub24tT0sgcmVzcG9uc2VcbiAqL1xuY29tbWFuZHMubW9iaWxlRXhlY0VtdUNvbnNvbGVDb21tYW5kID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRXhlY0VtdUNvbnNvbGVDb21tYW5kIChvcHRzID0ge30pIHtcbiAgdGhpcy5lbnN1cmVGZWF0dXJlRW5hYmxlZChFTVVfQ09OU09MRV9GRUFUVVJFKTtcblxuICBjb25zdCB7XG4gICAgY29tbWFuZCxcbiAgICBleGVjVGltZW91dCxcbiAgICBjb25uVGltZW91dCxcbiAgICBpbml0VGltZW91dCxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCFjb21tYW5kKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVGhlICdjb21tYW5kJyBhcmd1bWVudCBpcyBtYW5kYXRvcnlgKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5leGVjRW11Q29uc29sZUNvbW1hbmQoY29tbWFuZCwge1xuICAgIGV4ZWNUaW1lb3V0LFxuICAgIGNvbm5UaW1lb3V0LFxuICAgIGluaXRUaW1lb3V0LFxuICB9KTtcbn07XG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBRUEsTUFBTUEsbUJBQW1CLEdBQUcsa0JBQTVCO0FBRUEsTUFBTUMsUUFBUSxHQUFHLEVBQWpCOzs7QUF3QkFBLFFBQVEsQ0FBQ0MsMkJBQVQsR0FBdUMsZUFBZUEsMkJBQWYsQ0FBNENDLElBQUksR0FBRyxFQUFuRCxFQUF1RDtFQUM1RixLQUFLQyxvQkFBTCxDQUEwQkosbUJBQTFCO0VBRUEsTUFBTTtJQUNKSyxPQURJO0lBRUpDLFdBRkk7SUFHSkMsV0FISTtJQUlKQztFQUpJLElBS0ZMLElBTEo7O0VBT0EsSUFBSSxDQUFDRSxPQUFMLEVBQWM7SUFDWixNQUFNLElBQUlJLGNBQUEsQ0FBT0Msb0JBQVgsQ0FBaUMscUNBQWpDLENBQU47RUFDRDs7RUFFRCxPQUFPLE1BQU0sS0FBS0MsR0FBTCxDQUFTQyxxQkFBVCxDQUErQlAsT0FBL0IsRUFBd0M7SUFDbkRDLFdBRG1EO0lBRW5EQyxXQUZtRDtJQUduREM7RUFIbUQsQ0FBeEMsQ0FBYjtBQUtELENBbkJEOztlQXNCZVAsUSJ9
33
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFTVVfQ09OU09MRV9GRUFUVVJFIiwiY29tbWFuZHMiLCJtb2JpbGVFeGVjRW11Q29uc29sZUNvbW1hbmQiLCJvcHRzIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJjb21tYW5kIiwiZXhlY1RpbWVvdXQiLCJjb25uVGltZW91dCIsImluaXRUaW1lb3V0IiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJhZGIiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZW11LWNvbnNvbGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IEVNVV9DT05TT0xFX0ZFQVRVUkUgPSAnZW11bGF0b3JfY29uc29sZSc7XG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRXhlY09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IUFycmF5PHN0cmluZz58c3RyaW5nfSBjb21tYW5kIC0gVGhlIGFjdHVhbCBjb21tYW5kIHRvIGV4ZWN1dGUuIFNlZVxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc3R1ZGlvL3J1bi9lbXVsYXRvci1jb25zb2xlIGZvciBtb3JlIGRldGFpbHNcbiAqIG9uIGF2YWlsYWJsZSBjb21tYW5kc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGV4ZWNUaW1lb3V0IFs2MDAwMF0gQSB0aW1lb3V0IHVzZWQgdG8gd2FpdCBmb3IgYSBzZXJ2ZXJcbiAqIHJlcGx5IHRvIHRoZSBnaXZlbiBjb21tYW5kIGluIG1pbGxpc2Vjb25kc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvbm5UaW1lb3V0IFs1MDAwXSBDb25zb2xlIGNvbm5lY3Rpb24gdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbml0VGltZW91dCBbNTAwMF0gVGVsbmV0IGNvbnNvbGUgaW5pdGlhbGl6YXRpb24gdGltZW91dFxuICogaW4gbWlsbGlzZWNvbmRzICh0aGUgdGltZSBiZXR3ZWVuIHRoZSBjb25uZWN0aW9uIGhhcHBlbnMgYW5kIHRoZSBjb21tYW5kIHByb21wdFxuICogaXMgYXZhaWxhYmxlKVxuICovXG5cbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kIHRocm91Z2ggZW11bGF0b3IgdGVsbmV0IGNvbnNvbGUgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGl0cyBvdXRwdXQuXG4gKiBUaGUgYGVtdWxhdG9yX2NvbnNvbGVgIHNlcnZlciBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCBpbiBvcmRlciB0byB1c2UgdGhpcyBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtFeGVjT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbW1hbmQgb3V0cHV0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNvbm5lY3RpbmcgdG8gdGhlIFRlbG5ldCBjb25zb2xlXG4gKiBvciBpZiB0aGUgZ2l2ZW4gY29tbWFuZCByZXR1cm5lZCBub24tT0sgcmVzcG9uc2VcbiAqL1xuY29tbWFuZHMubW9iaWxlRXhlY0VtdUNvbnNvbGVDb21tYW5kID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRXhlY0VtdUNvbnNvbGVDb21tYW5kIChvcHRzID0ge30pIHtcbiAgdGhpcy5lbnN1cmVGZWF0dXJlRW5hYmxlZChFTVVfQ09OU09MRV9GRUFUVVJFKTtcblxuICBjb25zdCB7XG4gICAgY29tbWFuZCxcbiAgICBleGVjVGltZW91dCxcbiAgICBjb25uVGltZW91dCxcbiAgICBpbml0VGltZW91dCxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCFjb21tYW5kKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVGhlICdjb21tYW5kJyBhcmd1bWVudCBpcyBtYW5kYXRvcnlgKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5leGVjRW11Q29uc29sZUNvbW1hbmQoY29tbWFuZCwge1xuICAgIGV4ZWNUaW1lb3V0LFxuICAgIGNvbm5UaW1lb3V0LFxuICAgIGluaXRUaW1lb3V0LFxuICB9KTtcbn07XG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBRUEsTUFBTUEsbUJBQW1CLEdBQUcsa0JBQWtCO0FBRTlDLE1BQU1DLFFBQVEsR0FBRyxDQUFDLENBQUM7O0FBQUM7O0FBd0JwQkEsUUFBUSxDQUFDQywyQkFBMkIsR0FBRyxlQUFlQSwyQkFBMkIsQ0FBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQzVGLElBQUksQ0FBQ0Msb0JBQW9CLENBQUNKLG1CQUFtQixDQUFDO0VBRTlDLE1BQU07SUFDSkssT0FBTztJQUNQQyxXQUFXO0lBQ1hDLFdBQVc7SUFDWEM7RUFDRixDQUFDLEdBQUdMLElBQUk7RUFFUixJQUFJLENBQUNFLE9BQU8sRUFBRTtJQUNaLE1BQU0sSUFBSUksY0FBTSxDQUFDQyxvQkFBb0IsQ0FBRSxxQ0FBb0MsQ0FBQztFQUM5RTtFQUVBLE9BQU8sTUFBTSxJQUFJLENBQUNDLEdBQUcsQ0FBQ0MscUJBQXFCLENBQUNQLE9BQU8sRUFBRTtJQUNuREMsV0FBVztJQUNYQyxXQUFXO0lBQ1hDO0VBQ0YsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUFDLGVBR2FQLFFBQVE7QUFBQSJ9