oxygen-cli 1.22.0 → 1.99.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +0 -50
- package/build/core/OxygenCore.js +56 -145
- package/build/errors/OxygenError.js +5 -15
- package/build/errors/helper.js +45 -49
- package/build/index.js +14 -6
- package/build/lib/cli-util.js +19 -19
- package/build/lib/cli.js +4 -2
- package/build/lib/parallel-launcher.js +333 -0
- package/build/lib/param-manager.js +66 -47
- package/build/lib/util.js +38 -9
- package/build/ox_modules/index.js +1 -97
- package/build/ox_modules/module-assert.js +19 -9
- package/build/ox_modules/module-dns.js +220 -0
- package/build/ox_modules/module-http.js +39 -51
- package/build/ox_modules/module-shell.js +19 -75
- package/build/ox_modules/module-utils.js +1 -108
- package/build/ox_modules/utils.js +1 -357
- package/build/reporter/FileReporterBase.js +5 -5
- package/build/reporter/ReportAggregator.js +127 -4
- package/build/runners/WorkerProcess.js +15 -28
- package/build/runners/index.js +2 -6
- package/build/runners/oxygen/OxygenWorker.js +8 -8
- package/build/runners/oxygen/index.js +17 -18
- package/build/runners/oxygen/worker.js +10 -8
- package/package.json +12 -46
- package/build/lib/img-merge.js +0 -163
- package/build/ox_modules/module-db.js +0 -146
- package/build/ox_modules/module-email.js +0 -212
- package/build/ox_modules/module-eyes.js +0 -189
- package/build/ox_modules/module-mailinator.js +0 -207
- package/build/ox_modules/module-mob/commands/alertAccept.js +0 -35
- package/build/ox_modules/module-mob/commands/alertDismiss.js +0 -35
- package/build/ox_modules/module-mob/commands/assertAlert.js +0 -56
- package/build/ox_modules/module-mob/commands/assertText.js +0 -45
- package/build/ox_modules/module-mob/commands/assertTitle.js +0 -43
- package/build/ox_modules/module-mob/commands/assertValue.js +0 -66
- package/build/ox_modules/module-mob/commands/back.js +0 -27
- package/build/ox_modules/module-mob/commands/clear.js +0 -40
- package/build/ox_modules/module-mob/commands/click.js +0 -35
- package/build/ox_modules/module-mob/commands/clickHidden.js +0 -52
- package/build/ox_modules/module-mob/commands/clickLong.js +0 -34
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +0 -37
- package/build/ox_modules/module-mob/commands/closeApp.js +0 -27
- package/build/ox_modules/module-mob/commands/debug.js +0 -26
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +0 -38
- package/build/ox_modules/module-mob/commands/enableNetwork.js +0 -75
- package/build/ox_modules/module-mob/commands/execute.js +0 -32
- package/build/ox_modules/module-mob/commands/findElement.js +0 -36
- package/build/ox_modules/module-mob/commands/findElements.js +0 -39
- package/build/ox_modules/module-mob/commands/getAlertText.js +0 -31
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +0 -26
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +0 -66
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +0 -26
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +0 -26
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +0 -57
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +0 -27
- package/build/ox_modules/module-mob/commands/getLocation.js +0 -32
- package/build/ox_modules/module-mob/commands/getSource.js +0 -26
- package/build/ox_modules/module-mob/commands/getText.js +0 -36
- package/build/ox_modules/module-mob/commands/getTitle.js +0 -24
- package/build/ox_modules/module-mob/commands/getUrl.js +0 -28
- package/build/ox_modules/module-mob/commands/getValue.js +0 -50
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +0 -27
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +0 -33
- package/build/ox_modules/module-mob/commands/index.js +0 -594
- package/build/ox_modules/module-mob/commands/installApp.js +0 -28
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +0 -28
- package/build/ox_modules/module-mob/commands/isCheckable.js +0 -31
- package/build/ox_modules/module-mob/commands/isChecked.js +0 -31
- package/build/ox_modules/module-mob/commands/isClickable.js +0 -31
- package/build/ox_modules/module-mob/commands/isExist.js +0 -36
- package/build/ox_modules/module-mob/commands/isSelected.js +0 -36
- package/build/ox_modules/module-mob/commands/isVisible.js +0 -36
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +0 -27
- package/build/ox_modules/module-mob/commands/launchApp.js +0 -26
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +0 -30
- package/build/ox_modules/module-mob/commands/open.js +0 -43
- package/build/ox_modules/module-mob/commands/pause.js +0 -27
- package/build/ox_modules/module-mob/commands/removeApp.js +0 -28
- package/build/ox_modules/module-mob/commands/resetApp.js +0 -26
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +0 -86
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +0 -40
- package/build/ox_modules/module-mob/commands/select.js +0 -54
- package/build/ox_modules/module-mob/commands/selectFrame.js +0 -53
- package/build/ox_modules/module-mob/commands/selectWindow.js +0 -149
- package/build/ox_modules/module-mob/commands/sendKeys.js +0 -84
- package/build/ox_modules/module-mob/commands/setContext.js +0 -28
- package/build/ox_modules/module-mob/commands/setNativeContext.js +0 -26
- package/build/ox_modules/module-mob/commands/setTimeout.js +0 -33
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +0 -39
- package/build/ox_modules/module-mob/commands/shake.js +0 -27
- package/build/ox_modules/module-mob/commands/smsClickLink.js +0 -32
- package/build/ox_modules/module-mob/commands/smsGetText.js +0 -45
- package/build/ox_modules/module-mob/commands/swipe.js +0 -58
- package/build/ox_modules/module-mob/commands/swipeElement.js +0 -58
- package/build/ox_modules/module-mob/commands/swipeScreen.js +0 -56
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +0 -27
- package/build/ox_modules/module-mob/commands/tap.js +0 -34
- package/build/ox_modules/module-mob/commands/type.js +0 -67
- package/build/ox_modules/module-mob/commands/unlockPattern.js +0 -92
- package/build/ox_modules/module-mob/commands/waitForExist.js +0 -29
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +0 -42
- package/build/ox_modules/module-mob/commands/waitForVisible.js +0 -28
- package/build/ox_modules/module-mob.js +0 -699
- package/build/ox_modules/module-pdf.js +0 -328
- package/build/ox_modules/module-proxy.js +0 -324
- package/build/ox_modules/module-serial.js +0 -187
- package/build/ox_modules/module-soap.js +0 -260
- package/build/ox_modules/module-twilio.js +0 -192
- package/build/ox_modules/module-web/commands/alertAccept.js +0 -35
- package/build/ox_modules/module-web/commands/alertDismiss.js +0 -35
- package/build/ox_modules/module-web/commands/assertAlert.js +0 -55
- package/build/ox_modules/module-web/commands/assertExist.js +0 -28
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +0 -51
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +0 -45
- package/build/ox_modules/module-web/commands/assertText.js +0 -45
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +0 -56
- package/build/ox_modules/module-web/commands/assertTextPresent.js +0 -52
- package/build/ox_modules/module-web/commands/assertTitle.js +0 -42
- package/build/ox_modules/module-web/commands/assertValue.js +0 -44
- package/build/ox_modules/module-web/commands/back.js +0 -27
- package/build/ox_modules/module-web/commands/clear.js +0 -41
- package/build/ox_modules/module-web/commands/click.js +0 -112
- package/build/ox_modules/module-web/commands/clickHidden.js +0 -79
- package/build/ox_modules/module-web/commands/closeWindow.js +0 -25
- package/build/ox_modules/module-web/commands/debug.js +0 -25
- package/build/ox_modules/module-web/commands/deleteCookies.js +0 -22
- package/build/ox_modules/module-web/commands/deselect.js +0 -34
- package/build/ox_modules/module-web/commands/doubleClick.js +0 -65
- package/build/ox_modules/module-web/commands/dragAndDrop.js +0 -36
- package/build/ox_modules/module-web/commands/execute.js +0 -36
- package/build/ox_modules/module-web/commands/fileBrowse.js +0 -72
- package/build/ox_modules/module-web/commands/findElement.js +0 -35
- package/build/ox_modules/module-web/commands/findElements.js +0 -38
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +0 -24
- package/build/ox_modules/module-web/commands/getAlertText.js +0 -30
- package/build/ox_modules/module-web/commands/getAttribute.js +0 -38
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +0 -34
- package/build/ox_modules/module-web/commands/getCookies.js +0 -23
- package/build/ox_modules/module-web/commands/getCssValue.js +0 -38
- package/build/ox_modules/module-web/commands/getElementCount.js +0 -29
- package/build/ox_modules/module-web/commands/getHTML.js +0 -30
- package/build/ox_modules/module-web/commands/getSource.js +0 -26
- package/build/ox_modules/module-web/commands/getText.js +0 -36
- package/build/ox_modules/module-web/commands/getTitle.js +0 -22
- package/build/ox_modules/module-web/commands/getUrl.js +0 -26
- package/build/ox_modules/module-web/commands/getValue.js +0 -43
- package/build/ox_modules/module-web/commands/getWindowHandles.js +0 -26
- package/build/ox_modules/module-web/commands/getWindowSize.js +0 -26
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +0 -51
- package/build/ox_modules/module-web/commands/index.js +0 -634
- package/build/ox_modules/module-web/commands/isAlertPresent.js +0 -31
- package/build/ox_modules/module-web/commands/isChecked.js +0 -30
- package/build/ox_modules/module-web/commands/isExist.js +0 -36
- package/build/ox_modules/module-web/commands/isSelected.js +0 -35
- package/build/ox_modules/module-web/commands/isVisible.js +0 -36
- package/build/ox_modules/module-web/commands/makeVisible.js +0 -74
- package/build/ox_modules/module-web/commands/maximizeWindow.js +0 -24
- package/build/ox_modules/module-web/commands/minimizeWindow.js +0 -24
- package/build/ox_modules/module-web/commands/newWindow.js +0 -27
- package/build/ox_modules/module-web/commands/open.js +0 -42
- package/build/ox_modules/module-web/commands/pause.js +0 -26
- package/build/ox_modules/module-web/commands/point.js +0 -37
- package/build/ox_modules/module-web/commands/pointJS.js +0 -56
- package/build/ox_modules/module-web/commands/refresh.js +0 -26
- package/build/ox_modules/module-web/commands/rightClick.js +0 -61
- package/build/ox_modules/module-web/commands/rightClickActions.js +0 -57
- package/build/ox_modules/module-web/commands/scrollToElement.js +0 -33
- package/build/ox_modules/module-web/commands/select.js +0 -55
- package/build/ox_modules/module-web/commands/selectFrame.js +0 -52
- package/build/ox_modules/module-web/commands/selectWindow.js +0 -148
- package/build/ox_modules/module-web/commands/sendKeys.js +0 -56
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +0 -33
- package/build/ox_modules/module-web/commands/setTimeout.js +0 -33
- package/build/ox_modules/module-web/commands/setWindowSize.js +0 -29
- package/build/ox_modules/module-web/commands/takeScreenshot.js +0 -37
- package/build/ox_modules/module-web/commands/type.js +0 -52
- package/build/ox_modules/module-web/commands/waitForAngular.js +0 -83
- package/build/ox_modules/module-web/commands/waitForExist.js +0 -28
- package/build/ox_modules/module-web/commands/waitForInteractable.js +0 -31
- package/build/ox_modules/module-web/commands/waitForNotExist.js +0 -57
- package/build/ox_modules/module-web/commands/waitForNotText.js +0 -45
- package/build/ox_modules/module-web/commands/waitForNotValue.js +0 -45
- package/build/ox_modules/module-web/commands/waitForText.js +0 -45
- package/build/ox_modules/module-web/commands/waitForValue.js +0 -45
- package/build/ox_modules/module-web/commands/waitForVisible.js +0 -28
- package/build/ox_modules/module-web/commands/waitForWindow.js +0 -118
- package/build/ox_modules/module-web.js +0 -909
- package/build/ox_modules/module-win/commands/assertText.js +0 -41
- package/build/ox_modules/module-win/commands/assertTitle.js +0 -38
- package/build/ox_modules/module-win/commands/assertValue.js +0 -62
- package/build/ox_modules/module-win/commands/back.js +0 -21
- package/build/ox_modules/module-win/commands/clear.js +0 -34
- package/build/ox_modules/module-win/commands/click.js +0 -25
- package/build/ox_modules/module-win/commands/clickLong.js +0 -30
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +0 -33
- package/build/ox_modules/module-win/commands/findElement.js +0 -31
- package/build/ox_modules/module-win/commands/findElements.js +0 -31
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +0 -22
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +0 -25
- package/build/ox_modules/module-win/commands/getLocation.js +0 -26
- package/build/ox_modules/module-win/commands/getSource.js +0 -22
- package/build/ox_modules/module-win/commands/getText.js +0 -32
- package/build/ox_modules/module-win/commands/getValue.js +0 -46
- package/build/ox_modules/module-win/commands/getWindowHandles.js +0 -25
- package/build/ox_modules/module-win/commands/index.js +0 -298
- package/build/ox_modules/module-win/commands/isCheckable.js +0 -26
- package/build/ox_modules/module-win/commands/isChecked.js +0 -26
- package/build/ox_modules/module-win/commands/isClickable.js +0 -26
- package/build/ox_modules/module-win/commands/isExist.js +0 -32
- package/build/ox_modules/module-win/commands/isSelected.js +0 -26
- package/build/ox_modules/module-win/commands/isVisible.js +0 -32
- package/build/ox_modules/module-win/commands/open.js +0 -24
- package/build/ox_modules/module-win/commands/pause.js +0 -23
- package/build/ox_modules/module-win/commands/rightClick.js +0 -30
- package/build/ox_modules/module-win/commands/selectWindow.js +0 -97
- package/build/ox_modules/module-win/commands/sendKeys.js +0 -50
- package/build/ox_modules/module-win/commands/setTimeout.js +0 -29
- package/build/ox_modules/module-win/commands/takeScreenshot.js +0 -26
- package/build/ox_modules/module-win/commands/tap.js +0 -29
- package/build/ox_modules/module-win/commands/type.js +0 -38
- package/build/ox_modules/module-win/commands/waitForExist.js +0 -25
- package/build/ox_modules/module-win/commands/waitForInteractable.js +0 -43
- package/build/ox_modules/module-win/commands/waitForVisible.js +0 -24
- package/build/ox_modules/module-win.js +0 -367
- package/build/ox_services/service-devtools/submodule-network.js +0 -338
- package/build/ox_services/service-devtools.js +0 -83
- package/build/runners/cucumber/CucumberEventListener.js +0 -181
- package/build/runners/cucumber/CucumberReporter.js +0 -277
- package/build/runners/cucumber/CucumberWorker.js +0 -337
- package/build/runners/cucumber/index.js +0 -159
- package/build/runners/cucumber/worker.js +0 -184
|
@@ -1,338 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
require("source-map-support/register");
|
|
9
|
-
|
|
10
|
-
var _OxygenSubModule = require("../../core/OxygenSubModule");
|
|
11
|
-
|
|
12
|
-
var _chromeHar = require("chrome-har");
|
|
13
|
-
|
|
14
|
-
var _helper = _interopRequireDefault(require("../../errors/helper"));
|
|
15
|
-
|
|
16
|
-
var _OxygenError = _interopRequireDefault(require("../../errors/OxygenError"));
|
|
17
|
-
|
|
18
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
-
|
|
20
|
-
const observe = ['Page.domContentEventFired', 'Page.fileChooserOpened', 'Page.frameAttached', 'Page.frameDetached', 'Page.frameNavigated', 'Page.interstitialHidden', 'Page.interstitialShown', 'Page.javascriptDialogClosed', 'Page.javascriptDialogOpening', 'Page.lifecycleEvent', 'Page.loadEventFired', 'Page.windowOpen', 'Page.frameClearedScheduledNavigation', 'Page.frameScheduledNavigation', 'Page.compilationCacheProduced', 'Page.downloadProgress', 'Page.downloadWillBegin', 'Page.frameRequestedNavigation', 'Page.frameResized', 'Page.frameStartedLoading', 'Page.frameStoppedLoading', 'Page.navigatedWithinDocument', 'Page.screencastFrame', 'Page.screencastVisibilityChanged', 'Network.dataReceived', 'Network.eventSourceMessageReceived', 'Network.loadingFailed', 'Network.loadingFinished', 'Network.requestServedFromCache', 'Network.requestWillBeSent', 'Network.responseReceived', 'Network.webSocketClosed', 'Network.webSocketCreated', 'Network.webSocketFrameError', 'Network.webSocketFrameReceived', 'Network.webSocketFrameSent', 'Network.webSocketHandshakeResponseReceived', 'Network.webSocketWillSendHandshakeRequest', 'Network.requestWillBeSentExtraInfo', 'Network.resourceChangedPriority', 'Network.responseReceivedExtraInfo', 'Network.signedExchangeReceived', 'Network.requestIntercepted'];
|
|
21
|
-
|
|
22
|
-
class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
|
|
23
|
-
constructor(name, parent) {
|
|
24
|
-
super(name, parent);
|
|
25
|
-
this._devTools = null;
|
|
26
|
-
this._collectData = false;
|
|
27
|
-
this._events = [];
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
init(devTools) {
|
|
31
|
-
if (!devTools || !this._parent || !this._parent.getDriver || typeof this._parent.getDriver !== 'function' || !this._parent.getDriver()) {
|
|
32
|
-
super.init();
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
this._devTools = devTools;
|
|
37
|
-
this._driver = this._parent.getDriver();
|
|
38
|
-
observe.forEach(method => {
|
|
39
|
-
this._driver.on(method, params => {
|
|
40
|
-
if (this._collectData) {
|
|
41
|
-
this._events.push({
|
|
42
|
-
method,
|
|
43
|
-
params
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
super.init();
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
async dispose() {
|
|
53
|
-
try {
|
|
54
|
-
if (this._driver) {
|
|
55
|
-
observe.forEach(async method => {
|
|
56
|
-
await this._driver.removeListener(method, () => {});
|
|
57
|
-
});
|
|
58
|
-
await this._driver.emit('Network.disable');
|
|
59
|
-
await this._driver.emit('Network.close');
|
|
60
|
-
}
|
|
61
|
-
} catch (e) {}
|
|
62
|
-
|
|
63
|
-
this._devTools = null;
|
|
64
|
-
this._driver = null;
|
|
65
|
-
this._events = [];
|
|
66
|
-
super.dispose();
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
start() {
|
|
70
|
-
this._collectData = true;
|
|
71
|
-
this._events = [];
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
stop() {
|
|
75
|
-
this._collectData = false;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
async getRequests() {
|
|
79
|
-
return await this._getEntries();
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
async _getEntries() {
|
|
83
|
-
try {
|
|
84
|
-
const har = (0, _chromeHar.harFromMessages)(this._events);
|
|
85
|
-
|
|
86
|
-
if (har && har.log && har.log.entries && har.log.entries.map) {
|
|
87
|
-
har.log.entries.reverse();
|
|
88
|
-
return await Promise.all(har.log.entries.map(async item => {
|
|
89
|
-
let responseBody = {};
|
|
90
|
-
|
|
91
|
-
try {
|
|
92
|
-
responseBody = await this._driver.cdp('Network', 'getResponseBody', {
|
|
93
|
-
requestId: item._requestId
|
|
94
|
-
});
|
|
95
|
-
} catch (e) {}
|
|
96
|
-
|
|
97
|
-
if (responseBody && responseBody.body) {
|
|
98
|
-
try {
|
|
99
|
-
responseBody.body = JSON.parse(responseBody.body);
|
|
100
|
-
} catch (e) {}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
let requestPostData = {};
|
|
104
|
-
|
|
105
|
-
try {
|
|
106
|
-
requestPostData = await this._driver.cdp('Network', 'getRequestPostData', {
|
|
107
|
-
requestId: item._requestId
|
|
108
|
-
});
|
|
109
|
-
} catch (e) {}
|
|
110
|
-
|
|
111
|
-
return { ...item,
|
|
112
|
-
url: item.request.url,
|
|
113
|
-
requestId: item._requestId,
|
|
114
|
-
...item.response,
|
|
115
|
-
responseBody,
|
|
116
|
-
requestPostData
|
|
117
|
-
};
|
|
118
|
-
}));
|
|
119
|
-
} else {
|
|
120
|
-
return [];
|
|
121
|
-
}
|
|
122
|
-
} catch (e) {
|
|
123
|
-
return [];
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
async waitForUrl(pattern, timeout = 60 * 1000) {
|
|
128
|
-
if (!this._driver || !this._isInitialized || !this._parent) {
|
|
129
|
-
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
if (!this._collectData) {
|
|
133
|
-
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network.start()` must be executed prior to using `network` commands.');
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
this._parent.helpers.assertArgument(pattern, 'pattern');
|
|
137
|
-
|
|
138
|
-
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
139
|
-
|
|
140
|
-
const start = Date.now();
|
|
141
|
-
|
|
142
|
-
while (Date.now() - start < timeout) {
|
|
143
|
-
const networkRequests = await this._getEntries();
|
|
144
|
-
|
|
145
|
-
for (let req of networkRequests) {
|
|
146
|
-
if (pattern.constructor.name === 'RegExp' && pattern.test(req.url) || pattern === req.url) {
|
|
147
|
-
return req;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
await this._driver.pause(500);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, `No request matching the URL "${pattern}" was found.`);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
async waitForNotUrl(pattern, timeout = 60 * 1000) {
|
|
158
|
-
if (!this._driver || !this._isInitialized || !this._parent) {
|
|
159
|
-
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (!this._collectData) {
|
|
163
|
-
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network.start()` must be executed prior to using `network` commands.');
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
this._parent.helpers.assertArgument(pattern, 'pattern');
|
|
167
|
-
|
|
168
|
-
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
169
|
-
|
|
170
|
-
const start = Date.now();
|
|
171
|
-
|
|
172
|
-
while (Date.now() - start < timeout) {
|
|
173
|
-
const networkRequests = await this._getEntries();
|
|
174
|
-
|
|
175
|
-
for (let req of networkRequests) {
|
|
176
|
-
if (pattern.constructor.name === 'RegExp' && pattern.test(req.url) || pattern === req.url) {
|
|
177
|
-
throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, `A request matching the URL "${pattern}" was found.`);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
await this._driver.pause(500);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
async waitFor(matcher, timeout = 60 * 1000) {
|
|
186
|
-
if (!this._driver || !this._isInitialized || !this._parent) {
|
|
187
|
-
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` module is not initialized.');
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
if (!this._collectData) {
|
|
191
|
-
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
this._parent.helpers.assertArgument(matcher, 'matcher');
|
|
195
|
-
|
|
196
|
-
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
197
|
-
|
|
198
|
-
const start = Date.now();
|
|
199
|
-
|
|
200
|
-
while (Date.now() - start < timeout) {
|
|
201
|
-
const networkRequests = await this._getEntries();
|
|
202
|
-
|
|
203
|
-
for (var req of networkRequests) {
|
|
204
|
-
if (matcher(req)) {
|
|
205
|
-
return req;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
await this._driver.pause(500);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, 'No request found using the provided matcher.');
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
async assertUrl(url, timeout = 60 * 1000) {
|
|
216
|
-
if (!this._driver || !this._isInitialized || !this._parent) {
|
|
217
|
-
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
if (!this._collectData) {
|
|
221
|
-
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
this._parent.helpers.assertArgument(url, 'url');
|
|
225
|
-
|
|
226
|
-
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
227
|
-
|
|
228
|
-
const start = Date.now();
|
|
229
|
-
|
|
230
|
-
while (Date.now() - start < timeout) {
|
|
231
|
-
const networkRequests = await this._getEntries();
|
|
232
|
-
|
|
233
|
-
for (let req of networkRequests) {
|
|
234
|
-
if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
|
|
235
|
-
return req;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
await this._driver.pause(500);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
async assertStatusCode(url, statusCode, failureMessage = null, timeout = 60 * 1000) {
|
|
246
|
-
if (!this._driver || !this._isInitialized || !this._parent) {
|
|
247
|
-
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
if (!this._collectData) {
|
|
251
|
-
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
this._parent.helpers.assertArgument(url, 'url');
|
|
255
|
-
|
|
256
|
-
this._parent.helpers.assertArgument(statusCode, 'statusCode');
|
|
257
|
-
|
|
258
|
-
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
259
|
-
|
|
260
|
-
const start = Date.now();
|
|
261
|
-
let matchedReq = null;
|
|
262
|
-
|
|
263
|
-
while (Date.now() - start < timeout && !matchedReq) {
|
|
264
|
-
const networkRequests = await this._getEntries();
|
|
265
|
-
|
|
266
|
-
for (let req of networkRequests) {
|
|
267
|
-
if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
|
|
268
|
-
matchedReq = req;
|
|
269
|
-
break;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
!matchedReq && (await this._driver.pause(500));
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
if (!matchedReq) {
|
|
277
|
-
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
if (statusCode !== matchedReq.status) {
|
|
281
|
-
const message = failureMessage || `The expected status code "${statusCode}" does not match "${matchedReq.status}".`;
|
|
282
|
-
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, message);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
async assertResponseContent(url, content, failureMessage = null, timeout = 60 * 1000) {
|
|
287
|
-
if (!this._driver || !this._isInitialized || !this._parent) {
|
|
288
|
-
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
if (!this._collectData) {
|
|
292
|
-
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
this._parent.helpers.assertArgument(url, 'url');
|
|
296
|
-
|
|
297
|
-
this._parent.helpers.assertArgument(content, 'content');
|
|
298
|
-
|
|
299
|
-
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
300
|
-
|
|
301
|
-
const start = Date.now();
|
|
302
|
-
let matchedReq = null;
|
|
303
|
-
|
|
304
|
-
while (Date.now() - start < timeout && !matchedReq) {
|
|
305
|
-
const networkRequests = await this._getEntries();
|
|
306
|
-
|
|
307
|
-
for (let req of networkRequests) {
|
|
308
|
-
if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
|
|
309
|
-
matchedReq = req;
|
|
310
|
-
break;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
!matchedReq && (await this._driver.pause(500));
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
if (!matchedReq) {
|
|
318
|
-
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
const resp = await this._driver.cdp('Network', 'getResponseBody', {
|
|
322
|
-
requestId: matchedReq.requestId
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
if (resp && resp.body && !resp.base64Encoded) {
|
|
326
|
-
if (content.constructor.name === 'RegExp' && (content.test(resp.body) || resp.body.indexOf(content) > -1)) {
|
|
327
|
-
return true;
|
|
328
|
-
} else {
|
|
329
|
-
const message = failureMessage || `Response "${url}" body content does not match "${content}.`;
|
|
330
|
-
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, message);
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
exports.default = NetworkSubModule;
|
|
338
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9veF9zZXJ2aWNlcy9zZXJ2aWNlLWRldnRvb2xzL3N1Ym1vZHVsZS1uZXR3b3JrLmpzIl0sIm5hbWVzIjpbIm9ic2VydmUiLCJOZXR3b3JrU3ViTW9kdWxlIiwiT3h5Z2VuU3ViTW9kdWxlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwicGFyZW50IiwiX2RldlRvb2xzIiwiX2NvbGxlY3REYXRhIiwiX2V2ZW50cyIsImluaXQiLCJkZXZUb29scyIsIl9wYXJlbnQiLCJnZXREcml2ZXIiLCJfZHJpdmVyIiwiZm9yRWFjaCIsIm1ldGhvZCIsIm9uIiwicGFyYW1zIiwicHVzaCIsImRpc3Bvc2UiLCJyZW1vdmVMaXN0ZW5lciIsImVtaXQiLCJlIiwic3RhcnQiLCJzdG9wIiwiZ2V0UmVxdWVzdHMiLCJfZ2V0RW50cmllcyIsImhhciIsImxvZyIsImVudHJpZXMiLCJtYXAiLCJyZXZlcnNlIiwiUHJvbWlzZSIsImFsbCIsIml0ZW0iLCJyZXNwb25zZUJvZHkiLCJjZHAiLCJyZXF1ZXN0SWQiLCJfcmVxdWVzdElkIiwiYm9keSIsIkpTT04iLCJwYXJzZSIsInJlcXVlc3RQb3N0RGF0YSIsInVybCIsInJlcXVlc3QiLCJyZXNwb25zZSIsIndhaXRGb3JVcmwiLCJwYXR0ZXJuIiwidGltZW91dCIsIl9pc0luaXRpYWxpemVkIiwiT3hFcnJvciIsImVyckhlbHBlciIsImVycm9yQ29kZSIsIk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IiLCJoZWxwZXJzIiwiYXNzZXJ0QXJndW1lbnQiLCJhc3NlcnRBcmd1bWVudFRpbWVvdXQiLCJEYXRlIiwibm93IiwibmV0d29ya1JlcXVlc3RzIiwicmVxIiwidGVzdCIsInBhdXNlIiwiVElNRU9VVCIsIndhaXRGb3JOb3RVcmwiLCJ3YWl0Rm9yIiwibWF0Y2hlciIsImFzc2VydFVybCIsIkFTU0VSVF9FUlJPUiIsImFzc2VydFN0YXR1c0NvZGUiLCJzdGF0dXNDb2RlIiwiZmFpbHVyZU1lc3NhZ2UiLCJtYXRjaGVkUmVxIiwic3RhdHVzIiwibWVzc2FnZSIsImFzc2VydFJlc3BvbnNlQ29udGVudCIsImNvbnRlbnQiLCJyZXNwIiwiYmFzZTY0RW5jb2RlZCIsImluZGV4T2YiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVlBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsT0FBTyxHQUFHLENBQ1osMkJBRFksRUFFWix3QkFGWSxFQUdaLG9CQUhZLEVBSVosb0JBSlksRUFLWixxQkFMWSxFQU1aLHlCQU5ZLEVBT1osd0JBUFksRUFRWiw2QkFSWSxFQVNaLDhCQVRZLEVBVVoscUJBVlksRUFXWixxQkFYWSxFQVlaLGlCQVpZLEVBYVosc0NBYlksRUFjWiwrQkFkWSxFQWVaLCtCQWZZLEVBZ0JaLHVCQWhCWSxFQWlCWix3QkFqQlksRUFrQlosK0JBbEJZLEVBbUJaLG1CQW5CWSxFQW9CWiwwQkFwQlksRUFxQlosMEJBckJZLEVBc0JaLDhCQXRCWSxFQXVCWixzQkF2QlksRUF3Qlosa0NBeEJZLEVBeUJaLHNCQXpCWSxFQTBCWixvQ0ExQlksRUEyQlosdUJBM0JZLEVBNEJaLHlCQTVCWSxFQTZCWixnQ0E3QlksRUE4QlosMkJBOUJZLEVBK0JaLDBCQS9CWSxFQWdDWix5QkFoQ1ksRUFpQ1osMEJBakNZLEVBa0NaLDZCQWxDWSxFQW1DWixnQ0FuQ1ksRUFvQ1osNEJBcENZLEVBcUNaLDRDQXJDWSxFQXNDWiwyQ0F0Q1ksRUF1Q1osb0NBdkNZLEVBd0NaLGlDQXhDWSxFQXlDWixtQ0F6Q1ksRUEwQ1osZ0NBMUNZLEVBMkNaLDRCQTNDWSxDQUFoQjs7QUE2Q2UsTUFBTUMsZ0JBQU4sU0FBK0JDLGdDQUEvQixDQUErQztBQUMxREMsRUFBQUEsV0FBVyxDQUFDQyxJQUFELEVBQU9DLE1BQVAsRUFBZTtBQUN0QixVQUFNRCxJQUFOLEVBQVlDLE1BQVo7QUFDQSxTQUFLQyxTQUFMLEdBQWlCLElBQWpCO0FBQ0EsU0FBS0MsWUFBTCxHQUFvQixLQUFwQjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0g7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Q0FBaUIsU0FBakIsRUFBMkIsaUJBQTNCLEVBQThDO0FBQzdEQyxNQUFBQSxTQUFTLEVBQUVtQyxVQUFVLENBQUNuQztBQUR1QyxLQUE5QyxDQUFuQjs7QUFHQSxRQUFJd0MsSUFBSSxJQUFJQSxJQUFJLENBQUN0QyxJQUFiLElBQXFCLENBQUNzQyxJQUFJLENBQUNDLGFBQS9CLEVBQThDO0FBQzFDLFVBQUlGLE9BQU8sQ0FBQ3pFLFdBQVIsQ0FBb0JDLElBQXBCLEtBQTZCLFFBQTdCLEtBQTBDd0UsT0FBTyxDQUFDZixJQUFSLENBQWFnQixJQUFJLENBQUN0QyxJQUFsQixLQUEyQnNDLElBQUksQ0FBQ3RDLElBQUwsQ0FBVXdDLE9BQVYsQ0FBa0JILE9BQWxCLElBQTZCLENBQUMsQ0FBbkcsQ0FBSixFQUEyRztBQUN2RyxlQUFPLElBQVA7QUFDSCxPQUZELE1BR0s7QUFDRCxjQUFNRixPQUFPLEdBQUdILGNBQWMsSUFBSyxhQUFZNUIsR0FBSSxrQ0FBaUNpQyxPQUFRLEdBQTVGO0FBQ0EsY0FBTSxJQUFJMUIsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0JnQixZQUFoQyxFQUE4Q00sT0FBOUMsQ0FBTjtBQUNIO0FBQ0o7QUFDSjs7QUF0V3lEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgbW9uaXRvcmluZyBhbmQgYW5hbHl6aW5nIENocm9tZSBicm93c2VyIG5ldHdvcmsgYWN0aXZpdGllcy5cclxuKi9cclxuaW1wb3J0IHsgT3h5Z2VuU3ViTW9kdWxlIH0gZnJvbSAnLi4vLi4vY29yZS9PeHlnZW5TdWJNb2R1bGUnO1xyXG5pbXBvcnQgeyBoYXJGcm9tTWVzc2FnZXMgfSBmcm9tICdjaHJvbWUtaGFyJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi8uLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuXHJcbmNvbnN0IG9ic2VydmUgPSBbXHJcbiAgICAnUGFnZS5kb21Db250ZW50RXZlbnRGaXJlZCcsXHJcbiAgICAnUGFnZS5maWxlQ2hvb3Nlck9wZW5lZCcsXHJcbiAgICAnUGFnZS5mcmFtZUF0dGFjaGVkJyxcclxuICAgICdQYWdlLmZyYW1lRGV0YWNoZWQnLFxyXG4gICAgJ1BhZ2UuZnJhbWVOYXZpZ2F0ZWQnLFxyXG4gICAgJ1BhZ2UuaW50ZXJzdGl0aWFsSGlkZGVuJyxcclxuICAgICdQYWdlLmludGVyc3RpdGlhbFNob3duJyxcclxuICAgICdQYWdlLmphdmFzY3JpcHREaWFsb2dDbG9zZWQnLFxyXG4gICAgJ1BhZ2UuamF2YXNjcmlwdERpYWxvZ09wZW5pbmcnLFxyXG4gICAgJ1BhZ2UubGlmZWN5Y2xlRXZlbnQnLFxyXG4gICAgJ1BhZ2UubG9hZEV2ZW50RmlyZWQnLFxyXG4gICAgJ1BhZ2Uud2luZG93T3BlbicsXHJcbiAgICAnUGFnZS5mcmFtZUNsZWFyZWRTY2hlZHVsZWROYXZpZ2F0aW9uJyxcclxuICAgICdQYWdlLmZyYW1lU2NoZWR1bGVkTmF2aWdhdGlvbicsXHJcbiAgICAnUGFnZS5jb21waWxhdGlvbkNhY2hlUHJvZHVjZWQnLFxyXG4gICAgJ1BhZ2UuZG93bmxvYWRQcm9ncmVzcycsXHJcbiAgICAnUGFnZS5kb3dubG9hZFdpbGxCZWdpbicsXHJcbiAgICAnUGFnZS5mcmFtZVJlcXVlc3RlZE5hdmlnYXRpb24nLFxyXG4gICAgJ1BhZ2UuZnJhbWVSZXNpemVkJyxcclxuICAgICdQYWdlLmZyYW1lU3RhcnRlZExvYWRpbmcnLFxyXG4gICAgJ1BhZ2UuZnJhbWVTdG9wcGVkTG9hZGluZycsXHJcbiAgICAnUGFnZS5uYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCcsXHJcbiAgICAnUGFnZS5zY3JlZW5jYXN0RnJhbWUnLFxyXG4gICAgJ1BhZ2Uuc2NyZWVuY2FzdFZpc2liaWxpdHlDaGFuZ2VkJyxcclxuICAgICdOZXR3b3JrLmRhdGFSZWNlaXZlZCcsXHJcbiAgICAnTmV0d29yay5ldmVudFNvdXJjZU1lc3NhZ2VSZWNlaXZlZCcsXHJcbiAgICAnTmV0d29yay5sb2FkaW5nRmFpbGVkJyxcclxuICAgICdOZXR3b3JrLmxvYWRpbmdGaW5pc2hlZCcsXHJcbiAgICAnTmV0d29yay5yZXF1ZXN0U2VydmVkRnJvbUNhY2hlJyxcclxuICAgICdOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50JyxcclxuICAgICdOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQnLFxyXG4gICAgJ05ldHdvcmsud2ViU29ja2V0Q2xvc2VkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldENyZWF0ZWQnLFxyXG4gICAgJ05ldHdvcmsud2ViU29ja2V0RnJhbWVFcnJvcicsXHJcbiAgICAnTmV0d29yay53ZWJTb2NrZXRGcmFtZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldEZyYW1lU2VudCcsXHJcbiAgICAnTmV0d29yay53ZWJTb2NrZXRIYW5kc2hha2VSZXNwb25zZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldFdpbGxTZW5kSGFuZHNoYWtlUmVxdWVzdCcsXHJcbiAgICAnTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudEV4dHJhSW5mbycsXHJcbiAgICAnTmV0d29yay5yZXNvdXJjZUNoYW5nZWRQcmlvcml0eScsXHJcbiAgICAnTmV0d29yay5yZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvJyxcclxuICAgICdOZXR3b3JrLnNpZ25lZEV4Y2hhbmdlUmVjZWl2ZWQnLFxyXG4gICAgJ05ldHdvcmsucmVxdWVzdEludGVyY2VwdGVkJ1xyXG5dO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOZXR3b3JrU3ViTW9kdWxlIGV4dGVuZHMgT3h5Z2VuU3ViTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHBhcmVudCkge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHBhcmVudCk7XHJcbiAgICAgICAgdGhpcy5fZGV2VG9vbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdChkZXZUb29scykge1xyXG4gICAgICAgIGlmICghZGV2VG9vbHMgfHwgIXRoaXMuX3BhcmVudCB8fCAhdGhpcy5fcGFyZW50LmdldERyaXZlciB8fCB0eXBlb2YgdGhpcy5fcGFyZW50LmdldERyaXZlciAhPT0gJ2Z1bmN0aW9uJyB8fCAhdGhpcy5fcGFyZW50LmdldERyaXZlcigpKSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmluaXQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZXZUb29scyA9IGRldlRvb2xzO1xyXG4gICAgICAgIHRoaXMuX2RyaXZlciA9IHRoaXMuX3BhcmVudC5nZXREcml2ZXIoKTtcclxuXHJcbiAgICAgICAgb2JzZXJ2ZS5mb3JFYWNoKG1ldGhvZCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlci5vbihtZXRob2QsIHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHMucHVzaCh7IG1ldGhvZCwgcGFyYW1zIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2UoKSB7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcml2ZXIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlLmZvckVhY2goYXN5bmMgbWV0aG9kID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIucmVtb3ZlTGlzdGVuZXIobWV0aG9kLCAoKSA9PiB7fSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuZW1pdCgnTmV0d29yay5kaXNhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuZW1pdCgnTmV0d29yay5jbG9zZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGV2VG9vbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2RyaXZlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gW107XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQmVnaW4gY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFueSBwcmV2aW91c2x5IGNvbGxlY3RlZCByZXF1ZXN0cyB3aWxsIGJlIGRpc2NhcmRlZC4gTmV0d29yayByZXF1ZXN0IGNvbGxlY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgb24gQ2hyb21lIDYzIGFuZCBsYXRlci5cclxuICAgICAqIEBmdW5jdGlvbiBzdGFydFxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W2phdmFzY3JpcHRdIFVzYWdlIGV4YW1wbGU8L2NhcHRpb24+XHJcbiAgICAgKiB3ZWIuaW5pdCgpO1xyXG4gICAgICogd2ViLm5ldHdvcmsuc3RhcnQoKTtcclxuICAgICAqIHdlYi5vcGVuKFwiaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tXCIpO1xyXG4gICAgICogLy8gcHJpbnQgdGhlIGNvbGxlY3RlZCByZXF1ZXN0IHNvIGZhcjpcclxuICAgICAqIGxldCByZXF1ZXN0cyA9IHdlYi5uZXR3b3JrLmdldFJlcXVlc3RzKCk7XHJcbiAgICAgKiBmb3IgKGxldCByZXEgb2YgcmVxdWVzdHMpIHtcclxuICAgICAqICAgbG9nLmluZm8ocmVxKTtcclxuICAgICAqIH1cclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIHZlcmJhdGltIFVSTCBtYXRjaDpcclxuICAgICAqIHdlYi5uZXR3b3JrLndhaXRGb3JVcmwoJ2h0dHBzOi8vd3d3LnlvdXJ3ZWJzaXRlLmNvbS9mb28vYmFyJyk7XHJcbiAgICAgKiAvLyB3YWl0IGZvciBhIHJlcXVlc3QgdXNpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gVVJMIG1hdGNoOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvclVybCgvaHR0cHM6XFwvXFwvLipcXC9mb29cXC9iYXIvKTtcclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIGN1c3RvbSBtYXRjaGVyOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvcihmdW5jdGlvbiAocmVxdWVzdCkge1xyXG4gICAgICogICByZXR1cm4gcmVxdWVzdC5zdGF0dXNUZXh0ID09PSAnT0snICYmIHJlcXVlc3QudXJsID09PSAnaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tL2Zvby9iYXInO1xyXG4gICAgICogfSk7XHJcbiAgICAgKi9cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFN0b3AgY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGZ1bmN0aW9uIHN0b3BcclxuICAgICAqL1xyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJuIGFsbCB0aGUgY29sbGVjdGVkIG5ldHdvcmsgcmVxdWVzdHMgc28gZmFyLlxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlcXVlc3RzXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3RbXX0gQXJyYXkgY29udGFpbmluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRSZXF1ZXN0cygpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9nZXRFbnRyaWVzKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhciA9IGhhckZyb21NZXNzYWdlcyh0aGlzLl9ldmVudHMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGhhciAmJiBoYXIubG9nICYmIGhhci5sb2cuZW50cmllcyAmJiBoYXIubG9nLmVudHJpZXMubWFwKSB7XHJcbiAgICAgICAgICAgICAgICBoYXIubG9nLmVudHJpZXMucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGhhci5sb2cuZW50cmllcy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZUJvZHkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUJvZHkgPSBhd2FpdCB0aGlzLl9kcml2ZXIuY2RwKCdOZXR3b3JrJywnZ2V0UmVzcG9uc2VCb2R5Jywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZ2V0UmVzcG9uc2VCb2R5IGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlQm9keSAmJiByZXNwb25zZUJvZHkuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5LmJvZHkgPSBKU09OLnBhcnNlKHJlc3BvbnNlQm9keS5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHBhcnNlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdFBvc3REYXRhID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvc3REYXRhID0gYXdhaXQgdGhpcy5fZHJpdmVyLmNkcCgnTmV0d29yaycsJ2dldFJlcXVlc3RQb3N0RGF0YScsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogaXRlbS5fcmVxdWVzdElkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGdldFJlcXVlc3RQb3N0RGF0YSBlcnJvcnNcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogaXRlbS5yZXF1ZXN0LnVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0ucmVzcG9uc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvc3REYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAgICogQGZ1bmN0aW9uIHdhaXRGb3JVcmxcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gcGF0dGVybiAtIEFuIFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHdhaXRGb3JVcmwocGF0dGVybiwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgcGF0dGVybi50ZXN0KHJlcS51cmwpIHx8IHBhdHRlcm4gPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3BhdHRlcm59XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgRmFpbCB0aGUgdGVzdCBpZiByZXF1ZXN0IHdpdGggYSBtYXRjaGluZyBVUkwgd2FzIHJlY2VpdmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUgZnJhbWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvck5vdFVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBwYXR0ZXJuIC0gQW4gVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yTm90VXJsKHBhdHRlcm4sIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2Agb3IgYHdlYmAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChwYXR0ZXJuLCAncGF0dGVybicpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrUmVxdWVzdHMgPSBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiBuZXR3b3JrUmVxdWVzdHMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHBhdHRlcm4udGVzdChyZXEudXJsKSB8fCBwYXR0ZXJuID09PSByZXEudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VULCBgQSByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3BhdHRlcm59XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0LlxyXG4gICAgICogQGZ1bmN0aW9uIG5ldHdvcmtXYWl0Rm9yXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtYXRjaGVyIC0gTWF0Y2hpbmcgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gdHJ1ZSBvbiBtYXRjaCwgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgd2FpdEZvcihtYXRjaGVyLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2B3ZWIubmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KG1hdGNoZXIsICdtYXRjaGVyJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIocmVxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVElNRU9VVCwgJ05vIHJlcXVlc3QgZm91bmQgdXNpbmcgdGhlIHByb3ZpZGVkIG1hdGNoZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0VXJsKHVybCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHt1cmx9XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzQ29kZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c0NvZGUgLSBBIHJlc3BvbnNlIHN0YXR1cyBjb2RlIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFN0YXR1c0NvZGUodXJsLCBzdGF0dXNDb2RlLCBmYWlsdXJlTWVzc2FnZSA9IG51bGwsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2Agb3IgYHdlYmAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHdlYi5uZXR3b3JrLnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYG5ldHdvcmtgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQodXJsLCAndXJsJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQoc3RhdHVzQ29kZSwgJ3N0YXR1c0NvZGUnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgbGV0IG1hdGNoZWRSZXEgPSBudWxsO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0ICYmICFtYXRjaGVkUmVxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiB1cmwudGVzdChyZXEudXJsKSB8fCB1cmwgPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVxID0gcmVxO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICFtYXRjaGVkUmVxICYmIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3VybH1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdGF0dXNDb2RlICE9PSBtYXRjaGVkUmVxLnN0YXR1cykge1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZmFpbHVyZU1lc3NhZ2UgfHwgYFRoZSBleHBlY3RlZCBzdGF0dXMgY29kZSBcIiR7c3RhdHVzQ29kZX1cIiBkb2VzIG5vdCBtYXRjaCBcIiR7bWF0Y2hlZFJlcS5zdGF0dXN9XCIuYDtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB3aGV0aGVyIEhUVFAgcmVzcG9uc2UgY29udGVudCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgcGF0dGVybi5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRSZXNwb25zZUNvbnRlbnRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gdXJsIC0gQSByZXF1ZXN0IFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gY29udGVudCAtIEEgcmVzcG9uc2UgYm9keSBjb250ZW50IHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFJlc3BvbnNlQ29udGVudCh1cmwsIGNvbnRlbnQsIGZhaWx1cmVNZXNzYWdlID0gbnVsbCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChjb250ZW50LCAnY29udGVudCcpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgbWF0Y2hlZFJlcSA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQgJiYgIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSZXEgPSByZXE7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIW1hdGNoZWRSZXEgJiYgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7dXJsfVwiIHdhcyBmb3VuZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuX2RyaXZlci5jZHAoJ05ldHdvcmsnLCdnZXRSZXNwb25zZUJvZHknLCB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RJZDogbWF0Y2hlZFJlcS5yZXF1ZXN0SWRcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAocmVzcCAmJiByZXNwLmJvZHkgJiYgIXJlc3AuYmFzZTY0RW5jb2RlZCkge1xyXG4gICAgICAgICAgICBpZiAoY29udGVudC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiAoY29udGVudC50ZXN0KHJlc3AuYm9keSkgfHwgcmVzcC5ib2R5LmluZGV4T2YoY29udGVudCkgPiAtMSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGZhaWx1cmVNZXNzYWdlIHx8IGBSZXNwb25zZSBcIiR7dXJsfVwiIGJvZHkgY29udGVudCBkb2VzIG5vdCBtYXRjaCBcIiR7Y29udGVudH0uYDtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iXX0=
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
require("source-map-support/register");
|
|
9
|
-
|
|
10
|
-
var _devtoolsService = _interopRequireDefault(require("@wdio/devtools-service"));
|
|
11
|
-
|
|
12
|
-
var _OxygenService = _interopRequireDefault(require("../core/OxygenService"));
|
|
13
|
-
|
|
14
|
-
var _submoduleNetwork = _interopRequireDefault(require("./service-devtools/submodule-network"));
|
|
15
|
-
|
|
16
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
-
|
|
18
|
-
class DevToolsService extends _OxygenService.default {
|
|
19
|
-
constructor(options, ctx, results, logger) {
|
|
20
|
-
super(options, ctx, results, logger);
|
|
21
|
-
this._subModules = {};
|
|
22
|
-
this.isServiceInitialized = true;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
onModuleLoaded(module) {
|
|
26
|
-
if (!module || !module.getDriver || typeof module.getDriver !== 'function' || !module.getCapabilities || typeof module.getCapabilities !== 'function') {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const networkSubmodule = new _submoduleNetwork.default('network', module);
|
|
31
|
-
module.addSubModule('network', networkSubmodule);
|
|
32
|
-
this._subModules[module.name] = networkSubmodule;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
async onModuleInitialized(module) {
|
|
36
|
-
if (!module || !module.getDriver || typeof module.getDriver !== 'function' || !module.getCapabilities || typeof module.getCapabilities !== 'function') {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const submodule = this._subModules[module.name];
|
|
41
|
-
|
|
42
|
-
if (!submodule || submodule.isInitialized) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
let options = {};
|
|
47
|
-
const capabilities = module.getCapabilities();
|
|
48
|
-
this._driver = module.getDriver();
|
|
49
|
-
|
|
50
|
-
if (this._driver && this._driver.capabilities && this._driver.capabilities['goog:chromeOptions'] && this._driver.capabilities['goog:chromeOptions']['debuggerAddress']) {
|
|
51
|
-
options.debuggerAddress = this._driver.capabilities['goog:chromeOptions']['debuggerAddress'];
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (this._driver.provider === null) {
|
|
55
|
-
const devToolsSvc = new _devtoolsService.default(options);
|
|
56
|
-
const UNSUPPORTED_ERROR_MESSAGE = devToolsSvc.beforeSession(null, capabilities);
|
|
57
|
-
|
|
58
|
-
if (UNSUPPORTED_ERROR_MESSAGE) {
|
|
59
|
-
console.log('UNSUPPORTED_ERROR_MESSAGE', UNSUPPORTED_ERROR_MESSAGE);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if (devToolsSvc._isSupported) {
|
|
63
|
-
global.browser = module.getDriver();
|
|
64
|
-
await devToolsSvc.before(null, null, this._driver);
|
|
65
|
-
submodule.init(devToolsSvc);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
onModuleWillDispose(module) {
|
|
71
|
-
const submodule = this._subModules[module.name];
|
|
72
|
-
|
|
73
|
-
if (!submodule) {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
submodule.dispose();
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
exports.default = DevToolsService;
|
|
83
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9zZXJ2aWNlcy9zZXJ2aWNlLWRldnRvb2xzLmpzIl0sIm5hbWVzIjpbIkRldlRvb2xzU2VydmljZSIsIk94eWdlblNlcnZpY2UiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjdHgiLCJyZXN1bHRzIiwibG9nZ2VyIiwiX3N1Yk1vZHVsZXMiLCJpc1NlcnZpY2VJbml0aWFsaXplZCIsIm9uTW9kdWxlTG9hZGVkIiwibW9kdWxlIiwiZ2V0RHJpdmVyIiwiZ2V0Q2FwYWJpbGl0aWVzIiwibmV0d29ya1N1Ym1vZHVsZSIsIk5ldHdvcmtTdWJNb2R1bGUiLCJhZGRTdWJNb2R1bGUiLCJuYW1lIiwib25Nb2R1bGVJbml0aWFsaXplZCIsInN1Ym1vZHVsZSIsImlzSW5pdGlhbGl6ZWQiLCJjYXBhYmlsaXRpZXMiLCJfZHJpdmVyIiwiZGVidWdnZXJBZGRyZXNzIiwicHJvdmlkZXIiLCJkZXZUb29sc1N2YyIsIldESU9EZXZUb29sc1NlcnZpY2UiLCJVTlNVUFBPUlRFRF9FUlJPUl9NRVNTQUdFIiwiYmVmb3JlU2Vzc2lvbiIsImNvbnNvbGUiLCJsb2ciLCJfaXNTdXBwb3J0ZWQiLCJnbG9iYWwiLCJicm93c2VyIiwiYmVmb3JlIiwiaW5pdCIsIm9uTW9kdWxlV2lsbERpc3Bvc2UiLCJkaXNwb3NlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQTs7QUFFQTs7QUFDQTs7OztBQUVlLE1BQU1BLGVBQU4sU0FBOEJDLHNCQUE5QixDQUE0QztBQUN2REMsRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVVDLEdBQVYsRUFBZUMsT0FBZixFQUF3QkMsTUFBeEIsRUFBZ0M7QUFDdkMsVUFBTUgsT0FBTixFQUFlQyxHQUFmLEVBQW9CQyxPQUFwQixFQUE2QkMsTUFBN0I7QUFFQSxTQUFLQyxXQUFMLEdBQW1CLEVBQW5CO0FBQ0EsU0FBS0Msb0JBQUwsR0FBNEIsSUFBNUI7QUFDSDs7QUFDREMsRUFBQUEsY0FBYyxDQUFDQyxNQUFELEVBQVM7QUFFbkIsUUFBSSxDQUFDQSxNQUFELElBQVcsQ0FBQ0EsTUFBTSxDQUFDQyxTQUFuQixJQUFnQyxPQUFPRCxNQUFNLENBQUNDLFNBQWQsS0FBNEIsVUFBNUQsSUFBMEUsQ0FBQ0QsTUFBTSxDQUFDRSxlQUFsRixJQUFxRyxPQUFPRixNQUFNLENBQUNFLGVBQWQsS0FBa0MsVUFBM0ksRUFBdUo7QUFDbko7QUFDSDs7QUFFRCxVQUFNQyxnQkFBZ0IsR0FBRyxJQUFJQyx5QkFBSixDQUFxQixTQUFyQixFQUFnQ0osTUFBaEMsQ0FBekI7QUFDQUEsSUFBQUEsTUFBTSxDQUFDSyxZQUFQLENBQW9CLFNBQXBCLEVBQStCRixnQkFBL0I7QUFDQSxTQUFLTixXQUFMLENBQWlCRyxNQUFNLENBQUNNLElBQXhCLElBQWdDSCxnQkFBaEM7QUFDSDs7QUFDd0IsUUFBbkJJLG1CQUFtQixDQUFDUCxNQUFELEVBQVM7QUFFOUIsUUFBSSxDQUFDQSxNQUFELElBQVcsQ0FBQ0EsTUFBTSxDQUFDQyxTQUFuQixJQUFnQyxPQUFPRCxNQUFNLENBQUNDLFNBQWQsS0FBNEIsVUFBNUQsSUFBMEUsQ0FBQ0QsTUFBTSxDQUFDRSxlQUFsRixJQUFxRyxPQUFPRixNQUFNLENBQUNFLGVBQWQsS0FBa0MsVUFBM0ksRUFBdUo7QUFDbko7QUFDSDs7QUFDRCxVQUFNTSxTQUFTLEdBQUcsS0FBS1gsV0FBTCxDQUFpQkcsTUFBTSxDQUFDTSxJQUF4QixDQUFsQjs7QUFDQSxRQUFJLENBQUNFLFNBQUQsSUFBY0EsU0FBUyxDQUFDQyxhQUE1QixFQUEyQztBQUN2QztBQUNIOztBQUVELFFBQUloQixPQUFPLEdBQUcsRUFBZDtBQUNBLFVBQU1pQixZQUFZLEdBQUdWLE1BQU0sQ0FBQ0UsZUFBUCxFQUFyQjtBQUNBLFNBQUtTLE9BQUwsR0FBZVgsTUFBTSxDQUFDQyxTQUFQLEVBQWY7O0FBRUEsUUFDSSxLQUFLVSxPQUFMLElBQ0EsS0FBS0EsT0FBTCxDQUFhRCxZQURiLElBRUEsS0FBS0MsT0FBTCxDQUFhRCxZQUFiLENBQTBCLG9CQUExQixDQUZBLElBR0EsS0FBS0MsT0FBTCxDQUFhRCxZQUFiLENBQTBCLG9CQUExQixFQUFnRCxpQkFBaEQsQ0FKSixFQUtFO0FBQ0VqQixNQUFBQSxPQUFPLENBQUNtQixlQUFSLEdBQTBCLEtBQUtELE9BQUwsQ0FBYUQsWUFBYixDQUEwQixvQkFBMUIsRUFBZ0QsaUJBQWhELENBQTFCO0FBQ0g7O0FBR0QsUUFBSSxLQUFLQyxPQUFMLENBQWFFLFFBQWIsS0FBMEIsSUFBOUIsRUFBb0M7QUFFaEMsWUFBTUMsV0FBVyxHQUFHLElBQUlDLHdCQUFKLENBQXdCdEIsT0FBeEIsQ0FBcEI7QUFDQSxZQUFNdUIseUJBQXlCLEdBQUdGLFdBQVcsQ0FBQ0csYUFBWixDQUEwQixJQUExQixFQUFnQ1AsWUFBaEMsQ0FBbEM7O0FBRUEsVUFBSU0seUJBQUosRUFBK0I7QUFDM0JFLFFBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLDJCQUFaLEVBQXlDSCx5QkFBekM7QUFDSDs7QUFFRCxVQUFJRixXQUFXLENBQUNNLFlBQWhCLEVBQThCO0FBRzFCQyxRQUFBQSxNQUFNLENBQUNDLE9BQVAsR0FBaUJ0QixNQUFNLENBQUNDLFNBQVAsRUFBakI7QUFDQSxjQUFNYSxXQUFXLENBQUNTLE1BQVosQ0FBbUIsSUFBbkIsRUFBeUIsSUFBekIsRUFBK0IsS0FBS1osT0FBcEMsQ0FBTjtBQUNBSCxRQUFBQSxTQUFTLENBQUNnQixJQUFWLENBQWVWLFdBQWY7QUFFSDtBQUNKO0FBQ0o7O0FBQ0RXLEVBQUFBLG1CQUFtQixDQUFDekIsTUFBRCxFQUFTO0FBQ3hCLFVBQU1RLFNBQVMsR0FBRyxLQUFLWCxXQUFMLENBQWlCRyxNQUFNLENBQUNNLElBQXhCLENBQWxCOztBQUNBLFFBQUksQ0FBQ0UsU0FBTCxFQUFnQjtBQUNaO0FBQ0g7O0FBQ0RBLElBQUFBLFNBQVMsQ0FBQ2tCLE9BQVY7QUFDSDs7QUFsRXNEIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW5yZWFjaGFibGUgKi9cclxuaW1wb3J0IFdESU9EZXZUb29sc1NlcnZpY2UgZnJvbSAnQHdkaW8vZGV2dG9vbHMtc2VydmljZSc7XHJcblxyXG5pbXBvcnQgT3h5Z2VuU2VydmljZSBmcm9tICcuLi9jb3JlL094eWdlblNlcnZpY2UnO1xyXG5pbXBvcnQgTmV0d29ya1N1Yk1vZHVsZSBmcm9tICcuL3NlcnZpY2UtZGV2dG9vbHMvc3VibW9kdWxlLW5ldHdvcmsnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGV2VG9vbHNTZXJ2aWNlIGV4dGVuZHMgT3h5Z2VuU2VydmljZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjdHgsIHJlc3VsdHMsIGxvZ2dlcikge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGN0eCwgcmVzdWx0cywgbG9nZ2VyKTtcclxuICAgICAgICAvLyBoYXNoIG9mIHdlYmRyaXZlciBiYXNlZCBtb2R1bGVzXHJcbiAgICAgICAgdGhpcy5fc3ViTW9kdWxlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuaXNTZXJ2aWNlSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgb25Nb2R1bGVMb2FkZWQobW9kdWxlKSB7XHJcbiAgICAgICAgLy8gc2tpcCBhbnkgbW9kdWxlIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IC5nZXREcml2ZXIoKSBtZXRob2QgKGUuZy4gbm90IHdlYmRyaXZlciBiYXNlZClcclxuICAgICAgICBpZiAoIW1vZHVsZSB8fCAhbW9kdWxlLmdldERyaXZlciB8fCB0eXBlb2YgbW9kdWxlLmdldERyaXZlciAhPT0gJ2Z1bmN0aW9uJyB8fCAhbW9kdWxlLmdldENhcGFiaWxpdGllcyB8fCB0eXBlb2YgbW9kdWxlLmdldENhcGFiaWxpdGllcyAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuZXR3b3JrU3VibW9kdWxlID0gbmV3IE5ldHdvcmtTdWJNb2R1bGUoJ25ldHdvcmsnLCBtb2R1bGUpO1xyXG4gICAgICAgIG1vZHVsZS5hZGRTdWJNb2R1bGUoJ25ldHdvcmsnLCBuZXR3b3JrU3VibW9kdWxlKTtcclxuICAgICAgICB0aGlzLl9zdWJNb2R1bGVzW21vZHVsZS5uYW1lXSA9IG5ldHdvcmtTdWJtb2R1bGU7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbk1vZHVsZUluaXRpYWxpemVkKG1vZHVsZSkge1xyXG4gICAgICAgIC8vIHNraXAgYW55IG1vZHVsZSB0aGF0IGRvZXMgbm90IGltcGxlbWVudCBnZXREcml2ZXIgbWV0aG9kIChlLmcuIG5vdCB3ZWJkcml2ZXIgYmFzZWQpXHJcbiAgICAgICAgaWYgKCFtb2R1bGUgfHwgIW1vZHVsZS5nZXREcml2ZXIgfHwgdHlwZW9mIG1vZHVsZS5nZXREcml2ZXIgIT09ICdmdW5jdGlvbicgfHwgIW1vZHVsZS5nZXRDYXBhYmlsaXRpZXMgfHwgdHlwZW9mIG1vZHVsZS5nZXRDYXBhYmlsaXRpZXMgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdWJtb2R1bGUgPSB0aGlzLl9zdWJNb2R1bGVzW21vZHVsZS5uYW1lXTtcclxuICAgICAgICBpZiAoIXN1Ym1vZHVsZSB8fCBzdWJtb2R1bGUuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgb3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IG1vZHVsZS5nZXRDYXBhYmlsaXRpZXMoKTtcclxuICAgICAgICB0aGlzLl9kcml2ZXIgPSBtb2R1bGUuZ2V0RHJpdmVyKCk7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyICYmXHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlci5jYXBhYmlsaXRpZXMgJiZcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyLmNhcGFiaWxpdGllc1snZ29vZzpjaHJvbWVPcHRpb25zJ10gJiZcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyLmNhcGFiaWxpdGllc1snZ29vZzpjaHJvbWVPcHRpb25zJ11bJ2RlYnVnZ2VyQWRkcmVzcyddXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuZGVidWdnZXJBZGRyZXNzID0gdGhpcy5fZHJpdmVyLmNhcGFiaWxpdGllc1snZ29vZzpjaHJvbWVPcHRpb25zJ11bJ2RlYnVnZ2VyQWRkcmVzcyddO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCB1c2luZyBhbnkgM3JkIHBhcnR5IHByb3ZpZGVyXHJcbiAgICAgICAgaWYgKHRoaXMuX2RyaXZlci5wcm92aWRlciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyBpbml0aWFsaXplIERldlRvb2xzU2VydmljZSBhbmQgaG9vayBpdCB0byB0aGUgY3VycmVudCB3ZWJkcml2ZXIgb2JqZWN0XHJcbiAgICAgICAgICAgIGNvbnN0IGRldlRvb2xzU3ZjID0gbmV3IFdESU9EZXZUb29sc1NlcnZpY2Uob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGNvbnN0IFVOU1VQUE9SVEVEX0VSUk9SX01FU1NBR0UgPSBkZXZUb29sc1N2Yy5iZWZvcmVTZXNzaW9uKG51bGwsIGNhcGFiaWxpdGllcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoVU5TVVBQT1JURURfRVJST1JfTUVTU0FHRSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VOU1VQUE9SVEVEX0VSUk9SX01FU1NBR0UnLCBVTlNVUFBPUlRFRF9FUlJPUl9NRVNTQUdFKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRldlRvb2xzU3ZjLl9pc1N1cHBvcnRlZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gY2hhbmdlIGdsb2JhbC5icm93c2VyIHRvIHRoZSBjdXJyZW50IG1vZHVsZSdzIHdlYmRyaXZlciBpbnN0YW5jZVxyXG4gICAgICAgICAgICAgICAgLy8gY29uc3Qgb3JnR2xvYmFsQnJvd3NlciA9IGdsb2JhbC5icm93c2VyO1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLmJyb3dzZXIgPSBtb2R1bGUuZ2V0RHJpdmVyKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkZXZUb29sc1N2Yy5iZWZvcmUobnVsbCwgbnVsbCwgdGhpcy5fZHJpdmVyKTtcclxuICAgICAgICAgICAgICAgIHN1Ym1vZHVsZS5pbml0KGRldlRvb2xzU3ZjKTtcclxuICAgICAgICAgICAgICAgIC8vIGdsb2JhbC5icm93c2VyID0gb3JnR2xvYmFsQnJvd3NlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG9uTW9kdWxlV2lsbERpc3Bvc2UobW9kdWxlKSB7XHJcbiAgICAgICAgY29uc3Qgc3VibW9kdWxlID0gdGhpcy5fc3ViTW9kdWxlc1ttb2R1bGUubmFtZV07XHJcbiAgICAgICAgaWYgKCFzdWJtb2R1bGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdWJtb2R1bGUuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG59Il19
|