2 * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
\r
4 * Licensed under the Apache License, Version 2.0 (the License);
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an AS IS BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
19 using System.Collections.Generic;
\r
20 using System.Runtime.InteropServices;
\r
22 namespace Tizen.WebView
\r
25 /// A view used to render web contents.
\r
27 public class WebView: EvasObject
\r
29 private static IDictionary<string, JavaScriptMessageHandler> _javaScriptMessageHandlerMap = new Dictionary<string, JavaScriptMessageHandler>();
\r
31 private IntPtr _handle;
\r
32 private IntPtr _realHandle;
\r
33 private Context _context;
\r
34 private Settings _settings;
\r
37 private SmartEvent _focusIn;
\r
38 private SmartEvent _focusOut;
\r
41 private SmartEvent _loadStarted;
\r
42 private SmartEvent _loadFinished;
\r
43 private SmartEvent<SmartCallbackLoadErrorArgs> _loadError;
\r
44 private SmartEvent<SmartCallbackArgs> _titleChanged;
\r
45 private SmartEvent<SmartCallbackArgs> _urlChanged;
\r
50 /// Event that occurs when load started.
\r
52 public event EventHandler LoadStarted;
\r
55 /// Event that occurs when load finished.
\r
57 public event EventHandler LoadFinished;
\r
60 /// Event that occurs when load error.
\r
62 public event EventHandler<SmartCallbackLoadErrorArgs> LoadError;
\r
65 /// Event that occurs when title of main frame was changed.
\r
67 public event EventHandler<SmartCallbackArgs> TitleChanged;
\r
70 /// Event that occurs when URL of main frame was changed.
\r
72 public event EventHandler<SmartCallbackArgs> UrlChanged;
\r
75 /// Current URL of the main frame.
\r
81 return Interop.ChromiumEwk.ewk_view_url_get(_realHandle);
\r
86 /// Current title of the main frame.
\r
92 return Interop.ChromiumEwk.ewk_view_title_get(_realHandle);
\r
97 /// Current user agent string of this view.
\r
99 public string UserAgent
\r
103 return Interop.ChromiumEwk.ewk_view_user_agent_get(_realHandle);
\r
108 Interop.ChromiumEwk.ewk_view_user_agent_set(_realHandle, value);
\r
113 /// Whether a view has the focus.
\r
115 public bool HasFocus
\r
119 return Interop.ChromiumEwk.ewk_view_focus_get(_realHandle);
\r
124 /// Create a WebView object.
\r
126 /// <param name="parent">Parent object of WebView</param>
\r
127 public WebView(EvasObject parent) : base(parent)
\r
129 InitializeSmartEvent();
\r
133 /// Gets the Context object of this view.
\r
135 /// <returns>The Context object of this view</returns>
\r
136 public Context GetContext()
\r
138 if (_context == null)
\r
140 IntPtr contextHandle = Interop.ChromiumEwk.ewk_view_context_get(_realHandle);
\r
141 if (contextHandle == IntPtr.Zero)
\r
145 _context = new Context(contextHandle);
\r
151 /// Gets the Settings object of this view.
\r
153 /// <returns>The Settings object of this view</returns>
\r
154 public Settings GetSettings()
\r
156 if (_settings == null)
\r
158 IntPtr settingsHandle = Interop.ChromiumEwk.ewk_view_settings_get(_realHandle);
\r
159 if (settingsHandle == IntPtr.Zero)
\r
163 _settings = new Settings(settingsHandle);
\r
169 /// Asks the object to load the given URL.
\r
172 /// You can only be sure that url changed after UrlChanged event.
\r
174 /// <param name="url">The uniform resource identifier to load</param>
\r
175 public void LoadUrl(string url)
\r
177 Interop.ChromiumEwk.ewk_view_url_set(_realHandle, url);
\r
181 /// Loads the specified html string as the content of the view.
\r
183 /// <param name="html">HTML data to load</param>
\r
184 /// <param name="baseUrl">Base URL used for relative paths to external objects</param>
\r
185 public void LoadHtml(string html, string baseUrl)
\r
187 Interop.ChromiumEwk.ewk_view_html_string_load(_realHandle, html, baseUrl, null);
\r
191 /// Asks the main frame to stop loading.
\r
193 public void StopLoading()
\r
195 Interop.ChromiumEwk.ewk_view_stop(_realHandle);
\r
199 /// Asks the main frame to reload the current document.
\r
201 public void Reload()
\r
203 Interop.ChromiumEwk.ewk_view_reload(_realHandle);
\r
207 /// Asks the main frame to navigate back in history.
\r
209 public void GoBack()
\r
211 Interop.ChromiumEwk.ewk_view_back(_realHandle);
\r
215 /// Asks the main frame to navigate forward in history.
\r
217 public void GoForward()
\r
219 Interop.ChromiumEwk.ewk_view_forward(_realHandle);
\r
223 /// Checks whether it is possible to navigate backwards one item in history.
\r
225 /// <returns>Whether it is possible to navigate backwards one item in history</returns>
\r
226 public bool CanGoBack()
\r
228 return Interop.ChromiumEwk.ewk_view_back_possible(_realHandle);
\r
232 /// Checks whether it is possible to navigate forwards one item in history.
\r
234 /// <returns>Whether it is possible to navigate forwards one item in history</returns>
\r
235 public bool CanGoForward()
\r
237 return Interop.ChromiumEwk.ewk_view_forward_possible(_realHandle);
\r
241 /// Injects the supplied javascript message handler into the view.
\r
243 /// <param name="name"> The message callback</param>
\r
244 /// <param name="handler">The name used to expose the object in JavaScript</param>
\r
245 /// <returns>'true' on success, otherwise 'false'</returns>
\r
246 public bool AddJavaScriptMessageHandler(string name, JavaScriptMessageHandler handler)
\r
248 lock (_javaScriptMessageHandlerMap)
\r
250 if (_javaScriptMessageHandlerMap.ContainsKey(name))
\r
254 _javaScriptMessageHandlerMap[name] = handler;
\r
256 Interop.ChromiumEwk.ScriptMessageCallback callback = (handle, message) =>
\r
258 JavaScriptMessage convertedMessage = new JavaScriptMessage(message);
\r
259 lock (_javaScriptMessageHandlerMap)
\r
261 if (_javaScriptMessageHandlerMap.ContainsKey(convertedMessage.Name))
\r
263 _javaScriptMessageHandlerMap[convertedMessage.Name](convertedMessage);
\r
267 if (!Interop.ChromiumEwk.ewk_view_javascript_message_handler_add(_realHandle, callback, name))
\r
269 lock (_javaScriptMessageHandlerMap)
\r
271 _javaScriptMessageHandlerMap.Remove(name);
\r
279 /// Requests the execution of given name and result to the JavaScript runtime.
\r
281 /// <param name="name">The name used to expose the object in JavaScript</param>
\r
282 /// <param name="result">The result to the JavaScript runtime</param>
\r
283 public void EvalWithResult(string name, string result)
\r
285 Interop.ChromiumEwk.ewk_view_evaluate_javascript(_realHandle, name, result);
\r
289 /// Requests the execution of the given script.
\r
291 /// <param name="script">The JavaScript code string to execute</param>
\r
292 public void Eval(string script)
\r
294 Interop.ChromiumEwk.ewk_view_script_execute(_realHandle, script, null, IntPtr.Zero);
\r
298 /// Requests to set or unset a view as the currently focused one.
\r
300 /// <param name="focused">'true' to set the focus on the view, 'false' to remove the focus from the view</param>
\r
301 public void SetFocus(bool focused)
\r
303 Interop.ChromiumEwk.ewk_view_focus_set(_realHandle, focused);
\r
306 protected override IntPtr CreateHandle(EvasObject parent)
\r
309 _handle = Interop.Elementary.elm_layout_add((IntPtr)parent);
\r
310 Interop.Elementary.elm_layout_theme_set(_handle, "layout", "elm_widget", "default");
\r
311 Interop.Elementary.elm_object_focus_allow_set(_handle, true);
\r
313 IntPtr evas = Interop.Evas.evas_object_evas_get(parent);
\r
314 _realHandle = Interop.ChromiumEwk.ewk_view_add(evas);
\r
315 Interop.Elementary.elm_object_part_content_set(_handle, "elm.swallow.content", _realHandle);
\r
320 private void InitializeSmartEvent()
\r
323 _focusIn = new SmartEvent(this, "focused");
\r
324 _focusOut = new SmartEvent(this, "unfocused");
\r
326 _focusIn.On += (s, e) => { ((WebView)s).SetFocus(true); };
\r
327 _focusOut.On += (s, e) => { ((WebView)s).SetFocus(false); };
\r
329 _loadStarted = new SmartEvent(this, _realHandle, "load,started");
\r
330 _loadFinished = new SmartEvent(this, _realHandle, "load,finished");
\r
331 _loadError = new SmartEvent<SmartCallbackLoadErrorArgs>(this, _realHandle, "load,error", SmartCallbackLoadErrorArgs.CreateFromSmartEvent);
\r
332 _titleChanged = new SmartEvent<SmartCallbackArgs>(this, _realHandle, "title,changed", SmartCallbackArgs.CreateFromSmartEvent);
\r
333 _urlChanged = new SmartEvent<SmartCallbackArgs>(this, _realHandle, "url,changed", SmartCallbackArgs.CreateFromSmartEvent);
\r
335 _loadStarted.On += (s, e) => { LoadStarted?.Invoke(this, EventArgs.Empty); };
\r
336 _loadFinished.On += (s, e) => { LoadFinished?.Invoke(this, EventArgs.Empty); };
\r
337 _loadError.On += (s, e) => { LoadError?.Invoke(this, e); };
\r
338 _titleChanged.On += (s, e) => { TitleChanged?.Invoke(this, e); };
\r
339 _urlChanged.On += (s, e) => { UrlChanged?.Invoke(this, e); };
\r