75852b25cd8eef1e9fb03bbf62f114a0dc2b5258
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / WebView.cs
1 /*
2  * Copyright (c) 2017 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
18 using System;
19 using System.ComponentModel;
20 using System.Collections.Generic;
21 using System.Runtime.InteropServices;
22 using Tizen.NUI.BaseComponents;
23 using Tizen.NUI.Binding;
24
25 namespace Tizen.NUI
26 {
27     /// <summary>
28     /// WebView
29     /// </summary>
30     [EditorBrowsable(EditorBrowsableState.Never)]
31     public class WebView : View
32     {
33         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
34         private delegate void WebViewPageLoadCallbackDelegate(IntPtr data, string pageUrl);
35
36         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
37         private delegate void WebViewPageLoadErrorCallbackDelegate(IntPtr data, string pageUrl, int errorCode);
38
39         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
40         private delegate void WebViewScrollEdgeReachedCallbackDelegate(IntPtr data, int edge);
41
42         private readonly WebViewPageLoadSignal pageLoadStartedSignal;
43         private EventHandler<WebViewPageLoadEventArgs> pageLoadStartedEventHandler;
44         private WebViewPageLoadCallbackDelegate pageLoadStartedCallback;
45
46         private readonly WebViewPageLoadSignal pageLoadFinishedSignal;
47         private EventHandler<WebViewPageLoadEventArgs> pageLoadFinishedEventHandler;
48         private WebViewPageLoadCallbackDelegate pageLoadFinishedCallback;
49
50         private readonly WebViewPageLoadErrorSignal pageLoadErrorSignal;
51         private EventHandler<WebViewPageLoadErrorEventArgs> pageLoadErrorEventHandler;
52         private WebViewPageLoadErrorCallbackDelegate pageLoadErrorCallback;
53
54         private readonly WebViewScrollEdgeReachedSignal scrollEdgeReachedSignal;
55         private EventHandler<WebViewScrollEdgeReachedEventArgs> scrollEdgeReachedEventHandler;
56         private WebViewScrollEdgeReachedCallbackDelegate scrollEdgeReachedCallback;
57
58         internal WebView(global::System.IntPtr cPtr, bool cMemoryOwn) : base(Interop.WebView.WebView_SWIGUpcast(cPtr), cMemoryOwn)
59         {
60             pageLoadStartedSignal = new WebViewPageLoadSignal(Interop.WebView.new_WebViewPageLoadSignal_PageLoadStarted(swigCPtr));
61             pageLoadFinishedSignal = new WebViewPageLoadSignal(Interop.WebView.new_WebViewPageLoadSignal_PageLoadFinished(swigCPtr));
62             pageLoadErrorSignal = new WebViewPageLoadErrorSignal(Interop.WebView.new_WebViewPageLoadErrorSignal_PageLoadError(swigCPtr));
63             scrollEdgeReachedSignal = new WebViewScrollEdgeReachedSignal(Interop.WebView.NewWebViewScrollEdgeReachedSignalScrollEdgeReached(swigCPtr));
64         }
65
66         internal static global::System.Runtime.InteropServices.HandleRef getCPtr(WebView obj)
67         {
68             return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
69         }
70
71         internal WebView Assign(WebView webView)
72         {
73             WebView ret = new WebView(Interop.WebView.WebView_Assign(swigCPtr, WebView.getCPtr(webView)), false);
74             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
75             return ret;
76         }
77
78         internal static WebView DownCast(BaseHandle handle)
79         {
80             WebView ret = new WebView(Interop.WebView.WebView_DownCast(BaseHandle.getCPtr(handle)), true);
81             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
82             return ret;
83         }
84
85         /// <summary>
86         /// Dispose for IDisposable pattern
87         /// </summary>
88         [EditorBrowsable(EditorBrowsableState.Never)]
89         protected override void Dispose(DisposeTypes type)
90         {
91             if (disposed)
92             {
93                 return;
94             }
95
96             if (type == DisposeTypes.Explicit)
97             {
98                 //Called by User
99                 //Release your own managed resources here.
100                 //You should release all of your own disposable objects here.
101                 pageLoadStartedSignal.Dispose();
102                 pageLoadFinishedSignal.Dispose();
103                 pageLoadErrorSignal.Dispose();
104             }
105
106             base.Dispose(type);
107         }
108
109         /// This will not be public opened.
110         /// <param name="swigCPtr"></param>
111         [EditorBrowsable(EditorBrowsableState.Never)]
112         protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr)
113         {
114             Interop.WebView.delete_WebView(swigCPtr);
115         }
116
117         private void OnPageLoadStarted(IntPtr data, string pageUrl)
118         {
119             WebViewPageLoadEventArgs e = new WebViewPageLoadEventArgs();
120
121             e.WebView = Registry.GetManagedBaseHandleFromNativePtr(data) as WebView;
122             e.PageUrl = pageUrl;
123
124             if (pageLoadStartedEventHandler != null)
125             {
126                 pageLoadStartedEventHandler(this, e);
127             }
128         }
129
130         private void OnPageLoadFinished(IntPtr data, string pageUrl)
131         {
132             WebViewPageLoadEventArgs e = new WebViewPageLoadEventArgs();
133
134             e.WebView = Registry.GetManagedBaseHandleFromNativePtr(data) as WebView;
135             e.PageUrl = pageUrl;
136
137             if (pageLoadFinishedEventHandler != null)
138             {
139                 pageLoadFinishedEventHandler(this, e);
140             }
141         }
142
143         private void OnPageLoadError(IntPtr data, string pageUrl, int errorCode)
144         {
145             WebViewPageLoadErrorEventArgs e = new WebViewPageLoadErrorEventArgs();
146
147             e.WebView = Registry.GetManagedBaseHandleFromNativePtr(data) as WebView;
148             e.PageUrl = pageUrl;
149             e.ErrorCode = (WebViewPageLoadErrorEventArgs.LoadErrorCode)errorCode;
150
151             if (pageLoadErrorEventHandler != null)
152             {
153                 pageLoadErrorEventHandler(this, e);
154             }
155         }
156
157         private void OnScrollEdgeReached(IntPtr data, int edge)
158         {
159             WebViewScrollEdgeReachedEventArgs arg = new WebViewScrollEdgeReachedEventArgs((WebViewScrollEdgeReachedEventArgs.Edge)edge);
160             scrollEdgeReachedEventHandler?.Invoke(this, arg);
161         }
162
163         internal static new class Property
164         {
165             internal static readonly int URL = Interop.WebView.WebView_Property_URL_get();
166             internal static readonly int CACHE_MODEL = Interop.WebView.WebView_Property_CACHE_MODEL_get();
167             internal static readonly int COOKIE_ACCEPT_POLICY = Interop.WebView.WebView_Property_COOKIE_ACCEPT_POLICY_get();
168             internal static readonly int USER_AGENT = Interop.WebView.WebView_Property_USER_AGENT_get();
169             internal static readonly int ENABLE_JAVASCRIPT = Interop.WebView.WebView_Property_ENABLE_JAVASCRIPT_get();
170             internal static readonly int LOAD_IMAGES_AUTOMATICALLY = Interop.WebView.WebView_Property_LOAD_IMAGES_AUTOMATICALLY_get();
171             internal static readonly int DEFAULT_TEXT_ENCODING_NAME = Interop.WebView.WebView_Property_DEFAULT_TEXT_ENCODING_NAME_get();
172             internal static readonly int DEFAULT_FONT_SIZE = Interop.WebView.WebView_Property_DEFAULT_FONT_SIZE_get();
173             internal static readonly int ScrollPosition = Interop.WebView.ScrollPositionGet();
174             internal static readonly int ScrollSize = Interop.WebView.ScrollSizeGet();
175             internal static readonly int ContentSize = Interop.WebView.ContentSizeGet();
176         }
177
178         private static readonly BindableProperty UrlProperty = BindableProperty.Create(nameof(Url), typeof(string), typeof(WebView), string.Empty, propertyChanged: (bindable, oldValue, newValue) =>
179         {
180             var webview = (WebView)bindable;
181             if (newValue != null)
182             {
183                 Tizen.NUI.Object.SetProperty(webview.swigCPtr, WebView.Property.URL, new Tizen.NUI.PropertyValue((string)newValue));
184             }
185         },
186         defaultValueCreator: (bindable) =>
187         {
188             var webview = (WebView)bindable;
189             string temp;
190             Tizen.NUI.Object.GetProperty(webview.swigCPtr, WebView.Property.URL).Get(out temp);
191             return temp;
192         });
193
194         private static readonly BindableProperty CacheModelProperty = BindableProperty.Create(nameof(CacheModel), typeof(CacheModel), typeof(WebView), CacheModel.DocumentViewer, propertyChanged: (bindable, oldValue, newValue) =>
195         {
196             var webview = (WebView)bindable;
197             if (newValue != null)
198             {
199                 Tizen.NUI.Object.SetProperty(webview.swigCPtr, WebView.Property.CACHE_MODEL, new Tizen.NUI.PropertyValue((int)newValue));
200             }
201         },
202         defaultValueCreator: (bindable) =>
203         {
204             var webview = (WebView)bindable;
205             string temp;
206             if (Tizen.NUI.Object.GetProperty(webview.swigCPtr, WebView.Property.CACHE_MODEL).Get(out temp) == false)
207             {
208                 NUILog.Error("CacheModel get error!");
209             }
210             switch (temp)
211             {
212                 case "DOCUMENT_VIEWER": return CacheModel.DocumentViewer;
213                 case "DOCUMENT_BROWSER": return CacheModel.DocumentBrowser;
214                 default: return CacheModel.PrimaryWebBrowser;
215             }
216         });
217
218         private static readonly BindableProperty CookieAcceptPolicyProperty = BindableProperty.Create(nameof(CookieAcceptPolicy), typeof(CookieAcceptPolicy), typeof(WebView), CookieAcceptPolicy.NoThirdParty, propertyChanged: (bindable, oldValue, newValue) =>
219         {
220             var webview = (WebView)bindable;
221             if (newValue != null)
222             {
223                 Tizen.NUI.Object.SetProperty(webview.swigCPtr, WebView.Property.COOKIE_ACCEPT_POLICY, new Tizen.NUI.PropertyValue((int)newValue));
224             }
225         },
226         defaultValueCreator: (bindable) =>
227         {
228             var webview = (WebView)bindable;
229             string temp;
230             if (Tizen.NUI.Object.GetProperty(webview.swigCPtr, WebView.Property.COOKIE_ACCEPT_POLICY).Get(out temp) == false)
231             {
232                 NUILog.Error("CookieAcceptPolicy get error!");
233             }
234             switch (temp)
235             {
236                 case "ALWAYS": return CookieAcceptPolicy.Always;
237                 case "NEVER": return CookieAcceptPolicy.Never;
238                 default: return CookieAcceptPolicy.NoThirdParty;
239             }
240         });
241
242         private static readonly BindableProperty UserAgentProperty = BindableProperty.Create(nameof(UserAgent), typeof(string), typeof(WebView), string.Empty, propertyChanged: (bindable, oldValue, newValue) =>
243         {
244             var webview = (WebView)bindable;
245             if (newValue != null)
246             {
247                 Tizen.NUI.Object.SetProperty(webview.swigCPtr, WebView.Property.USER_AGENT, new Tizen.NUI.PropertyValue((string)newValue));
248             }
249         },
250         defaultValueCreator: (bindable) =>
251         {
252             var webview = (WebView)bindable;
253             string temp;
254             Tizen.NUI.Object.GetProperty(webview.swigCPtr, WebView.Property.USER_AGENT).Get(out temp);
255             return temp;
256         });
257
258         private static readonly BindableProperty EnableJavaScriptProperty = BindableProperty.Create(nameof(EnableJavaScript), typeof(bool), typeof(WebView), true, propertyChanged: (bindable, oldValue, newValue) =>
259         {
260             var webview = (WebView)bindable;
261             if (newValue != null)
262             {
263                 Tizen.NUI.Object.SetProperty(webview.swigCPtr, WebView.Property.ENABLE_JAVASCRIPT, new Tizen.NUI.PropertyValue((bool)newValue));
264             }
265         },
266         defaultValueCreator: (bindable) =>
267         {
268             var webview = (WebView)bindable;
269             bool temp;
270             Tizen.NUI.Object.GetProperty(webview.swigCPtr, WebView.Property.ENABLE_JAVASCRIPT).Get(out temp);
271             return temp;
272         });
273
274         private static readonly BindableProperty LoadImagesAutomaticallyProperty = BindableProperty.Create(nameof(LoadImagesAutomatically), typeof(bool), typeof(WebView), true, propertyChanged: (bindable, oldValue, newValue) =>
275         {
276             var webview = (WebView)bindable;
277             if (newValue != null)
278             {
279                 Tizen.NUI.Object.SetProperty(webview.swigCPtr, WebView.Property.LOAD_IMAGES_AUTOMATICALLY, new Tizen.NUI.PropertyValue((bool)newValue));
280             }
281         },
282         defaultValueCreator: (bindable) =>
283         {
284             var webview = (WebView)bindable;
285             bool temp;
286             Tizen.NUI.Object.GetProperty(webview.swigCPtr, WebView.Property.LOAD_IMAGES_AUTOMATICALLY).Get(out temp);
287             return temp;
288         });
289
290         private static readonly BindableProperty DefaultTextEncodingNameProperty = BindableProperty.Create(nameof(DefaultTextEncodingName), typeof(string), typeof(WebView), string.Empty, propertyChanged: (bindable, oldValue, newValue) =>
291         {
292             var webview = (WebView)bindable;
293             if (newValue != null)
294             {
295                 Tizen.NUI.Object.SetProperty(webview.swigCPtr, WebView.Property.DEFAULT_TEXT_ENCODING_NAME, new Tizen.NUI.PropertyValue((string)newValue));
296             }
297         },
298         defaultValueCreator: (bindable) =>
299         {
300             var webview = (WebView)bindable;
301             string temp;
302             Tizen.NUI.Object.GetProperty(webview.swigCPtr, WebView.Property.DEFAULT_TEXT_ENCODING_NAME).Get(out temp);
303             return temp;
304         });
305
306         private static readonly BindableProperty DefaultFontSizeProperty = BindableProperty.Create(nameof(DefaultFontSize), typeof(int), typeof(WebView), 16, propertyChanged: (bindable, oldValue, newValue) =>
307         {
308             var webview = (WebView)bindable;
309             if (newValue != null)
310             {
311                 Tizen.NUI.Object.SetProperty(webview.swigCPtr, WebView.Property.DEFAULT_FONT_SIZE, new Tizen.NUI.PropertyValue((int)newValue));
312             }
313         },
314         defaultValueCreator: (bindable) =>
315         {
316             var webview = (WebView)bindable;
317             int temp;
318             Tizen.NUI.Object.GetProperty(webview.swigCPtr, WebView.Property.DEFAULT_FONT_SIZE).Get(out temp);
319             return temp;
320         });
321
322
323         private static readonly BindableProperty ScrollPositionProperty = BindableProperty.Create(nameof(ScrollPosition), typeof(Vector2), typeof(WebView), null, propertyChanged: (bindable, oldValue, newValue) =>
324         {
325             var webview = (WebView)bindable;
326             if (newValue != null)
327             {
328                 Tizen.NUI.Object.SetProperty(webview.SwigCPtr, WebView.Property.ScrollPosition, new Tizen.NUI.PropertyValue((Vector2)newValue));
329             }
330         },
331         defaultValueCreator: (bindable) =>
332         {
333             var webview = (WebView)bindable;
334             Vector2 temp = new Vector2(0.0f, 0.0f); ;
335             Tizen.NUI.Object.GetProperty(webview.SwigCPtr, WebView.Property.ScrollPosition).Get(temp);
336             return temp;
337         });
338
339         private static readonly BindableProperty ScrollSizeProperty = BindableProperty.Create(nameof(ScrollSize), typeof(Vector2), typeof(WebView), null, defaultValueCreator: (bindable) =>
340         {
341             var webview = (WebView)bindable;
342             Vector2 temp = new Vector2(0.0f, 0.0f); ;
343             Tizen.NUI.Object.GetProperty(webview.SwigCPtr, WebView.Property.ScrollSize).Get(temp);
344             return temp;
345         });
346
347         private static readonly BindableProperty ContentSizeProperty = BindableProperty.Create(nameof(ContentSize), typeof(Vector2), typeof(WebView), null, defaultValueCreator: (bindable) =>
348         {
349             var webview = (WebView)bindable;
350             Vector2 temp = new Vector2(0.0f, 0.0f); ;
351             Tizen.NUI.Object.GetProperty(webview.SwigCPtr, WebView.Property.ContentSize).Get(temp);
352             return temp;
353         });
354
355         /// <summary>
356         /// Creates an uninitialized WebView.
357         /// </summary>
358         [EditorBrowsable(EditorBrowsableState.Never)]
359         public WebView() : this(Interop.WebView.WebView_New(), true)
360         {
361             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
362
363         }
364
365         /// <summary>
366         /// Creates an uninitialized WebView.
367         /// <param name="locale">The locale of Web</param>
368         /// <param name="timezoneId">The timezoneId of Web</param>
369         /// </summary>
370         [EditorBrowsable(EditorBrowsableState.Never)]
371         public WebView(string locale, string timezoneId) : this(Interop.WebView.WebView_New_2(locale, timezoneId), true)
372         {
373             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
374         }
375
376         /// <summary>
377         /// Copy constructor.
378         /// <param name="webView">WebView to copy. The copied WebView will point at the same implementation</param>
379         /// </summary>
380         [EditorBrowsable(EditorBrowsableState.Never)]
381         public WebView(WebView webView) : this(Interop.WebView.new_WebView__SWIG_1(WebView.getCPtr(webView)), true)
382         {
383             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
384         }
385
386         /// <summary>
387         /// The url to load.
388         /// </summary>
389         [EditorBrowsable(EditorBrowsableState.Never)]
390         public string Url
391         {
392             get
393             {
394                 return (string)GetValue(UrlProperty);
395             }
396             set
397             {
398                 SetValue(UrlProperty, value);
399                 NotifyPropertyChanged();
400             }
401         }
402
403         /// <summary>
404         /// The cache model of the current WebView.
405         /// </summary>
406         [EditorBrowsable(EditorBrowsableState.Never)]
407         public CacheModel CacheModel
408         {
409             get
410             {
411                 return (CacheModel)GetValue(CacheModelProperty);
412             }
413             set
414             {
415                 SetValue(CacheModelProperty, value);
416                 NotifyPropertyChanged();
417             }
418         }
419
420         /// <summary>
421         /// The cookie acceptance policy.
422         /// </summary>
423         [EditorBrowsable(EditorBrowsableState.Never)]
424         public CookieAcceptPolicy CookieAcceptPolicy
425         {
426             get
427             {
428                 return (CookieAcceptPolicy)GetValue(CookieAcceptPolicyProperty);
429             }
430             set
431             {
432                 SetValue(CookieAcceptPolicyProperty, value);
433                 NotifyPropertyChanged();
434             }
435         }
436
437         /// <summary>
438         /// The user agent string.
439         /// </summary>
440         [EditorBrowsable(EditorBrowsableState.Never)]
441         public string UserAgent
442         {
443             get
444             {
445                 return (string)GetValue(UserAgentProperty);
446             }
447             set
448             {
449                 SetValue(UserAgentProperty, value);
450                 NotifyPropertyChanged();
451             }
452         }
453
454         /// <summary>
455         /// Whether JavaScript is enabled.
456         /// </summary>
457         [EditorBrowsable(EditorBrowsableState.Never)]
458         public bool EnableJavaScript
459         {
460             get
461             {
462                 return (bool)GetValue(EnableJavaScriptProperty);
463             }
464             set
465             {
466                 SetValue(EnableJavaScriptProperty, value);
467                 NotifyPropertyChanged();
468             }
469         }
470
471         /// <summary>
472         /// Whether images can be loaded automatically.
473         /// </summary>
474         [EditorBrowsable(EditorBrowsableState.Never)]
475         public bool LoadImagesAutomatically
476         {
477             get
478             {
479                 return (bool)GetValue(LoadImagesAutomaticallyProperty);
480             }
481             set
482             {
483                 SetValue(LoadImagesAutomaticallyProperty, value);
484                 NotifyPropertyChanged();
485             }
486         }
487
488         /// <summary>
489         /// The default text encoding name.<br />
490         /// e.g. "UTF-8"<br />
491         /// </summary>
492         [EditorBrowsable(EditorBrowsableState.Never)]
493         public string DefaultTextEncodingName
494         {
495             get
496             {
497                 return (string)GetValue(DefaultTextEncodingNameProperty);
498             }
499             set
500             {
501                 SetValue(DefaultTextEncodingNameProperty, value);
502                 NotifyPropertyChanged();
503             }
504         }
505
506         /// <summary>
507         /// The default font size in pixel.
508         /// </summary>
509         [EditorBrowsable(EditorBrowsableState.Never)]
510         public int DefaultFontSize
511         {
512             get
513             {
514                 return (int)GetValue(DefaultFontSizeProperty);
515             }
516             set
517             {
518                 SetValue(DefaultFontSizeProperty, value);
519                 NotifyPropertyChanged();
520             }
521         }
522
523         /// <summary>
524         /// The postion of scroll.
525         /// </summary>
526         [EditorBrowsable(EditorBrowsableState.Never)]
527         public Position ScrollPosition
528         {
529             get
530             {
531                 Vector2 pv = (Vector2)GetValue(ScrollPositionProperty);
532                 return new Position(pv.X, pv.Y);
533             }
534             set
535             {
536                 if (value != null)
537                 {
538                     Position pv = value;
539                     Vector2 vpv = new Vector2(pv.X, pv.Y);
540                     SetValue(ScrollPositionProperty, vpv);
541                     NotifyPropertyChanged();
542                 }
543             }
544         }
545
546         /// <summary>
547         /// The size of scroll, read-only.
548         /// </summary>
549         [EditorBrowsable(EditorBrowsableState.Never)]
550         public Size ScrollSize
551         {
552             get
553             {
554                 Vector2 sv = (Vector2)GetValue(ScrollSizeProperty);
555                 return new Size(sv.Width, sv.Height);
556             }
557         }
558
559         /// <summary>
560         /// The size of content, read-only.
561         /// </summary>
562         [EditorBrowsable(EditorBrowsableState.Never)]
563         public Size ContentSize
564         {
565             get
566             {
567                 Vector2 sv = (Vector2)GetValue(ContentSizeProperty);
568                 return new Size(sv.Width, sv.Height);
569             }
570         }
571
572         /// <summary>
573         /// Event for the PageLoadStarted signal which can be used to subscribe or unsubscribe the event handler.<br />
574         /// This signal is emitted when page loading has started.<br />
575         /// </summary>
576         [EditorBrowsable(EditorBrowsableState.Never)]
577         public event EventHandler<WebViewPageLoadEventArgs> PageLoadStarted
578         {
579             add
580             {
581                 if (pageLoadStartedEventHandler == null)
582                 {
583                     pageLoadStartedCallback = (OnPageLoadStarted);
584                     pageLoadStartedSignal.Connect(pageLoadStartedCallback);
585                 }
586                 pageLoadStartedEventHandler += value;
587             }
588             remove
589             {
590                 pageLoadStartedEventHandler -= value;
591                 if (pageLoadStartedEventHandler == null && pageLoadStartedCallback != null)
592                 {
593                     pageLoadStartedSignal.Disconnect(pageLoadStartedCallback);
594                 }
595             }
596         }
597
598         /// <summary>
599         /// Event for the PageLoadFinished signal which can be used to subscribe or unsubscribe the event handler.<br />
600         /// This signal is emitted when page loading has finished.<br />
601         /// </summary>
602         [EditorBrowsable(EditorBrowsableState.Never)]
603         public event EventHandler<WebViewPageLoadEventArgs> PageLoadFinished
604         {
605             add
606             {
607                 if (pageLoadFinishedEventHandler == null)
608                 {
609                     pageLoadFinishedCallback = (OnPageLoadFinished);
610                     pageLoadFinishedSignal.Connect(pageLoadFinishedCallback);
611                 }
612                 pageLoadFinishedEventHandler += value;
613             }
614             remove
615             {
616                 pageLoadFinishedEventHandler -= value;
617                 if (pageLoadFinishedEventHandler == null && pageLoadFinishedCallback != null)
618                 {
619                     pageLoadFinishedSignal.Disconnect(pageLoadFinishedCallback);
620                 }
621             }
622         }
623
624         /// <summary>
625         /// Event for the PageLoadError signal which can be used to subscribe or unsubscribe the event handler.<br />
626         /// This signal is emitted when there's an error in page loading.<br />
627         /// </summary>
628         [EditorBrowsable(EditorBrowsableState.Never)]
629         public event EventHandler<WebViewPageLoadErrorEventArgs> PageLoadError
630         {
631             add
632             {
633                 if (pageLoadErrorEventHandler == null)
634                 {
635                     pageLoadErrorCallback = (OnPageLoadError);
636                     pageLoadErrorSignal.Connect(pageLoadErrorCallback);
637                 }
638                 pageLoadErrorEventHandler += value;
639             }
640             remove
641             {
642                 pageLoadErrorEventHandler -= value;
643                 if (pageLoadErrorEventHandler == null && pageLoadErrorCallback != null)
644                 {
645                     pageLoadErrorSignal.Disconnect(pageLoadErrorCallback);
646                 }
647             }
648         }
649
650         /// <summary>
651         /// Event for the ScrollEdgeReached signal which can be used to subscribe or unsubscribe the event handler.<br />
652         /// This signal is emitted when web view is scrolled to edge.<br />
653         /// </summary>
654         [EditorBrowsable(EditorBrowsableState.Never)]
655         public event EventHandler<WebViewScrollEdgeReachedEventArgs> ScrollEdgeReached
656         {
657             add
658             {
659                 if (scrollEdgeReachedEventHandler == null)
660                 {
661                     scrollEdgeReachedCallback = OnScrollEdgeReached;
662                     scrollEdgeReachedSignal.Connect(scrollEdgeReachedCallback);
663                 }
664                 scrollEdgeReachedEventHandler += value;
665             }
666             remove
667             {
668                 scrollEdgeReachedEventHandler -= value;
669                 if (scrollEdgeReachedEventHandler == null && scrollEdgeReachedCallback != null)
670                 {
671                     scrollEdgeReachedSignal.Disconnect(scrollEdgeReachedCallback);
672                 }
673             }
674         }
675
676         /// <summary>
677         /// Loads a html.
678         /// <param name="url">The path of Web</param>
679         /// </summary>
680         [EditorBrowsable(EditorBrowsableState.Never)]
681         public void LoadUrl(string url)
682         {
683             Interop.WebView.WebView_LoadUrl(swigCPtr, url);
684             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
685         }
686
687         /// <summary>
688         /// Returns the URL of the Web
689         /// <param name="data">The data of Web</param>
690         /// </summary>
691         [EditorBrowsable(EditorBrowsableState.Never)]
692         public void LoadHTMLString(string data)
693         {
694             Interop.WebView.WebView_LoadHTMLString(swigCPtr, data);
695             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
696         }
697
698         /// <summary>
699         /// Reloads the Web
700         /// </summary>
701         [EditorBrowsable(EditorBrowsableState.Never)]
702         public void Reload()
703         {
704             Interop.WebView.WebView_Reload(swigCPtr);
705             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
706         }
707
708         /// <summary>
709         /// Stops loading the Web
710         /// </summary>
711         [EditorBrowsable(EditorBrowsableState.Never)]
712         public void StopLoading()
713         {
714             Interop.WebView.WebView_StopLoading(swigCPtr);
715             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
716         }
717
718         /// <summary>
719         /// Suspends the operation.
720         /// </summary>
721         [EditorBrowsable(EditorBrowsableState.Never)]
722         public void Suspend()
723         {
724             Interop.WebView.WebView_Suspend(swigCPtr);
725             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
726         }
727
728         /// <summary>
729         /// Resumes the operation after calling Suspend()
730         /// </summary>
731         [EditorBrowsable(EditorBrowsableState.Never)]
732         public void Resume()
733         {
734             Interop.WebView.WebView_Resume(swigCPtr);
735             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
736         }
737
738         /// <summary>
739         /// Scroll web view by deltaX and detlaY.
740         /// <param name="deltaX">The deltaX of scroll</param>
741         /// <param name="deltaY">The deltaY of scroll</param>
742         /// </summary>
743         [EditorBrowsable(EditorBrowsableState.Never)]
744         public void ScrollBy(int deltaX, int deltaY)
745         {
746             Interop.WebView.ScrollBy(SwigCPtr, deltaX, deltaY);
747             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
748         }
749
750         /// <summary>
751         /// Goes to the back
752         /// </summary>
753         [EditorBrowsable(EditorBrowsableState.Never)]
754         public void GoBack()
755         {
756             Interop.WebView.WebView_GoBack(swigCPtr);
757             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
758         }
759
760         /// <summary>
761         /// Goes to the forward
762         /// </summary>
763         [EditorBrowsable(EditorBrowsableState.Never)]
764         public void GoForward()
765         {
766             Interop.WebView.WebView_GoForward(swigCPtr);
767             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
768         }
769
770         /// <summary>
771         /// Returns whether backward is possible.
772         /// <returns>True if backward is possible, false otherwise</returns>
773         /// </summary>
774         [EditorBrowsable(EditorBrowsableState.Never)]
775         public bool CanGoBack()
776         {
777             bool ret = Interop.WebView.WebView_CanGoBack(swigCPtr);
778             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
779             return ret;
780         }
781
782         /// <summary>
783         /// Returns whether forward is possible.
784         /// <returns>True if forward is possible, false otherwise</returns>
785         /// </summary>
786         [EditorBrowsable(EditorBrowsableState.Never)]
787         public bool CanGoForward()
788         {
789             bool ret = Interop.WebView.WebView_CanGoForward(swigCPtr);
790             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
791             return ret;
792         }
793
794         /// <summary>
795         /// The callback function that is invoked when the message is received from the script.
796         /// </summary>
797         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
798         [EditorBrowsable(EditorBrowsableState.Never)]
799         public delegate void JavaScriptMessageHandler(string message);
800
801         /// <summary>
802         /// Evaluates JavaScript code represented as a string.
803         /// <param name="script">The JavaScript code</param>
804         /// </summary>
805         [EditorBrowsable(EditorBrowsableState.Never)]
806         public void EvaluateJavaScript(string script)
807         {
808             Interop.WebView.WebView_EvaluateJavaScript(swigCPtr, script, new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero));
809             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
810         }
811
812         // For rooting handlers
813         internal Dictionary<string, JavaScriptMessageHandler> handlerRootMap = new Dictionary<string, JavaScriptMessageHandler>();
814
815         /// <summary>
816         /// Add a message handler into the WebView.
817         /// <param name="objectName">The name of exposed object</param>
818         /// <param name="handler">The callback function</param>
819         /// </summary>
820         [EditorBrowsable(EditorBrowsableState.Never)]
821         public void AddJavaScriptMessageHandler(string objectName, JavaScriptMessageHandler handler)
822         {
823             if (handlerRootMap.ContainsKey(objectName))
824             {
825                 return;
826             }
827
828             handlerRootMap.Add(objectName, handler);
829
830             System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(handler);
831             Interop.WebView.WebView_AddJavaScriptMessageHandler(swigCPtr, objectName, new System.Runtime.InteropServices.HandleRef(this, ip));
832
833             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
834         }
835
836         /// <summary>
837         /// Clears the history of current WebView.
838         /// </summary>
839         [EditorBrowsable(EditorBrowsableState.Never)]
840         public void ClearHistory()
841         {
842             Interop.WebView.WebView_ClearHistory(swigCPtr);
843             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
844         }
845
846         /// <summary>
847         /// Clears the cache of current WebView.
848         /// </summary>
849         [EditorBrowsable(EditorBrowsableState.Never)]
850         public void ClearCache()
851         {
852             Interop.WebView.WebView_ClearCache(swigCPtr);
853             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
854         }
855
856         /// <summary>
857         /// Clears all the cookies of current WebView.
858         /// </summary>
859         [EditorBrowsable(EditorBrowsableState.Never)]
860         public void ClearCookies()
861         {
862             Interop.WebView.WebView_ClearCookies(swigCPtr);
863             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
864         }
865     }
866 }