[NUI][XamlBuild] Set node as null after calling ExitXaml().
[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 OnJavaScriptEvaluated(string message)
599         {
600             Log.Info("WebView", $"------------javascript evaluation result: {message}-------");
601         }
602
603         private void OnJavaScriptAlert(string message)
604         {
605             Log.Info("WebView", $"------------javascript alert {message}-------");
606             simpleWebView.JavaScriptAlertReply();
607         }
608
609         private void OnGeolocationPermission(string host, string protocol)
610         {
611             Log.Info("WebView", $"------------geolocation permission, host: {host}, protocol: {protocol}-------");
612         }
613
614         private void OnJavaScriptConfirm(string message)
615         {
616             Log.Info("WebView", $"------------javascript confirm {message}-------");
617             simpleWebView.JavaScriptConfirmReply(true);
618         }
619
620         private void OnJavaScriptPrompt(string message1, string message2)
621         {
622             Log.Info("WebView", $"------------javascript prompt {message1}, {message2}-------");
623             simpleWebView.JavaScriptPromptReply("test");
624         }
625
626         private void OnPasswordDataListAcquired(IList<WebPasswordData> list)
627         {
628             Log.Info("WebView", $"------------password data list, count: {list.Count}-------");
629             string[] passwords = new string[list.Count];
630             for (int i = 0; i < list.Count; i++)
631             {
632                 WebPasswordData data = list[i];
633                 passwords[i] = data.Url;
634                 Log.Info("WebView", $"------------password data, Url: {data.Url}-------");
635                 Log.Info("WebView", $"------------password data, FingerprintUsed: {data.FingerprintUsed}-------");
636             }
637
638             if (list.Count > 0)
639             {
640                 simpleWebView.Context.DeleteFormPasswordDataList(passwords);
641             }
642         }
643
644         private void OnSecurityOriginListAcquired(IList<WebSecurityOrigin> list)
645         {
646             Log.Info("WebView", $"------------security origin, count: {list.Count}-------");
647             for (int i = 0; i < list.Count; i++)
648             {
649                 WebSecurityOrigin origin = list[i];
650                 Log.Info("WebView", $"------------security origin, Host: {origin.Host}-------");
651                 Log.Info("WebView", $"------------security origin, Protocol: {origin.Protocol}-------");
652             }
653
654             if (list.Count > 0)
655             {
656                 WebSecurityOrigin origin = list[0];
657                 simpleWebView.Context.GetWebStorageUsageForOrigin(origin, OnStorageUsageAcquired);
658                 simpleWebView.Context.DeleteApplicationCache(origin);
659                 simpleWebView.Context.DeleteWebDatabase(origin);
660                 simpleWebView.Context.DeleteWebStorage(origin);
661             }
662         }
663
664         private void OnStorageUsageAcquired(ulong usage)
665         {
666             Log.Info("WebView", $"------------storage usage acquired, usage: {usage}-------");
667         }
668
669         private void OnDownloadStarted(string url)
670         {
671             Log.Info("WebView", $"------------download started, url: {url}-------");
672         }
673
674         private bool OnMimeOverridden(string url, string currentMime, out string newMime)
675         {
676             Log.Info("WebView", $"------------mime overridden, url: {url}-------");
677             Log.Info("WebView", $"------------mime overridden, currentMime: {currentMime}-------");
678             newMime = "test";
679             return true;
680         }
681
682         private void OnCookieChanged(object sender, EventArgs e)
683         {
684             Log.Info("WebView", $"------------cookie changed-------");
685         }
686
687         private bool OnWebViewKeyEvent(object source, View.KeyEventArgs args)
688         {
689             bool result = false;
690
691             Log.Info("WebView", $"----web view key is {args.Key.KeyPressedName}, state is {args.Key.State}-------");
692
693             if (args.Key.State == Key.StateType.Up)
694             {
695                 if (args.Key.KeyPressedName == "XF86RaiseChannel")
696                 {
697                     Log.Info("WebView", $"old url is {simpleWebView.Url}.");
698                     if (index != 0)
699                     {
700                         simpleWebView.Url = websites[--index].ToLowerInvariant();
701                     }
702                     else
703                     {
704                         simpleWebView.Url = websites[WEBSITES_COUNT - 1].ToLowerInvariant();
705                     }
706                     result = true;
707                     Log.Info("WebView", $"new url is {simpleWebView.Url}.");
708                 }
709                 else if (args.Key.KeyPressedName == "XF86LowerChannel")
710                 {
711                     Log.Info("WebView", $"old url is {simpleWebView.Url}.");
712                     if (index != WEBSITES_COUNT - 1)
713                     {
714                         simpleWebView.Url = websites[++index].ToLowerInvariant();
715                     }
716                     else
717                     {
718                         simpleWebView.Url = websites[0].ToLowerInvariant();
719                     }
720                     result = true;
721                     Log.Info("WebView", $"new url is {simpleWebView.Url}.");
722                 }
723                 //else if (args.Key.KeyPressedName == "1")
724                 //{
725                 //    Rectangle viewArea = new Rectangle(0, 0, 20, 20);
726                 //    bool succeeded = simpleWebView.GetScreenshotAsynchronously(viewArea, 1.0f, OnScreenshotAcquired);
727                 //    Log.Info("WebView", $"GetScreenshotAsynchronously, {succeeded}");
728
729                 //    succeeded = simpleWebView.HitTestAsynchronously(100, 100, BaseComponents.WebView.HitTestMode.Default, OnHitTestFinished);
730                 //    Log.Info("WebView", $"HitTestAsynchronously, {succeeded}");
731                 //}
732                 else if (args.Key.KeyPressedName == "XF86Red")
733                 {
734                     if (redKeyPressedCount % 2 == 0)
735                     {
736                         simpleWebView.Context.RegisterHttpRequestInterceptedCallback(OnHttpRequestIntercepted);
737                         redKeyPressedCount = 0;
738                     }
739                     else
740                     {
741                         simpleWebView.Context.RegisterHttpRequestInterceptedCallback(null);
742                     }
743                     redKeyPressedCount++;
744                     FocusManager.Instance.SetCurrentFocusView(addressBar);
745                     result = true;
746                 }
747                 else if (args.Key.KeyPressedName == "XF86Blue")
748                 {
749                     blueKeyPressedCount++;
750                     if (blueKeyPressedCount % 6 == 0)
751                     {
752                         simpleWebView.Position = new Position(0, ADDRESSBAR_HEIGHT);
753                         simpleWebView.Orientation = new Rotation(new Radian(new Degree(60 * blueKeyPressedCount)), Vector3.ZAxis);
754                         blueKeyPressedCount = 0;
755                     }
756                     else
757                     {
758                         simpleWebView.Orientation = new Rotation(new Radian(new Degree(60 * blueKeyPressedCount)), Vector3.ZAxis);
759                     }
760                     result = true;
761                 }
762                 else if (args.Key.KeyPressedName == "XF86Yellow")
763                 {
764                     yellowKeyPressedCount++;
765                     int wdistance = (SCREEN_WIDTH - MIN_WEBVIEW_WIDTH) / 5;
766                     int hdistance = (SCREEN_HEIGHT - MIN_WEBVIEW_HEIGHT - ADDRESSBAR_HEIGHT) / 5;
767                     simpleWebView.Position = new Position((SCREEN_WIDTH - MIN_WEBVIEW_WIDTH - yellowKeyPressedCount * wdistance) / 2, ADDRESSBAR_HEIGHT);
768                     simpleWebView.Size = new Size(MIN_WEBVIEW_WIDTH + yellowKeyPressedCount * wdistance, MIN_WEBVIEW_HEIGHT + hdistance * yellowKeyPressedCount);
769                     if (yellowKeyPressedCount % 5 == 0)
770                     {
771                         yellowKeyPressedCount = 0;
772                     }
773                     result = true;
774                 }
775                 else if (args.Key.KeyPressedName == "XF86Green")
776                 {
777                     Log.Info("WebView", $"key XF86Green is pressed.");
778
779                     //greenKeyPressedCount++;
780                     if (simpleWebView.Url.Contains("account.samsung"))
781                     {
782                         // webview apis
783                         Log.Info("WebView", $"web page title is {simpleWebView.Title}");
784
785                         //faviconView = simpleWebView.Favicon;
786                         //if (faviconView != null)
787                         //{
788                         //    faviconView.Position = new Position(500, 100);
789                         //    GetDefaultWindow().Add(faviconView);
790                         //    messageTimer.Start();
791                         //}
792
793                         simpleWebView.ContentBackgroundColor = new Color(1.0f, 0.0f, 0.0f, 1.0f);
794                         Log.Info("WebView", $"web page ContentBackgroundColor is {simpleWebView.ContentBackgroundColor}");
795                         simpleWebView.TilesClearedWhenHidden = true;
796                         Log.Info("WebView", $"web page TilesClearedWhenHidden is {simpleWebView.TilesClearedWhenHidden}");
797                         simpleWebView.TileCoverAreaMultiplier = 2.0f;
798                         Log.Info("WebView", $"web page TileCoverAreaMultiplier is {simpleWebView.TileCoverAreaMultiplier}");
799                         simpleWebView.CursorEnabledByClient = true;
800                         Log.Info("WebView", $"web page CursorEnabledByClient is {simpleWebView.CursorEnabledByClient}");
801                         Log.Info("WebView", $"web page SelectedText is {simpleWebView.SelectedText}");
802                         simpleWebView.PageZoomFactor = 2.0f;
803                         Log.Info("WebView", $"web page PageZoomFactor is {simpleWebView.PageZoomFactor}");
804                         simpleWebView.TextZoomFactor = 2.0f;
805                         Log.Info("WebView", $"web page TextZoomFactor is {simpleWebView.TextZoomFactor}");
806                         Log.Info("WebView", $"web page LoadProgressPercentage is {simpleWebView.LoadProgressPercentage}");
807
808                         //simpleWebView.ActivateAccessibility(true);
809                         //simpleWebView.AddCustomHeader("test", "value");
810                         //simpleWebView.AddDynamicCertificatePath("", "");
811                         simpleWebView.AddJavaScriptMessageHandler("", OnJavaScriptMessageReceived);
812                         simpleWebView.CheckVideoPlayingAsynchronously(OnVideoPlaying);
813                         //simpleWebView.ClearAllTilesResources();
814                         //simpleWebView.ClearHistory();
815                         simpleWebView.EvaluateJavaScript("document.body.style.backgroundColor='yellow';");
816                         simpleWebView.EvaluateJavaScript("document.body.innerHTML", OnJavaScriptEvaluated);
817                         Log.Info("WebView", $"web view, ScaleFactor is {simpleWebView.GetScaleFactor()}");
818
819                         //Rectangle viewArea = new Rectangle(0, 0, 20, 20);
820                         //ImageView shotView = simpleWebView.GetScreenshot(viewArea, 1.0f);
821                         //if (shotView != null)
822                         //{
823                         //    shotView.Position = new Position(500, 200);
824                         //    GetDefaultWindow().Add(shotView);
825                         //}
826
827                         simpleWebView.HighlightText("test", BaseComponents.WebView.FindOption.CaseInsensitive, 2);
828                         Log.Info("WebView", $"web view, here");
829                         WebHitTestResult test = null;//simpleWebView.HitTest(100, 100, WebView.HitTestMode.Default);
830                         if (test != null)
831                         {
832                             Log.Info("WebView", $"WebHitTestResult, TestResultContext: {test.TestResultContext}");
833                             Log.Info("WebView", $"WebHitTestResult, LinkUrl: {test.LinkUrl}");
834                             Log.Info("WebView", $"WebHitTestResult, LinkTitle: {test.LinkTitle}");
835                             Log.Info("WebView", $"WebHitTestResult, LinkLabel: {test.LinkLabel}");
836                             Log.Info("WebView", $"WebHitTestResult, ImageUrl: {test.ImageUrl}");
837                             Log.Info("WebView", $"WebHitTestResult, MediaUrl: {test.MediaUrl}");
838                             Log.Info("WebView", $"WebHitTestResult, TagName: {test.TagName}");
839                             Log.Info("WebView", $"WebHitTestResult, NodeValue: {test.NodeValue}");
840                             if (test.Attributes != null)
841                             {
842                                 Log.Info("WebView", $"WebHitTestResult, Attributes: {test.Attributes}");
843                             }
844                             Log.Info("WebView", $"WebHitTestResult, NodeValue: {test.ImageFileNameExtension}");
845                             ImageView imageView = test.Image;
846                             if (imageView != null)
847                             {
848                                 imageView.Position = new Position(500, 500);
849                                 GetDefaultWindow().Add(imageView);
850                             }
851                         }
852
853                         simpleWebView.RegisterGeolocationPermissionCallback(OnGeolocationPermission);
854                         Log.Info("WebView", $"Register javascript alert/confirm/prompt callback.");
855                         simpleWebView.RegisterJavaScriptAlertCallback(OnJavaScriptAlert);
856                         simpleWebView.RegisterJavaScriptConfirmCallback(OnJavaScriptConfirm);
857                         simpleWebView.RegisterJavaScriptPromptCallback(OnJavaScriptPrompt);
858                         //Log.Info("WebView", $"Reload without cache.");
859                         //simpleWebView.ReloadWithoutCache();
860                         //Log.Info("WebView", $"Remove custom header");
861                         //simpleWebView.RemoveCustomHeader("test");
862                         //Log.Info("WebView", $"Suspend");
863                         //simpleWebView.Suspend();
864                         //simpleWebView.SuspendNetworkLoading();
865                         //Log.Info("WebView", $"Resume");
866                         //simpleWebView.Resume();
867                         //simpleWebView.ResumeNetworkLoading();
868                         //Log.Info("WebView", $"load contents");
869                         //simpleWebView.LoadContents();
870                         //simpleWebView.LoadHtmlStringOverrideCurrentEntry();
871                         //simpleWebView.LoadHtmlString("<Html><Head><title>Example</title></Head><Body><b>[This text is Bold......]</b></Body></Html>");
872                         //simpleWebView.ScrollPosition = new Position(0, 200);
873                         //simpleWebView.ScrollBy(0, 50);
874                         //simpleWebView.ScrollEdgeBy(0, 50);
875
876                         //Log.Info("WebView", $"scroll position is ({simpleWebView.ScrollPosition.X}, {simpleWebView.ScrollPosition.Y}).");
877                         //Log.Info("WebView", $"scroll size is ({simpleWebView.ScrollSize.Width}, {simpleWebView.ScrollSize.Height}).");
878                         //Log.Info("WebView", $"content size is ({simpleWebView.ContentSize.Width}, {simpleWebView.ContentSize.Height}).");
879
880                         //simpleWebView.StartInspectorServer(8080);
881                         //simpleWebView.StopInspectorServer();
882                         //simpleWebView.StopLoading();
883
884                         // websettings apis
885                         simpleWebView.Settings.LinkMagnifierEnabled = true;
886                         Log.Info("WebView", $"web settings LinkMagnifierEnabled is {simpleWebView.Settings.LinkMagnifierEnabled}");
887                         simpleWebView.Settings.ViewportMetaTag = true;
888                         Log.Info("WebView", $"web settings ViewportMetaTag is {simpleWebView.Settings.ViewportMetaTag}");
889                         simpleWebView.Settings.DefaultTextEncodingName = "utf-8";
890                         Log.Info("WebView", $"web settings DefaultTextEncodingName is {simpleWebView.Settings.DefaultTextEncodingName}");
891                         simpleWebView.Settings.AutomaticImageLoadingAllowed = true;
892                         Log.Info("WebView", $"web settings AutomaticImageLoadingAllowed is {simpleWebView.Settings.AutomaticImageLoadingAllowed}");
893                         simpleWebView.Settings.ScriptsOpenWindowsAllowed = true;
894                         Log.Info("WebView", $"web settings ScriptsOpenWindowsAllowed is {simpleWebView.Settings.ScriptsOpenWindowsAllowed}");
895                         simpleWebView.Settings.ImePanelEnabled = true;
896                         Log.Info("WebView", $"web settings ImePanelEnabled is {simpleWebView.Settings.ImePanelEnabled}");
897                         simpleWebView.Settings.ClipboardEnabled = true;
898                         Log.Info("WebView", $"web settings ClipboardEnabled is {simpleWebView.Settings.ClipboardEnabled}");
899                         simpleWebView.Settings.ArrowScrollEnabled = true;
900                         Log.Info("WebView", $"web settings ArrowScrollEnabled is {simpleWebView.Settings.ArrowScrollEnabled}");
901                         simpleWebView.Settings.TextAutosizingEnabled = true;
902                         Log.Info("WebView", $"web settings TextAutosizingEnabled is {simpleWebView.Settings.TextAutosizingEnabled}");
903                         simpleWebView.Settings.TextSelectionEnabled = true;
904                         Log.Info("WebView", $"web settings TextSelectionEnabled is {simpleWebView.Settings.TextSelectionEnabled}");
905                         simpleWebView.Settings.FormCandidateDataEnabled = true;
906                         Log.Info("WebView", $"web settings FormCandidateDataEnabled is {simpleWebView.Settings.FormCandidateDataEnabled}");
907                         simpleWebView.Settings.AutofillPasswordFormEnabled = true;
908                         Log.Info("WebView", $"web settings AutofillPasswordFormEnabled is {simpleWebView.Settings.AutofillPasswordFormEnabled}");
909                         simpleWebView.Settings.KeypadWithoutUserActionUsed = true;
910                         Log.Info("WebView", $"web settings KeypadWithoutUserActionUsed is {simpleWebView.Settings.KeypadWithoutUserActionUsed}");
911                         simpleWebView.Settings.ZoomForced = true;
912                         Log.Info("WebView", $"web settings ZoomForced is {simpleWebView.Settings.ZoomForced}");
913                         simpleWebView.Settings.TextZoomEnabled = true;
914                         Log.Info("WebView", $"web settings TextZoomEnabled is {simpleWebView.Settings.TextZoomEnabled}");
915                         simpleWebView.Settings.PluginsEnabled = true;
916                         Log.Info("WebView", $"web settings PluginsEnabled is {simpleWebView.Settings.PluginsEnabled}");
917                         simpleWebView.Settings.AutoFittingEnabled = true;
918                         Log.Info("WebView", $"web settings AutoFittingEnabled is {simpleWebView.Settings.AutoFittingEnabled}");
919                         simpleWebView.Settings.JavaScriptEnabled = true;
920                         Log.Info("WebView", $"web settings JavaScriptEnabled is {simpleWebView.Settings.JavaScriptEnabled}");
921                         simpleWebView.Settings.FileAccessFromExternalUrlAllowed = true;
922                         Log.Info("WebView", $"web settings FileAccessFromExternalUrlAllowed is {simpleWebView.Settings.FileAccessFromExternalUrlAllowed}");
923                         simpleWebView.Settings.ScrollbarThumbFocusNotificationsUsed = true;
924                         Log.Info("WebView", $"web settings ScrollbarThumbFocusNotificationsUsed is {simpleWebView.Settings.ScrollbarThumbFocusNotificationsUsed}");
925                         simpleWebView.Settings.DoNotTrackEnabled = true;
926                         Log.Info("WebView", $"web settings DoNotTrackEnabled is {simpleWebView.Settings.DoNotTrackEnabled}");
927                         simpleWebView.Settings.CacheBuilderEnabled = true;
928                         Log.Info("WebView", $"web settings CacheBuilderEnabled is {simpleWebView.Settings.CacheBuilderEnabled}");
929                         simpleWebView.Settings.WebSecurityEnabled = true;
930                         Log.Info("WebView", $"web settings WebSecurityEnabled is {simpleWebView.Settings.WebSecurityEnabled}");
931                         simpleWebView.Settings.DefaultFontSize = 20;
932                         Log.Info("WebView", $"web settings DefaultFontSize is {simpleWebView.Settings.DefaultFontSize}");
933                         simpleWebView.Settings.SpatialNavigationEnabled = true;
934                         Log.Info("WebView", $"web settings SpatialNavigationEnabled is {simpleWebView.Settings.SpatialNavigationEnabled}");
935                         simpleWebView.Settings.MixedContentsAllowed = true;
936                         Log.Info("WebView", $"web settings MixedContentsAllowed is {simpleWebView.Settings.MixedContentsAllowed}");
937                         simpleWebView.Settings.PrivateBrowsingEnabled = true;
938                         Log.Info("WebView", $"web settings PrivateBrowsingEnabled is {simpleWebView.Settings.PrivateBrowsingEnabled}");
939                         simpleWebView.Settings.EnableExtraFeature("feature", true);
940                         Log.Info("WebView", $"web settings EnableExtraFeature is {simpleWebView.Settings.IsExtraFeatureEnabled("feature")}");
941
942                         // webcontext apis
943                         simpleWebView.Context.AppType = WebContext.ApplicationType.WebBrowser;
944                         Log.Info("WebView", $"web context, AppType: {simpleWebView.Context.AppType}");
945                         simpleWebView.Context.AppVersion = "6.5";
946                         Log.Info("WebView", $"web context, AppVersion: {simpleWebView.Context.AppVersion}");
947                         simpleWebView.Context.AppId = "1.0id";
948                         Log.Info("WebView", $"web context, AppId: {simpleWebView.Context.AppId}");
949                         simpleWebView.Context.CacheEnabled = false;
950                         Log.Info("WebView", $"web context, CacheEnabled: {simpleWebView.Context.CacheEnabled}");
951                         simpleWebView.Context.CertificateFilePath = "/root/share";
952                         Log.Info("WebView", $"web context, CertificateFilePath: {simpleWebView.Context.CertificateFilePath}");
953                         simpleWebView.Context.ProxyUrl = "https://127.0.0.1";
954                         Log.Info("WebView", $"web context, ProxyUrl: {simpleWebView.Context.ProxyUrl}");
955                         simpleWebView.Context.CacheModel = WebContext.CacheModelType.DocumentBrowser;
956                         Log.Info("WebView", $"web context, cache model is {simpleWebView.Context.CacheModel}");
957                         Log.Info("WebView", $"web context, ProxyBypassRule: {simpleWebView.Context.ProxyBypassRule}");
958                         simpleWebView.Context.DefaultZoomFactor = 2.0f;
959                         Log.Info("WebView", $"web context, DefaultZoomFactor: {simpleWebView.Context.DefaultZoomFactor}");
960                         //simpleWebView.Context.ClearCache();
961                         //simpleWebView.Context.DeleteAllApplicationCache();
962                         //simpleWebView.Context.DeleteAllFormCandidateData();
963                         //simpleWebView.Context.DeleteAllFormPasswordData();
964                         //simpleWebView.Context.DeleteAllWebDatabase();
965                         //simpleWebView.Context.DeleteAllWebIndexedDatabase();
966                         //simpleWebView.Context.DeleteAllWebStorage();
967                         //simpleWebView.Context.DeleteLocalFileSystem();
968                         //simpleWebView.Context.FreeUnusedMemory();
969                         Log.Info("WebView", $"web view, here");
970                         simpleWebView.Context.GetFormPasswordList(OnPasswordDataListAcquired);
971                         Log.Info("WebView", $"web view, here");
972                         simpleWebView.Context.GetWebDatabaseOrigins(OnSecurityOriginListAcquired);
973                         Log.Info("WebView", $"web view, here");
974                         simpleWebView.Context.GetWebStorageOrigins(OnSecurityOriginListAcquired);
975                         Log.Info("WebView", $"web view, here");
976                         simpleWebView.Context.RegisterDownloadStartedCallback(OnDownloadStarted);
977                         Log.Info("WebView", $"web view, here");
978                         string[] mimes = { "txt" };
979                         simpleWebView.Context.RegisterJsPluginMimeTypes(mimes);
980                         Log.Info("WebView", $"web view, here");
981                         simpleWebView.Context.RegisterMimeOverriddenCallback(OnMimeOverridden);
982                         Log.Info("WebView", $"web view, here");
983                         string[] schemes = { "test" };
984                         simpleWebView.Context.RegisterUrlSchemesAsCorsEnabled(schemes);
985                         Log.Info("WebView", $"web view, here");
986                         simpleWebView.Context.SetProxyBypassRule("test", "");
987                         Log.Info("WebView", $"web context, ContextProxy: {simpleWebView.Context.ProxyUrl}");
988                         simpleWebView.Context.TimeOffset = 8.0f;
989                         Log.Info("WebView", $"web context, TimeOffset: {simpleWebView.Context.TimeOffset}");
990                         simpleWebView.Context.SetTimeZoneOffset(2.0f, 3.0f);
991                         simpleWebView.Context.SetDefaultProxyAuth("user", "password");
992
993                         // webcookiemanager apis
994                         simpleWebView.CookieManager.CookieAcceptPolicy = WebCookieManager.CookieAcceptPolicyType.Never;
995                         Log.Info("WebView", $"web cookie manager accept policy is {simpleWebView.CookieManager.CookieAcceptPolicy}");
996                         //simpleWebView.CookieManager.ClearCookies();
997                         simpleWebView.CookieManager.SetPersistentStorage("/root/share", WebCookieManager.CookiePersistentStorageType.SqlLite);
998                         simpleWebView.CookieManager.CookieChanged += OnCookieChanged;
999
1000                         // webbackforwardlist apis
1001                         Log.Info("WebView", $"web back forward list item count is {simpleWebView.BackForwardList.ItemCount}");
1002                         WebBackForwardListItem item = simpleWebView.BackForwardList.GetCurrentItem();
1003                         Log.Info("WebView", $"web back forward list, current item url is {item.Url}");
1004                         Log.Info("WebView", $"web back forward list, current item title is {item.Title}");
1005                         Log.Info("WebView", $"web back forward list, current item original url is {item.OriginalUrl}");
1006                         if (simpleWebView.BackForwardList.ItemCount > 0)
1007                         {
1008                             item = simpleWebView.BackForwardList.GetItemAtIndex(0);
1009                             Log.Info("WebView", $"web back forward list, item0 url is {item.Url}");
1010                             Log.Info("WebView", $"web back forward list, item0 title is {item.Title}");
1011                             Log.Info("WebView", $"web back forward list, item0 original url is {item.OriginalUrl}");
1012                             IList<WebBackForwardListItem> subList = simpleWebView.BackForwardList.GetForwardItems(0);
1013                             Log.Info("WebView", $"web back forward list, forward sub list ItemCount is {subList.Count}");
1014                             subList = simpleWebView.BackForwardList.GetBackwardItems(0);
1015                             Log.Info("WebView", $"web back forward list, backward sub list  ItemCount is {subList.Count}");
1016                         }
1017
1018                         //
1019                         result = true;
1020                     }
1021                 }
1022             }
1023
1024             return result;
1025         }
1026
1027         private bool OnAddressBarTouchEvent(object source, View.TouchEventArgs args)
1028         {
1029             FocusManager.Instance.SetCurrentFocusView(addressBar);
1030             return false;
1031         }
1032
1033         private void OnTextEditorFocusGained(object source, EventArgs args)
1034         {
1035             Log.Info("WebView", $"------------address bar focus is gained-------");
1036
1037             addressBar.Text = "";
1038
1039             addressBar.GetInputMethodContext().Activate();
1040             addressBar.GetInputMethodContext().ShowInputPanel();
1041         }
1042
1043         private void OnTextEditorFocusLost(object source, EventArgs args)
1044         {
1045             Log.Info("WebView", $"------------address bar focus lost-------");
1046         }
1047
1048         private bool OnAddressBarKeyEvent(object source, View.KeyEventArgs args)
1049         {
1050             Log.Info("WebView", $"------------address bar key is {args.Key.KeyPressedName}-------");
1051
1052             if (args.Key.State == Key.StateType.Up)
1053             {
1054                 if (args.Key.KeyPressedName == "Select")
1055                 {
1056                     Log.Info("WebView", $"------------address bar text is {addressBar.Text}-------");
1057
1058                     if (addressBar.Text.Length > 0)
1059                     {
1060                         addressBar.GetInputMethodContext().HideInputPanel();
1061                         addressBar.GetInputMethodContext().Deactivate();
1062
1063                         simpleWebView.Url = $"http://{addressBar.Text.ToLowerInvariant()}";
1064
1065                         // set focus to webview.
1066                         FocusManager.Instance.SetCurrentFocusView(simpleWebView);
1067                     }
1068                 }
1069                 else if (args.Key.KeyPressedName == "BackSpace")
1070                 {
1071                     if (addressBar.Text.Length > 0)
1072                     {
1073                         addressBar.Text = addressBar.Text.Substring(0, addressBar.Text.Length - 1);
1074                     }
1075                 }
1076                 else if (args.Key.KeyPressedName == "XF86Red")
1077                 {
1078                     FocusManager.Instance.SetCurrentFocusView(simpleWebView);
1079                 }
1080             }
1081
1082             return true;
1083         }
1084
1085         private void Instance_KeyEvent(object sender, Window.KeyEventArgs args)
1086         {
1087             if (args.Key.State == Key.StateType.Up)
1088             {
1089                 Log.Info("WebView", $"window key is {args.Key.KeyPressedName}.");
1090
1091                 if (args.Key.KeyPressedName == "XF86Exit")
1092                 {
1093                     if (simpleWebView != null)
1094                     {
1095                         GetDefaultWindow().Remove(simpleWebView);
1096                         simpleWebView.Dispose();
1097                         simpleWebView = null;
1098                         Log.Info("WebView", $"WebView is disposed..............");
1099                     }
1100                 }
1101             }
1102         }
1103
1104         [STAThread]
1105         static void Main(string[] args)
1106         {
1107             startTime = DateTime.Now.Ticks;
1108             Log.Info("WebView", $"------------web view start time: {startTime}-------");
1109             new SimpleWebViewApplication().Run(args);
1110         }
1111     }
1112 }