diff --git a/CrossPlatformModules.csproj b/CrossPlatformModules.csproj index 8dcc19ea0..28de7d593 100644 --- a/CrossPlatformModules.csproj +++ b/CrossPlatformModules.csproj @@ -188,6 +188,7 @@ + animation.d.ts @@ -577,6 +578,11 @@ action-bar.d.ts + + + + + @@ -1923,6 +1929,7 @@ PreserveNewest + diff --git a/apps/tests/ui/web-view/web-view-tests.ts b/apps/tests/ui/web-view/web-view-tests.ts index 3acb0b6b8..598922ebd 100644 --- a/apps/tests/ui/web-view/web-view-tests.ts +++ b/apps/tests/ui/web-view/web-view-tests.ts @@ -30,7 +30,7 @@ var _createWebViewFunc = function (): webViewModule.WebView { return webView; } -export var testLoadExistingUrl = function () { +function prepare(): webViewModule.WebView { var newPage: page.Page; var webView = _createWebViewFunc(); var pageFactory = function (): page.Page { @@ -41,6 +41,12 @@ export var testLoadExistingUrl = function () { helper.navigate(pageFactory); + return webView; +} + +export var testLoadExistingUrl = function () { + var webView = prepare(); + var testFinished = false; var actualUrl; var actualError; @@ -80,15 +86,7 @@ export var testLoadExistingUrl = function () { } export var testLoadLocalFile = function () { - var newPage: page.Page; - var webView = _createWebViewFunc(); - var pageFactory = function (): page.Page { - newPage = new page.Page(); - newPage.content = webView; - return newPage; - }; - - helper.navigate(pageFactory); + var webView = prepare(); var testFinished = false; var actualHtml; @@ -142,15 +140,7 @@ export var testLoadLocalFile = function () { } export var testLoadHTMLString = function () { - var newPage: page.Page; - var webView = _createWebViewFunc(); - var pageFactory = function (): page.Page { - newPage = new page.Page(); - newPage.content = webView; - return newPage; - }; - - helper.navigate(pageFactory); + var webView = prepare(); var testFinished = false; var actualHtml; @@ -204,15 +194,7 @@ export var testLoadHTMLString = function () { } export var testLoadInvalidUrl = function () { - var newPage: page.Page; - var webView = _createWebViewFunc(); - var pageFactory = function (): page.Page { - newPage = new page.Page(); - newPage.content = webView; - return newPage; - }; - - helper.navigate(pageFactory); + var webView = prepare(); var testFinished = false; var actualError; @@ -237,3 +219,31 @@ export var testLoadInvalidUrl = function () { TKUnit.assert(false, "TIMEOUT"); } } + +export var testLoadUpperCaseSrc = function () { + var webView = prepare(); + + var testFinished = false; + var actualSrc; + var actualError; + + webView.on(webViewModule.WebView.loadFinishedEvent, function (args: webViewModule.LoadEventData) { + actualSrc = args.url; + actualError = args.error; + testFinished = true; + }); + var targetSrc = "HTTP://nsbuild01.telerik.com/docs/"; + webView.src = targetSrc; + + TKUnit.wait(4); + + helper.goBack(); + + if (testFinished) { + TKUnit.assert(actualSrc === targetSrc.toLowerCase(), "args.url should equal '" + targetSrc.toLowerCase() + "'"); + TKUnit.assert(actualError === undefined, actualError); + } + else { + TKUnit.assert(false, "TIMEOUT"); + } +} diff --git a/tsconfig.json b/tsconfig.json index 03d1ff2e0..27cdead8f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,5 @@ { - "version": "1.5.0-beta", + "version": "1.6.2", "compilerOptions": { "moduleResolution": "classic", "target": "es5", @@ -8,7 +8,8 @@ "noImplicitAny": false, "removeComments": true, "noLib": true, - "outDir": "dist" + "outDir": "dist", + "experimentalDecorators": true }, "filesGlob": [ "./**/*.ts", diff --git a/ui/web-view/web-view-common.ts b/ui/web-view/web-view-common.ts index 1d96e1b69..ccb87fdba 100644 --- a/ui/web-view/web-view-common.ts +++ b/ui/web-view/web-view-common.ts @@ -2,6 +2,9 @@ import view = require("ui/core/view"); import dependencyObservable = require("ui/core/dependency-observable"); import proxy = require("ui/core/proxy"); +import utils = require("utils/utils"); +import fs = require("file-system"); +import trace = require("trace"); var urlProperty = new dependencyObservable.Property( "url", @@ -35,13 +38,32 @@ function onSrcPropertyChanged(data: dependencyObservable.PropertyChangeData) { return; } - webView._loadSrc(data.newValue); + webView.stopLoading(); + + var src = data.newValue; + trace.write("WebView._loadSrc(" + src + ")", trace.categories.Debug); + + if (utils.isFileOrResourcePath(src)) { + if (src.indexOf("~/") === 0) { + src = fs.path.join(fs.knownFolders.currentApp().path, src.replace("~/", "")); + } + + if (fs.File.exists(src)) { + var file = fs.File.fromPath(src); + var content = file.readTextSync(); + webView._loadFileOrResource(src, content); + } + } else if (src.toLowerCase().indexOf("http://") === 0 || src.toLowerCase().indexOf("https://") === 0) { + webView._loadHttp(src); + } else { + webView._loadData(src); + } } // register the setNativeValue callback (srcProperty.metadata).onSetNativeValue = onSrcPropertyChanged; -export class WebView extends view.View implements definition.WebView { +export abstract class WebView extends view.View implements definition.WebView { public static loadStartedEvent = "loadStarted"; public static loadFinishedEvent = "loadFinished"; @@ -97,13 +119,15 @@ export class WebView extends view.View implements definition.WebView { this.notify(args); } - public _loadUrl(url: string) { - throw new Error("This member is abstract."); - } + abstract _loadUrl(url: string): void; - public _loadSrc(src: string) { - throw new Error("This member is abstract."); - } + abstract _loadFileOrResource(path: string, content: string): void; + + abstract _loadHttp(src: string): void; + + abstract _loadData(src: string): void; + + abstract stopLoading(): void; get canGoBack(): boolean { throw new Error("This member is abstract."); @@ -113,15 +137,9 @@ export class WebView extends view.View implements definition.WebView { throw new Error("This member is abstract."); } - public goBack() { - throw new Error("This member is abstract."); - } + abstract goBack(): void; - public goForward() { - throw new Error("This member is abstract."); - } + abstract goForward(): void; - public reload() { - throw new Error("This member is abstract."); - } + abstract reload(): void; } \ No newline at end of file diff --git a/ui/web-view/web-view.android.ts b/ui/web-view/web-view.android.ts index 5eb7fc0e6..89087fe5d 100644 --- a/ui/web-view/web-view.android.ts +++ b/ui/web-view/web-view.android.ts @@ -1,7 +1,5 @@ import common = require("./web-view-common"); import trace = require("trace"); -import utils = require("utils/utils"); -import fs = require("file-system"); global.moduleMerge(common, exports); @@ -70,41 +68,50 @@ export class WebView extends common.WebView { } public _loadUrl(url: string) { + if (!this._android) { + return; + } + trace.write("WebView._loadUrl(" + url + ")", trace.categories.Debug); this._android.stopLoading(); this._android.loadUrl(url); } - public _loadSrc(src: string) { - trace.write("WebView._loadSrc(" + src + ")", trace.categories.Debug); - - this._android.stopLoading(); - this._android.loadUrl("about:blank"); - - 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) { - var baseUrl = `file:///${src.substring(0, src.lastIndexOf('/') + 1)}`; - file.readText().then(r => { - this._android.loadDataWithBaseURL(baseUrl, r, "text/html; charset=utf-8", "utf-8", null); - }); - } - } else if (src.indexOf("http://") === 0 || src.indexOf("https://") === 0) { - this._android.loadUrl(src); - } else { - this._android.loadData(src, "text/html; charset=utf-8", "utf-8"); + public _loadFileOrResource(path: string, content: string) { + if (!this._android) { + return; } + + var baseUrl = `file:///${path.substring(0, path.lastIndexOf('/') + 1) }`; + this._android.loadDataWithBaseURL(baseUrl, content, "text/html; charset=utf-8", "utf-8", null); + } + + public _loadHttp(src: string) { + if (!this._android) { + return; + } + + this._android.loadUrl(src); + } + + public _loadData(src: string) { + if (!this._android) { + return; + } + + this._android.loadData(src, "text/html; charset=utf-8", "utf-8"); } get canGoBack(): boolean { return this._android.canGoBack(); } + public stopLoading() { + if (this._android) { + this._android.stopLoading(); + } + } + get canGoForward(): boolean { return this._android.canGoForward(); } diff --git a/ui/web-view/web-view.d.ts b/ui/web-view/web-view.d.ts index d8f6e5305..038085ae5 100644 --- a/ui/web-view/web-view.d.ts +++ b/ui/web-view/web-view.d.ts @@ -55,6 +55,11 @@ declare module "ui/web-view" { */ canGoForward: boolean; + /** + * Stops loading the current content (if any). + */ + stopLoading(): void; + /** * Navigates back. */ diff --git a/ui/web-view/web-view.ios.ts b/ui/web-view/web-view.ios.ts index 0f1937abf..7d642a8d9 100644 --- a/ui/web-view/web-view.ios.ts +++ b/ui/web-view/web-view.ios.ts @@ -1,7 +1,5 @@ import common = require("./web-view-common"); import trace = require("trace"); -import utils = require("utils/utils"); -import fs = require("file-system"); global.moduleMerge(common, exports); @@ -73,6 +71,10 @@ export class WebView extends common.WebView { return this._ios; } + public stopLoading() { + this._ios.stopLoading(); + } + public _loadUrl(url: string) { trace.write("WebView._loadUrl(" + url + ")", trace.categories.Debug); @@ -82,31 +84,17 @@ 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); + public _loadFileOrResource(path: string, content: string) { + var baseURL = NSURL.fileURLWithPath(NSString.stringWithString(path).stringByDeletingLastPathComponent); + this._ios.loadHTMLStringBaseURL(content, baseURL); + } - if (this._ios.loading) { - this._ios.stopLoading(); - } + public _loadHttp(src: string) { + this._ios.loadRequest(NSURLRequest.requestWithURL(NSURL.URLWithString(src))); + } - 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) { - var baseURL = NSURL.fileURLWithPath(NSString.stringWithString(src).stringByDeletingLastPathComponent); - file.readText().then((r) => { - this._ios.loadHTMLStringBaseURL(r, baseURL); - }); - } - } else if (src.indexOf("http://") === 0 || src.indexOf("https://") === 0) { - this._ios.loadRequest(NSURLRequest.requestWithURL(NSURL.URLWithString(src))); - } else { - this._ios.loadHTMLStringBaseURL(src, null); - } + public _loadData(src: string) { + this._ios.loadHTMLStringBaseURL(src, null); } get canGoBack(): boolean {