diff options
author | chungryeol lim <cdark.lim@samsung.com> | 2017-03-09 17:35:07 +0900 |
---|---|---|
committer | Kangho Hur <kangho.hur@samsung.com> | 2017-04-24 13:36:56 +0900 |
commit | aceefc405e97d94dee98f102031d3e72e638dbeb (patch) | |
tree | a8d9dbb8e25204c1785af25026f158a4021f84d9 /Xamarin.Forms.Platform.Tizen/Renderers | |
parent | ae1607380b6676f401fe52083d7c084258980323 (diff) | |
download | xamarin-forms-aceefc405e97d94dee98f102031d3e72e638dbeb.tar.gz xamarin-forms-aceefc405e97d94dee98f102031d3e72e638dbeb.tar.bz2 xamarin-forms-aceefc405e97d94dee98f102031d3e72e638dbeb.zip |
Add WebViewRenderer
- Depend On : https://review.tizen.org/gerrit/#/c/115231/
(This will be added after WebView Merge)
Change-Id: I1fdc0c4420ba7e7a6b48b6ee0ce60d59e31e3691
Signed-off-by: chungryeol lim <cdark.lim@samsung.com>
Diffstat (limited to 'Xamarin.Forms.Platform.Tizen/Renderers')
-rw-r--r-- | Xamarin.Forms.Platform.Tizen/Renderers/WebViewRenderer.cs | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.Tizen/Renderers/WebViewRenderer.cs b/Xamarin.Forms.Platform.Tizen/Renderers/WebViewRenderer.cs new file mode 100644 index 00000000..56579fb7 --- /dev/null +++ b/Xamarin.Forms.Platform.Tizen/Renderers/WebViewRenderer.cs @@ -0,0 +1,177 @@ +using System; +using System.ComponentModel; +using Xamarin.Forms.Internals; +using TChromium = Tizen.WebView.Chromium; +using TWebView = Tizen.WebView.WebView; + +namespace Xamarin.Forms.Platform.Tizen +{ + public class WebViewRenderer : VisualElementRenderer<WebView>, IWebViewDelegate + { + bool _updating; + WebNavigationEvent _eventState; + TWebView _control = null; + + public void LoadHtml(string html, string baseUrl) + { + _control.LoadHtml(html, baseUrl); + } + + public void LoadUrl(string url) + { + if (!string.IsNullOrEmpty(url)) + { + _control.LoadUrl(url); + } + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (Element != null) + { + if (_control != null) + { + _control.StopLoading(); + _control.LoadStarted -= OnLoadStarted; + _control.LoadFinished -= OnLoadFinished; + _control.LoadError -= OnLoadError; + } + Element.EvalRequested -= OnEvalRequested; + Element.GoBackRequested -= OnGoBackRequested; + Element.GoForwardRequested -= OnGoForwardRequested; + } + } + base.Dispose(disposing); + } + + protected override void OnElementChanged(ElementChangedEventArgs<WebView> e) + { + if (_control == null) + { + TChromium.Initialize(); + Forms.Context.Terminated += (sender, arg) => TChromium.Shutdown(); + _control = new TWebView(Forms.Context.MainWindow); + _control.LoadStarted += OnLoadStarted; + _control.LoadFinished += OnLoadFinished; + _control.LoadError += OnLoadError; + SetNativeControl(_control); + } + + if (e.OldElement != null) + { + e.OldElement.EvalRequested -= OnEvalRequested; + e.OldElement.GoBackRequested -= OnGoBackRequested; + e.OldElement.GoForwardRequested -= OnGoForwardRequested; + } + + if (e.NewElement != null) + { + e.NewElement.EvalRequested += OnEvalRequested; + e.NewElement.GoForwardRequested += OnGoForwardRequested; + e.NewElement.GoBackRequested += OnGoBackRequested; + Load(); + } + base.OnElementChanged(e); + } + + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == WebView.SourceProperty.PropertyName) + Load(); + + base.OnElementPropertyChanged(sender, e); + } + + void OnLoadError(object sender, global::Tizen.WebView.SmartCallbackLoadErrorArgs e) + { + string url = e.Url; + if (!string.IsNullOrEmpty(url)) + SendNavigated(new UrlWebViewSource { Url = url }, _eventState, WebNavigationResult.Failure); + } + + void OnLoadStarted(object sender, EventArgs e) + { + string url = _control.Url; + if (!string.IsNullOrEmpty(url)) + { + var args = new WebNavigatingEventArgs(_eventState, new UrlWebViewSource { Url = url }, url); + Element.SendNavigating(args); + + if (args.Cancel) + { + _eventState = WebNavigationEvent.NewPage; + } + } + } + + void OnLoadFinished(object sender, EventArgs e) + { + string url = _control.Url; + if (!string.IsNullOrEmpty(url)) + SendNavigated(new UrlWebViewSource { Url = url }, _eventState, WebNavigationResult.Success); + + _control.SetFocus(true); + UpdateCanGoBackForward(); + } + + void Load() + { + if (_updating) + return; + + if (Element.Source != null) + { + Element.Source.Load(this); + } + + UpdateCanGoBackForward(); + } + + void OnEvalRequested(object sender, EvalRequested eventArg) + { + _control.Eval(eventArg.Script); + } + + void OnGoBackRequested(object sender, EventArgs eventArgs) + { + if (_control.CanGoBack()) + { + _eventState = WebNavigationEvent.Back; + _control.GoBack(); + } + + UpdateCanGoBackForward(); + } + + void OnGoForwardRequested(object sender, EventArgs eventArgs) + { + if (_control.CanGoForward()) + { + _eventState = WebNavigationEvent.Forward; + _control.GoForward(); + } + + UpdateCanGoBackForward(); + } + + void SendNavigated(UrlWebViewSource source, WebNavigationEvent evnt, WebNavigationResult result) + { + _updating = true; + ((IElementController)Element).SetValueFromRenderer(WebView.SourceProperty, source); + _updating = false; + + Element.SendNavigated(new WebNavigatedEventArgs(evnt, source, source.Url, result)); + + UpdateCanGoBackForward(); + _eventState = WebNavigationEvent.NewPage; + } + + void UpdateCanGoBackForward() + { + Element.CanGoBack = _control.CanGoBack(); + Element.CanGoForward = _control.CanGoForward(); + } + } +}
\ No newline at end of file |