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.

754 lines 102 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 fs = require("@nativescript/core/file-system"); var webview_ext_common_1 = require("./webview-ext-common"); __export(require("./webview-ext-common")); var extToMimeType = new Map([ ["html", "text/html"], ["htm", "text/html"], ["xhtml", "text/html"], ["xhtm", "text/html"], ["css", "text/css"], ["gif", "image/gif"], ["jpeg", "image/jpeg"], ["jpg", "image/jpeg"], ["js", "text/javascript"], ["otf", "application/vnd.ms-opentype"], ["png", "image/png"], ["svg", "image/svg+xml"], ["ttf", "application/x-font-ttf"], ]); var extToBinaryEncoding = new Set(["gif", "jpeg", "jpg", "otf", "png", "ttf"]); var cacheModeMap; var WebViewExtClient; var WebChromeViewExtClient; var WebViewBridgeInterface; function initializeWebViewClient() { if (WebViewExtClient) { return; } cacheModeMap = new Map([ ["cache_first", android.webkit.WebSettings.LOAD_CACHE_ELSE_NETWORK], ["cache_only", android.webkit.WebSettings.LOAD_CACHE_ONLY], ["default", android.webkit.WebSettings.LOAD_DEFAULT], ["no_cache", android.webkit.WebSettings.LOAD_NO_CACHE], ["normal", android.webkit.WebSettings.LOAD_NORMAL], ]); var WebViewExtClientImpl = (function (_super) { __extends(WebViewExtClientImpl, _super); function WebViewExtClientImpl(owner) { var _this = _super.call(this) || this; _this.owner = new WeakRef(owner); return global.__native(_this); } WebViewExtClientImpl.prototype.shouldOverrideUrlLoading = function (view, request) { var owner = this.owner.get(); if (!owner) { console.warn("WebViewExtClientImpl.shouldOverrideUrlLoading(...) - no owner"); return true; } var url = request; var httpMethod = "GET"; var isRedirect = false; var hasGesture = false; var isForMainFrame = false; var requestHeaders = null; if (typeof request === "object") { httpMethod = request.getMethod(); isRedirect = request.isRedirect(); hasGesture = request.hasGesture(); isForMainFrame = request.isForMainFrame(); requestHeaders = request.getRequestHeaders(); url = request.getUrl().toString(); } owner.writeTrace("WebViewClientClass.shouldOverrideUrlLoading(\"" + url + "\") - method:" + httpMethod + " isRedirect:" + isRedirect + " hasGesture:" + hasGesture + " isForMainFrame:" + isForMainFrame + " headers:" + requestHeaders); if (url.startsWith(owner.interceptScheme)) { owner.writeTrace("WebViewClientClass.shouldOverrideUrlLoading(\"" + url + "\") - \"" + owner.interceptScheme + "\" - cancel"); return true; } var shouldOverrideUrlLoading = owner._onShouldOverrideUrlLoading(url, httpMethod); if (shouldOverrideUrlLoading === true) { owner.writeTrace("WebViewClientClass.shouldOverrideUrlLoading(\"" + url + "\") - cancel loading url"); return true; } return false; }; WebViewExtClientImpl.prototype.shouldInterceptRequest = function (view, request) { var owner = this.owner.get(); if (!owner) { console.warn("WebViewExtClientImpl.shouldInterceptRequest(...) - no owner"); return _super.prototype.shouldInterceptRequest.call(this, view, request); } var url; if (typeof request === "string") { url = request; } else if (typeof request === "object") { url = request.getUrl().toString(); } if (typeof url !== "string") { owner.writeTrace("WebViewClientClass.shouldInterceptRequest(\"" + url + "\") - is not a string"); return _super.prototype.shouldInterceptRequest.call(this, view, request); } if (!url.startsWith(owner.interceptScheme)) { return _super.prototype.shouldInterceptRequest.call(this, view, request); } var filepath = owner.getRegisteredLocalResource(url); if (!filepath) { owner.writeTrace("WebViewClientClass.shouldInterceptRequest(\"" + url + "\") - no matching file"); return _super.prototype.shouldInterceptRequest.call(this, view, request); } if (!fs.File.exists(filepath)) { owner.writeTrace("WebViewClientClass.shouldInterceptRequest(\"" + url + "\") - file: \"" + filepath + "\" doesn't exists"); return _super.prototype.shouldInterceptRequest.call(this, view, request); } var tnsFile = fs.File.fromPath(filepath); var javaFile = new java.io.File(tnsFile.path); var stream = new java.io.FileInputStream(javaFile); var ext = tnsFile.extension.substr(1).toLowerCase(); var mimeType = extToMimeType.get(ext) || "application/octet-stream"; var encoding = extToBinaryEncoding.has(ext) || mimeType === "application/octet-stream" ? "binary" : "UTF-8"; owner.writeTrace("WebViewClientClass.shouldInterceptRequest(\"" + url + "\") - file: \"" + filepath + "\" mimeType:" + mimeType + " encoding:" + encoding); var response = new android.webkit.WebResourceResponse(mimeType, encoding, stream); if (android.os.Build.VERSION.SDK_INT < 21 || !response.getResponseHeaders) { return response; } var responseHeaders = response.getResponseHeaders(); if (!responseHeaders) { responseHeaders = new java.util.HashMap(); } responseHeaders.put("Access-Control-Allow-Origin", "*"); response.setResponseHeaders(responseHeaders); return response; }; WebViewExtClientImpl.prototype.onPageStarted = function (view, url, favicon) { _super.prototype.onPageStarted.call(this, view, url, favicon); var owner = this.owner.get(); if (!owner) { console.warn("WebViewExtClientImpl.onPageStarted(\"" + view + "\", \"" + url + "\", \"" + favicon + "\") - no owner"); return; } owner.writeTrace("WebViewClientClass.onPageStarted(\"" + view + "\", \"" + url + "\", \"" + favicon + "\")"); owner._onLoadStarted(url); }; WebViewExtClientImpl.prototype.onPageFinished = function (view, url) { _super.prototype.onPageFinished.call(this, view, url); var owner = this.owner.get(); if (!owner) { console.warn("WebViewExtClientImpl.onPageFinished(\"" + view + "\", " + url + "\") - no owner"); return; } owner.writeTrace("WebViewClientClass.onPageFinished(\"" + view + "\", " + url + "\")"); owner._onLoadFinished(url).catch(function () { return void 0; }); }; WebViewExtClientImpl.prototype.onReceivedError = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (args.length === 4) { var _a = __read(args, 4), view = _a[0], errorCode = _a[1], description = _a[2], failingUrl = _a[3]; this.onReceivedErrorBeforeAPI23(view, errorCode, description, failingUrl); } else { var _b = __read(args, 3), view = _b[0], request = _b[1], error = _b[2]; this.onReceivedErrorAPI23(view, request, error); } }; WebViewExtClientImpl.prototype.onReceivedErrorAPI23 = function (view, request, error) { _super.prototype.onReceivedError.call(this, view, request, error); var owner = this.owner.get(); if (!owner) { console.warn("WebViewExtClientImpl.onReceivedErrorAPI23(...) - no owner"); return; } var url = error.getUrl && error.getUrl(); if (!url && typeof request === "object") { url = request.getUrl().toString(); } owner.writeTrace("WebViewClientClass.onReceivedErrorAPI23(" + error.getErrorCode() + ", " + error.getDescription() + ", " + url + ")"); owner._onLoadFinished(url, error.getDescription() + "(" + error.getErrorCode() + ")").catch(function () { return void 0; }); }; WebViewExtClientImpl.prototype.onReceivedErrorBeforeAPI23 = function (view, errorCode, description, failingUrl) { _super.prototype.onReceivedError.call(this, view, errorCode, description, failingUrl); var owner = this.owner.get(); if (!owner) { console.warn("WebViewExtClientImpl.onReceivedErrorBeforeAPI23(...) - no owner"); return; } owner.writeTrace("WebViewClientClass.onReceivedErrorBeforeAPI23(" + errorCode + ", \"" + description + "\", \"" + failingUrl + "\")"); owner._onLoadFinished(failingUrl, description + "(" + errorCode + ")").catch(function () { return void 0; }); }; return WebViewExtClientImpl; }(android.webkit.WebViewClient)); WebViewExtClient = WebViewExtClientImpl; var WebChromeViewExtClientImpl = (function (_super) { __extends(WebChromeViewExtClientImpl, _super); function WebChromeViewExtClientImpl(owner) { var _this = _super.call(this) || this; _this.owner = new WeakRef(owner); return global.__native(_this); } WebChromeViewExtClientImpl.prototype.onShowCustomView = function (view) { var _this = this; var owner = this.owner.get(); if (!owner) { return; } var callback; if (arguments.length === 3) { callback = arguments[2]; } else if (arguments.length === 2) { callback = arguments[1]; } else { return; } if (owner._onEnterFullscreen(function () { return _this.hideCustomView(); })) { this.showCustomViewCallback = callback; } else { callback.onCustomViewHidden(); } }; WebChromeViewExtClientImpl.prototype.hideCustomView = function () { if (this.showCustomViewCallback) { this.showCustomViewCallback.onCustomViewHidden(); } this.showCustomViewCallback = undefined; }; WebChromeViewExtClientImpl.prototype.onHideCustomView = function () { this.showCustomViewCallback = undefined; var owner = this.owner.get(); if (!owner) { return; } owner._onExitFullscreen(); }; WebChromeViewExtClientImpl.prototype.onProgressChanged = function (view, newProgress) { var owner = this.owner.get(); if (!owner) { return; } owner._loadProgress(newProgress); }; WebChromeViewExtClientImpl.prototype.onReceivedTitle = function (view, title) { var owner = this.owner.get(); if (!owner) { return; } owner._titleChanged(title); }; WebChromeViewExtClientImpl.prototype.onJsAlert = function (view, url, message, result) { var owner = this.owner.get(); if (!owner) { return false; } var gotResponse = false; return owner._webAlert(message, function () { if (!gotResponse) { result.confirm(); } gotResponse = true; }); }; WebChromeViewExtClientImpl.prototype.onJsConfirm = function (view, url, message, result) { var owner = this.owner.get(); if (!owner) { return false; } var gotResponse = false; return owner._webConfirm(message, function (confirmed) { if (!gotResponse) { if (confirmed) { result.confirm(); } else { result.cancel(); } } gotResponse = true; }); }; WebChromeViewExtClientImpl.prototype.onJsPrompt = function (view, url, message, defaultValue, result) { var owner = this.owner.get(); if (!owner) { return false; } var gotResponse = false; return owner._webPrompt(message, defaultValue, function (message) { if (!gotResponse) { if (message) { result.confirm(message); } else { result.confirm(); } } gotResponse = true; }); }; WebChromeViewExtClientImpl.prototype.onConsoleMessage = function () { if (arguments.length !== 1) { return false; } var owner = this.owner.get(); if (!owner) { return false; } var consoleMessage = arguments[0]; if (consoleMessage instanceof android.webkit.ConsoleMessage) { var message = consoleMessage.message(); var lineNo = consoleMessage.lineNumber(); var level = "log"; var _a = android.webkit.ConsoleMessage.MessageLevel, DEBUG = _a.DEBUG, LOG = _a.LOG, WARNING = _a.WARNING; switch (consoleMessage.messageLevel()) { case DEBUG: { level = "debug"; break; } case LOG: { level = "log"; break; } case WARNING: { level = "warn"; break; } } return owner._webConsole(message, lineNo, level); } return false; }; return WebChromeViewExtClientImpl; }(android.webkit.WebChromeClient)); WebChromeViewExtClient = WebChromeViewExtClientImpl; var WebViewBridgeInterfaceImpl = (function (_super) { __extends(WebViewBridgeInterfaceImpl, _super); function WebViewBridgeInterfaceImpl(owner) { var _this = _super.call(this) || this; _this.owner = new WeakRef(owner); return global.__native(_this); } WebViewBridgeInterfaceImpl.prototype.emitEventToNativeScript = function (eventName, data) { var owner = this.owner.get(); if (!owner) { console.warn("WebViewExtClientImpl.emitEventToNativeScript(\"" + eventName + "\") - no owner"); return; } try { owner.onWebViewEvent(eventName, JSON.parse(data)); return; } catch (err) { owner.writeTrace("WebViewExtClientImpl.emitEventToNativeScript(\"" + eventName + "\") - couldn't parse data: " + data + " err: " + err); } owner.onWebViewEvent(eventName, data); }; return WebViewBridgeInterfaceImpl; }(dk.nota.webviewinterface.WebViewBridgeInterface)); WebViewBridgeInterface = WebViewBridgeInterfaceImpl; } var instanceNo = 0; var WebViewExt = (function (_super) { __extends(WebViewExt, _super); function WebViewExt() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.localResourceMap = new Map(); _this.instance = ++instanceNo; return _this; } Object.defineProperty(WebViewExt, "supportXLocalScheme", { get: function () { return true; }, enumerable: true, configurable: true }); Object.defineProperty(WebViewExt.prototype, "supportXLocalScheme", { get: function () { return true; }, enumerable: true, configurable: true }); WebViewExt.prototype.createNativeView = function () { var nativeView = new android.webkit.WebView(this._context); var settings = nativeView.getSettings(); settings.setJavaScriptEnabled(true); settings.setBuiltInZoomControls(!!this.builtInZoomControls); settings.setDisplayZoomControls(!!this.displayZoomControls); settings.setSupportZoom(!!this.supportZoom); if (android.os.Build.VERSION.SDK_INT >= 21) { settings.setMixedContentMode(android.webkit.WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); } settings.setAllowUniversalAccessFromFileURLs(true); return nativeView; }; WebViewExt.prototype.initNativeView = function () { _super.prototype.initNativeView.call(this); initializeWebViewClient(); var nativeView = this.nativeViewProtected; if (!nativeView) { return; } var client = new WebViewExtClient(this); var chromeClient = new WebChromeViewExtClient(this); nativeView.setWebViewClient(client); nativeView.client = client; nativeView.setWebChromeClient(chromeClient); nativeView.chromeClient = chromeClient; var bridgeInterface = new WebViewBridgeInterface(this); nativeView.addJavascriptInterface(bridgeInterface, "androidWebViewBridge"); nativeView.bridgeInterface = bridgeInterface; }; WebViewExt.prototype.disposeNativeView = function () { var nativeView = this.nativeViewProtected; if (nativeView) { nativeView.client = null; nativeView.chromeClient = null; nativeView.destroy(); } _super.prototype.disposeNativeView.call(this); }; WebViewExt.prototype.ensurePromiseSupport = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: if (android.os.Build.VERSION.SDK_INT >= 21) { return [2]; } return [4, _super.prototype.ensurePromiseSupport.call(this)]; case 1: return [2, _a.sent()]; } }); }); }; WebViewExt.prototype._loadUrl = function (src) { var nativeView = this.nativeViewProtected; if (!nativeView) { return; } this.writeTrace("WebViewExt<android>._loadUrl(\"" + src + "\")"); nativeView.loadUrl(src); this.writeTrace("WebViewExt<android>._loadUrl(\"" + src + "\") - end"); }; WebViewExt.prototype._loadData = function (src) { var nativeView = this.nativeViewProtected; if (!nativeView) { return; } var baseUrl = "file:///" + fs.knownFolders.currentApp().path + "/"; this.writeTrace("WebViewExt<android>._loadData(\"" + src + "\") -> baseUrl: \"" + baseUrl + "\""); nativeView.loadDataWithBaseURL(baseUrl, src, "text/html", "utf-8", null); }; Object.defineProperty(WebViewExt.prototype, "canGoBack", { get: function () { var nativeView = this.nativeViewProtected; if (nativeView) { return nativeView.canGoBack(); } return false; }, enumerable: true, configurable: true }); WebViewExt.prototype.stopLoading = function () { var nativeView = this.nativeViewProtected; if (nativeView) { nativeView.stopLoading(); } }; Object.defineProperty(WebViewExt.prototype, "canGoForward", { get: function () { var nativeView = this.nativeViewProtected; if (nativeView) { return nativeView.canGoForward(); } return false; }, enumerable: true, configurable: true }); WebViewExt.prototype.goBack = function () { var nativeView = this.nativeViewProtected; if (nativeView) { return nativeView.goBack(); } }; WebViewExt.prototype.goForward = function () { var nativeView = this.nativeViewProtected; if (nativeView) { return nativeView.goForward(); } }; WebViewExt.prototype.reload = function () { var nativeView = this.nativeViewProtected; if (nativeView) { return nativeView.reload(); } }; WebViewExt.prototype.registerLocalResource = function (resourceName, path) { resourceName = this.fixLocalResourceName(resourceName); var filepath = this.resolveLocalResourceFilePath(path); if (!filepath) { this.writeTrace("WebViewExt<android>.registerLocalResource(\"" + resourceName + "\", \"" + path + "\") -> file doesn't exist", webview_ext_common_1.traceMessageType.error); return; } this.writeTrace("WebViewExt<android>.registerLocalResource(\"" + resourceName + "\", \"" + path + "\") -> file: \"" + filepath + "\""); this.localResourceMap.set(resourceName, filepath); }; WebViewExt.prototype.unregisterLocalResource = function (resourceName) { this.writeTrace("WebViewExt<android>.unregisterLocalResource(\"" + resourceName + "\")"); resourceName = this.fixLocalResourceName(resourceName); this.localResourceMap.delete(resourceName); }; WebViewExt.prototype.getRegisteredLocalResource = function (resourceName) { resourceName = this.fixLocalResourceName(resourceName); var result = this.localResourceMap.get(resourceName); this.writeTrace("WebViewExt<android>.getRegisteredLocalResource(\"" + resourceName + "\") => \"" + result + "\""); return result; }; WebViewExt.prototype.ensureFetchSupport = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: this.writeTrace("WebViewExt<android>.ensureFetchSupport() - Override 'Fetch API' to support x-local."); return [4, this.executeJavaScript("\n try {\n window.fetch = null;\n } catch (err) {\n console.error(\"null'ing Native Fetch API failed:\", err);\n }\n ")]; case 1: _a.sent(); return [4, this.loadFetchPolyfill()]; case 2: _a.sent(); return [2]; } }); }); }; WebViewExt.prototype.executeJavaScript = function (scriptCode) { return __awaiter(this, void 0, void 0, function () { var result; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: if (android.os.Build.VERSION.SDK_INT < 19) { this.writeTrace("WebViewExt<android>.executeJavaScript() -> SDK:" + android.os.Build.VERSION.SDK_INT + " not supported", webview_ext_common_1.traceMessageType.error); return [2, Promise.reject(new webview_ext_common_1.UnsupportedSDKError(19))]; } return [4, new Promise(function (resolve, reject) { var androidWebView = _this.nativeViewProtected; if (!androidWebView) { _this.writeTrace("WebViewExt<android>.executeJavaScript() -> no nativeView?", webview_ext_common_1.traceMessageType.error); reject(new Error("Native Android not initialized, cannot call executeJavaScript")); return; } androidWebView.evaluateJavascript(scriptCode, new android.webkit.ValueCallback({ onReceiveValue: function (result) { resolve(result); }, })); })]; case 1: result = _a.sent(); return [4, this.parseWebViewJavascriptResult(result)]; case 2: return [2, _a.sent()]; } }); }); }; WebViewExt.prototype.getTitle = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2, this.nativeViewProtected && this.nativeViewProtected.getTitle()]; }); }); }; WebViewExt.prototype.zoomIn = function () { var androidWebView = this.nativeViewProtected; if (!androidWebView) { return false; } return androidWebView.zoomIn(); }; WebViewExt.prototype.zoomOut = function () { var androidWebView = this.nativeViewProtected; if (!androidWebView) { return false; } return androidWebView.zoomOut(); }; WebViewExt.prototype.zoomBy = function (zoomFactor) { if (android.os.Build.VERSION.SDK_INT < 21) { this.writeTrace("WebViewExt<android>.zoomBy - not supported on this SDK"); return; } if (!this.nativeViewProtected) { return; } if (zoomFactor >= 0.01 && zoomFactor <= 100) { return this.nativeViewProtected.zoomBy(zoomFactor); } throw new Error("ZoomBy only accepts values between 0.01 and 100 both inclusive"); }; WebViewExt.prototype[webview_ext_common_1.debugModeProperty.getDefault] = function () { return false; }; WebViewExt.prototype[webview_ext_common_1.debugModeProperty.setNative] = function (enabled) { android.webkit.WebView.setWebContentsDebuggingEnabled(!!enabled); }; WebViewExt.prototype[webview_ext_common_1.builtInZoomControlsProperty.getDefault] = function () { var androidWebView = this.nativeViewProtected; if (!androidWebView) { return false; } var settings = androidWebView.getSettings(); return settings.getBuiltInZoomControls(); }; WebViewExt.prototype[webview_ext_common_1.builtInZoomControlsProperty.setNative] = function (enabled) { var androidWebView = this.nativeViewProtected; if (!androidWebView) { return; } var settings = androidWebView.getSettings(); settings.setBuiltInZoomControls(!!enabled); }; WebViewExt.prototype[webview_ext_common_1.displayZoomControlsProperty.getDefault] = function () { var androidWebView = this.nativeViewProtected; if (!androidWebView) { return false; } var settings = androidWebView.getSettings(); return settings.getDisplayZoomControls(); }; WebViewExt.prototype[webview_ext_common_1.displayZoomControlsProperty.setNative] = function (enabled) { var androidWebView = this.nativeViewProtected; if (!androidWebView) { return; } var settings = androidWebView.getSettings(); settings.setDisplayZoomControls(!!enabled); }; WebViewExt.prototype[webview_ext_common_1.cacheModeProperty.getDefault] = function () { var e_1, _a; var androidWebView = this.nativeViewProtected; if (!androidWebView) { return null; } var settings = androidWebView.getSettings(); var cacheModeInt = settings.getCacheMode(); try { for (var cacheModeMap_1 = __values(cacheModeMap), cacheModeMap_1_1 = cacheModeMap_1.next(); !cacheModeMap_1_1.done; cacheModeMap_1_1 = cacheModeMap_1.next()) { var _b = __read(cacheModeMap_1_1.value, 2), key = _b[0], value = _b[1]; if (value === cacheModeInt) { return key; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (cacheModeMap_1_1 && !cacheModeMap_1_1.done && (_a = cacheModeMap_1.return)) _a.call(cacheModeMap_1); } finally { if (e_1) throw e_1.error; } } return null; }; WebViewExt.prototype[webview_ext_common_1.cacheModeProperty.setNative] = function (cacheMode) { var e_2, _a; var androidWebView = this.nativeViewProtected; if (!androidWebView) { return; } var settings = androidWebView.getSettings(); try { for (var cacheModeMap_2 = __values(cacheModeMap), cacheModeMap_2_1 = cacheModeMap_2.next(); !cacheModeMap_2_1.done; cacheModeMap_2_1 = cacheModeMap_2.next()) { var _b = __read(cacheModeMap_2_1.value, 2), key = _b[0], nativeValue = _b[1]; if (key === cacheMode) { settings.setCacheMode(nativeValue); return; } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (cacheModeMap_2_1 && !cacheModeMap_2_1.done && (_a = cacheModeMap_2.return)) _a.call(cacheModeMap_2); } finally { if (e_2) throw e_2.error; } } }; WebViewExt.prototype[webview_ext_common_1.databaseStorageProperty.getDefault] = function () { var androidWebView = this.nativeViewProtected; if (!androidWebView) { return false; } var settings = androidWebView.getSettings(); return settings.getDatabaseEnabled(); }; WebViewExt.prototype[webview_ext_common_1.databaseStorageProperty.setNative] = function (enabled) { var androidWebView = this.nativeViewProtected; if (!androidWebView) { return; } var settings = androidWebView.getSettings(); settings.setDatabaseEnabled(!!enabled); }; WebViewExt.prototype[webview_ext_common_1.domStorageProperty.getDefault] = function () { var androidWebView = this.nativeViewProtected; if (!androidWebView) { return false; } var settings = androidWebView.getSettings(); return settings.getDomStorageEnabled(); }; WebViewExt.prototype[webview_ext_common_1.domStorageProperty.setNative] = function (enabled) { var androidWebView = this.nativeViewProtected; if (!androidWebView) { return; } var settings = androidWebView.getSettings(); settings.setDomStorageEnabled(!!enabled); }; WebViewExt.prototype[webview_ext_common_1.supportZoomProperty.getDefault] = function () { var androidWebView = this.nativeViewProtected; if (!androidWebView) { return false; } var settings = androidWebView.getSettings(); return settings.supportZoom(); }; WebViewExt.prototype[webview_ext_common_1.supportZoomProperty.setNative] = function (enabled) { var androidWebView = this.nativeViewProtected; if (!androidWebView) { return; } var settings = androidWebView.getSettings(); settings.setSupportZoom(!!enabled); }; WebViewExt.prototype[webview_ext_common_1.isEnabledProperty.setNative] = function (enabled) { var androidWebView = this.nativeViewProtected; if (!androidWebView) { return; } if (enabled) { androidWebView.setOnTouchListener(null); } else { androidWebView.setOnTouchListener(new android.view.View.OnTouchListener({ onTouch: function () { return true; }, })); } }; return WebViewExt; }(webview_ext_common_1.WebViewExtBase)); exports.WebViewExt = WebViewExt; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vidmlldy1leHQuYW5kcm9pZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYnZpZXctZXh0LmFuZHJvaWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxtREFBcUQ7QUFDckQsMkRBYThCO0FBRTlCLDBDQUFxQztBQUVyQyxJQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBaUI7SUFDMUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO0lBQ3JCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQztJQUNwQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUM7SUFDdEIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO0lBQ3JCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQztJQUNuQixDQUFDLEtBQUssRUFBRSxXQUFXLENBQUM7SUFDcEIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDO0lBQ3RCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQztJQUNyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQztJQUN6QixDQUFDLEtBQUssRUFBRSw2QkFBNkIsQ0FBQztJQUN0QyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUM7SUFDcEIsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDO0lBQ3hCLENBQUMsS0FBSyxFQUFFLHdCQUF3QixDQUFDO0NBQ3BDLENBQUMsQ0FBQztBQUVILElBQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFHekYsSUFBSSxZQUFvQyxDQUFDO0FBVXpDLElBQUksZ0JBQWlFLENBQUM7QUFDdEUsSUFBSSxzQkFBaUYsQ0FBQztBQUN0RixJQUFJLHNCQUFrRyxDQUFDO0FBRXZHLFNBQVMsdUJBQXVCO0lBQzVCLElBQUksZ0JBQWdCLEVBQUU7UUFDbEIsT0FBTztLQUNWO0lBRUQsWUFBWSxHQUFH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