Merge remote-tracking branch 'origin/master' into tizen
[platform/core/csapi/tizenfx.git] / test / Tizen.NUI.WebViewTest / SimpleWebViewApp.cs
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 using System;
18 using System.Collections.Generic;
19 using Tizen.NUI.BaseComponents;
20 using Tizen.NUI.Components;
21
22 namespace Tizen.NUI.WebViewTest
23 {
24     internal class MenuView : View
25     {
26         private WebContextMenu contextMenu;
27         private Button[] buttons;
28
29         public event EventHandler<ItemClickedEventArgs> ClickedEvent;
30
31         public class ItemClickedEventArgs : EventArgs
32         {
33             public uint CurrentIndex;
34         }
35
36         internal MenuView(WebContextMenu menu)
37         {
38             contextMenu = menu;
39
40             Layout = new LinearLayout()
41             {
42                 LinearOrientation = LinearLayout.Orientation.Vertical,
43                 LinearAlignment = LinearLayout.Alignment.Center
44             };
45
46             buttons = new Button[menu.ItemCount];
47
48             for (uint i = 0; i < menu.ItemCount; i++)
49             {
50                 WebContextMenuItem item = menu.GetItemAtIndex(i);
51                 buttons[i] = new Button()
52                 {
53                     Size = new Size(200, 80),
54                     PointSize = 30.0f,
55                     TextColor = Color.Black,
56                     Text = item.Title,
57                 };
58                 buttons[i].TouchEvent += OnMenuItemTouched;
59                 Add(buttons[i]);
60             }
61         }
62
63         private bool OnMenuItemTouched(object s, TouchEventArgs e)
64         {
65             uint i = 0;
66             for (; i < buttons.Length; i++)
67             {
68                 if (buttons[i] == (Button)s)
69                 {
70                     Log.Info("WebView", $"found button {i} is selected.");
71                     break;
72                 }
73             }
74
75             Log.Info("WebView", $"button {i} is selected.");
76
77             //WebContextMenuItem item = contextMenu.ItemList.GetItemAtIndex(i);
78             //if (item != null)
79             //{
80             //    contextMenu.SelectItem(item);
81             //    contextMenu.Hide();
82             //}
83
84             ItemClickedEventArgs args = new ItemClickedEventArgs();
85             args.CurrentIndex = i;
86             ClickedEvent?.Invoke(this, args);
87
88             Log.Info("WebView", $"button {i} is selected.");
89
90             return false;
91         }
92
93         internal void HideMenu()
94         {
95             contextMenu.Hide();
96         }
97     }
98
99     public class SimpleWebViewApplication : NUIApplication
100     {
101         private BaseComponents.WebView simpleWebView = null;
102         private TextField addressBar = null;
103         private Button backButton = null;
104         private Button forwardButton = null;
105         private Button refreshButton = null;
106
107         private int index = 0;
108         private const int WEBSITES_COUNT = 2;
109         private string[] websites =
110         {
111             "https://terms.account.samsung.com/contents/legal/kor/kor/customizedservicecontent.html",
112             "https://www.youtube.com"
113         };
114
115         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";
116
117         private const int ADDRESSBAR_HEIGHT = 100;
118
119         private const int SCREEN_WIDTH = 1920;
120         private const int SCREEN_HEIGHT = 1080;
121
122         private const int MIN_WEBVIEW_WIDTH = 1000;
123         private const int MIN_WEBVIEW_HEIGHT = 600;
124
125         private const int WEBVIEW_WIDTH = SCREEN_WIDTH;
126         private const int WEBVIEW_HEIGHT = SCREEN_HEIGHT - ADDRESSBAR_HEIGHT;
127
128         private Vector2 menuPosition;
129         private MenuView menuView;
130
131         private int blueKeyPressedCount = 0;
132         private int yellowKeyPressedCount = 0;
133         private int redKeyPressedCount = 0;
134
135         private static long startTime = 0;
136
137         private Timer messageTimer = null;
138         private ImageView faviconView = null;
139         private ImageView screenshotView = null;
140         private ImageView hitTestImageView = null;
141
142         private static string[] runtimeArgs = { "Tizen.NUI.WebViewTest", "--enable-dali-window", "--enable-spatial-navigation" };
143
144         protected override void OnCreate()
145         {
146             base.OnCreate();
147
148             GetDefaultWindow().BackgroundColor = new Color((float)189 / 255, (float)179 / 255, (float)204 / 255, 1.0f);
149
150             backButton = new Button()
151             {
152                 Position = new Position(0, 0),
153                 Size = new Size(100, 100),
154                 PointSize = 30.0f,
155                 TextColor = Color.Black,
156                 Text = "Back",
157             };
158             backButton.TouchEvent += OnBackButtonTouchEvent;
159             GetDefaultWindow().Add(backButton);
160
161             forwardButton = new Button()
162             {
163                 Position = new Position(100, 0),
164                 Size = new Size(100, 100),
165                 PointSize = 30.0f,
166                 TextColor = Color.Black,
167                 Text = "Forward",
168             };
169             forwardButton.TouchEvent += OnForwardButtonTouchEvent;
170             GetDefaultWindow().Add(forwardButton);
171
172             refreshButton = new Button()
173             {
174                 Position = new Position(200, 0),
175                 Size = new Size(100, 100),
176                 PointSize = 30.0f,
177                 TextColor = Color.Black,
178                 Text = "Refresh",
179             };
180             refreshButton.TouchEvent += OnRefreshButtonTouchEvent;
181             GetDefaultWindow().Add(refreshButton);
182
183             addressBar = new TextField()
184             {
185                 Position = new Position(300, 0),
186                 BackgroundColor = Color.White,
187                 Size = new Size(SCREEN_WIDTH - 300, ADDRESSBAR_HEIGHT),
188                 EnableGrabHandlePopup = false,
189                 EnableGrabHandle = false,
190                 EnableSelection = true,
191                 Focusable = true,
192                 PlaceholderText = "Please input url here like Www.baidu.com.",
193             };
194             addressBar.FocusGained += OnTextEditorFocusGained;
195             addressBar.FocusLost += OnTextEditorFocusLost;
196             addressBar.KeyEvent += OnAddressBarKeyEvent;
197             addressBar.TouchEvent += OnAddressBarTouchEvent;
198             GetDefaultWindow().Add(addressBar);
199
200             Log.Info("WebView", $"args count is {runtimeArgs.Length}");
201             for (int i = 0; i < runtimeArgs.Length; i++)
202             {
203                 Log.Info("WebView", $"arg {i} is {runtimeArgs[i]}");
204             }
205
206             simpleWebView = new BaseComponents.WebView(runtimeArgs)
207             {
208                 Position = new Position(0, ADDRESSBAR_HEIGHT),
209                 Size = new Size(WEBVIEW_WIDTH, WEBVIEW_HEIGHT),
210                 UserAgent = USER_AGENT,
211                 Focusable = true,
212                 VideoHoleEnabled = true,
213             };
214             simpleWebView.FocusGained += OnWebViewFocusGained;
215             simpleWebView.FocusLost += OnWebViewFocusLost;
216             simpleWebView.KeyEvent += OnWebViewKeyEvent;
217             simpleWebView.TouchEvent += OnWebViewTouchEvent;
218             simpleWebView.SslCertificateChanged += OnSslCertificateChanged;
219             //simpleWebView.HttpAuthRequested += OnHttpAuthRequested;
220             simpleWebView.PageLoadStarted += OnPageLoadStarted;
221             simpleWebView.PageLoading += OnPageLoading;
222             simpleWebView.PageLoadFinished += OnPageLoadFinished;
223             simpleWebView.PageLoadError += OnPageLoadError;
224             simpleWebView.ContextMenuShown += OnContextMenuShown;
225             simpleWebView.ContextMenuHidden += OnContextMenuHidden;
226             simpleWebView.ScrollEdgeReached += OnScrollEdgeReached;
227             simpleWebView.UrlChanged += OnUrlChanged;
228             simpleWebView.FormRepostPolicyDecided += OnFormRepostPolicyDecided;
229             //simpleWebView.FrameRendered += OnFrameRendered;
230             simpleWebView.ConsoleMessageReceived += OnConsoleMessageReceived;
231             simpleWebView.CertificateConfirmed += OnCertificateConfirmed;
232             simpleWebView.ResponsePolicyDecided += OnResponsePolicyDecided;
233             GetDefaultWindow().Add(simpleWebView);
234
235             GetDefaultWindow().KeyEvent += Instance_KeyEvent;
236             simpleWebView.LoadUrl(websites[index]);
237             //simpleWebView.LoadHtmlString("<Html><Head><title>Example</title></Head><Body><b>[This text is Bold......]</b></Body></Html>");
238             FocusManager.Instance.SetCurrentFocusView(simpleWebView);
239
240             messageTimer = new Timer(10000);
241             messageTimer.Tick += OnTick;
242         }
243
244         protected override void OnTerminate()
245         {
246             if (menuView != null)
247             {
248                 GetDefaultWindow().Remove(menuView);
249             }
250             GetDefaultWindow().Remove(backButton);
251             GetDefaultWindow().Remove(forwardButton);
252             GetDefaultWindow().Remove(refreshButton);
253             GetDefaultWindow().Remove(addressBar);
254
255             if (screenshotView != null)
256             {
257                 GetDefaultWindow().Remove(screenshotView);
258             }
259
260             messageTimer.Tick -= OnTick;
261             messageTimer.Dispose();
262             messageTimer = null;
263
264             base.OnTerminate();
265         }
266
267         private bool OnBackButtonTouchEvent(object sender, View.TouchEventArgs e)
268         {
269             if (simpleWebView.CanGoBack())
270             {
271                 simpleWebView.GoBack();
272             }
273             return false;
274         }
275
276         private bool OnForwardButtonTouchEvent(object sender, View.TouchEventArgs e)
277         {
278             if (simpleWebView.CanGoForward())
279             {
280                 simpleWebView.GoForward();
281             }
282             return false;
283         }
284
285         private bool OnRefreshButtonTouchEvent(object sender, View.TouchEventArgs e)
286         {
287             simpleWebView.Reload();
288             return false;
289         }
290
291         private bool OnTick(object sender, EventArgs e)
292         {
293             Log.Info("WebView", $"------------timer tick-------");
294
295             if (faviconView != null)
296             {
297                 GetDefaultWindow().Remove(faviconView);
298                 faviconView.Dispose();
299                 faviconView = null;
300             }
301
302             if (screenshotView != null)
303             {
304                 Log.Info("WebView", $"------------remove screen shot-------");
305                 GetDefaultWindow().Remove(screenshotView);
306                 screenshotView.Dispose();
307                 screenshotView = null;
308             }
309             else
310             {
311                 Log.Info("WebView", $"------------screen shot is null-------");
312             }
313
314             if (hitTestImageView != null)
315             {
316                 GetDefaultWindow().Remove(hitTestImageView);
317                 hitTestImageView.Dispose();
318                 hitTestImageView = null;
319             }
320
321             return false;
322         }
323
324         private bool OnWebViewTouchEvent(object source, View.TouchEventArgs args)
325         {
326             if (!simpleWebView.HasFocus())
327             {
328                 FocusManager.Instance.SetCurrentFocusView(simpleWebView);
329             }
330
331             if (args.Touch.GetState(0) == PointStateType.Down && args.Touch.GetMouseButton(0) == MouseButton.Secondary)
332             {
333                 if (menuView == null && menuPosition == null)
334                 {
335                     menuPosition = args.Touch.GetScreenPosition(0);
336                 }
337             }
338             else if (args.Touch.GetState(0) == PointStateType.Down && args.Touch.GetMouseButton(0) == MouseButton.Primary)
339             {
340                 if (menuView != null)
341                 {
342                     menuView.HideMenu();
343                     GetDefaultWindow().Remove(menuView);
344                     menuView = null;
345                     menuPosition = null;
346                 }
347             }
348             return false;
349         }
350
351         private void OnMenuViewItemSelected(object source, MenuView.ItemClickedEventArgs e)
352         {
353             Log.Info("WebView", $"------------menu item is selected-------");
354             GetDefaultWindow().Remove(menuView);
355             menuView = null;
356         }
357
358         private void OnWebViewFocusGained(object source, EventArgs args)
359         {
360             Log.Info("WebView", $"------------web view focus is gained-------");
361         }
362
363         private void OnWebViewFocusLost(object source, EventArgs args)
364         {
365             Log.Info("WebView", $"------------web view focus is lost-------");
366         }
367
368         private void OnHttpAuthRequested(object sender, WebViewHttpAuthRequestedEventArgs e)
369         {
370             Log.Info("WebView", $"------------http auth requested, Realm: {e.HttpAuthHandler.Realm}-------");
371             e.HttpAuthHandler.CancelCredential();
372             e.HttpAuthHandler.Suspend();
373             e.HttpAuthHandler.UseCredential("", "");
374         }
375
376         private void OnHttpRequestIntercepted(WebHttpRequestInterceptor interceptor)
377         {
378             Log.Info("WebView", $"------------http request intercepted, Url: {interceptor.Url}-------");
379
380             interceptor.Ignore();
381
382             Log.Info("WebView", $"------------http request intercepted-------");
383         }
384
385         private void OnSslCertificateChanged(object sender, WebViewCertificateReceivedEventArgs e)
386         {
387             Log.Info("WebView", $"------------ssl certificate changed, IsFromMainFrame: {e.Certificate.IsFromMainFrame}-------");
388             Log.Info("WebView", $"------------ssl certificate changed, PemData: {e.Certificate.PemData}-------");
389             Log.Info("WebView", $"------------ssl certificate changed, PemData: {e.Certificate.IsContextSecure}-------");
390         }
391
392         private void OnPageLoadStarted(object sender, WebViewPageLoadEventArgs e)
393         {
394             Log.Info("WebView", $"------------web view start to load time: {DateTime.Now.Ticks - startTime}-------");
395         }
396
397         private void OnPageLoading(object sender, WebViewPageLoadEventArgs e)
398         {
399             Log.Info("WebView", $"------------web view is loading-------");
400         }
401
402         private void OnPageLoadFinished(object sender, WebViewPageLoadEventArgs e)
403         {
404             Log.Info("WebView", $"------------web view finishes loading-------");
405
406             if (simpleWebView.CanGoBack())
407             {
408                 backButton.IsEnabled = true;
409             }
410             else
411             {
412                 backButton.IsEnabled = false;
413             }
414
415             if (simpleWebView.CanGoForward())
416             {
417                 forwardButton.IsEnabled = true;
418             }
419             else
420             {
421                 forwardButton.IsEnabled = false;
422             }
423         }
424
425         private void OnPageLoadError(object sender, WebViewPageLoadErrorEventArgs e)
426         {
427             Log.Info("WebView", $"------------web view load error, Url: {e.PageLoadError.Url}-------");
428             Log.Info("WebView", $"------------web view load error, Code: {e.PageLoadError.Code}-------");
429             Log.Info("WebView", $"------------web view load error, Description: {e.PageLoadError.Description}-------");
430             Log.Info("WebView", $"------------web view load error, Type: {e.PageLoadError.Type}-------");
431         }
432
433         private void OnScrollEdgeReached(object sender, WebViewScrollEdgeReachedEventArgs e)
434         {
435             Log.Info("WebView", $"------------scroll edge reached, ScrollEdge: {e.ScrollEdge}-------");
436         }
437
438         private void OnUrlChanged(object sender, WebViewUrlChangedEventArgs e)
439         {
440             Log.Info("WebView", $"------------url changed, NewPageUrl: {e.NewPageUrl}-------");
441         }
442
443         private void OnFormRepostPolicyDecided(object sender, WebViewFormRepostPolicyDecidedEventArgs e)
444         {
445             Log.Info("WebView", $"------------form repost policy decided-------");
446             e.FormRepostPolicyDecisionMaker.Reply(true);
447         }
448
449         private void OnFrameRendered(object sender, EventArgs e)
450         {
451             Log.Info("WebView", $"------------frame rendered-------");
452         }
453
454         private void OnContextMenuShown(object sender, WebViewContextMenuShownEventArgs e)
455         {
456             Log.Info("WebView", $"------------context menu is shown, -------");
457
458             if (menuPosition != null)
459             {
460                 menuView = new MenuView(e.ContextMenu)
461                 {
462                     BackgroundColor = Color.Cyan,
463                     Position = new Position(menuPosition),
464                     Size = new Size(200, e.ContextMenu.ItemCount * 80),
465                 };
466                 menuView.ClickedEvent += OnMenuViewItemSelected;
467                 GetDefaultWindow().Add(menuView);
468             }
469
470             Log.Info("WebView", $"------------context menu shown, ItemList ItemCount: {e.ContextMenu.ItemCount}-------");
471             if (e.ContextMenu.ItemCount > 0)
472             {
473                 WebContextMenuItem item = e.ContextMenu.GetItemAtIndex(0);
474                 Log.Info("WebView", $"------------context menu shown, Item Tag: {item.Tag}-------");
475                 Log.Info("WebView", $"------------context menu shown, Item Type: {item.Type}-------");
476                 Log.Info("WebView", $"------------context menu shown, Item IsEnabled: {item.IsEnabled}-------");
477                 Log.Info("WebView", $"------------context menu shown, Item LinkUrl: {item.LinkUrl}-------");
478                 Log.Info("WebView", $"------------context menu shown, Item ImageUrl: {item.ImageUrl}-------");
479                 Log.Info("WebView", $"------------context menu shown, Item Title: {item.Title}-------");
480                 if (item.ParentMenu != null)
481                 {
482                     Log.Info("WebView", $"------------context menu shown, ParentMenu item count: {item.ParentMenu.ItemCount}-------");
483                 }
484             }
485             Log.Info("WebView", $"------------context menu shown, ItemCount: {e.ContextMenu.ItemCount}-------");
486             //Log.Info("WebView", $"------------context menu shown, Position: {e.ContextMenu.Position}-------");
487             e.ContextMenu.AppendItem(WebContextMenuItem.ItemTag.NoAction, "test1", true);
488             e.ContextMenu.AppendItem(WebContextMenuItem.ItemTag.NoAction, "test2", "", true);
489             //e.ContextMenu.Hide();
490             if (e.ContextMenu.ItemCount > 0)
491             {
492                 //WebContextMenuItem item = e.ContextMenu.GetItemAtIndex(0);
493                 //e.ContextMenu.SelectItem(item);
494                 //e.ContextMenu.RemoveItem(item);
495             }
496         }
497
498         private void OnContextMenuHidden(object sender, WebViewContextMenuHiddenEventArgs e)
499         {
500             Log.Info("WebView", $"------------context menu is hidden, -------");
501         }
502
503         private void OnConsoleMessageReceived(object sender, WebViewConsoleMessageReceivedEventArgs e)
504         {
505             Log.Info("WebView", $"------------console message received, Source: {e.ConsoleMessage.Source}-------");
506             Log.Info("WebView", $"------------console message received, Line: {e.ConsoleMessage.Line}-------");
507             Log.Info("WebView", $"------------console message received, Level: {e.ConsoleMessage.Level}-------");
508             Log.Info("WebView", $"------------console message received, Text: {e.ConsoleMessage.Text}-------");
509         }
510
511         private void OnCertificateConfirmed(object sender, WebViewCertificateReceivedEventArgs e)
512         {
513             Log.Info("WebView", $"------------ssl certificate confirmed, IsFromMainFrame: {e.Certificate.IsFromMainFrame}-------");
514             Log.Info("WebView", $"------------ssl certificate confirmed, PemData: {e.Certificate.PemData}-------");
515             Log.Info("WebView", $"------------ssl certificate confirmed, PemData: {e.Certificate.IsContextSecure}-------");
516             e.Certificate.Allow(true);
517         }
518
519         private void OnResponsePolicyDecided(object sender, WebViewResponsePolicyDecidedEventArgs e)
520         {
521             Log.Info("WebView", $"------------response policy decided, Url: {e.ResponsePolicyDecisionMaker.Url}-------");
522             Log.Info("WebView", $"------------response policy decided, Cookie: {e.ResponsePolicyDecisionMaker.Cookie}-------");
523             Log.Info("WebView", $"------------response policy decided, PolicyDecisionType: {e.ResponsePolicyDecisionMaker.PolicyDecisionType}-------");
524             Log.Info("WebView", $"------------response policy decided, ResponseMime: {e.ResponsePolicyDecisionMaker.ResponseMime}-------");
525             Log.Info("WebView", $"------------response policy decided, ResponseStatusCode: {e.ResponsePolicyDecisionMaker.ResponseStatusCode}-------");
526             Log.Info("WebView", $"------------response policy decided, DecisionNavigationType: {e.ResponsePolicyDecisionMaker.DecisionNavigationType}-------");
527             Log.Info("WebView", $"------------response policy decided, Scheme: {e.ResponsePolicyDecisionMaker.Scheme}-------");
528             if (e.ResponsePolicyDecisionMaker.Frame != null)
529             {
530                 Log.Info("WebView", $"------------response policy decided, Frame.IsMainFrame: {e.ResponsePolicyDecisionMaker.Frame.IsMainFrame}-------");
531             }
532             //e.ResponsePolicyDecisionMaker.Ignore();
533             //e.ResponsePolicyDecisionMaker.Suspend();
534             //e.ResponsePolicyDecisionMaker.Use();
535         }
536
537         private void OnJavaScriptMessageReceived(string message)
538         {
539             Log.Info("WebView", $"------------javascript message handler, message: {message}-------");
540         }
541
542         private void OnVideoPlaying(bool isPlaying)
543         {
544             Log.Info("WebView", $"------------video playing, isPlaying: {isPlaying}-------");
545         }
546
547         private void OnScreenshotAcquired(ImageView image)
548         {
549             Log.Info("WebView", $"------------screen shot acquired-------");
550
551             if (image != null)
552             {
553                 screenshotView = image;
554                 screenshotView.Position = new Position(500, 500);
555                 screenshotView.BackgroundColor = Color.Blue;
556                 GetDefaultWindow().Add(screenshotView);
557                 if (messageTimer.IsRunning())
558                 {
559                     messageTimer.Stop();
560                 }
561                 messageTimer.Start();
562                 Log.Info("WebView", $"------------screen shot would be shown-------");
563             }
564         }
565
566         private void OnHitTestFinished(WebHitTestResult test)
567         {
568             Log.Info("WebView", $"------------hit test finished-------");
569             Log.Info("WebView", $"WebHitTestResult, TestResultContext: {test.TestResultContext}");
570             Log.Info("WebView", $"WebHitTestResult, LinkUrl: {test.LinkUrl}");
571             Log.Info("WebView", $"WebHitTestResult, LinkTitle: {test.LinkTitle}");
572             Log.Info("WebView", $"WebHitTestResult, LinkLabel: {test.LinkLabel}");
573             Log.Info("WebView", $"WebHitTestResult, ImageUrl: {test.ImageUrl}");
574             Log.Info("WebView", $"WebHitTestResult, MediaUrl: {test.MediaUrl}");
575             Log.Info("WebView", $"WebHitTestResult, TagName: {test.TagName}");
576             Log.Info("WebView", $"WebHitTestResult, NodeValue: {test.NodeValue}");
577             if (test.Attributes != null)
578             {
579                 Log.Info("WebView", $"WebHitTestResult, Attributes: {test.Attributes}");
580             }
581             Log.Info("WebView", $"WebHitTestResult, ImageFileNameExtension: {test.ImageFileNameExtension}");
582             ImageView imageView = test.Image;
583             if (imageView != null)
584             {
585                 hitTestImageView = imageView;
586                 hitTestImageView.Position = new Position(1000, 500);
587                 hitTestImageView.BackgroundColor = Color.Blue;
588                 GetDefaultWindow().Add(hitTestImageView);
589                 if (messageTimer.IsRunning())
590                 {
591                     messageTimer.Stop();
592                 }
593                 messageTimer.Start();
594                 Log.Info("WebView", $"WebHitTestResult, Got image view");
595             }
596         }
597
598         private void OnJavaScriptAlert(string message)
599         {
600             Log.Info("WebView", $"------------javascript alert {message}-------");
601             simpleWebView.JavaScriptAlertReply();
602         }
603
604         private void OnGeolocationPermission(string host, string protocol)
605         {
606             Log.Info("WebView", $"------------geolocation permission, host: {host}, protocol: {protocol}-------");
607         }
608
609         private void OnJavaScriptConfirm(string message)
610         {
611             Log.Info("WebView", $"------------javascript confirm {message}-------");
612             simpleWebView.JavaScriptConfirmReply(true);
613         }
614
615         private void OnJavaScriptPrompt(string message1, string message2)
616         {
617             Log.Info("WebView", $"------------javascript prompt {message1}, {message2}-------");
618             simpleWebView.JavaScriptPromptReply("test");
619         }
620
621         private void OnPasswordDataListAcquired(IList<WebPasswordData> list)
622         {
623             Log.Info("WebView", $"------------password data list, count: {list.Count}-------");
624             string[] passwords = new string[list.Count];
625             for (int i = 0; i < list.Count; i++)
626             {
627                 WebPasswordData data = list[i];
628                 passwords[i] = data.Url;
629                 Log.Info("WebView", $"------------password data, Url: {data.Url}-------");
630                 Log.Info("WebView", $"------------password data, FingerprintUsed: {data.FingerprintUsed}-------");
631             }
632
633             if (list.Count > 0)
634             {
635                 simpleWebView.Context.DeleteFormPasswordDataList(passwords);
636             }
637         }
638
639         private void OnSecurityOriginListAcquired(IList<WebSecurityOrigin> list)
640         {
641             Log.Info("WebView", $"------------security origin, count: {list.Count}-------");
642             for (int i = 0; i < list.Count; i++)
643             {
644                 WebSecurityOrigin origin = list[i];
645                 Log.Info("WebView", $"------------security origin, Host: {origin.Host}-------");
646                 Log.Info("WebView", $"------------security origin, Protocol: {origin.Protocol}-------");
647             }
648
649             if (list.Count > 0)
650             {
651                 WebSecurityOrigin origin = list[0];
652                 simpleWebView.Context.GetWebStorageUsageForOrigin(origin, OnStorageUsageAcquired);
653                 simpleWebView.Context.DeleteApplicationCache(origin);
654                 simpleWebView.Context.DeleteWebDatabase(origin);
655                 simpleWebView.Context.DeleteWebStorage(origin);
656             }
657         }
658
659         private void OnStorageUsageAcquired(ulong usage)
660         {
661             Log.Info("WebView", $"------------storage usage acquired, usage: {usage}-------");
662         }
663
664         private void OnDownloadStarted(string url)
665         {
666             Log.Info("WebView", $"------------download started, url: {url}-------");
667         }
668
669         private bool OnMimeOverridden(string url, string currentMime, out string newMime)
670         {
671             Log.Info("WebView", $"------------mime overridden, url: {url}-------");
672             Log.Info("WebView", $"------------mime overridden, currentMime: {currentMime}-------");
673             newMime = "test";
674             return true;
675         }
676
677         private void OnCookieChanged(object sender, EventArgs e)
678         {
679             Log.Info("WebView", $"------------cookie changed-------");
680         }
681
682         private bool OnWebViewKeyEvent(object source, View.KeyEventArgs args)
683         {
684             bool result = false;
685
686             Log.Info("WebView", $"----web view key is {args.Key.KeyPressedName}, state is {args.Key.State}-------");
687
688             if (args.Key.State == Key.StateType.Up)
689             {
690                 if (args.Key.KeyPressedName == "XF86RaiseChannel")
691                 {
692                     Log.Info("WebView", $"old url is {simpleWebView.Url}.");
693                     if (index != 0)
694                     {
695                         simpleWebView.Url = websites[--index].ToLowerInvariant();
696                     }
697                     else
698                     {
699                         simpleWebView.Url = websites[WEBSITES_COUNT - 1].ToLowerInvariant();
700                     }
701                     result = true;
702                     Log.Info("WebView", $"new url is {simpleWebView.Url}.");
703                 }
704                 else if (args.Key.KeyPressedName == "XF86LowerChannel")
705                 {
706                     Log.Info("WebView", $"old url is {simpleWebView.Url}.");
707                     if (index != WEBSITES_COUNT - 1)
708                     {
709                         simpleWebView.Url = websites[++index].ToLowerInvariant();
710                     }
711                     else
712                     {
713                         simpleWebView.Url = websites[0].ToLowerInvariant();
714                     }
715                     result = true;
716                     Log.Info("WebView", $"new url is {simpleWebView.Url}.");
717                 }
718                 //else if (args.Key.KeyPressedName == "1")
719                 //{
720                 //    Rectangle viewArea = new Rectangle(0, 0, 20, 20);
721                 //    bool succeeded = simpleWebView.GetScreenshotAsynchronously(viewArea, 1.0f, OnScreenshotAcquired);
722                 //    Log.Info("WebView", $"GetScreenshotAsynchronously, {succeeded}");
723
724                 //    succeeded = simpleWebView.HitTestAsynchronously(100, 100, BaseComponents.WebView.HitTestMode.Default, OnHitTestFinished);
725                 //    Log.Info("WebView", $"HitTestAsynchronously, {succeeded}");
726                 //}
727                 else if (args.Key.KeyPressedName == "XF86Red")
728                 {
729                     if (redKeyPressedCount % 2 == 0)
730                     {
731                         simpleWebView.Context.RegisterHttpRequestInterceptedCallback(OnHttpRequestIntercepted);
732                         redKeyPressedCount = 0;
733                     }
734                     else
735                     {
736                         simpleWebView.Context.RegisterHttpRequestInterceptedCallback(null);
737                     }
738                     redKeyPressedCount++;
739                     FocusManager.Instance.SetCurrentFocusView(addressBar);
740                     result = true;
741                 }
742                 else if (args.Key.KeyPressedName == "XF86Blue")
743                 {
744                     blueKeyPressedCount++;
745                     if (blueKeyPressedCount % 6 == 0)
746                     {
747                         simpleWebView.Position = new Position(0, ADDRESSBAR_HEIGHT);
748                         simpleWebView.Orientation = new Rotation(new Radian(new Degree(60 * blueKeyPressedCount)), Vector3.ZAxis);
749                         blueKeyPressedCount = 0;
750                     }
751                     else
752                     {
753                         simpleWebView.Orientation = new Rotation(new Radian(new Degree(60 * blueKeyPressedCount)), Vector3.ZAxis);
754                     }
755                     result = true;
756                 }
757                 else if (args.Key.KeyPressedName == "XF86Yellow")
758                 {
759                     yellowKeyPressedCount++;
760                     int wdistance = (SCREEN_WIDTH - MIN_WEBVIEW_WIDTH) / 5;
761                     int hdistance = (SCREEN_HEIGHT - MIN_WEBVIEW_HEIGHT - ADDRESSBAR_HEIGHT) / 5;
762                     simpleWebView.Position = new Position((SCREEN_WIDTH - MIN_WEBVIEW_WIDTH - yellowKeyPressedCount * wdistance) / 2, ADDRESSBAR_HEIGHT);
763                     simpleWebView.Size = new Size(MIN_WEBVIEW_WIDTH + yellowKeyPressedCount * wdistance, MIN_WEBVIEW_HEIGHT + hdistance * yellowKeyPressedCount);
764                     if (yellowKeyPressedCount % 5 == 0)
765                     {
766                         yellowKeyPressedCount = 0;
767                     }
768                     result = true;
769                 }
770                 else if (args.Key.KeyPressedName == "XF86Green")
771                 {
772                     Log.Info("WebView", $"key XF86Green is pressed.");
773
774                     //greenKeyPressedCount++;
775                     if (simpleWebView.Url.Contains("account.samsung"))
776                     {
777                         // webview apis
778                         Log.Info("WebView", $"web page title is {simpleWebView.Title}");
779
780                         //faviconView = simpleWebView.Favicon;
781                         //if (faviconView != null)
782                         //{
783                         //    faviconView.Position = new Position(500, 100);
784                         //    GetDefaultWindow().Add(faviconView);
785                         //    messageTimer.Start();
786                         //}
787
788                         simpleWebView.ContentBackgroundColor = new Color(1.0f, 0.0f, 0.0f, 1.0f);
789                         Log.Info("WebView", $"web page ContentBackgroundColor is {simpleWebView.ContentBackgroundColor}");
790                         simpleWebView.TilesClearedWhenHidden = true;
791                         Log.Info("WebView", $"web page TilesClearedWhenHidden is {simpleWebView.TilesClearedWhenHidden}");
792                         simpleWebView.TileCoverAreaMultiplier = 2.0f;
793                         Log.Info("WebView", $"web page TileCoverAreaMultiplier is {simpleWebView.TileCoverAreaMultiplier}");
794                         simpleWebView.CursorEnabledByClient = true;
795                         Log.Info("WebView", $"web page CursorEnabledByClient is {simpleWebView.CursorEnabledByClient}");
796                         Log.Info("WebView", $"web page SelectedText is {simpleWebView.SelectedText}");
797                         simpleWebView.PageZoomFactor = 2.0f;
798                         Log.Info("WebView", $"web page PageZoomFactor is {simpleWebView.PageZoomFactor}");
799                         simpleWebView.TextZoomFactor = 2.0f;
800                         Log.Info("WebView", $"web page TextZoomFactor is {simpleWebView.TextZoomFactor}");
801                         Log.Info("WebView", $"web page LoadProgressPercentage is {simpleWebView.LoadProgressPercentage}");
802
803                         //simpleWebView.ActivateAccessibility(true);
804                         //simpleWebView.AddCustomHeader("test", "value");
805                         //simpleWebView.AddDynamicCertificatePath("", "");
806                         simpleWebView.AddJavaScriptMessageHandler("", OnJavaScriptMessageReceived);
807                         simpleWebView.CheckVideoPlayingAsynchronously(OnVideoPlaying);
808                         //simpleWebView.ClearAllTilesResources();
809                         //simpleWebView.ClearHistory();
810                         simpleWebView.EvaluateJavaScript("document.body.style.backgroundColor='yellow';");
811                         Log.Info("WebView", $"web view, ScaleFactor is {simpleWebView.GetScaleFactor()}");
812
813                         //Rectangle viewArea = new Rectangle(0, 0, 20, 20);
814                         //ImageView shotView = simpleWebView.GetScreenshot(viewArea, 1.0f);
815                         //if (shotView != null)
816                         //{
817                         //    shotView.Position = new Position(500, 200);
818                         //    GetDefaultWindow().Add(shotView);
819                         //}
820
821                         simpleWebView.HighlightText("test", BaseComponents.WebView.FindOption.CaseInsensitive, 2);
822                         Log.Info("WebView", $"web view, here");
823                         WebHitTestResult test = null;//simpleWebView.HitTest(100, 100, WebView.HitTestMode.Default);
824                         if (test != null)
825                         {
826                             Log.Info("WebView", $"WebHitTestResult, TestResultContext: {test.TestResultContext}");
827                             Log.Info("WebView", $"WebHitTestResult, LinkUrl: {test.LinkUrl}");
828                             Log.Info("WebView", $"WebHitTestResult, LinkTitle: {test.LinkTitle}");
829                             Log.Info("WebView", $"WebHitTestResult, LinkLabel: {test.LinkLabel}");
830                             Log.Info("WebView", $"WebHitTestResult, ImageUrl: {test.ImageUrl}");
831                             Log.Info("WebView", $"WebHitTestResult, MediaUrl: {test.MediaUrl}");
832                             Log.Info("WebView", $"WebHitTestResult, TagName: {test.TagName}");
833                             Log.Info("WebView", $"WebHitTestResult, NodeValue: {test.NodeValue}");
834                             if (test.Attributes != null)
835                             {
836                                 Log.Info("WebView", $"WebHitTestResult, Attributes: {test.Attributes}");
837                             }
838                             Log.Info("WebView", $"WebHitTestResult, NodeValue: {test.ImageFileNameExtension}");
839                             ImageView imageView = test.Image;
840                             if (imageView != null)
841                             {
842                                 imageView.Position = new Position(500, 500);
843                                 GetDefaultWindow().Add(imageView);
844                             }
845                         }
846
847                         simpleWebView.RegisterGeolocationPermissionCallback(OnGeolocationPermission);
848                         Log.Info("WebView", $"Register javascript alert/confirm/prompt callback.");
849                         simpleWebView.RegisterJavaScriptAlertCallback(OnJavaScriptAlert);
850                         simpleWebView.RegisterJavaScriptConfirmCallback(OnJavaScriptConfirm);
851                         simpleWebView.RegisterJavaScriptPromptCallback(OnJavaScriptPrompt);
852                         //Log.Info("WebView", $"Reload without cache.");
853                         //simpleWebView.ReloadWithoutCache();
854                         //Log.Info("WebView", $"Remove custom header");
855                         //simpleWebView.RemoveCustomHeader("test");
856                         //Log.Info("WebView", $"Suspend");
857                         //simpleWebView.Suspend();
858                         //simpleWebView.SuspendNetworkLoading();
859                         //Log.Info("WebView", $"Resume");
860                         //simpleWebView.Resume();
861                         //simpleWebView.ResumeNetworkLoading();
862                         //Log.Info("WebView", $"load contents");
863                         //simpleWebView.LoadContents();
864                         //simpleWebView.LoadHtmlStringOverrideCurrentEntry();
865                         //simpleWebView.LoadHtmlString("<Html><Head><title>Example</title></Head><Body><b>[This text is Bold......]</b></Body></Html>");
866                         //simpleWebView.ScrollPosition = new Position(0, 200);
867                         //simpleWebView.ScrollBy(0, 50);
868                         //simpleWebView.ScrollEdgeBy(0, 50);
869
870                         //Log.Info("WebView", $"scroll position is ({simpleWebView.ScrollPosition.X}, {simpleWebView.ScrollPosition.Y}).");
871                         //Log.Info("WebView", $"scroll size is ({simpleWebView.ScrollSize.Width}, {simpleWebView.ScrollSize.Height}).");
872                         //Log.Info("WebView", $"content size is ({simpleWebView.ContentSize.Width}, {simpleWebView.ContentSize.Height}).");
873
874                         //simpleWebView.StartInspectorServer(8080);
875                         //simpleWebView.StopInspectorServer();
876                         //simpleWebView.StopLoading();
877
878                         // websettings apis
879                         simpleWebView.Settings.LinkMagnifierEnabled = true;
880                         Log.Info("WebView", $"web settings LinkMagnifierEnabled is {simpleWebView.Settings.LinkMagnifierEnabled}");
881                         simpleWebView.Settings.ViewportMetaTag = true;
882                         Log.Info("WebView", $"web settings ViewportMetaTag is {simpleWebView.Settings.ViewportMetaTag}");
883                         simpleWebView.Settings.DefaultTextEncodingName = "utf-8";
884                         Log.Info("WebView", $"web settings DefaultTextEncodingName is {simpleWebView.Settings.DefaultTextEncodingName}");
885                         simpleWebView.Settings.AutomaticImageLoadingAllowed = true;
886                         Log.Info("WebView", $"web settings AutomaticImageLoadingAllowed is {simpleWebView.Settings.AutomaticImageLoadingAllowed}");
887                         simpleWebView.Settings.ScriptsOpenWindowsAllowed = true;
888                         Log.Info("WebView", $"web settings ScriptsOpenWindowsAllowed is {simpleWebView.Settings.ScriptsOpenWindowsAllowed}");
889                         simpleWebView.Settings.ImePanelEnabled = true;
890                         Log.Info("WebView", $"web settings ImePanelEnabled is {simpleWebView.Settings.ImePanelEnabled}");
891                         simpleWebView.Settings.ClipboardEnabled = true;
892                         Log.Info("WebView", $"web settings ClipboardEnabled is {simpleWebView.Settings.ClipboardEnabled}");
893                         simpleWebView.Settings.ArrowScrollEnabled = true;
894                         Log.Info("WebView", $"web settings ArrowScrollEnabled is {simpleWebView.Settings.ArrowScrollEnabled}");
895                         simpleWebView.Settings.TextAutosizingEnabled = true;
896                         Log.Info("WebView", $"web settings TextAutosizingEnabled is {simpleWebView.Settings.TextAutosizingEnabled}");
897                         simpleWebView.Settings.TextSelectionEnabled = true;
898                         Log.Info("WebView", $"web settings TextSelectionEnabled is {simpleWebView.Settings.TextSelectionEnabled}");
899                         simpleWebView.Settings.FormCandidateDataEnabled = true;
900                         Log.Info("WebView", $"web settings FormCandidateDataEnabled is {simpleWebView.Settings.FormCandidateDataEnabled}");
901                         simpleWebView.Settings.AutofillPasswordFormEnabled = true;
902                         Log.Info("WebView", $"web settings AutofillPasswordFormEnabled is {simpleWebView.Settings.AutofillPasswordFormEnabled}");
903                         simpleWebView.Settings.KeypadWithoutUserActionUsed = true;
904                         Log.Info("WebView", $"web settings KeypadWithoutUserActionUsed is {simpleWebView.Settings.KeypadWithoutUserActionUsed}");
905                         simpleWebView.Settings.ZoomForced = true;
906                         Log.Info("WebView", $"web settings ZoomForced is {simpleWebView.Settings.ZoomForced}");
907                         simpleWebView.Settings.TextZoomEnabled = true;
908                         Log.Info("WebView", $"web settings TextZoomEnabled is {simpleWebView.Settings.TextZoomEnabled}");
909                         simpleWebView.Settings.PluginsEnabled = true;
910                         Log.Info("WebView", $"web settings PluginsEnabled is {simpleWebView.Settings.PluginsEnabled}");
911                         simpleWebView.Settings.AutoFittingEnabled = true;
912                         Log.Info("WebView", $"web settings AutoFittingEnabled is {simpleWebView.Settings.AutoFittingEnabled}");
913                         simpleWebView.Settings.JavaScriptEnabled = true;
914                         Log.Info("WebView", $"web settings JavaScriptEnabled is {simpleWebView.Settings.JavaScriptEnabled}");
915                         simpleWebView.Settings.FileAccessFromExternalUrlAllowed = true;
916                         Log.Info("WebView", $"web settings FileAccessFromExternalUrlAllowed is {simpleWebView.Settings.FileAccessFromExternalUrlAllowed}");
917                         simpleWebView.Settings.ScrollbarThumbFocusNotificationsUsed = true;
918                         Log.Info("WebView", $"web settings ScrollbarThumbFocusNotificationsUsed is {simpleWebView.Settings.ScrollbarThumbFocusNotificationsUsed}");
919                         simpleWebView.Settings.DoNotTrackEnabled = true;
920                         Log.Info("WebView", $"web settings DoNotTrackEnabled is {simpleWebView.Settings.DoNotTrackEnabled}");
921                         simpleWebView.Settings.CacheBuilderEnabled = true;
922                         Log.Info("WebView", $"web settings CacheBuilderEnabled is {simpleWebView.Settings.CacheBuilderEnabled}");
923                         simpleWebView.Settings.WebSecurityEnabled = true;
924                         Log.Info("WebView", $"web settings WebSecurityEnabled is {simpleWebView.Settings.WebSecurityEnabled}");
925                         simpleWebView.Settings.DefaultFontSize = 20;
926                         Log.Info("WebView", $"web settings DefaultFontSize is {simpleWebView.Settings.DefaultFontSize}");
927                         simpleWebView.Settings.SpatialNavigationEnabled = true;
928                         Log.Info("WebView", $"web settings SpatialNavigationEnabled is {simpleWebView.Settings.SpatialNavigationEnabled}");
929                         simpleWebView.Settings.MixedContentsAllowed = true;
930                         Log.Info("WebView", $"web settings MixedContentsAllowed is {simpleWebView.Settings.MixedContentsAllowed}");
931                         simpleWebView.Settings.PrivateBrowsingEnabled = true;
932                         Log.Info("WebView", $"web settings PrivateBrowsingEnabled is {simpleWebView.Settings.PrivateBrowsingEnabled}");
933                         simpleWebView.Settings.EnableExtraFeature("feature", true);
934                         Log.Info("WebView", $"web settings EnableExtraFeature is {simpleWebView.Settings.IsExtraFeatureEnabled("feature")}");
935
936                         // webcontext apis
937                         simpleWebView.Context.AppType = WebContext.ApplicationType.WebBrowser;
938                         Log.Info("WebView", $"web context, AppType: {simpleWebView.Context.AppType}");
939                         simpleWebView.Context.AppVersion = "6.5";
940                         Log.Info("WebView", $"web context, AppVersion: {simpleWebView.Context.AppVersion}");
941                         simpleWebView.Context.AppId = "1.0id";
942                         Log.Info("WebView", $"web context, AppId: {simpleWebView.Context.AppId}");
943                         simpleWebView.Context.CacheEnabled = false;
944                         Log.Info("WebView", $"web context, CacheEnabled: {simpleWebView.Context.CacheEnabled}");
945                         simpleWebView.Context.CertificateFilePath = "/root/share";
946                         Log.Info("WebView", $"web context, CertificateFilePath: {simpleWebView.Context.CertificateFilePath}");
947                         simpleWebView.Context.ProxyUrl = "https://127.0.0.1";
948                         Log.Info("WebView", $"web context, ProxyUrl: {simpleWebView.Context.ProxyUrl}");
949                         simpleWebView.Context.CacheModel = WebContext.CacheModelType.DocumentBrowser;
950                         Log.Info("WebView", $"web context, cache model is {simpleWebView.Context.CacheModel}");
951                         Log.Info("WebView", $"web context, ProxyBypassRule: {simpleWebView.Context.ProxyBypassRule}");
952                         simpleWebView.Context.DefaultZoomFactor = 2.0f;
953                         Log.Info("WebView", $"web context, DefaultZoomFactor: {simpleWebView.Context.DefaultZoomFactor}");
954                         //simpleWebView.Context.ClearCache();
955                         //simpleWebView.Context.DeleteAllApplicationCache();
956                         //simpleWebView.Context.DeleteAllFormCandidateData();
957                         //simpleWebView.Context.DeleteAllFormPasswordData();
958                         //simpleWebView.Context.DeleteAllWebDatabase();
959                         //simpleWebView.Context.DeleteAllWebIndexedDatabase();
960                         //simpleWebView.Context.DeleteAllWebStorage();
961                         //simpleWebView.Context.DeleteLocalFileSystem();
962                         //simpleWebView.Context.FreeUnusedMemory();
963                         Log.Info("WebView", $"web view, here");
964                         simpleWebView.Context.GetFormPasswordList(OnPasswordDataListAcquired);
965                         Log.Info("WebView", $"web view, here");
966                         simpleWebView.Context.GetWebDatabaseOrigins(OnSecurityOriginListAcquired);
967                         Log.Info("WebView", $"web view, here");
968                         simpleWebView.Context.GetWebStorageOrigins(OnSecurityOriginListAcquired);
969                         Log.Info("WebView", $"web view, here");
970                         simpleWebView.Context.RegisterDownloadStartedCallback(OnDownloadStarted);
971                         Log.Info("WebView", $"web view, here");
972                         string[] mimes = { "txt" };
973                         simpleWebView.Context.RegisterJsPluginMimeTypes(mimes);
974                         Log.Info("WebView", $"web view, here");
975                         simpleWebView.Context.RegisterMimeOverriddenCallback(OnMimeOverridden);
976                         Log.Info("WebView", $"web view, here");
977                         string[] schemes = { "test" };
978                         simpleWebView.Context.RegisterUrlSchemesAsCorsEnabled(schemes);
979                         Log.Info("WebView", $"web view, here");
980                         simpleWebView.Context.SetProxyBypassRule("test", "");
981                         Log.Info("WebView", $"web context, ContextProxy: {simpleWebView.Context.ProxyUrl}");
982                         simpleWebView.Context.TimeOffset = 8.0f;
983                         Log.Info("WebView", $"web context, TimeOffset: {simpleWebView.Context.TimeOffset}");
984                         simpleWebView.Context.SetTimeZoneOffset(2.0f, 3.0f);
985                         simpleWebView.Context.SetDefaultProxyAuth("user", "password");
986
987                         // webcookiemanager apis
988                         simpleWebView.CookieManager.CookieAcceptPolicy = WebCookieManager.CookieAcceptPolicyType.Never;
989                         Log.Info("WebView", $"web cookie manager accept policy is {simpleWebView.CookieManager.CookieAcceptPolicy}");
990                         //simpleWebView.CookieManager.ClearCookies();
991                         simpleWebView.CookieManager.SetPersistentStorage("/root/share", WebCookieManager.CookiePersistentStorageType.SqlLite);
992                         simpleWebView.CookieManager.CookieChanged += OnCookieChanged;
993
994                         // webbackforwardlist apis
995                         Log.Info("WebView", $"web back forward list item count is {simpleWebView.BackForwardList.ItemCount}");
996                         WebBackForwardListItem item = simpleWebView.BackForwardList.GetCurrentItem();
997                         Log.Info("WebView", $"web back forward list, current item url is {item.Url}");
998                         Log.Info("WebView", $"web back forward list, current item title is {item.Title}");
999                         Log.Info("WebView", $"web back forward list, current item original url is {item.OriginalUrl}");
1000                         if (simpleWebView.BackForwardList.ItemCount > 0)
1001                         {
1002                             item = simpleWebView.BackForwardList.GetItemAtIndex(0);
1003                             Log.Info("WebView", $"web back forward list, item0 url is {item.Url}");
1004                             Log.Info("WebView", $"web back forward list, item0 title is {item.Title}");
1005                             Log.Info("WebView", $"web back forward list, item0 original url is {item.OriginalUrl}");
1006                             IList<WebBackForwardListItem> subList = simpleWebView.BackForwardList.GetForwardItems(0);
1007                             Log.Info("WebView", $"web back forward list, forward sub list ItemCount is {subList.Count}");
1008                             subList = simpleWebView.BackForwardList.GetBackwardItems(0);
1009                             Log.Info("WebView", $"web back forward list, backward sub list  ItemCount is {subList.Count}");
1010                         }
1011
1012                         //
1013                         result = true;
1014                     }
1015                 }
1016             }
1017
1018             return result;
1019         }
1020
1021         private bool OnAddressBarTouchEvent(object source, View.TouchEventArgs args)
1022         {
1023             FocusManager.Instance.SetCurrentFocusView(addressBar);
1024             return false;
1025         }
1026
1027         private void OnTextEditorFocusGained(object source, EventArgs args)
1028         {
1029             Log.Info("WebView", $"------------address bar focus is gained-------");
1030
1031             addressBar.Text = "";
1032
1033             addressBar.GetInputMethodContext().Activate();
1034             addressBar.GetInputMethodContext().ShowInputPanel();
1035         }
1036
1037         private void OnTextEditorFocusLost(object source, EventArgs args)
1038         {
1039             Log.Info("WebView", $"------------address bar focus lost-------");
1040         }
1041
1042         private bool OnAddressBarKeyEvent(object source, View.KeyEventArgs args)
1043         {
1044             Log.Info("WebView", $"------------address bar key is {args.Key.KeyPressedName}-------");
1045
1046             if (args.Key.State == Key.StateType.Up)
1047             {
1048                 if (args.Key.KeyPressedName == "Select")
1049                 {
1050                     Log.Info("WebView", $"------------address bar text is {addressBar.Text}-------");
1051
1052                     if (addressBar.Text.Length > 0)
1053                     {
1054                         addressBar.GetInputMethodContext().HideInputPanel();
1055                         addressBar.GetInputMethodContext().Deactivate();
1056
1057                         simpleWebView.Url = $"http://{addressBar.Text.ToLowerInvariant()}";
1058
1059                         // set focus to webview.
1060                         FocusManager.Instance.SetCurrentFocusView(simpleWebView);
1061                     }
1062                 }
1063                 else if (args.Key.KeyPressedName == "BackSpace")
1064                 {
1065                     if (addressBar.Text.Length > 0)
1066                     {
1067                         addressBar.Text = addressBar.Text.Substring(0, addressBar.Text.Length - 1);
1068                     }
1069                 }
1070                 else if (args.Key.KeyPressedName == "XF86Red")
1071                 {
1072                     FocusManager.Instance.SetCurrentFocusView(simpleWebView);
1073                 }
1074             }
1075
1076             return true;
1077         }
1078
1079         private void Instance_KeyEvent(object sender, Window.KeyEventArgs args)
1080         {
1081             if (args.Key.State == Key.StateType.Up)
1082             {
1083                 Log.Info("WebView", $"window key is {args.Key.KeyPressedName}.");
1084
1085                 if (args.Key.KeyPressedName == "XF86Exit")
1086                 {
1087                     if (simpleWebView != null)
1088                     {
1089                         GetDefaultWindow().Remove(simpleWebView);
1090                         simpleWebView.Dispose();
1091                         simpleWebView = null;
1092                         Log.Info("WebView", $"WebView is disposed..............");
1093                     }
1094                 }
1095             }
1096         }
1097
1098         [STAThread]
1099         static void Main(string[] args)
1100         {
1101             startTime = DateTime.Now.Ticks;
1102             Log.Info("WebView", $"------------web view start time: {startTime}-------");
1103             new SimpleWebViewApplication().Run(args);
1104         }
1105     }
1106 }