From fd7c3f162c07ba69c2936ca53f603dfba0b89584 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Fri, 18 Sep 2026 17:57:44 +0900 Subject: [PATCH] [flutter_inappwebview] Use wrapper API --- packages/flutter_inappwebview/CHANGELOG.md | 1 + .../tizen/inc/ftpw_flutter_inappwebview.h | 300 +++++++++++++++ .../aarch64/libftpw_flutter_inappwebview.so | Bin 0 -> 45880 bytes .../lib/armel/libftpw_flutter_inappwebview.so | Bin 0 -> 27396 bytes .../lib/i586/libftpw_flutter_inappwebview.so | Bin 0 -> 39704 bytes .../x86_64/libftpw_flutter_inappwebview.so | Bin 0 -> 41880 bytes .../tizen/project_def.prop | 4 + .../tizen/src/ewk_internal_api_binding.cc | 134 ------- .../tizen/src/ewk_internal_api_binding.h | 176 --------- .../tizen/src/ewk_webview_backend.cc | 96 +++-- .../tizen/src/ewk_webview_backend.h | 10 +- .../tizen/src/webview_backend_factory.cc | 14 - .../tizen/src/wv_internal_api_binding.cc | 204 ---------- .../tizen/src/wv_internal_api_binding.h | 347 ----------------- .../tizen/src/wv_webview_backend.cc | 350 +++++++++--------- .../tizen/src/wv_webview_backend.h | 36 +- 16 files changed, 546 insertions(+), 1126 deletions(-) create mode 100644 packages/flutter_inappwebview/tizen/inc/ftpw_flutter_inappwebview.h create mode 100755 packages/flutter_inappwebview/tizen/lib/aarch64/libftpw_flutter_inappwebview.so create mode 100755 packages/flutter_inappwebview/tizen/lib/armel/libftpw_flutter_inappwebview.so create mode 100755 packages/flutter_inappwebview/tizen/lib/i586/libftpw_flutter_inappwebview.so create mode 100755 packages/flutter_inappwebview/tizen/lib/x86_64/libftpw_flutter_inappwebview.so delete mode 100644 packages/flutter_inappwebview/tizen/src/ewk_internal_api_binding.cc delete mode 100644 packages/flutter_inappwebview/tizen/src/ewk_internal_api_binding.h delete mode 100644 packages/flutter_inappwebview/tizen/src/wv_internal_api_binding.cc delete mode 100644 packages/flutter_inappwebview/tizen/src/wv_internal_api_binding.h diff --git a/packages/flutter_inappwebview/CHANGELOG.md b/packages/flutter_inappwebview/CHANGELOG.md index eaacca998..96b137659 100644 --- a/packages/flutter_inappwebview/CHANGELOG.md +++ b/packages/flutter_inappwebview/CHANGELOG.md @@ -1,5 +1,6 @@ ## 0.3.0 +- Use wrapper APIs for the EWK and WV backends. - Move the native web engine code behind a `WebViewBackend` interface. - Add an experimental WV API backend with EWK-wrapper and standalone modes. - Select EWK through Tizen 10.0, WV EWK-wrapper mode on Tizen 10.1, and WV standalone mode from Tizen 11.0. diff --git a/packages/flutter_inappwebview/tizen/inc/ftpw_flutter_inappwebview.h b/packages/flutter_inappwebview/tizen/inc/ftpw_flutter_inappwebview.h new file mode 100644 index 000000000..8b343f2a0 --- /dev/null +++ b/packages/flutter_inappwebview/tizen/inc/ftpw_flutter_inappwebview.h @@ -0,0 +1,300 @@ +// Copyright 2026 Samsung Electronics Co., Ltd. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef FLUTTER_TIZEN_PLUGINS_WRAPPER_FLUTTER_INAPPWEBVIEW_H_ +#define FLUTTER_TIZEN_PLUGINS_WRAPPER_FLUTTER_INAPPWEBVIEW_H_ + +#include + +typedef enum { + EWK_TOUCH_START, + EWK_TOUCH_MOVE, + EWK_TOUCH_END +} Ewk_Touch_Event_Type; + +typedef struct _Ewk_Touch_Point Ewk_Touch_Point; + +typedef enum { + EWK_MOUSE_BUTTON_LEFT = 1, + EWK_MOUSE_BUTTON_MIDDLE = 2, + EWK_MOUSE_BUTTON_RIGHT = 3 +} Ewk_Mouse_Button_Type; + +struct _Ewk_Touch_Point { + int id; + int x; + int y; + int state; +}; + +typedef unsigned char (*Ewk_View_JavaScript_Alert_Callback)( + void* o, const char* alert_text, void* user_data); +typedef unsigned char (*Ewk_View_JavaScript_Confirm_Callback)( + void* o, const char* message, void* user_data); +typedef unsigned char (*Ewk_View_JavaScript_Prompt_Callback)( + void* o, const char* message, const char* default_value, void* user_data); + +typedef enum { + EWK_CONSOLE_MESSAGE_LEVEL_NULL, + EWK_CONSOLE_MESSAGE_LEVEL_LOG, + EWK_CONSOLE_MESSAGE_LEVEL_WARNING, + EWK_CONSOLE_MESSAGE_LEVEL_ERROR, + EWK_CONSOLE_MESSAGE_LEVEL_DEBUG, + EWK_CONSOLE_MESSAGE_LEVEL_INFO, +} Ewk_Console_Message_Level; + +typedef enum { + WV_HTTP_METHOD_GET, + WV_HTTP_METHOD_HEAD, + WV_HTTP_METHOD_POST, + WV_HTTP_METHOD_PUT, + WV_HTTP_METHOD_DELETE, +} wv_http_method_e; + +typedef enum { + WV_CACHE_MODEL_DOCUMENT_VIEWER, + WV_CACHE_MODEL_DOCUMENT_BROWSER, + WV_CACHE_MODEL_PRIMARY_WEBBROWSER +} wv_cache_model_e; + +typedef enum { + WV_TOUCH_EVENT_START, + WV_TOUCH_EVENT_MOVE, + WV_TOUCH_EVENT_END, + WV_TOUCH_EVENT_CANCEL +} wv_touch_event_type_e; + +typedef enum { + WV_TOUCH_POINT_STATE_DOWN, + WV_TOUCH_POINT_STATE_UP, + WV_TOUCH_POINT_STATE_MOVE, + WV_TOUCH_POINT_STATE_STILL, + WV_TOUCH_POINT_STATE_CANCEL +} wv_touch_point_state_e; + +typedef enum { + WV_MODIFIER_NONE = 0, + WV_MODIFIER_SHIFT = 1 << 0, + WV_MODIFIER_CONTROL = 1 << 1, + WV_MODIFIER_ALT = 1 << 2, + WV_MODIFIER_SUPER = 1 << 3, + WV_MODIFIER_HYPER = 1 << 4, + WV_MODIFIER_CAPS_LOCK = 1 << 5, + WV_MODIFIER_NUM_LOCK = 1 << 6 +} wv_modifier_e; + +typedef enum { + WV_MOUSE_BUTTON_LEFT = 1, + WV_MOUSE_BUTTON_MIDDLE = 2, + WV_MOUSE_BUTTON_RIGHT = 3 +} wv_mouse_button_type_e; + +typedef enum { + WV_COOKIE_ACCEPT_POLICY_ALWAYS, + WV_COOKIE_ACCEPT_POLICY_NEVER, + WV_COOKIE_ACCEPT_POLICY_NO_THIRD_PARTY +} wv_cookie_accept_policy_e; + +typedef enum { + WV_CONSOLE_MESSAGE_LEVEL_NULL, + WV_CONSOLE_MESSAGE_LEVEL_LOG, + WV_CONSOLE_MESSAGE_LEVEL_WARNING, + WV_CONSOLE_MESSAGE_LEVEL_ERROR, + WV_CONSOLE_MESSAGE_LEVEL_DEBUG, + WV_CONSOLE_MESSAGE_LEVEL_INFO +} wv_console_message_level_e; + +typedef struct { + int id; + int x; + int y; + wv_touch_point_state_e state; +} wv_touch_point_s; + +typedef struct { + const char* key_name; + const char* key; + const char* string; + const char* compose; + unsigned int timestamp; + wv_modifier_e modifiers; + int event_flags; + unsigned int key_code; + const char* device_name; +} wv_key_event_s; + +typedef void (*wv_view_cb)(void* obj, void* event_info, void* user_data); +typedef void (*wv_view_script_execute_cb)(void* view, const char* result_value, + void* user_data); +typedef bool (*wv_view_javascript_alert_cb)(void* view, const char* alert_text, + void* user_data); +typedef bool (*wv_view_javascript_confirm_cb)(void* view, const char* message, + void* user_data); +typedef bool (*wv_view_javascript_prompt_cb)(void* view, const char* message, + const char* default_value, + void* user_data); + +#ifdef __cplusplus +extern "C" { +#endif + +unsigned char ftpw_flutter_inappwebview_ewk_view_bg_color_set(void* obj, int r, + int g, int b, + int a); +unsigned char ftpw_flutter_inappwebview_ewk_view_touch_events_enabled_set( + void* view, unsigned char enabled); +unsigned char ftpw_flutter_inappwebview_ewk_view_feed_touch_event( + void* obj, Ewk_Touch_Event_Type type, const void* points, + const void* modifiers); +unsigned char ftpw_flutter_inappwebview_ewk_view_mouse_events_enabled_set( + void* view, unsigned char enabled); +unsigned char ftpw_flutter_inappwebview_ewk_view_feed_mouse_down( + void* obj, Ewk_Mouse_Button_Type button, int x, int y); +unsigned char ftpw_flutter_inappwebview_ewk_view_feed_mouse_up( + void* obj, Ewk_Mouse_Button_Type button, int x, int y); +unsigned char ftpw_flutter_inappwebview_ewk_view_feed_mouse_wheel( + void* obj, unsigned char y_direction, int step, int x, int y); +unsigned char ftpw_flutter_inappwebview_ewk_view_send_key_event( + void* obj, void* key_event, unsigned char is_press); +void ftpw_flutter_inappwebview_ewk_view_offscreen_rendering_enabled_set( + void* obj, unsigned char enabled); +void ftpw_flutter_inappwebview_ewk_view_ime_window_set(void* obj, void* window); +unsigned char ftpw_flutter_inappwebview_ewk_view_key_events_enabled_set( + void* obj, unsigned char enabled); +unsigned char ftpw_flutter_inappwebview_ewk_view_set_support_video_hole( + void* obj, void* window, unsigned char enabled, unsigned char is_supported); +void ftpw_flutter_inappwebview_ewk_view_javascript_alert_callback_set( + void* o, Ewk_View_JavaScript_Alert_Callback callback, void* user_data); +void ftpw_flutter_inappwebview_ewk_view_javascript_confirm_callback_set( + void* o, Ewk_View_JavaScript_Confirm_Callback callback, void* user_data); +void ftpw_flutter_inappwebview_ewk_view_javascript_prompt_callback_set( + void* o, Ewk_View_JavaScript_Prompt_Callback callback, void* user_data); +void ftpw_flutter_inappwebview_ewk_view_javascript_alert_reply(void* o); +void ftpw_flutter_inappwebview_ewk_view_javascript_confirm_reply( + void* o, unsigned char result); +void ftpw_flutter_inappwebview_ewk_view_javascript_prompt_reply( + void* o, const char* result); +void ftpw_flutter_inappwebview_ewk_set_arguments(int argc, char** argv); +void ftpw_flutter_inappwebview_ewk_settings_ime_panel_enabled_set( + void* settings, unsigned char enabled); +void ftpw_flutter_inappwebview_ewk_settings_force_zoom_set( + void* settings, unsigned char enable); +Ewk_Console_Message_Level +ftpw_flutter_inappwebview_ewk_console_message_level_get(const void* message); +const char* ftpw_flutter_inappwebview_ewk_console_message_text_get( + const void* message); + +int ftpw_flutter_inappwebview_wv_init(void); +int ftpw_flutter_inappwebview_wv_shutdown(void); +int ftpw_flutter_inappwebview_wv_set_arguments(int argc, const char** argv); +void* ftpw_flutter_inappwebview_wv_view_create(void); +void ftpw_flutter_inappwebview_wv_view_destroy(void* view); +void ftpw_flutter_inappwebview_wv_view_resize(void* view, int w, int h); +bool ftpw_flutter_inappwebview_wv_view_focus_set(void* view, int focused); +bool ftpw_flutter_inappwebview_wv_view_url_set(void* view, const char* url); +const char* ftpw_flutter_inappwebview_wv_view_url_get(void* view); +bool ftpw_flutter_inappwebview_wv_view_url_request_set(void* view, + const char* url, + wv_http_method_e method, + void* headers, + const char* body); +bool ftpw_flutter_inappwebview_wv_view_html_string_load( + void* view, const char* html, const char* base_url, + const char* unreachable_url); +bool ftpw_flutter_inappwebview_wv_view_back_possible(void* view); +bool ftpw_flutter_inappwebview_wv_view_forward_possible(void* view); +bool ftpw_flutter_inappwebview_wv_view_back(void* view); +bool ftpw_flutter_inappwebview_wv_view_forward(void* view); +bool ftpw_flutter_inappwebview_wv_view_reload(void* view); +bool ftpw_flutter_inappwebview_wv_view_stop(void* view); +void ftpw_flutter_inappwebview_wv_view_suspend(void* view); +void ftpw_flutter_inappwebview_wv_view_resume(void* view); +const char* ftpw_flutter_inappwebview_wv_view_title_get(void* view); +double ftpw_flutter_inappwebview_wv_view_load_progress_get(void* view); +bool ftpw_flutter_inappwebview_wv_view_scale_set(void* view, + double scale_factor, int cx, + int cy); +double ftpw_flutter_inappwebview_wv_view_scale_get(void* view); +bool ftpw_flutter_inappwebview_wv_view_user_agent_set(void* view, + const char* user_agent); +const char* ftpw_flutter_inappwebview_wv_view_user_agent_get(void* view); +bool ftpw_flutter_inappwebview_wv_view_scroll_set(void* view, int x, int y); +bool ftpw_flutter_inappwebview_wv_view_scroll_pos_get(void* view, int* x, + int* y); +bool ftpw_flutter_inappwebview_wv_view_script_execute( + void* view, const char* script, wv_view_script_execute_cb callback, + void* user_data); +bool ftpw_flutter_inappwebview_wv_view_bg_color_set(void* view, int r, int g, + int b, int a); +void* ftpw_flutter_inappwebview_wv_view_context_get(void* view); +void* ftpw_flutter_inappwebview_wv_view_settings_get(void* view); +bool ftpw_flutter_inappwebview_wv_view_feed_touch_event( + void* view, wv_touch_event_type_e event_type, void* points, + wv_modifier_e modifiers); +int ftpw_flutter_inappwebview_wv_view_feed_mouse_down( + void* view, wv_mouse_button_type_e button, int x, int y); +int ftpw_flutter_inappwebview_wv_view_feed_mouse_up( + void* view, wv_mouse_button_type_e button, int x, int y); +int ftpw_flutter_inappwebview_wv_view_feed_mouse_wheel(void* view, + bool y_direction, + int step, int x, int y); +bool ftpw_flutter_inappwebview_wv_view_send_key_event( + void* view, const wv_key_event_s* key_event, int is_press); +bool ftpw_flutter_inappwebview_wv_view_touch_events_enabled_set(void* view, + int enabled); +bool ftpw_flutter_inappwebview_wv_view_mouse_events_enabled_set(void* view, + bool enabled); +bool ftpw_flutter_inappwebview_wv_view_key_events_enabled_set(void* view, + bool enabled); +void ftpw_flutter_inappwebview_wv_view_ime_window_set(void* view, void* window); +int ftpw_flutter_inappwebview_wv_view_add_cb(void* view, const char* event, + wv_view_cb func, + const void* user_data); +int ftpw_flutter_inappwebview_wv_view_remove_full_cb(void* view, + const char* event, + wv_view_cb func, + const void* user_data); +int ftpw_flutter_inappwebview_wv_view_javascript_alert_callback_set( + void* view, wv_view_javascript_alert_cb callback, void* user_data); +int ftpw_flutter_inappwebview_wv_view_javascript_confirm_callback_set( + void* view, wv_view_javascript_confirm_cb callback, void* user_data); +int ftpw_flutter_inappwebview_wv_view_javascript_prompt_callback_set( + void* view, wv_view_javascript_prompt_cb callback, void* user_data); +void ftpw_flutter_inappwebview_wv_view_javascript_alert_reply(void* view); +void ftpw_flutter_inappwebview_wv_view_javascript_confirm_reply(void* view, + bool result); +void ftpw_flutter_inappwebview_wv_view_javascript_prompt_reply( + void* view, const char* result); +bool ftpw_flutter_inappwebview_wv_view_set_support_video_hole( + void* view, void* window, bool enable, bool is_video_window); +bool ftpw_flutter_inappwebview_wv_view_main_frame_scrollbar_visible_set( + void* view, bool visible); +void* ftpw_flutter_inappwebview_wv_context_cookie_manager_get(void* context); +bool ftpw_flutter_inappwebview_wv_context_cache_model_set( + void* context, wv_cache_model_e model); +bool ftpw_flutter_inappwebview_wv_context_cache_clear(void* context); +void ftpw_flutter_inappwebview_wv_cookie_manager_accept_policy_set( + void* manager, wv_cookie_accept_policy_e policy); +void ftpw_flutter_inappwebview_wv_cookie_manager_cookies_clear(void* manager); +bool ftpw_flutter_inappwebview_wv_settings_javascript_enabled_set( + void* settings, bool enable); +void ftpw_flutter_inappwebview_wv_settings_ime_panel_enabled_set(void* settings, + bool enable); +bool ftpw_flutter_inappwebview_wv_settings_force_zoom_set(void* settings, + bool enable); +int ftpw_flutter_inappwebview_wv_error_code_get(void* error); +const char* ftpw_flutter_inappwebview_wv_error_description_get(void* error); +const char* ftpw_flutter_inappwebview_wv_error_url_get(void* error); +bool ftpw_flutter_inappwebview_wv_policy_decision_use(void* policy_decision); +const char* ftpw_flutter_inappwebview_wv_policy_decision_url_get( + void* policy_decision); +wv_console_message_level_e +ftpw_flutter_inappwebview_wv_console_message_level_get(void* message); +const char* ftpw_flutter_inappwebview_wv_console_message_text_get( + void* message); + +#ifdef __cplusplus +} +#endif + +#endif // FLUTTER_TIZEN_PLUGINS_WRAPPER_FLUTTER_INAPPWEBVIEW_H_ diff --git a/packages/flutter_inappwebview/tizen/lib/aarch64/libftpw_flutter_inappwebview.so b/packages/flutter_inappwebview/tizen/lib/aarch64/libftpw_flutter_inappwebview.so new file mode 100755 index 0000000000000000000000000000000000000000..40fbbc1a45de1d3a772b4474093e2a73595dfe91 GIT binary patch literal 45880 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 literal 0 HcmV?d00001 diff --git a/packages/flutter_inappwebview/tizen/lib/armel/libftpw_flutter_inappwebview.so b/packages/flutter_inappwebview/tizen/lib/armel/libftpw_flutter_inappwebview.so new file mode 100755 index 0000000000000000000000000000000000000000..c68a9dc8c33fb4c9f92193d109c256cce7b05a25 GIT binary patch literal 27396 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 CsQi2Y literal 0 HcmV?d00001 diff --git a/packages/flutter_inappwebview/tizen/lib/i586/libftpw_flutter_inappwebview.so b/packages/flutter_inappwebview/tizen/lib/i586/libftpw_flutter_inappwebview.so new file mode 100755 index 0000000000000000000000000000000000000000..29e8a75ef35b110dc5d19bffd967ceb9de474a6f GIT binary patch literal 39704 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 - -#include "log.h" - -namespace { - -template -T ResolveEwkSymbol(void* handle, const char* symbol) { - dlerror(); - void* value = dlsym(handle, symbol); - const char* error = dlerror(); - if (error || !value) { - LOG_ERROR("Failed to resolve EWK symbol %s: %s", symbol, - error ? error : "not found"); - return nullptr; - } - return reinterpret_cast(value); -} - -} // namespace - -EwkInternalApiBinding::EwkInternalApiBinding() { - handle_ = dlopen("libchromium-ewk.so", RTLD_LAZY); - if (!handle_) { - const char* error = dlerror(); - LOG_ERROR("Failed to open libchromium-ewk.so: %s", - error ? error : "unknown error"); - } -} - -EwkInternalApiBinding::~EwkInternalApiBinding() { - if (handle_) { - dlclose(handle_); - } -} - -bool EwkInternalApiBinding::Initialize() { - if (initialize_result_.has_value()) { - return *initialize_result_; - } - - if (!handle_) { - LOG_ERROR( - "EWK internal API binding was initialized without a library handle."); - initialize_result_ = false; - return false; - } - - // ewk_view - view.SetBackgroundColor = ResolveEwkSymbol( - handle_, "ewk_view_bg_color_set"); - view.TouchEventsEnabledSet = - ResolveEwkSymbol( - handle_, "ewk_view_touch_events_enabled_set"); - view.FeedTouchEvent = ResolveEwkSymbol( - handle_, "ewk_view_feed_touch_event"); - view.MouseEventsEnabledSet = - ResolveEwkSymbol( - handle_, "ewk_view_mouse_events_enabled_set"); - view.FeedMouseDown = ResolveEwkSymbol( - handle_, "ewk_view_feed_mouse_down"); - view.FeedMouseUp = ResolveEwkSymbol( - handle_, "ewk_view_feed_mouse_up"); - view.FeedMouseWheel = ResolveEwkSymbol( - handle_, "ewk_view_feed_mouse_wheel"); - view.SendKeyEvent = ResolveEwkSymbol( - handle_, "ewk_view_send_key_event"); - view.OffscreenRenderingEnabledSet = - ResolveEwkSymbol( - handle_, "ewk_view_offscreen_rendering_enabled_set"); - view.ImeWindowSet = ResolveEwkSymbol( - handle_, "ewk_view_ime_window_set"); - view.KeyEventsEnabledSet = ResolveEwkSymbol( - handle_, "ewk_view_key_events_enabled_set"); - view.SupportVideoHoleSet = ResolveEwkSymbol( - handle_, "ewk_view_set_support_video_hole"); - - view.OnJavaScriptAlert = - ResolveEwkSymbol( - handle_, "ewk_view_javascript_alert_callback_set"); - view.OnJavaScriptConfirm = - ResolveEwkSymbol( - handle_, "ewk_view_javascript_confirm_callback_set"); - view.OnJavaScriptPrompt = - ResolveEwkSymbol( - handle_, "ewk_view_javascript_prompt_callback_set"); - - view.JavaScriptAlertReply = - ResolveEwkSymbol( - handle_, "ewk_view_javascript_alert_reply"); - view.JavaScriptConfirmReply = - ResolveEwkSymbol( - handle_, "ewk_view_javascript_confirm_reply"); - view.JavaScriptPromptReply = - ResolveEwkSymbol( - handle_, "ewk_view_javascript_prompt_reply"); - - // ewk_main - main.SetArguments = - ResolveEwkSymbol(handle_, "ewk_set_arguments"); - - // ewk_settings - settings.ImePanelEnabledSet = - ResolveEwkSymbol( - handle_, "ewk_settings_ime_panel_enabled_set"); - settings.ForceZoomSet = ResolveEwkSymbol( - handle_, "ewk_settings_force_zoom_set"); - - // ewk_console_message - console_message.LevelGet = ResolveEwkSymbol( - handle_, "ewk_console_message_level_get"); - console_message.TextGet = ResolveEwkSymbol( - handle_, "ewk_console_message_text_get"); - - initialize_result_ = view.SetBackgroundColor && view.TouchEventsEnabledSet && - view.FeedTouchEvent && view.MouseEventsEnabledSet && - view.FeedMouseDown && view.FeedMouseUp && - view.FeedMouseWheel && view.SendKeyEvent && - view.OffscreenRenderingEnabledSet && view.ImeWindowSet && - view.KeyEventsEnabledSet && view.SupportVideoHoleSet && - view.OnJavaScriptAlert && view.OnJavaScriptConfirm && - view.OnJavaScriptPrompt && view.JavaScriptAlertReply && - view.JavaScriptConfirmReply && - view.JavaScriptPromptReply && main.SetArguments && - settings.ImePanelEnabledSet && settings.ForceZoomSet && - console_message.LevelGet && console_message.TextGet; - return *initialize_result_; -} diff --git a/packages/flutter_inappwebview/tizen/src/ewk_internal_api_binding.h b/packages/flutter_inappwebview/tizen/src/ewk_internal_api_binding.h deleted file mode 100644 index f101e5827..000000000 --- a/packages/flutter_inappwebview/tizen/src/ewk_internal_api_binding.h +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2026 Samsung Electronics Co., Ltd. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef FLUTTER_PLUGIN_EWK_INTERNAL_API_BINDING_H_ -#define FLUTTER_PLUGIN_EWK_INTERNAL_API_BINDING_H_ - -#include - -#include - -typedef enum { - EWK_TOUCH_START, - EWK_TOUCH_MOVE, - EWK_TOUCH_END, - EWK_TOUCH_CANCEL -} Ewk_Touch_Event_Type; - -typedef struct _Ewk_Touch_Point Ewk_Touch_Point; - -typedef enum { - EWK_MOUSE_BUTTON_LEFT = 1, - EWK_MOUSE_BUTTON_MIDDLE = 2, - EWK_MOUSE_BUTTON_RIGHT = 3 -} Ewk_Mouse_Button_Type; - -struct _Ewk_Touch_Point { - int id; - int x; - int y; - Evas_Touch_Point_State state; -}; - -typedef Eina_Bool (*Ewk_View_JavaScript_Alert_Callback)(Evas_Object* o, - const char* alert_text, - void* user_data); -typedef Eina_Bool (*Ewk_View_JavaScript_Confirm_Callback)(Evas_Object* o, - const char* message, - void* user_data); -typedef Eina_Bool (*Ewk_View_JavaScript_Prompt_Callback)( - Evas_Object* o, const char* message, const char* default_value, - void* user_data); - -typedef Eina_Bool (*EwkViewBgColorSetFnPtr)(Evas_Object* obj, int r, int g, - int b, int a); -typedef Eina_Bool (*EwkViewTouchEventsEnabledSetFnPtr)(Evas_Object* view, - Eina_Bool enabled); -typedef Eina_Bool (*EwkViewFeedTouchEventFnPtr)(Evas_Object* obj, - Ewk_Touch_Event_Type type, - const Eina_List* points, - const Evas_Modifier* modifiers); -typedef Eina_Bool (*EwkViewMouseEventsEnabledSetFnPtr)(Evas_Object* view, - Eina_Bool enabled); -typedef Eina_Bool (*EwkViewFeedMouseDownFnPtr)(Evas_Object* obj, - Ewk_Mouse_Button_Type button, - int x, int y); -typedef Eina_Bool (*EwkViewFeedMouseUpFnPtr)(Evas_Object* obj, - Ewk_Mouse_Button_Type button, - int x, int y); -typedef Eina_Bool (*EwkViewFeedMouseWheelFnPtr)(Evas_Object* obj, - Eina_Bool y_direction, int step, - int x, int y); -typedef Eina_Bool (*EwkViewSendKeyEventFnPtr)(Evas_Object* obj, void* key_event, - Eina_Bool is_press); -typedef void (*EwkViewOffscreenRenderingEnabledSetFnPtr)(Evas_Object* obj, - Eina_Bool enabled); -typedef void (*EwkViewImeWindowSetFnPtr)(Evas_Object* obj, void* window); -typedef Eina_Bool (*EwkViewKeyEventsEnabledSetFnPtr)(Evas_Object* obj, - Eina_Bool enabled); -typedef Eina_Bool (*EwkViewSupportVideoHoleSetFnPtr)(Evas_Object* obj, - void* window, - Eina_Bool enabled, - Eina_Bool is_supported); -typedef void (*EwkViewJavaScriptAlertCallbackSetFnPtr)( - Evas_Object* o, Ewk_View_JavaScript_Alert_Callback callback, - void* user_data); -typedef void (*EwkViewJavaScriptConfirmCallbackSetFnPtr)( - Evas_Object* o, Ewk_View_JavaScript_Confirm_Callback callback, - void* user_data); -typedef void (*EwkViewJavaScriptPromptCallbackSetFnPtr)( - Evas_Object* o, Ewk_View_JavaScript_Prompt_Callback callback, - void* user_data); -typedef void (*EwkViewJavaScriptAlertReplyFnPtr)(Evas_Object* o); -typedef void (*EwkViewJavaScriptConfirmReplyFnPtr)(Evas_Object* o, - Eina_Bool result); -typedef void (*EwkViewJavaScriptPromptReplyFnPtr)(Evas_Object* o, - const char* result); - -typedef struct { - EwkViewBgColorSetFnPtr SetBackgroundColor = nullptr; - EwkViewTouchEventsEnabledSetFnPtr TouchEventsEnabledSet = nullptr; - EwkViewFeedTouchEventFnPtr FeedTouchEvent = nullptr; - EwkViewMouseEventsEnabledSetFnPtr MouseEventsEnabledSet = nullptr; - EwkViewFeedMouseDownFnPtr FeedMouseDown = nullptr; - EwkViewFeedMouseUpFnPtr FeedMouseUp = nullptr; - EwkViewFeedMouseWheelFnPtr FeedMouseWheel = nullptr; - EwkViewSendKeyEventFnPtr SendKeyEvent = nullptr; - EwkViewOffscreenRenderingEnabledSetFnPtr OffscreenRenderingEnabledSet = - nullptr; - EwkViewImeWindowSetFnPtr ImeWindowSet = nullptr; - EwkViewKeyEventsEnabledSetFnPtr KeyEventsEnabledSet = nullptr; - EwkViewSupportVideoHoleSetFnPtr SupportVideoHoleSet = nullptr; - EwkViewJavaScriptAlertCallbackSetFnPtr OnJavaScriptAlert = nullptr; - EwkViewJavaScriptConfirmCallbackSetFnPtr OnJavaScriptConfirm = nullptr; - EwkViewJavaScriptPromptCallbackSetFnPtr OnJavaScriptPrompt = nullptr; - EwkViewJavaScriptAlertReplyFnPtr JavaScriptAlertReply = nullptr; - EwkViewJavaScriptConfirmReplyFnPtr JavaScriptConfirmReply = nullptr; - EwkViewJavaScriptPromptReplyFnPtr JavaScriptPromptReply = nullptr; - -} EwkViewProcTable; - -typedef void (*EwkSetArgumentsFnPtr)(int argc, char** argv); - -typedef struct { - EwkSetArgumentsFnPtr SetArguments = nullptr; -} EwkMainProcTable; - -typedef struct Ewk_Settings Ewk_Settings; -typedef void (*EwkSettingsImePanelEnabledSetFnPtr)(Ewk_Settings* settings, - Eina_Bool enabled); -typedef void (*EwkSettingsForceZoomSetFnPtr)(Ewk_Settings* settings, - Eina_Bool enable); - -typedef struct { - EwkSettingsImePanelEnabledSetFnPtr ImePanelEnabledSet = nullptr; - EwkSettingsForceZoomSetFnPtr ForceZoomSet = nullptr; -} EwkSettingsProcTable; - -typedef struct _Ewk_Console_Message Ewk_Console_Message; - -typedef enum { - EWK_CONSOLE_MESSAGE_LEVEL_NULL, - EWK_CONSOLE_MESSAGE_LEVEL_LOG, - EWK_CONSOLE_MESSAGE_LEVEL_WARNING, - EWK_CONSOLE_MESSAGE_LEVEL_ERROR, - EWK_CONSOLE_MESSAGE_LEVEL_DEBUG, - EWK_CONSOLE_MESSAGE_LEVEL_INFO, -} Ewk_Console_Message_Level; - -typedef Ewk_Console_Message_Level (*EwkConsoleMessageLevelGetFnPtr)( - const Ewk_Console_Message* message); -typedef Eina_Stringshare* (*EwkConsoleMessageTextGetFnPtr)( - const Ewk_Console_Message* message); - -typedef struct { - EwkConsoleMessageLevelGetFnPtr LevelGet = nullptr; - EwkConsoleMessageTextGetFnPtr TextGet = nullptr; -} EwkConsoleMessageProcTable; - -class EwkInternalApiBinding { - public: - static EwkInternalApiBinding& GetInstance() { - static EwkInternalApiBinding instance = EwkInternalApiBinding(); - return instance; - } - - ~EwkInternalApiBinding(); - - EwkInternalApiBinding(const EwkInternalApiBinding&) = delete; - EwkInternalApiBinding& operator=(const EwkInternalApiBinding&) = delete; - - bool Initialize(); - - EwkViewProcTable view; - EwkMainProcTable main; - EwkSettingsProcTable settings; - EwkConsoleMessageProcTable console_message; - - private: - EwkInternalApiBinding(); - - void* handle_ = nullptr; - std::optional initialize_result_; -}; - -#endif // FLUTTER_PLUGIN_EWK_INTERNAL_API_BINDING_H_ diff --git a/packages/flutter_inappwebview/tizen/src/ewk_webview_backend.cc b/packages/flutter_inappwebview/tizen/src/ewk_webview_backend.cc index 762b9db7a..aaabcf5d5 100644 --- a/packages/flutter_inappwebview/tizen/src/ewk_webview_backend.cc +++ b/packages/flutter_inappwebview/tizen/src/ewk_webview_backend.cc @@ -79,8 +79,7 @@ bool EwkWebViewBackend::Create(double width, double height, void* window) { const_cast("--no-zygote"), }; int chromium_argc = sizeof(chromium_argv) / sizeof(chromium_argv[0]); - EwkInternalApiBinding::GetInstance().main.SetArguments(chromium_argc, - chromium_argv); + ftpw_flutter_inappwebview_ewk_set_arguments(chromium_argc, chromium_argv); }); Ecore_Evas* evas = GetOffscreenHost(); @@ -95,8 +94,8 @@ bool EwkWebViewBackend::Create(double width, double height, void* window) { } ecore_evas_focus_set(evas, true); ewk_view_focus_set(view_, true); - EwkInternalApiBinding::GetInstance().view.OffscreenRenderingEnabledSet(view_, - true); + ftpw_flutter_inappwebview_ewk_view_offscreen_rendering_enabled_set(view_, + true); Ewk_Context* context = ewk_view_context_get(view_); if (context) { @@ -111,30 +110,30 @@ bool EwkWebViewBackend::Create(double width, double height, void* window) { LOG_WARN("Unable to access the EWK context; skipping cookie/cache setup."); } - EwkInternalApiBinding::GetInstance().settings.ImePanelEnabledSet( + ftpw_flutter_inappwebview_ewk_settings_ime_panel_enabled_set( ewk_view_settings_get(view_), true); - EwkInternalApiBinding::GetInstance().settings.ForceZoomSet( + ftpw_flutter_inappwebview_ewk_settings_force_zoom_set( ewk_view_settings_get(view_), true); - EwkInternalApiBinding::GetInstance().view.ImeWindowSet(view_, window); - EwkInternalApiBinding::GetInstance().view.KeyEventsEnabledSet(view_, true); + ftpw_flutter_inappwebview_ewk_view_ime_window_set(view_, window); + ftpw_flutter_inappwebview_ewk_view_key_events_enabled_set(view_, true); #ifdef WEBVIEW_TIZEN_TOUCH_EVENTS_ENABLED - EwkInternalApiBinding::GetInstance().view.TouchEventsEnabledSet(view_, true); - EwkInternalApiBinding::GetInstance().view.MouseEventsEnabledSet(view_, false); + ftpw_flutter_inappwebview_ewk_view_touch_events_enabled_set(view_, true); + ftpw_flutter_inappwebview_ewk_view_mouse_events_enabled_set(view_, false); #else - EwkInternalApiBinding::GetInstance().view.TouchEventsEnabledSet(view_, false); - EwkInternalApiBinding::GetInstance().view.MouseEventsEnabledSet(view_, true); + ftpw_flutter_inappwebview_ewk_view_touch_events_enabled_set(view_, false); + ftpw_flutter_inappwebview_ewk_view_mouse_events_enabled_set(view_, true); #endif - EwkInternalApiBinding::GetInstance().view.OnJavaScriptAlert( + ftpw_flutter_inappwebview_ewk_view_javascript_alert_callback_set( view_, &EwkWebViewBackend::OnJavaScriptAlertDialog, this); - EwkInternalApiBinding::GetInstance().view.OnJavaScriptConfirm( + ftpw_flutter_inappwebview_ewk_view_javascript_confirm_callback_set( view_, &EwkWebViewBackend::OnJavaScriptConfirmDialog, this); - EwkInternalApiBinding::GetInstance().view.OnJavaScriptPrompt( + ftpw_flutter_inappwebview_ewk_view_javascript_prompt_callback_set( view_, &EwkWebViewBackend::OnJavaScriptPromptDialog, this); #ifdef TV_PROFILE - EwkInternalApiBinding::GetInstance().view.SupportVideoHoleSet(view_, window, - true, false); + ftpw_flutter_inappwebview_ewk_view_set_support_video_hole(view_, window, true, + false); #endif evas_object_smart_callback_add(view_, "offscreen,frame,rendered", @@ -196,16 +195,12 @@ Evas_Object* EwkWebViewBackend::DetachView() { evas_object_smart_callback_del(instance, "title,changed", &EwkWebViewBackend::OnTitleChange); - auto& ewk_view = EwkInternalApiBinding::GetInstance().view; - if (ewk_view.OnJavaScriptAlert) { - ewk_view.OnJavaScriptAlert(instance, nullptr, nullptr); - } - if (ewk_view.OnJavaScriptConfirm) { - ewk_view.OnJavaScriptConfirm(instance, nullptr, nullptr); - } - if (ewk_view.OnJavaScriptPrompt) { - ewk_view.OnJavaScriptPrompt(instance, nullptr, nullptr); - } + ftpw_flutter_inappwebview_ewk_view_javascript_alert_callback_set( + instance, nullptr, nullptr); + ftpw_flutter_inappwebview_ewk_view_javascript_confirm_callback_set( + instance, nullptr, nullptr); + ftpw_flutter_inappwebview_ewk_view_javascript_prompt_callback_set( + instance, nullptr, nullptr); evas_object_data_del(instance, kEwkInstance); @@ -269,8 +264,8 @@ void EwkWebViewBackend::SendTouchEvent(int event_type, double x, double y) { point->state = state; points = eina_list_append(points, point); - EwkInternalApiBinding::GetInstance().view.FeedTouchEvent( - view_, mouse_event_type, points, 0); + ftpw_flutter_inappwebview_ewk_view_feed_touch_event(view_, mouse_event_type, + points, 0); eina_list_free(points); delete point; } @@ -296,16 +291,16 @@ void EwkWebViewBackend::SendMouseEvent(int event_type, int button_type, if (event_type == 0) { // down event mouse_button_type_ = mouse_button_type; - EwkInternalApiBinding::GetInstance().view.FeedMouseDown( + ftpw_flutter_inappwebview_ewk_view_feed_mouse_down( view_, mouse_button_type_, px, py); } else if (event_type == 1) { if (dy != 0) { - EwkInternalApiBinding::GetInstance().view.FeedMouseWheel( + ftpw_flutter_inappwebview_ewk_view_feed_mouse_wheel( view_, true, dy > 0 ? 1 : -1, px, py); } } else if (event_type == 2) { // up event - EwkInternalApiBinding::GetInstance().view.FeedMouseUp( - view_, mouse_button_type_, px, py); + ftpw_flutter_inappwebview_ewk_view_feed_mouse_up(view_, mouse_button_type_, + px, py); mouse_button_type_ = mouse_button_type; } else { LOG_WARN("Unknown mouse event type: %d", event_type); @@ -332,14 +327,14 @@ bool EwkWebViewBackend::SendKey(const char* key, const char* string, Evas_Event_Key_Down down_event = {}; down_event.key = key; down_event.string = string; - EwkInternalApiBinding::GetInstance().view.SendKeyEvent(view_, &down_event, - is_down); + ftpw_flutter_inappwebview_ewk_view_send_key_event(view_, &down_event, + is_down); } else { Evas_Event_Key_Up up_event = {}; up_event.key = key; up_event.string = string; - EwkInternalApiBinding::GetInstance().view.SendKeyEvent(view_, &up_event, - is_down); + ftpw_flutter_inappwebview_ewk_view_send_key_event(view_, &up_event, + is_down); } return true; } @@ -461,8 +456,7 @@ void EwkWebViewBackend::GetScrollPosition(int32_t* x, int32_t* y) { } void EwkWebViewBackend::SetBackgroundColor(int r, int g, int b, int a) { - EwkInternalApiBinding::GetInstance().view.SetBackgroundColor(view_, r, g, b, - a); + ftpw_flutter_inappwebview_ewk_view_bg_color_set(view_, r, g, b, a); } void EwkWebViewBackend::SetUserAgent(const std::string& user_agent) { @@ -474,22 +468,20 @@ std::string EwkWebViewBackend::GetUserAgent() { } void EwkWebViewBackend::EnableZoom(bool enabled) { - EwkInternalApiBinding::GetInstance().settings.ForceZoomSet( + ftpw_flutter_inappwebview_ewk_settings_force_zoom_set( ewk_view_settings_get(view_), enabled); } void EwkWebViewBackend::JavaScriptAlertReply() { - EwkInternalApiBinding::GetInstance().view.JavaScriptAlertReply(view_); + ftpw_flutter_inappwebview_ewk_view_javascript_alert_reply(view_); } void EwkWebViewBackend::JavaScriptConfirmReply(bool result) { - EwkInternalApiBinding::GetInstance().view.JavaScriptConfirmReply(view_, - result); + ftpw_flutter_inappwebview_ewk_view_javascript_confirm_reply(view_, result); } void EwkWebViewBackend::JavaScriptPromptReply(const char* result) { - EwkInternalApiBinding::GetInstance().view.JavaScriptPromptReply(view_, - result); + ftpw_flutter_inappwebview_ewk_view_javascript_prompt_reply(view_, result); } bool EwkWebViewBackend::ClearCookies() { @@ -573,11 +565,11 @@ void EwkWebViewBackend::OnLoadError(void* data, Evas_Object* obj, void EwkWebViewBackend::OnConsoleMessage(void* data, Evas_Object* obj, void* event_info) { EwkWebViewBackend* backend = static_cast(data); - Ewk_Console_Message* message = static_cast(event_info); + void* message = event_info; Ewk_Console_Message_Level log_level = - EwkInternalApiBinding::GetInstance().console_message.LevelGet(message); - std::string text = ToString( - EwkInternalApiBinding::GetInstance().console_message.TextGet(message)); + ftpw_flutter_inappwebview_ewk_console_message_level_get(message); + std::string text = + ToString(ftpw_flutter_inappwebview_ewk_console_message_text_get(message)); backend->delegate_->OnConsoleMessage(ConvertLogLevelToString(log_level), text); } @@ -619,7 +611,7 @@ void EwkWebViewBackend::OnEvaluateJavaScript(Evas_Object* obj, delete callback; } -Eina_Bool EwkWebViewBackend::OnJavaScriptAlertDialog(Evas_Object* o, +Eina_Bool EwkWebViewBackend::OnJavaScriptAlertDialog(void* o, const char* message, void* data) { EwkWebViewBackend* backend = static_cast(data); @@ -628,7 +620,7 @@ Eina_Bool EwkWebViewBackend::OnJavaScriptAlertDialog(Evas_Object* o, return true; } -Eina_Bool EwkWebViewBackend::OnJavaScriptConfirmDialog(Evas_Object* o, +Eina_Bool EwkWebViewBackend::OnJavaScriptConfirmDialog(void* o, const char* message, void* data) { EwkWebViewBackend* backend = static_cast(data); @@ -637,7 +629,7 @@ Eina_Bool EwkWebViewBackend::OnJavaScriptConfirmDialog(Evas_Object* o, return true; } -Eina_Bool EwkWebViewBackend::OnJavaScriptPromptDialog(Evas_Object* o, +Eina_Bool EwkWebViewBackend::OnJavaScriptPromptDialog(void* o, const char* message, const char* default_text, void* data) { diff --git a/packages/flutter_inappwebview/tizen/src/ewk_webview_backend.h b/packages/flutter_inappwebview/tizen/src/ewk_webview_backend.h index 60eac989b..ead5e03f0 100644 --- a/packages/flutter_inappwebview/tizen/src/ewk_webview_backend.h +++ b/packages/flutter_inappwebview/tizen/src/ewk_webview_backend.h @@ -15,7 +15,7 @@ #include #include -#include "ewk_internal_api_binding.h" +#include "ftpw_flutter_inappwebview.h" #include "webview_backend.h" typedef struct _Ecore_Evas Ecore_Evas; @@ -94,11 +94,11 @@ class EwkWebViewBackend : public WebViewBackend { static void OnTitleChange(void* data, Evas_Object* obj, void* event_info); static void OnEvaluateJavaScript(Evas_Object* obj, const char* result_value, void* user_data); - static Eina_Bool OnJavaScriptAlertDialog(Evas_Object* o, const char* message, + static Eina_Bool OnJavaScriptAlertDialog(void* o, const char* message, void* data); - static Eina_Bool OnJavaScriptConfirmDialog(Evas_Object* o, - const char* message, void* data); - static Eina_Bool OnJavaScriptPromptDialog(Evas_Object* o, const char* message, + static Eina_Bool OnJavaScriptConfirmDialog(void* o, const char* message, + void* data); + static Eina_Bool OnJavaScriptPromptDialog(void* o, const char* message, const char* default_text, void* data); diff --git a/packages/flutter_inappwebview/tizen/src/webview_backend_factory.cc b/packages/flutter_inappwebview/tizen/src/webview_backend_factory.cc index 768e01cdf..c387a08be 100644 --- a/packages/flutter_inappwebview/tizen/src/webview_backend_factory.cc +++ b/packages/flutter_inappwebview/tizen/src/webview_backend_factory.cc @@ -9,10 +9,8 @@ #include #include -#include "ewk_internal_api_binding.h" #include "ewk_webview_backend.h" #include "log.h" -#include "wv_internal_api_binding.h" #include "wv_webview_backend.h" namespace { @@ -56,26 +54,14 @@ std::unique_ptr WebViewBackendFactory::Create( LOG_ERROR("WV engine is not initialized; cannot create WebView."); return nullptr; } - if (!WvInternalApiBinding::GetInstance().Initialize()) { - LOG_ERROR("Failed to initialize WV APIs."); - return nullptr; - } return std::make_unique(delegate); } - if (!EwkInternalApiBinding::GetInstance().Initialize()) { - LOG_ERROR("Failed to initialize EWK internal APIs."); - return nullptr; - } return std::make_unique(delegate); } void WebViewBackendFactory::InitializeEngine() { BackendKind kind = GetSelectedBackend(); if (kind != BackendKind::kEwk) { - if (!WvInternalApiBinding::GetInstance().Initialize()) { - LOG_ERROR("Failed to initialize WV APIs; engine not started."); - return; - } if (!WvWebViewBackend::GlobalInitialize(kind == BackendKind::kWvStandalone)) { LOG_ERROR("wv_init() failed; engine not started."); diff --git a/packages/flutter_inappwebview/tizen/src/wv_internal_api_binding.cc b/packages/flutter_inappwebview/tizen/src/wv_internal_api_binding.cc deleted file mode 100644 index 637da889a..000000000 --- a/packages/flutter_inappwebview/tizen/src/wv_internal_api_binding.cc +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright 2026 Samsung Electronics Co., Ltd. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "wv_internal_api_binding.h" - -#include - -WvInternalApiBinding::WvInternalApiBinding() { - // NOTE: WV symbols are exported by the Chromium EWK library. - handle_ = dlopen("libchromium-ewk.so", RTLD_LAZY); -} - -WvInternalApiBinding::~WvInternalApiBinding() { - if (handle_) { - dlclose(handle_); - } -} - -bool WvInternalApiBinding::Initialize() { - if (initialize_result_.has_value()) { - return *initialize_result_; - } - - if (!handle_) { - initialize_result_ = false; - return false; - } - - main.Init = reinterpret_cast(dlsym(handle_, "wv_init")); - main.Shutdown = - reinterpret_cast(dlsym(handle_, "wv_shutdown")); - main.SetArguments = - reinterpret_cast(dlsym(handle_, "wv_set_arguments")); - - view.Create = - reinterpret_cast(dlsym(handle_, "wv_view_create")); - view.Destroy = - reinterpret_cast(dlsym(handle_, "wv_view_destroy")); - view.Resize = - reinterpret_cast(dlsym(handle_, "wv_view_resize")); - view.FocusSet = reinterpret_cast( - dlsym(handle_, "wv_view_focus_set")); - view.UrlSet = - reinterpret_cast(dlsym(handle_, "wv_view_url_set")); - view.UrlGet = - reinterpret_cast(dlsym(handle_, "wv_view_url_get")); - view.UrlRequestSet = reinterpret_cast( - dlsym(handle_, "wv_view_url_request_set")); - view.HtmlStringLoad = reinterpret_cast( - dlsym(handle_, "wv_view_html_string_load")); - view.BackPossible = reinterpret_cast( - dlsym(handle_, "wv_view_back_possible")); - view.ForwardPossible = reinterpret_cast( - dlsym(handle_, "wv_view_forward_possible")); - view.Back = reinterpret_cast(dlsym(handle_, "wv_view_back")); - view.Forward = - reinterpret_cast(dlsym(handle_, "wv_view_forward")); - view.Reload = - reinterpret_cast(dlsym(handle_, "wv_view_reload")); - view.Stop = reinterpret_cast(dlsym(handle_, "wv_view_stop")); - view.Suspend = - reinterpret_cast(dlsym(handle_, "wv_view_suspend")); - view.Resume = - reinterpret_cast(dlsym(handle_, "wv_view_resume")); - view.TitleGet = reinterpret_cast( - dlsym(handle_, "wv_view_title_get")); - view.LoadProgressGet = reinterpret_cast( - dlsym(handle_, "wv_view_load_progress_get")); - view.ScaleSet = reinterpret_cast( - dlsym(handle_, "wv_view_scale_set")); - view.ScaleGet = reinterpret_cast( - dlsym(handle_, "wv_view_scale_get")); - view.UserAgentSet = reinterpret_cast( - dlsym(handle_, "wv_view_user_agent_set")); - view.UserAgentGet = reinterpret_cast( - dlsym(handle_, "wv_view_user_agent_get")); - view.ScrollSet = reinterpret_cast( - dlsym(handle_, "wv_view_scroll_set")); - view.ScrollPosGet = reinterpret_cast( - dlsym(handle_, "wv_view_scroll_pos_get")); - view.ScriptExecute = reinterpret_cast( - dlsym(handle_, "wv_view_script_execute")); - view.BgColorSet = reinterpret_cast( - dlsym(handle_, "wv_view_bg_color_set")); - view.ContextGet = reinterpret_cast( - dlsym(handle_, "wv_view_context_get")); - view.SettingsGet = reinterpret_cast( - dlsym(handle_, "wv_view_settings_get")); - view.FeedTouchEvent = reinterpret_cast( - dlsym(handle_, "wv_view_feed_touch_event")); - view.FeedMouseDown = reinterpret_cast( - dlsym(handle_, "wv_view_feed_mouse_down")); - view.FeedMouseUp = reinterpret_cast( - dlsym(handle_, "wv_view_feed_mouse_up")); - view.FeedMouseMove = reinterpret_cast( - dlsym(handle_, "wv_view_feed_mouse_move")); - view.FeedMouseWheel = reinterpret_cast( - dlsym(handle_, "wv_view_feed_mouse_wheel")); - view.SendKeyEvent = reinterpret_cast( - dlsym(handle_, "wv_view_send_key_event")); - view.TouchEventsEnabledSet = - reinterpret_cast( - dlsym(handle_, "wv_view_touch_events_enabled_set")); - view.MouseEventsEnabledSet = - reinterpret_cast( - dlsym(handle_, "wv_view_mouse_events_enabled_set")); - view.KeyEventsEnabledSet = reinterpret_cast( - dlsym(handle_, "wv_view_key_events_enabled_set")); - view.ImeWindowSet = reinterpret_cast( - dlsym(handle_, "wv_view_ime_window_set")); - view.AddCallback = reinterpret_cast( - dlsym(handle_, "wv_view_add_cb")); - view.RemoveFullCallback = reinterpret_cast( - dlsym(handle_, "wv_view_remove_full_cb")); - view.OnJavaScriptAlert = - reinterpret_cast( - dlsym(handle_, "wv_view_javascript_alert_callback_set")); - view.OnJavaScriptConfirm = - reinterpret_cast( - dlsym(handle_, "wv_view_javascript_confirm_callback_set")); - view.OnJavaScriptPrompt = - reinterpret_cast( - dlsym(handle_, "wv_view_javascript_prompt_callback_set")); - view.JavaScriptAlertReply = reinterpret_cast( - dlsym(handle_, "wv_view_javascript_alert_reply")); - view.JavaScriptConfirmReply = - reinterpret_cast( - dlsym(handle_, "wv_view_javascript_confirm_reply")); - view.JavaScriptPromptReply = - reinterpret_cast( - dlsym(handle_, "wv_view_javascript_prompt_reply")); - view.SetSupportVideoHole = reinterpret_cast( - dlsym(handle_, "wv_view_set_support_video_hole")); - view.MainFrameScrollbarVisibleSet = - reinterpret_cast( - dlsym(handle_, "wv_view_main_frame_scrollbar_visible_set")); - - context.CookieManagerGet = reinterpret_cast( - dlsym(handle_, "wv_context_cookie_manager_get")); - context.CacheModelSet = reinterpret_cast( - dlsym(handle_, "wv_context_cache_model_set")); - context.CacheClear = reinterpret_cast( - dlsym(handle_, "wv_context_cache_clear")); - - cookie_manager.AcceptPolicySet = - reinterpret_cast( - dlsym(handle_, "wv_cookie_manager_accept_policy_set")); - cookie_manager.CookiesClear = - reinterpret_cast( - dlsym(handle_, "wv_cookie_manager_cookies_clear")); - - settings.JavaScriptEnabledSet = - reinterpret_cast( - dlsym(handle_, "wv_settings_javascript_enabled_set")); - settings.ImePanelEnabledSet = - reinterpret_cast( - dlsym(handle_, "wv_settings_ime_panel_enabled_set")); - settings.ForceZoomSet = reinterpret_cast( - dlsym(handle_, "wv_settings_force_zoom_set")); - - error.CodeGet = reinterpret_cast( - dlsym(handle_, "wv_error_code_get")); - error.DescriptionGet = reinterpret_cast( - dlsym(handle_, "wv_error_description_get")); - error.UrlGet = - reinterpret_cast(dlsym(handle_, "wv_error_url_get")); - - policy_decision.Use = reinterpret_cast( - dlsym(handle_, "wv_policy_decision_use")); - policy_decision.UrlGet = reinterpret_cast( - dlsym(handle_, "wv_policy_decision_url_get")); - - console_message.LevelGet = reinterpret_cast( - dlsym(handle_, "wv_console_message_level_get")); - console_message.TextGet = reinterpret_cast( - dlsym(handle_, "wv_console_message_text_get")); - - initialize_result_ = - main.Init && main.Shutdown && main.SetArguments && view.Create && - view.Destroy && view.Resize && view.FocusSet && view.UrlSet && - view.UrlGet && view.UrlRequestSet && view.HtmlStringLoad && - view.BackPossible && view.ForwardPossible && view.Back && view.Forward && - view.Reload && view.Stop && view.Suspend && view.Resume && - view.TitleGet && view.LoadProgressGet && view.ScaleSet && view.ScaleGet && - view.UserAgentSet && view.UserAgentGet && view.ScrollSet && - view.ScrollPosGet && view.ScriptExecute && view.BgColorSet && - view.ContextGet && view.SettingsGet && view.FeedTouchEvent && - view.FeedMouseDown && view.FeedMouseUp && view.FeedMouseMove && - view.FeedMouseWheel && view.SendKeyEvent && view.TouchEventsEnabledSet && - view.MouseEventsEnabledSet && view.KeyEventsEnabledSet && - view.ImeWindowSet && view.AddCallback && view.RemoveFullCallback && - view.OnJavaScriptAlert && view.OnJavaScriptConfirm && - view.OnJavaScriptPrompt && view.JavaScriptAlertReply && - view.JavaScriptConfirmReply && view.JavaScriptPromptReply && - view.SetSupportVideoHole && view.MainFrameScrollbarVisibleSet && - context.CookieManagerGet && context.CacheModelSet && context.CacheClear && - cookie_manager.AcceptPolicySet && cookie_manager.CookiesClear && - settings.JavaScriptEnabledSet && settings.ImePanelEnabledSet && - settings.ForceZoomSet && error.CodeGet && error.DescriptionGet && - error.UrlGet && policy_decision.Use && policy_decision.UrlGet && - console_message.LevelGet && console_message.TextGet; - return *initialize_result_; -} diff --git a/packages/flutter_inappwebview/tizen/src/wv_internal_api_binding.h b/packages/flutter_inappwebview/tizen/src/wv_internal_api_binding.h deleted file mode 100644 index 3be88887b..000000000 --- a/packages/flutter_inappwebview/tizen/src/wv_internal_api_binding.h +++ /dev/null @@ -1,347 +0,0 @@ -// Copyright 2026 Samsung Electronics Co., Ltd. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef FLUTTER_PLUGIN_WV_INTERNAL_API_BINDING_H_ -#define FLUTTER_PLUGIN_WV_INTERNAL_API_BINDING_H_ - -#include - -#include - -typedef struct wv_view_s* wv_view_h; -typedef struct wv_context_s* wv_context_h; -typedef struct wv_settings_s* wv_settings_h; -typedef struct wv_cookie_manager_s* wv_cookie_manager_h; -typedef struct wv_error_s* wv_error_h; -typedef struct wv_policy_decision_s* wv_policy_decision_h; -typedef struct wv_console_message_s* wv_console_message_h; - -typedef enum { - WV_HTTP_METHOD_GET, - WV_HTTP_METHOD_HEAD, - WV_HTTP_METHOD_POST, - WV_HTTP_METHOD_PUT, - WV_HTTP_METHOD_DELETE, -} wv_http_method_e; - -typedef enum { - WV_CACHE_MODEL_DOCUMENT_VIEWER, - WV_CACHE_MODEL_DOCUMENT_BROWSER, - WV_CACHE_MODEL_PRIMARY_WEBBROWSER -} wv_cache_model_e; - -typedef enum { - WV_TOUCH_EVENT_START, - WV_TOUCH_EVENT_MOVE, - WV_TOUCH_EVENT_END, - WV_TOUCH_EVENT_CANCEL -} wv_touch_event_type_e; - -typedef enum { - WV_TOUCH_POINT_STATE_DOWN, - WV_TOUCH_POINT_STATE_UP, - WV_TOUCH_POINT_STATE_MOVE, - WV_TOUCH_POINT_STATE_STILL, - WV_TOUCH_POINT_STATE_CANCEL -} wv_touch_point_state_e; - -typedef enum { - WV_MODIFIER_NONE = 0, - WV_MODIFIER_SHIFT = 1 << 0, - WV_MODIFIER_CONTROL = 1 << 1, - WV_MODIFIER_ALT = 1 << 2, - WV_MODIFIER_SUPER = 1 << 3, - WV_MODIFIER_HYPER = 1 << 4, - WV_MODIFIER_CAPS_LOCK = 1 << 5, - WV_MODIFIER_NUM_LOCK = 1 << 6 -} wv_modifier_e; - -typedef enum { - WV_MOUSE_BUTTON_LEFT = 1, - WV_MOUSE_BUTTON_MIDDLE = 2, - WV_MOUSE_BUTTON_RIGHT = 3 -} wv_mouse_button_type_e; - -typedef enum { - WV_COOKIE_ACCEPT_POLICY_ALWAYS, - WV_COOKIE_ACCEPT_POLICY_NEVER, - WV_COOKIE_ACCEPT_POLICY_NO_THIRD_PARTY -} wv_cookie_accept_policy_e; - -typedef enum { - WV_CONSOLE_MESSAGE_LEVEL_NULL, - WV_CONSOLE_MESSAGE_LEVEL_LOG, - WV_CONSOLE_MESSAGE_LEVEL_WARNING, - WV_CONSOLE_MESSAGE_LEVEL_ERROR, - WV_CONSOLE_MESSAGE_LEVEL_DEBUG, - WV_CONSOLE_MESSAGE_LEVEL_INFO -} wv_console_message_level_e; - -typedef struct { - int id; - int x; - int y; - wv_touch_point_state_e state; -} wv_touch_point_s; - -typedef struct { - const char* key_name; - const char* key; - const char* string; - const char* compose; - unsigned int timestamp; - wv_modifier_e modifiers; - int event_flags; - unsigned int key_code; - const char* device_name; -} wv_key_event_s; - -typedef void (*wv_view_cb)(wv_view_h obj, void* event_info, void* user_data); -typedef void (*wv_view_script_execute_cb)(wv_view_h view, - const char* result_value, - void* user_data); -typedef bool (*wv_view_javascript_alert_cb)(wv_view_h view, - const char* alert_text, - void* user_data); -typedef bool (*wv_view_javascript_confirm_cb)(wv_view_h view, - const char* message, - void* user_data); -typedef bool (*wv_view_javascript_prompt_cb)(wv_view_h view, - const char* message, - const char* default_value, - void* user_data); - -typedef int (*WvInitFnPtr)(void); -typedef int (*WvShutdownFnPtr)(void); -typedef int (*WvSetArgumentsFnPtr)(int argc, const char** argv); - -typedef struct { - WvInitFnPtr Init = nullptr; - WvShutdownFnPtr Shutdown = nullptr; - WvSetArgumentsFnPtr SetArguments = nullptr; -} WvMainProcTable; - -typedef wv_view_h (*WvViewCreateFnPtr)(void); -typedef void (*WvViewDestroyFnPtr)(wv_view_h view); -typedef void (*WvViewResizeFnPtr)(wv_view_h view, int w, int h); -typedef bool (*WvViewFocusSetFnPtr)(wv_view_h view, int focused); -typedef bool (*WvViewUrlSetFnPtr)(wv_view_h view, const char* url); -typedef const char* (*WvViewUrlGetFnPtr)(wv_view_h view); -typedef bool (*WvViewUrlRequestSetFnPtr)(wv_view_h view, const char* url, - wv_http_method_e method, - GHashTable* headers, const char* body); -typedef bool (*WvViewHtmlStringLoadFnPtr)(wv_view_h view, const char* html, - const char* base_url, - const char* unreachable_url); -typedef bool (*WvViewBackPossibleFnPtr)(wv_view_h view); -typedef bool (*WvViewForwardPossibleFnPtr)(wv_view_h view); -typedef bool (*WvViewBackFnPtr)(wv_view_h view); -typedef bool (*WvViewForwardFnPtr)(wv_view_h view); -typedef bool (*WvViewReloadFnPtr)(wv_view_h view); -typedef bool (*WvViewStopFnPtr)(wv_view_h view); -typedef void (*WvViewSuspendFnPtr)(wv_view_h view); -typedef void (*WvViewResumeFnPtr)(wv_view_h view); -typedef const char* (*WvViewTitleGetFnPtr)(wv_view_h view); -typedef double (*WvViewLoadProgressGetFnPtr)(wv_view_h view); -typedef bool (*WvViewScaleSetFnPtr)(wv_view_h view, double scale_factor, int cx, - int cy); -typedef double (*WvViewScaleGetFnPtr)(wv_view_h view); -typedef bool (*WvViewUserAgentSetFnPtr)(wv_view_h view, const char* user_agent); -typedef const char* (*WvViewUserAgentGetFnPtr)(wv_view_h view); -typedef bool (*WvViewScrollSetFnPtr)(wv_view_h view, int x, int y); -typedef bool (*WvViewScrollPosGetFnPtr)(wv_view_h view, int* x, int* y); -typedef bool (*WvViewScriptExecuteFnPtr)(wv_view_h view, const char* script, - wv_view_script_execute_cb callback, - void* user_data); -typedef bool (*WvViewBgColorSetFnPtr)(wv_view_h view, int r, int g, int b, - int a); -typedef wv_context_h (*WvViewContextGetFnPtr)(wv_view_h view); -typedef wv_settings_h (*WvViewSettingsGetFnPtr)(wv_view_h view); -typedef bool (*WvViewFeedTouchEventFnPtr)(wv_view_h view, - wv_touch_event_type_e event_type, - GList* points, - wv_modifier_e modifiers); -typedef int (*WvViewFeedMouseDownFnPtr)(wv_view_h view, - wv_mouse_button_type_e button, int x, - int y); -typedef int (*WvViewFeedMouseUpFnPtr)(wv_view_h view, - wv_mouse_button_type_e button, int x, - int y); -typedef int (*WvViewFeedMouseMoveFnPtr)(wv_view_h view, int x, int y); -typedef int (*WvViewFeedMouseWheelFnPtr)(wv_view_h view, bool y_direction, - int step, int x, int y); -typedef bool (*WvViewSendKeyEventFnPtr)(wv_view_h view, - const wv_key_event_s* key_event, - int is_press); -typedef bool (*WvViewTouchEventsEnabledSetFnPtr)(wv_view_h view, int enabled); -typedef bool (*WvViewMouseEventsEnabledSetFnPtr)(wv_view_h view, bool enabled); -typedef bool (*WvViewKeyEventsEnabledSetFnPtr)(wv_view_h view, bool enabled); -typedef void (*WvViewImeWindowSetFnPtr)(wv_view_h view, void* window); -typedef int (*WvViewAddCallbackFnPtr)(wv_view_h view, const char* event, - wv_view_cb func, const void* user_data); -typedef int (*WvViewRemoveFullCallbackFnPtr)(wv_view_h view, const char* event, - wv_view_cb func, - const void* user_data); -typedef int (*WvViewJavaScriptAlertCallbackSetFnPtr)( - wv_view_h view, wv_view_javascript_alert_cb callback, void* user_data); -typedef int (*WvViewJavaScriptConfirmCallbackSetFnPtr)( - wv_view_h view, wv_view_javascript_confirm_cb callback, void* user_data); -typedef int (*WvViewJavaScriptPromptCallbackSetFnPtr)( - wv_view_h view, wv_view_javascript_prompt_cb callback, void* user_data); -typedef void (*WvViewJavaScriptAlertReplyFnPtr)(wv_view_h view); -typedef void (*WvViewJavaScriptConfirmReplyFnPtr)(wv_view_h view, bool result); -typedef void (*WvViewJavaScriptPromptReplyFnPtr)(wv_view_h view, - const char* result); -typedef bool (*WvViewSetSupportVideoHoleFnPtr)(wv_view_h view, void* window, - bool enable, - bool is_video_window); -typedef bool (*WvViewMainFrameScrollbarVisibleSetFnPtr)(wv_view_h view, - bool visible); - -typedef struct { - WvViewCreateFnPtr Create = nullptr; - WvViewDestroyFnPtr Destroy = nullptr; - WvViewResizeFnPtr Resize = nullptr; - WvViewFocusSetFnPtr FocusSet = nullptr; - WvViewUrlSetFnPtr UrlSet = nullptr; - WvViewUrlGetFnPtr UrlGet = nullptr; - WvViewUrlRequestSetFnPtr UrlRequestSet = nullptr; - WvViewHtmlStringLoadFnPtr HtmlStringLoad = nullptr; - WvViewBackPossibleFnPtr BackPossible = nullptr; - WvViewForwardPossibleFnPtr ForwardPossible = nullptr; - WvViewBackFnPtr Back = nullptr; - WvViewForwardFnPtr Forward = nullptr; - WvViewReloadFnPtr Reload = nullptr; - WvViewStopFnPtr Stop = nullptr; - WvViewSuspendFnPtr Suspend = nullptr; - WvViewResumeFnPtr Resume = nullptr; - WvViewTitleGetFnPtr TitleGet = nullptr; - WvViewLoadProgressGetFnPtr LoadProgressGet = nullptr; - WvViewScaleSetFnPtr ScaleSet = nullptr; - WvViewScaleGetFnPtr ScaleGet = nullptr; - WvViewUserAgentSetFnPtr UserAgentSet = nullptr; - WvViewUserAgentGetFnPtr UserAgentGet = nullptr; - WvViewScrollSetFnPtr ScrollSet = nullptr; - WvViewScrollPosGetFnPtr ScrollPosGet = nullptr; - WvViewScriptExecuteFnPtr ScriptExecute = nullptr; - WvViewBgColorSetFnPtr BgColorSet = nullptr; - WvViewContextGetFnPtr ContextGet = nullptr; - WvViewSettingsGetFnPtr SettingsGet = nullptr; - WvViewFeedTouchEventFnPtr FeedTouchEvent = nullptr; - WvViewFeedMouseDownFnPtr FeedMouseDown = nullptr; - WvViewFeedMouseUpFnPtr FeedMouseUp = nullptr; - WvViewFeedMouseMoveFnPtr FeedMouseMove = nullptr; - WvViewFeedMouseWheelFnPtr FeedMouseWheel = nullptr; - WvViewSendKeyEventFnPtr SendKeyEvent = nullptr; - WvViewTouchEventsEnabledSetFnPtr TouchEventsEnabledSet = nullptr; - WvViewMouseEventsEnabledSetFnPtr MouseEventsEnabledSet = nullptr; - WvViewKeyEventsEnabledSetFnPtr KeyEventsEnabledSet = nullptr; - WvViewImeWindowSetFnPtr ImeWindowSet = nullptr; - WvViewAddCallbackFnPtr AddCallback = nullptr; - WvViewRemoveFullCallbackFnPtr RemoveFullCallback = nullptr; - WvViewJavaScriptAlertCallbackSetFnPtr OnJavaScriptAlert = nullptr; - WvViewJavaScriptConfirmCallbackSetFnPtr OnJavaScriptConfirm = nullptr; - WvViewJavaScriptPromptCallbackSetFnPtr OnJavaScriptPrompt = nullptr; - WvViewJavaScriptAlertReplyFnPtr JavaScriptAlertReply = nullptr; - WvViewJavaScriptConfirmReplyFnPtr JavaScriptConfirmReply = nullptr; - WvViewJavaScriptPromptReplyFnPtr JavaScriptPromptReply = nullptr; - WvViewSetSupportVideoHoleFnPtr SetSupportVideoHole = nullptr; - WvViewMainFrameScrollbarVisibleSetFnPtr MainFrameScrollbarVisibleSet = - nullptr; -} WvViewProcTable; - -typedef wv_cookie_manager_h (*WvContextCookieManagerGetFnPtr)( - wv_context_h context); -typedef bool (*WvContextCacheModelSetFnPtr)(wv_context_h context, - wv_cache_model_e model); -typedef bool (*WvContextCacheClearFnPtr)(wv_context_h context); - -typedef struct { - WvContextCookieManagerGetFnPtr CookieManagerGet = nullptr; - WvContextCacheModelSetFnPtr CacheModelSet = nullptr; - WvContextCacheClearFnPtr CacheClear = nullptr; -} WvContextProcTable; - -typedef void (*WvCookieManagerAcceptPolicySetFnPtr)( - wv_cookie_manager_h manager, wv_cookie_accept_policy_e policy); -typedef void (*WvCookieManagerCookiesClearFnPtr)(wv_cookie_manager_h manager); - -typedef struct { - WvCookieManagerAcceptPolicySetFnPtr AcceptPolicySet = nullptr; - WvCookieManagerCookiesClearFnPtr CookiesClear = nullptr; -} WvCookieManagerProcTable; - -typedef bool (*WvSettingsJavaScriptEnabledSetFnPtr)(wv_settings_h settings, - bool enable); -typedef void (*WvSettingsImePanelEnabledSetFnPtr)(wv_settings_h settings, - bool enable); -typedef bool (*WvSettingsForceZoomSetFnPtr)(wv_settings_h settings, - bool enable); - -typedef struct { - WvSettingsJavaScriptEnabledSetFnPtr JavaScriptEnabledSet = nullptr; - WvSettingsImePanelEnabledSetFnPtr ImePanelEnabledSet = nullptr; - WvSettingsForceZoomSetFnPtr ForceZoomSet = nullptr; -} WvSettingsProcTable; - -typedef int (*WvErrorCodeGetFnPtr)(wv_error_h error); -typedef const char* (*WvErrorDescriptionGetFnPtr)(wv_error_h error); -typedef const char* (*WvErrorUrlGetFnPtr)(wv_error_h error); - -typedef struct { - WvErrorCodeGetFnPtr CodeGet = nullptr; - WvErrorDescriptionGetFnPtr DescriptionGet = nullptr; - WvErrorUrlGetFnPtr UrlGet = nullptr; -} WvErrorProcTable; - -typedef bool (*WvPolicyDecisionUseFnPtr)(wv_policy_decision_h policy_decision); -typedef const char* (*WvPolicyDecisionUrlGetFnPtr)( - wv_policy_decision_h policy_decision); - -typedef struct { - WvPolicyDecisionUseFnPtr Use = nullptr; - WvPolicyDecisionUrlGetFnPtr UrlGet = nullptr; -} WvPolicyDecisionProcTable; - -typedef wv_console_message_level_e (*WvConsoleMessageLevelGetFnPtr)( - wv_console_message_h message); -typedef const char* (*WvConsoleMessageTextGetFnPtr)( - wv_console_message_h message); - -typedef struct { - WvConsoleMessageLevelGetFnPtr LevelGet = nullptr; - WvConsoleMessageTextGetFnPtr TextGet = nullptr; -} WvConsoleMessageProcTable; - -class WvInternalApiBinding { - public: - static WvInternalApiBinding& GetInstance() { - static WvInternalApiBinding instance = WvInternalApiBinding(); - return instance; - } - - ~WvInternalApiBinding(); - - WvInternalApiBinding(const WvInternalApiBinding&) = delete; - WvInternalApiBinding& operator=(const WvInternalApiBinding&) = delete; - - bool Initialize(); - - WvMainProcTable main; - WvViewProcTable view; - WvContextProcTable context; - WvCookieManagerProcTable cookie_manager; - WvSettingsProcTable settings; - WvErrorProcTable error; - WvPolicyDecisionProcTable policy_decision; - WvConsoleMessageProcTable console_message; - - private: - WvInternalApiBinding(); - - void* handle_ = nullptr; - std::optional initialize_result_; -}; - -#endif // FLUTTER_PLUGIN_WV_INTERNAL_API_BINDING_H_ diff --git a/packages/flutter_inappwebview/tizen/src/wv_webview_backend.cc b/packages/flutter_inappwebview/tizen/src/wv_webview_backend.cc index 348d6e8d6..7574752ea 100644 --- a/packages/flutter_inappwebview/tizen/src/wv_webview_backend.cc +++ b/packages/flutter_inappwebview/tizen/src/wv_webview_backend.cc @@ -74,7 +74,6 @@ wv_modifier_e ConvertModifiers(unsigned int modifiers) { WvWebViewBackend::WvWebViewBackend(Delegate* delegate) : delegate_(delegate) {} bool WvWebViewBackend::GlobalInitialize(bool standalone) { - auto& wv = WvInternalApiBinding::GetInstance(); std::vector argv = { "--disable-pinch", "--js-flags=--expose-gc", @@ -84,12 +83,13 @@ bool WvWebViewBackend::GlobalInitialize(bool standalone) { if (standalone) { argv.push_back("--enable-wv-standalone"); } - int result = wv.main.SetArguments(static_cast(argv.size()), argv.data()); + int result = ftpw_flutter_inappwebview_wv_set_arguments( + static_cast(argv.size()), argv.data()); if (result != 0) { LOG_ERROR("wv_set_arguments() returned %d.", result); return false; } - result = wv.main.Init(); + result = ftpw_flutter_inappwebview_wv_init(); if (result <= 0) { LOG_ERROR("wv_init() returned %d.", result); return false; @@ -99,131 +99,139 @@ bool WvWebViewBackend::GlobalInitialize(bool standalone) { void WvWebViewBackend::GlobalShutdown() { FlushPendingTeardowns(); - WvInternalApiBinding::GetInstance().main.Shutdown(); + ftpw_flutter_inappwebview_wv_shutdown(); } bool WvWebViewBackend::Create(double width, double height, void* window) { - auto& wv = WvInternalApiBinding::GetInstance(); - - view_ = wv.view.Create(); + view_ = ftpw_flutter_inappwebview_wv_view_create(); if (!view_) { return false; } - wv.view.FocusSet(view_, 1); + ftpw_flutter_inappwebview_wv_view_focus_set(view_, 1); - wv_context_h context = wv.view.ContextGet(view_); + void* context = ftpw_flutter_inappwebview_wv_view_context_get(view_); if (context) { - wv_cookie_manager_h cookie_manager = wv.context.CookieManagerGet(context); + void* cookie_manager = + ftpw_flutter_inappwebview_wv_context_cookie_manager_get(context); if (cookie_manager) { - wv.cookie_manager.AcceptPolicySet(cookie_manager, - WV_COOKIE_ACCEPT_POLICY_NO_THIRD_PARTY); + ftpw_flutter_inappwebview_wv_cookie_manager_accept_policy_set( + cookie_manager, WV_COOKIE_ACCEPT_POLICY_NO_THIRD_PARTY); } - wv.context.CacheModelSet(context, WV_CACHE_MODEL_PRIMARY_WEBBROWSER); + ftpw_flutter_inappwebview_wv_context_cache_model_set( + context, WV_CACHE_MODEL_PRIMARY_WEBBROWSER); } else { LOG_WARN("Unable to access the WV context; skipping cookie/cache setup."); } - wv_settings_h settings = wv.view.SettingsGet(view_); - wv.settings.ImePanelEnabledSet(settings, true); - wv.settings.ForceZoomSet(settings, true); - wv.view.ImeWindowSet(view_, window); - wv.view.KeyEventsEnabledSet(view_, true); + void* settings = ftpw_flutter_inappwebview_wv_view_settings_get(view_); + ftpw_flutter_inappwebview_wv_settings_ime_panel_enabled_set(settings, true); + ftpw_flutter_inappwebview_wv_settings_force_zoom_set(settings, true); + ftpw_flutter_inappwebview_wv_view_ime_window_set(view_, window); + ftpw_flutter_inappwebview_wv_view_key_events_enabled_set(view_, true); #ifdef WEBVIEW_TIZEN_TOUCH_EVENTS_ENABLED - wv.view.TouchEventsEnabledSet(view_, true); - wv.view.MouseEventsEnabledSet(view_, false); + ftpw_flutter_inappwebview_wv_view_touch_events_enabled_set(view_, true); + ftpw_flutter_inappwebview_wv_view_mouse_events_enabled_set(view_, false); #else - wv.view.TouchEventsEnabledSet(view_, false); - wv.view.MouseEventsEnabledSet(view_, true); + ftpw_flutter_inappwebview_wv_view_touch_events_enabled_set(view_, false); + ftpw_flutter_inappwebview_wv_view_mouse_events_enabled_set(view_, true); #endif - wv.view.OnJavaScriptAlert(view_, &WvWebViewBackend::OnJavaScriptAlertDialog, - this); - wv.view.OnJavaScriptConfirm( + ftpw_flutter_inappwebview_wv_view_javascript_alert_callback_set( + view_, &WvWebViewBackend::OnJavaScriptAlertDialog, this); + ftpw_flutter_inappwebview_wv_view_javascript_confirm_callback_set( view_, &WvWebViewBackend::OnJavaScriptConfirmDialog, this); - wv.view.OnJavaScriptPrompt(view_, &WvWebViewBackend::OnJavaScriptPromptDialog, - this); + ftpw_flutter_inappwebview_wv_view_javascript_prompt_callback_set( + view_, &WvWebViewBackend::OnJavaScriptPromptDialog, this); #ifdef TV_PROFILE - wv.view.SetSupportVideoHole(view_, window, true, false); + ftpw_flutter_inappwebview_wv_view_set_support_video_hole(view_, window, true, + false); #endif - wv.view.AddCallback(view_, "offscreen,frame,rendered", - &WvWebViewBackend::OnFrameRendered, this); - wv.view.AddCallback(view_, "load,started", &WvWebViewBackend::OnLoadStarted, - this); - wv.view.AddCallback(view_, "load,finished", &WvWebViewBackend::OnLoadFinished, - this); - wv.view.AddCallback(view_, "load,progress", &WvWebViewBackend::OnProgress, - this); - wv.view.AddCallback(view_, "load,error", &WvWebViewBackend::OnLoadError, - this); - wv.view.AddCallback(view_, "console,message", - &WvWebViewBackend::OnConsoleMessage, this); - wv.view.AddCallback(view_, "policy,navigation,decide", - &WvWebViewBackend::OnNavigationPolicy, this); - wv.view.AddCallback(view_, "url,changed", &WvWebViewBackend::OnUrlChange, - this); - wv.view.AddCallback(view_, "title,changed", &WvWebViewBackend::OnTitleChange, - this); - - wv.view.Resize(view_, static_cast(std::round(width)), - static_cast(std::round(height))); + ftpw_flutter_inappwebview_wv_view_add_cb(view_, "offscreen,frame,rendered", + &WvWebViewBackend::OnFrameRendered, + this); + ftpw_flutter_inappwebview_wv_view_add_cb( + view_, "load,started", &WvWebViewBackend::OnLoadStarted, this); + ftpw_flutter_inappwebview_wv_view_add_cb( + view_, "load,finished", &WvWebViewBackend::OnLoadFinished, this); + ftpw_flutter_inappwebview_wv_view_add_cb(view_, "load,progress", + &WvWebViewBackend::OnProgress, this); + ftpw_flutter_inappwebview_wv_view_add_cb( + view_, "load,error", &WvWebViewBackend::OnLoadError, this); + ftpw_flutter_inappwebview_wv_view_add_cb( + view_, "console,message", &WvWebViewBackend::OnConsoleMessage, this); + ftpw_flutter_inappwebview_wv_view_add_cb( + view_, "policy,navigation,decide", &WvWebViewBackend::OnNavigationPolicy, + this); + ftpw_flutter_inappwebview_wv_view_add_cb( + view_, "url,changed", &WvWebViewBackend::OnUrlChange, this); + ftpw_flutter_inappwebview_wv_view_add_cb( + view_, "title,changed", &WvWebViewBackend::OnTitleChange, this); + + ftpw_flutter_inappwebview_wv_view_resize( + view_, static_cast(std::round(width)), + static_cast(std::round(height))); return true; } WvWebViewBackend::~WvWebViewBackend() { - if (wv_view_h instance = DetachView()) { - WvInternalApiBinding::GetInstance().view.Destroy(instance); + if (void* instance = DetachView()) { + ftpw_flutter_inappwebview_wv_view_destroy(instance); } } -wv_view_h WvWebViewBackend::DetachView() { - wv_view_h instance = view_; +void* WvWebViewBackend::DetachView() { + void* instance = view_; view_ = nullptr; if (!instance) { return nullptr; } - auto& wv = WvInternalApiBinding::GetInstance(); - wv.view.RemoveFullCallback(instance, "offscreen,frame,rendered", - &WvWebViewBackend::OnFrameRendered, this); - wv.view.RemoveFullCallback(instance, "load,started", - &WvWebViewBackend::OnLoadStarted, this); - wv.view.RemoveFullCallback(instance, "load,finished", - &WvWebViewBackend::OnLoadFinished, this); - wv.view.RemoveFullCallback(instance, "load,progress", - &WvWebViewBackend::OnProgress, this); - wv.view.RemoveFullCallback(instance, "load,error", - &WvWebViewBackend::OnLoadError, this); - wv.view.RemoveFullCallback(instance, "console,message", - &WvWebViewBackend::OnConsoleMessage, this); - wv.view.RemoveFullCallback(instance, "policy,navigation,decide", - &WvWebViewBackend::OnNavigationPolicy, this); - wv.view.RemoveFullCallback(instance, "url,changed", - &WvWebViewBackend::OnUrlChange, this); - wv.view.RemoveFullCallback(instance, "title,changed", - &WvWebViewBackend::OnTitleChange, this); - - wv.view.OnJavaScriptAlert(instance, nullptr, nullptr); - wv.view.OnJavaScriptConfirm(instance, nullptr, nullptr); - wv.view.OnJavaScriptPrompt(instance, nullptr, nullptr); + ftpw_flutter_inappwebview_wv_view_remove_full_cb( + instance, "offscreen,frame,rendered", &WvWebViewBackend::OnFrameRendered, + this); + ftpw_flutter_inappwebview_wv_view_remove_full_cb( + instance, "load,started", &WvWebViewBackend::OnLoadStarted, this); + ftpw_flutter_inappwebview_wv_view_remove_full_cb( + instance, "load,finished", &WvWebViewBackend::OnLoadFinished, this); + ftpw_flutter_inappwebview_wv_view_remove_full_cb( + instance, "load,progress", &WvWebViewBackend::OnProgress, this); + ftpw_flutter_inappwebview_wv_view_remove_full_cb( + instance, "load,error", &WvWebViewBackend::OnLoadError, this); + ftpw_flutter_inappwebview_wv_view_remove_full_cb( + instance, "console,message", &WvWebViewBackend::OnConsoleMessage, this); + ftpw_flutter_inappwebview_wv_view_remove_full_cb( + instance, "policy,navigation,decide", + &WvWebViewBackend::OnNavigationPolicy, this); + ftpw_flutter_inappwebview_wv_view_remove_full_cb( + instance, "url,changed", &WvWebViewBackend::OnUrlChange, this); + ftpw_flutter_inappwebview_wv_view_remove_full_cb( + instance, "title,changed", &WvWebViewBackend::OnTitleChange, this); + + ftpw_flutter_inappwebview_wv_view_javascript_alert_callback_set( + instance, nullptr, nullptr); + ftpw_flutter_inappwebview_wv_view_javascript_confirm_callback_set( + instance, nullptr, nullptr); + ftpw_flutter_inappwebview_wv_view_javascript_prompt_callback_set( + instance, nullptr, nullptr); // NOTE: A suspended view must be resumed before it can be stopped. - wv.view.Resume(instance); - wv.view.Stop(instance); + ftpw_flutter_inappwebview_wv_view_resume(instance); + ftpw_flutter_inappwebview_wv_view_stop(instance); return instance; } std::function WvWebViewBackend::PrepareTeardown( std::shared_ptr pool) { - wv_view_h instance = DetachView(); + void* instance = DetachView(); std::function destroy; if (instance) { destroy = [instance]() { - WvInternalApiBinding::GetInstance().view.Destroy(instance); + ftpw_flutter_inappwebview_wv_view_destroy(instance); }; } @@ -235,7 +243,7 @@ void WvWebViewBackend::Offset(double /* left */, double /* top */) { } void WvWebViewBackend::Resize(double width, double height) { - WvInternalApiBinding::GetInstance().view.Resize( + ftpw_flutter_inappwebview_wv_view_resize( view_, static_cast(std::round(width)), static_cast(std::round(height))); } @@ -272,8 +280,8 @@ void WvWebViewBackend::SendTouchEvent(int event_type, double x, double y) { point.state = state; GList* points = g_list_append(nullptr, &point); - WvInternalApiBinding::GetInstance().view.FeedTouchEvent( - view_, touch_event_type, points, WV_MODIFIER_NONE); + ftpw_flutter_inappwebview_wv_view_feed_touch_event(view_, touch_event_type, + points, WV_MODIFIER_NONE); g_list_free(points); } @@ -296,16 +304,18 @@ void WvWebViewBackend::SendMouseEvent(int event_type, int button_type, double x, int px = static_cast(std::round(x)); int py = static_cast(std::round(y)); - auto& wv = WvInternalApiBinding::GetInstance(); if (event_type == 0) { mouse_button_type_ = mouse_button_type; - wv.view.FeedMouseDown(view_, mouse_button_type_, px, py); + ftpw_flutter_inappwebview_wv_view_feed_mouse_down(view_, mouse_button_type_, + px, py); } else if (event_type == 1) { if (dy != 0) { - wv.view.FeedMouseWheel(view_, true, dy > 0 ? 1 : -1, px, py); + ftpw_flutter_inappwebview_wv_view_feed_mouse_wheel( + view_, true, dy > 0 ? 1 : -1, px, py); } } else if (event_type == 2) { - wv.view.FeedMouseUp(view_, mouse_button_type_, px, py); + ftpw_flutter_inappwebview_wv_view_feed_mouse_up(view_, mouse_button_type_, + px, py); mouse_button_type_ = mouse_button_type; } else { LOG_WARN("Unknown mouse event type: %d", event_type); @@ -319,10 +329,9 @@ bool WvWebViewBackend::SendKey(const char* key, const char* string, return false; } - auto& wv = WvInternalApiBinding::GetInstance(); if (key && strcmp(key, "XF86Back") == 0 && !is_down) { - if (wv.view.BackPossible(view_)) { - wv.view.Back(view_); + if (ftpw_flutter_inappwebview_wv_view_back_possible(view_)) { + ftpw_flutter_inappwebview_wv_view_back(view_); return true; } return false; @@ -335,35 +344,36 @@ bool WvWebViewBackend::SendKey(const char* key, const char* string, key_event.compose = compose; key_event.modifiers = ConvertModifiers(modifiers); key_event.key_code = scan_code; - wv.view.SendKeyEvent(view_, &key_event, is_down ? 1 : 0); + ftpw_flutter_inappwebview_wv_view_send_key_event(view_, &key_event, + is_down ? 1 : 0); return true; } void WvWebViewBackend::Resume() { if (view_) { - WvInternalApiBinding::GetInstance().view.Resume(view_); + ftpw_flutter_inappwebview_wv_view_resume(view_); } } void WvWebViewBackend::Suspend() { if (view_) { - WvInternalApiBinding::GetInstance().view.Suspend(view_); + ftpw_flutter_inappwebview_wv_view_suspend(view_); } } void WvWebViewBackend::Stop() { if (view_) { - WvInternalApiBinding::GetInstance().view.Stop(view_); + ftpw_flutter_inappwebview_wv_view_stop(view_); } } void WvWebViewBackend::SetJavaScriptEnabled(bool enabled) { - auto& wv = WvInternalApiBinding::GetInstance(); - wv.settings.JavaScriptEnabledSet(wv.view.SettingsGet(view_), enabled); + ftpw_flutter_inappwebview_wv_settings_javascript_enabled_set( + ftpw_flutter_inappwebview_wv_view_settings_get(view_), enabled); } bool WvWebViewBackend::LoadUrl(const std::string& url) { - return WvInternalApiBinding::GetInstance().view.UrlSet(view_, url.c_str()); + return ftpw_flutter_inappwebview_wv_view_url_set(view_, url.c_str()); } bool WvWebViewBackend::LoadUrlRequest( @@ -384,7 +394,7 @@ bool WvWebViewBackend::LoadUrlRequest( // NOTE: The WV API requires a NUL-terminated non-empty request body. std::string body_str(body.begin(), body.end()); - bool ret = WvInternalApiBinding::GetInstance().view.UrlRequestSet( + bool ret = ftpw_flutter_inappwebview_wv_view_url_request_set( view_, url.c_str(), wv_method, wv_headers, body.empty() ? nullptr : body_str.c_str()); g_hash_table_destroy(wv_headers); @@ -393,32 +403,32 @@ bool WvWebViewBackend::LoadUrlRequest( bool WvWebViewBackend::LoadHtmlString(const std::string& html, const std::string& base_url) { - return WvInternalApiBinding::GetInstance().view.HtmlStringLoad( + return ftpw_flutter_inappwebview_wv_view_html_string_load( view_, html.c_str(), base_url.c_str(), nullptr); } bool WvWebViewBackend::CanGoBack() { - return WvInternalApiBinding::GetInstance().view.BackPossible(view_); + return ftpw_flutter_inappwebview_wv_view_back_possible(view_); } bool WvWebViewBackend::CanGoForward() { - return WvInternalApiBinding::GetInstance().view.ForwardPossible(view_); + return ftpw_flutter_inappwebview_wv_view_forward_possible(view_); } bool WvWebViewBackend::GoBack() { - return WvInternalApiBinding::GetInstance().view.Back(view_); + return ftpw_flutter_inappwebview_wv_view_back(view_); } bool WvWebViewBackend::GoForward() { - return WvInternalApiBinding::GetInstance().view.Forward(view_); + return ftpw_flutter_inappwebview_wv_view_forward(view_); } bool WvWebViewBackend::Reload() { - return WvInternalApiBinding::GetInstance().view.Reload(view_); + return ftpw_flutter_inappwebview_wv_view_reload(view_); } std::string WvWebViewBackend::GetCurrentUrl() { - const char* url = WvInternalApiBinding::GetInstance().view.UrlGet(view_); + const char* url = ftpw_flutter_inappwebview_wv_view_url_get(view_); return url ? url : ""; } @@ -426,8 +436,7 @@ int32_t WvWebViewBackend::GetProgress() { if (!view_) { return 0; } - double progress = - WvInternalApiBinding::GetInstance().view.LoadProgressGet(view_); + double progress = ftpw_flutter_inappwebview_wv_view_load_progress_get(view_); if (progress < 0) { return 0; } @@ -438,12 +447,12 @@ double WvWebViewBackend::GetScale() { if (!view_) { return 1.0; } - double scale = WvInternalApiBinding::GetInstance().view.ScaleGet(view_); + double scale = ftpw_flutter_inappwebview_wv_view_scale_get(view_); return scale > 0 ? scale : 1.0; } void WvWebViewBackend::SetScale(double scale, int32_t x, int32_t y) { - WvInternalApiBinding::GetInstance().view.ScaleSet(view_, scale, x, y); + ftpw_flutter_inappwebview_wv_view_scale_set(view_, scale, x, y); } void WvWebViewBackend::EvaluateJavaScript( @@ -451,7 +460,7 @@ void WvWebViewBackend::EvaluateJavaScript( std::function callback) { auto* callback_ptr = new std::function(std::move(callback)); - if (!WvInternalApiBinding::GetInstance().view.ScriptExecute( + if (!ftpw_flutter_inappwebview_wv_view_script_execute( view_, javascript.c_str(), &WvWebViewBackend::OnEvaluateJavaScript, callback_ptr)) { LOG_WARN("wv_view_script_execute failed."); @@ -461,75 +470,72 @@ void WvWebViewBackend::EvaluateJavaScript( } void WvWebViewBackend::ClearCache() { - auto& wv = WvInternalApiBinding::GetInstance(); - wv_context_h context = wv.view.ContextGet(view_); + void* context = ftpw_flutter_inappwebview_wv_view_context_get(view_); if (context) { - wv.context.CacheClear(context); + ftpw_flutter_inappwebview_wv_context_cache_clear(context); } } std::string WvWebViewBackend::GetTitle() { - const char* title = WvInternalApiBinding::GetInstance().view.TitleGet(view_); + const char* title = ftpw_flutter_inappwebview_wv_view_title_get(view_); return title ? title : ""; } void WvWebViewBackend::ScrollTo(int32_t x, int32_t y) { - WvInternalApiBinding::GetInstance().view.ScrollSet(view_, x, y); + ftpw_flutter_inappwebview_wv_view_scroll_set(view_, x, y); } void WvWebViewBackend::GetScrollPosition(int32_t* x, int32_t* y) { - WvInternalApiBinding::GetInstance().view.ScrollPosGet(view_, x, y); + ftpw_flutter_inappwebview_wv_view_scroll_pos_get(view_, x, y); } void WvWebViewBackend::SetBackgroundColor(int r, int g, int b, int a) { - WvInternalApiBinding::GetInstance().view.BgColorSet(view_, r, g, b, a); + ftpw_flutter_inappwebview_wv_view_bg_color_set(view_, r, g, b, a); } void WvWebViewBackend::SetUserAgent(const std::string& user_agent) { - WvInternalApiBinding::GetInstance().view.UserAgentSet(view_, - user_agent.c_str()); + ftpw_flutter_inappwebview_wv_view_user_agent_set(view_, user_agent.c_str()); } std::string WvWebViewBackend::GetUserAgent() { const char* user_agent = - WvInternalApiBinding::GetInstance().view.UserAgentGet(view_); + ftpw_flutter_inappwebview_wv_view_user_agent_get(view_); return user_agent ? user_agent : ""; } void WvWebViewBackend::EnableZoom(bool enabled) { - auto& wv = WvInternalApiBinding::GetInstance(); - wv.settings.ForceZoomSet(wv.view.SettingsGet(view_), enabled); + ftpw_flutter_inappwebview_wv_settings_force_zoom_set( + ftpw_flutter_inappwebview_wv_view_settings_get(view_), enabled); } void WvWebViewBackend::JavaScriptAlertReply() { - WvInternalApiBinding::GetInstance().view.JavaScriptAlertReply(view_); + ftpw_flutter_inappwebview_wv_view_javascript_alert_reply(view_); } void WvWebViewBackend::JavaScriptConfirmReply(bool result) { - WvInternalApiBinding::GetInstance().view.JavaScriptConfirmReply(view_, - result); + ftpw_flutter_inappwebview_wv_view_javascript_confirm_reply(view_, result); } void WvWebViewBackend::JavaScriptPromptReply(const char* result) { - WvInternalApiBinding::GetInstance().view.JavaScriptPromptReply(view_, result); + ftpw_flutter_inappwebview_wv_view_javascript_prompt_reply(view_, result); } bool WvWebViewBackend::ClearCookies() { if (!view_) { return false; } - auto& wv = WvInternalApiBinding::GetInstance(); - wv_context_h context = wv.view.ContextGet(view_); - wv_cookie_manager_h cookie_manager = - context ? wv.context.CookieManagerGet(context) : nullptr; + void* context = ftpw_flutter_inappwebview_wv_view_context_get(view_); + void* cookie_manager = + context ? ftpw_flutter_inappwebview_wv_context_cookie_manager_get(context) + : nullptr; if (cookie_manager) { - wv.cookie_manager.CookiesClear(cookie_manager); + ftpw_flutter_inappwebview_wv_cookie_manager_cookies_clear(cookie_manager); return true; } return false; } -void WvWebViewBackend::OnFrameRendered(wv_view_h obj, void* event_info, +void WvWebViewBackend::OnFrameRendered(void* obj, void* event_info, void* user_data) { if (event_info) { static_cast(user_data)->delegate_->OnFrameRendered( @@ -537,24 +543,23 @@ void WvWebViewBackend::OnFrameRendered(wv_view_h obj, void* event_info, } } -void WvWebViewBackend::OnLoadStarted(wv_view_h obj, void* event_info, +void WvWebViewBackend::OnLoadStarted(void* obj, void* event_info, void* user_data) { WvWebViewBackend* backend = static_cast(user_data); - auto& wv = WvInternalApiBinding::GetInstance(); - wv.view.MainFrameScrollbarVisibleSet(backend->view_, true); - const char* url = wv.view.UrlGet(backend->view_); + ftpw_flutter_inappwebview_wv_view_main_frame_scrollbar_visible_set( + backend->view_, true); + const char* url = ftpw_flutter_inappwebview_wv_view_url_get(backend->view_); backend->delegate_->OnLoadStarted(url ? url : ""); } -void WvWebViewBackend::OnLoadFinished(wv_view_h obj, void* event_info, +void WvWebViewBackend::OnLoadFinished(void* obj, void* event_info, void* user_data) { WvWebViewBackend* backend = static_cast(user_data); - const char* url = - WvInternalApiBinding::GetInstance().view.UrlGet(backend->view_); + const char* url = ftpw_flutter_inappwebview_wv_view_url_get(backend->view_); backend->delegate_->OnLoadFinished(url ? url : ""); } -void WvWebViewBackend::OnProgress(wv_view_h obj, void* event_info, +void WvWebViewBackend::OnProgress(void* obj, void* event_info, void* user_data) { if (!event_info) { return; @@ -565,54 +570,55 @@ void WvWebViewBackend::OnProgress(wv_view_h obj, void* event_info, backend->delegate_->OnProgress(progress); } -void WvWebViewBackend::OnLoadError(wv_view_h obj, void* event_info, +void WvWebViewBackend::OnLoadError(void* obj, void* event_info, void* user_data) { WvWebViewBackend* backend = static_cast(user_data); - wv_error_h error = static_cast(event_info); - auto& wv = WvInternalApiBinding::GetInstance(); - const char* description = wv.error.DescriptionGet(error); - const char* url = wv.error.UrlGet(error); + void* error = static_cast(event_info); + const char* description = + ftpw_flutter_inappwebview_wv_error_description_get(error); + const char* url = ftpw_flutter_inappwebview_wv_error_url_get(error); backend->delegate_->OnLoadError( - wv.error.CodeGet(error), description ? description : "", url ? url : ""); + ftpw_flutter_inappwebview_wv_error_code_get(error), + description ? description : "", url ? url : ""); } -void WvWebViewBackend::OnConsoleMessage(wv_view_h obj, void* event_info, +void WvWebViewBackend::OnConsoleMessage(void* obj, void* event_info, void* user_data) { WvWebViewBackend* backend = static_cast(user_data); - wv_console_message_h message = static_cast(event_info); - auto& wv = WvInternalApiBinding::GetInstance(); - wv_console_message_level_e log_level = wv.console_message.LevelGet(message); - const char* text = wv.console_message.TextGet(message); + void* message = static_cast(event_info); + wv_console_message_level_e log_level = + ftpw_flutter_inappwebview_wv_console_message_level_get(message); + const char* text = + ftpw_flutter_inappwebview_wv_console_message_text_get(message); backend->delegate_->OnConsoleMessage(ConvertLogLevelToString(log_level), text ? text : ""); } -void WvWebViewBackend::OnNavigationPolicy(wv_view_h obj, void* event_info, +void WvWebViewBackend::OnNavigationPolicy(void* obj, void* event_info, void* user_data) { WvWebViewBackend* backend = static_cast(user_data); - wv_policy_decision_h policy_decision = - static_cast(event_info); - auto& wv = WvInternalApiBinding::GetInstance(); + void* policy_decision = static_cast(event_info); - const char* current_url = wv.view.UrlGet(backend->view_); + const char* current_url = + ftpw_flutter_inappwebview_wv_view_url_get(backend->view_); const std::string url_before_navigation = current_url ? current_url : ""; - const char* url = wv.policy_decision.UrlGet(policy_decision); + const char* url = + ftpw_flutter_inappwebview_wv_policy_decision_url_get(policy_decision); const std::string requested_url = url ? url : ""; - wv.policy_decision.Use(policy_decision); + ftpw_flutter_inappwebview_wv_policy_decision_use(policy_decision); backend->delegate_->OnNavigationPolicyDecide(requested_url, url_before_navigation); } -void WvWebViewBackend::OnUrlChange(wv_view_h obj, void* event_info, +void WvWebViewBackend::OnUrlChange(void* obj, void* event_info, void* user_data) { WvWebViewBackend* backend = static_cast(user_data); - const char* url = - WvInternalApiBinding::GetInstance().view.UrlGet(backend->view_); + const char* url = ftpw_flutter_inappwebview_wv_view_url_get(backend->view_); backend->delegate_->OnUrlChanged(url ? url : ""); } -void WvWebViewBackend::OnTitleChange(wv_view_h obj, void* event_info, +void WvWebViewBackend::OnTitleChange(void* obj, void* event_info, void* user_data) { const char* title = static_cast(event_info); if (!title) { @@ -621,8 +627,7 @@ void WvWebViewBackend::OnTitleChange(wv_view_h obj, void* event_info, static_cast(user_data)->delegate_->OnTitleChanged(title); } -void WvWebViewBackend::OnEvaluateJavaScript(wv_view_h obj, - const char* result_value, +void WvWebViewBackend::OnEvaluateJavaScript(void* obj, const char* result_value, void* user_data) { auto* callback = static_cast*>(user_data); @@ -630,35 +635,30 @@ void WvWebViewBackend::OnEvaluateJavaScript(wv_view_h obj, delete callback; } -bool WvWebViewBackend::OnJavaScriptAlertDialog(wv_view_h view, - const char* message, +bool WvWebViewBackend::OnJavaScriptAlertDialog(void* view, const char* message, void* data) { WvWebViewBackend* backend = static_cast(data); - const char* url = - WvInternalApiBinding::GetInstance().view.UrlGet(backend->view_); + const char* url = ftpw_flutter_inappwebview_wv_view_url_get(backend->view_); backend->delegate_->OnJavaScriptAlertDialog(message ? message : "", url ? url : ""); return true; } -bool WvWebViewBackend::OnJavaScriptConfirmDialog(wv_view_h view, +bool WvWebViewBackend::OnJavaScriptConfirmDialog(void* view, const char* message, void* data) { WvWebViewBackend* backend = static_cast(data); - const char* url = - WvInternalApiBinding::GetInstance().view.UrlGet(backend->view_); + const char* url = ftpw_flutter_inappwebview_wv_view_url_get(backend->view_); backend->delegate_->OnJavaScriptConfirmDialog(message ? message : "", url ? url : ""); return true; } -bool WvWebViewBackend::OnJavaScriptPromptDialog(wv_view_h view, - const char* message, +bool WvWebViewBackend::OnJavaScriptPromptDialog(void* view, const char* message, const char* default_text, void* data) { WvWebViewBackend* backend = static_cast(data); - const char* url = - WvInternalApiBinding::GetInstance().view.UrlGet(backend->view_); + const char* url = ftpw_flutter_inappwebview_wv_view_url_get(backend->view_); backend->delegate_->OnJavaScriptPromptDialog( message ? message : "", default_text ? default_text : "", url ? url : ""); return true; diff --git a/packages/flutter_inappwebview/tizen/src/wv_webview_backend.h b/packages/flutter_inappwebview/tizen/src/wv_webview_backend.h index 4071d012e..b40210895 100644 --- a/packages/flutter_inappwebview/tizen/src/wv_webview_backend.h +++ b/packages/flutter_inappwebview/tizen/src/wv_webview_backend.h @@ -12,8 +12,8 @@ #include #include +#include "ftpw_flutter_inappwebview.h" #include "webview_backend.h" -#include "wv_internal_api_binding.h" class WvWebViewBackend : public WebViewBackend { public: @@ -74,26 +74,24 @@ class WvWebViewBackend : public WebViewBackend { static void GlobalShutdown(); private: - wv_view_h DetachView(); - - static void OnFrameRendered(wv_view_h obj, void* event_info, void* user_data); - static void OnLoadStarted(wv_view_h obj, void* event_info, void* user_data); - static void OnLoadFinished(wv_view_h obj, void* event_info, void* user_data); - static void OnProgress(wv_view_h obj, void* event_info, void* user_data); - static void OnLoadError(wv_view_h obj, void* event_info, void* user_data); - static void OnConsoleMessage(wv_view_h obj, void* event_info, - void* user_data); - static void OnNavigationPolicy(wv_view_h obj, void* event_info, - void* user_data); - static void OnUrlChange(wv_view_h obj, void* event_info, void* user_data); - static void OnTitleChange(wv_view_h obj, void* event_info, void* user_data); - static void OnEvaluateJavaScript(wv_view_h obj, const char* result_value, + void* DetachView(); + + static void OnFrameRendered(void* obj, void* event_info, void* user_data); + static void OnLoadStarted(void* obj, void* event_info, void* user_data); + static void OnLoadFinished(void* obj, void* event_info, void* user_data); + static void OnProgress(void* obj, void* event_info, void* user_data); + static void OnLoadError(void* obj, void* event_info, void* user_data); + static void OnConsoleMessage(void* obj, void* event_info, void* user_data); + static void OnNavigationPolicy(void* obj, void* event_info, void* user_data); + static void OnUrlChange(void* obj, void* event_info, void* user_data); + static void OnTitleChange(void* obj, void* event_info, void* user_data); + static void OnEvaluateJavaScript(void* obj, const char* result_value, void* user_data); - static bool OnJavaScriptAlertDialog(wv_view_h view, const char* message, + static bool OnJavaScriptAlertDialog(void* view, const char* message, void* data); - static bool OnJavaScriptConfirmDialog(wv_view_h view, const char* message, + static bool OnJavaScriptConfirmDialog(void* view, const char* message, void* data); - static bool OnJavaScriptPromptDialog(wv_view_h view, const char* message, + static bool OnJavaScriptPromptDialog(void* view, const char* message, const char* default_text, void* data); void SendTouchEvent(int type, double x, double y); @@ -101,7 +99,7 @@ class WvWebViewBackend : public WebViewBackend { double dy); Delegate* delegate_; - wv_view_h view_ = nullptr; + void* view_ = nullptr; wv_mouse_button_type_e mouse_button_type_ = static_cast(0); };