From e99cfddb2fdc481a4452da9aa23fc7af2a4208a0 Mon Sep 17 00:00:00 2001 From: huayongxu <49056704+huayongxu@users.noreply.github.com> Date: Tue, 26 Jan 2021 19:15:57 +0800 Subject: [PATCH] [NUI] Support scroll in WebView. (#2528) 1) ScrollPosition, ScrollSize, ContentSize properties are added. 2) ScrollBy is added. 3) ScrollEdgeReached events are notified when scrolled to edge. Co-authored-by: Jiyun Yang --- .../src/internal/Interop/Interop.WebView.cs | 24 ++ src/Tizen.NUI/src/internal/WebView.cs | 136 +++++++++ .../internal/WebViewScrollEdgeReachedEventArgs.cs | 59 ++++ .../src/internal/WebViewScrollEdgeReachedSignal.cs | 55 ++++ .../Tizen.NUI.WebViewTest.csproj | 27 ++ .../Tizen.NUI.WebViewTest.sln | 25 ++ test/Tizen.NUI.WebViewTest/WebViewApp.cs | 337 +++++++++++++++++++++ .../shared/res/Tizen.NUI.WebViewTest.png | Bin 0 -> 10097 bytes test/Tizen.NUI.WebViewTest/tizen-manifest.xml | 12 + 9 files changed, 675 insertions(+) create mode 100755 src/Tizen.NUI/src/internal/WebViewScrollEdgeReachedEventArgs.cs create mode 100755 src/Tizen.NUI/src/internal/WebViewScrollEdgeReachedSignal.cs create mode 100755 test/Tizen.NUI.WebViewTest/Tizen.NUI.WebViewTest.csproj create mode 100755 test/Tizen.NUI.WebViewTest/Tizen.NUI.WebViewTest.sln create mode 100755 test/Tizen.NUI.WebViewTest/WebViewApp.cs create mode 100755 test/Tizen.NUI.WebViewTest/shared/res/Tizen.NUI.WebViewTest.png create mode 100755 test/Tizen.NUI.WebViewTest/tizen-manifest.xml diff --git a/src/Tizen.NUI/src/internal/Interop/Interop.WebView.cs b/src/Tizen.NUI/src/internal/Interop/Interop.WebView.cs index 47f48cb..9ac1dd1 100755 --- a/src/Tizen.NUI/src/internal/Interop/Interop.WebView.cs +++ b/src/Tizen.NUI/src/internal/Interop/Interop.WebView.cs @@ -45,6 +45,15 @@ namespace Tizen.NUI [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_GetSettings")] public static extern global::System.IntPtr GetWebSettings(global::System.Runtime.InteropServices.HandleRef jarg1); + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_Property_SCROLL_POSITION_get")] + public static extern int ScrollPositionGet(); + + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_Property_SCROLL_SIZE_get")] + public static extern int ScrollSizeGet(); + + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_Property_CONTENT_SIZE_get")] + public static extern int ContentSizeGet(); + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_LoadUrl")] public static extern void LoadUrl(global::System.Runtime.InteropServices.HandleRef jarg1, string jarg2); @@ -63,6 +72,9 @@ namespace Tizen.NUI [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_Resume")] public static extern void Resume(global::System.Runtime.InteropServices.HandleRef jarg1); + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_ScrollBy")] + public static extern void ScrollBy(global::System.Runtime.InteropServices.HandleRef jarg1, int jarg2, int jarg3); + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_GoBack")] public static extern void GoBack(global::System.Runtime.InteropServices.HandleRef jarg1); @@ -113,6 +125,18 @@ namespace Tizen.NUI [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebViewPageLoadErrorSignal_Disconnect")] public static extern void WebViewPageLoadErrorSignalDisconnect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2); + + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_new_WebViewScrollEdgeReachedSignal_ScrollEdgeReached")] + public static extern global::System.IntPtr NewWebViewScrollEdgeReachedSignalScrollEdgeReached(global::System.Runtime.InteropServices.HandleRef jarg1); + + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_delete_WebViewScrollEdgeReachedSignal")] + public static extern void DeleteWebViewScrollEdgeReachedSignal(global::System.Runtime.InteropServices.HandleRef jarg1); + + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebViewScrollEdgeReachedSignal_Connect")] + public static extern void WebViewScrollEdgeReachedSignalConnect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2); + + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebViewScrollEdgeReachedSignal_Disconnect")] + public static extern void WebViewScrollEdgeReachedSignalDisconnect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2); } } } diff --git a/src/Tizen.NUI/src/internal/WebView.cs b/src/Tizen.NUI/src/internal/WebView.cs index f425005..9ff2550 100755 --- a/src/Tizen.NUI/src/internal/WebView.cs +++ b/src/Tizen.NUI/src/internal/WebView.cs @@ -36,6 +36,9 @@ namespace Tizen.NUI [UnmanagedFunctionPointer(CallingConvention.StdCall)] private delegate void WebViewPageLoadErrorCallbackDelegate(IntPtr data, string pageUrl, int errorCode); + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + private delegate void WebViewScrollEdgeReachedCallbackDelegate(IntPtr data, int edge); + private readonly WebViewPageLoadSignal pageLoadStartedSignal; private EventHandler pageLoadStartedEventHandler; private WebViewPageLoadCallbackDelegate pageLoadStartedCallback; @@ -48,11 +51,16 @@ namespace Tizen.NUI private EventHandler pageLoadErrorEventHandler; private WebViewPageLoadErrorCallbackDelegate pageLoadErrorCallback; + private readonly WebViewScrollEdgeReachedSignal scrollEdgeReachedSignal; + private EventHandler scrollEdgeReachedEventHandler; + private WebViewScrollEdgeReachedCallbackDelegate scrollEdgeReachedCallback; + internal WebView(global::System.IntPtr cPtr, bool cMemoryOwn) : base(Interop.WebView.Upcast(cPtr), cMemoryOwn) { pageLoadStartedSignal = new WebViewPageLoadSignal(Interop.WebView.NewWebViewPageLoadSignalPageLoadStarted(SwigCPtr)); pageLoadFinishedSignal = new WebViewPageLoadSignal(Interop.WebView.NewWebViewPageLoadSignalPageLoadFinished(SwigCPtr)); pageLoadErrorSignal = new WebViewPageLoadErrorSignal(Interop.WebView.NewWebViewPageLoadErrorSignalPageLoadError(SwigCPtr)); + scrollEdgeReachedSignal = new WebViewScrollEdgeReachedSignal(Interop.WebView.NewWebViewScrollEdgeReachedSignalScrollEdgeReached(SwigCPtr)); BackForwardList = new WebBackForwardList(Interop.WebView.GetWebBackForwardList(SwigCPtr), false); Context = new WebContext(Interop.WebView.GetWebContext(SwigCPtr), false); @@ -147,10 +155,19 @@ namespace Tizen.NUI pageLoadErrorEventHandler?.Invoke(this, e); } + private void OnScrollEdgeReached(IntPtr data, int edge) + { + WebViewScrollEdgeReachedEventArgs arg = new WebViewScrollEdgeReachedEventArgs((WebViewScrollEdgeReachedEventArgs.Edge)edge); + scrollEdgeReachedEventHandler?.Invoke(this, arg); + } + internal static new class Property { internal static readonly int Url = Interop.WebView.UrlGet(); internal static readonly int UserAgent = Interop.WebView.UserAgentGet(); + internal static readonly int ScrollPosition = Interop.WebView.ScrollPositionGet(); + internal static readonly int ScrollSize = Interop.WebView.ScrollSizeGet(); + internal static readonly int ContentSize = Interop.WebView.ContentSizeGet(); } private static readonly BindableProperty UrlProperty = BindableProperty.Create(nameof(Url), typeof(string), typeof(WebView), string.Empty, propertyChanged: (BindableProperty.BindingPropertyChangedDelegate)((bindable, oldValue, newValue) => @@ -185,6 +202,38 @@ namespace Tizen.NUI return temp; })); + private static readonly BindableProperty ScrollPositionProperty = BindableProperty.Create(nameof(ScrollPosition), typeof(Vector2), typeof(WebView), null, propertyChanged: (bindable, oldValue, newValue) => + { + var webview = (WebView)bindable; + if (newValue != null) + { + Tizen.NUI.Object.SetProperty(webview.SwigCPtr, WebView.Property.ScrollPosition, new Tizen.NUI.PropertyValue((Vector2)newValue)); + } + }, + defaultValueCreator: (bindable) => + { + var webview = (WebView)bindable; + Vector2 temp = new Vector2(0.0f, 0.0f); ; + Tizen.NUI.Object.GetProperty(webview.SwigCPtr, WebView.Property.ScrollPosition).Get(temp); + return temp; + }); + + private static readonly BindableProperty ScrollSizeProperty = BindableProperty.Create(nameof(ScrollSize), typeof(Vector2), typeof(WebView), null, defaultValueCreator: (bindable) => + { + var webview = (WebView)bindable; + Vector2 temp = new Vector2(0.0f, 0.0f); ; + Tizen.NUI.Object.GetProperty(webview.SwigCPtr, WebView.Property.ScrollSize).Get(temp); + return temp; + }); + + private static readonly BindableProperty ContentSizeProperty = BindableProperty.Create(nameof(ContentSize), typeof(Vector2), typeof(WebView), null, defaultValueCreator: (bindable) => + { + var webview = (WebView)bindable; + Vector2 temp = new Vector2(0.0f, 0.0f); ; + Tizen.NUI.Object.GetProperty(webview.SwigCPtr, WebView.Property.ContentSize).Get(temp); + return temp; + }); + /// /// Creates an uninitialized WebView. /// @@ -371,6 +420,55 @@ namespace Tizen.NUI } /// + /// The postion of scroll. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Position ScrollPosition + { + get + { + Vector2 pv = (Vector2)GetValue(ScrollPositionProperty); + return new Position(pv.X, pv.Y); + } + set + { + if (value != null) + { + Position pv = value; + Vector2 vpv = new Vector2(pv.X, pv.Y); + SetValue(ScrollPositionProperty, vpv); + NotifyPropertyChanged(); + } + } + } + + /// + /// The size of scroll, read-only. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Size ScrollSize + { + get + { + Vector2 sv = (Vector2)GetValue(ScrollSizeProperty); + return new Size(sv.Width, sv.Height); + } + } + + /// + /// The size of content, read-only. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Size ContentSize + { + get + { + Vector2 sv = (Vector2)GetValue(ContentSizeProperty); + return new Size(sv.Width, sv.Height); + } + } + + /// /// Event for the PageLoadStarted signal which can be used to subscribe or unsubscribe the event handler.
/// This signal is emitted when page loading has started.
///
@@ -449,6 +547,32 @@ namespace Tizen.NUI } /// + /// Event for the ScrollEdgeReached signal which can be used to subscribe or unsubscribe the event handler.
+ /// This signal is emitted when web view is scrolled to edge.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)] + public event EventHandler ScrollEdgeReached + { + add + { + if (scrollEdgeReachedEventHandler == null) + { + scrollEdgeReachedCallback = OnScrollEdgeReached; + scrollEdgeReachedSignal.Connect(scrollEdgeReachedCallback); + } + scrollEdgeReachedEventHandler += value; + } + remove + { + scrollEdgeReachedEventHandler -= value; + if (scrollEdgeReachedEventHandler == null && scrollEdgeReachedCallback != null) + { + scrollEdgeReachedSignal.Disconnect(scrollEdgeReachedCallback); + } + } + } + + /// /// Loads a html. /// The path of Web /// @@ -522,6 +646,18 @@ namespace Tizen.NUI } /// + /// Scroll web view by deltaX and detlaY. + /// The deltaX of scroll + /// The deltaY of scroll + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public void ScrollBy(int deltaX, int deltaY) + { + Interop.WebView.ScrollBy(SwigCPtr, deltaX, deltaY); + if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); + } + + /// /// Goes to the back /// [EditorBrowsable(EditorBrowsableState.Never)] diff --git a/src/Tizen.NUI/src/internal/WebViewScrollEdgeReachedEventArgs.cs b/src/Tizen.NUI/src/internal/WebViewScrollEdgeReachedEventArgs.cs new file mode 100755 index 0000000..8cf0464 --- /dev/null +++ b/src/Tizen.NUI/src/internal/WebViewScrollEdgeReachedEventArgs.cs @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +using System; +using System.ComponentModel; + +namespace Tizen.NUI +{ + /// + /// Event arguments that passed via the WebView.ScrollEdgeReached. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class WebViewScrollEdgeReachedEventArgs : EventArgs + { + /// + /// The enumeration for edge. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public enum Edge + { + [EditorBrowsable(EditorBrowsableState.Never)] + Left, + + [EditorBrowsable(EditorBrowsableState.Never)] + Right, + + [EditorBrowsable(EditorBrowsableState.Never)] + Top, + + [EditorBrowsable(EditorBrowsableState.Never)] + Bottom, + } + + /// + /// The edge, e.g. left, right, etc. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Edge ScrollEdge { get; } + + internal WebViewScrollEdgeReachedEventArgs(Edge e) + { + ScrollEdge = e; + } + } +} diff --git a/src/Tizen.NUI/src/internal/WebViewScrollEdgeReachedSignal.cs b/src/Tizen.NUI/src/internal/WebViewScrollEdgeReachedSignal.cs new file mode 100755 index 0000000..d04c921 --- /dev/null +++ b/src/Tizen.NUI/src/internal/WebViewScrollEdgeReachedSignal.cs @@ -0,0 +1,55 @@ +/* + * Copyright(c) 2021 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +namespace Tizen.NUI +{ + internal class WebViewScrollEdgeReachedSignal : Disposable + { + public WebViewScrollEdgeReachedSignal(global::System.IntPtr cPtr) : base(cPtr, true) + { + } + + public void Connect(System.Delegate func) + { + System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func); + { + Interop.WebView.WebViewScrollEdgeReachedSignalConnect(SwigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip)); + if (NDalicPINVOKE.SWIGPendingException.Pending) + { + throw NDalicPINVOKE.SWIGPendingException.Retrieve(); + } + } + } + + public void Disconnect(System.Delegate func) + { + System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func); + { + Interop.WebView.WebViewScrollEdgeReachedSignalDisconnect(SwigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip)); + if (NDalicPINVOKE.SWIGPendingException.Pending) + { + throw NDalicPINVOKE.SWIGPendingException.Retrieve(); + } + } + } + + protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr) + { + Interop.WebView.DeleteWebViewScrollEdgeReachedSignal(swigCPtr); + } + } +} diff --git a/test/Tizen.NUI.WebViewTest/Tizen.NUI.WebViewTest.csproj b/test/Tizen.NUI.WebViewTest/Tizen.NUI.WebViewTest.csproj new file mode 100755 index 0000000..bbd4ac1 --- /dev/null +++ b/test/Tizen.NUI.WebViewTest/Tizen.NUI.WebViewTest.csproj @@ -0,0 +1,27 @@ + + + + Exe + netcoreapp2.0 + Tizen.NUI.WebViewTest + true + Tizen.NUI.WebViewTest + Tizen.NUI.WebViewTest + Tizen.NUI.WebViewTest + Tizen.NUI.WebViewTest + + + + portable + + + None + + + + + + + + + diff --git a/test/Tizen.NUI.WebViewTest/Tizen.NUI.WebViewTest.sln b/test/Tizen.NUI.WebViewTest/Tizen.NUI.WebViewTest.sln new file mode 100755 index 0000000..ee67c4e --- /dev/null +++ b/test/Tizen.NUI.WebViewTest/Tizen.NUI.WebViewTest.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30309.148 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.NUI.WebViewTest", "Tizen.NUI.WebViewTest.csproj", "{3C6CE4CE-9D35-42C9-B23D-BBFFA96B3955}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3C6CE4CE-9D35-42C9-B23D-BBFFA96B3955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C6CE4CE-9D35-42C9-B23D-BBFFA96B3955}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C6CE4CE-9D35-42C9-B23D-BBFFA96B3955}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3C6CE4CE-9D35-42C9-B23D-BBFFA96B3955}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {355D568D-D02A-490A-A6AC-FD6C7D97457A} + EndGlobalSection +EndGlobal diff --git a/test/Tizen.NUI.WebViewTest/WebViewApp.cs b/test/Tizen.NUI.WebViewTest/WebViewApp.cs new file mode 100755 index 0000000..5839c10 --- /dev/null +++ b/test/Tizen.NUI.WebViewTest/WebViewApp.cs @@ -0,0 +1,337 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System; +using Tizen.NUI.BaseComponents; + +namespace Tizen.NUI.WebViewTest +{ + public class WebViewApplication : NUIApplication + { + private WebView simpleWebView = null; + private TextField addressBar = null; + + private int index = 0; + private const int WEBSITES_COUNT = 93; + private string[] websites = + { + "http://www.baidu.com","http://www.Google.com","http://www.Facebook.com","http://www.Youtube.com","http://www.Yahoo.com", + "http://www.Amazon.com","http://www.Wikipedia.org","http://www.Google.co.in","http://www.Qq.com","http://www.Twitter.com", + "http://www.Live.com","http://www.Taobao.com","http://www.Msn.com","http://www.Yahoo.co.jp","http://www.Linkedin.com", + "http://www.Google.co.jp","http://www.Sina.com.cn","http://www.Bing.com","http://www.Weibo.com","http://www.Yandex.ru", + "http://www.Vk.com","http://www.Instagram.com","http://www.Hao123.com","http://www.Ebay.com","http://www.Google.de", + "http://www.Amazon.co.jp","http://www.Mail.ru","http://www.Google.co.uk","http://www.Google.ru","http://www.Pinterest.com", + "http://www.360.cn","http://www.T.co","http://www.Reddit.com","http://www.Google.com.br","http://www.Netflix.com", + "http://www.Tmall.com","http://www.Google.fr","http://www.Paypal.com","http://www.Microsoft.com","http://www.Wordpress.com", + "http://www.Sohu.com","http://www.Blogspot.com","http://www.Google.it","http://www.Google.es","http://www.Onclickads.net", + "http://www.Tumblr.com","http://www.Imgur.com","http://www.Gmw.cn","http://www.Ok.ru","http://www.Aliexpress.com", + "http://www.Apple.com","http://www.Imdb.com","http://www.Stackoverflow.com","http://www.Fc2.com","http://www.Google.com.mx", + "http://www.Ask.com","http://www.Amazon.de","http://www.Google.com.hk","http://www.Google.com.tr","http://www.Alibaba.com", + "http://www.Google.ca","http://www.Office.com","http://www.Rakuten.co.jp","http://www.Google.co.id","http://www.Tianya.cn", + "http://www.Xinhuanet.com","http://www.Github.com","http://www.Craigslist.org","http://www.Nicovideo.jp","http://www.Soso.com", + "http://www.Amazon.co.uk","http://www.Amazon.in","http://www.Blogger.com","http://www.Kat.cr","http://www.Outbrain.com", + "http://www.Pixnet.net","http://www.Cnn.com","http://www.Go.com","http://www.Google.pl","http://www.Dropbox.com", + "http://www.Google.com.au","http://www.360.com","http://www.Haosou.com","http://www.Naver.com","http://www.Jd.com", + "http://www.Adobe.com","http://www.Flipkart.com","http://www.Whatsapp.com","http://www.Nytimes.com","http://www.Coccoc.com", + "http://www.Chase.com","http://www.Chinadaily.com.cn","http://www.bbc.co.uk" + }; + + private const string USER_AGENT = "Mozilla/5.0 (SMART-TV; Linux; Tizen 6.0) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/76.0.3809.146 TV Safari/537.36"; + + private const int ADDRESSBAR_HEIGHT = 100; + + private const int SCREEN_WIDTH = 1920; + private const int SCREEN_HEIGHT = 1080; + + private const int MIN_WEBVIEW_WIDTH = 1000; + private const int MIN_WEBVIEW_HEIGHT = 600; + + private const int WEBVIEW_WIDTH = SCREEN_WIDTH; + private const int WEBVIEW_HEIGHT = SCREEN_HEIGHT - ADDRESSBAR_HEIGHT; + + private int blueKeyPressedCount = 0; + private int yellowKeyPressedCount = 0; + + private static long startTime = 0; + + private TextLabel messageLabel = null; + private Timer messageTimer = null; + + protected override void OnCreate() + { + base.OnCreate(); + + GetDefaultWindow().BackgroundColor = new Color((float)189 /255, (float)179 /255, (float)204 /255, 1.0f); + //EnvironmentVariable.SetEnvironmentVariable("DALI_WEB_ENGINE_NAME", "lwe"); + + addressBar = new TextField() + { + BackgroundColor = Color.White, + Size = new Size(SCREEN_WIDTH, ADDRESSBAR_HEIGHT), + EnableGrabHandlePopup = false, + EnableGrabHandle = false, + EnableSelection = true, + Focusable = true, + PlaceholderText = "Please input url here like Www.baidu.com.", + }; + addressBar.FocusGained += OnTextEditorFocusGained; + addressBar.FocusLost += OnTextEditorFocusLost; + addressBar.KeyEvent += OnAddressBarKeyEvent; + addressBar.TouchEvent += OnAddressBarTouchEvent; + GetDefaultWindow().Add(addressBar); + + simpleWebView = new WebView() + { + Position = new Position(0, ADDRESSBAR_HEIGHT), + Size = new Size(WEBVIEW_WIDTH, WEBVIEW_HEIGHT), + UserAgent = USER_AGENT, + Focusable = true, + }; + simpleWebView.FocusGained += OnWebViewFocusGained; + simpleWebView.FocusLost += OnWebViewFocusLost; + simpleWebView.KeyEvent += OnWebViewKeyEvent; + simpleWebView.TouchEvent += OnWebViewTouchEvent; + simpleWebView.PageLoadStarted += OnPageLoadStarted; + simpleWebView.ScrollEdgeReached += OnScrollEdgeReached; + GetDefaultWindow().Add(simpleWebView); + + GetDefaultWindow().KeyEvent += Instance_KeyEvent; + simpleWebView.LoadUrl(websites[index]); + FocusManager.Instance.SetCurrentFocusView(simpleWebView); + + messageTimer = new Timer(10000); + messageTimer.Tick += OnTick; + } + + protected override void OnTerminate() + { + GetDefaultWindow().Remove(simpleWebView); + GetDefaultWindow().Remove(addressBar); + + messageTimer.Tick -= OnTick; + messageTimer.Dispose(); + messageTimer = null; + + base.OnTerminate(); + } + + private bool OnTick(object sender, EventArgs e) + { + GetDefaultWindow().Remove(messageLabel); + messageLabel.Dispose(); + messageLabel = null; + return false; + } + + private bool OnWebViewTouchEvent(object source, View.TouchEventArgs args) + { + if (!simpleWebView.HasFocus()) + { + FocusManager.Instance.SetCurrentFocusView(simpleWebView); + } + return false; + } + + private void OnScrollEdgeReached(object sender, WebViewScrollEdgeReachedEventArgs e) + { + Log.Info("WebView", $"------------scroll edge reached: {e.ScrollEdge}-------"); + } + + private void OnPageLoadStarted(object sender, WebViewPageLoadEventArgs e) + { + Log.Info("WebView", $"------------web view start to load time: {DateTime.Now.Ticks - startTime}-------"); + } + + private void OnWebViewFocusGained(object source, EventArgs args) + { + Log.Info("WebView", $"------------web view focus is gained-------"); + } + + private void OnWebViewFocusLost(object source, EventArgs args) + { + Log.Info("WebView", $"------------web view focus is lost-------"); + } + + private bool OnWebViewKeyEvent(object source, View.KeyEventArgs args) + { + bool result = false; + + Log.Info("WebView", $"----web view key is {args.Key.KeyPressedName}, state is {args.Key.State}-------"); + + if (args.Key.State == Key.StateType.Up) + { + if (args.Key.KeyPressedName == "XF86RaiseChannel") + { + Log.Info("WebView", $"old url is {simpleWebView.Url}."); + if (index != 0) + { + simpleWebView.Url = websites[--index].ToLowerInvariant(); + } + else + { + simpleWebView.Url = websites[WEBSITES_COUNT - 1].ToLowerInvariant(); + } + result = true; + Log.Info("WebView", $"new url is {simpleWebView.Url}."); + } + else if (args.Key.KeyPressedName == "XF86LowerChannel") + { + Log.Info("WebView", $"old url is {simpleWebView.Url}."); + if (index != WEBSITES_COUNT - 1) + { + simpleWebView.Url = websites[++index].ToLowerInvariant(); + } + else + { + simpleWebView.Url = websites[0].ToLowerInvariant(); + } + result = true; + Log.Info("WebView", $"new url is {simpleWebView.Url}."); + } + else if (args.Key.KeyPressedName == "XF86Back") + { + simpleWebView.GoBack(); + result = true; + } + else if (args.Key.KeyPressedName == "XF86Red") + { + FocusManager.Instance.SetCurrentFocusView(addressBar); + result = true; + } + else if (args.Key.KeyPressedName == "XF86Blue") + { + blueKeyPressedCount++; + if (blueKeyPressedCount % 6 == 0) + { + simpleWebView.Position = new Position(0, ADDRESSBAR_HEIGHT); + simpleWebView.Orientation = new Rotation(new Radian(new Degree(60 * blueKeyPressedCount)), Vector3.ZAxis); + blueKeyPressedCount = 0; + } + else + { + simpleWebView.Orientation = new Rotation(new Radian(new Degree(60 * blueKeyPressedCount)), Vector3.ZAxis); + } + result = true; + } + else if (args.Key.KeyPressedName == "XF86Yellow") + { + yellowKeyPressedCount++; + int wdistance = (SCREEN_WIDTH - MIN_WEBVIEW_WIDTH) / 5; + int hdistance = (SCREEN_HEIGHT - MIN_WEBVIEW_HEIGHT - ADDRESSBAR_HEIGHT) / 5; + simpleWebView.Position = new Position((SCREEN_WIDTH - MIN_WEBVIEW_WIDTH - yellowKeyPressedCount * wdistance) / 2, ADDRESSBAR_HEIGHT); + simpleWebView.Size = new Size(MIN_WEBVIEW_WIDTH + yellowKeyPressedCount * wdistance, MIN_WEBVIEW_HEIGHT + hdistance * yellowKeyPressedCount); + if (yellowKeyPressedCount % 5 == 0) + { + yellowKeyPressedCount = 0; + } + result = true; + } + else if (args.Key.KeyPressedName == "XF86Green") + { + if (messageLabel != null) + return result; + + Log.Info("WebView", $"key XF86Green is pressed."); + + simpleWebView.ScrollPosition = new Position(0, 200); + simpleWebView.ScrollBy(0, 50); + Log.Info("WebView", $"scroll position is ({simpleWebView.ScrollPosition.X}, {simpleWebView.ScrollPosition.Y})."); + Log.Info("WebView", $"scroll size is ({simpleWebView.ScrollSize.Width}, {simpleWebView.ScrollSize.Height})."); + Log.Info("WebView", $"content size is ({simpleWebView.ContentSize.Width}, {simpleWebView.ContentSize.Height})."); + + result = true; + } + } + + return result; + } + + private bool OnAddressBarTouchEvent(object source, View.TouchEventArgs args) + { + FocusManager.Instance.SetCurrentFocusView(addressBar); + return false; + } + + private void OnTextEditorFocusGained(object source, EventArgs args) + { + Log.Info("WebView", $"------------address bar focus is gained-------"); + + addressBar.Text = ""; + + addressBar.GetInputMethodContext().Activate(); + addressBar.GetInputMethodContext().ShowInputPanel(); + } + + private void OnTextEditorFocusLost(object source, EventArgs args) + { + Log.Info("WebView", $"------------address bar focus lost-------"); + } + + private bool OnAddressBarKeyEvent(object source, View.KeyEventArgs args) + { + Log.Info("WebView", $"------------address bar key is {args.Key.KeyPressedName}-------"); + + if (args.Key.State == Key.StateType.Up) + { + if (args.Key.KeyPressedName == "Select") + { + Log.Info("WebView", $"------------address bar text is {addressBar.Text}-------"); + + if (addressBar.Text.Length > 0) + { + addressBar.GetInputMethodContext().HideInputPanel(); + addressBar.GetInputMethodContext().Deactivate(); + + simpleWebView.Url = $"http://{addressBar.Text.ToLowerInvariant()}"; + + // set focus to webview. + FocusManager.Instance.SetCurrentFocusView(simpleWebView); + } + } + else if (args.Key.KeyPressedName == "BackSpace") + { + if (addressBar.Text.Length > 0) + { + addressBar.Text = addressBar.Text.Substring(0, addressBar.Text.Length - 1); + } + } + else if (args.Key.KeyPressedName == "XF86Red") + { + FocusManager.Instance.SetCurrentFocusView(simpleWebView); + } + } + + return true; + } + + private void Instance_KeyEvent(object sender, Window.KeyEventArgs args) + { + if (args.Key.State == Key.StateType.Up) + { + Log.Info("WebView", $"window key is {args.Key.KeyPressedName}."); + } + } + + [STAThread] + static void Main(string[] args) + { + startTime = DateTime.Now.Ticks; + Log.Info("WebView", $"------------web view start time: {startTime}-------"); + new WebViewApplication().Run(args); + } + } +} + diff --git a/test/Tizen.NUI.WebViewTest/shared/res/Tizen.NUI.WebViewTest.png b/test/Tizen.NUI.WebViewTest/shared/res/Tizen.NUI.WebViewTest.png new file mode 100755 index 0000000000000000000000000000000000000000..9f3cb98608134e7b9eb4beb7394fec9f03e40f63 GIT binary patch literal 10097 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 TJbOA100000NkvXXu0mjf?x(Kf literal 0 HcmV?d00001 diff --git a/test/Tizen.NUI.WebViewTest/tizen-manifest.xml b/test/Tizen.NUI.WebViewTest/tizen-manifest.xml new file mode 100755 index 0000000..b96f378 --- /dev/null +++ b/test/Tizen.NUI.WebViewTest/tizen-manifest.xml @@ -0,0 +1,12 @@ + + + + + + Tizen.NUI.WebViewTest.png + + + + + + -- 2.7.4