From 1dc3de774c55b1e9ab1c85a2690a79a286b0b5f0 Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Mon, 18 May 2015 17:19:17 +0300 Subject: [PATCH] src property added --- ui/web-view/web-view-common.ts | 32 +++++++++++++++++++++++++++++++ ui/web-view/web-view.android.ts | 26 +++++++++++++++++++++++++ ui/web-view/web-view.d.ts | 7 ++++++- ui/web-view/web-view.ios.ts | 34 ++++++++++++++++++++++++++++++--- 4 files changed, 95 insertions(+), 4 deletions(-) diff --git a/ui/web-view/web-view-common.ts b/ui/web-view/web-view-common.ts index 8ee40e8bb..1d96e1b69 100644 --- a/ui/web-view/web-view-common.ts +++ b/ui/web-view/web-view-common.ts @@ -22,11 +22,31 @@ function onUrlPropertyChanged(data: dependencyObservable.PropertyChangeData) { // register the setNativeValue callback (urlProperty.metadata).onSetNativeValue = onUrlPropertyChanged; +var srcProperty = new dependencyObservable.Property( + "src", + "WebView", + new proxy.PropertyMetadata("") + ); + +function onSrcPropertyChanged(data: dependencyObservable.PropertyChangeData) { + var webView = data.object; + + if (webView._suspendLoading) { + return; + } + + webView._loadSrc(data.newValue); +} + +// register the setNativeValue callback +(srcProperty.metadata).onSetNativeValue = onSrcPropertyChanged; + export class WebView extends view.View implements definition.WebView { public static loadStartedEvent = "loadStarted"; public static loadFinishedEvent = "loadFinished"; public static urlProperty = urlProperty; + public static srcProperty = srcProperty; public _suspendLoading: boolean; @@ -42,6 +62,14 @@ export class WebView extends view.View implements definition.WebView { this._setValue(WebView.urlProperty, value); } + get src(): string { + return this._getValue(WebView.srcProperty); + } + + set src(value: string) { + this._setValue(WebView.srcProperty, value); + } + public _onLoadFinished(url: string, error?: string) { this._suspendLoading = true; @@ -73,6 +101,10 @@ export class WebView extends view.View implements definition.WebView { throw new Error("This member is abstract."); } + public _loadSrc(src: string) { + throw new Error("This member is abstract."); + } + get canGoBack(): boolean { throw new Error("This member is abstract."); } diff --git a/ui/web-view/web-view.android.ts b/ui/web-view/web-view.android.ts index a11e68719..b293ac2aa 100644 --- a/ui/web-view/web-view.android.ts +++ b/ui/web-view/web-view.android.ts @@ -1,5 +1,7 @@ import common = require("ui/web-view/web-view-common"); import trace = require("trace"); +import utils = require("utils/utils"); +import fs = require("file-system"); declare var exports; require("utils/module-merge").merge(common, exports); @@ -74,6 +76,30 @@ export class WebView extends common.WebView { this._android.loadUrl(url); } + public _loadSrc(src: string) { + trace.write("WebView._loadSrc(" + src + ")", trace.categories.Debug); + + this._android.stopLoading(); + + if (utils.isFileOrResourcePath(src)) { + + if (src.indexOf("~/") === 0) { + src = fs.path.join(fs.knownFolders.currentApp().path, src.replace("~/", "")); + } + + var file = fs.File.fromPath(src); + if (file) { + file.readText().then((r) => { + this._android.loadData(r, "text/html", null); + }); + } + } else if (src.indexOf("http://") === 0 || src.indexOf("https://") === 0) { + this._android.loadUrl(src); + } else { + this._android.loadData(src, "text/html", null); + } + } + get canGoBack(): boolean { return this._android.canGoBack(); } diff --git a/ui/web-view/web-view.d.ts b/ui/web-view/web-view.d.ts index 29956a8ec..d8f6e5305 100644 --- a/ui/web-view/web-view.d.ts +++ b/ui/web-view/web-view.d.ts @@ -36,10 +36,15 @@ declare module "ui/web-view" { ios: UIWebView; /** - * Gets or sets the url displayed by this instance. + * [Obsolete. Please use src instead!] Gets or sets the url displayed by this instance. */ url: string; + /** + * Gets or sets the url, local file path or HTML string. + */ + src: string; + /** * Gets a value indicating whether the WebView can navigate back. */ diff --git a/ui/web-view/web-view.ios.ts b/ui/web-view/web-view.ios.ts index dd98f5214..edee9ce0a 100644 --- a/ui/web-view/web-view.ios.ts +++ b/ui/web-view/web-view.ios.ts @@ -1,5 +1,7 @@ import common = require("ui/web-view/web-view-common"); import trace = require("trace"); +import utils = require("utils/utils"); +import fs = require("file-system"); declare var exports; require("utils/module-merge").merge(common, exports); @@ -17,16 +19,16 @@ class UIWebViewDelegateImpl extends NSObject implements UIWebViewDelegate { this._owner = owner; return this; } - + public webViewShouldStartLoadWithRequestNavigationType(webView: UIWebView, request: NSURLRequest, navigationType: number) { if (request.URL) { trace.write("UIWebViewDelegateClass.webViewShouldStartLoadWithRequestNavigationType(" + request.URL.absoluteString + ", " + navigationType + ")", trace.categories.Debug); this._owner._onLoadStarted(request.URL.absoluteString); } - + return true; } - + public webViewDidStartLoad(webView: UIWebView) { trace.write("UIWebViewDelegateClass.webViewDidStartLoad(" + webView.request.URL + ")", trace.categories.Debug); } @@ -81,6 +83,32 @@ export class WebView extends common.WebView { this._ios.loadRequest(NSURLRequest.requestWithURL(NSURL.URLWithString(url))); } + public _loadSrc(src: string) { + trace.write("WebView._loadSrc(" + src + ")", trace.categories.Debug); + + if (this._ios.loading) { + this._ios.stopLoading(); + } + + if (utils.isFileOrResourcePath(src)) { + + if (src.indexOf("~/") === 0) { + src = fs.path.join(fs.knownFolders.currentApp().path, src.replace("~/", "")); + } + + var file = fs.File.fromPath(src); + if (file) { + file.readText().then((r) => { + this._ios.loadHTMLStringBaseURL(r, null); + }); + } + } else if (src.indexOf("http://") === 0 || src.indexOf("https://") === 0) { + this._ios.loadRequest(NSURLRequest.requestWithURL(NSURL.URLWithString(src))); + } else { + this._ios.loadHTMLStringBaseURL(src, null); + } + } + get canGoBack(): boolean { return this._ios.canGoBack; }