2 * Copyright (c) 2022 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-menu.h"
24 #include "tizen-web-engine-context-menu-item.h"
25 #include "tizen-web-engine-form-repost-decision.h"
26 #include "tizen-web-engine-hit-test.h"
27 #include "tizen-web-engine-http-auth-handler.h"
28 #include "tizen-web-engine-load-error.h"
29 #include "tizen-web-engine-manager.h"
30 #include "tizen-web-engine-policy-decision.h"
31 #include "tizen-web-engine-settings.h"
33 #include <Ecore_Evas.h>
34 #include <Ecore_Wl2.h>
36 #include <dali/devel-api/common/stage.h>
37 #include <dali/integration-api/adaptor-framework/adaptor.h>
38 #include <dali/integration-api/debug.h>
39 #include <dali/public-api/images/pixel-data.h>
41 #include <ewk_main_internal.h>
42 #include <ewk_settings_product.h>
43 #include <ewk_view_product.h>
55 template <typename Callback, typename... Args>
56 void ExecuteCallback(Callback callback, Args... args)
64 template <typename Callback, typename Arg>
65 void ExecuteCallback(Callback callback, std::unique_ptr<Arg> arg)
69 callback(std::move(arg));
73 template <typename Ret, typename Callback, typename... Args>
74 Ret ExecuteCallbackReturn(Callback callback, Args... args)
76 Ret returnVal = Ret();
79 returnVal = callback(args...);
84 template <typename Ret, typename Callback, typename Arg>
85 Ret ExecuteCallbackReturn(Callback callback, std::unique_ptr<Arg> arg)
87 Ret returnVal = Ret();
90 returnVal = callback(std::move(arg));
95 } // Anonymous namespace
97 class TBMSurfaceSourceInitializer
100 explicit TBMSurfaceSourceInitializer(NativeImageSourcePtr& imageSrc, uint32_t width, uint32_t height)
102 mSurface = tbm_surface_create(width, height, TBM_FORMAT_ARGB8888);
105 DALI_LOG_ERROR("Failed to create tbm surface.");
108 Any tbmSource(mSurface);
109 imageSrc = NativeImageSource::New(tbmSource);
111 imageSrc->SetSource(emptySource);
114 ~TBMSurfaceSourceInitializer()
118 if (tbm_surface_destroy(mSurface) != TBM_SURFACE_ERROR_NONE)
120 DALI_LOG_ERROR("Failed to destroy tbm surface.");
126 tbm_surface_h mSurface;
129 TizenWebEngineChromium::TizenWebEngineChromium()
133 , mJavaScriptEvaluationCount(0)
137 TizenWebEngineChromium::~TizenWebEngineChromium()
142 void TizenWebEngineChromium::Create(uint32_t width, uint32_t height, const std::string& locale, const std::string& timezoneID)
146 InitWebView(0, nullptr);
147 WebEngineManager::Get().Add(mWebView, this);
148 TBMSurfaceSourceInitializer initializer(mDaliImageSrc, mWidth, mHeight);
151 void TizenWebEngineChromium::Create(uint32_t width, uint32_t height, uint32_t argc, char** argv)
155 InitWebView(argc, argv);
156 WebEngineManager::Get().Add(mWebView, this);
157 TBMSurfaceSourceInitializer initializer(mDaliImageSrc, mWidth, mHeight);
160 void TizenWebEngineChromium::Destroy()
162 mJavaScriptEvaluationResultHandlers.clear();
163 mJavaScriptMessageHandlers.clear();
165 WebEngineManager::Get().Remove(mWebView);
166 evas_object_del(mWebView);
169 void TizenWebEngineChromium::LoadUrl(const std::string& path)
171 ewk_view_url_set(mWebView, path.c_str());
174 std::string TizenWebEngineChromium::GetTitle() const
176 const char* title = ewk_view_title_get(mWebView);
177 return title ? std::string(title) : std::string();
180 Dali::PixelData TizenWebEngineChromium::GetFavicon() const
182 Evas_Object* iconObject = ewk_view_favicon_get(mWebView);
185 return Dali::PixelData();
187 return ConvertImageColorSpace(iconObject);
190 NativeImageSourcePtr TizenWebEngineChromium::GetNativeImageSource()
192 return mDaliImageSrc;
195 std::string TizenWebEngineChromium::GetUrl() const
197 const char* url = ewk_view_url_get(mWebView);
198 return url ? std::string(url) : std::string();
201 void TizenWebEngineChromium::LoadHtmlString(const std::string& html)
203 ewk_view_html_string_load(mWebView, html.c_str(), 0, 0);
206 bool TizenWebEngineChromium::LoadHtmlStringOverrideCurrentEntry(const std::string& html, const std::string& basicUri, const std::string& unreachableUrl)
208 char* cBasicUri = basicUri.length() ? (char *)basicUri.c_str() : nullptr;
209 char* cUnreachableUrl = unreachableUrl.length() ? (char *)unreachableUrl.c_str() : nullptr;
210 return ewk_view_html_string_override_current_entry_load(mWebView, html.c_str(), cBasicUri, cUnreachableUrl);
213 bool TizenWebEngineChromium::LoadContents(const std::string& contents, uint32_t contentSize, const std::string& mimeType,
214 const std::string& encoding, const std::string& baseUri)
216 char* cMimeType = mimeType.length() ? (char *)mimeType.c_str() : nullptr;
217 char* cEncoding = encoding.length() ? (char *)encoding.c_str() : nullptr;
218 char* cBaseUri = baseUri.length() ? (char *)baseUri.c_str() : nullptr;
219 return ewk_view_contents_set(mWebView, contents.c_str(), contentSize, cMimeType, cEncoding, cBaseUri);
222 void TizenWebEngineChromium::Reload()
224 ewk_view_reload(mWebView);
227 bool TizenWebEngineChromium::ReloadWithoutCache()
229 return ewk_view_reload_bypass_cache(mWebView);
232 void TizenWebEngineChromium::StopLoading()
234 ewk_view_stop(mWebView);
237 void TizenWebEngineChromium::Suspend()
239 ewk_view_suspend(mWebView);
242 void TizenWebEngineChromium::Resume()
244 ewk_view_resume(mWebView);
247 void TizenWebEngineChromium::SuspendNetworkLoading()
249 ewk_view_suspend_network_loading(mWebView);
252 void TizenWebEngineChromium::ResumeNetworkLoading()
254 ewk_view_resume_network_loading(mWebView);
257 bool TizenWebEngineChromium::AddCustomHeader(const std::string& name, const std::string& value)
259 return ewk_view_custom_header_add(mWebView, name.c_str(), value.c_str());
262 bool TizenWebEngineChromium::RemoveCustomHeader(const std::string& name)
264 return ewk_view_custom_header_remove(mWebView, name.c_str());
267 uint32_t TizenWebEngineChromium::StartInspectorServer(uint32_t port)
269 return ewk_view_inspector_server_start(mWebView, port);
272 bool TizenWebEngineChromium::StopInspectorServer()
274 return ewk_view_inspector_server_stop(mWebView);
277 void TizenWebEngineChromium::ScrollBy(int32_t deltaX, int32_t deltaY)
279 ewk_view_scroll_by(mWebView, deltaX, deltaY);
282 bool TizenWebEngineChromium::ScrollEdgeBy(int32_t deltaX, int32_t deltaY)
284 return ewk_view_edge_scroll_by(mWebView, deltaX, deltaY);
287 void TizenWebEngineChromium::SetScrollPosition(int32_t x, int32_t y)
289 ewk_view_scroll_set(mWebView, x, y);
292 Dali::Vector2 TizenWebEngineChromium::GetScrollPosition() const
295 ewk_view_scroll_pos_get(mWebView, &x, &y);
296 return Dali::Vector2(x, y);
299 Dali::Vector2 TizenWebEngineChromium::GetScrollSize() const
301 int width = 0, height = 0;
302 ewk_view_scroll_size_get(mWebView, &width, &height);
303 return Dali::Vector2(width, height);
306 Dali::Vector2 TizenWebEngineChromium::GetContentSize() const
308 int width = 0, height = 0;
309 ewk_view_contents_size_get(mWebView, &width, &height);
310 return Dali::Vector2(width, height);
313 bool TizenWebEngineChromium::CanGoForward()
315 return ewk_view_forward_possible(mWebView);
318 void TizenWebEngineChromium::GoForward()
320 ewk_view_forward(mWebView);
323 bool TizenWebEngineChromium::CanGoBack()
325 return ewk_view_back_possible(mWebView);
328 void TizenWebEngineChromium::GoBack()
330 ewk_view_back(mWebView);
333 void TizenWebEngineChromium::EvaluateJavaScript(const std::string& script, JavaScriptMessageHandlerCallback resultHandler)
335 bool badAlloc = false;
339 mJavaScriptEvaluationResultHandlers.emplace(mJavaScriptEvaluationCount, resultHandler);
341 catch (std::bad_alloc& e)
344 DALI_LOG_ERROR("Too many ongoing JavaScript evaluations.");
349 ewk_view_script_execute(mWebView, script.c_str(), &TizenWebEngineChromium::OnEvaluateJavaScript, (void*)mJavaScriptEvaluationCount);
350 mJavaScriptEvaluationCount++;
354 void TizenWebEngineChromium::AddJavaScriptMessageHandler(const std::string& exposedObjectName, JavaScriptMessageHandlerCallback handler)
356 if (mJavaScriptMessageHandlers.emplace(exposedObjectName, handler).second)
358 ewk_view_javascript_message_handler_add(mWebView, &TizenWebEngineChromium::OnJavaScriptMessage, exposedObjectName.c_str());
362 DALI_LOG_ERROR("Callback for (%s) already exists.", exposedObjectName.c_str());
366 void TizenWebEngineChromium::RegisterJavaScriptAlertCallback(JavaScriptAlertCallback callback)
368 mJavaScriptAlertCallback = callback;
369 ewk_view_javascript_alert_callback_set(mWebView, &TizenWebEngineChromium::OnJavaScriptAlert, this);
372 void TizenWebEngineChromium::JavaScriptAlertReply()
374 ewk_view_javascript_alert_reply(mWebView);
377 void TizenWebEngineChromium::RegisterJavaScriptConfirmCallback(JavaScriptConfirmCallback callback)
379 mJavaScriptConfirmCallback = callback;
380 ewk_view_javascript_confirm_callback_set(mWebView, &TizenWebEngineChromium::OnJavaScriptConfirm, this);
383 void TizenWebEngineChromium::JavaScriptConfirmReply(bool confirmed)
385 ewk_view_javascript_confirm_reply(mWebView, confirmed);
388 void TizenWebEngineChromium::RegisterJavaScriptPromptCallback(JavaScriptPromptCallback callback)
390 mJavaScriptPromptCallback = callback;
391 ewk_view_javascript_prompt_callback_set(mWebView, &TizenWebEngineChromium::OnJavaScriptPrompt, this);
394 void TizenWebEngineChromium::JavaScriptPromptReply(const std::string& result)
396 ewk_view_javascript_prompt_reply(mWebView, result.c_str());
399 void TizenWebEngineChromium::ClearHistory()
401 ewk_view_back_forward_list_clear(mWebView);
404 void TizenWebEngineChromium::ClearAllTilesResources()
406 ewk_view_clear_all_tiles_resources(mWebView);
409 std::string TizenWebEngineChromium::GetUserAgent() const
411 const char* agent = ewk_view_user_agent_get(mWebView);
412 return agent ? std::string(agent) : std::string();
415 void TizenWebEngineChromium::SetUserAgent(const std::string& userAgent)
417 ewk_view_user_agent_set(mWebView, userAgent.c_str());
420 Dali::WebEngineSettings& TizenWebEngineChromium::GetSettings() const
422 static TizenWebEngineSettings dummy(nullptr);
423 return mWebEngineSettings ? *mWebEngineSettings : dummy;
426 Dali::WebEngineBackForwardList& TizenWebEngineChromium::GetBackForwardList() const
428 static TizenWebEngineBackForwardList dummy(nullptr);
429 return mWebEngineBackForwardList ? *mWebEngineBackForwardList : dummy;
432 std::unique_ptr<Dali::WebEngineHitTest> TizenWebEngineChromium::CreateHitTest(int32_t x, int32_t y, Dali::WebEngineHitTest::HitTestMode mode)
435 Evas* evas = ecore_evas_get(WebEngineManager::Get().GetWindow());
436 Ewk_Hit_Test* hitTest = ewk_view_hit_test_new(mWebView, x, y, (int)mode);
437 std::unique_ptr<Dali::WebEngineHitTest> webHitTest(new TizenWebEngineHitTest(hitTest, evas, true));
441 bool TizenWebEngineChromium::CreateHitTestAsynchronously(int32_t x, int32_t y, Dali::WebEngineHitTest::HitTestMode mode, WebEngineHitTestCreatedCallback callback)
443 mHitTestCreatedCallback = callback;
444 bool result = ewk_view_hit_test_request(mWebView, x, y, (int)mode, &TizenWebEngineChromium::OnHitTestCreated, this);
448 void TizenWebEngineChromium::SetSize(uint32_t width, uint32_t height)
452 evas_object_resize(mWebView, mWidth, mHeight);
455 void TizenWebEngineChromium::SetDocumentBackgroundColor(Dali::Vector4 color)
457 ewk_view_bg_color_set(mWebView, color.r * 255, color.g * 255, color.b * 255, color.a * 255);
460 void TizenWebEngineChromium::ClearTilesWhenHidden(bool cleared)
462 ewk_view_clear_tiles_on_hide_enabled_set(mWebView, cleared);
465 void TizenWebEngineChromium::SetTileCoverAreaMultiplier(float multiplier)
467 ewk_view_tile_cover_area_multiplier_set(mWebView, multiplier);
470 void TizenWebEngineChromium::EnableCursorByClient(bool enabled)
472 ewk_view_set_cursor_by_client(mWebView, enabled);
475 std::string TizenWebEngineChromium::GetSelectedText() const
477 const char* text = ewk_view_text_selection_text_get(mWebView);
478 return text ? std::string(text) : std::string();
481 bool TizenWebEngineChromium::SendTouchEvent(const Dali::TouchEvent& touch)
483 #if defined(OS_TIZEN_TV)
484 return FeedMouseEvent(touch);
486 return FeedTouchEvent(touch);
490 bool TizenWebEngineChromium::SendKeyEvent(const Dali::KeyEvent& keyEvent)
492 void* evasKeyEvent = 0;
493 if (keyEvent.GetState() == Dali::KeyEvent::DOWN)
495 Evas_Event_Key_Down downEvent;
496 memset(&downEvent, 0, sizeof(Evas_Event_Key_Down));
497 downEvent.key = keyEvent.GetKeyName().c_str();
498 downEvent.string = keyEvent.GetKeyString().c_str();
499 evasKeyEvent = static_cast<void*>(&downEvent);
500 ewk_view_send_key_event(mWebView, evasKeyEvent, true);
504 Evas_Event_Key_Up upEvent;
505 memset(&upEvent, 0, sizeof(Evas_Event_Key_Up));
506 upEvent.key = keyEvent.GetKeyName().c_str();
507 upEvent.string = keyEvent.GetKeyString().c_str();
508 evasKeyEvent = static_cast<void*>(&upEvent);
509 ewk_view_send_key_event(mWebView, evasKeyEvent, false);
514 bool TizenWebEngineChromium::SendHoverEvent(const Dali::HoverEvent& event)
519 bool TizenWebEngineChromium::SendWheelEvent(const Dali::WheelEvent& wheel)
521 Eina_Bool direction = wheel.GetDirection() ? false : true;
522 int step = wheel.GetDelta();
523 float x = wheel.GetPoint().x;
524 float y = wheel.GetPoint().y;
525 ewk_view_feed_mouse_wheel(mWebView, direction, step, x, y);
529 void TizenWebEngineChromium::SetFocus(bool focused)
531 ecore_evas_focus_set(WebEngineManager::Get().GetWindow(), focused);
532 ewk_view_focus_set(mWebView, focused);
535 void TizenWebEngineChromium::EnableMouseEvents(bool enabled)
537 ewk_view_mouse_events_enabled_set(mWebView, enabled);
540 void TizenWebEngineChromium::EnableKeyEvents(bool enabled)
542 ewk_view_key_events_enabled_set(mWebView, enabled);
545 void TizenWebEngineChromium::SetPageZoomFactor(float zoomFactor)
547 ewk_view_page_zoom_set(mWebView, zoomFactor);
550 float TizenWebEngineChromium::GetPageZoomFactor() const
552 return ewk_view_page_zoom_get(mWebView);
555 void TizenWebEngineChromium::SetTextZoomFactor(float zoomFactor)
557 ewk_view_text_zoom_set(mWebView, zoomFactor);
560 float TizenWebEngineChromium::GetTextZoomFactor() const
562 return ewk_view_text_zoom_get(mWebView);
565 float TizenWebEngineChromium::GetLoadProgressPercentage() const
567 return ewk_view_load_progress_get(mWebView);
570 void TizenWebEngineChromium::SetScaleFactor(float scaleFactor, Dali::Vector2 point)
572 ewk_view_scale_set(mWebView, scaleFactor, point.x, point.y);
575 float TizenWebEngineChromium::GetScaleFactor() const
577 return ewk_view_scale_get(mWebView);
580 void TizenWebEngineChromium::ActivateAccessibility(bool activated)
582 ewk_view_atk_deactivation_by_app(mWebView, !activated);
585 Accessibility::Address TizenWebEngineChromium::GetAccessibilityAddress()
587 static const char plugIdKey[] = "__PlugID";
588 static const char rootPath[] = "root";
590 std::string_view plugId;
592 if (auto* data = static_cast<const char*>(evas_object_data_get(mWebView, plugIdKey)))
597 // We expect plugId to be of the form ":1.23:/org/a11y/atspi/accessible/root"
598 auto pos = plugId.rfind(':');
599 if (pos == std::string_view::npos || pos == 0)
601 DALI_LOG_ERROR("Cannot parse PlugID set by Chromium: %s = \"%s\"", plugIdKey, plugId.data());
605 return {std::string{plugId.substr(0, pos)}, rootPath};
608 bool TizenWebEngineChromium::SetVisibility(bool visible)
610 return ewk_view_visibility_set(mWebView, visible);
613 bool TizenWebEngineChromium::HighlightText(const std::string& text, Dali::WebEnginePlugin::FindOption options, uint32_t maxMatchCount)
615 return ewk_view_text_find(mWebView, text.c_str(), (Ewk_Find_Options)options, maxMatchCount);
618 void TizenWebEngineChromium::AddDynamicCertificatePath(const std::string& host, const std::string& certPath)
620 ewk_view_add_dynamic_certificate_path(mWebView, host.c_str(), certPath.c_str());
623 Dali::PixelData TizenWebEngineChromium::GetScreenshot(Dali::Rect<int32_t> viewArea, float scaleFactor)
626 EINA_RECTANGLE_SET(&rect, viewArea.x, viewArea.y, viewArea.width, viewArea.height);
627 Evas *evas = ecore_evas_get(WebEngineManager::Get().GetWindow());
628 Evas_Object *snapShotObject = ewk_view_screenshot_contents_get(mWebView, rect, scaleFactor, evas);
631 return Dali::PixelData();
633 return ConvertImageColorSpace(snapShotObject);
636 bool TizenWebEngineChromium::GetScreenshotAsynchronously(Dali::Rect<int32_t> viewArea, float scaleFactor, ScreenshotCapturedCallback callback)
639 EINA_RECTANGLE_SET(&rect, viewArea.x, viewArea.y, viewArea.width, viewArea.height);
640 Evas *evas = ecore_evas_get(WebEngineManager::Get().GetWindow());
641 return ewk_view_screenshot_contents_get_async(mWebView, rect, scaleFactor, evas, &TizenWebEngineChromium::OnScreenshotCaptured, this);
644 bool TizenWebEngineChromium::CheckVideoPlayingAsynchronously(VideoPlayingCallback callback)
646 return ewk_view_is_video_playing(mWebView, &TizenWebEngineChromium::OnVideoPlaying, this);
649 void TizenWebEngineChromium::GetPlainTextAsynchronously(PlainTextReceivedCallback callback)
651 mPlainTextReceivedCallback = callback;
652 ewk_view_plain_text_get(mWebView, &TizenWebEngineChromium::OnPlainTextReceived, this);
655 void TizenWebEngineChromium::RegisterGeolocationPermissionCallback(GeolocationPermissionCallback callback)
657 ewk_view_geolocation_permission_callback_set(mWebView, &TizenWebEngineChromium::OnGeolocationPermission, this);
660 void TizenWebEngineChromium::UpdateDisplayArea(Dali::Rect<int32_t> displayArea)
662 evas_object_move(mWebView, displayArea.x, displayArea.y);
663 SetSize(displayArea.width, displayArea.height);
664 evas_object_geometry_set(mWebView, displayArea.x, displayArea.y, displayArea.width, displayArea.height);
667 void TizenWebEngineChromium::EnableVideoHole(bool enabled)
669 Ecore_Wl2_Window* win = AnyCast<Ecore_Wl2_Window*>(Adaptor::Get().GetNativeWindowHandle());
670 ewk_view_set_support_video_hole(mWebView, win, enabled, EINA_FALSE);
673 Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType& TizenWebEngineChromium::FrameRenderedSignal()
675 return mFrameRenderedSignal;
678 void TizenWebEngineChromium::RegisterPageLoadStartedCallback(WebEnginePageLoadCallback callback)
680 mLoadStartedCallback = callback;
683 void TizenWebEngineChromium::RegisterPageLoadInProgressCallback(WebEnginePageLoadCallback callback)
685 mLoadInProgressCallback = callback;
688 void TizenWebEngineChromium::RegisterPageLoadFinishedCallback(WebEnginePageLoadCallback callback)
690 mLoadFinishedCallback = callback;
693 void TizenWebEngineChromium::RegisterPageLoadErrorCallback(WebEnginePageLoadErrorCallback callback)
695 mLoadErrorCallback = callback;
698 void TizenWebEngineChromium::RegisterScrollEdgeReachedCallback(WebEngineScrollEdgeReachedCallback callback)
700 mScrollEdgeReachedCallback = callback;
703 void TizenWebEngineChromium::RegisterUrlChangedCallback(WebEngineUrlChangedCallback callback)
705 mUrlChangedCallback = callback;
708 void TizenWebEngineChromium::RegisterFormRepostDecidedCallback(WebEngineFormRepostDecidedCallback callback)
710 mFormRepostDecidedCallback = callback;
713 void TizenWebEngineChromium::RegisterConsoleMessageReceivedCallback(WebEngineConsoleMessageReceivedCallback callback)
715 mConsoleMessageReceivedCallback = callback;
718 void TizenWebEngineChromium::RegisterResponsePolicyDecidedCallback(WebEngineResponsePolicyDecidedCallback callback)
720 mResponsePolicyDecidedCallback = callback;
723 void TizenWebEngineChromium::RegisterNavigationPolicyDecidedCallback(WebEngineNavigationPolicyDecidedCallback callback)
725 mNavigationPolicyDecidedCallback = callback;
728 void TizenWebEngineChromium::RegisterCertificateConfirmedCallback(WebEngineCertificateCallback callback)
730 mCertificateConfirmedCallback = callback;
733 void TizenWebEngineChromium::RegisterSslCertificateChangedCallback(WebEngineCertificateCallback callback)
735 mSslCertificateChangedCallback = callback;
738 void TizenWebEngineChromium::RegisterHttpAuthHandlerCallback(WebEngineHttpAuthHandlerCallback callback)
740 mHttpAuthHandlerCallback = callback;
743 void TizenWebEngineChromium::RegisterContextMenuShownCallback(WebEngineContextMenuShownCallback callback)
745 mContextMenuShownCallback = callback;
748 void TizenWebEngineChromium::RegisterContextMenuHiddenCallback(WebEngineContextMenuHiddenCallback callback)
750 mContextMenuHiddenCallback = callback;
753 void TizenWebEngineChromium::RunJavaScriptEvaluationResultHandler(size_t key, const char* result)
755 auto handler = mJavaScriptEvaluationResultHandlers.find(key);
756 if (handler == mJavaScriptEvaluationResultHandlers.end())
763 std::string stored(result);
764 handler->second(stored);
767 mJavaScriptEvaluationResultHandlers.erase(handler);
770 void TizenWebEngineChromium::RunJavaScriptMessageHandler(const std::string& objectName, const std::string& message)
772 auto handler = mJavaScriptMessageHandlers.find(objectName);
773 if (handler == mJavaScriptMessageHandlers.end())
778 handler->second(message);
781 bool TizenWebEngineChromium::JavaScriptAlert(const std::string& alert_text)
783 return ExecuteCallbackReturn<bool>(mJavaScriptAlertCallback, alert_text);
786 bool TizenWebEngineChromium::JavaScriptConfirm(const std::string& message)
788 return ExecuteCallbackReturn<bool>(mJavaScriptConfirmCallback, message);
791 bool TizenWebEngineChromium::JavaScriptPrompt(const std::string& message, const std::string& default_value)
793 return ExecuteCallbackReturn<bool>(mJavaScriptPromptCallback, message, default_value);
796 void TizenWebEngineChromium::ScreenshotCaptured(Dali::PixelData pixelData)
798 DALI_LOG_RELEASE_INFO("#ScreenshotCaptured.\n");
799 ExecuteCallback(mScreenshotCapturedCallback, pixelData);
802 void TizenWebEngineChromium::VideoPlaying(bool isPlaying)
804 ExecuteCallback(mVideoPlayingCallback, isPlaying);
807 bool TizenWebEngineChromium::GeolocationPermission(const std::string& host, const std::string& protocol)
809 return ExecuteCallbackReturn<bool>(mGeolocationPermissionCallback, host, protocol);
812 bool TizenWebEngineChromium::HitTestCreated(std::unique_ptr<Dali::WebEngineHitTest> hitTest)
814 return ExecuteCallbackReturn<bool>(mHitTestCreatedCallback, std::move(hitTest));
817 void TizenWebEngineChromium::PlainTextRecieved(const std::string& plainText)
819 ExecuteCallback(mPlainTextReceivedCallback, plainText);
822 void TizenWebEngineChromium::InitWebView(uint32_t argc, char** argv)
826 ewk_set_arguments(argc, argv);
829 Ecore_Wl2_Window* win = AnyCast<Ecore_Wl2_Window*>(Adaptor::Get().GetNativeWindowHandle());
830 Ewk_Context* context = ewk_context_default_get();
831 ewk_context_max_refresh_rate_set(context, 60);
832 mWebView = ewk_view_add(ecore_evas_get(WebEngineManager::Get().GetWindow()));
833 ewk_view_offscreen_rendering_enabled_set(mWebView, true);
834 ewk_view_ime_window_set(mWebView, win);
836 Ewk_Settings* settings = ewk_view_settings_get(mWebView);
837 mWebEngineSettings.reset(new TizenWebEngineSettings(settings));
839 Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(mWebView);
840 mWebEngineBackForwardList.reset(new TizenWebEngineBackForwardList(backForwardList));
842 ewk_settings_viewport_meta_tag_set(settings, false);
844 evas_object_smart_callback_add(mWebView, "offscreen,frame,rendered",
845 &TizenWebEngineChromium::OnFrameRendered,
847 evas_object_smart_callback_add(mWebView, "load,started",
848 &TizenWebEngineChromium::OnLoadStarted,
850 evas_object_smart_callback_add(mWebView, "load,progress",
851 &TizenWebEngineChromium::OnLoadInProgress,
853 evas_object_smart_callback_add(mWebView, "load,finished",
854 &TizenWebEngineChromium::OnLoadFinished,
856 evas_object_smart_callback_add(mWebView, "load,error",
857 &TizenWebEngineChromium::OnLoadError,
859 evas_object_smart_callback_add(mWebView, "url,changed",
860 &TizenWebEngineChromium::OnUrlChanged,
862 evas_object_smart_callback_add(mWebView, "console,message",
863 &TizenWebEngineChromium::OnConsoleMessageReceived,
865 evas_object_smart_callback_add(mWebView, "edge,left",
866 &TizenWebEngineChromium::OnEdgeLeft,
868 evas_object_smart_callback_add(mWebView, "edge,right",
869 &TizenWebEngineChromium::OnEdgeRight,
871 evas_object_smart_callback_add(mWebView, "edge,top",
872 &TizenWebEngineChromium::OnEdgeTop,
874 evas_object_smart_callback_add(mWebView, "edge,bottom",
875 &TizenWebEngineChromium::OnEdgeBottom,
877 evas_object_smart_callback_add(mWebView, "form,repost,warning,show",
878 &TizenWebEngineChromium::OnFormRepostDecided,
880 evas_object_smart_callback_add(mWebView, "policy,response,decide",
881 &TizenWebEngineChromium::OnResponsePolicyDecided,
883 evas_object_smart_callback_add(mWebView, "policy,navigation,decide",
884 &TizenWebEngineChromium::OnNavigationPolicyDecided,
886 evas_object_smart_callback_add(mWebView, "request,certificate,confirm",
887 &TizenWebEngineChromium::OnCertificateConfirmed,
889 evas_object_smart_callback_add(mWebView, "ssl,certificate,changed",
890 &TizenWebEngineChromium::OnSslCertificateChanged,
892 evas_object_smart_callback_add(mWebView, "contextmenu,show",
893 &TizenWebEngineChromium::OnContextMenuShown,
895 evas_object_smart_callback_add(mWebView, "contextmenu,hide",
896 &TizenWebEngineChromium::OnContextMenuHidden,
899 ewk_view_authentication_callback_set(mWebView, &TizenWebEngineChromium::OnAuthenticationChallenged, this);
901 evas_object_resize(mWebView, mWidth, mHeight);
902 evas_object_show(mWebView);
905 bool TizenWebEngineChromium::FeedMouseEvent(const TouchEvent& touch)
907 Ewk_Mouse_Button_Type type = (Ewk_Mouse_Button_Type)0;
908 switch (touch.GetMouseButton(0))
910 case MouseButton::PRIMARY:
912 type = EWK_Mouse_Button_Left;
915 case MouseButton::TERTIARY:
917 type = EWK_Mouse_Button_Middle;
920 case MouseButton::SECONDARY:
922 type = EWK_Mouse_Button_Right;
931 switch (touch.GetState(0))
933 case PointState::DOWN:
935 float x = touch.GetScreenPosition(0).x;
936 float y = touch.GetScreenPosition(0).y;
937 ewk_view_feed_mouse_down(mWebView, type, x, y);
942 float x = touch.GetScreenPosition(0).x;
943 float y = touch.GetScreenPosition(0).y;
944 ewk_view_feed_mouse_up(mWebView, type, x, y);
947 case PointState::MOTION:
949 float x = touch.GetScreenPosition(0).x;
950 float y = touch.GetScreenPosition(0).y;
951 ewk_view_feed_mouse_move(mWebView, x, y);
962 bool TizenWebEngineChromium::FeedTouchEvent(const TouchEvent& touch)
964 Ewk_Touch_Event_Type type = EWK_TOUCH_START;
965 Evas_Touch_Point_State state = EVAS_TOUCH_POINT_DOWN;
966 switch (touch.GetState(0))
968 case PointState::DOWN:
970 type = EWK_TOUCH_START;
971 state = EVAS_TOUCH_POINT_DOWN;
976 type = EWK_TOUCH_END;
977 state = EVAS_TOUCH_POINT_UP;
980 case PointState::MOTION:
982 type = EWK_TOUCH_MOVE;
983 state = EVAS_TOUCH_POINT_MOVE;
986 case PointState::INTERRUPTED:
988 type = EWK_TOUCH_CANCEL;
989 state = EVAS_TOUCH_POINT_CANCEL;
998 Eina_List* pointList = 0;
999 Ewk_Touch_Point point;
1001 point.x = touch.GetScreenPosition(0).x;
1002 point.y = touch.GetScreenPosition(0).y;
1003 point.state = state;
1004 pointList = eina_list_append(pointList, &point);
1006 ewk_view_feed_touch_event(mWebView, type, pointList, 0);
1007 eina_list_free(pointList);
1011 Dali::PixelData TizenWebEngineChromium::ConvertImageColorSpace(Evas_Object* image)
1013 // color-space is argb8888.
1014 uint8_t* pixelBuffer = (uint8_t*)evas_object_image_data_get(image, false);
1017 return Dali::PixelData();
1020 int width = 0, height = 0;
1021 evas_object_image_size_get(image, &width, &height);
1023 uint32_t bufferSize = width * height * 4;
1024 uint8_t* convertedBuffer = new uint8_t[bufferSize];
1026 // convert the color-space to rgba8888.
1027 for (uint32_t i = 0; i < bufferSize; i += 4)
1029 convertedBuffer[i] = pixelBuffer[i + 1];
1030 convertedBuffer[i + 1] = pixelBuffer[i + 2];
1031 convertedBuffer[i + 2] = pixelBuffer[i + 3];
1032 convertedBuffer[i + 3] = pixelBuffer[i];
1035 return Dali::PixelData::New(convertedBuffer, bufferSize, width, height,
1036 Dali::Pixel::Format::RGBA8888,
1037 Dali::PixelData::ReleaseFunction::DELETE_ARRAY);
1040 void TizenWebEngineChromium::OnFrameRendered(void* data, Evas_Object*, void* buffer)
1042 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1043 pThis->UpdateImage(static_cast<tbm_surface_h>(buffer));
1046 void TizenWebEngineChromium::OnLoadStarted(void* data, Evas_Object*, void*)
1048 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1049 pThis->LoadStarted();
1052 void TizenWebEngineChromium::OnLoadInProgress(void* data, Evas_Object*, void*)
1054 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1055 pThis->LoadInProgress();
1058 void TizenWebEngineChromium::OnLoadFinished(void* data, Evas_Object*, void*)
1060 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1061 pThis->LoadFinished();
1064 void TizenWebEngineChromium::OnLoadError(void* data, Evas_Object*, void* rawError)
1066 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1067 Ewk_Error* error = static_cast<Ewk_Error*>(rawError);
1068 std::unique_ptr<Dali::WebEngineLoadError> loadError(new TizenWebEngineLoadError(error));
1069 pThis->LoadError(std::move(loadError));
1072 void TizenWebEngineChromium::OnUrlChanged(void* data, Evas_Object*, void* newUrl)
1074 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1075 std::string url = static_cast<char*>(newUrl);
1076 pThis->UrlChanged(url);
1079 void TizenWebEngineChromium::OnConsoleMessageReceived(void* data, Evas_Object*, void* eventInfo)
1081 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1082 Ewk_Console_Message* message = static_cast<Ewk_Console_Message*>(eventInfo);
1083 std::unique_ptr<Dali::WebEngineConsoleMessage> webConsoleMessage(new TizenWebEngineConsoleMessage(message));
1084 pThis->ConsoleMessageReceived(std::move(webConsoleMessage));
1087 void TizenWebEngineChromium::OnEdgeLeft(void* data, Evas_Object*, void*)
1089 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1090 pThis->ScrollEdgeReached(Dali::WebEnginePlugin::ScrollEdge::LEFT);
1093 void TizenWebEngineChromium::OnEdgeRight(void* data, Evas_Object*, void*)
1095 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1096 pThis->ScrollEdgeReached(Dali::WebEnginePlugin::ScrollEdge::RIGHT);
1099 void TizenWebEngineChromium::OnEdgeTop(void* data, Evas_Object*, void*)
1101 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1102 pThis->ScrollEdgeReached(Dali::WebEnginePlugin::ScrollEdge::TOP);
1105 void TizenWebEngineChromium::OnEdgeBottom(void* data, Evas_Object*, void*)
1107 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1108 pThis->ScrollEdgeReached(Dali::WebEnginePlugin::ScrollEdge::BOTTOM);
1111 void TizenWebEngineChromium::OnFormRepostDecided(void* data, Evas_Object*, void* eventInfo)
1113 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1114 Ewk_Form_Repost_Decision_Request* decisionRequest = static_cast<Ewk_Form_Repost_Decision_Request*>(eventInfo);
1115 std::unique_ptr<Dali::WebEngineFormRepostDecision> webDecisionRequest(new TizenWebEngineFormRepostDecision(decisionRequest));
1116 pThis->RequestFormRepostDecided(std::move(webDecisionRequest));
1119 void TizenWebEngineChromium::OnResponsePolicyDecided(void* data, Evas_Object*, void* policy)
1121 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1122 Ewk_Policy_Decision* policyDecision = static_cast<Ewk_Policy_Decision*>(policy);
1123 std::unique_ptr<Dali::WebEnginePolicyDecision> webPolicyDecision(new TizenWebEnginePolicyDecision(policyDecision));
1124 pThis->ResponsePolicyDecided(std::move(webPolicyDecision));
1127 void TizenWebEngineChromium::OnNavigationPolicyDecided(void* data, Evas_Object*, void* policy)
1129 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1130 Ewk_Policy_Decision* policyDecision = static_cast<Ewk_Policy_Decision*>(policy);
1131 std::unique_ptr<Dali::WebEnginePolicyDecision> webPolicyDecision(new TizenWebEnginePolicyDecision(policyDecision));
1132 pThis->NavigationPolicyDecided(std::move(webPolicyDecision));
1135 void TizenWebEngineChromium::OnCertificateConfirmed(void* data, Evas_Object*, void* eventInfo)
1137 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1138 Ewk_Certificate_Policy_Decision* policyDecision = static_cast<Ewk_Certificate_Policy_Decision*>(eventInfo);
1139 std::unique_ptr<Dali::WebEngineCertificate> webPolicyDecision(new TizenWebEngineCertificate(policyDecision));
1140 pThis->CertificateConfirmed(std::move(webPolicyDecision));
1143 void TizenWebEngineChromium::OnSslCertificateChanged(void* data, Evas_Object*, void* eventInfo)
1145 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1146 Ewk_Certificate_Info* info = static_cast<Ewk_Certificate_Info*>(eventInfo);
1147 std::unique_ptr<Dali::WebEngineCertificate> webCertiInfo(new TizenWebEngineCertificate(info));
1148 pThis->SslCertificateChanged(std::move(webCertiInfo));
1151 void TizenWebEngineChromium::OnContextMenuShown(void* data, Evas_Object*, void* eventInfo)
1153 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1154 Ewk_Context_Menu* menu = (Ewk_Context_Menu*)eventInfo;
1155 std::unique_ptr<Dali::WebEngineContextMenu> contextMenu(new TizenWebEngineContextMenu(menu));
1156 pThis->ContextMenuShown(std::move(contextMenu));
1159 void TizenWebEngineChromium::OnContextMenuHidden(void* data, Evas_Object*, void* eventInfo)
1161 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1162 Ewk_Context_Menu* menu = (Ewk_Context_Menu*)eventInfo;
1163 std::unique_ptr<Dali::WebEngineContextMenu> contextMenu(new TizenWebEngineContextMenu(menu));
1164 pThis->ContextMenuHidden(std::move(contextMenu));
1167 void TizenWebEngineChromium::OnAuthenticationChallenged(Evas_Object*, Ewk_Auth_Challenge* authChallenge, void* data)
1169 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1170 std::unique_ptr<Dali::WebEngineHttpAuthHandler> authHandler(new TizenWebEngineHttpAuthHandler(authChallenge));
1171 pThis->AuthenticationChallenged(std::move(authHandler));
1174 void TizenWebEngineChromium::OnEvaluateJavaScript(Evas_Object* o, const char* result, void* data)
1176 auto plugin = WebEngineManager::Get().Find(o);
1179 auto pThis = static_cast<TizenWebEngineChromium*>(plugin);
1180 pThis->RunJavaScriptEvaluationResultHandler((size_t)data, result);
1184 void TizenWebEngineChromium::OnJavaScriptMessage(Evas_Object* o, Ewk_Script_Message message)
1186 auto plugin = WebEngineManager::Get().Find(o);
1189 auto pThis = static_cast<TizenWebEngineChromium*>(plugin);
1190 pThis->RunJavaScriptMessageHandler(message.name, static_cast<char*>(message.body));
1194 Eina_Bool TizenWebEngineChromium::OnJavaScriptAlert(Evas_Object* o, const char* alert_text, void* data)
1196 bool result = false;
1197 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1200 result = pThis->JavaScriptAlert(const_cast<char*>(alert_text));
1205 Eina_Bool TizenWebEngineChromium::OnJavaScriptConfirm(Evas_Object* o, const char* message, void* data)
1207 bool result = false;
1208 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1211 result = pThis->JavaScriptConfirm(const_cast<char*>(message));
1216 Eina_Bool TizenWebEngineChromium::OnJavaScriptPrompt(Evas_Object* o, const char* message, const char* default_value, void* data)
1218 bool result = false;
1219 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1222 result = pThis->JavaScriptPrompt(const_cast<char*>(message), const_cast<char*>(default_value));
1227 void TizenWebEngineChromium::OnHitTestCreated(Evas_Object*, int x, int y, int hitTestMode, Ewk_Hit_Test* hitTest, void* data)
1229 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1230 Evas* evas = ecore_evas_get(WebEngineManager::Get().GetWindow());
1231 std::unique_ptr<Dali::WebEngineHitTest> webHitTest(new TizenWebEngineHitTest(hitTest, evas, false));
1232 pThis->HitTestCreated(std::move(webHitTest));
1235 void TizenWebEngineChromium::OnScreenshotCaptured(Evas_Object* image, void* data)
1237 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1238 Dali::PixelData pixelData = ConvertImageColorSpace(image);
1239 pThis->ScreenshotCaptured(pixelData);
1242 void TizenWebEngineChromium::OnVideoPlaying(Evas_Object*, Eina_Bool isPlaying, void* data)
1244 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1245 pThis->VideoPlaying(isPlaying);
1248 void TizenWebEngineChromium::OnPlainTextReceived(Evas_Object* o, const char* plainText, void* data)
1250 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1251 std::string resultText;
1253 if (plainText != nullptr)
1255 resultText = std::string(plainText);
1258 pThis->PlainTextRecieved(resultText);
1261 Eina_Bool TizenWebEngineChromium::OnGeolocationPermission(Evas_Object*, Ewk_Geolocation_Permission_Request* request, void* data)
1263 auto pThis = static_cast<TizenWebEngineChromium*>(data);
1264 const Ewk_Security_Origin* securityOrigin = ewk_geolocation_permission_request_origin_get(request);
1265 std::string host = ewk_security_origin_host_get(securityOrigin);
1266 std::string protocol = ewk_security_origin_protocol_get(securityOrigin);
1267 return pThis->GeolocationPermission(host, protocol);
1270 void TizenWebEngineChromium::UpdateImage(tbm_surface_h buffer)
1277 mDaliImageSrc->SetSource(source);
1278 Dali::Stage::GetCurrent().KeepRendering(0.0f);
1279 mFrameRenderedSignal.Emit();
1282 void TizenWebEngineChromium::LoadStarted()
1284 DALI_LOG_RELEASE_INFO("#LoadStarted : %s\n", GetUrl().c_str());
1285 ExecuteCallback(mLoadStartedCallback, GetUrl());
1288 void TizenWebEngineChromium::LoadInProgress()
1290 DALI_LOG_RELEASE_INFO("#LoadInProgress : %s\n", GetUrl().c_str());
1291 ExecuteCallback(mLoadInProgressCallback, "");
1294 void TizenWebEngineChromium::LoadFinished()
1296 DALI_LOG_RELEASE_INFO("#LoadFinished : %s\n", GetUrl().c_str());
1297 ExecuteCallback(mLoadFinishedCallback, GetUrl());
1300 void TizenWebEngineChromium::LoadError(std::unique_ptr<Dali::WebEngineLoadError> error)
1302 DALI_LOG_RELEASE_INFO("#LoadError : %s\n", error->GetUrl().c_str());
1303 ExecuteCallback(mLoadErrorCallback, std::move(error));
1306 void TizenWebEngineChromium::ScrollEdgeReached(Dali::WebEnginePlugin::ScrollEdge edge)
1308 DALI_LOG_RELEASE_INFO("#ScrollEdgeReached : %d\n", edge);
1309 ExecuteCallback(mScrollEdgeReachedCallback, edge);
1312 void TizenWebEngineChromium::UrlChanged(const std::string& url)
1314 DALI_LOG_RELEASE_INFO("#UrlChanged : %s\n", url.c_str());
1315 ExecuteCallback(mUrlChangedCallback, url);
1318 void TizenWebEngineChromium::RequestFormRepostDecided(std::unique_ptr<Dali::WebEngineFormRepostDecision> decision)
1320 DALI_LOG_RELEASE_INFO("#FormRepostDecidedRequest\n");
1321 ExecuteCallback(mFormRepostDecidedCallback, std::move(decision));
1324 void TizenWebEngineChromium::ConsoleMessageReceived(std::unique_ptr<Dali::WebEngineConsoleMessage> message)
1326 DALI_LOG_RELEASE_INFO("#ConsoleMessageReceived : %s\n", message->GetSource().c_str());
1327 ExecuteCallback(mConsoleMessageReceivedCallback, std::move(message));
1330 void TizenWebEngineChromium::ResponsePolicyDecided(std::unique_ptr<Dali::WebEnginePolicyDecision> decision)
1332 DALI_LOG_RELEASE_INFO("#ResponsePolicyDecided.\n");
1333 ExecuteCallback(mResponsePolicyDecidedCallback, std::move(decision));
1336 void TizenWebEngineChromium::NavigationPolicyDecided(std::unique_ptr<Dali::WebEnginePolicyDecision> decision)
1338 DALI_LOG_RELEASE_INFO("#NavigationPolicyDecided.\n");
1339 ExecuteCallback(mNavigationPolicyDecidedCallback, std::move(decision));
1342 void TizenWebEngineChromium::CertificateConfirmed(std::unique_ptr<Dali::WebEngineCertificate> confirm)
1344 DALI_LOG_RELEASE_INFO("#CertificateConfirmed.\n");
1345 ExecuteCallback(mCertificateConfirmedCallback, std::move(confirm));
1348 void TizenWebEngineChromium::SslCertificateChanged(std::unique_ptr<Dali::WebEngineCertificate> info)
1350 DALI_LOG_RELEASE_INFO("#SslCertificateChanged.\n");
1351 ExecuteCallback(mSslCertificateChangedCallback, std::move(info));
1354 void TizenWebEngineChromium::AuthenticationChallenged(std::unique_ptr<Dali::WebEngineHttpAuthHandler> handler)
1356 DALI_LOG_RELEASE_INFO("#AuthenticationChallenged.\n");
1357 ExecuteCallback(mHttpAuthHandlerCallback, std::move(handler));
1360 void TizenWebEngineChromium::ContextMenuShown(std::unique_ptr<Dali::WebEngineContextMenu> menu)
1362 DALI_LOG_RELEASE_INFO("#ContextMenuShown.\n");
1363 ExecuteCallback(mContextMenuShownCallback, std::move(menu));
1366 void TizenWebEngineChromium::ContextMenuHidden(std::unique_ptr<Dali::WebEngineContextMenu> menu)
1368 DALI_LOG_RELEASE_INFO("#ContextMenuHidden.\n");
1369 ExecuteCallback(mContextMenuHiddenCallback, std::move(menu));
1372 } // namespace Plugin
1375 extern "C" DALI_EXPORT_API Dali::WebEnginePlugin* CreateWebEnginePlugin()
1377 return new Dali::Plugin::TizenWebEngineChromium();
1380 extern "C" DALI_EXPORT_API void DestroyWebEnginePlugin(Dali::WebEnginePlugin* plugin)