2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "tizen-web-engine-chromium.h"
20 #include "tizen-web-engine-back-forward-list.h"
21 #include "tizen-web-engine-certificate.h"
22 #include "tizen-web-engine-console-message.h"
23 #include "tizen-web-engine-context.h"
24 #include "tizen-web-engine-context-menu.h"
25 #include "tizen-web-engine-context-menu-item.h"
26 #include "tizen-web-engine-cookie-manager.h"
27 #include "tizen-web-engine-form-repost-decision.h"
28 #include "tizen-web-engine-hit-test.h"
29 #include "tizen-web-engine-http-auth-handler.h"
30 #include "tizen-web-engine-load-error.h"
31 #include "tizen-web-engine-policy-decision.h"
32 #include "tizen-web-engine-request-interceptor.h"
33 #include "tizen-web-engine-settings.h"
35 #include <Ecore_Evas.h>
36 #include <Ecore_Wl2.h>
37 #include <Elementary.h>
40 #include <dali/devel-api/common/stage.h>
41 #include <dali/integration-api/adaptor-framework/adaptor.h>
42 #include <dali/integration-api/debug.h>
43 #include <dali/public-api/images/pixel-data.h>
45 #include <ewk_main_internal.h>
46 #include <ewk_settings_product.h>
47 #include <ewk_view_internal.h>
48 #include <ewk_view_product.h>
60 const std::string EMPTY_STRING;
63 class WebViewContainerClientPair
66 WebViewContainerClientPair(WebViewContainerClient* client, Evas_Object* webView)
72 WebViewContainerClient* mClient;
73 Evas_Object* mWebView;
76 class WebEngineManager
79 // A class for managing multiple WebViews
82 static WebEngineManager& Get()
84 static WebEngineManager instance;
88 WebEngineManager(WebEngineManager const&) = delete;
90 void operator=(WebEngineManager const&) = delete;
92 Ecore_Evas* GetWindow()
97 void AddContainerClient(WebViewContainerClient* client, Evas_Object* webView)
99 mContainerClients.push_back(WebViewContainerClientPair(client, webView));
102 void RemoveContainerClient(Evas_Object* webView)
104 for (auto it = mContainerClients.begin(); it != mContainerClients.end();)
106 if ((*it).mWebView == webView)
108 mContainerClients.erase(it);
118 Evas_Object* FindWebView(WebViewContainerClient* client)
120 for (auto& webViewClient : mContainerClients)
122 if (webViewClient.mClient == client)
124 return webViewClient.mWebView;
130 WebViewContainerClient* FindContainerClient(Evas_Object* o)
132 for (auto& webViewClient : mContainerClients)
134 if (webViewClient.mWebView == o)
136 return webViewClient.mClient;
147 mWindow = ecore_evas_new("wayland_egl", 0, 0, 1, 1, 0);
151 std::vector<WebViewContainerClientPair> mContainerClients;
154 class WebViewContainerForDali
157 WebViewContainerForDali(WebViewContainerClient& client, uint32_t width, uint32_t height)
163 , mWebEngineSettings(0)
164 , mWebEngineContext(0)
165 , mWebEngineCookieManager(0)
166 , mWebEngineBackForwardList(0)
170 WebEngineManager::Get().AddContainerClient(&mClient, mWebView);
173 WebViewContainerForDali(WebViewContainerClient& client, uint32_t width, uint32_t height, uint32_t argc, char** argv)
179 , mWebEngineSettings(0)
180 , mWebEngineContext(0)
181 , mWebEngineCookieManager(0)
182 , mWebEngineBackForwardList(0)
184 InitWebView(argc, argv);
186 WebEngineManager::Get().AddContainerClient(&mClient, mWebView);
189 ~WebViewContainerForDali()
191 WebEngineManager::Get().RemoveContainerClient(mWebView);
193 evas_object_del(mWebView);
196 void InitWebView(uint32_t argc, char** argv)
200 ewk_set_arguments(argc, argv);
203 Ecore_Wl2_Window* win = AnyCast<Ecore_Wl2_Window*>(Adaptor::Get().GetNativeWindowHandle());
204 Ewk_Context* context = ewk_context_default_get();
205 ewk_context_max_refresh_rate_set(context, 60);
206 mWebView = ewk_view_add(ecore_evas_get(WebEngineManager::Get().GetWindow()));
207 ewk_view_offscreen_rendering_enabled_set(mWebView, true);
208 ecore_wl2_window_alpha_set(win, false);
209 ewk_view_ime_window_set(mWebView, win);
210 ewk_view_set_support_video_hole(mWebView, win, EINA_TRUE, EINA_FALSE);
212 Ewk_Settings* settings = ewk_view_settings_get(mWebView);
213 mWebEngineSettings = TizenWebEngineSettings(settings);
215 context = ewk_view_context_get(mWebView);
217 ewk_context_intercept_request_callback_set(context, &WebViewContainerForDali::OnInterceptRequest, &mClient);
219 mWebEngineContext = TizenWebEngineContext(context);
221 Ewk_Cookie_Manager* manager = ewk_context_cookie_manager_get(context);
222 mWebEngineCookieManager = TizenWebEngineCookieManager(manager);
224 Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(mWebView);
225 mWebEngineBackForwardList = TizenWebEngineBackForwardList(backForwardList);
227 ewk_settings_viewport_meta_tag_set(settings, false);
229 evas_object_smart_callback_add(mWebView, "offscreen,frame,rendered",
230 &WebViewContainerForDali::OnFrameRendered,
232 evas_object_smart_callback_add(mWebView, "load,started",
233 &WebViewContainerForDali::OnLoadStarted,
235 evas_object_smart_callback_add(mWebView, "load,progress",
236 &WebViewContainerForDali::OnLoadInProgress,
238 evas_object_smart_callback_add(mWebView, "load,finished",
239 &WebViewContainerForDali::OnLoadFinished,
241 evas_object_smart_callback_add(mWebView, "load,error",
242 &WebViewContainerForDali::OnLoadError,
244 evas_object_smart_callback_add(mWebView, "url,changed",
245 &WebViewContainerForDali::OnUrlChanged,
247 evas_object_smart_callback_add(mWebView, "console,message",
248 &WebViewContainerForDali::OnConsoleMessage,
250 evas_object_smart_callback_add(mWebView, "edge,left",
251 &WebViewContainerForDali::OnEdgeLeft,
253 evas_object_smart_callback_add(mWebView, "edge,right",
254 &WebViewContainerForDali::OnEdgeRight,
256 evas_object_smart_callback_add(mWebView, "edge,top",
257 &WebViewContainerForDali::OnEdgeTop,
259 evas_object_smart_callback_add(mWebView, "edge,bottom",
260 &WebViewContainerForDali::OnEdgeBottom,
262 evas_object_smart_callback_add(mWebView, "form,repost,warning,show",
263 &WebViewContainerForDali::OnFormRepostDecisionRequest,
265 evas_object_smart_callback_add(mWebView, "policy,response,decide",
266 &WebViewContainerForDali::OnResponsePolicyDecided,
268 evas_object_smart_callback_add(mWebView, "request,certificate,confirm",
269 &WebViewContainerForDali::OnCertificateConfirmRequest,
271 evas_object_smart_callback_add(mWebView, "ssl,certificate,changed",
272 &WebViewContainerForDali::OnSslCertificateChanged,
274 evas_object_smart_callback_add(mWebView, "contextmenu,customize",
275 &WebViewContainerForDali::OnContextMenuCustomized,
277 evas_object_smart_callback_add(mWebView, "contextmenu,selected",
278 &WebViewContainerForDali::OnContextMenuItemSelected,
281 ewk_view_authentication_callback_set(mWebView, &WebViewContainerForDali::OnAuthenticationChallenge, &mClient);
283 evas_object_resize(mWebView, mWidth, mHeight);
284 evas_object_show(mWebView);
287 void LoadUrl(const std::string& url)
289 ewk_view_url_set(mWebView, url.c_str());
292 void LoadHtml(const std::string& html)
294 ewk_view_html_string_load(mWebView, html.c_str(), 0, 0);
299 return std::string(ewk_view_url_get(mWebView));
302 bool LoadHtmlStringOverrideCurrentEntry(const std::string& html, const std::string& basicUri,
303 const std::string& unreachableUrl)
305 return ewk_view_html_string_override_current_entry_load(mWebView, html.c_str(), basicUri.c_str(), unreachableUrl.c_str());
308 bool LoadContents(const std::string& contents, uint32_t contentSize, const std::string& mimeType,
309 const std::string& encoding, const std::string& baseUri)
311 return ewk_view_contents_set(mWebView, contents.c_str(), contentSize, (char *)mimeType.c_str(),
312 (char *)encoding.c_str(), (char *)baseUri.c_str());
315 std::string GetTitle()
317 return std::string(ewk_view_title_get(mWebView));
320 Dali::PixelData GetFavicon()
322 Evas_Object* iconObject = ewk_view_favicon_get(mWebView);
325 return Dali::PixelData();
327 return ConvertImageColorSpace(iconObject);
332 ewk_view_reload(mWebView);
337 ewk_view_stop(mWebView);
340 bool ReloadWithoutCache()
342 return ewk_view_reload_bypass_cache(mWebView);
347 ewk_view_suspend(mWebView);
352 ewk_view_resume(mWebView);
355 void SuspendNetworkLoading()
357 ewk_view_suspend_network_loading(mWebView);
360 void ResumeNetworkLoading()
362 ewk_view_resume_network_loading(mWebView);
365 bool AddCustomHeader(const std::string& name, const std::string& value)
367 return ewk_view_custom_header_add(mWebView, name.c_str(), value.c_str());
370 bool RemoveCustomHeader(const std::string& name)
372 return ewk_view_custom_header_remove(mWebView, name.c_str());
375 uint32_t StartInspectorServer(uint32_t port)
377 return ewk_view_inspector_server_start(mWebView, port);
380 bool StopInspectorServer()
382 return ewk_view_inspector_server_stop(mWebView);
385 void ScrollBy(int32_t deltaX, int32_t deltaY)
387 ewk_view_scroll_by(mWebView, deltaX, deltaY);
390 bool ScrollEdgeBy(int32_t deltaX, int32_t deltaY)
392 return ewk_view_edge_scroll_by(mWebView, deltaX, deltaY);
395 void SetScrollPosition(int32_t x, int32_t y)
397 ewk_view_scroll_set(mWebView, x, y);
400 Dali::Vector2 GetScrollPosition() const
403 ewk_view_scroll_pos_get(mWebView, &x, &y);
404 return Dali::Vector2(x, y);
407 Dali::Vector2 GetScrollSize() const
409 int width = 0, height = 0;
410 ewk_view_scroll_size_get(mWebView, &width, &height);
411 return Dali::Vector2(width, height);
414 Dali::Vector2 GetContentSize() const
416 int width = 0, height = 0;
417 ewk_view_contents_size_get(mWebView, &width, &height);
418 return Dali::Vector2(width, height);
423 ewk_view_back(mWebView);
428 ewk_view_forward(mWebView);
433 return ewk_view_back_possible(mWebView);
438 return ewk_view_forward_possible(mWebView);
441 void EvaluateJavaScript(size_t key, const std::string& script)
443 ewk_view_script_execute(mWebView, script.c_str(), OnEvaluateJavaScript, (void*)key);
446 void AddJavaScriptMessageHandler(const std::string& exposedObjectName)
448 // |jsFunctionName| is fixed as "postMessage" so we don't use this.
449 ewk_view_javascript_message_handler_add(mWebView, &WebViewContainerForDali::OnJavaScriptMessage, exposedObjectName.c_str());
452 void RegisterJavaScriptAlertCallback()
454 ewk_view_javascript_alert_callback_set(mWebView, &WebViewContainerForDali::OnJavaScriptAlert, 0);
457 void JavaScriptAlertReply()
459 ewk_view_javascript_alert_reply(mWebView);
462 void RegisterJavaScriptConfirmCallback()
464 ewk_view_javascript_confirm_callback_set(mWebView, &WebViewContainerForDali::OnJavaScriptConfirm, 0);
467 void JavaScriptConfirmReply(bool confirmed)
469 ewk_view_javascript_confirm_reply(mWebView, confirmed);
472 void RegisterJavaScriptPromptCallback()
474 ewk_view_javascript_prompt_callback_set(mWebView, &WebViewContainerForDali::OnJavaScriptPrompt, 0);
477 void JavaScriptPromptReply(const std::string& result)
479 ewk_view_javascript_prompt_reply(mWebView, result.c_str());
484 ewk_view_back_forward_list_clear(mWebView);
487 void ClearAllTilesResources()
489 ewk_view_clear_all_tiles_resources(mWebView);
492 const std::string& GetUserAgent()
494 mUserAgent = std::string(ewk_view_user_agent_get(mWebView));
498 void SetUserAgent(const std::string& userAgent)
500 ewk_view_user_agent_set(mWebView, userAgent.c_str());
503 Dali::WebEngineSettings& GetSettings()
505 return mWebEngineSettings;
508 Dali::WebEngineContext& GetContext()
510 return mWebEngineContext;
513 Dali::WebEngineCookieManager& GetCookieManager()
515 return mWebEngineCookieManager;
518 Dali::WebEngineBackForwardList& GetBackForwardList()
520 return mWebEngineBackForwardList;
523 std::unique_ptr<Dali::WebEngineHitTest> CreateHitTest(int32_t x, int32_t y, Dali::WebEngineHitTest::HitTestMode mode)
526 Evas* evas = ecore_evas_get(WebEngineManager::Get().GetWindow());
527 Ewk_Hit_Test* hitTest = ewk_view_hit_test_new(mWebView, x, y, (int)mode);
528 std::unique_ptr<Dali::WebEngineHitTest> webHitTest(new TizenWebEngineHitTest(hitTest, evas, true));
532 bool CreateHitTestAsynchronously(int32_t x, int32_t y, Dali::WebEngineHitTest::HitTestMode mode)
535 return ewk_view_hit_test_request(mWebView, x, y, (int)mode,
536 &WebViewContainerForDali::OnHitTestCreated,
540 void SetSize(uint32_t width, uint32_t height)
544 evas_object_resize(mWebView, mWidth, mHeight);
547 void EnableMouseEvents(bool enabled)
549 ewk_view_mouse_events_enabled_set(mWebView, enabled);
552 void EnableKeyEvents(bool enabled)
554 ewk_view_key_events_enabled_set(mWebView, enabled);
557 void SetDocumentBackgroundColor(Dali::Vector4 color)
559 ewk_view_bg_color_set(mWebView, color.r * 255, color.g * 255, color.b * 255, color.a * 255);
562 void ClearTilesWhenHidden(bool cleared)
564 ewk_view_clear_tiles_on_hide_enabled_set(mWebView, cleared);
567 void SetTileCoverAreaMultiplier(float multiplier)
569 ewk_view_tile_cover_area_multiplier_set(mWebView, multiplier);
572 void EnableCursorByClient(bool enabled)
574 ewk_view_set_cursor_by_client(mWebView, enabled);
577 std::string GetSelectedText() const
579 return ewk_view_text_selection_text_get(mWebView);
582 bool SendTouchEvent(const TouchEvent& touch)
584 Ewk_Touch_Event_Type type = EWK_TOUCH_START;
585 Evas_Touch_Point_State state = EVAS_TOUCH_POINT_DOWN;
586 switch (touch.GetState(0))
588 case PointState::DOWN:
590 type = EWK_TOUCH_START;
591 state = EVAS_TOUCH_POINT_DOWN;
596 type = EWK_TOUCH_END;
597 state = EVAS_TOUCH_POINT_UP;
600 case PointState::MOTION:
602 type = EWK_TOUCH_MOVE;
603 state = EVAS_TOUCH_POINT_MOVE;
606 case PointState::INTERRUPTED:
608 type = EWK_TOUCH_CANCEL;
609 state = EVAS_TOUCH_POINT_CANCEL;
618 Eina_List* pointList = 0;
619 Ewk_Touch_Point* point = new Ewk_Touch_Point;
621 point->x = touch.GetScreenPosition(0).x;
622 point->y = touch.GetScreenPosition(0).y;
623 point->state = state;
624 pointList = eina_list_append(pointList, point);
626 ewk_view_feed_touch_event(mWebView, type, pointList, 0);
627 eina_list_free(pointList);
631 bool SendKeyEvent(const Dali::KeyEvent& keyEvent)
633 void* evasKeyEvent = 0;
634 if (keyEvent.GetState() == Dali::KeyEvent::DOWN)
636 Evas_Event_Key_Down downEvent;
637 memset(&downEvent, 0, sizeof(Evas_Event_Key_Down));
638 downEvent.key = keyEvent.GetKeyName().c_str();
639 downEvent.string = keyEvent.GetKeyString().c_str();
640 evasKeyEvent = static_cast<void*>(&downEvent);
641 ewk_view_send_key_event(mWebView, evasKeyEvent, true);
645 Evas_Event_Key_Up upEvent;
646 memset(&upEvent, 0, sizeof(Evas_Event_Key_Up));
647 upEvent.key = keyEvent.GetKeyName().c_str();
648 upEvent.string = keyEvent.GetKeyString().c_str();
649 evasKeyEvent = static_cast<void*>(&upEvent);
650 ewk_view_send_key_event(mWebView, evasKeyEvent, false);
655 void SetFocus(bool focused)
657 ecore_evas_focus_set(WebEngineManager::Get().GetWindow(), focused);
658 ewk_view_focus_set(mWebView, focused);
661 bool SetPageZoomFactor(float zoomFactor)
663 return ewk_view_page_zoom_set(mWebView, zoomFactor);
666 float GetPageZoomFactor() const
668 return ewk_view_page_zoom_get(mWebView);
671 bool SetTextZoomFactor(float zoomFactor)
673 return ewk_view_text_zoom_set(mWebView, zoomFactor);
676 float GetTextZoomFactor() const
678 return ewk_view_text_zoom_get(mWebView);
681 float GetLoadProgressPercentage() const
683 return ewk_view_load_progress_get(mWebView);
686 bool SetScaleFactor(float scaleFactor, Dali::Vector2 point)
688 return ewk_view_scale_set(mWebView, scaleFactor, point.x, point.y);
691 float GetScaleFactor() const
693 return ewk_view_scale_get(mWebView);
696 void ActivateAccessibility(bool activated)
698 ewk_view_atk_deactivation_by_app(mWebView, !activated);
701 bool SetVisibility(bool visible)
703 return ewk_view_visibility_set(mWebView, visible);
706 bool HighlightText(const std::string& text, Dali::WebEnginePlugin::FindOption options, uint32_t maxMatchCount)
708 return ewk_view_text_find(mWebView, text.c_str(), (Ewk_Find_Options)options, maxMatchCount);
711 void AddDynamicCertificatePath(const std::string& host, const std::string& certPath)
713 ewk_view_add_dynamic_certificate_path(mWebView, host.c_str(), certPath.c_str());
716 Dali::PixelData GetScreenshot(Dali::Rect<int32_t> viewArea, float scaleFactor)
719 EINA_RECTANGLE_SET(&rect, viewArea.x, viewArea.y, viewArea.width, viewArea.height);
720 Evas *evas = ecore_evas_get(WebEngineManager::Get().GetWindow());
721 Evas_Object *snapShotObject = ewk_view_screenshot_contents_get(mWebView, rect, scaleFactor, evas);
724 return Dali::PixelData();
726 return ConvertImageColorSpace(snapShotObject);
729 bool GetScreenshotAsynchronously(Dali::Rect<int32_t> viewArea, float scaleFactor)
732 EINA_RECTANGLE_SET(&rect, viewArea.x, viewArea.y, viewArea.width, viewArea.height);
733 Evas *evas = ecore_evas_get(WebEngineManager::Get().GetWindow());
734 return ewk_view_screenshot_contents_get_async(mWebView, rect, scaleFactor, evas, &WebViewContainerForDali::OnScreenshotCaptured, &mClient);
737 bool CheckVideoPlayingAsynchronously()
739 return ewk_view_is_video_playing(mWebView, &WebViewContainerForDali::OnVideoPlaying, &mClient);
742 void RegisterGeolocationPermissionCallback()
744 ewk_view_geolocation_permission_callback_set(mWebView, &WebViewContainerForDali::OnGeolocationPermission, &mClient);
747 void UpdateDisplayArea(Dali::Rect<int32_t> displayArea)
749 evas_object_move(mWebView, displayArea.x, displayArea.y);
750 SetSize(displayArea.width, displayArea.height);
751 evas_object_geometry_set(mWebView, displayArea.x, displayArea.y, displayArea.width, displayArea.height);
754 void EnableVideoHole(bool enabled)
756 Ecore_Wl2_Window* win = AnyCast<Ecore_Wl2_Window*>(Adaptor::Get().GetNativeWindowHandle());
757 ewk_view_set_support_video_hole(mWebView, win, enabled, EINA_FALSE);
758 ecore_wl2_window_alpha_set(win, !enabled);
761 bool SendHoverEvent(const HoverEvent& hover)
763 #if defined(OS_TIZEN_TV)
764 //TODO...left/right/middle of mouse could not be acquired now.
765 Ewk_Mouse_Button_Type type = EWK_Mouse_Button_Left;
766 switch ( hover.GetState( 0 ) )
768 case PointState::DOWN:
770 float x = hover.GetScreenPosition( 0 ).x;
771 float y = hover.GetScreenPosition( 0 ).y;
772 ewk_view_feed_mouse_down( mWebView, type, x, y );
777 float x = hover.GetScreenPosition( 0 ).x;
778 float y = hover.GetScreenPosition( 0 ).y;
779 ewk_view_feed_mouse_up( mWebView, type, x, y );
782 case PointState::MOTION:
784 float x = hover.GetScreenPosition( 0 ).x;
785 float y = hover.GetScreenPosition( 0 ).y;
786 ewk_view_feed_mouse_move( mWebView, x, y );
798 bool SendWheelEvent(const WheelEvent& wheel)
800 #if defined(OS_TIZEN_TV)
801 Eina_Bool direction = wheel.GetDirection() ? true : false;
802 int step = wheel.GetDelta();
803 float x = wheel.GetPoint().x;
804 float y = wheel.GetPoint().y;
806 ewk_view_feed_mouse_wheel( mWebView, direction, step, x, y );
812 static Dali::PixelData ConvertImageColorSpace(Evas_Object *image)
814 int width = 0, height = 0;
815 evas_object_image_size_get(image, &width, &height);
817 uint32_t bufferSize = width * height * 4;
818 uint8_t *convertedBuffer = new uint8_t[bufferSize];
820 // color-space is argb8888.
821 uint8_t *pixelBuffer = (uint8_t *)evas_object_image_data_get(image, false);
823 // convert the color-space to rgba8888.
824 for (uint32_t i = 0; i < bufferSize; i += 4)
826 convertedBuffer[i] = pixelBuffer[i + 1];
827 convertedBuffer[i + 1] = pixelBuffer[i + 2];
828 convertedBuffer[i + 2] = pixelBuffer[i + 3];
829 convertedBuffer[i + 3] = pixelBuffer[i];
832 return Dali::PixelData::New(convertedBuffer, bufferSize, width, height,
833 Dali::Pixel::Format::RGBA8888,
834 Dali::PixelData::ReleaseFunction::DELETE_ARRAY);
837 static void OnFrameRendered(void* data, Evas_Object*, void* buffer)
839 auto client = static_cast<WebViewContainerClient*>(data);
840 client->UpdateImage(static_cast<tbm_surface_h>(buffer));
843 static void OnLoadStarted(void* data, Evas_Object*, void*)
845 auto client = static_cast<WebViewContainerClient*>(data);
846 client->LoadStarted();
849 static void OnLoadInProgress(void* data, Evas_Object*, void*)
851 auto client = static_cast<WebViewContainerClient*>(data);
852 client->LoadInProgress();
855 static void OnLoadFinished(void* data, Evas_Object*, void*)
857 auto client = static_cast<WebViewContainerClient*>(data);
858 client->LoadFinished();
861 static void OnLoadError(void* data, Evas_Object*, void* rawError)
863 auto client = static_cast<WebViewContainerClient*>(data);
864 Ewk_Error* error = static_cast<Ewk_Error*>(rawError);
865 std::shared_ptr<Dali::WebEngineLoadError> loadError(new TizenWebEngineLoadError(error));
866 client->LoadError(std::move(loadError));
869 static void OnInterceptRequest(Ewk_Context*, Ewk_Intercept_Request* request, void* data)
871 auto client = static_cast<WebViewContainerClient*>(data);
872 std::shared_ptr<Dali::WebEngineRequestInterceptor> webInterceptor(new TizenWebEngineRequestInterceptor(request));
873 client->InterceptRequest(std::move(webInterceptor));
876 static void OnUrlChanged(void* data, Evas_Object*, void* newUrl)
878 auto client = static_cast<WebViewContainerClient*>(data);
879 std::string url = static_cast<char*>(newUrl);
880 client->UrlChanged(url);
883 static void OnConsoleMessage(void* data, Evas_Object*, void* eventInfo)
885 auto client = static_cast<WebViewContainerClient*>(data);
886 Ewk_Console_Message* message = static_cast<Ewk_Console_Message*>(eventInfo);
887 std::shared_ptr<Dali::WebEngineConsoleMessage> webConsoleMessage(new TizenWebEngineConsoleMessage(message));
888 client->OnConsoleMessage(std::move(webConsoleMessage));
891 static void OnEdgeLeft(void* data, Evas_Object*, void*)
893 auto client = static_cast<WebViewContainerClient*>(data);
894 client->ScrollEdgeReached(Dali::WebEnginePlugin::ScrollEdge::LEFT);
897 static void OnEdgeRight(void* data, Evas_Object*, void*)
899 auto client = static_cast<WebViewContainerClient*>(data);
900 client->ScrollEdgeReached(Dali::WebEnginePlugin::ScrollEdge::RIGHT);
903 static void OnEdgeTop(void* data, Evas_Object*, void*)
905 auto client = static_cast<WebViewContainerClient*>(data);
906 client->ScrollEdgeReached(Dali::WebEnginePlugin::ScrollEdge::TOP);
909 static void OnEdgeBottom(void* data, Evas_Object*, void*)
911 auto client = static_cast<WebViewContainerClient*>(data);
912 client->ScrollEdgeReached(Dali::WebEnginePlugin::ScrollEdge::BOTTOM);
915 static void OnFormRepostDecisionRequest(void* data, Evas_Object*, void* eventInfo)
917 auto client = static_cast<WebViewContainerClient*>(data);
918 Ewk_Form_Repost_Decision_Request* decisionRequest = static_cast<Ewk_Form_Repost_Decision_Request*>(eventInfo);
919 std::shared_ptr<Dali::WebEngineFormRepostDecision> webDecisionRequest(new TizenWebEngineFormRepostDecision(decisionRequest));
920 client->RequestFormRepostDecision(std::move(webDecisionRequest));
923 static void OnScreenshotCaptured(Evas_Object* image, void* data)
925 auto client = static_cast<WebViewContainerClient*>(data);
926 Dali::PixelData pixelData = ConvertImageColorSpace(image);
927 client->ScreenshotCaptured(pixelData);
930 static void OnVideoPlaying(Evas_Object*, Eina_Bool isPlaying, void* data)
932 auto client = static_cast<WebViewContainerClient*>(data);
933 client->VideoPlaying(isPlaying);
936 static Eina_Bool OnGeolocationPermission(Evas_Object*, Ewk_Geolocation_Permission_Request* request, void* data)
938 auto client = static_cast<WebViewContainerClient*>(data);
939 const Ewk_Security_Origin* securityOrigin = ewk_geolocation_permission_request_origin_get(request);
940 std::string host = ewk_security_origin_host_get(securityOrigin);
941 std::string protocol = ewk_security_origin_protocol_get(securityOrigin);
942 return client->GeolocationPermission(host, protocol);
945 static void OnResponsePolicyDecided(void* data, Evas_Object*, void* policy)
947 auto client = static_cast<WebViewContainerClient*>(data);
948 Ewk_Policy_Decision* policyDecision = static_cast<Ewk_Policy_Decision*>(policy);
949 std::shared_ptr<Dali::WebEnginePolicyDecision> webPolicyDecision(new TizenWebEnginePolicyDecision(policyDecision));
950 client->ResponsePolicyDecided(std::move(webPolicyDecision));
953 static void OnCertificateConfirmRequest(void* data, Evas_Object*, void* eventInfo)
955 auto client = static_cast<WebViewContainerClient*>(data);
956 Ewk_Certificate_Policy_Decision* policyDecision = static_cast<Ewk_Certificate_Policy_Decision*>(eventInfo);
957 std::shared_ptr<Dali::WebEngineCertificate> webPolicyDecision(new TizenWebEngineCertificate(policyDecision));
958 client->CertificateConfirm(std::move(webPolicyDecision));
961 static void OnSslCertificateChanged(void* data, Evas_Object*, void* eventInfo)
963 auto client = static_cast<WebViewContainerClient*>(data);
964 Ewk_Certificate_Info* info = static_cast<Ewk_Certificate_Info*>(eventInfo);
965 std::shared_ptr<Dali::WebEngineCertificate> webCertiInfo(new TizenWebEngineCertificate(info));
966 client->SslCertificateChanged(std::move(webCertiInfo));
969 static void OnAuthenticationChallenge(Evas_Object*, Ewk_Auth_Challenge* authChallenge, void* data)
971 auto client = static_cast<WebViewContainerClient*>(data);
972 std::shared_ptr<Dali::WebEngineHttpAuthHandler> authHandler(new TizenWebEngineHttpAuthHandler(authChallenge));
973 client->AuthenticationChallenge(std::move(authHandler));
976 static void OnContextMenuCustomized(void* data, Evas_Object*, void* eventInfo)
978 auto client = static_cast<WebViewContainerClient *>(data);
979 Ewk_Context_Menu* menu = (Ewk_Context_Menu *)eventInfo;
980 std::shared_ptr<Dali::WebEngineContextMenu> contextMenu(new TizenWebEngineContextMenu(menu));
981 client->ContextMenuCustomized(std::move(contextMenu));
984 static void OnContextMenuItemSelected(void* data, Evas_Object*, void* eventInfo)
986 auto client = static_cast<WebViewContainerClient*>(data);
987 Ewk_Context_Menu_Item* item = (Ewk_Context_Menu_Item*)eventInfo;
988 std::shared_ptr<Dali::WebEngineContextMenuItem> contextMenuItem(new TizenWebEngineContextMenuItem(item));
989 client->ContextMenuItemSelected(std::move(contextMenuItem));
992 static void OnEvaluateJavaScript(Evas_Object* o, const char* result, void* data)
994 auto client = WebEngineManager::Get().FindContainerClient(o);
997 client->RunJavaScriptEvaluationResultHandler((size_t)data, result);
1001 static void OnJavaScriptMessage(Evas_Object* o, Ewk_Script_Message message)
1003 auto client = WebEngineManager::Get().FindContainerClient(o);
1006 client->RunJavaScriptMessageHandler(message.name, static_cast<char*>(message.body));
1010 static Eina_Bool OnJavaScriptAlert(Evas_Object* o, const char* alert_text, void*)
1012 bool result = false;
1013 auto client = WebEngineManager::Get().FindContainerClient(o);
1016 result = client->JavaScriptAlert(const_cast<char*>(alert_text));
1021 static Eina_Bool OnJavaScriptConfirm(Evas_Object* o, const char* message, void*)
1023 bool result = false;
1024 auto client = WebEngineManager::Get().FindContainerClient(o);
1027 result = client->JavaScriptConfirm(const_cast<char*>(message));
1032 static Eina_Bool OnJavaScriptPrompt(Evas_Object* o, const char* message, const char* default_value, void*)
1034 bool result = false;
1035 auto client = WebEngineManager::Get().FindContainerClient(o);
1038 result = client->JavaScriptPrompt(const_cast<char*>(message), const_cast<char*>(default_value));
1043 static void OnHitTestCreated(Evas_Object*, int x, int y, int hitTestMode, Ewk_Hit_Test* hitTest, void* data)
1045 auto client = static_cast<WebViewContainerClient*>(data);
1046 Evas* evas = ecore_evas_get(WebEngineManager::Get().GetWindow());
1047 std::unique_ptr<Dali::WebEngineHitTest> webHitTest(new TizenWebEngineHitTest(hitTest, evas, false));
1048 client->HitTestCreated(std::move(webHitTest));
1052 Evas_Object* mWebView;
1053 WebViewContainerClient& mClient;
1057 std::string mUserAgent;
1059 TizenWebEngineSettings mWebEngineSettings;
1060 TizenWebEngineContext mWebEngineContext;
1061 TizenWebEngineCookieManager mWebEngineCookieManager;
1062 TizenWebEngineBackForwardList mWebEngineBackForwardList;
1065 class TBMSurfaceSourceInitializer
1068 explicit TBMSurfaceSourceInitializer(NativeImageSourcePtr& imageSrc, uint32_t width, uint32_t height)
1070 mSurface = tbm_surface_create(width, height, TBM_FORMAT_ARGB8888);
1073 DALI_LOG_ERROR("Failed to create tbm surface.");
1076 Any tbmSource(mSurface);
1077 imageSrc = NativeImageSource::New(tbmSource);
1079 imageSrc->SetSource(emptySource);
1082 ~TBMSurfaceSourceInitializer()
1086 if (tbm_surface_destroy(mSurface) != TBM_SURFACE_ERROR_NONE)
1088 DALI_LOG_ERROR("Failed to destroy tbm surface.");
1094 tbm_surface_h mSurface;
1097 TizenWebEngineChromium::TizenWebEngineChromium()
1098 : mWebViewContainer(0)
1099 , mJavaScriptEvaluationCount(0)
1103 TizenWebEngineChromium::~TizenWebEngineChromium()
1108 void TizenWebEngineChromium::Create(uint32_t width, uint32_t height, const std::string& locale, const std::string& timezoneID)
1110 mWebViewContainer = new WebViewContainerForDali(*this, width, height);
1111 TBMSurfaceSourceInitializer initializer(mDaliImageSrc, width, height);
1114 void TizenWebEngineChromium::Create(uint32_t width, uint32_t height, uint32_t argc, char** argv)
1116 mWebViewContainer = new WebViewContainerForDali(*this, width, height, argc, argv);
1117 TBMSurfaceSourceInitializer initializer(mDaliImageSrc, width, height);
1120 void TizenWebEngineChromium::Destroy()
1122 if (mWebViewContainer)
1124 mJavaScriptEvaluationResultHandlers.clear();
1125 mJavaScriptMessageHandlers.clear();
1127 delete mWebViewContainer;
1128 mWebViewContainer = 0;
1132 void TizenWebEngineChromium::LoadUrl(const std::string& path)
1134 if (mWebViewContainer)
1136 mWebViewContainer->LoadUrl(path);
1140 std::string TizenWebEngineChromium::GetTitle() const
1142 return mWebViewContainer ? mWebViewContainer->GetTitle() : EMPTY_STRING;
1145 Dali::PixelData TizenWebEngineChromium::GetFavicon() const
1147 return mWebViewContainer ? mWebViewContainer->GetFavicon() : Dali::PixelData();
1150 NativeImageInterfacePtr TizenWebEngineChromium::GetNativeImageSource()
1152 return mDaliImageSrc;
1155 const std::string& TizenWebEngineChromium::GetUrl()
1157 if (mWebViewContainer)
1159 mUrl = mWebViewContainer->GetUrl();
1164 void TizenWebEngineChromium::LoadHtmlString(const std::string& html)
1166 if (mWebViewContainer)
1168 mWebViewContainer->LoadHtml(html);
1172 bool TizenWebEngineChromium::LoadHtmlStringOverrideCurrentEntry(const std::string& html, const std::string& basicUri,
1173 const std::string& unreachableUrl)
1175 if (mWebViewContainer)
1177 return mWebViewContainer->LoadHtmlStringOverrideCurrentEntry(html, basicUri, unreachableUrl);
1182 bool TizenWebEngineChromium::LoadContents(const std::string& contents, uint32_t contentSize, const std::string& mimeType,
1183 const std::string& encoding, const std::string& baseUri)
1185 if (mWebViewContainer)
1187 return mWebViewContainer->LoadContents(contents, contentSize, mimeType, encoding, baseUri);
1192 void TizenWebEngineChromium::Reload()
1194 if (mWebViewContainer)
1196 mWebViewContainer->Reload();
1200 bool TizenWebEngineChromium::ReloadWithoutCache()
1202 if (mWebViewContainer)
1204 return mWebViewContainer->ReloadWithoutCache();
1209 void TizenWebEngineChromium::StopLoading()
1211 if (mWebViewContainer)
1213 mWebViewContainer->StopLoading();
1217 void TizenWebEngineChromium::Suspend()
1219 if (mWebViewContainer)
1221 mWebViewContainer->Suspend();
1225 void TizenWebEngineChromium::Resume()
1227 if (mWebViewContainer)
1229 mWebViewContainer->Resume();
1233 void TizenWebEngineChromium::SuspendNetworkLoading()
1235 if (mWebViewContainer)
1237 mWebViewContainer->SuspendNetworkLoading();
1241 void TizenWebEngineChromium::ResumeNetworkLoading()
1243 if (mWebViewContainer)
1245 mWebViewContainer->ResumeNetworkLoading();
1249 bool TizenWebEngineChromium::AddCustomHeader(const std::string& name, const std::string& value)
1251 if (mWebViewContainer)
1253 return mWebViewContainer->AddCustomHeader(name, value);
1258 bool TizenWebEngineChromium::RemoveCustomHeader(const std::string& name)
1260 if (mWebViewContainer)
1262 return mWebViewContainer->RemoveCustomHeader(name);
1267 uint32_t TizenWebEngineChromium::StartInspectorServer(uint32_t port)
1269 if (mWebViewContainer)
1271 return mWebViewContainer->StartInspectorServer(port);
1276 bool TizenWebEngineChromium::StopInspectorServer()
1278 if (mWebViewContainer)
1280 return mWebViewContainer->StopInspectorServer();
1285 void TizenWebEngineChromium::ScrollBy(int32_t deltaX, int32_t deltaY)
1287 if (mWebViewContainer)
1289 mWebViewContainer->ScrollBy(deltaX, deltaY);
1293 bool TizenWebEngineChromium::ScrollEdgeBy(int32_t deltaX, int32_t deltaY)
1295 if (mWebViewContainer)
1297 return mWebViewContainer->ScrollEdgeBy(deltaX, deltaY);
1302 void TizenWebEngineChromium::SetScrollPosition(int32_t x, int32_t y)
1304 if (mWebViewContainer)
1306 mWebViewContainer->SetScrollPosition(x, y);
1310 Dali::Vector2 TizenWebEngineChromium::GetScrollPosition() const
1312 return mWebViewContainer ? mWebViewContainer->GetScrollPosition() : Dali::Vector2::ZERO;
1315 Dali::Vector2 TizenWebEngineChromium::GetScrollSize() const
1317 return mWebViewContainer ? mWebViewContainer->GetScrollSize() : Dali::Vector2::ZERO;
1320 Dali::Vector2 TizenWebEngineChromium::GetContentSize() const
1322 return mWebViewContainer ? mWebViewContainer->GetContentSize() : Dali::Vector2::ZERO;
1325 bool TizenWebEngineChromium::CanGoForward()
1327 if (mWebViewContainer)
1329 return mWebViewContainer->CanGoForward();
1334 void TizenWebEngineChromium::GoForward()
1336 if (mWebViewContainer)
1338 mWebViewContainer->GoForward();
1342 bool TizenWebEngineChromium::CanGoBack()
1344 if (mWebViewContainer)
1346 return mWebViewContainer->CanGoBack();
1351 void TizenWebEngineChromium::GoBack()
1353 if (mWebViewContainer)
1355 mWebViewContainer->GoBack();
1359 void TizenWebEngineChromium::EvaluateJavaScript(const std::string& script, std::function<void(const std::string&)> resultHandler)
1361 if (mWebViewContainer)
1363 bool badAlloc = false;
1367 mJavaScriptEvaluationResultHandlers.emplace(mJavaScriptEvaluationCount, resultHandler);
1369 catch (std::bad_alloc& e)
1372 DALI_LOG_ERROR("Too many ongoing JavaScript evaluations.");
1377 mWebViewContainer->EvaluateJavaScript(mJavaScriptEvaluationCount++, script);
1382 void TizenWebEngineChromium::AddJavaScriptMessageHandler(const std::string& exposedObjectName, std::function<void(const std::string&)> handler)
1384 if (mWebViewContainer)
1386 if (mJavaScriptMessageHandlers.emplace(exposedObjectName, handler).second)
1388 mWebViewContainer->AddJavaScriptMessageHandler(exposedObjectName);
1392 DALI_LOG_ERROR("Callback for (%s) already exists.", exposedObjectName.c_str());
1397 void TizenWebEngineChromium::RegisterJavaScriptAlertCallback(Dali::WebEnginePlugin::JavaScriptAlertCallback callback)
1399 if (!mWebViewContainer)
1402 mJavaScriptAlertCallback = callback;
1403 mWebViewContainer->RegisterJavaScriptAlertCallback();
1406 void TizenWebEngineChromium::JavaScriptAlertReply()
1408 if (mWebViewContainer)
1410 mWebViewContainer->JavaScriptAlertReply();
1414 void TizenWebEngineChromium::RegisterJavaScriptConfirmCallback(Dali::WebEnginePlugin::JavaScriptConfirmCallback callback)
1416 if (!mWebViewContainer)
1419 mJavaScriptConfirmCallback = callback;
1420 mWebViewContainer->RegisterJavaScriptConfirmCallback();
1423 void TizenWebEngineChromium::JavaScriptConfirmReply(bool confirmed)
1425 if (mWebViewContainer)
1427 mWebViewContainer->JavaScriptConfirmReply(confirmed);
1431 void TizenWebEngineChromium::RegisterJavaScriptPromptCallback(Dali::WebEnginePlugin::JavaScriptPromptCallback callback)
1433 if (!mWebViewContainer)
1436 mJavaScriptPromptCallback = callback;
1437 mWebViewContainer->RegisterJavaScriptPromptCallback();
1440 void TizenWebEngineChromium::JavaScriptPromptReply(const std::string& result)
1442 if (mWebViewContainer)
1444 mWebViewContainer->JavaScriptPromptReply(result);
1448 void TizenWebEngineChromium::ClearHistory()
1450 if (mWebViewContainer)
1452 mWebViewContainer->ClearHistory();
1456 void TizenWebEngineChromium::ClearAllTilesResources()
1458 if (mWebViewContainer)
1460 mWebViewContainer->ClearAllTilesResources();
1464 const std::string& TizenWebEngineChromium::GetUserAgent() const
1466 if (mWebViewContainer)
1468 return mWebViewContainer->GetUserAgent();
1470 return EMPTY_STRING;
1473 void TizenWebEngineChromium::SetUserAgent(const std::string& userAgent)
1475 if (mWebViewContainer)
1477 mWebViewContainer->SetUserAgent(userAgent);
1481 Dali::WebEngineSettings& TizenWebEngineChromium::GetSettings() const
1483 if (mWebViewContainer)
1485 return mWebViewContainer->GetSettings();
1488 DALI_LOG_ERROR("WebViewContainer is null.");
1489 static TizenWebEngineSettings dummy(nullptr);
1494 Dali::WebEngineContext& TizenWebEngineChromium::GetContext() const
1496 if (mWebViewContainer)
1498 return mWebViewContainer->GetContext();
1501 DALI_LOG_ERROR("WebViewContainer is null.");
1502 static TizenWebEngineContext dummy(nullptr);
1507 Dali::WebEngineCookieManager& TizenWebEngineChromium::GetCookieManager() const
1509 if (mWebViewContainer)
1511 return mWebViewContainer->GetCookieManager();
1514 DALI_LOG_ERROR("WebViewContainer is null.");
1515 static TizenWebEngineCookieManager dummy(nullptr);
1520 Dali::WebEngineBackForwardList& TizenWebEngineChromium::GetBackForwardList() const
1522 if (mWebViewContainer)
1524 return mWebViewContainer->GetBackForwardList();
1527 DALI_LOG_ERROR("WebViewContainer is null.");
1528 static TizenWebEngineBackForwardList dummy(nullptr);
1533 std::unique_ptr<Dali::WebEngineHitTest> TizenWebEngineChromium::CreateHitTest(int32_t x, int32_t y, Dali::WebEngineHitTest::HitTestMode mode)
1535 if (mWebViewContainer)
1537 return mWebViewContainer->CreateHitTest(x, y, mode);
1542 bool TizenWebEngineChromium::CreateHitTestAsynchronously(int32_t x, int32_t y, Dali::WebEngineHitTest::HitTestMode mode, Dali::WebEnginePlugin::WebEngineHitTestCreatedCallback callback)
1544 bool result = false;
1545 if (mWebViewContainer)
1547 mHitTestCreatedCallback = callback;
1548 result = mWebViewContainer->CreateHitTestAsynchronously(x, y, mode);
1553 void TizenWebEngineChromium::SetSize(uint32_t width, uint32_t height)
1555 if (mWebViewContainer)
1557 mWebViewContainer->SetSize(width, height);
1561 void TizenWebEngineChromium::SetDocumentBackgroundColor(Dali::Vector4 color)
1563 if(mWebViewContainer)
1565 mWebViewContainer->SetDocumentBackgroundColor(color);
1569 void TizenWebEngineChromium::ClearTilesWhenHidden(bool cleared)
1571 if(mWebViewContainer)
1573 mWebViewContainer->ClearTilesWhenHidden(cleared);
1577 void TizenWebEngineChromium::SetTileCoverAreaMultiplier(float multiplier)
1579 if(mWebViewContainer)
1581 mWebViewContainer->SetTileCoverAreaMultiplier(multiplier);
1585 void TizenWebEngineChromium::EnableCursorByClient(bool enabled)
1587 if(mWebViewContainer)
1589 mWebViewContainer->EnableCursorByClient(enabled);
1593 std::string TizenWebEngineChromium::GetSelectedText() const
1595 if(mWebViewContainer)
1597 return mWebViewContainer->GetSelectedText();
1599 return EMPTY_STRING;
1602 bool TizenWebEngineChromium::SendTouchEvent(const Dali::TouchEvent& touch)
1604 if(mWebViewContainer)
1606 return mWebViewContainer->SendTouchEvent(touch);
1611 bool TizenWebEngineChromium::SendKeyEvent(const Dali::KeyEvent& event)
1613 if (mWebViewContainer)
1615 return mWebViewContainer->SendKeyEvent(event);
1620 void TizenWebEngineChromium::SetFocus(bool focused)
1622 if (mWebViewContainer)
1624 return mWebViewContainer->SetFocus(focused);
1628 void TizenWebEngineChromium::EnableMouseEvents(bool enabled)
1630 if(mWebViewContainer)
1632 mWebViewContainer->EnableMouseEvents(enabled);
1636 void TizenWebEngineChromium::EnableKeyEvents(bool enabled)
1638 if(mWebViewContainer)
1640 mWebViewContainer->EnableKeyEvents(enabled);
1644 void TizenWebEngineChromium::SetPageZoomFactor(float zoomFactor)
1646 if (mWebViewContainer)
1648 mWebViewContainer->SetPageZoomFactor(zoomFactor);
1652 float TizenWebEngineChromium::GetPageZoomFactor() const
1654 if (mWebViewContainer)
1656 return mWebViewContainer->GetPageZoomFactor();
1661 void TizenWebEngineChromium::SetTextZoomFactor(float zoomFactor)
1663 if (mWebViewContainer)
1665 mWebViewContainer->SetTextZoomFactor(zoomFactor);
1669 float TizenWebEngineChromium::GetTextZoomFactor() const
1671 if (mWebViewContainer)
1673 return mWebViewContainer->GetTextZoomFactor();
1678 float TizenWebEngineChromium::GetLoadProgressPercentage() const
1680 if (mWebViewContainer)
1682 return mWebViewContainer->GetLoadProgressPercentage();
1687 void TizenWebEngineChromium::SetScaleFactor(float scaleFactor, Dali::Vector2 point)
1689 if (mWebViewContainer)
1691 mWebViewContainer->SetScaleFactor(scaleFactor, point);
1695 float TizenWebEngineChromium::GetScaleFactor() const
1697 if (mWebViewContainer)
1699 return mWebViewContainer->GetScaleFactor();
1704 void TizenWebEngineChromium::ActivateAccessibility(bool activated)
1706 if (mWebViewContainer)
1708 mWebViewContainer->ActivateAccessibility(activated);
1712 bool TizenWebEngineChromium::SetVisibility(bool visible)
1714 if (mWebViewContainer)
1716 return mWebViewContainer->SetVisibility(visible);
1721 bool TizenWebEngineChromium::HighlightText(const std::string& text, Dali::WebEnginePlugin::FindOption options, uint32_t maxMatchCount)
1723 if (mWebViewContainer)
1725 return mWebViewContainer->HighlightText(text, options, maxMatchCount);
1730 void TizenWebEngineChromium::AddDynamicCertificatePath(const std::string& host, const std::string& certPath)
1732 if (mWebViewContainer)
1734 mWebViewContainer->AddDynamicCertificatePath(host, certPath);
1738 Dali::PixelData TizenWebEngineChromium::GetScreenshot(Dali::Rect<int32_t> viewArea, float scaleFactor)
1740 if (mWebViewContainer)
1742 return mWebViewContainer->GetScreenshot(viewArea, scaleFactor);
1744 return Dali::PixelData();
1747 bool TizenWebEngineChromium::GetScreenshotAsynchronously(Dali::Rect<int32_t> viewArea, float scaleFactor, Dali::WebEnginePlugin::ScreenshotCapturedCallback callback)
1749 if (mWebViewContainer)
1751 mScreenshotCapturedCallback = callback;
1752 return mWebViewContainer->GetScreenshotAsynchronously(viewArea, scaleFactor);
1757 bool TizenWebEngineChromium::CheckVideoPlayingAsynchronously(Dali::WebEnginePlugin::VideoPlayingCallback callback)
1759 if (mWebViewContainer)
1761 mVideoPlayingCallback = callback;
1762 return mWebViewContainer->CheckVideoPlayingAsynchronously();
1767 void TizenWebEngineChromium::RegisterGeolocationPermissionCallback(GeolocationPermissionCallback callback)
1769 if (mWebViewContainer)
1771 mGeolocationPermissionCallback = callback;
1772 mWebViewContainer->RegisterGeolocationPermissionCallback();
1776 void TizenWebEngineChromium::UpdateDisplayArea(Dali::Rect<int32_t> displayArea)
1778 if (mWebViewContainer)
1780 mWebViewContainer->UpdateDisplayArea(displayArea);
1784 void TizenWebEngineChromium::EnableVideoHole(bool enabled)
1786 if (mWebViewContainer)
1788 return mWebViewContainer->EnableVideoHole(enabled);
1792 bool TizenWebEngineChromium::SendHoverEvent(const Dali::HoverEvent& event)
1794 if(mWebViewContainer)
1796 return mWebViewContainer->SendHoverEvent( event );
1801 bool TizenWebEngineChromium::SendWheelEvent( const Dali::WheelEvent& event )
1803 if( mWebViewContainer )
1805 return mWebViewContainer->SendWheelEvent( event );
1810 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& TizenWebEngineChromium::PageLoadStartedSignal()
1812 return mLoadStartedSignal;
1815 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& TizenWebEngineChromium::PageLoadInProgressSignal()
1817 return mLoadInProgressSignal;
1820 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& TizenWebEngineChromium::PageLoadFinishedSignal()
1822 return mLoadFinishedSignal;
1825 Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType& TizenWebEngineChromium::PageLoadErrorSignal()
1827 return mLoadErrorSignal;
1830 Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType& TizenWebEngineChromium::ScrollEdgeReachedSignal()
1832 return mScrollEdgeReachedSignal;
1835 Dali::WebEnginePlugin::WebEngineUrlChangedSignalType& TizenWebEngineChromium::UrlChangedSignal()
1837 return mUrlChangedSignal;
1840 Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType& TizenWebEngineChromium::FormRepostDecisionSignal()
1842 return mFormRepostDecisionSignal;
1845 Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType& TizenWebEngineChromium::FrameRenderedSignal()
1847 return mFrameRenderedSignal;
1850 Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType& TizenWebEngineChromium::RequestInterceptorSignal()
1852 return mRequestInterceptorSignal;
1855 Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType& TizenWebEngineChromium::ConsoleMessageSignal()
1857 return mConsoleMessageSignal;
1860 Dali::WebEnginePlugin::WebEngineResponsePolicyDecisionSignalType& TizenWebEngineChromium::ResponsePolicyDecisionSignal()
1862 return mResponsePolicyDecisionSignal;
1865 Dali::WebEnginePlugin::WebEngineCertificateSignalType& TizenWebEngineChromium::CertificateConfirmSignal()
1867 return mCertificateConfirmSignal;
1870 Dali::WebEnginePlugin::WebEngineCertificateSignalType& TizenWebEngineChromium::SslCertificateChangedSignal()
1872 return mSslCertificateChangedSignal;
1875 Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType& TizenWebEngineChromium::HttpAuthHandlerSignal()
1877 return mHttpAuthHandlerSignal;
1880 Dali::WebEnginePlugin::WebEngineContextMenuCustomizedSignalType& TizenWebEngineChromium::ContextMenuCustomizedSignal()
1882 return mContextMenuCustomizedSignal;
1885 Dali::WebEnginePlugin::WebEngineContextMenuItemSelectedSignalType& TizenWebEngineChromium::ContextMenuItemSelectedSignal()
1887 return mContextMenuItemSelectedSignal;
1890 // WebViewContainerClient Interface
1891 void TizenWebEngineChromium::UpdateImage(tbm_surface_h buffer)
1899 mDaliImageSrc->SetSource(source);
1900 Dali::Stage::GetCurrent().KeepRendering(0.0f);
1902 mFrameRenderedSignal.Emit();
1905 void TizenWebEngineChromium::LoadStarted()
1907 DALI_LOG_RELEASE_INFO("#LoadStarted : %s\n", GetUrl().c_str());
1908 mLoadStartedSignal.Emit(GetUrl());
1911 void TizenWebEngineChromium::LoadInProgress()
1913 DALI_LOG_RELEASE_INFO("#LoadInProgress : %s\n", GetUrl().c_str());
1914 mLoadInProgressSignal.Emit("");
1917 void TizenWebEngineChromium::LoadFinished()
1919 DALI_LOG_RELEASE_INFO("#LoadFinished : %s\n", GetUrl().c_str());
1920 mLoadFinishedSignal.Emit(GetUrl());
1923 void TizenWebEngineChromium::LoadError(std::shared_ptr<Dali::WebEngineLoadError> error)
1925 DALI_LOG_RELEASE_INFO("#LoadError : %s\n", error->GetUrl().c_str());
1926 if (!mLoadErrorSignal.Empty())
1928 mLoadErrorSignal.Emit(std::move(error));
1932 void TizenWebEngineChromium::ScrollEdgeReached(Dali::WebEnginePlugin::ScrollEdge edge)
1934 DALI_LOG_RELEASE_INFO("#ScrollEdgeReached : %d\n", edge);
1935 mScrollEdgeReachedSignal.Emit(edge);
1938 void TizenWebEngineChromium::UrlChanged(const std::string& url)
1940 DALI_LOG_RELEASE_INFO("#UrlChanged : %s\n", url.c_str());
1941 mUrlChangedSignal.Emit(url);
1944 void TizenWebEngineChromium::RequestFormRepostDecision(std::shared_ptr<Dali::WebEngineFormRepostDecision> decision)
1946 DALI_LOG_RELEASE_INFO("#FormRepostDecisionRequest\n");
1947 if (!mFormRepostDecisionSignal.Empty())
1949 mFormRepostDecisionSignal.Emit(std::move(decision));
1953 void TizenWebEngineChromium::InterceptRequest(std::shared_ptr<Dali::WebEngineRequestInterceptor> interceptor)
1955 DALI_LOG_RELEASE_INFO("#InterceptRequest.\n");
1956 if (!mRequestInterceptorSignal.Empty())
1958 mRequestInterceptorSignal.Emit(std::move(interceptor));
1962 void TizenWebEngineChromium::OnConsoleMessage(std::shared_ptr<Dali::WebEngineConsoleMessage> message)
1964 DALI_LOG_RELEASE_INFO("#OnConsoleMessage : %s\n", message->GetText());
1965 if (!mConsoleMessageSignal.Empty())
1967 mConsoleMessageSignal.Emit(std::move(message));
1971 void TizenWebEngineChromium::ResponsePolicyDecided(std::shared_ptr<Dali::WebEnginePolicyDecision> decision)
1973 DALI_LOG_RELEASE_INFO("#ResponsePolicyDecided.\n");
1974 if (!mResponsePolicyDecisionSignal.Empty())
1976 mResponsePolicyDecisionSignal.Emit(std::move(decision));
1980 void TizenWebEngineChromium::CertificateConfirm(std::shared_ptr<Dali::WebEngineCertificate> confirm)
1982 DALI_LOG_RELEASE_INFO("#CertificateConfirm.\n");
1983 if (!mCertificateConfirmSignal.Empty())
1985 mCertificateConfirmSignal.Emit(std::move(confirm));
1989 void TizenWebEngineChromium::SslCertificateChanged(std::shared_ptr<Dali::WebEngineCertificate> info)
1991 DALI_LOG_RELEASE_INFO("#SslCertificateChanged.\n");
1992 if (!mSslCertificateChangedSignal.Empty())
1994 mSslCertificateChangedSignal.Emit(std::move(info));
1998 void TizenWebEngineChromium::AuthenticationChallenge(std::shared_ptr<Dali::WebEngineHttpAuthHandler> handler)
2000 DALI_LOG_RELEASE_INFO("#AuthenticationChallenge.\n");
2001 if (!mHttpAuthHandlerSignal.Empty())
2003 mHttpAuthHandlerSignal.Emit(std::move(handler));
2007 void TizenWebEngineChromium::ContextMenuCustomized(std::shared_ptr<Dali::WebEngineContextMenu> menu)
2009 DALI_LOG_RELEASE_INFO("#ContextMenuCustomized.\n");
2010 if (!mContextMenuCustomizedSignal.Empty())
2012 mContextMenuCustomizedSignal.Emit(std::move(menu));
2016 void TizenWebEngineChromium::ContextMenuItemSelected(std::shared_ptr<Dali::WebEngineContextMenuItem> item)
2018 DALI_LOG_RELEASE_INFO("#ContextMenuItemSelected.\n");
2019 if (!mContextMenuItemSelectedSignal.Empty())
2021 mContextMenuItemSelectedSignal.Emit(std::move(item));
2025 void TizenWebEngineChromium::RunJavaScriptEvaluationResultHandler(size_t key, const char* result)
2027 auto handler = mJavaScriptEvaluationResultHandlers.find(key);
2028 if (handler == mJavaScriptEvaluationResultHandlers.end())
2033 if (handler->second)
2035 std::string stored(result);
2036 handler->second(stored);
2039 mJavaScriptEvaluationResultHandlers.erase(handler);
2042 void TizenWebEngineChromium::RunJavaScriptMessageHandler(const std::string& objectName, const std::string& message)
2044 auto handler = mJavaScriptMessageHandlers.find(objectName);
2045 if (handler == mJavaScriptMessageHandlers.end())
2050 handler->second(message);
2053 bool TizenWebEngineChromium::JavaScriptAlert(const std::string& alert_text)
2055 bool result = false;
2056 if (mJavaScriptAlertCallback)
2058 result = mJavaScriptAlertCallback(alert_text);
2063 bool TizenWebEngineChromium::JavaScriptConfirm(const std::string& message)
2065 bool result = false;
2066 if (mJavaScriptConfirmCallback)
2068 result = mJavaScriptConfirmCallback(message);
2073 bool TizenWebEngineChromium::JavaScriptPrompt(const std::string& message, const std::string& default_value)
2075 bool result = false;
2076 if (mJavaScriptPromptCallback)
2078 result = mJavaScriptPromptCallback(message, default_value);
2083 void TizenWebEngineChromium::ScreenshotCaptured(Dali::PixelData pixelData)
2085 if (mScreenshotCapturedCallback)
2087 mScreenshotCapturedCallback(pixelData);
2091 void TizenWebEngineChromium::VideoPlaying(bool isPlaying)
2093 if (mVideoPlayingCallback)
2095 mVideoPlayingCallback(isPlaying);
2099 bool TizenWebEngineChromium::GeolocationPermission(const std::string& host, const std::string& protocol)
2101 bool result = false;
2102 if (mGeolocationPermissionCallback)
2104 result = mGeolocationPermissionCallback(host, protocol);
2109 bool TizenWebEngineChromium::HitTestCreated(std::unique_ptr<Dali::WebEngineHitTest> hitTest)
2111 bool result = false;
2112 if (mHitTestCreatedCallback)
2114 result = mHitTestCreatedCallback(std::move(hitTest));
2119 } // namespace Plugin
2122 extern "C" DALI_EXPORT_API Dali::WebEnginePlugin* CreateWebEnginePlugin()
2124 return new Dali::Plugin::TizenWebEngineChromium();
2127 extern "C" DALI_EXPORT_API void DestroyWebEnginePlugin(Dali::WebEnginePlugin* plugin)