UNPKG

@nota/nativescript-webview-ext

Version:

Extended WebView for NativeScript which adds 'x-local' scheme for local-files. events between WebView and native-layer, javascript execution, injecting CSS and JS-files.

228 lines 28 kB
"use strict"; function __export(m) { for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } Object.defineProperty(exports, "__esModule", { value: true }); var profiling_1 = require("tns-core-modules/profiling"); var view_1 = require("tns-core-modules/ui/core/view"); var webview_ext_common_1 = require("./webview-ext-common"); var webview_ext_uiwebview_1 = require("./webview-ext.uiwebview"); var webview_ext_wkwebview_1 = require("./webview-ext.wkwebview"); __export(require("./webview-ext-common")); var WebViewExt = (function (_super) { __extends(WebViewExt, _super); function WebViewExt() { return _super !== null && _super.apply(this, arguments) || this; } Object.defineProperty(WebViewExt.prototype, "isUIWebView", { get: function () { return !webview_ext_common_1.useWKWebView; }, enumerable: true, configurable: true }); Object.defineProperty(WebViewExt.prototype, "isWKWebView", { get: function () { return webview_ext_common_1.useWKWebView; }, enumerable: true, configurable: true }); WebViewExt.prototype.createNativeView = function () { if (webview_ext_common_1.useWKWebView) { this.nativeWrapper = new webview_ext_wkwebview_1.WKWebViewWrapper(this); } else { this.nativeWrapper = new webview_ext_uiwebview_1.UIWebViewWrapper(this); } return this.nativeWrapper.createNativeView(); }; WebViewExt.prototype.initNativeView = function () { _super.prototype.initNativeView.call(this); this.nativeWrapper.initNativeView(); }; WebViewExt.prototype.disposeNativeView = function () { this.nativeWrapper.disposeNativeView(); _super.prototype.disposeNativeView.call(this); }; WebViewExt.prototype.injectWebViewBridge = function () { if (this.nativeWrapper.shouldInjectWebViewBridge) { return _super.prototype.injectWebViewBridge.call(this); } return this.ensurePolyfills(); }; WebViewExt.prototype.executeJavaScript = function (scriptCode, stringifyResult) { if (stringifyResult === void 0) { stringifyResult = true; } return __awaiter(this, void 0, void 0, function () { var rawResult, result, r, error; return __generator(this, function (_a) { switch (_a.label) { case 0: if (stringifyResult) { scriptCode = "\n (function(window) {\n var result = null;\n\n try {\n result = " + scriptCode.trim() + ";\n } catch (err) {\n return JSON.stringify({\n error: true,\n message: err.message,\n stack: err.stack\n });\n }\n\n try {\n return JSON.stringify(result);\n } catch (err) {\n return result;\n }\n })(window);\n "; } return [4, this.nativeWrapper.executeJavaScript(scriptCode.trim())]; case 1: rawResult = _a.sent(); return [4, this.parseWebViewJavascriptResult(rawResult)]; case 2: result = _a.sent(); r = result; if (r && typeof r === "object" && r.error) { error = new Error(r.message); error.webStack = r.stack; throw error; } return [2, result]; } }); }); }; WebViewExt.prototype.onLoaded = function () { _super.prototype.onLoaded.call(this); this.nativeWrapper.onLoaded(); }; WebViewExt.prototype.onUnloaded = function () { this.nativeWrapper.onUnloaded(); _super.prototype.onUnloaded.call(this); }; WebViewExt.prototype.stopLoading = function () { this.nativeWrapper.stopLoading(); }; WebViewExt.prototype._loadUrl = function (src) { this.nativeWrapper.loadUrl(src); }; WebViewExt.prototype._loadData = function (content) { this.nativeWrapper.loadData(content); }; Object.defineProperty(WebViewExt.prototype, "canGoBack", { get: function () { return this.nativeWrapper.canGoBack; }, enumerable: true, configurable: true }); Object.defineProperty(WebViewExt.prototype, "canGoForward", { get: function () { return this.nativeWrapper.canGoForward; }, enumerable: true, configurable: true }); WebViewExt.prototype.goBack = function () { return this.nativeWrapper.goBack(); }; WebViewExt.prototype.goForward = function () { return this.nativeWrapper.goForward(); }; WebViewExt.prototype.reload = function () { return this.nativeWrapper.reload(); }; WebViewExt.prototype.registerLocalResource = function (resourceName, path) { resourceName = this.fixLocalResourceName(resourceName); var filepath = this.resolveLocalResourceFilePath(path); if (!filepath) { this.writeTrace("WebViewExt<ios>.registerLocalResource(\"" + resourceName + "\", \"" + path + "\") -> file doesn't exist", view_1.traceMessageType.error); return; } this.writeTrace("WebViewExt<ios>.registerLocalResource(\"" + resourceName + "\", \"" + path + "\") -> file: \"" + filepath + "\""); this.nativeWrapper.registerLocalResourceForNative(resourceName, filepath); }; WebViewExt.prototype.unregisterLocalResource = function (resourceName) { this.writeTrace("WebViewExt<ios>.unregisterLocalResource(\"" + resourceName + "\")"); resourceName = this.fixLocalResourceName(resourceName); this.nativeWrapper.unregisterLocalResourceForNative(resourceName); }; WebViewExt.prototype.getRegisteredLocalResource = function (resourceName) { resourceName = this.fixLocalResourceName(resourceName); var result = this.nativeWrapper.getRegisteredLocalResourceFromNative(resourceName); this.writeTrace("WebViewExt<android>.getRegisteredLocalResource(\"" + resourceName + "\") -> \"" + result + "\""); return result; }; WebViewExt.prototype.onUIWebViewEvent = function (url) { return __awaiter(this, void 0, void 0, function () { var message, _a, eventName, resId, data, err_1; return __generator(this, function (_b) { switch (_b.label) { case 0: if (!this.isUIWebView) { this.writeTrace("WebViewExt.onUIWebViewEvent(\"" + url + "\") - only works for UIWebView", view_1.traceMessageType.error); return [2]; } if (!url.startsWith("js2ios")) { this.writeTrace("WebViewExt.onUIWebViewEvent(\"" + url + "\") - only supports js2ios-scheme", view_1.traceMessageType.error); return [2]; } _b.label = 1; case 1: _b.trys.push([1, 3, , 4]); message = decodeURIComponent(url.replace(/^js2ios:/, "")); _a = JSON.parse(message), eventName = _a.eventName, resId = _a.resId; return [4, this.executeJavaScript("window.nsWebViewBridge.getUIWebViewResponse(" + JSON.stringify(resId) + ")")]; case 2: data = _b.sent(); this.onWebViewEvent(eventName, data); return [3, 4]; case 3: err_1 = _b.sent(); this.writeTrace("WebViewExt.onUIWebViewEvent(\"" + url + ")\" - \"" + err_1 + "\"", view_1.traceMessageType.error); return [3, 4]; case 4: return [2]; } }); }); }; WebViewExt.prototype.getTitle = function () { return this.executeJavaScript("document.title"); }; WebViewExt.prototype.autoLoadStyleSheetFile = function (resourceName, filepath, insertBefore) { if (this.isWKWebView) { return this.nativeWrapper.autoLoadStyleSheetFile(resourceName, filepath, insertBefore); } else { return _super.prototype.autoLoadStyleSheetFile.call(this, resourceName, filepath, insertBefore); } }; WebViewExt.prototype.removeAutoLoadStyleSheetFile = function (resourceName) { if (this.isWKWebView) { this.nativeWrapper.removeAutoLoadStyleSheetFile(resourceName); } else { _super.prototype.removeAutoLoadStyleSheetFile.call(this, resourceName); } }; WebViewExt.prototype.autoLoadJavaScriptFile = function (resourceName, filepath) { if (this.isWKWebView) { this.nativeWrapper.autoLoadJavaScriptFile(resourceName, filepath); } else { _super.prototype.autoLoadJavaScriptFile.call(this, resourceName, filepath); } }; WebViewExt.prototype.removeAutoLoadJavaScriptFile = function (resourceName) { if (this.isWKWebView) { this.nativeWrapper.removeAutoLoadJavaScriptFile(resourceName); } else { _super.prototype.removeAutoLoadJavaScriptFile.call(this, resourceName); } }; WebViewExt.prototype[webview_ext_common_1.autoInjectJSBridgeProperty.setNative] = function (enabled) { this.nativeWrapper.enableAutoInject(enabled); }; WebViewExt.prototype[webview_ext_common_1.scrollBounceProperty.getDefault] = function () { return this.nativeWrapper.scrollBounce; }; WebViewExt.prototype[webview_ext_common_1.scrollBounceProperty.setNative] = function (enabled) { this.nativeWrapper.scrollBounce = enabled; }; __decorate([ profiling_1.profile, __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], WebViewExt.prototype, "onLoaded", null); return WebViewExt; }(webview_ext_common_1.WebViewExtBase)); exports.WebViewExt = WebViewExt; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vidmlldy1leHQuaW9zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2Vidmlldy1leHQuaW9zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsd0RBQXFEO0FBQ3JELHNEQUFpRTtBQUVqRSwyREFBeUk7QUFDekksaUVBQTJEO0FBQzNELGlFQUEyRDtBQUUzRCwwQ0FBcUM7QUFFckM7SUFBZ0MsOEJBQWM7SUFBOUM7O0lBa09BLENBQUM7SUEvTkcsc0JBQVcsbUNBQVc7YUFBdEI7WUFDSSxPQUFPLENBQUMsaUNBQVksQ0FBQztRQUN6QixDQUFDOzs7T0FBQTtJQUVELHNCQUFXLG1DQUFXO2FBQXRCO1lBQ0ksT0FBTyxpQ0FBWSxDQUFDO1FBQ3hCLENBQUM7OztPQUFBO0lBRU0scUNBQWdCLEdBQXZCO1FBQ0ksSUFBSSxpQ0FBWSxFQUFFO1lBQ2QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLHdDQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25EO2FBQU07WUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksd0NBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkQ7UUFFRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRU0sbUNBQWMsR0FBckI7UUFDSSxpQkFBTSxjQUFjLFdBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFTSxzQ0FBaUIsR0FBeEI7UUFDSSxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFdkMsaUJBQU0saUJBQWlCLFdBQUUsQ0FBQztJQUM5QixDQUFDO0lBRVMsd0NBQW1CLEdBQTdCO1FBQ0ksSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLHlCQUF5QixFQUFFO1lBQzlDLE9BQU8saUJBQU0sbUJBQW1CLFdBQUUsQ0FBQztTQUN0QztRQUdELE9BQU8sSUFBSSxD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Q0FBQyxXQUFXLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDckU7YUFBTTtZQUNILGlCQUFNLHNCQUFzQixZQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztTQUN4RDtJQUNMLENBQUM7SUFFTSxpREFBNEIsR0FBbkMsVUFBb0MsWUFBb0I7UUFDcEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDakU7YUFBTTtZQUNILGlCQUFNLDRCQUE0QixZQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3BEO0lBQ0wsQ0FBQztJQUVELHFCQUFDLCtDQUEwQixDQUFDLFNBQVMsQ0FBQyxHQUF0QyxVQUF1QyxPQUFnQjtRQUNuRCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxxQkFBQyx5Q0FBb0IsQ0FBQyxVQUFVLENBQUMsR0FBakM7UUFDSSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDO0lBQzNDLENBQUM7SUFFRCxxQkFBQyx5Q0FBb0IsQ0FBQyxTQUFTLENBQUMsR0FBaEMsVUFBaUMsT0FBZ0I7UUFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDO0lBQzlDLENBQUM7SUEvSUQ7UUFEQyxtQkFBTzs7Ozs4Q0FLUDtJQTRJTCxpQkFBQztDQUFBLEFBbE9ELENBQWdDLG1DQUFjLEdBa083QztBQWxPWSxnQ0FBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL25vZGVfbW9kdWxlcy90bnMtcGxhdGZvcm0tZGVjbGFyYXRpb25zL2lvcy5kLnRzXCIgLz5cblxuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gXCJ0bnMtY29yZS1tb2R1bGVzL3Byb2ZpbGluZ1wiO1xuaW1wb3J0IHsgdHJhY2VNZXNzYWdlVHlwZSB9IGZyb20gXCJ0bnMtY29yZS1tb2R1bGVzL3VpL2NvcmUvdmlld1wiO1xuXG5pbXBvcnQgeyBhdXRvSW5qZWN0SlNCcmlkZ2VQcm9wZXJ0eSwgSU9TV2ViVmlld1dyYXBwZXIsIHNjcm9sbEJvdW5jZVByb3BlcnR5LCB1c2VXS1dlYlZpZXcsIFdlYlZpZXdFeHRCYXNlIH0gZnJvbSBcIi4vd2Vidmlldy1leHQtY29tbW9uXCI7XG5pbXBvcnQgeyBVSVdlYlZpZXdXcmFwcGVyIH0gZnJvbSBcIi4vd2Vidmlldy1leHQudWl3ZWJ2aWV3XCI7XG5pbXBvcnQgeyBXS1dlYlZpZXdXcmFwcGVyIH0gZnJvbSBcIi4vd2Vidmlldy1leHQud2t3ZWJ2aWV3XCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL3dlYnZpZXctZXh0LWNvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgV2ViVmlld0V4dCBleHRlbmRzIFdlYlZpZXdFeHRCYXNlIHtcbiAgICBwcm90ZWN0ZWQgbmF0aXZlV3JhcHBlcjogSU9TV2ViVmlld1dyYXBwZXI7XG5cbiAgICBwdWJsaWMgZ2V0IGlzVUlXZWJWaWV3KCkge1xuICAgICAgICByZXR1cm4gIXVzZVdLV2ViVmlldztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzV0tXZWJWaWV3KCkge1xuICAgICAgICByZXR1cm4gdXNlV0tXZWJWaWV3O1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVOYXRpdmVWaWV3KCkge1xuICAgICAgICBpZiAodXNlV0tXZWJWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZVdyYXBwZXIgPSBuZXcgV0tXZWJWaWV3V3JhcHBlcih0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlV3JhcHBlciA9IG5ldyBVSVdlYlZpZXdXcmFwcGVyKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlV3JhcHBlci5jcmVhdGVOYXRpdmVWaWV3KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXROYXRpdmVWaWV3KCkge1xuICAgICAgICBzdXBlci5pbml0TmF0aXZlVmlldygpO1xuXG4gICAgICAgIHRoaXMubmF0aXZlV3JhcHBlci5pbml0TmF0aXZlVmlldygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwb3NlTmF0aXZlVmlldygpIHtcbiAgICAgICAgdGhpcy5uYXRpdmVXcmFwcGVyLmRpc3Bvc2VOYXRpdmVWaWV3KCk7XG5cbiAgICAgICAgc3VwZXIuZGlzcG9zZU5hdGl2ZVZpZXcoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5qZWN0V2ViVmlld0JyaWRnZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlV3JhcHBlci5zaG91bGRJbmplY3RXZWJWaWV3QnJpZGdlKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIuaW5qZWN0V2ViVmlld0JyaWRnZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2tXZWJWaWV3IGhhbmRsZXMgaW5qZWN0aW5nIHRoZSBicmlkZ2UgdmlhIFdLVXNlclNjcmlwdHNcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlUG9seWZpbGxzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGVKYXZhU2NyaXB0PFQ+KHNjcmlwdENvZGU6IHN0cmluZywgc3RyaW5naWZ5UmVzdWx0ID0gdHJ1ZSk6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAoc3RyaW5naWZ5UmVzdWx0KSB7XG4gICAgICAgICAgICBzY3JpcHRDb2RlID0gYFxuICAgICAgICAgICAgICAgIChmdW5jdGlvbih3aW5kb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICR7c2NyaXB0Q29kZS50cmltKCl9O1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2s6IGVyci5zdGFja1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKHdpbmRvdyk7XG4gICAgICAgICAgICBgO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmF3UmVzdWx0ID0gYXdhaXQgdGhpcy5uYXRpdmVXcmFwcGVyLmV4ZWN1dGVKYXZhU2NyaXB0KHNjcmlwdENvZGUudHJpbSgpKTtcblxuICAgICAgICBjb25zdCByZXN1bHQ6IFQgPSBhd2FpdCB0aGlzLnBhcnNlV2ViVmlld0phdmFzY3JpcHRSZXN1bHQocmF3UmVzdWx0KTtcblxuICAgICAgICBjb25zdCByID0gcmVzdWx0IGFzIGFueTtcbiAgICAgICAgaWYgKHIgJiYgdHlwZW9mIHIgPT09IFwib2JqZWN0XCIgJiYgci5lcnJvcikge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3Ioci5tZXNzYWdlKTtcbiAgICAgICAgICAgIChlcnJvciBhcyBhbnkpLndlYlN0YWNrID0gci5zdGFjaztcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBAcHJvZmlsZVxuICAgIHB1YmxpYyBvbkxvYWRlZCgpIHtcbiAgICAgICAgc3VwZXIub25Mb2FkZWQoKTtcblxuICAgICAgICB0aGlzLm5hdGl2ZVdyYXBwZXIub25Mb2FkZWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25VbmxvYWRlZCgpIHtcbiAgICAgICAgdGhpcy5uYXRpdmVXcmFwcGVyLm9uVW5sb2FkZWQoKTtcblxuICAgICAgICBzdXBlci5vblVubG9hZGVkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0b3BMb2FkaW5nKCkge1xuICAgICAgICB0aGlzLm5hdGl2ZVdyYXBwZXIuc3RvcExvYWRpbmcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgX2xvYWRVcmwoc3JjOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5uYXRpdmVXcmFwcGVyLmxvYWRVcmwoc3JjKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgX2xvYWREYXRhKGNvbnRlbnQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLm5hdGl2ZVdyYXBwZXIubG9hZERhdGEoY29udGVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjYW5Hb0JhY2soKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZVdyYXBwZXIuY2FuR29CYWNrO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2FuR29Gb3J3YXJkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVXcmFwcGVyLmNhbkdvRm9yd2FyZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ29CYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVXcmFwcGVyLmdvQmFjaygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnb0ZvcndhcmQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZVdyYXBwZXIuZ29Gb3J3YXJkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlV3JhcHBlci5yZWxvYWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJMb2NhbFJlc291cmNlKHJlc291cmNlTmFtZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgcmVzb3VyY2VOYW1lID0gdGhpcy5maXhMb2NhbFJlc291cmNlTmFtZShyZXNvdXJjZU5hbWUpO1xuXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gdGhpcy5yZXNvbHZlTG9jYWxSZXNvdXJjZUZpbGVQYXRoKHBhdGgpO1xuICAgICAgICBpZiAoIWZpbGVwYXRoKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVHJhY2UoYFdlYlZpZXdFeHQ8aW9zPi5yZWdpc3RlckxvY2FsUmVzb3VyY2UoXCIke3Jlc291cmNlTmFtZX1cIiwgXCIke3BhdGh9XCIpIC0+IGZpbGUgZG9lc24ndCBleGlzdGAsIHRyYWNlTWVzc2FnZVR5cGUuZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53cml0ZVRyYWNlKGBXZWJWaWV3RXh0PGlvcz4ucmVnaXN0ZXJMb2NhbFJlc291cmNlKFwiJHtyZXNvdXJjZU5hbWV9XCIsIFwiJHtwYXRofVwiKSAtPiBmaWxlOiBcIiR7ZmlsZXBhdGh9XCJgKTtcblxuICAgICAgICB0aGlzLm5hdGl2ZVdyYXBwZXIucmVnaXN0ZXJMb2NhbFJlc291cmNlRm9yTmF0aXZlKHJlc291cmNlTmFtZSwgZmlsZXBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1bnJlZ2lzdGVyTG9jYWxSZXNvdXJjZShyZXNvdXJjZU5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLndyaXRlVHJhY2UoYFdlYlZpZXdFeHQ8aW9zPi51bnJlZ2lzdGVyTG9jYWxSZXNvdXJjZShcIiR7cmVzb3VyY2VOYW1lfVwiKWApO1xuXG4gICAgICAgIHJlc291cmNlTmFtZSA9IHRoaXMuZml4TG9jYWxSZXNvdXJjZU5hbWUocmVzb3VyY2VOYW1lKTtcblxuICAgICAgICB0aGlzLm5hdGl2ZVdyYXBwZXIudW5yZWdpc3RlckxvY2FsUmVzb3VyY2VGb3JOYXRpdmUocmVzb3VyY2VOYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVnaXN0ZXJlZExvY2FsUmVzb3VyY2UocmVzb3VyY2VOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmVzb3VyY2VOYW1lID0gdGhpcy5maXhMb2NhbFJlc291cmNlTmFtZShyZXNvdXJjZU5hbWUpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm5hdGl2ZVdyYXBwZXIuZ2V0UmVnaXN0ZXJlZExvY2FsUmVzb3VyY2VGcm9tTmF0aXZlKHJlc291cmNlTmFtZSk7XG5cbiAgICAgICAgdGhpcy53cml0ZVRyYWNlKGBXZWJWaWV3RXh0PGFuZHJvaWQ+LmdldFJlZ2lzdGVyZWRMb2NhbFJlc291cmNlKFwiJHtyZXNvdXJjZU5hbWV9XCIpIC0+IFwiJHtyZXN1bHR9XCJgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb25VSVdlYlZpZXdFdmVudCh1cmw6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuaXNVSVdlYlZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVUcmFjZShgV2ViVmlld0V4dC5vblVJV2ViVmlld0V2ZW50KFwiJHt1cmx9XCIpIC0gb25seSB3b3JrcyBmb3IgVUlXZWJWaWV3YCwgdHJhY2VNZXNzYWdlVHlwZS5lcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXVybC5zdGFydHNXaXRoKFwianMyaW9zXCIpKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVHJhY2UoYFdlYlZpZXdFeHQub25VSVdlYlZpZXdFdmVudChcIiR7dXJsfVwiKSAtIG9ubHkgc3VwcG9ydHMganMyaW9zLXNjaGVtZWAsIHRyYWNlTWVzc2FnZVR5cGUuZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkZWNvZGVVUklDb21wb25lbnQodXJsLnJlcGxhY2UoL15qczJpb3M6LywgXCJcIikpO1xuICAgICAgICAgICAgY29uc3QgeyBldmVudE5hbWUsIHJlc0lkIH0gPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZXhlY3V0ZUphdmFTY3JpcHQ8YW55Pihgd2luZG93Lm5zV2ViVmlld0JyaWRnZS5nZXRVSVdlYlZpZXdSZXNwb25zZSgke0pTT04uc3RyaW5naWZ5KHJlc0lkKX0pYCk7XG5cbiAgICAgICAgICAgIHRoaXMub25XZWJWaWV3RXZlbnQoZXZlbnROYW1lLCBkYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVHJhY2UoYFdlYlZpZXdFeHQub25VSVdlYlZpZXdFdmVudChcIiR7dXJsfSlcIiAtIFwiJHtlcnJ9XCJgLCB0cmFjZU1lc3NhZ2VUeXBlLmVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUphdmFTY3JpcHQ8c3RyaW5nPihcImRvY3VtZW50LnRpdGxlXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhdXRvTG9hZFN0eWxlU2hlZXRGaWxlKHJlc291cmNlTmFtZTogc3RyaW5nLCBmaWxlcGF0aDogc3RyaW5nLCBpbnNlcnRCZWZvcmU/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLmlzV0tXZWJWaWV3KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVXcmFwcGVyLmF1dG9Mb2FkU3R5bGVTaGVldEZpbGUocmVzb3VyY2VOYW1lLCBmaWxlcGF0aCwgaW5zZXJ0QmVmb3JlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5hdXRvTG9hZFN0eWxlU2hlZXRGaWxlKHJlc291cmNlTmFtZSwgZmlsZXBhdGgsIGluc2VydEJlZm9yZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlQXV0b0xvYWRTdHlsZVNoZWV0RmlsZShyZXNvdXJjZU5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5pc1dLV2ViVmlldykge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVXcmFwcGVyLnJlbW92ZUF1dG9Mb2FkU3R5bGVTaGVldEZpbGUocmVzb3VyY2VOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLnJlbW92ZUF1dG9Mb2FkU3R5bGVTaGVldEZpbGUocmVzb3VyY2VOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhdXRvTG9hZEphdmFTY3JpcHRGaWxlKHJlc291cmNlTmFtZTogc3RyaW5nLCBmaWxlcGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmlzV0tXZWJWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZVdyYXBwZXIuYXV0b0xvYWRKYXZhU2NyaXB0RmlsZShyZXNvdXJjZU5hbWUsIGZpbGVwYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLmF1dG9Mb2FkSmF2YVNjcmlwdEZpbGUocmVzb3VyY2VOYW1lLCBmaWxlcGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlQXV0b0xvYWRKYXZhU2NyaXB0RmlsZShyZXNvdXJjZU5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5pc1dLV2ViVmlldykge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVXcmFwcGVyLnJlbW92ZUF1dG9Mb2FkSmF2YVNjcmlwdEZpbGUocmVzb3VyY2VOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLnJlbW92ZUF1dG9Mb2FkSmF2YVNjcmlwdEZpbGUocmVzb3VyY2VOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIFthdXRvSW5qZWN0SlNCcmlkZ2VQcm9wZXJ0eS5zZXROYXRpdmVdKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5uYXRpdmVXcmFwcGVyLmVuYWJsZUF1dG9JbmplY3QoZW5hYmxlZCk7XG4gICAgfVxuXG4gICAgW3Njcm9sbEJvdW5jZVByb3BlcnR5LmdldERlZmF1bHRdKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVXcmFwcGVyLnNjcm9sbEJvdW5jZTtcbiAgICB9XG5cbiAgICBbc2Nyb2xsQm91bmNlUHJvcGVydHkuc2V0TmF0aXZlXShlbmFibGVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMubmF0aXZlV3JhcHBlci5zY3JvbGxCb3VuY2UgPSBlbmFibGVkO1xuICAgIH1cbn1cbiJdfQ==