From: yh106.jung Date: Fri, 17 Feb 2017 04:12:56 +0000 (+0900) Subject: Introduce Tizen.WebView X-Git-Tag: submit/trunk/20170823.075128~65^2~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9f249678db74fff7ebe77a207b9e6047cfa620c6;p=platform%2Fcore%2Fcsapi%2Ftizenfx.git Introduce Tizen.WebView This patch introduces Tizen.WebView project. Plus, Tizen.WebView.Test project is included in order to test basic functionality of Tizen.WebView. Change-Id: I79b01c2c18817f399f83a3e56cc5cd8ceae3322f Signed-off-by: yh106.jung --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f944396 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +bin/ +obj/ +*.exe +*.dll +*.csproj.user +*.lock.json +.vs/ +*sln diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packaging/csapi-webview.manifest b/packaging/csapi-webview.manifest new file mode 100644 index 0000000..75b0fa5 --- /dev/null +++ b/packaging/csapi-webview.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/packaging/csapi-webview.spec b/packaging/csapi-webview.spec new file mode 100644 index 0000000..d655061 --- /dev/null +++ b/packaging/csapi-webview.spec @@ -0,0 +1,44 @@ +Name: csapi-webview +Summary: Tizen WebView API for C# +Version: 1.0.0 +Release: 1 +Group: Development/Libraries +License: Apache-2.0 +URL: https://www.tizen.org +Source0: %{name}-%{version}.tar.gz +Source1: %{name}.manifest + +AutoReqProv: no +ExcludeArch: aarch64 + +BuildRequires: dotnet-build-tools + +# C# API Requires +BuildRequires: elm-sharp-nuget + +%define Assemblies Tizen.WebView + +%description +%{summary} + +%dotnet_import_sub_packages + +%prep +%setup -q +cp %{SOURCE1} . + +%build +for ASM in %{Assemblies}; do +%dotnet_build $ASM +%dotnet_pack $ASM/$ASM.nuspec %{version} +done + +%install +for ASM in %{Assemblies}; do +%dotnet_install $ASM +done + +%files +%manifest %{name}.manifest +%license LICENSE +%attr(644,root,root) %{dotnet_assembly_files} diff --git a/src/Tizen.WebView/Interop/Interop.ChromiumEwk.Context.cs b/src/Tizen.WebView/Interop/Interop.ChromiumEwk.Context.cs new file mode 100644 index 0000000..e073823 --- /dev/null +++ b/src/Tizen.WebView/Interop/Interop.ChromiumEwk.Context.cs @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.InteropServices; + +internal static partial class Interop +{ + internal static partial class ChromiumEwk + { + public enum CacheModel + { + DocumentViewer, + DocumentBrowser, + PrimaryWebBrowser + } + + [DllImport(Libraries.ChromiumEwk)] + internal static extern IntPtr ewk_context_cookie_manager_get(IntPtr context); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_context_cache_model_set(IntPtr context, CacheModel model); + + [DllImport(Libraries.ChromiumEwk)] + internal static extern CacheModel ewk_context_cache_model_get(IntPtr context); + } +} diff --git a/src/Tizen.WebView/Interop/Interop.ChromiumEwk.CookieManager.cs b/src/Tizen.WebView/Interop/Interop.ChromiumEwk.CookieManager.cs new file mode 100644 index 0000000..2c90553 --- /dev/null +++ b/src/Tizen.WebView/Interop/Interop.ChromiumEwk.CookieManager.cs @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.InteropServices; + +internal static partial class Interop +{ + internal static partial class ChromiumEwk + { + public enum CookieAcceptPolicy + { + Always, + Never, + NoThirdParty + } + + public enum CookiePersistentStorage + { + Text, + SqlLite + } + + [DllImport(Libraries.ChromiumEwk)] + internal static extern void ewk_cookie_manager_accept_policy_set(IntPtr manager, CookieAcceptPolicy policy); + + [DllImport(Libraries.ChromiumEwk)] + internal static extern void ewk_cookie_manager_cookies_clear(IntPtr manager); + + [DllImport(Libraries.ChromiumEwk)] + internal static extern void ewk_cookie_manager_persistent_storage_set(IntPtr manager, string path, CookiePersistentStorage storage); + } +} diff --git a/src/Tizen.WebView/Interop/Interop.ChromiumEwk.Error.cs b/src/Tizen.WebView/Interop/Interop.ChromiumEwk.Error.cs new file mode 100644 index 0000000..9234dc6 --- /dev/null +++ b/src/Tizen.WebView/Interop/Interop.ChromiumEwk.Error.cs @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.InteropServices; + +internal static partial class Interop +{ + internal static partial class ChromiumEwk + { + [DllImport(Libraries.ChromiumEwk, EntryPoint = "ewk_error_url_get", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] + internal static extern IntPtr _ewk_error_url_get(IntPtr error); + + internal static string ewk_error_url_get(IntPtr error) + { + IntPtr ptr = _ewk_error_url_get(error); + return Marshal.PtrToStringAnsi(ptr); + } + + [DllImport(Libraries.ChromiumEwk)] + internal static extern int ewk_error_code_get(IntPtr error); + + [DllImport(Libraries.ChromiumEwk, EntryPoint = "ewk_error_description_get", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] + internal static extern IntPtr _ewk_error_description_get(IntPtr error); + + internal static string ewk_error_description_get(IntPtr error) + { + IntPtr ptr = _ewk_error_description_get(error); + return Marshal.PtrToStringAnsi(ptr); + } + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_error_cancellation_get(IntPtr error); + } +} diff --git a/src/Tizen.WebView/Interop/Interop.ChromiumEwk.Settings.cs b/src/Tizen.WebView/Interop/Interop.ChromiumEwk.Settings.cs new file mode 100644 index 0000000..2acd268 --- /dev/null +++ b/src/Tizen.WebView/Interop/Interop.ChromiumEwk.Settings.cs @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.InteropServices; + +internal static partial class Interop +{ + internal static partial class ChromiumEwk + { + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_settings_javascript_enabled_set(IntPtr settings, bool enable); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_settings_javascript_enabled_get(IntPtr settings); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_settings_loads_images_automatically_set(IntPtr settings, bool enable); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_settings_loads_images_automatically_get(IntPtr settings); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_settings_default_text_encoding_name_set(IntPtr settings, string encoding); + + [DllImport(Libraries.ChromiumEwk, EntryPoint = "ewk_settings_default_text_encoding_name_get", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] + internal static extern IntPtr _ewk_settings_default_text_encoding_name_get(IntPtr settings); + + internal static string ewk_settings_default_text_encoding_name_get(IntPtr settings) + { + IntPtr ptr = _ewk_settings_default_text_encoding_name_get(settings); + return Marshal.PtrToStringAnsi(ptr); + } + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_settings_default_font_size_set(IntPtr settings, int size); + + [DllImport(Libraries.ChromiumEwk)] + internal static extern int ewk_settings_default_font_size_get(IntPtr settings); + } +} diff --git a/src/Tizen.WebView/Interop/Interop.ChromiumEwk.View.cs b/src/Tizen.WebView/Interop/Interop.ChromiumEwk.View.cs new file mode 100644 index 0000000..e507ca8 --- /dev/null +++ b/src/Tizen.WebView/Interop/Interop.ChromiumEwk.View.cs @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.InteropServices; + +internal static partial class Interop +{ + internal static partial class ChromiumEwk + { + [DllImport(Libraries.ChromiumEwk)] + internal static extern IntPtr ewk_view_add(IntPtr evas); + + [DllImport(Libraries.ChromiumEwk)] + internal static extern IntPtr ewk_view_context_get(IntPtr obj); + + [DllImport(Libraries.ChromiumEwk)] + internal static extern IntPtr ewk_view_settings_get(IntPtr obj); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_view_url_set(IntPtr obj, string url); + + [DllImport(Libraries.ChromiumEwk, EntryPoint = "ewk_view_url_get", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] + internal static extern IntPtr _ewk_view_url_get(IntPtr obj); + + internal static string ewk_view_url_get(IntPtr obj) + { + IntPtr ptr = _ewk_view_url_get(obj); + return Marshal.PtrToStringAnsi(ptr); + } + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_view_html_string_load(IntPtr obj, string html, string baseUrl, string unreachableUrl); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_view_reload(IntPtr obj); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_view_stop(IntPtr obj); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_view_back(IntPtr obj); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_view_forward(IntPtr obj); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_view_back_possible(IntPtr obj); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_view_forward_possible(IntPtr obj); + + internal delegate void ScriptExcuteCallback(IntPtr obj, IntPtr resultValue, IntPtr userData); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_view_script_execute(IntPtr obj, string script, ScriptExcuteCallback callback, IntPtr userData); + + [DllImport(Libraries.ChromiumEwk, EntryPoint = "ewk_view_title_get", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] + internal static extern IntPtr _ewk_view_title_get(IntPtr obj); + + internal static string ewk_view_title_get(IntPtr obj) + { + IntPtr ptr = _ewk_view_url_get(obj); + return Marshal.PtrToStringAnsi(ptr); + } + + [DllImport(Libraries.ChromiumEwk, EntryPoint = "ewk_view_user_agent_get", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] + internal static extern IntPtr _ewk_view_user_agent_get(IntPtr obj); + + internal static string ewk_view_user_agent_get(IntPtr obj) + { + IntPtr ptr = _ewk_view_user_agent_get(obj); + return Marshal.PtrToStringAnsi(ptr); + } + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_view_user_agent_set(IntPtr obj, string userAgent); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_view_focus_set(IntPtr obj, bool focused); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_view_focus_get(IntPtr obj); + + [StructLayout(LayoutKind.Sequential, CharSet =CharSet.Ansi)] + internal struct ScriptMessage + { + public IntPtr name; + public IntPtr body; + } + + internal delegate void ScriptMessageCallback(IntPtr obj, ScriptMessage message); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_view_javascript_message_handler_add(IntPtr obj, ScriptMessageCallback callback, string name); + + [DllImport(Libraries.ChromiumEwk)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool ewk_view_evaluate_javascript(IntPtr obj, string name, string result); + } +} diff --git a/src/Tizen.WebView/Interop/Interop.ChromiumEwk.cs b/src/Tizen.WebView/Interop/Interop.ChromiumEwk.cs new file mode 100644 index 0000000..47ca039 --- /dev/null +++ b/src/Tizen.WebView/Interop/Interop.ChromiumEwk.cs @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +using System; +using System.Runtime.InteropServices; + +internal static partial class Interop +{ + internal static partial class ChromiumEwk + { + [DllImport(Libraries.ChromiumEwk)] + internal static extern int ewk_init(); + + [DllImport(Libraries.ChromiumEwk)] + internal static extern int ewk_shutdown(); + } +} diff --git a/src/Tizen.WebView/Interop/Interop.Elementary.cs b/src/Tizen.WebView/Interop/Interop.Elementary.cs new file mode 100644 index 0000000..09b9bc4 --- /dev/null +++ b/src/Tizen.WebView/Interop/Interop.Elementary.cs @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.InteropServices; + +internal static partial class Interop +{ + internal static partial class Elementary + { + [DllImport(Libraries.Elementary)] + internal static extern IntPtr elm_layout_add(IntPtr obj); + + [DllImport(Libraries.Elementary)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool elm_layout_theme_set(IntPtr obj, string klass, string group, string style); + + [DllImport(Libraries.Elementary)] + internal static extern void elm_object_part_content_set(IntPtr obj, string part, IntPtr content); + + [DllImport(Libraries.Elementary)] + internal static extern void elm_object_focus_allow_set(IntPtr obj, bool enable); + } +} \ No newline at end of file diff --git a/src/Tizen.WebView/Interop/Interop.Evas.cs b/src/Tizen.WebView/Interop/Interop.Evas.cs new file mode 100644 index 0000000..a9e6d58 --- /dev/null +++ b/src/Tizen.WebView/Interop/Interop.Evas.cs @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.InteropServices; + +internal static partial class Interop +{ + internal static partial class Evas + { + [DllImport(Libraries.Evas)] + internal static extern IntPtr evas_object_evas_get(IntPtr obj); + } +} diff --git a/src/Tizen.WebView/Interop/Interop.Libraries.cs b/src/Tizen.WebView/Interop/Interop.Libraries.cs new file mode 100644 index 0000000..0d91a26 --- /dev/null +++ b/src/Tizen.WebView/Interop/Interop.Libraries.cs @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +internal static partial class Interop +{ + private static class Libraries + { + internal const string ChromiumEwk = "libchromium-ewk.so"; + internal const string Elementary = "libelementary.so.1"; + internal const string Evas = "libevas.so.1"; + } +} diff --git a/src/Tizen.WebView/Properties/AssemblyInfo.cs b/src/Tizen.WebView/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..75cc36c --- /dev/null +++ b/src/Tizen.WebView/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Tizen.WebView")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Samsung Electronics")] +[assembly: AssemblyProduct("Tizen.WebView")] +[assembly: AssemblyCopyright("Copyright © Samsung Electronics 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("8405e84f-b920-4aac-9ad5-001b9debc9ca")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/Tizen.WebView/Tizen.WebView.csproj b/src/Tizen.WebView/Tizen.WebView.csproj new file mode 100755 index 0000000..29df008 --- /dev/null +++ b/src/Tizen.WebView/Tizen.WebView.csproj @@ -0,0 +1,99 @@ + + + + 14.0 + Debug + AnyCPU + 8.0.30703 + 2.0 + {8405E84F-B920-4AAC-9AD5-001B9DEBC9CA} + Library + Properties + Tizen.WebView + Tizen.WebView + 512 + en-US + + + .NETStandard + v1.3 + .NETStandard,Version=v1.3 + false + true + $(NoWarn);1701 + false + + + true + full + true + bin\Debug\ + DEBUG;TRACE + prompt + 4 + ;1701;1702 + true + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + ;1701;1702 + true + true + + + true + + + Tizen.WebView.snk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_TargetFrameworkDirectories>$(MSBuildThisFileDirectory) + <_FullFrameworkReferenceAssemblyPaths>$(MSBuildThisFileDirectory) + true + + diff --git a/src/Tizen.WebView/Tizen.WebView.nuspec b/src/Tizen.WebView/Tizen.WebView.nuspec new file mode 100644 index 0000000..a0bfe59 --- /dev/null +++ b/src/Tizen.WebView/Tizen.WebView.nuspec @@ -0,0 +1,19 @@ + + + + Tizen.WebView + $version$ + Samsung Electronics + https://www.apache.org/licenses/LICENSE-2.0 + https://developer.tizen.org/sites/default/files/images/tizen-pinwheel-on-light-rgb_64_64.png + false + Tizen WebView API for C# + © Samsung Electronics Co., Ltd All Rights Reserved + + + + + + + + diff --git a/src/Tizen.WebView/Tizen.WebView.project.json b/src/Tizen.WebView/Tizen.WebView.project.json new file mode 100644 index 0000000..389f3bf --- /dev/null +++ b/src/Tizen.WebView/Tizen.WebView.project.json @@ -0,0 +1,9 @@ +{ + "dependencies": { + "ElmSharp": "1.1.0-*", + "NETStandard.Library": "1.6.0" + }, + "frameworks": { + "netstandard1.3": {} + } +} diff --git a/src/Tizen.WebView/Tizen.WebView.snk b/src/Tizen.WebView/Tizen.WebView.snk new file mode 100644 index 0000000..b540543 Binary files /dev/null and b/src/Tizen.WebView/Tizen.WebView.snk differ diff --git a/src/Tizen.WebView/Tizen.WebView/Chromium.cs b/src/Tizen.WebView/Tizen.WebView/Chromium.cs new file mode 100644 index 0000000..ab63379 --- /dev/null +++ b/src/Tizen.WebView/Tizen.WebView/Chromium.cs @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Tizen.WebView +{ + public static class Chromium + { + /// + /// Initializes Chromium's instance + /// + /// A reference count of Chromium's instance + public static int Initialize() + { + return Interop.ChromiumEwk.ewk_init(); + } + + /// + /// Decreases a reference count of WebKit's instance, possibly destroying it + /// + /// A reference count of Chromium's instance + public static int Shutdown() + { + return Interop.ChromiumEwk.ewk_shutdown(); + } + } +} diff --git a/src/Tizen.WebView/Tizen.WebView/Context.cs b/src/Tizen.WebView/Tizen.WebView/Context.cs new file mode 100644 index 0000000..0e1b5cc --- /dev/null +++ b/src/Tizen.WebView/Tizen.WebView/Context.cs @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; + +namespace Tizen.WebView +{ + /// + /// Enumeration that contains option for cache model. + /// + public enum CacheModel + { + DocumentViewer, /* Use the smallest cache capacity */ + DocumentBrowser, /* Use bigger cache capacity than DocumentBrowser */ + PrimaryWebBrowser /* Use the biggest cache capacity. */ + } + + public class Context + { + private IntPtr _handle; + private CookieManager _cookieManager; + + internal Context(IntPtr handle) + { + _handle = handle; + } + + /// + /// The cache model. + /// + /// + /// The default cache model is DocumentViewer. + /// + public CacheModel CacheModel + { + get + { + return (CacheModel)Interop.ChromiumEwk.ewk_context_cache_model_get(_handle); + } + + set + { + Interop.ChromiumEwk.ewk_context_cache_model_set(_handle, (Interop.ChromiumEwk.CacheModel)value); + } + } + + /// + /// Gets the CookieManager object for this context. + /// + /// The CookieManager object + public CookieManager GetCookieManager() + { + if (_cookieManager == null) + { + IntPtr cookieManagerHandle = Interop.ChromiumEwk.ewk_context_cookie_manager_get(_handle); + if (cookieManagerHandle == IntPtr.Zero) + { + return null; + } + _cookieManager = new CookieManager(cookieManagerHandle); + } + return _cookieManager; + } + } +} diff --git a/src/Tizen.WebView/Tizen.WebView/CookieManager.cs b/src/Tizen.WebView/Tizen.WebView/CookieManager.cs new file mode 100644 index 0000000..3728201 --- /dev/null +++ b/src/Tizen.WebView/Tizen.WebView/CookieManager.cs @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +using System; + +namespace Tizen.WebView +{ + /// + /// Enumeration that contains accept policies for the cookies. + /// + public enum CookieAcceptPolicy + { + Always, /* Accepts every cookie sent from any page */ + Never, /* Rejects all cookies */ + NoThirdParty /* Accepts only cookies set by the main document loaded */ + } + + /// + /// Enumeration that creates a type name for the storage of persistent cookies. + /// + public enum CookiePersistentStorage + { + Text, /* Cookies are stored in a text file in the Mozilla "cookies.txt" format */ + SqlLite /* Cookies are stored in a SQLite file in the current Mozilla format. */ + } + + public class CookieManager + { + private IntPtr _handle; + + internal CookieManager(IntPtr handle) + { + _handle = handle; + } + + /// + /// Sets the cookie acceptance policy. + /// + /// + /// By default, only cookies set by the main document loaded are accepted. + /// + /// The cookie acceptance policy + public void SetCookieAcceptPolicy(CookieAcceptPolicy policy) + { + Interop.ChromiumEwk.ewk_cookie_manager_accept_policy_set(_handle, (Interop.ChromiumEwk.CookieAcceptPolicy)policy); + } + + /// + /// Deletes all the cookies. + /// + public void ClearCookies() + { + Interop.ChromiumEwk.ewk_cookie_manager_cookies_clear(_handle); + } + + /// + /// Sets the storage where non-session cookies are stored persistently to read/write the cookies. + /// + /// + /// http://tizen.org/privilege/mediastorage + /// http://tizen.org/privilege/externalstorage + /// + /// The path where to read/write Cookies + /// The type of storage + public void SetPersistentStorage(string path, CookiePersistentStorage storage) + { + Interop.ChromiumEwk.ewk_cookie_manager_persistent_storage_set(_handle, path, (Interop.ChromiumEwk.CookiePersistentStorage)storage); + } + } +} diff --git a/src/Tizen.WebView/Tizen.WebView/JavaScriptMessage.cs b/src/Tizen.WebView/Tizen.WebView/JavaScriptMessage.cs new file mode 100644 index 0000000..3b9c555 --- /dev/null +++ b/src/Tizen.WebView/Tizen.WebView/JavaScriptMessage.cs @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.InteropServices; +using System.Text; + +namespace Tizen.WebView +{ + public delegate void JavaScriptMessageHandler(JavaScriptMessage message); + + /// + /// A Script message contains information that sent from JavaScript runtime. + /// + public class JavaScriptMessage + { + private string _name; + private IntPtr _body; + + internal JavaScriptMessage(Interop.ChromiumEwk.ScriptMessage message) + { + _name = Marshal.PtrToStringAnsi(message.name); + _body = message.body; + } + + /// + /// Obect name in JavaScript. + /// + public string Name + { + get + { + return _name; + } + } + + /// + /// Gets the value of body as integer type. + /// + /// The value of body as integer type + public int GetBodyAsInteger() + { + if (_body == IntPtr.Zero) + { + return 0; + } + return Marshal.ReadInt32(_body, 0); + } + + /// + /// Gets the value of body as double type. + /// + /// The value of body as double type + public double GetBodyAsDouble() + { + if (_body == IntPtr.Zero) + { + return 0d; + } + double[] ret = new double[1] ; + Marshal.Copy(_body, ret, 0, 1); + return ret[0]; + } + + /// + /// Gets the value of body as boolean type. + /// + /// The value of body as boolean type + public bool GetBodyAsBoolean() + { + if (_body == IntPtr.Zero) + { + return false; + } + return Marshal.ReadByte(_body) != (byte)0; + } + + /// + /// Gets the value of body as string type. + /// + /// The value of body as string type + public string GetBodyAsString() + { + if (_body == IntPtr.Zero) + { + return string.Empty; + } + return Marshal.PtrToStringAnsi(_body); + } + } +} diff --git a/src/Tizen.WebView/Tizen.WebView/Settings.cs b/src/Tizen.WebView/Tizen.WebView/Settings.cs new file mode 100644 index 0000000..083e773 --- /dev/null +++ b/src/Tizen.WebView/Tizen.WebView/Settings.cs @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; + +namespace Tizen.WebView +{ + public class Settings + { + private IntPtr _handle; + + internal Settings(IntPtr handle) + { + _handle = handle; + } + + /// + /// Whether JavaScript can be executable. + /// + public bool JavaScriptEnabled + { + get + { + return Interop.ChromiumEwk.ewk_settings_javascript_enabled_get(_handle); + } + + set + { + Interop.ChromiumEwk.ewk_settings_javascript_enabled_set(_handle, value); + } + } + + /// + /// Whether images can be loaded automatically. + /// + public bool LoadImageAutomatically + { + get + { + return Interop.ChromiumEwk.ewk_settings_loads_images_automatically_get(_handle); + } + + set + { + Interop.ChromiumEwk.ewk_settings_loads_images_automatically_set(_handle, value); + } + } + + /// + /// The default text encoding name. + /// + public string DefaultTextEncodingName + { + get + { + return Interop.ChromiumEwk.ewk_settings_default_text_encoding_name_get(_handle); + } + + set + { + Interop.ChromiumEwk.ewk_settings_default_text_encoding_name_set(_handle, value); + } + } + + /// + /// The default font size of a pixel. + /// + public int DefaultFontSize + { + get + { + return Interop.ChromiumEwk.ewk_settings_default_font_size_get(_handle); + } + + set + { + Interop.ChromiumEwk.ewk_settings_default_font_size_set(_handle, value); + } + } + } +} diff --git a/src/Tizen.WebView/Tizen.WebView/SmartCallbackArgs.cs b/src/Tizen.WebView/Tizen.WebView/SmartCallbackArgs.cs new file mode 100644 index 0000000..9da498f --- /dev/null +++ b/src/Tizen.WebView/Tizen.WebView/SmartCallbackArgs.cs @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.InteropServices; + +namespace Tizen.WebView +{ + /// + /// Argument from the SmartCallback. + /// + public class SmartCallbackArgs : EventArgs + { + private IntPtr _arg; + + internal SmartCallbackArgs(IntPtr arg) + { + _arg = arg; + } + + /// + /// Gets argument as integer type. + /// + /// Argument as integer type + public int GetAsInteger() + { + if (_arg == IntPtr.Zero) + { + return 0; + } + return Marshal.ReadInt32(_arg, 0); + } + + /// + /// Gets argument as double type. + /// + /// Argument as double type + public double GetAsDouble() + { + if (_arg == IntPtr.Zero) + { + return 0d; + } + double[] ret = new double[1]; + Marshal.Copy(_arg, ret, 0, 1); + return ret[0]; + } + + /// + /// Gets argument as boolean type. + /// + /// Argument as boolean type + public bool GetAsBoolean() + { + if (_arg == IntPtr.Zero) + { + return false; + } + return Marshal.ReadByte(_arg) != (byte)0; + } + + /// + /// Gets argument as string type. + /// + /// Argument as string type + public string GetAsString() + { + if (_arg == IntPtr.Zero) + { + return string.Empty; + } + return Marshal.PtrToStringAnsi(_arg); + } + + internal static SmartCallbackArgs CreateFromSmartEvent(IntPtr data, IntPtr obj, IntPtr info) + { + return new SmartCallbackArgs(info); + } + } +} diff --git a/src/Tizen.WebView/Tizen.WebView/SmartCallbackLoadErrorArgs.cs b/src/Tizen.WebView/Tizen.WebView/SmartCallbackLoadErrorArgs.cs new file mode 100644 index 0000000..8ade295 --- /dev/null +++ b/src/Tizen.WebView/Tizen.WebView/SmartCallbackLoadErrorArgs.cs @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.InteropServices; + +namespace Tizen.WebView +{ + /// + /// Enumeration that provides an option to error codes. + /// + public enum LoadErrorCode + { + /// + /// Unknown + /// + Unknown = 0, + /// + /// User canceled + /// + Canceled, + /// + /// Can't show page for this MIME Type + /// + CantSupportMimetype, + /// + /// File IO error + /// + FailedFileIo, + /// + /// Cannot connect to network + /// + CantConnect, + /// + /// Fail to look up host from DNS + /// + CantLookupHost, + /// + /// Fail to SSL/TLS handshake + /// + FailedTlsHandshake, + /// + /// Received certificate is invalid + /// + InvalidCertificate, + /// + /// Connection timeout + /// + RequestTimeout, + /// + /// Too many redirects + /// + TooManyRedirects, + /// + /// Too many requests during this load + /// + TooManyRequests, + /// + /// Malformed url + /// + BadUrl, + /// + /// Unsupported scheme + /// + UnsupportedScheme, + /// + /// User authentication failed on server + /// + Authentication, + /// + /// Web server has internal server error + /// + InternalServer, + } + + /// + /// Argument from the LoadError SmartCallback. + /// + public class SmartCallbackLoadErrorArgs : EventArgs + { + IntPtr _handle; + + internal SmartCallbackLoadErrorArgs(IntPtr handle) + { + _handle = handle; + } + + /// + /// Failing URL for the error. + /// + public string Url + { + get + { + return Interop.ChromiumEwk.ewk_error_url_get(_handle); + } + } + + /// + /// The error code. + /// + public LoadErrorCode Code + { + get + { + return (LoadErrorCode)Interop.ChromiumEwk.ewk_error_code_get(_handle); + } + } + + /// + /// The description for the error. + /// + public string Description + { + get + { + return Interop.ChromiumEwk.ewk_error_description_get(_handle); + } + } + + /// + /// Whether the error should be treated as a cancellation. + /// + public bool Cancellation + { + get + { + return Interop.ChromiumEwk.ewk_error_cancellation_get(_handle); + } + } + + internal static SmartCallbackLoadErrorArgs CreateFromSmartEvent(IntPtr data, IntPtr obj, IntPtr info) + { + return new SmartCallbackLoadErrorArgs(info); + } + } +} diff --git a/src/Tizen.WebView/Tizen.WebView/WebView.cs b/src/Tizen.WebView/Tizen.WebView/WebView.cs new file mode 100644 index 0000000..6b9e751 --- /dev/null +++ b/src/Tizen.WebView/Tizen.WebView/WebView.cs @@ -0,0 +1,342 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using ElmSharp; +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace Tizen.WebView +{ + /// + /// A view used to render web contents. + /// + public class WebView: EvasObject + { + private static IDictionary _javaScriptMessageHandlerMap = new Dictionary(); + + private IntPtr _handle; + private IntPtr _realHandle; + private Context _context; + private Settings _settings; + + // focus dummy + private SmartEvent _focusIn; + private SmartEvent _focusOut; + + // Smart events + private SmartEvent _loadStarted; + private SmartEvent _loadFinished; + private SmartEvent _loadError; + private SmartEvent _titleChanged; + private SmartEvent _urlChanged; + + + + /// + /// Event that occurs when load started. + /// + public event EventHandler LoadStarted; + + /// + /// Event that occurs when load finished. + /// + public event EventHandler LoadFinished; + + /// + /// Event that occurs when load error. + /// + public event EventHandler LoadError; + + /// + /// Event that occurs when title of main frame was changed. + /// + public event EventHandler TitleChanged; + + /// + /// Event that occurs when URL of main frame was changed. + /// + public event EventHandler UrlChanged; + + /// + /// Current URL of the main frame. + /// + public string Url + { + get + { + return Interop.ChromiumEwk.ewk_view_url_get(_realHandle); + } + } + + /// + /// Current title of the main frame. + /// + public string Title + { + get + { + return Interop.ChromiumEwk.ewk_view_title_get(_realHandle); + } + } + + /// + /// Current user agent string of this view. + /// + public string UserAgent + { + get + { + return Interop.ChromiumEwk.ewk_view_user_agent_get(_realHandle); + } + + set + { + Interop.ChromiumEwk.ewk_view_user_agent_set(_realHandle, value); + } + } + + /// + /// Whether a view has the focus. + /// + public bool HasFocus + { + get + { + return Interop.ChromiumEwk.ewk_view_focus_get(_realHandle); + } + } + + /// + /// Create a WebView object. + /// + /// Parent object of WebView + public WebView(EvasObject parent) : base(parent) + { + InitializeSmartEvent(); + } + + /// + /// Gets the Context object of this view. + /// + /// The Context object of this view + public Context GetContext() + { + if (_context == null) + { + IntPtr contextHandle = Interop.ChromiumEwk.ewk_view_context_get(_realHandle); + if (contextHandle == IntPtr.Zero) + { + return null; + } + _context = new Context(contextHandle); + } + return _context; + } + + /// + /// Gets the Settings object of this view. + /// + /// The Settings object of this view + public Settings GetSettings() + { + if (_settings == null) + { + IntPtr settingsHandle = Interop.ChromiumEwk.ewk_view_settings_get(_realHandle); + if (settingsHandle == IntPtr.Zero) + { + return null; + } + _settings = new Settings(settingsHandle); + } + return _settings; + } + + /// + /// Asks the object to load the given URL. + /// + /// + /// You can only be sure that url changed after UrlChanged event. + /// + /// The uniform resource identifier to load + public void LoadUrl(string url) + { + Interop.ChromiumEwk.ewk_view_url_set(_realHandle, url); + } + + /// + /// Loads the specified html string as the content of the view. + /// + /// HTML data to load + /// Base URL used for relative paths to external objects + public void LoadHtml(string html, string baseUrl) + { + Interop.ChromiumEwk.ewk_view_html_string_load(_realHandle, html, baseUrl, null); + } + + /// + /// Asks the main frame to stop loading. + /// + public void StopLoading() + { + Interop.ChromiumEwk.ewk_view_stop(_realHandle); + } + + /// + /// Asks the main frame to reload the current document. + /// + public void Reload() + { + Interop.ChromiumEwk.ewk_view_reload(_realHandle); + } + + /// + /// Asks the main frame to navigate back in history. + /// + public void GoBack() + { + Interop.ChromiumEwk.ewk_view_back(_realHandle); + } + + /// + /// Asks the main frame to navigate forward in history. + /// + public void GoForward() + { + Interop.ChromiumEwk.ewk_view_forward(_realHandle); + } + + /// + /// Checks whether it is possible to navigate backwards one item in history. + /// + /// Whether it is possible to navigate backwards one item in history + public bool CanGoBack() + { + return Interop.ChromiumEwk.ewk_view_back_possible(_realHandle); + } + + /// + /// Checks whether it is possible to navigate forwards one item in history. + /// + /// Whether it is possible to navigate forwards one item in history + public bool CanGoForward() + { + return Interop.ChromiumEwk.ewk_view_forward_possible(_realHandle); + } + + /// + /// Injects the supplied javascript message handler into the view. + /// + /// The message callback + /// The name used to expose the object in JavaScript + /// 'true' on success, otherwise 'false' + public bool AddJavaScriptMessageHandler(string name, JavaScriptMessageHandler handler) + { + lock (_javaScriptMessageHandlerMap) + { + if (_javaScriptMessageHandlerMap.ContainsKey(name)) + { + return false; + } + _javaScriptMessageHandlerMap[name] = handler; + } + Interop.ChromiumEwk.ScriptMessageCallback callback = (handle, message) => + { + JavaScriptMessage convertedMessage = new JavaScriptMessage(message); + lock (_javaScriptMessageHandlerMap) + { + if (_javaScriptMessageHandlerMap.ContainsKey(convertedMessage.Name)) + { + _javaScriptMessageHandlerMap[convertedMessage.Name](convertedMessage); + } + } + }; + if (!Interop.ChromiumEwk.ewk_view_javascript_message_handler_add(_realHandle, callback, name)) + { + lock (_javaScriptMessageHandlerMap) + { + _javaScriptMessageHandlerMap.Remove(name); + return false; + } + } + return true; + } + + /// + /// Requests the execution of given name and result to the JavaScript runtime. + /// + /// The name used to expose the object in JavaScript + /// The result to the JavaScript runtime + public void EvalWithResult(string name, string result) + { + Interop.ChromiumEwk.ewk_view_evaluate_javascript(_realHandle, name, result); + } + + /// + /// Requests the execution of the given script. + /// + /// The JavaScript code string to execute + public void Eval(string script) + { + Interop.ChromiumEwk.ewk_view_script_execute(_realHandle, script, null, IntPtr.Zero); + } + + /// + /// Requests to set or unset a view as the currently focused one. + /// + /// 'true' to set the focus on the view, 'false' to remove the focus from the view + public void SetFocus(bool focused) + { + Interop.ChromiumEwk.ewk_view_focus_set(_realHandle, focused); + } + + protected override IntPtr CreateHandle(EvasObject parent) + { + // focus dummy + _handle = Interop.Elementary.elm_layout_add((IntPtr)parent); + Interop.Elementary.elm_layout_theme_set(_handle, "layout", "elm_widget", "default"); + Interop.Elementary.elm_object_focus_allow_set(_handle, true); + + IntPtr evas = Interop.Evas.evas_object_evas_get(parent); + _realHandle = Interop.ChromiumEwk.ewk_view_add(evas); + Interop.Elementary.elm_object_part_content_set(_handle, "elm.swallow.content", _realHandle); + + return _handle; + } + + private void InitializeSmartEvent() + { + // focus dummy + _focusIn = new SmartEvent(this, "focused"); + _focusOut = new SmartEvent(this, "unfocused"); + + _focusIn.On += (s, e) => { ((WebView)s).SetFocus(true); }; + _focusOut.On += (s, e) => { ((WebView)s).SetFocus(false); }; + + _loadStarted = new SmartEvent(this, _realHandle, "load,started"); + _loadFinished = new SmartEvent(this, _realHandle, "load,finished"); + _loadError = new SmartEvent(this, _realHandle, "load,error", SmartCallbackLoadErrorArgs.CreateFromSmartEvent); + _titleChanged = new SmartEvent(this, _realHandle, "title,changed", SmartCallbackArgs.CreateFromSmartEvent); + _urlChanged = new SmartEvent(this, _realHandle, "url,changed", SmartCallbackArgs.CreateFromSmartEvent); + + _loadStarted.On += (s, e) => { LoadStarted?.Invoke(this, EventArgs.Empty); }; + _loadFinished.On += (s, e) => { LoadFinished?.Invoke(this, EventArgs.Empty); }; + _loadError.On += (s, e) => { LoadError?.Invoke(this, e); }; + _titleChanged.On += (s, e) => { TitleChanged?.Invoke(this, e); }; + _urlChanged.On += (s, e) => { UrlChanged?.Invoke(this, e); }; + } + } +} diff --git a/test/Tizen.WebView.Test/Properties/AssemblyInfo.cs b/test/Tizen.WebView.Test/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..6200996 --- /dev/null +++ b/test/Tizen.WebView.Test/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Tizen.WebView.Test")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Samsung Electronics")] +[assembly: AssemblyProduct("Tizen.WebView.Test")] +[assembly: AssemblyCopyright("Copyright © Samsung Electronics 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b57dafa3-b566-4ebf-a6f0-ecd2224a748d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/test/Tizen.WebView.Test/SimpleWebviewApp.cs b/test/Tizen.WebView.Test/SimpleWebviewApp.cs new file mode 100644 index 0000000..ffa3eeb --- /dev/null +++ b/test/Tizen.WebView.Test/SimpleWebviewApp.cs @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using ElmSharp; +using Tizen.Applications; +using Tizen.WebView; + + +namespace Tizen.WebView.Test +{ + public class SimpleWebviewApp : CoreUIApplication + { + private const string LogTag = "WebViewApp"; + + private const string _windowName = "Simple WebView App"; + private const string _defaultUrl = "http://www.google.com"; + private WebView _webview; + private Entry _addressEntry; + private Button _reloadButton; + + public SimpleWebviewApp() + { + + } + + protected override void OnCreate() + { + base.OnCreate(); + Chromium.Initialize(); + // Create webview and toolbox + CreateUI(); + } + + protected override void OnTerminate() + { + Chromium.Shutdown(); + base.OnTerminate(); + } + + private void CreateUI() + { + // Create Window + Window window = new Window(_windowName); + window.Show(); + + // Create Box for main window + Box mainBox = CreateBaseUI(window); + + // Create top bar + Box topBar = CreateTopBar(window); + + // Create Webview + _webview = new WebView(window) + { + AlignmentX = -1, + AlignmentY = -1, + WeightX = 1, + WeightY = 1 + }; + _webview.Show(); + + // Create bottom bar + Box bottomBar = CreateBottomBar(window); + + mainBox.PackEnd(topBar); + mainBox.PackEnd(_webview); + mainBox.PackEnd(bottomBar); + + InitializeWebView(); + + // Load default URL + _webview.LoadUrl(_defaultUrl); + } + + private Box CreateBaseUI(Window window) + { + // Create Background + Background background = new Background(window) + { + AlignmentX = -1, + AlignmentY = -1, + WeightX = 1, + WeightY = 1, + Color = Color.White + }; + background.Show(); + window.AddResizeObject(background); + + // Create Conformant + Conformant conformant = new Conformant(window); + conformant.Show(); + + // Create Box for all contents + Box box = new Box(window) + { + AlignmentX = -1, + AlignmentY = -1, + WeightX = 1, + WeightY = 1 + }; + box.Show(); + conformant.SetContent(box); + + return box; + } + + private Box CreateTopBar(Window window) + { + // Create Box for address bar + Box topBar = new Box(window) + { + AlignmentX = -1, + AlignmentY = 0, + WeightX = 1, + WeightY = 0, + IsHorizontal = true + }; + topBar.Show(); + + // Create address entry + _addressEntry = new Entry(window) + { + AlignmentX = -1, + AlignmentY = -1, + WeightX = 1, + WeightY = 1, + IsSingleLine = true, + Scrollable = true, + Text = _defaultUrl + }; + _addressEntry.SetInputPanelLayout(InputPanelLayout.Url); + _addressEntry.Activated += (s, e) => + { + _webview.LoadUrl(((Entry)s).Text); + }; + _addressEntry.Show(); + + // Create reload button + _reloadButton = new Button(window) + { + AlignmentX = -1, + AlignmentY = -1, + WeightX = 0.3, + WeightY = 1, + Text = "Reload" + }; + _reloadButton.Clicked += (s, e) => + { + if (_reloadButton.Text.Equals("Reload")) + { + _webview.Reload(); + } + else if (_reloadButton.Text.Equals("Stop")) + { + _webview.StopLoading(); + } + }; + _reloadButton.Show(); + + topBar.PackEnd(_addressEntry); + topBar.PackEnd(_reloadButton); + + return topBar; + } + + private Box CreateBottomBar(Window window) + { + // Create Box for bottom bar + Box bottomBar = new Box(window) + { + AlignmentX = -1, + AlignmentY = 1, + WeightX = 1, + WeightY = 0, + IsHorizontal = true + }; + bottomBar.Show(); + + // Create back/forward buttons + Button backButton = new Button(window) + { + AlignmentX = -1, + AlignmentY = 0.5, + WeightX = 1, + WeightY = 1, + Text = "Back" + + }; + backButton.Clicked += (s, e) => + { + if (_webview.CanGoBack()) + _webview.GoBack(); + }; + backButton.Show(); + + Button forwardButton = new Button(window) + { + AlignmentX = -1, + AlignmentY = 0.5, + WeightX = 1, + WeightY = 1, + Text = "Forward" + + }; + forwardButton.Clicked += (s, e) => + { + if (_webview.CanGoForward()) + _webview.GoForward(); + }; + forwardButton.Show(); + + bottomBar.PackEnd(backButton); + bottomBar.PackEnd(forwardButton); + + return bottomBar; + } + + private void InitializeWebView() + { + _webview.LoadStarted += (s, e) => + { + Log.Info(LogTag, "Load started"); + _reloadButton.Text = "Stop"; + }; + + _webview.LoadFinished += (s, e) => + { + Log.Info(LogTag, "Load finished"); + _reloadButton.Text = "Reload"; + }; + + _webview.LoadError += (s, e) => + { + Log.Info(LogTag, "Load error(" + e.Code + "): " + e.Description); + }; + + _webview.UrlChanged += (s, e) => + { + Log.Info(LogTag, "Url changed: " + e.GetAsString()); + _addressEntry.Text = e.GetAsString(); + }; + + CookieManager cookieManager = _webview.GetContext().GetCookieManager(); + if (cookieManager != null) + { + cookieManager.SetCookieAcceptPolicy(CookieAcceptPolicy.Always); + cookieManager.SetPersistentStorage(DirectoryInfo.Data, CookiePersistentStorage.SqlLite); + } + } + + static void Main(string[] args) + { + Elementary.Initialize(); + Elementary.ThemeOverlay(); + + SimpleWebviewApp app = new Test.SimpleWebviewApp(); + app.Run(args); + } + } +} diff --git a/test/Tizen.WebView.Test/Tizen.WebView.Test.csproj b/test/Tizen.WebView.Test/Tizen.WebView.Test.csproj new file mode 100755 index 0000000..9a6ebb1 --- /dev/null +++ b/test/Tizen.WebView.Test/Tizen.WebView.Test.csproj @@ -0,0 +1,98 @@ + + + + 14.0 + Debug + AnyCPU + 8.0.30703 + 2.0 + {2F98DAC9-6F16-457B-AED7-D43CAC379341};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + {B57DAFA3-B566-4EBF-A6F0-ECD2224A748D} + Exe + Properties + Tizen.WebView.Test + Tizen.WebView.Test + 512 + en-US + + + DNXCore + v5.0 + false + .NETCoreApp,Version=v1.0 + true + $(NoWarn);1701 + false + + + true + full + true + bin\Debug\ + DEBUG;TRACE + prompt + 4 + ;1701;1702 + true + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + true + ;1701;1702 + true + + + + + + + + + + + + + + + + + {8405e84f-b920-4aac-9ad5-001b9debc9ca} + Tizen.WebView + + + + + + + + <_TargetFrameworkDirectories>$(MSBuildThisFileDirectory) + <_FullFrameworkReferenceAssemblyPaths>$(MSBuildThisFileDirectory) + true + + + + + + + + + + + + diff --git a/test/Tizen.WebView.Test/Tizen.WebView.Test.project.json b/test/Tizen.WebView.Test/Tizen.WebView.Test.project.json new file mode 100644 index 0000000..8de2d93 --- /dev/null +++ b/test/Tizen.WebView.Test/Tizen.WebView.Test.project.json @@ -0,0 +1,14 @@ +{ + "dependencies": { + "ElmSharp": "1.1.0-*", + "Microsoft.NETCore.App": "1.0.0", + "Tizen": "1.0.2", + "Tizen.Applications": "1.2.0" + }, + "frameworks": { + "netcoreapp1.0": {} + }, + "runtimes": { + "win": {} + } +} diff --git a/test/Tizen.WebView.Test/shared/res/Tizen.WebView.Test.png b/test/Tizen.WebView.Test/shared/res/Tizen.WebView.Test.png new file mode 100644 index 0000000..9765b1b Binary files /dev/null and b/test/Tizen.WebView.Test/shared/res/Tizen.WebView.Test.png differ diff --git a/test/Tizen.WebView.Test/tizen-manifest.xml b/test/Tizen.WebView.Test/tizen-manifest.xml new file mode 100644 index 0000000..513985e --- /dev/null +++ b/test/Tizen.WebView.Test/tizen-manifest.xml @@ -0,0 +1,19 @@ + + + + + Tizen.WebView.Test.png + + + + http://tizen.org/privilege/mediastorage + http://tizen.org/privilege/externalstorage + http://tizen.org/privilege/network.get + http://tizen.org/privilege/internet + +