@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
JavaScript
"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==