From 58a4432927bffadb30177dd0da32bc762d190c52 Mon Sep 17 00:00:00 2001 From: "ayush.k123" Date: Tue, 21 Feb 2023 14:40:32 +0530 Subject: [PATCH 01/16] [M108 Migration] Remove EWK_BRINGUP from ewk_settings.cc This patch removes EWK_BRINGUP and unused code from ewk_settings.cc. References: https://review.tizen.org/gerrit/280785/ Change-Id: I7950338a8fb06b8d07e82f991d81f72185227cec Signed-off-by: Ayush Kumar --- .../ewk/efl_integration/public/ewk_settings.cc | 112 ++------------------- 1 file changed, 9 insertions(+), 103 deletions(-) diff --git a/tizen_src/ewk/efl_integration/public/ewk_settings.cc b/tizen_src/ewk/efl_integration/public/ewk_settings.cc index ea62255..d406e3fd 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_settings.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_settings.cc @@ -40,18 +40,6 @@ void ewkUpdateWebkitPreferences(Evas_Object *ewkView) EWebView* impl = EWebView::FromEvasObject(ewkView); assert(impl); - bool autoSelectWord = ewk_settings_select_word_automatically_get(impl->GetSettings()); - // TODO(sns.park) : remove dependency to chromium internals - if(autoSelectWord){ -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - ui::GestureConfiguration::set_double_tap_to_zoom_enabled(false); -#endif - } - else{ -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - ui::GestureConfiguration::set_double_tap_to_zoom_enabled(true); -#endif - } impl->UpdateWebKitPreferences(); } @@ -59,26 +47,14 @@ void ewkUpdateWebkitPreferences(Evas_Object *ewkView) Eina_Bool ewk_settings_fullscreen_enabled_set(Ewk_Settings* settings, Eina_Bool enable) { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup -#pragma message "[M38] fullscreen_enabled flag has been deleted from webpreference.h" - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); - settings->getPreferences().fullscreen_enabled = enable; - ewkUpdateWebkitPreferences(settings->getEvasObject()); - return EINA_TRUE; -#else + LOG_EWK_API_MOCKUP("Not Supported by chromium"); return EINA_FALSE; -#endif } Eina_Bool ewk_settings_fullscreen_enabled_get(const Ewk_Settings* settings) { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup -#pragma message "[M38] fullscreen_enabled flag has been deleted from webpreference.h" - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); - return settings->getPreferences().fullscreen_enabled; -#else + LOG_EWK_API_MOCKUP("Not Supported by chromium"); return EINA_FALSE; -#endif } Eina_Bool ewk_settings_javascript_enabled_set(Ewk_Settings* settings, Eina_Bool enable) @@ -242,12 +218,8 @@ Eina_Bool ewk_settings_private_browsing_enabled_get(const Ewk_Settings* settings Eina_Bool ewk_settings_editable_link_behavior_set(Ewk_Settings* settings, Ewk_Editable_Link_Behavior behavior) { - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - settings->getPreferences().editable_link_behavior = static_cast(behavior); -#endif - ewkUpdateWebkitPreferences(settings->getEvasObject()); - return EINA_TRUE; + LOG_EWK_API_MOCKUP("Not Supported by chromium"); + return EINA_FALSE; } Eina_Bool ewk_settings_load_remote_images_set(Ewk_Settings* settings, Eina_Bool loadRemoteImages) @@ -335,9 +307,7 @@ Eina_Bool ewk_settings_link_effect_enabled_get(const Ewk_Settings* settings) Eina_Bool ewk_settings_uses_encoding_detector_set(Ewk_Settings* settings, Eina_Bool use) { EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup settings->getPreferences().uses_encoding_detector = use; -#endif ewkUpdateWebkitPreferences(settings->getEvasObject()); return EINA_TRUE; } @@ -345,11 +315,7 @@ Eina_Bool ewk_settings_uses_encoding_detector_set(Ewk_Settings* settings, Eina_B Eina_Bool ewk_settings_uses_encoding_detector_get(const Ewk_Settings* settings) { EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup return settings->getPreferences().uses_encoding_detector; -#else - return EINA_FALSE; -#endif } Eina_Bool ewk_settings_default_keypad_enabled_set(Ewk_Settings* settings, Eina_Bool enable) @@ -566,22 +532,14 @@ Eina_Bool ewk_settings_select_word_automatically_get(const Ewk_Settings* setting Ewk_List_Style_Position ewk_settings_initial_list_style_position_get(const Ewk_Settings* settings) { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, EWK_LIST_STYLE_POSITION_OUTSIDE); - return static_cast(settings->getPreferences().initial_list_style_position); -#else + LOG_EWK_API_MOCKUP("Not Supported by chromium"); return EWK_LIST_STYLE_POSITION_OUTSIDE; -#endif } Eina_Bool ewk_settings_initial_list_style_position_set(Ewk_Settings* settings, Ewk_List_Style_Position style) { - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, EINA_FALSE); -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - settings->getPreferences().initial_list_style_position = static_cast(style); -#endif - ewkUpdateWebkitPreferences(settings->getEvasObject()); - return EINA_TRUE; + LOG_EWK_API_MOCKUP("Not Supported by chromium"); + return EINA_FALSE; } Eina_Bool ewk_settings_webkit_text_size_adjust_enabled_set(Ewk_Settings* settings, Eina_Bool enabled) @@ -596,20 +554,13 @@ Eina_Bool ewk_settings_webkit_text_size_adjust_enabled_set(Ewk_Settings* setting // TODO: this API is gone in newer versions of webkit-efl void ewk_settings_detect_contents_automatically_set(Ewk_Settings* settings, Eina_Bool enable) { - EINA_SAFETY_ON_NULL_RETURN(settings); -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - settings->setDetectContentsEnabled(enable); -#endif + LOG_EWK_API_MOCKUP("Not Supported by chromium"); } Eina_Bool ewk_settings_detect_contents_automatically_get(const Ewk_Settings* settings) { - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - return settings->getDetectContentsEnabled(); -#else + LOG_EWK_API_MOCKUP("Not Supported by chromium"); return EINA_FALSE; -#endif } void ewk_settings_cache_builder_enabled_set(Ewk_Settings *settings, Eina_Bool enabled) @@ -671,51 +622,6 @@ Eina_Bool ewk_settings_encoding_detector_enabled_set(Ewk_Settings* settings, Ein return EINA_FALSE; } -namespace { -#define EXTRA_FEATURE_FUNCTIONS(VALNAME) \ - void Ewk_Extra_Feature_Set_ ## VALNAME(Ewk_Settings* settings, Eina_Bool value) \ - { \ - EINA_SAFETY_ON_NULL_RETURN(settings); \ - settings->set ## VALNAME ## Enabled(value == EINA_TRUE); \ - } \ - Eina_Bool Ewk_Extra_Feature_Get_ ## VALNAME(const Ewk_Settings* settings) \ - { \ - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, EINA_FALSE); \ - return settings->get ## VALNAME ## Enabled() ? EINA_TRUE : EINA_FALSE; \ - } - -#define EWK_EXTRA_FEATURE(NAME, VALNAME) {NAME, Ewk_Extra_Feature_Set_## VALNAME, Ewk_Extra_Feature_Get_ ## VALNAME} - - EXTRA_FEATURE_FUNCTIONS(LongPress) - EXTRA_FEATURE_FUNCTIONS(LinkMagnifier) - EXTRA_FEATURE_FUNCTIONS(DetectContents) - EXTRA_FEATURE_FUNCTIONS(WebLogin) - EXTRA_FEATURE_FUNCTIONS(DoubleTap) - EXTRA_FEATURE_FUNCTIONS(Zoom) - EXTRA_FEATURE_FUNCTIONS(OpenPanel) - EXTRA_FEATURE_FUNCTIONS(AllowRestrictedURL) - EXTRA_FEATURE_FUNCTIONS(URLBarHide) - - void Ewk_Extra_Feature_Set_ViewportQuirk(Ewk_Settings* settings, Eina_Bool value) - { - EINA_SAFETY_ON_NULL_RETURN(settings); -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - settings->getPreferences().viewport_meta_non_user_scalable_quirk = value; -#endif - ewkUpdateWebkitPreferences(settings->getEvasObject()); - } - - Eina_Bool Ewk_Extra_Feature_Get_ViewportQuirk(const Ewk_Settings* settings) - { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); - return settings->getPreferences().viewport_meta_non_user_scalable_quirk; -#else - return EINA_FALSE; -#endif - } -} - Eina_Bool ewk_settings_extra_feature_get(const Ewk_Settings* settings, const char* feature) { EINA_SAFETY_ON_NULL_RETURN_VAL(settings, EINA_FALSE); -- 2.7.4 From 348206f00fe6f075a97c3a3599fa63070c39b8f0 Mon Sep 17 00:00:00 2001 From: Venugopal S M Date: Mon, 20 Feb 2023 18:34:15 +0530 Subject: [PATCH 02/16] fixup! [MM] Implement MMPlayer(CAPI) path to support HBBTV. Notify the completion of playback(EOS) to the pipeline Reference: https://review.tizen.org/gerrit/288026 Change-Id: I74172a7d406d64b8c0868443acc02428ce040621 Signed-off-by: Sun-woo Nam --- tizen_src/chromium_impl/media/base/efl/media_player_manager_efl.h | 1 + tizen_src/chromium_impl/media/base/tizen/media_player_bridge_capi.cc | 1 + .../chromium_impl/media/filters/media_player_bridge_capi_adapter.cc | 4 ++++ .../chromium_impl/media/filters/media_player_bridge_capi_adapter.h | 1 + 4 files changed, 7 insertions(+) diff --git a/tizen_src/chromium_impl/media/base/efl/media_player_manager_efl.h b/tizen_src/chromium_impl/media/base/efl/media_player_manager_efl.h index b670084..90b05fc 100644 --- a/tizen_src/chromium_impl/media/base/efl/media_player_manager_efl.h +++ b/tizen_src/chromium_impl/media/base/efl/media_player_manager_efl.h @@ -25,6 +25,7 @@ class MEDIA_EXPORT MediaPlayerManager { virtual ~MediaPlayerManager() {} virtual MediaPlayerEfl* GetPlayer(int player_id) = 0; + virtual void OnEnded() = 0; virtual void OnTimeChanged(int player_id) = 0; virtual void OnTimeUpdate(int player_id, double current_time) = 0; virtual void OnRequestSeek(int player_id, double seek_time) = 0; diff --git a/tizen_src/chromium_impl/media/base/tizen/media_player_bridge_capi.cc b/tizen_src/chromium_impl/media/base/tizen/media_player_bridge_capi.cc index 9eefb6aa..4e37d58 100644 --- a/tizen_src/chromium_impl/media/base/tizen/media_player_bridge_capi.cc +++ b/tizen_src/chromium_impl/media/base/tizen/media_player_bridge_capi.cc @@ -597,6 +597,7 @@ void MediaPlayerBridgeCapi::PlaybackCompleteUpdate() { StopCurrentTimeUpdateTimer(); manager()->OnTimeUpdate(GetPlayerId(), GetCurrentTime()); manager()->OnTimeChanged(GetPlayerId()); + manager()->OnEnded(); } void MediaPlayerBridgeCapi::SeekCompleteUpdate() { diff --git a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.cc b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.cc index a4aa284..97f1fbe 100644 --- a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.cc +++ b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.cc @@ -114,6 +114,10 @@ MediaPlayerEfl* MediaPlayerBridgeCapiAdapter::GetPlayer(int player_id) { return media_player_; } +void MediaPlayerBridgeCapiAdapter::OnEnded() { + renderer_client_->OnEnded(); +} + void MediaPlayerBridgeCapiAdapter::OnTimeChanged(int player_id) {} void MediaPlayerBridgeCapiAdapter::OnTimeUpdate(int player_id, diff --git a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.h b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.h index 26df8d0..c93a172 100644 --- a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.h +++ b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.h @@ -69,6 +69,7 @@ class MEDIA_EXPORT MediaPlayerBridgeCapiAdapter : public MediaPlayerTizen, // MediaPlayerManager MediaPlayerEfl* GetPlayer(int player_id) override; + void OnEnded() override; void OnTimeChanged(int player_id) override; void OnTimeUpdate(int player_id, double current_time) override; void OnRequestSeek(int player_id, double seek_time) override; -- 2.7.4 From af9df69141def45bdfb8caf79219ffde03266f50 Mon Sep 17 00:00:00 2001 From: Bakka Uday Kiran Date: Fri, 10 Feb 2023 15:02:59 +0530 Subject: [PATCH 03/16] [M108 Migration] Bringup Drag and Drop (DnD) This patch brings up DnD feature to M108. Between M85 and M94, due to upstream refactoring, the DragEnter notification IPC call is done through mojom::blink::PageBroadcast (WebViewImpl). Reference: https://review.tizen.org/gerrit/c/278386 Change-Id: I9aeb92ad80485f28434065c3cd582e9468497991 Signed-off-by: Bakka Uday Kiran --- content/browser/web_contents/web_contents_impl.cc | 9 +++ content/browser/web_contents/web_contents_impl.h | 5 ++ .../browser/web_contents/web_contents_view_aura.cc | 20 +++++ content/public/browser/web_contents.h | 4 + content/test/test_page_broadcast.cc | 4 + content/test/test_page_broadcast.h | 5 ++ packaging/chromium-efl.spec | 4 + .../context_menu_data/context_menu_mojom_traits.cc | 5 ++ .../context_menu_params_builder.cc | 5 ++ .../untrustworthy_context_menu_params.cc | 5 ++ .../common/context_menu_data/context_menu_data.h | 5 ++ .../context_menu_data/context_menu_mojom_traits.h | 6 ++ .../untrustworthy_context_menu_params.h | 5 ++ third_party/blink/public/mojom/BUILD.gn | 5 ++ .../public/mojom/context_menu/context_menu.mojom | 4 + third_party/blink/public/mojom/page/page.mojom | 4 + third_party/blink/public/web/web_frame.h | 5 ++ .../blink/renderer/core/exported/web_view_impl.cc | 7 ++ .../blink/renderer/core/exported/web_view_impl.h | 3 + .../renderer/core/frame/web_local_frame_impl.cc | 5 ++ .../renderer/core/frame/web_local_frame_impl.h | 4 + .../blink/renderer/core/input/event_handler.cc | 6 ++ .../blink/renderer/core/input/event_handler.h | 4 + .../blink/renderer/core/input/gesture_manager.cc | 10 +++ .../blink/renderer/core/input/gesture_manager.h | 8 ++ .../renderer/core/input/mouse_event_manager.cc | 36 +++++++++ .../renderer/core/input/mouse_event_manager.h | 4 + .../renderer/core/page/context_menu_controller.cc | 3 + tizen_src/build/config/tizen_features.gni | 1 + .../web_contents_view_aura_helper_efl.cc | 16 +++- .../web_contents_view_aura_helper_efl.h | 3 + .../browser/web_contents/web_drag_dest_efl.cc | 88 ++++++++------------- .../browser/web_contents/web_drag_dest_efl.h | 8 +- .../browser/web_contents/web_drag_source_efl.cc | 66 ++++++++++++---- .../browser/web_contents/web_drag_source_efl.h | 7 +- tizen_src/chromium_impl/content/common/BUILD.gn | 1 + .../chromium_impl/content/common/paths_efl.cc | 13 +++ tizen_src/ewk/efl_integration/BUILD.gn | 6 ++ tizen_src/ewk/efl_integration/command_line_efl.cc | 3 + .../efl_integration/context_menu_controller_efl.cc | 29 ++++--- tizen_src/ewk/efl_integration/eweb_view.cc | 9 +++ tizen_src/ewk/efl_integration/eweb_view.h | 3 + .../resource/images/broken_image.png | Bin 0 -> 810 bytes 43 files changed, 345 insertions(+), 98 deletions(-) create mode 100644 tizen_src/ewk/efl_integration/resource/images/broken_image.png diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 9818f54..b8dbef7 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -4833,6 +4833,15 @@ void WebContentsImpl::SetHistoryOffsetAndLengthForView( broadcast->SetHistoryOffsetAndLength(history_offset, history_length); } +#if BUILDFLAG(IS_TIZEN) +void WebContentsImpl::EnterDragState(RenderViewHost* render_view_host) { + if (auto& broadcast = static_cast(render_view_host) + ->GetAssociatedPageBroadcast()) { + broadcast->EnterDragState(); + } +} +#endif + void WebContentsImpl::ReloadFocusedFrame() { OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::ReloadFocusedFrame"); RenderFrameHost* focused_frame = GetFocusedFrame(); diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index c9399b5..1c2f209 100755 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h @@ -1763,6 +1763,11 @@ class CONTENT_EXPORT WebContentsImpl : public WebContents, void LoadingStateChanged(bool should_show_loading_ui, LoadNotificationDetails* details); +#if BUILDFLAG(IS_TIZEN) + // Notifes the delegate to enter into drag state. + void EnterDragState(RenderViewHost* render_view_host); +#endif + // Misc non-view stuff ------------------------------------------------------- // Sets the history for a specified RenderViewHost to |history_length| diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc index f371758..0d13728 100644 --- a/content/browser/web_contents/web_contents_view_aura.cc +++ b/content/browser/web_contents/web_contents_view_aura.cc @@ -720,6 +720,8 @@ WebContentsViewAura::WebContentsViewAura( wcva_helper_ = std::make_unique( this, web_contents_, delegate_.get()); + if (wcva_helper_) + wcva_helper_->SetViewDelegate(delegate_.get()); #endif } @@ -1002,6 +1004,10 @@ void WebContentsViewAura::FocusThroughTabTraversal(bool reverse) { } DropData* WebContentsViewAura::GetDropData() const { +#if BUILDFLAG(IS_EFL) + if (wcva_helper()) + return wcva_helper()->GetDropData(); +#endif return current_drop_data_.get(); } @@ -1119,6 +1125,13 @@ RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForWidget( InstallOverscrollControllerDelegate(view); } +#if BUILDFLAG(IS_EFL) + if (wcva_helper()) { + RenderViewHost* render_view_host = web_contents_->GetRenderViewHost(); + wcva_helper()->UpdateDragDest(render_view_host); + } +#endif + return view; } @@ -1187,6 +1200,13 @@ void WebContentsViewAura::StartDragging( const gfx::Rect& drag_obj_rect, const blink::mojom::DragEventSourceInfo& event_info, RenderWidgetHostImpl* source_rwh) { +#if BUILDFLAG(IS_EFL) + if (wcva_helper()) { + wcva_helper()->StartDragging(drop_data, operations, image, cursor_offset, + event_info, source_rwh); + return; + } +#endif aura::Window* root_window = GetNativeView()->GetRootWindow(); if (!aura::client::GetDragDropClient(root_window)) { web_contents_->SystemDragEnded(source_rwh); diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h index 273d548..bbb8bca 100755 --- a/content/public/browser/web_contents.h +++ b/content/public/browser/web_contents.h @@ -921,6 +921,10 @@ class WebContents : public PageNavigator, // Returns the current drop data, if any. virtual DropData* GetDropData() = 0; +#if BUILDFLAG(IS_TIZEN) + virtual void EnterDragState(RenderViewHost* render_view_host) = 0; +#endif + // Sets focus to the native widget for this tab. virtual void Focus() = 0; diff --git a/content/test/test_page_broadcast.cc b/content/test/test_page_broadcast.cc index 57fad67..c74ac78 100644 --- a/content/test/test_page_broadcast.cc +++ b/content/test/test_page_broadcast.cc @@ -51,6 +51,10 @@ void TestPageBroadcast::ScrollFocusedNodeIntoView() {} void TestPageBroadcast::SetScrollOffset(float x, float y) {} #endif +#if BUILDFLAG(IS_TIZEN) +void TestPageBroadcast::EnterDragState() {} +#endif + void TestPageBroadcast::SetPageBaseBackgroundColor( absl::optional color) {} diff --git a/content/test/test_page_broadcast.h b/content/test/test_page_broadcast.h index c501cfc..2058bdc 100644 --- a/content/test/test_page_broadcast.h +++ b/content/test/test_page_broadcast.h @@ -37,6 +37,11 @@ class TestPageBroadcast : public blink::mojom::PageBroadcast { void ScrollFocusedNodeIntoView() override; void SetScrollOffset(float x, float y) override; #endif + +#if BUILDFLAG(IS_TIZEN) + void EnterDragState() override; +#endif + void SetPageBaseBackgroundColor(absl::optional color) override; void CreateRemoteMainFrame( const blink::RemoteFrameToken& token, diff --git a/packaging/chromium-efl.spec b/packaging/chromium-efl.spec index 04fa71a..e8e97a4 100644 --- a/packaging/chromium-efl.spec +++ b/packaging/chromium-efl.spec @@ -351,6 +351,7 @@ fi "is_tizen=true" \ "data_dir=\"%{CHROMIUM_DATA_DIR}\"" \ "edje_dir=\"%{CHROMIUM_DATA_DIR}/themes\"" \ + "image_dir=\"%{CHROMIUM_DATA_DIR}/images\"" \ "exe_dir=\"%{CHROMIUM_EXE_DIR}\"" \ "tizen_version=%{tizen_version}" \ "tizen_version_major=%{tizen_version_major}" \ @@ -455,6 +456,7 @@ install -d "%{buildroot}"%{_includedir}/v8 install -d "%{buildroot}%{CHROMIUM_EXE_DIR}" install -d "%{buildroot}%{CHROMIUM_EXE_DIR}"/locales install -d "%{buildroot}%{CHROMIUM_DATA_DIR}"/themes +install -d "%{buildroot}"%{CHROMIUM_DATA_DIR}/images install -d "%{buildroot}"%{_libdir}/../local/lib/ %if %{__use_clang} == 1 @@ -465,6 +467,7 @@ install -m 0755 "%{OUTPUT_FOLDER}"/icudtl.dat "%{buildroot}%{CHROMIUM_EXE_DIR install -m 0755 "%{OUTPUT_FOLDER}"/snapshot_blob.bin "%{buildroot}%{CHROMIUM_EXE_DIR}" install -m 0644 "%{OUTPUT_FOLDER}"/content_shell.pak "%{buildroot}%{CHROMIUM_EXE_DIR}" install -m 0644 "%{OUTPUT_FOLDER}"/resources/*.edj "%{buildroot}%{CHROMIUM_DATA_DIR}"/themes +install -m 0644 "%{OUTPUT_FOLDER}"/images/*.png "%{buildroot}%{CHROMIUM_DATA_DIR}"/images/ install -d "%{OUTPUT_FOLDER}"/packages install -d %{buildroot}%{_xmldir} @@ -651,6 +654,7 @@ setcap cap_mac_admin=eip %{_bindir}/wrt-service %{CHROMIUM_EXE_DIR}/content_shell.pak %{CHROMIUM_EXE_DIR}/locales/*.pak %{CHROMIUM_DATA_DIR}/themes/*.edj +%{CHROMIUM_DATA_DIR}/images/*.png %if %{__build_chrome} == 1 %{CHROMIUM_EXE_DIR}/chrome_100_percent.pak diff --git a/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc b/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc index a26b986..4a34262 100644 --- a/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc +++ b/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc @@ -62,6 +62,11 @@ bool StructTraitsis_text_node = data.is_text_node(); #endif + +#if BUILDFLAG(IS_TIZEN) + out->is_draggable = data.is_draggable(); +#endif + out->writing_direction_default = data.writing_direction_default(); out->writing_direction_left_to_right = data.writing_direction_left_to_right(); out->writing_direction_right_to_left = data.writing_direction_right_to_left(); diff --git a/third_party/blink/common/context_menu_data/context_menu_params_builder.cc b/third_party/blink/common/context_menu_data/context_menu_params_builder.cc index e257944..b9532c7 100644 --- a/third_party/blink/common/context_menu_data/context_menu_params_builder.cc +++ b/third_party/blink/common/context_menu_data/context_menu_params_builder.cc @@ -58,6 +58,11 @@ UntrustworthyContextMenuParams ContextMenuParamsBuilder::Build( #if BUILDFLAG(IS_EFL) params.is_text_node = data.is_text_node; #endif + +#if BUILDFLAG(IS_TIZEN) + params.is_draggable = data.is_draggable; +#endif + params.writing_direction_default = data.writing_direction_default; params.writing_direction_left_to_right = data.writing_direction_left_to_right; params.writing_direction_right_to_left = data.writing_direction_right_to_left; diff --git a/third_party/blink/common/context_menu_data/untrustworthy_context_menu_params.cc b/third_party/blink/common/context_menu_data/untrustworthy_context_menu_params.cc index 5ede70a..5e99669 100644 --- a/third_party/blink/common/context_menu_data/untrustworthy_context_menu_params.cc +++ b/third_party/blink/common/context_menu_data/untrustworthy_context_menu_params.cc @@ -65,6 +65,11 @@ void UntrustworthyContextMenuParams::Assign( #if BUILDFLAG(IS_EFL) is_text_node = other.is_text_node; #endif + +#if BUILDFLAG(IS_TIZEN) + is_draggable = other.is_draggable; +#endif + writing_direction_default = other.writing_direction_default; writing_direction_left_to_right = other.writing_direction_left_to_right; writing_direction_right_to_left = other.writing_direction_right_to_left; diff --git a/third_party/blink/public/common/context_menu_data/context_menu_data.h b/third_party/blink/public/common/context_menu_data/context_menu_data.h index 611b3a8..0168924 100644 --- a/third_party/blink/public/common/context_menu_data/context_menu_data.h +++ b/third_party/blink/public/common/context_menu_data/context_menu_data.h @@ -121,6 +121,11 @@ struct ContextMenuData { bool is_text_node; #endif +#if BUILDFLAG(IS_TIZEN) + // Whether element is draggable. + bool is_draggable; +#endif + // If this node is an input field, the type of that field. blink::mojom::ContextMenuDataInputFieldType input_field_type; diff --git a/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h b/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h index 40c94c4..3fc5f80 100644 --- a/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h +++ b/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h @@ -121,6 +121,12 @@ struct BLINK_COMMON_EXPORT } #endif +#if BUILDFLAG(IS_TIZEN) + static bool is_draggable(const blink::UntrustworthyContextMenuParams& r) { + return r.is_draggable; + } +#endif + static int writing_direction_default( const blink::UntrustworthyContextMenuParams& r) { return r.writing_direction_default; diff --git a/third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h b/third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h index 99a5b3a..d1676b0 100644 --- a/third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h +++ b/third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h @@ -108,6 +108,11 @@ struct BLINK_COMMON_EXPORT UntrustworthyContextMenuParams { bool is_text_node; #endif +#if BUILDFLAG(IS_TIZEN) + // Whether element is draggable. + bool is_draggable; +#endif + // Writing direction menu items. int writing_direction_default; int writing_direction_left_to_right; diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index da550e3..3d36e4a 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn @@ -1114,6 +1114,11 @@ mojom("mojom_core") { ] enabled_features = [] + + if (is_tizen) { + enabled_features += [ "is_tizen" ] + } + if (use_efl) { enabled_features += [ "is_efl" ] } diff --git a/third_party/blink/public/mojom/context_menu/context_menu.mojom b/third_party/blink/public/mojom/context_menu/context_menu.mojom index 0aaa56f..60259f1 100644 --- a/third_party/blink/public/mojom/context_menu/context_menu.mojom +++ b/third_party/blink/public/mojom/context_menu/context_menu.mojom @@ -171,6 +171,10 @@ struct UntrustworthyContextMenuParams { [EnableIf=is_efl] bool is_text_node; + // Whether element is draggable + [EnableIf=is_tizen] + bool is_draggable; + // Writing direction menu items. int32 writing_direction_default; int32 writing_direction_left_to_right; diff --git a/third_party/blink/public/mojom/page/page.mojom b/third_party/blink/public/mojom/page/page.mojom index d48ab58..d8e81cc 100644 --- a/third_party/blink/public/mojom/page/page.mojom +++ b/third_party/blink/public/mojom/page/page.mojom @@ -110,6 +110,10 @@ interface PageBroadcast { [EnableIf=is_efl] SetScrollOffset(float x, float y); + // Notifies webivew to enter into drag state. + [EnableIf=is_tizen] + EnterDragState(); + // Sent to whole page, but should only be used by the main frame. SetPageBaseBackgroundColor(skia.mojom.SkColor? color); diff --git a/third_party/blink/public/web/web_frame.h b/third_party/blink/public/web/web_frame.h index b88fb1a..4c4121f 100644 --- a/third_party/blink/public/web/web_frame.h +++ b/third_party/blink/public/web/web_frame.h @@ -192,6 +192,11 @@ class BLINK_EXPORT WebFrame { // RemoteFrame <--> RenderFrameProxyHost in the browser process. const FrameToken& GetFrameToken() const { return frame_token_; } +#if BUILDFLAG(IS_TIZEN) + // Enters web drag and drop state. + virtual void EnterDragState() {} +#endif + #if INSIDE_BLINK static WebFrame* FromCoreFrame(Frame*); static Frame* ToCoreFrame(const WebFrame&); diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc index 06b1fac..3f64b57 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc @@ -3550,6 +3550,13 @@ void WebViewImpl::UpdateWebPreferences( ApplyCommandLineToSettings(SettingsImpl()); } +#if BUILDFLAG(IS_TIZEN) +void WebViewImpl::EnterDragState() { + if (MainFrameImpl()) + MainFrameImpl()->EnterDragState(); +} +#endif + void WebViewImpl::AddObserver(WebViewObserver* observer) { observers_.AddObserver(observer); } diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h index f4a0b57..e0947c1 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.h +++ b/third_party/blink/renderer/core/exported/web_view_impl.h @@ -309,6 +309,9 @@ class CORE_EXPORT WebViewImpl final : public WebView, const RendererPreferences& preferences) override; void SetHistoryOffsetAndLength(int32_t history_offset, int32_t history_length) override; +#if BUILDFLAG(IS_TIZEN) + void EnterDragState() override; +#endif void SetPageBaseBackgroundColor(absl::optional color) override; void CreateRemoteMainFrame( const RemoteFrameToken& frame_token, diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc index 5e4f00b..c041fe2 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc @@ -1729,6 +1729,11 @@ gfx::Size WebLocalFrameImpl::ScrollableContentSize() const { ToPixelSnappedRect(GetFrameView()->GetLayoutView()->DocumentRect()) .size()); } + +void WebLocalFrameImpl::EnterDragState() { + if (GetFrame()) + GetFrame()->GetEventHandler().EnterDragState(); +} #endif void WebLocalFrameImpl::DeleteSurroundingTextInCodePoints(int before, diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h index 6031575..b226256 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h @@ -367,6 +367,10 @@ class CORE_EXPORT WebLocalFrameImpl final gfx::Size ScrollableContentSize() const override; #endif +#if BUILDFLAG(IS_TIZEN) + void EnterDragState() override; +#endif + // WebNavigationControl overrides: bool DispatchBeforeUnloadEvent(bool) override; void CommitNavigation( diff --git a/third_party/blink/renderer/core/input/event_handler.cc b/third_party/blink/renderer/core/input/event_handler.cc index 825d76e..d451ade 100644 --- a/third_party/blink/renderer/core/input/event_handler.cc +++ b/third_party/blink/renderer/core/input/event_handler.cc @@ -1388,6 +1388,12 @@ WebInputEventResult EventHandler::PerformDragAndDrop( return result; } +#if BUILDFLAG(IS_TIZEN) +void EventHandler::EnterDragState() { + gesture_manager_->EnterDragState(); +} +#endif + void EventHandler::ClearDragState() { scroll_manager_->StopAutoscroll(); drag_target_ = nullptr; diff --git a/third_party/blink/renderer/core/input/event_handler.h b/third_party/blink/renderer/core/input/event_handler.h index 325d6a7..6f7855e 100644 --- a/third_party/blink/renderer/core/input/event_handler.h +++ b/third_party/blink/renderer/core/input/event_handler.h @@ -261,6 +261,10 @@ class CORE_EXPORT EventHandler final : public GarbageCollected { void ContextMenuEventForWordOrLinkSelection(const WebGestureEvent&); #endif +#if BUILDFLAG(IS_TIZEN) + void EnterDragState(); +#endif + // Clears drag target and related states. It is called when drag is done or // canceled. void ClearDragState(); diff --git a/third_party/blink/renderer/core/input/gesture_manager.cc b/third_party/blink/renderer/core/input/gesture_manager.cc index dd71c13b..5c38e9a8 100644 --- a/third_party/blink/renderer/core/input/gesture_manager.cc +++ b/third_party/blink/renderer/core/input/gesture_manager.cc @@ -183,6 +183,12 @@ bool GestureManager::GestureContextMenuDeferred() const { return gesture_context_menu_deferred_; } +#if BUILDFLAG(IS_TIZEN) +void GestureManager::EnterDragState() { + mouse_event_manager_->EnterDragState(last_gesture_event_); +} +#endif + WebInputEventResult GestureManager::HandleGestureTapDown( const GestureEventWithHitTestResults& targeted_event) { suppress_mouse_events_from_gestures_ = @@ -398,6 +404,10 @@ WebInputEventResult GestureManager::HandleGestureLongPress( const GestureEventWithHitTestResults& targeted_event) { const WebGestureEvent& gesture_event = targeted_event.Event(); +#if BUILDFLAG(IS_TIZEN) + last_gesture_event_ = gesture_event; +#endif + // FIXME: Ideally we should try to remove the extra mouse-specific hit-tests // here (re-using the supplied HitTestResult), but that will require some // overhaul of the touch drag-and-drop code and LongPress is such a special diff --git a/third_party/blink/renderer/core/input/gesture_manager.h b/third_party/blink/renderer/core/input/gesture_manager.h index 2553a4a..3a4c62b 100644 --- a/third_party/blink/renderer/core/input/gesture_manager.h +++ b/third_party/blink/renderer/core/input/gesture_manager.h @@ -68,6 +68,10 @@ class CORE_EXPORT GestureManager final // This must be called from local root frame. void NotifyPointerEventHandled(const WebPointerEvent& web_pointer_event); +#if BUILDFLAG(IS_TIZEN) + void EnterDragState(); +#endif + private: WebInputEventResult HandleGestureShowPress(); WebInputEventResult HandleGestureTapDown( @@ -114,6 +118,10 @@ class CORE_EXPORT GestureManager final Member mouse_event_manager_; Member pointer_event_manager_; +#if BUILDFLAG(IS_TIZEN) + WebGestureEvent last_gesture_event_; +#endif + // Set on GestureTapDown if the |pointerdown| event corresponding to the // triggering |touchstart| event was canceled. This suppresses mouse event // firing for the current gesture sequence (i.e. until next GestureTapDown). diff --git a/third_party/blink/renderer/core/input/mouse_event_manager.cc b/third_party/blink/renderer/core/input/mouse_event_manager.cc index e8cce48..18cc985 100644 --- a/third_party/blink/renderer/core/input/mouse_event_manager.cc +++ b/third_party/blink/renderer/core/input/mouse_event_manager.cc @@ -58,6 +58,10 @@ #include "ui/gfx/geometry/point_conversions.h" #include "ui/gfx/geometry/quad_f.h" +#if BUILDFLAG(IS_TIZEN) +#include "tizen/system_info.h" +#endif + namespace blink { namespace { @@ -745,6 +749,10 @@ void MouseEventManager::UpdateSelectionForMouseDrag() { bool MouseEventManager::HandleDragDropIfPossible( const GestureEventWithHitTestResults& targeted_event) { +#if BUILDFLAG(IS_TIZEN) + if (IsMobileProfile()) + return false; +#endif const WebGestureEvent& gesture_event = targeted_event.Event(); unsigned modifiers = gesture_event.GetModifiers(); @@ -772,6 +780,34 @@ bool MouseEventManager::HandleDragDropIfPossible( return HandleDrag(mev, DragInitiator::kTouch); } +#if BUILDFLAG(IS_TIZEN) +void MouseEventManager::EnterDragState( + const WebGestureEvent& last_gesture_event) { + if (frame_->GetSettings() && + frame_->GetSettings()->GetTouchDragDropEnabled() && frame_->View()) { + mouse_down_ = WebMouseEvent( + WebInputEvent::Type::kMouseDown, last_gesture_event, + WebPointerProperties::Button::kLeft, 1, + WebInputEvent::Modifiers::kLeftButtonDown, base::TimeTicks::Now()); + + WebMouseEvent mouse_drag_event( + WebInputEvent::Type::kMouseMove, last_gesture_event, + WebPointerProperties::Button::kLeft, 1, + WebInputEvent::Modifiers::kLeftButtonDown, base::TimeTicks::Now()); + + HitTestRequest request(HitTestRequest::kReadOnly); + MouseEventWithHitTestResults mev = + event_handling_util::PerformMouseEventHitTest(frame_, request, + mouse_drag_event); + mouse_down_may_start_drag_ = true; + ResetDragSource(); + mouse_down_pos_ = frame_->View()->ConvertFromRootFrame( + gfx::ToFlooredPoint(mouse_drag_event.PositionInRootFrame())); + HandleDrag(mev, DragInitiator::kTouch); + } +} +#endif + void MouseEventManager::FocusDocumentView() { Page* page = frame_->GetPage(); if (!page) diff --git a/third_party/blink/renderer/core/input/mouse_event_manager.h b/third_party/blink/renderer/core/input/mouse_event_manager.h index bfd4d72..e153cfe 100644 --- a/third_party/blink/renderer/core/input/mouse_event_manager.h +++ b/third_party/blink/renderer/core/input/mouse_event_manager.h @@ -101,6 +101,10 @@ class CORE_EXPORT MouseEventManager final DragState& GetDragState(); +#if BUILDFLAG(IS_TIZEN) + void EnterDragState(const WebGestureEvent&); +#endif + void FocusDocumentView(); // Resets the state that indicates the next events could cause a drag. It is diff --git a/third_party/blink/renderer/core/page/context_menu_controller.cc b/third_party/blink/renderer/core/page/context_menu_controller.cc index 27ec0bfb..854831a 100644 --- a/third_party/blink/renderer/core/page/context_menu_controller.cc +++ b/third_party/blink/renderer/core/page/context_menu_controller.cc @@ -508,6 +508,9 @@ bool ContextMenuController::ShowContextMenu(LocalFrame* frame, auto* html_element = DynamicTo(result.InnerNode()); if (html_element) { +#if BUILDFLAG(IS_TIZEN) + data.is_draggable = html_element->draggable(); +#endif data.title_text = html_element->title().Utf8(); data.alt_text = html_element->AltText().Utf8(); } diff --git a/tizen_src/build/config/tizen_features.gni b/tizen_src/build/config/tizen_features.gni index 3b91599..47b30e0 100644 --- a/tizen_src/build/config/tizen_features.gni +++ b/tizen_src/build/config/tizen_features.gni @@ -38,6 +38,7 @@ declare_args() { edje_dir = "/usr/share/chromium-efl/themes/" tizen_data_dir = "/usr/share/chromium-efl/" locale_dir = "/usr/share/chromium-efl/locale/" + image_dir = "/usr/share/chromium-efl/images/" chromium_impl_lib_name = "libchromium-ewk.so" tizen_version = 0 diff --git a/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.cc b/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.cc index 8b2ea46..30584d7 100644 --- a/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.cc +++ b/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.cc @@ -99,8 +99,10 @@ void WebContentsViewAuraHelperEfl::StartDragging( const blink::mojom::DragEventSourceInfo& event_info, RenderWidgetHostImpl* source_rwh) { if (drag_dest_) { - drag_dest_->SetDropData(drop_data); - drag_dest_->SetAction(allowed_ops); + if (drag_dest_.get()) { + drag_dest_->SetDropData(drop_data); + drag_dest_->SetAction(allowed_ops); + } } if (!drag_source_) { @@ -109,14 +111,15 @@ void WebContentsViewAuraHelperEfl::StartDragging( } if (!drag_source_->StartDragging(drop_data, allowed_ops, event_info.location, - *image.bitmap(), image_offset)) { + *image.bitmap(), image_offset, source_rwh)) { web_contents_->SystemDragEnded(source_rwh); } } DropData* WebContentsViewAuraHelperEfl::GetDropData() const { if (drag_dest_) - return drag_dest_->GetDropData(); + if (drag_dest_.get()) + return drag_dest_->GetDropData(); return nullptr; } @@ -175,4 +178,9 @@ void WebContentsViewAuraHelperEfl::OnOverscrolled( } } +void WebContentsViewAuraHelperEfl::SetViewDelegate( + WebContentsViewDelegate* delegate) { + delegate = view_delegate_; +} + } // namespace content diff --git a/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.h b/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.h index a732c19..3639625 100644 --- a/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.h +++ b/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.h @@ -17,6 +17,8 @@ #include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/common/page/drag_operation.h" #include "third_party/blink/public/mojom/choosers/popup_menu.mojom.h" +#include "third_party/blink/public/mojom/drag/drag.mojom.h" +#include "tizen_src/chromium_impl/content/public/browser/web_contents_efl_delegate.h" #include "ui/gfx/image/image_skia.h" namespace content { @@ -58,6 +60,7 @@ class CONTENT_EXPORT WebContentsViewAuraHelperEfl { void SetEflDelegate(WebContentsEflDelegate*); WebContentsEflDelegate* GetEflDelegate(); + void SetViewDelegate(WebContentsViewDelegate* delegate); void UpdateDragDest(RenderViewHost* host); void StartDragging(const DropData& drop_data, blink::DragOperationsMask allowed_ops, diff --git a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.cc b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.cc index 75dc051..79d920c 100644 --- a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.cc +++ b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.cc @@ -7,8 +7,9 @@ #include "build/tizen_version.h" #include "content/browser/web_contents/web_contents_impl.h" -#include "content/public/browser/web_drag_dest_delegate.h" #include "content/public/browser/render_view_host.h" +#include "content/public/browser/render_widget_host.h" +#include "content/public/browser/web_drag_dest_delegate.h" #include "ui/display/screen.h" namespace content { @@ -42,14 +43,12 @@ WebDragDestEfl::WebDragDestEfl(WebContents* web_contents) delegate_(nullptr), web_contents_(web_contents), page_scale_factor_(1.0f), + drag_action_(blink::kDragOperationNone), drag_initialized_(false) { -#if defined(USE_AURA) - parent_view_ = nullptr; -#else - parent_view_ = static_cast(web_contents->GetNativeView()); -#endif device_scale_factor_ = display::Screen::GetScreen()-> GetPrimaryDisplay().device_scale_factor(); + parent_view_ = + static_cast(web_contents)->GetEflNativeView(); SetDragCallbacks(); } @@ -85,32 +84,25 @@ void WebDragDestEfl::DragStateEnter() { } void WebDragDestEfl::DragStateLeave() { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - // FIXME: EWK_BRINGUP definition should be removed. - GetRenderViewHost()->DragTargetDragLeave(); -#endif // !defined(EWK_BRINGUP) if (delegate_) delegate_->OnDragLeave(); } void WebDragDestEfl::DragPos( Evas_Coord x, Evas_Coord y, Elm_Xdnd_Action action) { - gfx::Point screen_pt = gfx::Point(x / device_scale_factor_, - y / device_scale_factor_); + if (!drop_data_) + return; + + auto screen_pt = + gfx::PointF(x / device_scale_factor_, y / device_scale_factor_); last_pointer_pos_ = screen_pt; - gfx::Point client_pt = gfx::Point(screen_pt.x() / page_scale_factor_, - screen_pt.y() / page_scale_factor_); + auto client_pt = gfx::PointF(screen_pt.x() / page_scale_factor_, + screen_pt.y() / page_scale_factor_); if (!drag_initialized_) { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - // FIXME: EWK_BRINGUP definition should be removed. - GetRenderViewHost()->DragTargetDragEnter( - *drop_data_, - client_pt, - screen_pt, - drag_action_, - modifier_flags_); -#endif // !defined(EWK_BRINGUP) + GetRenderWidgetHost()->DragTargetDragEnter( + *drop_data_, client_pt, screen_pt, drag_action_, modifier_flags_, + base::DoNothing()); if (delegate_) delegate_->OnDragEnter(); @@ -118,14 +110,8 @@ void WebDragDestEfl::DragPos( drag_initialized_ = true; } -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - // FIXME: EWK_BRINGUP definition should be removed. - GetRenderViewHost()->DragTargetDragOver( - client_pt, - screen_pt, - drag_action_, - modifier_flags_); -#endif // !defined(EWK_BRINGUP) + GetRenderWidgetHost()->DragTargetDragOver(client_pt, screen_pt, drag_action_, + modifier_flags_, base::DoNothing()); if (!delegate_) return; @@ -133,41 +119,31 @@ void WebDragDestEfl::DragPos( } Eina_Bool WebDragDestEfl::DragDrop(Elm_Selection_Data* data) { - gfx::Point client_pt = - gfx::Point(last_pointer_pos_.x() / page_scale_factor_, - last_pointer_pos_.y() / page_scale_factor_); - -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - // FIXME: EWK_BRINGUP definition should be removed. - GetRenderViewHost()->FilterDropData(drop_data_.get()); - GetRenderViewHost()->DragTargetDrop( - *drop_data_, - client_pt, - last_pointer_pos_, - modifier_flags_); -#endif // !defined(EWK_BRINGUP) + if (!drag_initialized_) + return EINA_FALSE; + + auto client_pt = gfx::PointF(last_pointer_pos_.x() / page_scale_factor_, + last_pointer_pos_.y() / page_scale_factor_); + + GetRenderWidgetHost()->FilterDropData(drop_data_.get()); + GetRenderWidgetHost()->DragTargetDrop(*drop_data_, client_pt, + last_pointer_pos_, modifier_flags_, + base::DoNothing()); if (delegate_) delegate_->OnDrop(); drag_initialized_ = false; -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - // FIXME: EWK_BRINGUP definition should be removed. - // Invoking via message loop to not mess around with target - // from within one of its callbacks. - base::MessageLoop::current()->PostTask( + + base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(&WebDragDestEfl::ResetDragCallbacks, base::Unretained(this))); -#endif // !defined(EWK_BRINGUP) return EINA_TRUE; } void WebDragDestEfl::DragLeave() { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - // FIXME: EWK_BRINGUP definition should be removed. - GetRenderViewHost()->DragTargetDragLeave(); -#endif // !defined(EWK_BRINGUP) + GetRenderWidgetHost()->DragTargetDragLeave(gfx::PointF(), gfx::PointF()); if (delegate_) delegate_->OnDragLeave(); @@ -182,8 +158,8 @@ void WebDragDestEfl::SetPageScaleFactor(float scale) { page_scale_factor_ = scale; } -RenderViewHost* WebDragDestEfl::GetRenderViewHost() const { - return web_contents_->GetRenderViewHost(); +RenderWidgetHost* WebDragDestEfl::GetRenderWidgetHost() const { + return web_contents_->GetRenderViewHost()->GetWidget(); } } // namespace content diff --git a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.h b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.h index 26efada..05e0714 100644 --- a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.h +++ b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.h @@ -10,13 +10,13 @@ #include "content/public/common/drop_data.h" #include "third_party/blink/public/common/page/drag_operation.h" -#include "ui/gfx/geometry/point.h" +#include "ui/gfx/geometry/point_f.h" namespace content { class WebContents; class WebDragDestDelegate; -class RenderViewHost; +class RenderWidgetHost; class WebDragDestEfl { public: @@ -29,7 +29,7 @@ class WebDragDestEfl { blink::DragOperationsMask GetAction() { return drag_action_; } WebDragDestDelegate* GetDelegate() const { return delegate_; } DropData* GetDropData() { return drop_data_.get(); } - RenderViewHost* GetRenderViewHost() const; + RenderWidgetHost* GetRenderWidgetHost() const; WebContents* GetWebContents() { return web_contents_; } void ResetDropData() { drop_data_.reset(); } @@ -70,7 +70,7 @@ class WebDragDestEfl { float device_scale_factor_; float page_scale_factor_; - gfx::Point last_pointer_pos_; + gfx::PointF last_pointer_pos_; bool drag_initialized_; diff --git a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.cc b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.cc index 0e3182c..6bad9c0 100644 --- a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.cc +++ b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.cc @@ -4,9 +4,13 @@ #include "content/browser/web_contents/web_drag_source_efl.h" +#include "base/files/file_path.h" +#include "base/path_service.h" +#include "base/strings/utf_string_conversions.h" #include "content/browser/download/drag_download_util.h" #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/browser/web_contents/web_contents_impl.h" +#include "content/common/paths_efl.h" #include "content/public/common/drop_data.h" #include "third_party/skia/include/core/SkPixelRef.h" #include "ui/base/dragdrop/drag_drop_types.h" @@ -23,6 +27,10 @@ namespace content { namespace { +const char* const kDefaultDragIcon = "broken_image.png"; +const int kDefaultDragIconWidth = 105; +const int kDefaultDragIconHeight = 120; + DragOperation GetDragOperationFromMask(blink::DragOperationsMask operations) { if (operations & ui::DragDropTypes::DRAG_COPY) return DragOperation::kCopy; @@ -61,12 +69,13 @@ void DragStateCb(void* data, Evas_Object* obj) { WebDragSourceEfl::WebDragSourceEfl(WebContents* web_contents) : web_contents_(static_cast(web_contents)), + source_rwh_(nullptr), drag_failed_(false), drag_started_(false), + drag_action_(blink::kDragOperationNone), page_scale_factor_(1.0f) { -#if !defined(USE_AURA) - parent_view_ = static_cast(web_contents->GetNativeView()); -#endif + parent_view_ = + static_cast(web_contents)->GetEflNativeView(); device_scale_factor_ = display::Screen::GetScreen()->GetPrimaryDisplay().device_scale_factor(); } @@ -77,38 +86,54 @@ bool WebDragSourceEfl::StartDragging(const DropData& drop_data, blink::DragOperationsMask allowed_ops, const gfx::Point& root_location, const SkBitmap& image, - const gfx::Vector2d& image_offset) { + const gfx::Vector2d& image_offset, + RenderWidgetHostImpl* source_rwh) { // Guard against re-starting before previous drag completed. if (drag_started_) { NOTREACHED(); return false; } + std::u16string elm_drag_data; int targets_mask = 0; - drop_data_.reset(new DropData(drop_data)); initial_position_ = root_location; - if (drop_data.text && !drop_data.text->empty()) + if (drop_data.text && !drop_data.text->empty()) { + elm_drag_data = *drop_data.text; targets_mask |= ELM_SEL_FORMAT_TEXT; - if (drop_data.url.is_valid()) + } + if (drop_data.url.is_valid()) { + elm_drag_data = base::UTF8ToUTF16(drop_data.url.spec()); targets_mask |= ELM_SEL_FORMAT_TEXT; - if (drop_data.html && !drop_data.html->empty()) + } + if (drop_data.html && !drop_data.html->empty()) { + elm_drag_data = *drop_data.html; targets_mask |= ELM_SEL_FORMAT_HTML; + } if (!drop_data.file_contents.empty()) { + GURL parsed_url; #if defined(ENABLE_WRT_JS) && !defined(WRT_JS_BRINGUP) - GURL parsed_url = wrt::ParseURL(drop_data.file_contents_source_url); + parsed_url = wrt::ParseURL(drop_data.file_contents_source_url); if ((parsed_url.is_valid() && !parsed_url.IsAboutBlank())) drop_data_.file_contents_source_url = parsed_url; #endif + elm_drag_data = + (parsed_url.is_valid() && !parsed_url.IsAboutBlank()) + ? base::UTF8ToUTF16(parsed_url.spec()) + : base::UTF8ToUTF16(drop_data.file_contents_source_url.spec()); targets_mask |= ELM_SEL_FORMAT_IMAGE; } if (!drop_data.download_metadata.empty() && ParseDownloadMetadata(drop_data.download_metadata, &wide_download_mime_type_, &download_file_name_, - &download_url_)) + &download_url_)) { + elm_drag_data = drop_data.download_metadata; targets_mask |= ELM_SEL_FORMAT_IMAGE; - if (!drop_data.custom_data.empty()) + } + if (!drop_data.custom_data.empty()) { + elm_drag_data = drop_data.custom_data.begin()->first; targets_mask |= ELM_SEL_FORMAT_NONE; + } int action = 0; @@ -125,10 +150,11 @@ bool WebDragSourceEfl::StartDragging(const DropData& drop_data, image_offset_ = image_offset; drag_action_ = allowed_ops; drag_failed_ = false; + source_rwh_ = source_rwh; drag_started_ = elm_drag_start( parent_view_, static_cast(targets_mask), - reinterpret_cast(drop_data_.get()), + base::UTF16ToUTF8(elm_drag_data).c_str(), static_cast(action), DragIconCreateCb, this, DragPosCb, this, DragAcceptCb, this, DragStateCb, this); @@ -137,7 +163,6 @@ bool WebDragSourceEfl::StartDragging(const DropData& drop_data, if (!drag_started_) { LOG(WARNING) << "Failed to start drag and drop"; drag_failed_ = true; - drop_data_.reset(); return false; } @@ -155,13 +180,22 @@ Evas_Object* WebDragSourceEfl::DragIconCreate(Evas_Object* win, *yoff = initial_position_.y(); Evas* evas = evas_object_evas_get(win); Evas_Object* icon = evas_object_image_add(evas); - evas_object_image_size_set(icon, w, h); + if (w > 0 && h > 0) { + evas_object_image_size_set(icon, w, h); + evas_object_image_data_copy_set(icon, image_.pixelRef()->pixels()); + } else { + w = kDefaultDragIconWidth; + h = kDefaultDragIconHeight; + base::FilePath path; + base::PathService::Get(PathsEfl::IMAGE_RESOURCE_DIR, &path); + path = path.Append(FILE_PATH_LITERAL(kDefaultDragIcon)); + evas_object_image_file_set(icon, path.AsUTF8Unsafe().c_str(), nullptr); + } + evas_object_image_fill_set(icon, 0, 0, w, h); evas_object_image_alpha_set(icon, EINA_TRUE); - evas_object_image_data_copy_set(icon, image_.pixelRef()->pixels()); evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_move(icon, initial_position_.x(), initial_position_.y()); - evas_object_image_fill_set(icon, 0, 0, w, h); evas_object_resize(icon, w, h); evas_object_show(icon); diff --git a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.h b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.h index da355cb..99eb872 100644 --- a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.h +++ b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.h @@ -39,7 +39,8 @@ class WebDragSourceEfl { blink::DragOperationsMask allowed_ops, const gfx::Point& root_location, const SkBitmap& image, - const gfx::Vector2d& image_offset); + const gfx::Vector2d& image_offset, + RenderWidgetHostImpl* source_rwh); void Reset() { drag_started_ = false; } void SetLastPoint(gfx::Point point) { last_point_ = point; } @@ -62,10 +63,6 @@ class WebDragSourceEfl { // Browser side IPC handler. RenderWidgetHostImpl* source_rwh_; - // The drop data for the current drag (for drags that originate in the render - // view). Non-NULL iff there is a current drag. - std::unique_ptr drop_data_; - // The image used for depicting the drag, and the offset between the cursor // and the top left pixel. SkBitmap image_; diff --git a/tizen_src/chromium_impl/content/common/BUILD.gn b/tizen_src/chromium_impl/content/common/BUILD.gn index d1ffc54..85a125f 100644 --- a/tizen_src/chromium_impl/content/common/BUILD.gn +++ b/tizen_src/chromium_impl/content/common/BUILD.gn @@ -24,6 +24,7 @@ config("content_common_efl") { outdir = rebase_path("$root_out_dir") defines += [ "EDJE_DIR=\"$outdir/resources\"", + "IMAGE_DIR=\"$image_dir\"", "LOCALE_DIR=\"$outdir/locale\"", ] } diff --git a/tizen_src/chromium_impl/content/common/paths_efl.cc b/tizen_src/chromium_impl/content/common/paths_efl.cc index 174e2b1..7f1f716 100644 --- a/tizen_src/chromium_impl/content/common/paths_efl.cc +++ b/tizen_src/chromium_impl/content/common/paths_efl.cc @@ -32,6 +32,9 @@ const base::FilePath::CharType kApplicationCacheDir[] = FILE_PATH_LITERAL("cache const base::FilePath::CharType kChromiumLibPath[] = FILE_PATH_LITERAL("lib/" CHROMIUM_IMPL_LIB_FILE); const base::FilePath::CharType kNotificationIconDir[] = FILE_PATH_LITERAL("noti"); +const base::FilePath::CharType kImageDir[] = FILE_PATH_LITERAL("images"); +#else +const base::FilePath::CharType kImagePath[] = FILE_PATH_LITERAL(IMAGE_DIR); #endif #if !defined(EWK_BRINGUP) // FIXME: m67 bringup @@ -211,6 +214,16 @@ bool PathProvider(int key, base::FilePath* result) { cur = cur.Append(kNotificationIconDir); break; #endif + case IMAGE_RESOURCE_DIR: +#if BUILDFLAG(IS_TIZEN) + if (!base::PathService::Get(DIR_USER_DATA, &cur)) + return false; + cur = cur.Append(kImageDir); + break; +#else + *result = base::FilePath(kImagePath); + return true; +#endif default: return false; } diff --git a/tizen_src/ewk/efl_integration/BUILD.gn b/tizen_src/ewk/efl_integration/BUILD.gn index 3254f23..3e32f33 100755 --- a/tizen_src/ewk/efl_integration/BUILD.gn +++ b/tizen_src/ewk/efl_integration/BUILD.gn @@ -643,6 +643,7 @@ shared_library("chromium-ewk") { ] } deps += [ "resource:edje_resources_ewk" ] + deps += [ ":broken_image" ] } executable("efl_webprocess") { @@ -658,3 +659,8 @@ copy("launch_exec_script") { sources = [ "launch_exec.sh" ] outputs = [ "$root_out_dir/{{source_file_part}}" ] } + +copy("broken_image") { + sources = [ "./resource/images/broken_image.png" ] + outputs = [ "$root_out_dir/images/{{source_file_part}}" ] +} \ No newline at end of file diff --git a/tizen_src/ewk/efl_integration/command_line_efl.cc b/tizen_src/ewk/efl_integration/command_line_efl.cc index eddd778..de01912 100644 --- a/tizen_src/ewk/efl_integration/command_line_efl.cc +++ b/tizen_src/ewk/efl_integration/command_line_efl.cc @@ -103,6 +103,9 @@ content::MainFunctionParams CommandLineEfl::GetDefaultPortParams() { #endif } + if (IsMobileProfile()) + p_command_line->AppendSwitch(switches::kEnableTouchDragDrop); + #if !defined(EWK_BRINGUP) if (p_command_line->HasSwitch(switches::kDisableIpcSandbox)) p_command_line->AppendSwitch(switches::kDisableRendererZygote); diff --git a/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc b/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc index 2e33c0b..21aea88 100644 --- a/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc +++ b/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc @@ -14,6 +14,7 @@ #include "common/web_contents_utils.h" #include "content/browser/renderer_host/render_widget_host_view_aura.h" #include "content/browser/selection/selection_controller_efl.h" +#include "content/browser/web_contents/web_contents_impl.h" #include "content/common/paths_efl.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/download_manager.h" @@ -62,14 +63,13 @@ std::vector ContextMenuControllerEfl::_context_menu_listdata ContextMenuControllerEfl::ContextMenuControllerEfl(EWebView* wv, WebContents& web_contents) : webview_(wv), -#if !defined(USE_AURA) - native_view_(static_cast(web_contents.GetNativeView())), -#endif popup_(nullptr), menu_items_(nullptr), web_contents_(web_contents), is_text_selection_(false), weak_ptr_factory_(this) { + native_view_ = + static_cast(&web_contents_)->GetEflNativeView(); } ContextMenuControllerEfl::~ContextMenuControllerEfl() { @@ -241,10 +241,12 @@ void ContextMenuControllerEfl::GetProposedContextMenu() { } #endif } -#if !defined(EWK_BRINGUP) - if (params_.is_draggable) { - AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION, EWK_CONTEXT_MENU_ITEM_TAG_DRAG, - std::string(dgettext("WebKit", "IDS_WEBVIEW_OPT_DRAG_AND_DROP"))); +#if BUILDFLAG(IS_TIZEN) + if (IsMobileProfile() && params_.is_draggable && + params_.media_type == ContextMenuDataMediaType::kImage) { + AddItemToProposedList( + EWK_CONTEXT_MENU_ITEM_TYPE_ACTION, EWK_CONTEXT_MENU_ITEM_TAG_DRAG, + std::string(dgettext("WebKit", "IDS_WEBVIEW_OPT_DRAG_AND_DROP_ABB"))); } #endif @@ -958,12 +960,13 @@ void ContextMenuControllerEfl::MenuItemSelected(ContextMenuItemEfl* menu_item) break; } case EWK_CONTEXT_MENU_ITEM_TAG_DRAG: { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - RenderViewHost* rvh = web_contents_.GetRenderViewHost(); - rvh->StartDragging(); - context_menu_show_pos_.SetPoint(params_.x, params_.y); -#else - NOTIMPLEMENTED(); +#if BUILDFLAG(IS_TIZEN) + if (IsMobileProfile()) { + webview_->EnterDragState(); + context_menu_show_pos_.SetPoint(params_.x, params_.y); + } else { + NOTIMPLEMENTED(); + } #endif break; } diff --git a/tizen_src/ewk/efl_integration/eweb_view.cc b/tizen_src/ewk/efl_integration/eweb_view.cc index 76e4b48..a9a6708 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.cc +++ b/tizen_src/ewk/efl_integration/eweb_view.cc @@ -731,6 +731,15 @@ void EWebView::ExecuteEditCommand(const char* command, const char* value) { } } +#if BUILDFLAG(IS_TIZEN) +void EWebView::EnterDragState() { + if (IsMobileProfile()) { + if (RenderViewHost* render_view_host = web_contents_->GetRenderViewHost()) + web_contents_->EnterDragState(render_view_host); + } +} +#endif + void EWebView::SetOrientation(int orientation) { if (GetOrientation() == orientation) return; diff --git a/tizen_src/ewk/efl_integration/eweb_view.h b/tizen_src/ewk/efl_integration/eweb_view.h index 571af8c..601562e 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.h +++ b/tizen_src/ewk/efl_integration/eweb_view.h @@ -326,6 +326,9 @@ class EWebView { double GetPageZoomFactor() const; void SetPageZoomFactor(double page_zoom_factor); void ExecuteEditCommand(const char* command, const char* value); +#if BUILDFLAG(IS_TIZEN) + void EnterDragState(); +#endif void SetOrientation(int orientation); int GetOrientation(); bool TouchEventsEnabled() const; diff --git a/tizen_src/ewk/efl_integration/resource/images/broken_image.png b/tizen_src/ewk/efl_integration/resource/images/broken_image.png new file mode 100644 index 0000000000000000000000000000000000000000..45edebcd5150d522620aefa9e3fbb0f9b6755450 GIT binary patch literal 810 zcmV+_1J(SAP){PkE;hYNfp@?Q)ugb<^guz~uln#LatF2$yvi~ezGr+Y4GZgNslFhVa~|pZ0S?7N z5Lnl+E6B1{5%N^$C|?G_3%^RXkTKc1D!M_Kn$`LKwZcMxJ?wiwokqDJFw#3LCw5EO zN#&N=Ld*U?5{ea}S$?1RpDh(qOU-{W65{#{G$V$fuNrlMdMH9&RpxpuKqkD%m?=!g zBlwW$XPHG%sm9)#qu5_}3YETESDELrFg<+J+6ac`u0YGhTplEeiG>J0CZ6KZmJ8Uk z@rY9<4~_kM=*C#Q5B)#eC7GLeaPBgOqa6UqRR&@qaYEvRPV1XkHzpS!Vl7PO(-J`( ztZQ}k*$Ek1squyTEL#WS-C_ivmIhd17fZlGIKj8nD~!Z%txINYUPo_Y$@t}*7q_8F z7(ejh_f-J2UKwLh8ZYOs Date: Mon, 20 Feb 2023 15:27:19 +0800 Subject: [PATCH 04/16] [M108 Migration][API] Provide ewk_context_tizen_app_version_set api This patch is for the requirement: Provide ewk setting api for widget version which be used for html5 video. 1.Provide ewk_context_tizen_app_version_set api for HBBTV, to set the value of widget version. 2.This api must be used after ewk_context_tizen_app_id_set or ewk_send_widget_info beacuse need drop the process privillages and set dynamic plugin. Reference: - https://review.tizen.org/gerrit/283610/ Change-Id: I67f644d3455af3d1ac939bbe316d64ee347a9911 Signed-off-by: Jie Zhang --- .../ewk/efl_integration/common/content_switches_efl.cc | 1 + .../ewk/efl_integration/common/content_switches_efl.h | 1 + .../ewk/efl_integration/content_browser_client_efl.cc | 2 ++ tizen_src/ewk/efl_integration/eweb_context.cc | 18 ++++++++++++++++++ tizen_src/ewk/efl_integration/eweb_context.h | 3 +++ .../ewk/efl_integration/private/ewk_context_private.cc | 4 ++++ .../ewk/efl_integration/private/ewk_context_private.h | 2 +- tizen_src/ewk/efl_integration/public/ewk_context.cc | 7 +++++-- 8 files changed, 35 insertions(+), 3 deletions(-) diff --git a/tizen_src/ewk/efl_integration/common/content_switches_efl.cc b/tizen_src/ewk/efl_integration/common/content_switches_efl.cc index 1e8d1f9..d7f83f9 100644 --- a/tizen_src/ewk/efl_integration/common/content_switches_efl.cc +++ b/tizen_src/ewk/efl_integration/common/content_switches_efl.cc @@ -20,6 +20,7 @@ const char kApplicationType[] = "application-type"; // Widget Info const char kTizenAppId[] = "widget-id"; +const char kTizenAppVersion[] = "app-version"; const char kWidgetScale[] = "widget-scale"; const char kWidgetTheme[] = "widget-theme"; const char kWidgetEncodedBundle[] = "widget-encoded-bundle"; diff --git a/tizen_src/ewk/efl_integration/common/content_switches_efl.h b/tizen_src/ewk/efl_integration/common/content_switches_efl.h index abefe6d..ff0b1a2 100644 --- a/tizen_src/ewk/efl_integration/common/content_switches_efl.h +++ b/tizen_src/ewk/efl_integration/common/content_switches_efl.h @@ -23,6 +23,7 @@ CONTENT_EXPORT extern const char kInjectedBundlePath[]; CONTENT_EXPORT extern const char kApplicationType[]; #endif CONTENT_EXPORT extern const char kTizenAppId[]; +CONTENT_EXPORT extern const char kTizenAppVersion[]; CONTENT_EXPORT extern const char kWidgetScale[]; CONTENT_EXPORT extern const char kWidgetTheme[]; CONTENT_EXPORT extern const char kWidgetEncodedBundle[]; diff --git a/tizen_src/ewk/efl_integration/content_browser_client_efl.cc b/tizen_src/ewk/efl_integration/content_browser_client_efl.cc index cc199f7..5107d5a 100644 --- a/tizen_src/ewk/efl_integration/content_browser_client_efl.cc +++ b/tizen_src/ewk/efl_integration/content_browser_client_efl.cc @@ -132,6 +132,8 @@ void AppendExtraCommandLineSwitchesInternal(base::CommandLine* command_line, const std::string& tizen_app_id = context->GetTizenAppId(); command_line->AppendSwitchASCII(switches::kTizenAppId, tizen_app_id); + command_line->AppendSwitchASCII(switches::kTizenAppVersion, + context->GetTizenAppVersion()); double scale = context->GetWidgetScale(); command_line->AppendSwitchASCII(switches::kWidgetScale, diff --git a/tizen_src/ewk/efl_integration/eweb_context.cc b/tizen_src/ewk/efl_integration/eweb_context.cc index b2c3b7d..f344603 100644 --- a/tizen_src/ewk/efl_integration/eweb_context.cc +++ b/tizen_src/ewk/efl_integration/eweb_context.cc @@ -277,6 +277,24 @@ void EWebContext::SetWidgetInfo(const std::string& tizen_app_id, #endif // IS_TIZEN } +bool EWebContext::SetAppVersion(const std::string& tizen_app_version) { + if (tizen_app_id_.empty()) { + LOG(ERROR) << "Please set tizen_app_id first."; + return false; + } + + tizen_app_version_ = tizen_app_version; + +#if BUILDFLAG(IS_TIZEN) + base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); + command_line.AppendSwitchASCII(switches::kTizenAppVersion, tizen_app_version); + return true; +#else + LOG(WARNING) << "OS_TIZEN is not enabled."; + return false; +#endif // IS_TIZEN +} + void EWebContext::SendWrtMessage(const Ewk_Wrt_Message_Data& data) { WrtWidgetHost::Get()->SendWrtMessage(data); } diff --git a/tizen_src/ewk/efl_integration/eweb_context.h b/tizen_src/ewk/efl_integration/eweb_context.h index bb51d19..651941c 100644 --- a/tizen_src/ewk/efl_integration/eweb_context.h +++ b/tizen_src/ewk/efl_integration/eweb_context.h @@ -147,6 +147,7 @@ class EWebContext { Evas_Object *AddFaviconObject(const char *uri, Evas *canvas) const; void SetWidgetInfo(const std::string& tizen_app_id, double scale, const std::string &theme, const std::string &encoded_bundle); + bool SetAppVersion(const std::string& tizen_app_version); void SendWrtMessage(const Ewk_Wrt_Message_Data& message); void SetMimeOverrideCallback(Ewk_Context_Override_Mime_For_Url_Callback callback, @@ -182,6 +183,7 @@ class EWebContext { const std::string& GetInjectedBundlePath() const { return injected_bundle_path_; } const std::string& GetTizenAppId() const { return tizen_app_id_; } + const std::string& GetTizenAppVersion() const { return tizen_app_version_; } const std::string& GetWidgetTheme() const { return widget_theme_; } const std::string& GetWidgetEncodedBundle() const { return widget_encoded_bundle_; } double GetWidgetScale() const { return widget_scale_; } @@ -230,6 +232,7 @@ class EWebContext { // widget info std::string tizen_app_id_; + std::string tizen_app_version_; std::string widget_theme_; std::string widget_encoded_bundle_; double widget_scale_; diff --git a/tizen_src/ewk/efl_integration/private/ewk_context_private.cc b/tizen_src/ewk/efl_integration/private/ewk_context_private.cc index be871bd..e10e87a 100644 --- a/tizen_src/ewk/efl_integration/private/ewk_context_private.cc +++ b/tizen_src/ewk/efl_integration/private/ewk_context_private.cc @@ -256,6 +256,10 @@ void Ewk_Context::SetWidgetInfo(const std::string& tizen_app_id, impl->SetWidgetInfo(tizen_app_id, scale, theme, encoded_bundle); } +bool Ewk_Context::SetAppVersion(const std::string& tizen_app_version) { + return impl->SetAppVersion(tizen_app_version); +} + int Ewk_Context::Pixmap() const { return impl->Pixmap(); } diff --git a/tizen_src/ewk/efl_integration/private/ewk_context_private.h b/tizen_src/ewk/efl_integration/private/ewk_context_private.h index fc39ea3..869cde0 100644 --- a/tizen_src/ewk/efl_integration/private/ewk_context_private.h +++ b/tizen_src/ewk/efl_integration/private/ewk_context_private.h @@ -116,7 +116,7 @@ struct Ewk_Context : public base::RefCounted { double scale, const std::string& theme, const std::string& encoded_bundle); - //void SendWrtMessage(const Ewk_IPC_Wrt_Message_Data& message); + bool SetAppVersion(const std::string& tizen_app_version); // Pixmap int Pixmap() const; diff --git a/tizen_src/ewk/efl_integration/public/ewk_context.cc b/tizen_src/ewk/efl_integration/public/ewk_context.cc index 95dd572..a7e298a 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_context.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_context.cc @@ -26,6 +26,7 @@ #include "ewk_context_product.h" #include "base/memory/ref_counted.h" +#include "base/trace_event/ttrace.h" #include "browser/favicon/favicon_database_p.h" #include "browser/vibration/vibration_provider_client.h" #include "browser_context_efl.h" @@ -614,8 +615,10 @@ void ewk_context_tizen_app_id_set(Ewk_Context* context, Eina_Bool ewk_context_tizen_app_version_set(Ewk_Context* context, const char* tizen_app_version) { - LOG_EWK_API_MOCKUP(); - return false; + EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(tizen_app_version, EINA_FALSE); + TTRACE_WEB("tizen_app_version: %s", tizen_app_version); + return context->SetAppVersion(tizen_app_version); } Ewk_Application_Cache_Manager* ewk_context_application_cache_manager_get(const Ewk_Context* ewkContext) -- 2.7.4 From b45c2d62776ec00e16e2333bce7f053988ecf976 Mon Sep 17 00:00:00 2001 From: Koyyani Maheswari Date: Wed, 22 Feb 2023 11:03:52 +0530 Subject: [PATCH 05/16] Remove unutilized code Below features are not used. Respective code is removed. - tizen_multimedia_eme_support - tizen_multimedia_support Reference : https://review.tizen.org/gerrit/279396/ https://review.tizen.org/gerrit/279317/ Change-Id: I989a3873cfe785afcff1f7172419c0646510e95c Signed-off-by: Koyyani Maheswari --- media/BUILD.gn | 7 - tizen_src/build/config/BUILD.gn | 6 - tizen_src/build/config/tizen_features.gni | 8 - tizen_src/build/gn_chromiumefl.sh | 2 - tizen_src/build/jhbuild/jhbuildrc | 3 - .../chromium_impl/content/browser/browser_efl.gni | 20 - .../browser/media/browser_mediapacket_manager.cc | 54 -- .../browser/media/browser_mediapacket_manager.h | 33 - .../browser/media/efl/browser_demuxer_efl.cc | 148 ---- .../browser/media/efl/browser_demuxer_efl.h | 72 -- .../media/efl/browser_media_player_manager_efl.cc | 364 -------- .../media/efl/browser_media_player_manager_efl.h | 120 --- .../media/media_web_contents_observer_efl.cc | 78 -- .../media/media_web_contents_observer_efl.h | 51 -- .../chromium_impl/content/common/common_efl.gni | 26 +- .../media/efl/tizen_video_decode_accelerator.cc | 589 ------------- .../gpu/media/efl/tizen_video_decode_accelerator.h | 48 -- .../media/efl/tizen_video_encode_accelerator.cc | 617 ------------- .../gpu/media/efl/tizen_video_encode_accelerator.h | 54 -- .../common/media/efl/media_player_messages_efl.h | 198 ----- .../media/efl/media_player_messages_enums_efl.h | 14 - .../content/common/message_generator_efl.h | 4 - .../content/common/render_messages_efl.h | 13 - tizen_src/chromium_impl/content/content_efl.gni | 11 - .../content/renderer/media/efl/audio_decoder_efl.h | 22 - .../media/efl/media_source_delegate_efl.cc | 513 ----------- .../renderer/media/efl/media_source_delegate_efl.h | 164 ---- .../renderer/media/efl/renderer_demuxer_efl.cc | 109 --- .../renderer/media/efl/renderer_demuxer_efl.h | 88 -- .../media/efl/renderer_media_player_manager_efl.cc | 239 ------ .../media/efl/renderer_media_player_manager_efl.h | 105 --- .../renderer/media/efl/webmediaplayer_efl.cc | 636 -------------- .../renderer/media/efl/webmediaplayer_efl.h | 264 ------ .../renderer/media/tizen/audio_decoder_capi.cc | 259 ------ .../content/renderer/renderer_efl.gni | 24 - .../media/audio/tizen/audio_manager_tizen.cc | 21 - .../chromium_impl/media/base/efl/demuxer_efl.h | 52 -- .../base/efl/demuxer_stream_player_params_efl.cc | 28 - .../base/efl/demuxer_stream_player_params_efl.h | 51 -- .../media/base/efl/webaudio_decoder_efl.h | 24 - .../media/base/efl/webaudio_media_codec_info_efl.h | 34 - .../media/base/tizen/media_source_player_capi.cc | 951 --------------------- .../media/base/tizen/media_source_player_capi.h | 143 ---- .../base/tizen/webaudio_decoder_browser_capi.cc | 318 ------- .../base/tizen/webaudio_decoder_browser_capi.h | 87 -- tizen_src/chromium_impl/media/media_efl.gni | 72 -- .../browser/render_message_filter_efl.cc | 21 +- .../browser/render_message_filter_efl.h | 12 - tizen_src/ewk/efl_integration/command_line_efl.cc | 4 - 49 files changed, 5 insertions(+), 6776 deletions(-) delete mode 100644 tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.cc delete mode 100644 tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.h delete mode 100644 tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.cc delete mode 100644 tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.h delete mode 100644 tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.cc delete mode 100644 tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.h delete mode 100644 tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.cc delete mode 100644 tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.h delete mode 100644 tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.cc delete mode 100644 tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.h delete mode 100644 tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.cc delete mode 100644 tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.h delete mode 100644 tizen_src/chromium_impl/content/common/media/efl/media_player_messages_efl.h delete mode 100644 tizen_src/chromium_impl/content/common/media/efl/media_player_messages_enums_efl.h delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/audio_decoder_efl.h delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.cc delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.h delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.cc delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.h delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.cc delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.h delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.cc delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.h delete mode 100644 tizen_src/chromium_impl/content/renderer/media/tizen/audio_decoder_capi.cc delete mode 100644 tizen_src/chromium_impl/media/audio/tizen/audio_manager_tizen.cc delete mode 100644 tizen_src/chromium_impl/media/base/efl/demuxer_efl.h delete mode 100644 tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.cc delete mode 100644 tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.h delete mode 100644 tizen_src/chromium_impl/media/base/efl/webaudio_decoder_efl.h delete mode 100644 tizen_src/chromium_impl/media/base/efl/webaudio_media_codec_info_efl.h delete mode 100644 tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.cc delete mode 100644 tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.h delete mode 100644 tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.cc delete mode 100644 tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.h diff --git a/media/BUILD.gn b/media/BUILD.gn index 548201d..d3a23d9 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn @@ -414,13 +414,6 @@ fuzzer_test("media_webm_muxer_fuzzer") { "//base", "//third_party/libwebm", ] - - if (use_efl && tizen_multimedia_support) { - deps += external_media_efl_deps - sources += external_media_efl_sources - sources -= external_exclude_media_efl_sources - configs += external_media_efl_config - } } fuzzer_test("cbcs_decryptor_fuzzer") { diff --git a/tizen_src/build/config/BUILD.gn b/tizen_src/build/config/BUILD.gn index 98e02c8..f8b9515 100644 --- a/tizen_src/build/config/BUILD.gn +++ b/tizen_src/build/config/BUILD.gn @@ -33,12 +33,6 @@ config("tizen_feature_flags") { if (tizen_tbm_support) { defines += [ "TIZEN_TBM_SUPPORT" ] } - if (tizen_multimedia_support) { - defines += [ - "TIZEN_MULTIMEDIA_SUPPORT", - "TIZEN_MULTIMEDIA_USE_CAPI_AUDIO_IO", - ] - } if (tizen_web_speech_recognition) { defines += [ "TIZEN_WEB_SPEECH_RECOGNITION" ] } diff --git a/tizen_src/build/config/tizen_features.gni b/tizen_src/build/config/tizen_features.gni index 47b30e0..8d2dd87 100644 --- a/tizen_src/build/config/tizen_features.gni +++ b/tizen_src/build/config/tizen_features.gni @@ -52,8 +52,6 @@ declare_args() { tizen_pepper_extensions = false # Tizen multimedia related - tizen_multimedia_eme_support = false - tizen_multimedia_support = false tizen_multimedia = false tizen_tbm_support = false tizen_video_hole = false @@ -72,12 +70,6 @@ if (tizen_product_tv) { use_ttrace = true } -if (is_tizen && tizen_multimedia_support) { - tizen_multimedia_eme_support = true -} else { - tizen_multimedia_eme_support = false -} - if (use_atk) { tizen_atk_support = true if (tizen_product_tv) { diff --git a/tizen_src/build/gn_chromiumefl.sh b/tizen_src/build/gn_chromiumefl.sh index 531f7f2..e0fe595 100755 --- a/tizen_src/build/gn_chromiumefl.sh +++ b/tizen_src/build/gn_chromiumefl.sh @@ -172,8 +172,6 @@ add_tizen_flags() { python_ver=\"$(getPythonVersion)\" is_official_build=true enable_nacl=false - enable_basic_printing=true - enable_print_preview=true use_xkbcommon=true target_os="\"tizen\"" target_sysroot=\"/\" diff --git a/tizen_src/build/jhbuild/jhbuildrc b/tizen_src/build/jhbuild/jhbuildrc index 337f39f..296aea9 100644 --- a/tizen_src/build/jhbuild/jhbuildrc +++ b/tizen_src/build/jhbuild/jhbuildrc @@ -44,10 +44,7 @@ if 'NUMBER_OF_PROCESSORS' in os.environ: jobs = os.environ['NUMBER_OF_PROCESSORS'] # Use system libraries while building. -if use_lib64: _libdir = 'lib64' -else: - _libdir = 'lib' partial_build = False diff --git a/tizen_src/chromium_impl/content/browser/browser_efl.gni b/tizen_src/chromium_impl/content/browser/browser_efl.gni index b63a368..d0f3989 100644 --- a/tizen_src/chromium_impl/content/browser/browser_efl.gni +++ b/tizen_src/chromium_impl/content/browser/browser_efl.gni @@ -41,15 +41,6 @@ if (!use_wayland) { ] } -if (tizen_multimedia_support) { - external_content_browser_efl_configs += [ - "//tizen_src/build:capi-media-player", - "//tizen_src/build:libcapi-media-player", - "//tizen_src/build:capi-media-tool", - "//tizen_src/build:libcapi-media-tool", - ] -} - if (tizen_web_speech_recognition) { external_content_browser_efl_configs += [ "//tizen_src/build:stt", @@ -137,17 +128,6 @@ if (is_tizen) { ] } -if (tizen_multimedia_support) { - external_content_browser_efl_sources += [ - "//tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.cc", - "//tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.h", - "//tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.cc", - "//tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.h", - "//tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.cc", - "//tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.h", - ] -} - if (tizen_atk_support) { external_content_browser_efl_configs += [ "//tizen_src/build:atk", diff --git a/tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.cc b/tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.cc deleted file mode 100644 index 9252741..0000000 --- a/tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.cc +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/media/browser_mediapacket_manager.h" - -#include - -#include "content/common/media/efl/media_player_messages_efl.h" -#include "content/public/browser/browser_thread.h" -#include "ipc/ipc_message_macros.h" - -namespace { - -void DoDestroyMediaPacket(media_packet_h packet) { - if (MEDIA_PACKET_ERROR_NONE != media_packet_destroy(packet)) - LOG(WARNING) << "Fail to release media_packet"; -} - -} // namespace - -namespace content { - -scoped_refptr CreateBrowserMediapacketManager() { - return new BrowserMediaPacketManager(); -} - -BrowserMediaPacketManager::BrowserMediaPacketManager() - : BrowserMessageFilter(MediaPlayerMsgStart) {} - -BrowserMediaPacketManager::~BrowserMediaPacketManager() {} - -bool BrowserMediaPacketManager::OnMessageReceived( - const IPC::Message& message) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(BrowserMediaPacketManager, message) - IPC_MESSAGE_HANDLER(MediaPlayerEflHostMsg_ReleaseTbmBuffer, - ReleaseMediaPacket) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; -} - -void BrowserMediaPacketManager::ReleaseMediaPacket( - gfx::TbmBufferHandle packet) { - DLOG(INFO) << "ReleaseMediaPacket, media_packet: " << packet.media_packet; - BrowserThread::PostDelayedTask( - BrowserThread::IO, FROM_HERE, - base::BindOnce(&DoDestroyMediaPacket, - static_cast(packet.media_packet)), - base::TimeDelta::FromMilliseconds(40)); -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.h b/tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.h deleted file mode 100644 index 1c89f013..0000000 --- a/tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_MEDIA_BROWSER_MEDIAPACKET_MANAGER_H_ -#define CONTENT_BROWSER_MEDIA_BROWSER_MEDIAPACKET_MANAGER_H_ - -#include "content/public/browser/browser_message_filter.h" -#include "ui/gfx/gpu_memory_buffer.h" - -namespace content { - -class CONTENT_EXPORT BrowserMediaPacketManager : public BrowserMessageFilter { - public: - BrowserMediaPacketManager(); - - BrowserMediaPacketManager(const BrowserMediaPacketManager&) = delete; - BrowserMediaPacketManager& operator=(const BrowserMediaPacketManager&) = - delete; - - bool OnMessageReceived(const IPC::Message& message) override; - - protected: - friend class base::RefCountedThreadSafe; - ~BrowserMediaPacketManager() override; - - private: - void ReleaseMediaPacket(gfx::TbmBufferHandle packet); -}; - -} // namespace content - -#endif // CONTENT_BROWSER_MEDIA_BROWSER_MEDIAPACKET_MANAGER_H_ diff --git a/tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.cc b/tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.cc deleted file mode 100644 index 6f98ce0..0000000 --- a/tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.cc +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/media/efl/browser_demuxer_efl.h" - -#include "content/common/media/efl/media_player_messages_efl.h" - -namespace content { - -class BrowserDemuxerEfl::Internal : public media::DemuxerEfl { - public: - Internal(const scoped_refptr& demuxer, - int demuxer_client_id) - : demuxer_(demuxer), - demuxer_client_id_(demuxer_client_id) {} - - ~Internal() override { - DCHECK(ClientIDExists()) << demuxer_client_id_; - demuxer_->RemoveDemuxerClient(demuxer_client_id_); - } - - Internal(const Internal&) = delete; - Internal& operator=(const Internal&) = delete; - - // |media::DemuxerEfl| implementation. - void Initialize(media::DemuxerEflClient* client) override { - DCHECK(!ClientIDExists()) << demuxer_client_id_; - demuxer_->AddDemuxerClient(demuxer_client_id_, client); - } - - void RequestDemuxerData(media::DemuxerStream::Type type) override { - DCHECK(ClientIDExists()) << demuxer_client_id_; - demuxer_->Send(new MediaPlayerEflMsg_ReadFromDemuxer( - demuxer_client_id_, type)); - } - - void RequestDemuxerSeek( - const base::TimeDelta& time_to_seek) override { - DCHECK(ClientIDExists()) << demuxer_client_id_; - demuxer_->Send(new MediaPlayerEflMsg_DemuxerSeekRequest( - demuxer_client_id_, time_to_seek)); - } - - private: - // Helper for DCHECKing that the ID is still registered. - bool ClientIDExists() { - return demuxer_->demuxer_clients_.Lookup(demuxer_client_id_); - } - - scoped_refptr demuxer_; - int demuxer_client_id_; -}; - -scoped_refptr CreateBrowserDemuxerEfl() { - return new BrowserDemuxerEfl(); -} - -BrowserDemuxerEfl::BrowserDemuxerEfl() - : BrowserMessageFilter(MediaPlayerMsgStart) {} - -BrowserDemuxerEfl::~BrowserDemuxerEfl() {} - -void BrowserDemuxerEfl::OverrideThreadForMessage( - const IPC::Message& message, - BrowserThread::ID* thread) { - switch (message.type()) { - case MediaPlayerEflHostMsg_DemuxerReady::ID: - case MediaPlayerEflHostMsg_ReadFromDemuxerAck::ID: - case MediaPlayerEflHostMsg_DurationChanged::ID: - case MediaPlayerEflHostMsg_DemuxerSeekDone::ID: - *thread = BrowserThread::UI; - break; - default: - break; - } -} - -bool BrowserDemuxerEfl::OnMessageReceived(const IPC::Message& message) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(BrowserDemuxerEfl, message) - IPC_MESSAGE_HANDLER(MediaPlayerEflHostMsg_DemuxerReady, - OnDemuxerReady) - IPC_MESSAGE_HANDLER(MediaPlayerEflHostMsg_ReadFromDemuxerAck, - OnReadFromDemuxerAck) - IPC_MESSAGE_HANDLER(MediaPlayerEflHostMsg_DurationChanged, - OnDurationChanged) - IPC_MESSAGE_HANDLER(MediaPlayerEflHostMsg_DemuxerSeekDone, - OnDemuxerSeekDone) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; -} - -scoped_ptr BrowserDemuxerEfl::CreateDemuxer( - int demuxer_client_id) { - return scoped_ptr( - new Internal(this, demuxer_client_id)); -} - -void BrowserDemuxerEfl::AddDemuxerClient( - int demuxer_client_id, - media::DemuxerEflClient* client) { - demuxer_clients_.AddWithID(client, demuxer_client_id); -} - -void BrowserDemuxerEfl::RemoveDemuxerClient(int demuxer_client_id) { - demuxer_clients_.Remove(demuxer_client_id); -} - -void BrowserDemuxerEfl::OnDemuxerReady( - int demuxer_client_id, - const media::DemuxerConfigs& configs) { - media::DemuxerEflClient* client = - demuxer_clients_.Lookup(demuxer_client_id); - if (client) - client->OnDemuxerConfigsAvailable(configs); -} - -void BrowserDemuxerEfl::OnReadFromDemuxerAck( - int demuxer_client_id, - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data) { - media::DemuxerEflClient* client = - demuxer_clients_.Lookup(demuxer_client_id); - if (client) - client->OnDemuxerDataAvailable(foreign_memory_handle, meta_data); -} - -void BrowserDemuxerEfl::OnDemuxerSeekDone( - int demuxer_client_id, - const base::TimeDelta& actual_browser_seek_time) { - media::DemuxerEflClient* client = - demuxer_clients_.Lookup(demuxer_client_id); - if (client) - client->OnDemuxerSeekDone(actual_browser_seek_time); -} - -void BrowserDemuxerEfl::OnDurationChanged( - int demuxer_client_id, - const base::TimeDelta& duration) { - media::DemuxerEflClient* client = - demuxer_clients_.Lookup(demuxer_client_id); - if (client) - client->OnDemuxerDurationChanged(duration); -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.h b/tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.h deleted file mode 100644 index 58bb56b..0000000 --- a/tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.h +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_MEDIA_EFL_BROWSER_DEMUXER_EFL_H_ -#define CONTENT_BROWSER_MEDIA_EFL_BROWSER_DEMUXER_EFL_H_ - -#include "base/id_map.h" -#include "base/memory/shared_memory.h" -#include "content/public/browser/browser_message_filter.h" -#include "media/base/efl/demuxer_efl.h" - -namespace content { - -// Represents the browser process half of an IPC-based demuxer proxy. -// It vends out media::DemuxerEfl instances that are registered with an -// end point in the renderer process. -// -// Refer to RendererDemuxerEfl for the renderer process half. -class CONTENT_EXPORT BrowserDemuxerEfl : public BrowserMessageFilter { - public: - BrowserDemuxerEfl(); - - BrowserDemuxerEfl(const BrowserDemuxerEfl&) = delete; - BrowserDemuxerEfl& operator=(const BrowserDemuxerEfl&) = delete; - - // BrowserMessageFilter overrides. - void OverrideThreadForMessage( - const IPC::Message& message, - BrowserThread::ID* thread) override; - bool OnMessageReceived(const IPC::Message& message) override; - - // Returns an uninitialized demuxer implementation associated with - // |demuxer_client_id|, which can be used to communicate with the real demuxer - // in the renderer process. - scoped_ptr CreateDemuxer(int demuxer_client_id); - - protected: - friend class base::RefCountedThreadSafe; - ~BrowserDemuxerEfl() override; - - private: - class Internal; - - // Called by internal demuxer implementations to add/remove a client - // association. - void AddDemuxerClient( - int demuxer_client_id, - media::DemuxerEflClient* client); - void RemoveDemuxerClient(int demuxer_client_id); - - // IPC message handlers. - void OnDemuxerReady( - int demuxer_client_id, - const media::DemuxerConfigs& configs); - void OnReadFromDemuxerAck( - int demuxer_client_id, - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data); - void OnDemuxerSeekDone( - int demuxer_client_id, - const base::TimeDelta& actual_browser_seek_time); - void OnDurationChanged( - int demuxer_client_id, - const base::TimeDelta& duration); - - IDMap demuxer_clients_; -}; - -} // namespace content - -#endif // CONTENT_BROWSER_MEDIA_EFL_BROWSER_DEMUXER_EFL_H_ diff --git a/tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.cc b/tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.cc deleted file mode 100644 index a0725f9..0000000 --- a/tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.cc +++ /dev/null @@ -1,364 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/media/efl/browser_media_player_manager_efl.h" - -#include "base/memory/shared_memory.h" -#include "content/browser/media/efl/browser_demuxer_efl.h" -#include "content/browser/renderer_host/render_process_host_impl.h" -#include "content/common/media/efl/media_player_messages_efl.h" -#include "content/public/browser/web_contents.h" -#include "content/public/common/content_client.h" -#include "ipc/ipc_channel_proxy.h" -#include "ipc/ipc_logging.h" -#include "media/base/efl/media_player_efl.h" -#include "tizen/system_info.h" - -#if defined(TIZEN_TBM_SUPPORT) -#include -#endif - -namespace content { - -static unsigned int GetMaximumPlayerCount() { - // Note : In case of Mobile , maximum decoder instance count is depending on - // contents resolution but to get the resolution of content, player should be - // prepared. Hence maximum instance count is set as 1. - // Resolution <= 720P : 2 - // Resolution > 720P : 1 - // Incase of TV : audio & video using H/W decoder , so only support 1. - if (IsTvProfile()) - return 1; - else if (IsMobileProfile() || IsWearableProfile()) - return 1; - else - return 5; -} - -// GetContentClient() is defined in content_client.cc, but in content_client.h -// it is hidden by CONTENT_IMPLEMENTATION ifdef. We don't want to define -// CONTENT_IMPLEMENTATION because it may bring a lot of things we don't need. -ContentClient* GetContentClient(); - -BrowserMediaPlayerManagerEfl* BrowserMediaPlayerManagerEfl::Create( - RenderFrameHost* rfh) { - return new BrowserMediaPlayerManagerEfl(rfh); -} - -BrowserMediaPlayerManagerEfl::BrowserMediaPlayerManagerEfl( - RenderFrameHost* render_frame_host) - : current_player_(-1), - render_frame_host_(render_frame_host), - web_contents_(WebContents::FromRenderFrameHost(render_frame_host)) { -} - -BrowserMediaPlayerManagerEfl::~BrowserMediaPlayerManagerEfl() { - // Players can be destroyed during destruction of BMPM without clear(), - // but not to make destruction order dependencies with other member variables - // we explicitly destroy player instances here. - players_.clear(); -} - -media::MediaPlayerEfl* BrowserMediaPlayerManagerEfl::GetPlayer( - int player_id) { - for (auto player : players_) { - if (player->GetPlayerId() == player_id) - return player; - } - return NULL; -} - -void BrowserMediaPlayerManagerEfl::OnInitComplete( - int player_id, bool success) { - if (success) - OnResumeComplete(player_id); - - if(init_queue_.empty() || player_id != init_queue_.front()) - return; - - init_queue_.pop_front(); - if (!init_queue_.empty()) - InitNextPlayer(); -} - -void BrowserMediaPlayerManagerEfl::OnResumeComplete(int player_id) { - for(auto it = resumed_queue_.begin(); it != resumed_queue_.end(); ++it) { - if (*it == player_id) { - return; - } - } - - if (resumed_queue_.size() < GetMaximumPlayerCount()) - resumed_queue_.push_back(player_id); -} - -void BrowserMediaPlayerManagerEfl::OnSuspendComplete(int player_id) { - CleanUpResumedQueue(); - RemovePlayerFromResumedQueue(player_id); -} - -void BrowserMediaPlayerManagerEfl::CleanUpResumedQueue() { - // Clean up invalid player id. - int size = resumed_queue_.size(); - for (int index = 0 ; index < size ; index++) { - int id = resumed_queue_.front(); - media::MediaPlayerEfl* player = GetPlayer(id); - resumed_queue_.pop_front(); - if (player) - resumed_queue_.push_back(id); - } -} - -void BrowserMediaPlayerManagerEfl::InitNextPlayer() { - if (!init_queue_.empty()) { - SuspendPlayers(); - int player_id = init_queue_.front(); - media::MediaPlayerEfl* player = GetPlayer(player_id); - if (player) - player->Initialize(); - } -} - -void BrowserMediaPlayerManagerEfl::OnNewFrameAvailable( - int player_id, - base::SharedMemoryHandle foreign_memory_handle, - uint32_t length, base::TimeDelta timestamp) { - Send(new MediaPlayerEflMsg_NewFrameAvailable( - GetRoutingID(), player_id, foreign_memory_handle, length, timestamp)); -} - -#if defined(TIZEN_TBM_SUPPORT) -void BrowserMediaPlayerManagerEfl::OnNewTbmBufferAvailable( - int player_id, gfx::TbmBufferHandle tbm_handle, - base::TimeDelta timestamp) { - DLOG(INFO) << "New media_packet:" << tbm_handle.media_packet; - Send(new MediaPlayerEflMsg_NewTbmBufferAvailable( - GetRoutingID(), player_id, tbm_handle, timestamp)); -} -#endif - -void BrowserMediaPlayerManagerEfl::OnTimeChanged(int player_id) { - Send(new MediaPlayerEflMsg_TimeChanged(GetRoutingID(), player_id)); -} - -void BrowserMediaPlayerManagerEfl::OnSeekStateChange( - int player_id, bool state) { - Send(new MediaPlayerEflMsg_OnSeekStateChange( - GetRoutingID(), player_id, state)); -} - -void BrowserMediaPlayerManagerEfl::OnPauseStateChange( - int player_id, bool state) { - Send(new MediaPlayerEflMsg_PauseStateChanged( - GetRoutingID(), player_id, state)); -} - -void BrowserMediaPlayerManagerEfl::OnRequestSeek( - int player_id, double seek_time) { - // To handle internal seek. - Send(new MediaPlayerEflMsg_SeekRequest( - GetRoutingID(), player_id, seek_time)); -} - -void BrowserMediaPlayerManagerEfl::OnTimeUpdate( - int player_id, double current_time) { - Send(new MediaPlayerEflMsg_TimeUpdate( - GetRoutingID(), player_id, current_time)); -} - -void BrowserMediaPlayerManagerEfl::OnBufferUpdate( - int player_id, - std::vector buffer_range) { - Send(new MediaPlayerEflMsg_BufferUpdate( - GetRoutingID(), player_id, buffer_range)); -} - -void BrowserMediaPlayerManagerEfl::OnDurationChange( - int player_id, - double duration) { - Send(new MediaPlayerEflMsg_DurationChanged( - GetRoutingID(), player_id, duration)); -} - -void BrowserMediaPlayerManagerEfl::OnReadyStateChange( - int player_id, - blink::WebMediaPlayer::ReadyState state) { - Send(new MediaPlayerEflMsg_ReadyStateChange( - GetRoutingID(), player_id, state)); -} - -void BrowserMediaPlayerManagerEfl::OnNetworkStateChange( - int player_id, - blink::WebMediaPlayer::NetworkState state) { - Send(new MediaPlayerEflMsg_NetworkStateChange( - GetRoutingID(), player_id, state)); -} - -void BrowserMediaPlayerManagerEfl::OnMediaDataChange(int player_id, int width, - int height, int media) { - Send(new MediaPlayerEflMsg_MediaDataChanged(GetRoutingID(), player_id, - width, height, media)); -} - -int BrowserMediaPlayerManagerEfl::GetRoutingID() { - if (!render_frame_host_) - return 0; - return render_frame_host_->GetRoutingID(); -} - -bool BrowserMediaPlayerManagerEfl::Send(IPC::Message* msg) { - if (!render_frame_host_) - return false; - return render_frame_host_->Send(msg); -} - -void BrowserMediaPlayerManagerEfl::OnInitialize( - int player_id, - MediaPlayerHostMsg_Initialize_Type type, - const GURL& url, - double volume, - int demuxer_client_id) { - RemovePlayer(player_id); - - if (type == MEDIA_PLAYER_TYPE_URL) { - std::string user_agent = web_contents()->GetUserAgentOverride(); - if (user_agent.empty()) - user_agent = content::GetContentClient()->GetUserAgent(); - - AddPlayer(media::MediaPlayerEfl::CreatePlayer( - player_id, url, volume, this, user_agent)); - } else if (type == MEDIA_PLAYER_TYPE_MEDIA_SOURCE) { - RenderProcessHostImpl* host = static_cast( - web_contents()->GetRenderProcessHost()); - BrowserDemuxerEfl* browser_demuxer_efl = - static_cast(host->browser_demuxer_efl().get()); - AddPlayer(media::MediaPlayerEfl::CreatePlayer( - player_id, - browser_demuxer_efl, demuxer_client_id, - this)); - } else { - LOG(ERROR) << __FUNCTION__ << " Load type is wrong!"; - OnNetworkStateChange( - player_id, blink::WebMediaPlayer::NetworkStateEmpty); - return; - } - - init_queue_.push_back(player_id); - - // Start initialize with first player. Others will be queued. - if (init_queue_.size() == 1) - InitNextPlayer(); -} - -void BrowserMediaPlayerManagerEfl::OnDestroy(int player_id) { - RemovePlayer(player_id); -} - -void BrowserMediaPlayerManagerEfl::SuspendPlayers() { - while (resumed_queue_.size() >= GetMaximumPlayerCount()) { - media::MediaPlayerEfl* player = GetPlayer(resumed_queue_.front()); - if (player) - player->Suspend(); - } -} - -void BrowserMediaPlayerManagerEfl::PausePlayers(int player_id) { - for (auto it = players_.begin(); it != players_.end(); ++it) { - media::MediaPlayerEfl* player = *it; - if (player->GetPlayerId() != player_id) { - player->Pause(false); - OnPauseStateChange(player->GetPlayerId() , true); - } - } -} - -void BrowserMediaPlayerManagerEfl::OnPlay(int player_id) { - PausePlayers(player_id); - media::MediaPlayerEfl* player = GetPlayer(player_id); - if (player) { - if (current_player_ != player_id && player->IsPlayerSuspended()) - SuspendPlayers(); - - current_player_ = player_id; - player->Play(); - } -} - -void BrowserMediaPlayerManagerEfl::OnPause(int player_id) { - media::MediaPlayerEfl* player = GetPlayer(player_id); - if (player) - player->Pause(false); -} - -void BrowserMediaPlayerManagerEfl::OnSetVolume( - int player_id, - double volume) { - media::MediaPlayerEfl* player = GetPlayer(player_id); - if (player) - player->SetVolume(volume); -} - -void BrowserMediaPlayerManagerEfl::OnSetRate(int player_id, double rate) { - media::MediaPlayerEfl* player = GetPlayer(player_id); - if (player) - player->SetRate(rate); -} - -void BrowserMediaPlayerManagerEfl::OnSeek(int player_id, double time) { - media::MediaPlayerEfl* player = GetPlayer(player_id); - if (player) { - if (current_player_ != player_id && player->IsPlayerSuspended()) - SuspendPlayers(); - current_player_ = player_id; - player->Seek(time); - } -} - -void BrowserMediaPlayerManagerEfl::AddPlayer( - media::MediaPlayerEfl* player) { - DCHECK(!GetPlayer(player->GetPlayerId())); - players_.push_back(player); -} - -void BrowserMediaPlayerManagerEfl::RemovePlayer(int player_id) { - for (auto it = players_.begin(); it != players_.end(); ++it) { - media::MediaPlayerEfl* player = *it; - if (player->GetPlayerId() == player_id) { - players_.erase(it); - - if (!init_queue_.empty()) { - if(player_id == init_queue_.front()) { - LOG(ERROR) << "The released Player is under initializing progress"; - init_queue_.pop_front(); - if (!init_queue_.empty()) - InitNextPlayer(); - } else - RemovePlayerFromInitializeQueue(player_id); - } - break; - } - } -} - -void BrowserMediaPlayerManagerEfl::RemovePlayerFromInitializeQueue( - int player_id) { - for(auto it = init_queue_.begin(); it != init_queue_.end(); ++it) { - if (*it == player_id) { - init_queue_.erase(it); - return; - } - } -} - -void BrowserMediaPlayerManagerEfl::RemovePlayerFromResumedQueue( - int player_id) { - for(auto it = resumed_queue_.begin(); it != resumed_queue_.end(); ++it) { - if (*it == player_id) { - resumed_queue_.erase(it); - return; - } - } -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.h b/tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.h deleted file mode 100644 index c6d1851..0000000 --- a/tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.h +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_MEDIA_EFL_BROWSER_MEDIA_PLAYER_MANAGER_EFL_H_ -#define CONTENT_BROWSER_MEDIA_EFL_BROWSER_MEDIA_PLAYER_MANAGER_EFL_H_ - -#include "base/memory/scoped_vector.h" -#include "content/common/media/efl/media_player_messages_enums_efl.h" -#include "content/public/browser/browser_message_filter.h" -#include "content/public/browser/render_frame_host.h" -#include "content/public/browser/web_contents_observer.h" -#include "media/base/efl/media_player_manager_efl.h" -#include "third_party/blink/public/platform/WebMediaPlayer.h" - -namespace content { - -// This class manages all the MediaPlayerEfl objects. It receives -// control operations from the the render process, and forwards -// them to corresponding MediaPlayerEfl object. Callbacks from -// MediaPlayerEfl objects are converted to IPCs and then sent to the -// render process. -class CONTENT_EXPORT BrowserMediaPlayerManagerEfl - : public media::MediaPlayerManager { - public: - // Returns a new instance using the registered factory if available. - static BrowserMediaPlayerManagerEfl* Create(RenderFrameHost* rfh); - ~BrowserMediaPlayerManagerEfl() override; - - BrowserMediaPlayerManagerEf(const BrowserMediaPlayerManagerEf&) = delete; - BrowserMediaPlayerManagerEf& operator=(const BrowserMediaPlayerManagerEf&) = - delete; - - // media::MediaPlayerManager implementation. - media::MediaPlayerEfl* GetPlayer(int player_id) override; - void OnTimeChanged(int player_id) override; - void OnTimeUpdate(int player_id, double current_time) override; - void OnPauseStateChange(int player_id, bool state) override; - void OnSeekStateChange(int player_id, bool state) override; - void OnRequestSeek(int player_id, double seek_time) override; - void OnBufferUpdate( - int player_id, - std::vector buffer_range) override; - void OnDurationChange(int player_id, double duration) override; - void OnReadyStateChange( - int player_id, - blink::WebMediaPlayer::ReadyState state) override; - void OnNetworkStateChange( - int player_id, - blink::WebMediaPlayer::NetworkState state) override; - void OnMediaDataChange(int player_id, int width, - int height, int media) override; - void OnNewFrameAvailable( - int player_id, - base::SharedMemoryHandle foreign_memory_handle, - uint32_t length, base::TimeDelta timestamp) override; - -#if defined(TIZEN_TBM_SUPPORT) - void OnNewTbmBufferAvailable( - int player_id, gfx::TbmBufferHandle tbm_handle, - base::TimeDelta timestamp) override; -#endif - - // Helper function to handle IPC from RenderMediaPlayerMangaerEfl. - virtual void OnPlay(int player_id); - virtual void OnPause(int player_id); - virtual void OnSetVolume(int player_id, double volume); - virtual void OnSetRate(int player_id, double rate); - virtual void OnInitialize( - int player_id, - MediaPlayerHostMsg_Initialize_Type type, - const GURL& url, - double volume, - int demuxer_client_id); - virtual void OnDestroy(int player_id); - virtual void OnSeek(int player_id, double time); - - protected: - // Clients must use Create() or subclass constructor. - explicit BrowserMediaPlayerManagerEfl(RenderFrameHost* render_frame_host); - - void AddPlayer(media::MediaPlayerEfl* player); - void RemovePlayer(int player_id); - - // To continue initializing of other players in queue. - virtual void OnInitComplete(int player_id, bool success); - - // To manage resumed/suspended player id. - virtual void OnResumeComplete(int player_id); - virtual void OnSuspendComplete(int player_id); - - // Helper function to send messages to RenderFrameObserver. - bool Send(IPC::Message* msg); - - int GetRoutingID(); - WebContents* web_contents() const { return web_contents_; } - - private: - void SuspendPlayers(); - void PausePlayers(int player_id); - void InitNextPlayer(); - void RemovePlayerFromInitializeQueue(int player_id); - void RemovePlayerFromResumedQueue(int player_id); - void CleanUpResumedQueue(); - - int current_player_; - - // An array of managed players. - ScopedVector players_; - RenderFrameHost* render_frame_host_; - WebContents* const web_contents_; - - // A queue to initialize player including preroll. - std::deque init_queue_; - std::deque resumed_queue_; -}; - -} // namespace content - -#endif // CONTENT_BROWSER_MEDIA_EFL_BROWSER_MEDIA_PLAYER_MANAGER_EFL_H_ diff --git a/tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.cc b/tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.cc deleted file mode 100644 index 025e131..0000000 --- a/tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.cc +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/media/media_web_contents_observer_efl.h" - -#include "content/browser/media/efl/browser_media_player_manager_efl.h" -#include "content/browser/renderer_host/render_process_host_impl.h" -#include "content/common/media/efl/media_player_messages_efl.h" -#include "content/public/browser/render_frame_host.h" -#include "content/public/browser/web_contents.h" -#include "ipc/ipc_message_macros.h" - -namespace content { - -MediaWebContentsObserver* CreateMediaWebContentsObserver( - WebContents* web_contents) { - return new MediaWebContentsObserver(web_contents); -} - -MediaWebContentsObserver::MediaWebContentsObserver(WebContents* web_contents) - : WebContentsObserver(web_contents) { -} - -MediaWebContentsObserver::~MediaWebContentsObserver() { -} - -void MediaWebContentsObserver::RenderFrameDeleted( - RenderFrameHost* render_frame_host) { - uintptr_t key = reinterpret_cast(render_frame_host); - media_player_managers_.erase(key); -} - - -bool MediaWebContentsObserver::OnMessageReceived( - const IPC::Message& msg, RenderFrameHost* render_frame_host) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(MediaWebContentsObserver, msg) - IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_Init, - GetMediaPlayerManager(render_frame_host), - BrowserMediaPlayerManagerEfl::OnInitialize) - IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_DeInit, - GetMediaPlayerManager(render_frame_host), - BrowserMediaPlayerManagerEfl::OnDestroy) - IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_Play, - GetMediaPlayerManager(render_frame_host), - BrowserMediaPlayerManagerEfl::OnPlay) - IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_Pause, - GetMediaPlayerManager(render_frame_host), - BrowserMediaPlayerManagerEfl::OnPause) - IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_SetVolume, - GetMediaPlayerManager(render_frame_host), - BrowserMediaPlayerManagerEfl::OnSetVolume) - IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_SetRate, - GetMediaPlayerManager(render_frame_host), - BrowserMediaPlayerManagerEfl::OnSetRate) - IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_Seek, - GetMediaPlayerManager(render_frame_host), - BrowserMediaPlayerManagerEfl::OnSeek) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; -} - -BrowserMediaPlayerManagerEfl* - MediaWebContentsObserver::GetMediaPlayerManager( - RenderFrameHost* render_frame_host) { - uintptr_t key = reinterpret_cast(render_frame_host); - if (!media_player_managers_.contains(key)) { - media_player_managers_.set( - key, - make_scoped_ptr( - BrowserMediaPlayerManagerEfl::Create(render_frame_host))); - } - return media_player_managers_.get(key); -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.h b/tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.h deleted file mode 100644 index 9e31a76..0000000 --- a/tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_MEDIA_MEDIA_WEB_CONTENTS_OBSERVER_EFL_H_ -#define CONTENT_BROWSER_MEDIA_MEDIA_WEB_CONTENTS_OBSERVER_EFL_H_ - -#include "base/compiler_specific.h" -#include "base/containers/scoped_ptr_hash_map.h" -#include "content/common/content_export.h" -#include "content/public/browser/web_contents_observer.h" - -namespace content { - -class BrowserMediaPlayerManagerEfl; - -// This class manages all RenderFrame based media related managers at the -// browser side. It receives IPC messages from media RenderFrameObservers and -// forwards them to the corresponding managers. The managers are responsible -// for sending IPCs back to the RenderFrameObservers at the render side. -class CONTENT_EXPORT MediaWebContentsObserver : public WebContentsObserver { - public: - explicit MediaWebContentsObserver(WebContents* web_contents); - MediaWebContentsObserver(const MediaWebContentsObserver&) = delete; - MediaWebContentsObserver& operator=(const MediaWebContentsObserver&) = delete; - virtual ~MediaWebContentsObserver(); - - MediaWebContentsObserver(const MediaWebContentsObserver&) = delete; - MediaWebContentsObserver& operator=(const MediaWebContentsObserver&) = delete; - - // WebContentsObserver implementations. - virtual void RenderFrameDeleted(RenderFrameHost* render_frame_host) override; - virtual bool OnMessageReceived(const IPC::Message& message, - RenderFrameHost* render_frame_host) override; - - // Gets the media player manager associated with |render_frame_host|. Creates - // a new one if it doesn't exist. The caller doesn't own the returned pointer. - BrowserMediaPlayerManagerEfl* GetMediaPlayerManager( - RenderFrameHost* render_frame_host); - - private: - // Map from RenderFrameHost* to BrowserMediaPlayerManagerEfl. - typedef base::ScopedPtrHashMap> - MediaPlayerManagerMap; - MediaPlayerManagerMap media_player_managers_; -}; - -} // namespace content - -#endif // CONTENT_BROWSER_MEDIA_MEDIA_WEB_CONTENTS_OBSERVER_EFL_H_ diff --git a/tizen_src/chromium_impl/content/common/common_efl.gni b/tizen_src/chromium_impl/content/common/common_efl.gni index be506cf..71e2ded 100644 --- a/tizen_src/chromium_impl/content/common/common_efl.gni +++ b/tizen_src/chromium_impl/content/common/common_efl.gni @@ -35,15 +35,6 @@ if (use_wayland) { ] } -if (tizen_multimedia_support) { - external_content_common_efl_configs += [ - "//tizen_src/build:capi-media-player", - "//tizen_src/build:libcapi-media-player", - "//tizen_src/build:gstreamer", - "//tizen_src/build:libgstreamer", - ] -} - ############################################################################## # Dependency ############################################################################## @@ -62,15 +53,15 @@ external_exclude_content_common_efl_sources = [] external_content_common_efl_sources = [ "//tizen_src/chromium_impl/content/common/content_client_export.cc", "//tizen_src/chromium_impl/content/common/content_client_export.h", + "//tizen_src/chromium_impl/content/common/cursors/webcursor_efl.cc", + "//tizen_src/chromium_impl/content/common/cursors/webcursor_efl.h", "//tizen_src/chromium_impl/content/common/locale_efl.cc", "//tizen_src/chromium_impl/content/common/locale_efl.h", "//tizen_src/chromium_impl/content/common/message_generator_efl.cc", "//tizen_src/chromium_impl/content/common/message_generator_efl.h", - "//tizen_src/chromium_impl/content/common/paths_efl.h", "//tizen_src/chromium_impl/content/common/paths_efl.cc", + "//tizen_src/chromium_impl/content/common/paths_efl.h", "//tizen_src/chromium_impl/content/common/render_messages_efl.h", - "//tizen_src/chromium_impl/content/common/cursors/webcursor_efl.cc", - "//tizen_src/chromium_impl/content/common/cursors/webcursor_efl.h", "//tizen_src/chromium_impl/content/common/wrt/wrt_url_parse.h", ] @@ -81,14 +72,3 @@ if (is_tizen) { "//tizen_src/chromium_impl/content/common/tts_utterance_request_efl.h", ] } - -if (tizen_multimedia_support) { - external_content_common_efl_sources += [ - "//tizen_src/chromium_impl/content/common/media/efl/media_player_messages_enums_efl.h", - "//tizen_src/chromium_impl/content/common/media/efl/media_player_messages_efl.h", - "//tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.h", - "//tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.cc", - "//tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.h", - "//tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.cc", - ] -} diff --git a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.cc b/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.cc deleted file mode 100644 index 0af40ee..0000000 --- a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.cc +++ /dev/null @@ -1,589 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/common/gpu/media/efl/tizen_video_decode_accelerator.h" - -#include -#include -#include -#include -#include -#include - -#include "base/bind.h" -#include "base/memory/shared_memory.h" -#include "base/message_loop/message_loop.h" -#include "base/process/process.h" -#include "base/synchronization/waitable_event.h" -#include "base/thread_task_runner_handle.h" -#include "base/timer/timer.h" -#include "media/base/video_frame.h" - -using media::VideoFrame; - -namespace { - -struct GstElementDeleter { - void operator()(GstElement* ptr) const { - DCHECK(ptr != NULL); - gst_object_unref(ptr); - } -}; - -// Gstreamer elements and names. -const char* kDecoderName = "decoder"; -const char* kParserElement = "h264parse"; -#if defined(TIZEN_MULTIMEDIA_USE_HW_CODEC) -const char* kDecoderGstElement = "omxh264dec"; -const char* kVideoConvertElement = "fimcconvert"; -const char* kCapsFilterElement = "capsfilter"; -#else -const char* kDecoderGstElement = "avdec_h264"; -#endif - -} // namespace - -namespace content { - -enum { - MAX_BITRATE = 2000000, // bps. - INPUT_BUFFER_SIZE = MAX_BITRATE / 8, // bytes. 1 sec for H.264 HD video. - ID_LAST = 0x3FFFFFFF, // wrap round ID after this -}; - -media::VideoDecodeAccelerator* CreateTizenVideoDecodeAccelerator() { - return new TizenVideoDecodeAccelerator(); -} - -media::VideoDecodeAccelerator::SupportedProfiles GetSupportedTizenProfiles() { - media::VideoDecodeAccelerator::SupportedProfiles profiles; - media::VideoDecodeAccelerator::SupportedProfile profile; - profile.profile = media::H264PROFILE_MAIN; - profile.min_resolution.SetSize(0, 0); - profile.max_resolution.SetSize(1920, 1080); // FHD - profiles.push_back(profile); - - return profiles; -} - -struct TizenVideoDecodeAccelerator::BitstreamBufferRef { - BitstreamBufferRef( - base::WeakPtr client, - const scoped_refptr& client_task_runner, - base::SharedMemory* shm, - size_t size, - int32_t input_id) - : client_(client), - client_task_runner_(client_task_runner), - shm_(shm), - size_(size), - bytes_used_(0), - input_id_(input_id), - gst_buffer_(NULL) {} - - ~BitstreamBufferRef() { - if (input_id_ < 0) - return; - client_task_runner_->PostTask( - FROM_HERE, - base::BindOnce( - &media::VideoDecodeAccelerator::Client::NotifyEndOfBitstreamBuffer, - client_, input_id_)); - } - - static void Destruct(gpointer data) { - DCHECK(data != NULL); - BitstreamBufferRef* pRef = static_cast(data); - delete pRef; - } - - base::WeakPtr client_; - scoped_refptr client_task_runner_; - scoped_ptr shm_; - size_t size_; - off_t bytes_used_; - int32_t input_id_; - GstBuffer* gst_buffer_; -}; - -struct TizenVideoDecodeAccelerator::Impl { - Impl() - : can_feed_(true), - is_destroying_(false), - pipeline_(NULL), - sink_(NULL), - appsrc_(NULL), - io_task_runner_(base::ThreadTaskRunnerHandle::Get()), - gst_thread_("TizenDecoderThreadGst"), - bitstream_buffer_id_(0), - caps_width_(0), - caps_height_(0) {} - - void DeliverVideoFrame(GstSample* sample, gfx::Rect frame_size); - bool CreateAppSrcElement(); - bool CreateAppSinkElement(); - static GstFlowReturn OnDecoded(GstAppSink* sink, gpointer app_data); - static void OnSinkCapsChanged(GstPad* sink_pad, GParamSpec* gparamspec, - void* user_data); - - static GstBusSyncReply OnBusMessage( - GstBus* bus, GstMessage* msg, gpointer data) { - switch (GST_MESSAGE_TYPE(msg)) { - case GST_MESSAGE_ERROR: { - gchar* debug = NULL; - GError* error = NULL; - gst_message_parse_error(msg, &error, &debug); - LOG(ERROR) << " GSTError happens from bus at " - << GST_OBJECT_NAME(msg->src) - << ":" << error->message; - LOG(ERROR) << " Debugging Info: " - << (debug != NULL ? debug : "none"); - g_error_free(error); - g_free(debug); - break; - } - default: - break; - } - return GST_BUS_PASS; - } - - static void StartFeed(GstAppSrc* source, guint size, gpointer app) { - DCHECK(source); - content::TizenVideoDecodeAccelerator::Impl* impl = - static_cast(app); - impl->can_feed_ = true; - } - - static void StopFeed(GstAppSrc* source, gpointer app) { - DCHECK(source); - content::TizenVideoDecodeAccelerator::Impl* impl = - static_cast(app); - impl->can_feed_ = false; - } - - volatile bool can_feed_; - volatile bool is_destroying_; - GstElement* pipeline_; - GstElement* sink_; - GstElement* appsrc_; - scoped_refptr io_task_runner_; - scoped_ptr > io_client_weak_factory_; - base::Thread gst_thread_; - int bitstream_buffer_id_; - int caps_width_; - int caps_height_; -}; - -TizenVideoDecodeAccelerator::TizenVideoDecodeAccelerator() - : impl_(NULL) { -} - -TizenVideoDecodeAccelerator::~TizenVideoDecodeAccelerator() { -} - -bool TizenVideoDecodeAccelerator::Initialize(const Config& config, - Client* client) { - GError* error = NULL; - GstElement* gst_decoder = NULL; - GstElement* gst_parser = NULL; - GstBus* gst_bus = NULL; - GstPad* video_sink_pad = NULL; - scoped_ptr gst_pipeline; - CHECK(impl_ == NULL); - impl_ = new Impl(); - impl_->io_client_weak_factory_.reset( - new base::WeakPtrFactory(client)); - - switch (config.profile) { - case media::H264PROFILE_BASELINE: - DVLOG(1) << "Initialize(): profile -> H264PROFILE_BASELINE"; - break; - case media::H264PROFILE_MAIN: - DVLOG(1) << "Initialize(): profile -> H264PROFILE_MAIN"; - break; - default: - LOG(ERROR) << "Initialize(): unsupported profile=" << config.profile; - return false; - }; - - if (!gst_is_initialized() && !gst_init_check(NULL, NULL, &error)) { - LOG(ERROR) << "Cannot initialize gstreamer."; - g_error_free(error); - return false; - } - - // pipeline initialization. - gst_pipeline.reset(gst_pipeline_new("h264_decode")); - if (!gst_pipeline) { - LOG(ERROR) << "Cannot initialize gst pipeline."; - return false; - } - if (!(gst_bus = gst_pipeline_get_bus(GST_PIPELINE(gst_pipeline.get())))) { - return false; - } - gst_bus_set_sync_handler(gst_bus, Impl::OnBusMessage, impl_, NULL); - gst_object_unref(gst_bus); - - // appsrc initialization. - if (!impl_->CreateAppSrcElement()) { - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), impl_->appsrc_)) { - gst_object_unref(impl_->appsrc_); - impl_->appsrc_ = NULL; - return false; - } - - DVLOG(1) << "######################################"; - DVLOG(1) << "USING " << kDecoderGstElement <<" DECODER "; - DVLOG(1) << "######################################"; - - // decoder initialization. - if (!(gst_decoder = gst_element_factory_make(kDecoderGstElement, - kDecoderName))) { - LOG(ERROR) << "Cannot create " << kDecoderGstElement << "."; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), gst_decoder)) { - LOG(ERROR) << "Cannot add " << kDecoderGstElement << " to pipeline."; - gst_object_unref(gst_decoder); - return false; - } - - // parser initialization - if (!(gst_parser = gst_element_factory_make(kParserElement, "h264parse"))) { - LOG(ERROR) << "Cannot create " << kParserElement; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), gst_parser)) { - LOG(ERROR) << "Cannot add " << kParserElement << " into decoder pipeline."; - gst_object_unref(gst_parser); - return false; - } - - // appsink initialization - if (!impl_->CreateAppSinkElement()) { - LOG(ERROR) << "Could not create and add appsink element"; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), impl_->sink_)) { - gst_object_unref(impl_->sink_); - impl_->sink_ = NULL; - return false; - } - -#if defined(TIZEN_MULTIMEDIA_USE_HW_CODEC) - GstElement* video_filter = NULL; - GstElement* gst_converter = NULL; - if (!(gst_converter = gst_element_factory_make(kVideoConvertElement, - kVideoConvertElement))) { - LOG(ERROR) << "Cannot create "<< kVideoConvertElement; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), gst_converter)) { - LOG(ERROR) << "Cannot add " << kVideoConvertElement << " into pipeline."; - gst_object_unref(gst_converter); - return false; - } - if (!(video_filter = gst_element_factory_make(kCapsFilterElement, - kCapsFilterElement))) { - LOG(ERROR) << "Cannot create " << kCapsFilterElement; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), video_filter)) { - LOG(ERROR) << "Cannot add " << kCapsFilterElement << " into pipeline."; - gst_object_unref(video_filter); - return false; - } -#endif - - if (!(video_sink_pad = - gst_element_get_static_pad(impl_->sink_, "sink"))) { - LOG(ERROR) << "Could not create video sink pad"; - return false; - } - g_signal_connect( - video_sink_pad, "notify::caps", - G_CALLBACK(&Impl::OnSinkCapsChanged), impl_); - gst_object_unref(video_sink_pad); - - if (!gst_element_link_many(impl_->appsrc_, gst_parser, gst_decoder, -#if defined(TIZEN_MULTIMEDIA_USE_HW_CODEC) - gst_converter, video_filter, -#endif - impl_->sink_, NULL)) { - LOG(ERROR) << "Cannot link some elements in decode pipeline"; - return false; - } - -#if defined(USE_OMX_DECODER) - g_object_set(G_OBJECT(video_filter), "caps", - gst_caps_new_simple("video/x-raw", - "format", G_TYPE_STRING, "I420", - NULL), NULL); -#endif - - if (!impl_->gst_thread_.Start()) { - LOG(ERROR) << "gst_thread_ failed to start"; - return false; - } - - GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(gst_pipeline.get()), - GST_DEBUG_GRAPH_SHOW_ALL, - "decoder_graph.dot"); - - impl_->pipeline_ = gst_pipeline.release(); - - impl_->gst_thread_.message_loop()->PostTask( - FROM_HERE, base::BindOnce(&TizenVideoDecodeAccelerator::StartDecoder, - base::Unretained(this))); - return true; -} - -void TizenVideoDecodeAccelerator::Decode( - const media::BitstreamBuffer& bitstream_buffer) { - scoped_ptr buffer_ref; - scoped_ptr shm( - new base::SharedMemory(bitstream_buffer.handle(), true)); - - if (!shm->Map(bitstream_buffer.size())) { - LOG(ERROR) << "Could not map bitstream_buffer"; - NotifyError(media::VideoDecodeAccelerator::UNREADABLE_INPUT); - return; - } - - buffer_ref.reset(new BitstreamBufferRef( - impl_->io_client_weak_factory_->GetWeakPtr(), - base::ThreadTaskRunnerHandle::Get(), - shm.release(), - bitstream_buffer.size(), - bitstream_buffer.id())); - - if (!buffer_ref) { - return; - } - - if (impl_->can_feed_ && !impl_->is_destroying_) { - impl_->gst_thread_.message_loop()->PostTask( - FROM_HERE, - base::BindOnce(&TizenVideoDecodeAccelerator::OnDecode, - base::Unretained(this), base::Passed(&buffer_ref))); - } else { - DVLOG(2) << "Frame drop on decoder:" - << " INPUT Q is FULL"; - } -} - -void TizenVideoDecodeAccelerator::AssignPictureBuffers( - const std::vector& buffers) { - NOTIMPLEMENTED(); -} - -void TizenVideoDecodeAccelerator::ReusePictureBuffer( - int32_t picture_buffer_id) { - NOTIMPLEMENTED(); -} - -void TizenVideoDecodeAccelerator::Flush() { - NOTIMPLEMENTED(); -} - -void TizenVideoDecodeAccelerator::Reset() { - NOTIMPLEMENTED(); -} - -void TizenVideoDecodeAccelerator::Destroy() { - if (impl_ != NULL) { - if (impl_->gst_thread_.IsRunning()) { - impl_->gst_thread_.Stop(); - } - - if (impl_->appsrc_) - gst_app_src_end_of_stream(GST_APP_SRC(impl_->appsrc_)); - - impl_->is_destroying_ = true; - if (impl_->pipeline_) { - gst_element_set_state(impl_->pipeline_, GST_STATE_NULL); - gst_object_unref(GST_OBJECT(impl_->pipeline_)); - impl_->pipeline_ = NULL; - } - delete impl_; - impl_ = NULL; - } - delete this; -} - -bool TizenVideoDecodeAccelerator::CanDecodeOnIOThread(){ - return false; -} - -void TizenVideoDecodeAccelerator::StartDecoder() { - gst_element_set_state(impl_->pipeline_, GST_STATE_PLAYING); -}; - -void TizenVideoDecodeAccelerator::Impl::OnSinkCapsChanged( - GstPad* sink_pad, GParamSpec* gparamspec, void* user_data) { - content::TizenVideoDecodeAccelerator::Impl* impl = - static_cast(user_data); - GstCaps* caps = gst_pad_get_current_caps(GST_PAD(sink_pad)); - if (!caps) - return; - GstVideoInfo info; - gst_video_info_init(&info); - if (gst_video_info_from_caps(&info, caps)) { - impl->caps_width_ = info.width; - impl->caps_height_ = info.height; - } - gst_caps_unref(caps); -} - -GstFlowReturn TizenVideoDecodeAccelerator::Impl::OnDecoded( - GstAppSink* sink, gpointer app_data) { - content::TizenVideoDecodeAccelerator::Impl* self = - static_cast(app_data); - GstSample* sample = gst_app_sink_pull_sample(GST_APP_SINK(sink)); - if (!sample) { - LOG(ERROR) << "DECODING FRAME FAILED : frame_id " - << self->bitstream_buffer_id_; - return GST_FLOW_ERROR; - } - // FIXME: SONAL - // OnSinkCapsChanged callback is not called for Appsink on Tizen, - // This is an alternate approach to get sample info. -#if !BUILDFLAG(IS_TIZEN) - if (!self->caps_width_ || !self->caps_height_) { - const GstStructure* str = gst_sample_get_info(sample); - if (!str || - !gst_structure_get_int(str, "width", &self->caps_width_) || - !gst_structure_get_int(str, "height", &self->caps_height_)) { - LOG(ERROR) << "Buffer information could not be obtained"; - gst_sample_unref(sample); - return GST_FLOW_ERROR; - } - } -#endif - gfx::Rect frame_size = - gfx::Rect(self->caps_width_, self->caps_height_); - self->gst_thread_.message_loop()->PostTask( - FROM_HERE, - base::BindOnce(&TizenVideoDecodeAccelerator::Impl::DeliverVideoFrame, - base::Unretained(self), sample, frame_size)); - return GST_FLOW_OK; -} - -bool TizenVideoDecodeAccelerator::Impl::CreateAppSrcElement() { - if (!(appsrc_ = gst_element_factory_make("appsrc", "src"))) { - LOG(ERROR) << "Cannot initialize gst appsrc."; - return false; - } - static GstAppSrcCallbacks appsrc_callbacks = - {&Impl::StartFeed, &Impl::StopFeed, NULL}; - gst_app_src_set_max_bytes(GST_APP_SRC(appsrc_), INPUT_BUFFER_SIZE); - gst_app_src_set_callbacks(GST_APP_SRC(appsrc_), &appsrc_callbacks, - static_cast(this), NULL); - g_object_set(G_OBJECT(appsrc_), - "is-live", TRUE, - "block", FALSE, - "min-percent", 80, // if buffer below 80%, need-data emits. - "stream-type", GST_APP_STREAM_TYPE_STREAM, - NULL); - GstCaps* video_caps = gst_caps_from_string("video/x-h264,framerate=30/1"); - if (!video_caps) { - gst_object_unref(appsrc_); - return false; - } - gst_app_src_set_caps(GST_APP_SRC(appsrc_), video_caps); - gst_caps_unref(video_caps); - return true; -} - -bool TizenVideoDecodeAccelerator::Impl::CreateAppSinkElement() { - if (!(sink_ = gst_element_factory_make("appsink", "sink"))) { - LOG(ERROR) << "Appsink could not be created"; - return false; - } - - GstAppSinkCallbacks appsink_callbacks = {NULL, NULL, &OnDecoded, NULL}; - gst_app_sink_set_callbacks(GST_APP_SINK(sink_), - &appsink_callbacks, - static_cast(this), - NULL); - gst_app_sink_set_max_buffers(GST_APP_SINK(sink_), 1); - return true; -} - -void TizenVideoDecodeAccelerator::Impl::DeliverVideoFrame( - GstSample* sample, gfx::Rect frame_size) { - base::SharedMemory shared_memory; - base::SharedMemoryHandle shared_memory_handle; - - GstBuffer* buffer = gst_sample_get_buffer(sample); - GstMapInfo map; - if (!buffer || !gst_buffer_map(buffer, &map, GST_MAP_READ)) { - LOG(ERROR) << "No Decoded Buffer or contains invalid info!"; - gst_sample_unref(sample); - return; - } - - if (!map.data || !(map.size > 0) || - !shared_memory.CreateAndMapAnonymous(map.size)) { - LOG(ERROR) << "Shared Memory creation failed."; - } else { - if (!shared_memory.ShareToProcess(base::GetCurrentProcessHandle(), - &shared_memory_handle)) { - LOG(ERROR) << "Could not get handle of Shared Memory"; - } else { - memcpy(shared_memory.memory(), map.data, map.size); - io_task_runner_->PostTask( - FROM_HERE, - base::BindOnce( - &media::VideoDecodeAccelerator::Client::NotifyDecodeDone, - io_client_weak_factory_->GetWeakPtr(), shared_memory_handle, - bitstream_buffer_id_, map.size, frame_size)); - bitstream_buffer_id_ = (bitstream_buffer_id_ + 1) & ID_LAST; - } - } - gst_buffer_unmap(buffer, &map); - gst_sample_unref(sample); -} - -void TizenVideoDecodeAccelerator::OnDecode( - scoped_ptr buffer_ref) { - if (!buffer_ref) { - return; - } - buffer_ref->gst_buffer_ = - gst_buffer_new_wrapped_full( - GST_MEMORY_FLAG_READONLY, - static_cast(buffer_ref->shm_->memory()), - buffer_ref->size_, - 0, - buffer_ref->size_, - reinterpret_cast(buffer_ref.get()), - BitstreamBufferRef::Destruct); - if (!buffer_ref->gst_buffer_ || !GST_IS_BUFFER(buffer_ref->gst_buffer_)) { - LOG(ERROR) << " gst_buffer_new_wrapped_full failed to allocate memory.!"; - return; - } - if (GST_FLOW_OK != - gst_app_src_push_buffer(GST_APP_SRC(impl_->appsrc_), - buffer_ref->gst_buffer_)) { - LOG(ERROR) << " fail to push buffer into decoder pipeline"; - return; - } - - // lifecycle of buffer_ref will be handled by gstreamer. - ignore_result(buffer_ref.release()); -} - -void TizenVideoDecodeAccelerator::NotifyError( - media::VideoDecodeAccelerator::Error error) { - if (impl_->io_client_weak_factory_->GetWeakPtr()) { - impl_->io_client_weak_factory_->GetWeakPtr()->NotifyError(error); - } -} - -} // namespace content - diff --git a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.h b/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.h deleted file mode 100644 index 1e34431..0000000 --- a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_COMMON_GPU_MEDIA_EFL_TIZEN_VIDEO_DECODE_ACCELERATOR_H_ -#define CONTENT_COMMON_GPU_MEDIA_EFL_TIZEN_VIDEO_DECODE_ACCELERATOR_H_ - -#include "base/synchronization/lock.h" -#include "base/threading/thread.h" -#include "content/common/content_export.h" -#include "media/video/video_decode_accelerator.h" - -namespace content { - -class CONTENT_EXPORT TizenVideoDecodeAccelerator - : public media::VideoDecodeAccelerator { - public: - TizenVideoDecodeAccelerator(); - ~TizenVideoDecodeAccelerator() override; - - TizenVideoDecodeAccelerator(const TizenVideoDecodeAccelerator&) = delete; - TizenVideoDecodeAccelerator& operator=(const TizenVideoDecodeAccelerator&) = - delete; - - bool Initialize(const Config& config, Client* client) override; - void Decode(const media::BitstreamBuffer& bitstream_buffer) override; - void AssignPictureBuffers( - const std::vector& buffers) override; - void ReusePictureBuffer(int32_t picture_buffer_id) override; - void Flush() override; - void Reset() override; - void Destroy() override; - bool CanDecodeOnIOThread() override; - - private: - struct BitstreamBufferRef; - struct Impl; - - void OnDecode(scoped_ptr buffer_ref); - void NotifyError(media::VideoDecodeAccelerator::Error error); - void StartDecoder(); - - Impl* impl_; -}; - -} // namespace content - -#endif // CONTENT_COMMON_GPU_MEDIA_EFL_TIZEN_VIDEO_DECODE_ACCELERATOR_H_ diff --git a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.cc b/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.cc deleted file mode 100644 index 7fcd204..0000000 --- a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.cc +++ /dev/null @@ -1,617 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/common/gpu/media/efl/tizen_video_encode_accelerator.h" - -#include -#include -#include -#include - -#include "base/bind.h" -#include "base/command_line.h" -#include "base/logging.h" -#include "base/message_loop/message_loop.h" -#include "base/thread_task_runner_handle.h" -#include "base/timer/timer.h" -#include "gpu/command_buffer/service/gpu_switches.h" -#include "media/base/bitstream_buffer.h" -#include "media/base/video_frame.h" -#include "third_party/webrtc/common_video/libyuv/include/webrtc_libyuv.h" - -using media::VideoFrame; - -namespace content { - -struct GstElementDeleter { - inline void operator()(GstElement* ptr) const { - DCHECK(ptr != NULL); - gst_object_unref(ptr); - } -}; - -enum { - // Arbitrary choice. - INITIAL_FRAMERATE = 30, - // Until there are non-realtime users, no need for unrequested I-frames. - INPUT_BUFFER_COUNT = 5, // default input buffer counts of omx_h264enc - MAX_BUFFERING = 60, - MAX_FRAME_RATE = 30, - MAX_BITRATE = 2000000, // Max bitrate in bps - MAX_OUTPUT_BUFFERS = 30, // Maximum queue size of output buffers - MAX_WIDTH = 1280, - MAX_HEIGHT = 720, -}; - -// Gstreamer elements and names. -const char* kEncoderName = "encoder"; -#if BUILDFLAG(IS_TIZEN) -const char* kEncoderGstElement = "omxh264enc"; -const char* kBitrateProperty = "target-bitrate"; -#else -const char* kEncoderGstElement = "x264enc"; -const char* kBitrateProperty = "bitrate"; -#endif - -media::VideoEncodeAccelerator* CreateTizenVideoEncodeAccelerator() { - return new TizenVideoEncodeAccelerator(); -} - -struct TizenVideoEncodeAccelerator::BitstreamBufferRef { - BitstreamBufferRef( - const scoped_refptr& frame, - base::WeakPtr client_delegate, - const scoped_refptr& client_task_runner, - size_t size) - : frame_(frame), - client_delegate_(client_delegate), - client_task_runner_(client_task_runner), - size_(size), - bytes_used_(0), - gst_buffer_(NULL) {} - - ~BitstreamBufferRef() {} - - static void Destruct(gpointer data) { - DCHECK(data != NULL); - BitstreamBufferRef* pRef = static_cast(data); - delete pRef; - } - - scoped_refptr frame_; - base::WeakPtr client_delegate_; - scoped_refptr client_task_runner_; - size_t size_; - off_t bytes_used_; - GstBuffer* gst_buffer_; -}; - -struct TizenVideoEncodeAccelerator::OutputBuffer { - explicit OutputBuffer( - GstBuffer* buffer, - bool key_frame) - : buffer_(buffer), - key_frame_(key_frame) {} - - virtual ~OutputBuffer() { - if (buffer_) - gst_buffer_unref(buffer_); - buffer_ = NULL; - } - - GstBuffer* buffer_; - bool key_frame_; -}; - -struct TizenVideoEncodeAccelerator::Impl { - Impl(media::VideoEncodeAccelerator::Client* client, - scoped_refptr msg_loop) - : pipeline_(NULL), - encoder_(NULL), - appsrc_(NULL), - gst_thread_("TizenEncoderThreadGst"), - enable_framedrop_(false), - io_client_weak_factory_(client), - child_task_runner_(msg_loop), - gst_bitrate_(0), - is_running_(false), - is_destroying_(false), - can_feed_(false) {} - - void DeliverVideoFrame(); - bool CreateAppSrcElement(); - static GstFlowReturn OnEncoded(GstAppSink *sink,gpointer data); - static void StartFeed(GstAppSrc *source, guint size, gpointer data); - static void StopFeed(GstAppSrc *source, gpointer data); - - GstElement* pipeline_; - GstElement* encoder_; - GstElement* appsrc_; - base::Thread gst_thread_; - bool enable_framedrop_; - std::vector encoder_output_queue_; - base::WeakPtrFactory< - media::VideoEncodeAccelerator::Client> io_client_weak_factory_; - const scoped_refptr child_task_runner_; - base::Lock destroy_lock_; - base::ThreadChecker thread_checker_; - gfx::Size view_size_; - uint32_t gst_bitrate_; - volatile bool is_running_; - volatile bool is_destroying_; - volatile bool can_feed_; - base::RepeatingTimer io_timer_; - std::queue output_buffers_; - base::Lock output_queue_lock_; -}; - -void TizenVideoEncodeAccelerator::Impl::DeliverVideoFrame() { - media::BitstreamBuffer* bs_buffer = NULL; - bool key_frame = false; - GstMapInfo map; - scoped_ptr shm; - scoped_ptr out_buffer = NULL; - - if (output_buffers_.empty()) - return; - - if (encoder_output_queue_.empty()) { - // Observed till now that output_buffers_ size does not exceed 4-5. - // Therefore this code will be called in very rare situations. - if (output_buffers_.size() >= MAX_OUTPUT_BUFFERS) { - enable_framedrop_ = true; - base::AutoLock auto_lock(output_queue_lock_); - while (!output_buffers_.empty()) { - out_buffer.reset(output_buffers_.front()); - if (out_buffer->key_frame_) - break; - output_buffers_.pop(); - out_buffer.reset(NULL); - } - } - return; - } - enable_framedrop_ = false; - key_frame = output_buffers_.front()->key_frame_; - bs_buffer = &encoder_output_queue_.back(); - encoder_output_queue_.pop_back(); - - shm.reset(new base::SharedMemory(bs_buffer->handle(), false)); - if (!shm->Map(bs_buffer->size())) { - LOG(ERROR) << "Failed to map SHM"; - io_client_weak_factory_.GetWeakPtr()->NotifyError( - media::VideoEncodeAccelerator::kPlatformFailureError); - return; - } - { - base::AutoLock auto_lock(output_queue_lock_); - out_buffer.reset(output_buffers_.front()); - output_buffers_.pop(); - } - - if (!gst_buffer_map(out_buffer->buffer_, &map, GST_MAP_READ)) { - LOG(ERROR) << "Encoded Buffer contains invalid or no info.!"; - return; - } - - if (!map.data && map.size > shm->mapped_size()) { - LOG(ERROR) << "Encoded buff too large: " - << map.size << ">" << shm->mapped_size(); - io_client_weak_factory_.GetWeakPtr()->NotifyError( - media::VideoEncodeAccelerator::kPlatformFailureError); - } else { - //copying data to shared memory. - memcpy(static_cast(shm->memory()), map.data, map.size); - child_task_runner_->PostTask( - FROM_HERE, - base::BindOnce( - &media::VideoEncodeAccelerator::Client::BitstreamBufferReady, - io_client_weak_factory_.GetWeakPtr(), bs_buffer->id(), map.size, - key_frame)); - } - gst_buffer_unmap(out_buffer->buffer_, &map); -} - -bool TizenVideoEncodeAccelerator::Impl::CreateAppSrcElement() { - if (!(appsrc_ = gst_element_factory_make ("appsrc", "src"))) { - LOG(ERROR) << "Cannot initialize gst appsrc."; - return false; - } - GstCaps* appsrc_caps = gst_caps_new_simple( - "video/x-raw", - "format", G_TYPE_STRING, "I420", - "width", G_TYPE_INT, view_size_.width(), - "height", G_TYPE_INT, view_size_.height(), - "framerate", GST_TYPE_FRACTION, 30, 1, - "rotate", G_TYPE_INT, 0, - NULL); - GstAppSrcCallbacks appsrc_callbacks = - { &TizenVideoEncodeAccelerator::Impl::StartFeed, - &TizenVideoEncodeAccelerator::Impl::StopFeed, - NULL }; - - guint64 max_input_buffer = - INPUT_BUFFER_COUNT * VideoFrame::AllocationSize(media::PIXEL_FORMAT_I420, - view_size_); - gst_app_src_set_callbacks(GST_APP_SRC(appsrc_), &appsrc_callbacks, - static_cast(this), NULL); - gst_app_src_set_max_bytes(GST_APP_SRC(appsrc_), max_input_buffer); - gst_app_src_set_caps(GST_APP_SRC(appsrc_), appsrc_caps); - - g_object_set(G_OBJECT(appsrc_), - "is-live", TRUE, - "block", FALSE, - "do-timestamp", TRUE, - "min-latency", (gint64)(0), - "max-latency", (gint64)(0), - "min-percent", 80, // if buffer below 80%, need-data emits. - "stream-type", GST_APP_STREAM_TYPE_STREAM, - "format", GST_FORMAT_DEFAULT, - NULL); - gst_caps_unref(appsrc_caps); - return true; -} - -GstFlowReturn TizenVideoEncodeAccelerator::Impl::OnEncoded( - GstAppSink *sink, gpointer data) { - TizenVideoEncodeAccelerator::Impl* impl = - static_cast(data); - - GstSample* sample = gst_app_sink_pull_sample(GST_APP_SINK(sink)); - GstBuffer* buffer = gst_sample_get_buffer(sample); - GstMapInfo map; - if (!buffer || !gst_buffer_map(buffer, &map, GST_MAP_READ)) { - LOG(ERROR) << "Encoded Buffer contains invalid or no info!"; - gst_sample_unref(sample); - return GST_FLOW_ERROR; - } - - if (map.data) { - bool key_frame = false; - if (!GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT)) { - key_frame = true; - } - base::AutoLock auto_lock(impl->output_queue_lock_); - impl->output_buffers_.push( - new TizenVideoEncodeAccelerator::OutputBuffer(gst_buffer_ref(buffer), - key_frame)); - } - gst_buffer_unmap(buffer, &map); - gst_sample_unref(sample); - return GST_FLOW_OK; -} - -void TizenVideoEncodeAccelerator::Impl::StartFeed( - GstAppSrc* source, guint size, gpointer data) { - TizenVideoEncodeAccelerator::Impl* impl = - static_cast(data); - DCHECK(impl); - impl->can_feed_ = true; -} - -void TizenVideoEncodeAccelerator::Impl::StopFeed( - GstAppSrc* source, gpointer data) { - TizenVideoEncodeAccelerator::Impl* impl = - static_cast(data); - DCHECK(impl); - impl->can_feed_ = false; -} - -TizenVideoEncodeAccelerator::TizenVideoEncodeAccelerator() - : impl_(NULL) {} - -TizenVideoEncodeAccelerator::~TizenVideoEncodeAccelerator() {} - -std::vector -TizenVideoEncodeAccelerator::GetSupportedProfiles() { - std::vector profiles; - media::VideoEncodeAccelerator::SupportedProfile profile; - profile.profile = media::H264PROFILE_BASELINE; - profile.max_resolution.SetSize(MAX_WIDTH, MAX_HEIGHT); - profile.max_framerate_numerator = MAX_FRAME_RATE; - profile.max_framerate_denominator = 1; - profiles.push_back(profile); - - return profiles; -} - -bool TizenVideoEncodeAccelerator::Initialize( - media::VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - media::VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) { - DVLOG(1) << " size :" << input_visible_size.ToString() - << " max bitrate :" << MAX_BITRATE << "bps"; - DCHECK(impl_ == NULL); - if (media::H264PROFILE_MIN > output_profile || - media::H264PROFILE_MAX < output_profile) { - NOTREACHED(); - return false; - } - - impl_ = new Impl(client, base::ThreadTaskRunnerHandle::Get()); - impl_->gst_bitrate_ = initial_bitrate; - impl_->view_size_ = input_visible_size; - impl_->gst_thread_.Start(); - - if (!StartEncoder()) { - delete impl_; - impl_ = NULL; - return false; - } - - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce( - &media::VideoEncodeAccelerator::Client::RequireBitstreamBuffers, - impl_->io_client_weak_factory_.GetWeakPtr(), - (unsigned int)INPUT_BUFFER_COUNT, input_visible_size, - MAX_BITRATE / 8)); // Maximum bytes for a frame by MAX_BITRATE. - return true; -} - -void TizenVideoEncodeAccelerator::Encode( - const scoped_refptr& frame, - bool force_keyframe) { - size_t frame_size = VideoFrame::AllocationSize(media::PIXEL_FORMAT_I420, - frame->coded_size()); - DVLOG(3) << " coded_size :" << frame->coded_size().ToString() - << " natural_size :" << frame->natural_size().ToString(); - - scoped_ptr buffer_ref; - - buffer_ref.reset( - new BitstreamBufferRef(frame, - impl_->io_client_weak_factory_.GetWeakPtr(), - impl_->child_task_runner_, - frame_size)); - - if (!buffer_ref) { - LOG(ERROR) << "malloc failed"; - return; - } - - if (impl_->can_feed_ && !impl_->is_destroying_) { - impl_->gst_thread_.message_loop()->PostTask( - FROM_HERE, base::BindOnce(&TizenVideoEncodeAccelerator::OnEncode, - base::Unretained(this), - base::Passed(&buffer_ref), force_keyframe)); - } else { - DVLOG(2) << " [WEBRTC] . FRAME DROP :" - << " can_feed_:" << impl_->can_feed_ - << " is_destroying_:" << impl_->is_destroying_; - } -} - -void TizenVideoEncodeAccelerator::UseOutputBitstreamBuffer( - const media::BitstreamBuffer& buffer) { - impl_->gst_thread_.message_loop()->PostTask( - FROM_HERE, - base::BindOnce(&TizenVideoEncodeAccelerator::OnUseOutputBitstreamBuffer, - base::Unretained(this), buffer)); -} - -void TizenVideoEncodeAccelerator::RequestEncodingParametersChange( - uint32_t bitrate, uint32_t framerate) { - DVLOG(2) << " bitrate: " << bitrate - << " framerate: " << framerate; - if (bitrate > 0 && bitrate != impl_->gst_bitrate_) { - impl_->gst_bitrate_ = bitrate; - // Omx Encoder expects bitrate in bps whereas ffenc expects bitrate in kbps - // Information can be gained by gst-inspect - g_object_set(G_OBJECT(impl_->encoder_), kBitrateProperty, -#if BUILDFLAG(IS_TIZEN) - std::min(bitrate, static_cast(MAX_BITRATE)), -#else - std::min(bitrate, static_cast(MAX_BITRATE)) / 1000, -#endif - NULL); - } -} - -void TizenVideoEncodeAccelerator::Destroy() { - if (impl_) { - DCHECK(impl_->thread_checker_.CalledOnValidThread()); - if (impl_->appsrc_) - gst_app_src_end_of_stream(GST_APP_SRC(impl_->appsrc_)); - - { - base::AutoLock auto_lock(impl_->destroy_lock_); - impl_->is_destroying_ = true; - } - - if (impl_->gst_thread_.IsRunning()) - impl_->gst_thread_.Stop(); - if (impl_->pipeline_) { - gst_element_set_state(impl_->pipeline_, GST_STATE_NULL); - gst_object_unref(GST_OBJECT(impl_->pipeline_)); - } - if (impl_->io_timer_.IsRunning()) - impl_->io_timer_.Stop(); - - while (!impl_->encoder_output_queue_.empty()) { - media::BitstreamBuffer bitstream_buffer = - impl_->encoder_output_queue_.back(); - // created shm and let it go out of scope automatically. - scoped_ptr shm( - new base::SharedMemory(bitstream_buffer.handle(), false)); - impl_->encoder_output_queue_.pop_back(); - } - scoped_ptr output_buffer = NULL; - while (!impl_->output_buffers_.empty()) { - output_buffer.reset(impl_->output_buffers_.front()); - impl_->output_buffers_.pop(); - output_buffer.reset(NULL); - } - delete impl_; - } - delete this; -} - -void TizenVideoEncodeAccelerator::OnEncode( - scoped_ptr buffer_ref, bool force_keyframe) { - - BitstreamBufferRef* bufref = buffer_ref.release(); - if (bufref == NULL) { - return; - } - - bufref->gst_buffer_ = - gst_buffer_new_wrapped_full( - GST_MEMORY_FLAG_READONLY, - static_cast(bufref->frame_->data(VideoFrame::kYPlane)), - bufref->size_, - 0, - bufref->size_, - reinterpret_cast(bufref), - BitstreamBufferRef::Destruct); - if (!bufref->gst_buffer_ || !GST_IS_BUFFER(bufref->gst_buffer_)) { - LOG(INFO) << "gst_buffer_new_wrapped_full failed to allocate memory."; - return; - } - if (GST_FLOW_OK != - gst_app_src_push_buffer(GST_APP_SRC(impl_->appsrc_), - bufref->gst_buffer_)) { - LOG(ERROR) << "Error while pushing buffer int appsrc on encoder."; - gst_buffer_unref(bufref->gst_buffer_); - } - - return; -} - -void TizenVideoEncodeAccelerator::OnUseOutputBitstreamBuffer( - const media::BitstreamBuffer& buffer) { - impl_->encoder_output_queue_.push_back(buffer); - - DVLOG(2) << " output buffer is ready to use: " << buffer.id() - << " out queue size: " << impl_->encoder_output_queue_.size(); -} - -bool TizenVideoEncodeAccelerator::StartEncoder() { - GError* error = NULL; - GstElement* gst_appsink = NULL; - scoped_ptr gst_pipeline; - - if (!gst_is_initialized() && !gst_init_check(NULL, NULL, &error)) { - LOG(ERROR) << "Cannot initialize gstreamer."; - g_error_free(error); - return false; - } - - // pipeline initialization - gst_pipeline.reset(gst_pipeline_new("h264_encode")); - if (!gst_pipeline) { - LOG(ERROR) << "Cannot initialize gst pipeline."; - return false; - } - - if (!impl_->CreateAppSrcElement()) { - return false; - } - - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), impl_->appsrc_)) { - LOG(ERROR) << "Cannot add gst appsrc to encoder pipeline."; - gst_object_unref(impl_->appsrc_); - impl_->appsrc_ = NULL; - return false; - } - - // appsink initialization - if (!(gst_appsink = gst_element_factory_make("appsink", "sink"))) { - LOG(ERROR) << "Cannot create appsink for encoder pipeline."; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), gst_appsink)) { - LOG(ERROR) << "Cannot add gst appsink into encoder pipeline."; - gst_object_unref(gst_appsink); - return false; - } - - GstAppSinkCallbacks appsink_callbacks = - { NULL, NULL, &TizenVideoEncodeAccelerator::Impl::OnEncoded, NULL }; - gst_app_sink_set_callbacks(GST_APP_SINK(gst_appsink), &appsink_callbacks, - static_cast(impl_), NULL); - gst_app_sink_set_max_buffers(GST_APP_SINK(gst_appsink), 1); - - DVLOG(1) << "######################################"; - DVLOG(1) << "USING " << kEncoderGstElement << " ENCODER"; - DVLOG(1) << "######################################"; - - // encoder initialization - if (!(impl_->encoder_ = gst_element_factory_make(kEncoderGstElement, - kEncoderName))) { - LOG(ERROR) << "Cannot create " << kEncoderGstElement << "."; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), impl_->encoder_)) { - LOG(ERROR) << "Cannot add " - << kEncoderGstElement << "into encoder pipeline."; - gst_object_unref(impl_->encoder_); - impl_->encoder_ = NULL; - return false; - } - -#if BUILDFLAG(IS_TIZEN) - g_object_set(impl_->encoder_, - "control-rate", 2, // 1:VBR_CFR 2:CBR_CFR 3:VBR_VFR 4:CBR_VFR - kBitrateProperty, impl_->gst_bitrate_, - NULL); -#else - // parser initialization - GstElement* gst_parser = NULL; - if (!(gst_parser = gst_element_factory_make("videoparse", "parse"))) { - LOG(ERROR) << "Cannot create videoparse."; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), gst_parser)) { - LOG(ERROR) << "Cannot add videoparse to encoder pipeline."; - gst_object_unref(gst_parser); - return false; - } - - g_object_set(gst_parser, - "format", GST_VIDEO_FORMAT_I420, - "width", impl_->view_size_.width(), - "height", impl_->view_size_.height(), - "framerate", INITIAL_FRAMERATE, 1, - NULL); - - g_object_set(impl_->encoder_, - "byte-stream", TRUE, - kBitrateProperty, impl_->gst_bitrate_ / 1000, // to kbit/s - "tune", 0x00000004, NULL); -#endif - - g_object_set(gst_appsink, "sync", FALSE, NULL); - - if (!gst_element_link_many(impl_->appsrc_, -#if !BUILDFLAG(IS_TIZEN) - gst_parser, -#endif - impl_->encoder_, gst_appsink, NULL)) { - LOG(ERROR) << "Cannot link for encoder pipeline."; - return false; - } - - if (GST_STATE_CHANGE_FAILURE == - gst_element_set_state(gst_pipeline.get(), GST_STATE_PLAYING)) { - LOG(ERROR) << "Cannot start encoder pipeline."; - return false; - } - - impl_->io_timer_.Start(FROM_HERE, - base::TimeDelta::FromMilliseconds(10), - impl_, - &TizenVideoEncodeAccelerator::Impl::DeliverVideoFrame); - - GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(gst_pipeline.get()), - GST_DEBUG_GRAPH_SHOW_ALL, - "encoder_graph.dot"); - - impl_->pipeline_ = gst_pipeline.release(); - return true; -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.h b/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.h deleted file mode 100644 index 943fac2..0000000 --- a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_COMMON_GPU_MEDIA_EFL_TIZEN_VIDEO_ENCODE_ACCELERATOR_H_ -#define CONTENT_COMMON_GPU_MEDIA_EFL_TIZEN_VIDEO_ENCODE_ACCELERATOR_H_ - -#include "base/threading/thread.h" -#include "base/synchronization/lock.h" -#include "base/synchronization/waitable_event.h" -#include "content/common/content_export.h" -#include "media/video/video_encode_accelerator.h" - -namespace content { - -class CONTENT_EXPORT TizenVideoEncodeAccelerator - : public media::VideoEncodeAccelerator { - public: - TizenVideoEncodeAccelerator(); - ~TizenVideoEncodeAccelerator() override; - - TizenVideoEncodeAccelerator(const TizenVideoEncodeAccelerator&) = delete; - TizenVideoEncodeAccelerator& operator=(const TizenVideoEncodeAccelerator&) = - delete; - - std::vector - GetSupportedProfiles() override; - bool Initialize(media::VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - media::VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) override; - void Encode(const scoped_refptr& frame, - bool force_keyframe) override; - void UseOutputBitstreamBuffer(const media::BitstreamBuffer& buffer) override; - void RequestEncodingParametersChange(uint32_t bitrate, - uint32_t framerate) override; - void Destroy() override; - - private: - struct BitstreamBufferRef; - struct Impl; - struct OutputBuffer; - - void OnEncode(scoped_ptr buffer_ref, bool force_keyframe); - void OnUseOutputBitstreamBuffer(const media::BitstreamBuffer& buffer); - bool StartEncoder(); - - Impl* impl_; -}; - -} // namespace content - -#endif // CONTENT_COMMON_GPU_MEDIA_EFL_TIZEN_VIDEO_ENCODE_ACCELERATOR_TIZEN_H_ diff --git a/tizen_src/chromium_impl/content/common/media/efl/media_player_messages_efl.h b/tizen_src/chromium_impl/content/common/media/efl/media_player_messages_efl.h deleted file mode 100644 index cdd423f..0000000 --- a/tizen_src/chromium_impl/content/common/media/efl/media_player_messages_efl.h +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// IPC messages for efl media player. -// Multiply-included message file, hence no include guard. - -#include "content/common/content_export.h" -#include "content/common/media/efl/media_player_messages_enums_efl.h" -#include "ipc/ipc_message_macros.h" -#include "media/base/efl/demuxer_stream_player_params_efl.h" -#include "media/base/efl/media_player_manager_efl.h" -#include "media/base/media_keys.h" -#include "third_party/blink/public/platform/WebMediaPlayer.h" -#include "ui/gfx/geometry/rect_f.h" - -#undef IPC_MESSAGE_EXPORT -#define IPC_MESSAGE_EXPORT CONTENT_EXPORT -#define IPC_MESSAGE_START MediaPlayerMsgStart - -IPC_ENUM_TRAITS(media::AudioCodec) -IPC_ENUM_TRAITS(blink::WebMediaPlayer::ReadyState) -IPC_ENUM_TRAITS(blink::WebMediaPlayer::NetworkState) -IPC_ENUM_TRAITS(media::DemuxerStream::Status) -IPC_ENUM_TRAITS(media::DemuxerStream::Type) -IPC_ENUM_TRAITS(media::VideoCodec) -IPC_ENUM_TRAITS(MediaPlayerHostMsg_Initialize_Type) - -IPC_STRUCT_TRAITS_BEGIN(media::DemuxerConfigs) - IPC_STRUCT_TRAITS_MEMBER(audio_codec) - IPC_STRUCT_TRAITS_MEMBER(audio_channels) - IPC_STRUCT_TRAITS_MEMBER(audio_sampling_rate) - IPC_STRUCT_TRAITS_MEMBER(is_audio_encrypted) - IPC_STRUCT_TRAITS_MEMBER(audio_extra_data) - - IPC_STRUCT_TRAITS_MEMBER(video_codec) - IPC_STRUCT_TRAITS_MEMBER(video_size) - IPC_STRUCT_TRAITS_MEMBER(is_video_encrypted) - IPC_STRUCT_TRAITS_MEMBER(video_extra_data) - - IPC_STRUCT_TRAITS_MEMBER(duration_ms) -IPC_STRUCT_TRAITS_END() - -IPC_STRUCT_TRAITS_BEGIN(media::DemuxedBufferMetaData) - IPC_STRUCT_TRAITS_MEMBER(size) - IPC_STRUCT_TRAITS_MEMBER(end_of_stream) - IPC_STRUCT_TRAITS_MEMBER(timestamp) - IPC_STRUCT_TRAITS_MEMBER(time_duration) - IPC_STRUCT_TRAITS_MEMBER(type) - IPC_STRUCT_TRAITS_MEMBER(status) -IPC_STRUCT_TRAITS_END() - -IPC_STRUCT_TRAITS_BEGIN(media::MediaPlayerEfl::TimeRanges) - IPC_STRUCT_TRAITS_MEMBER(start) - IPC_STRUCT_TRAITS_MEMBER(end) -IPC_STRUCT_TRAITS_END() - -#if defined(TIZEN_TBM_SUPPORT) -IPC_STRUCT_TRAITS_BEGIN(gfx::TbmBufferHandle) - IPC_STRUCT_TRAITS_MEMBER(tbm_surface) - IPC_STRUCT_TRAITS_MEMBER(media_packet) -IPC_STRUCT_TRAITS_END() -#endif - -// Initialize Efl player. -IPC_MESSAGE_ROUTED5(MediaPlayerEflHostMsg_Init, - int /* player_id */, - MediaPlayerHostMsg_Initialize_Type /* type */, - GURL /* URL */, - double /* volume */, - int /* demuxer client id */) - -// Deinitialize Gst player. -IPC_MESSAGE_ROUTED1(MediaPlayerEflHostMsg_DeInit, - int /* player_id */) - -// Start playback. -IPC_MESSAGE_ROUTED1(MediaPlayerEflHostMsg_Play, - int /* player_id */) - -// Pause playback. -IPC_MESSAGE_ROUTED1(MediaPlayerEflHostMsg_Pause, - int /* player_id */) - -// Set volume. -IPC_MESSAGE_ROUTED2(MediaPlayerEflHostMsg_SetVolume, - int /* player_id */, - double /* volume */) - -// Set playback rate. -IPC_MESSAGE_ROUTED2(MediaPlayerEflHostMsg_SetRate, - int /* player_id */, - double /* rate */) - -// Playback duration. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_DurationChanged, - int /* player_id */, - double /* time */) - -// Current duration. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_TimeUpdate, - int /* player_id */, - double /* time */) - -// Pause state. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_PauseStateChanged, - int /* player_id */, - bool /* state */) - -// Seek state. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_OnSeekStateChange, - int /* player_id */, - bool /* state */) - -// Current buffer range. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_BufferUpdate, - int /* player_id */, - std::vector /*buffer_range*/) - -// Playback completed. -IPC_MESSAGE_ROUTED1(MediaPlayerEflMsg_TimeChanged, - int /* player_id */) - -// Ready state change. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_ReadyStateChange, - int /* player_id */, - blink::WebMediaPlayer::ReadyState /* state */) - -// Network state change. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_NetworkStateChange, - int /* player_id */, - blink::WebMediaPlayer::NetworkState /* state */) - -// Gst media data has changed. -IPC_MESSAGE_ROUTED4(MediaPlayerEflMsg_MediaDataChanged, - int /* player_id */, - int /* width */, - int /* height */, - int /* media */) - -// On new frame available. -IPC_MESSAGE_ROUTED4(MediaPlayerEflMsg_NewFrameAvailable, - int /* player_id */, - base::SharedMemoryHandle /* Handle */, - uint32_t /* length */, - base::TimeDelta /* time stamp */) - -#if defined(TIZEN_TBM_SUPPORT) -IPC_MESSAGE_ROUTED3(MediaPlayerEflMsg_NewTbmBufferAvailable, - int /* player_id */, - gfx::TbmBufferHandle /* Handle */, - base::TimeDelta /* time stamp */) - -// Requests to release tbm buffer. -IPC_MESSAGE_CONTROL1(MediaPlayerEflHostMsg_ReleaseTbmBuffer, - gfx::TbmBufferHandle /* Handle */) -#endif - -// Seek. -IPC_MESSAGE_ROUTED2(MediaPlayerEflHostMsg_Seek, - int /* player_id */, - double /* time */) - -// For MSE internal seek request. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_SeekRequest, - int /* player_id */, - double /* time_to_seek */) - -// Sent after the renderer demuxer has seeked. -IPC_MESSAGE_CONTROL2(MediaPlayerEflHostMsg_DemuxerSeekDone, - int /* demuxer_client_id */, - base::TimeDelta /* actual_browser_seek_time */) - -// Inform the media source player that the demuxer is ready. -IPC_MESSAGE_CONTROL2(MediaPlayerEflHostMsg_DemuxerReady, - int /* demuxer_client_id */, - media::DemuxerConfigs /* configs */) - -// Sent when the data was read from the ChunkDemuxer. -IPC_MESSAGE_CONTROL3(MediaPlayerEflHostMsg_ReadFromDemuxerAck, - int /* demuxer_client_id */, - base::SharedMemoryHandle /* Handle */, - media::DemuxedBufferMetaData /* meta data of buffer*/) - -// Inform the media source player of changed media duration from demuxer. -IPC_MESSAGE_CONTROL2(MediaPlayerEflHostMsg_DurationChanged, - int /* demuxer_client_id */, - base::TimeDelta /* duration */) - -// The media source player reads data from demuxer -IPC_MESSAGE_CONTROL2(MediaPlayerEflMsg_ReadFromDemuxer, - int /* demuxer_client_id */, - media::DemuxerStream::Type /* type */) - -// Requests renderer demuxer seek. -IPC_MESSAGE_CONTROL2(MediaPlayerEflMsg_DemuxerSeekRequest, - int /* demuxer_client_id */, - base::TimeDelta /* time_to_seek */) diff --git a/tizen_src/chromium_impl/content/common/media/efl/media_player_messages_enums_efl.h b/tizen_src/chromium_impl/content/common/media/efl/media_player_messages_enums_efl.h deleted file mode 100644 index efb7701..0000000 --- a/tizen_src/chromium_impl/content/common/media/efl/media_player_messages_enums_efl.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_COMMON_MEDIA_MEDIA_PLAYER_MESSAGES_ENUMS_EFL_H_ -#define CONTENT_COMMON_MEDIA_MEDIA_PLAYER_MESSAGES_ENUMS_EFL_H_ - -// Dictates which type of media playback is being initialized. -enum MediaPlayerHostMsg_Initialize_Type { - MEDIA_PLAYER_TYPE_URL, - MEDIA_PLAYER_TYPE_MEDIA_SOURCE, -}; - -#endif // CONTENT_COMMON_MEDIA_MEDIA_PLAYER_MESSAGES_ENUMS_EFL_H_ diff --git a/tizen_src/chromium_impl/content/common/message_generator_efl.h b/tizen_src/chromium_impl/content/common/message_generator_efl.h index d2d49c0..02ca346 100644 --- a/tizen_src/chromium_impl/content/common/message_generator_efl.h +++ b/tizen_src/chromium_impl/content/common/message_generator_efl.h @@ -9,7 +9,3 @@ #if BUILDFLAG(IS_TIZEN) #include "content/common/tts_messages_efl.h" #endif - -#if defined(TIZEN_MULTIMEDIA_SUPPORT) -#include "content/common/media/efl/media_player_messages_efl.h" -#endif diff --git a/tizen_src/chromium_impl/content/common/render_messages_efl.h b/tizen_src/chromium_impl/content/common/render_messages_efl.h index 5a4ae3b..166cb1a 100644 --- a/tizen_src/chromium_impl/content/common/render_messages_efl.h +++ b/tizen_src/chromium_impl/content/common/render_messages_efl.h @@ -10,11 +10,6 @@ #include "content/public/common/common_param_traits.h" #include "ui/gfx/ipc/gfx_param_traits.h" -#if defined(TIZEN_MULTIMEDIA_SUPPORT) -#include "base/file_descriptor_posix.h" -#include "base/memory/shared_memory.h" -#endif - //----------------------------------------------------------------------------- // RenderView messages // These are messages sent from the browser to the renderer process. @@ -24,11 +19,3 @@ // so using same message class for these messages. // but actual messages are different so they shouldn't mess with chrome messages #define IPC_MESSAGE_START ChromeMsgStart - -#if defined(TIZEN_MULTIMEDIA_SUPPORT) -// This message runs audio decoding for webaudio. -IPC_MESSAGE_CONTROL3(EflViewHostMsg_WebAudioDecode, - base::SharedMemoryHandle /* encoded_data_handle */, - base::FileDescriptor /* pcm_output */, - uint32_t /* data_size*/) -#endif diff --git a/tizen_src/chromium_impl/content/content_efl.gni b/tizen_src/chromium_impl/content/content_efl.gni index 8b7a5f2..f1e187a 100644 --- a/tizen_src/chromium_impl/content/content_efl.gni +++ b/tizen_src/chromium_impl/content/content_efl.gni @@ -94,14 +94,3 @@ if (!use_wayland) { external_content_shell_configs += [ "//tizen_src/build:ecore-wayland" ] external_content_shell_configs += [ "//tizen_src/build:libecore-wayland" ] } - -if (tizen_multimedia_support) { - external_content_browser_configs += [ - "//tizen_src/build:capi-media-player", - "//tizen_src/build:libcapi-media-player", - "//tizen_src/build:capi-media-tool", - "//tizen_src/build:libcapi-media-tool", - ] - external_content_common_configs += [ "//tizen_src/build:gstreamer" ] - external_content_common_configs += [ "//tizen_src/build:libgstreamer" ] -} diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/audio_decoder_efl.h b/tizen_src/chromium_impl/content/renderer/media/efl/audio_decoder_efl.h deleted file mode 100644 index c21305f..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/audio_decoder_efl.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_MEDIA_EFL_AUDIO_DECODER_EFL_H_ -#define CONTENT_RENDERER_MEDIA_EFL_AUDIO_DECODER_EFL_H_ - -#include "content/child/thread_safe_sender.h" - -namespace blink { -class WebAudioBus; -} - -namespace content { - -bool DecodeAudioFileData(blink::WebAudioBus* destination_bus, - const char* data, - size_t data_size, - scoped_refptr sender); - -} // namespace content -#endif // CONTENT_RENDERER_MEDIA_EFL_AUDIO_DECODER_EFL_H_ diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.cc b/tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.cc deleted file mode 100644 index 61377ed..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.cc +++ /dev/null @@ -1,513 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/media/efl/media_source_delegate_efl.h" - -#include "base/process/process.h" -#include "media/base/bind_to_current_loop.h" -#include "media/base/efl/demuxer_stream_player_params_efl.h" -#include "media/base/media_log.h" -#include "media/blink/webmediaplayer_util.h" -#include "media/blink/webmediasource_impl.h" -#include "media/filters/chunk_demuxer.h" -#include "media/filters/decrypting_demuxer_stream.h" -#include "third_party/blink/public/web/WebRuntimeFeatures.h" - -namespace content { - -MediaSourceDelegateEfl::MediaSourceDelegateEfl( - RendererDemuxerEfl* demuxer_client, - int demuxer_client_id, - const scoped_refptr& media_task_runner, - media::MediaLog* media_log) - : main_loop_(base::ThreadTaskRunnerHandle::Get()), - main_weak_factory_(this), - main_weak_this_(main_weak_factory_.GetWeakPtr()), - media_task_runner_(media_task_runner), - media_weak_factory_(this), - demuxer_client_(demuxer_client), - demuxer_client_id_(demuxer_client_id), - media_log_(media_log), - audio_stream_(NULL), - video_stream_(NULL), - seek_time_(media::kNoTimestamp()), - pending_seek_(false), - is_seeking_(false), - seeking_pending_seek_(false), - is_demuxer_seek_done_(false), - pending_seek_time_(media::kNoTimestamp()), - is_audio_read_fired_(false), - is_video_read_fired_(false), - is_demuxer_ready_(false) { - DCHECK(!chunk_demuxer_); -} - -MediaSourceDelegateEfl::~MediaSourceDelegateEfl() { - DCHECK(main_loop_->BelongsToCurrentThread()); - DCHECK(!chunk_demuxer_); - DCHECK(!audio_stream_); - DCHECK(!video_stream_); - DCHECK(!audio_decrypting_demuxer_stream_); - DCHECK(!video_decrypting_demuxer_stream_); -} - -void MediaSourceDelegateEfl::InitializeMediaSource( - const MediaSourceOpenedCB& media_source_opened_cb, - const media::Demuxer::EncryptedMediaInitDataCB& emedia_init_data_cb, - const media::SetCdmReadyCB& set_cdm_ready_cb, - const UpdateNetworkStateCB& update_network_state_cb, - const DurationChangeCB& duration_change_cb, - const base::Closure& waiting_for_decryption_key_cb) { - DCHECK(main_loop_->BelongsToCurrentThread()); - DCHECK(!media_source_opened_cb.is_null()); - media_source_opened_cb_ = media_source_opened_cb; - emedia_init_data_cb_ = emedia_init_data_cb; - set_cdm_ready_cb_ = set_cdm_ready_cb; - update_network_state_cb_ = media::BindToCurrentLoop(update_network_state_cb); - duration_change_cb_ = duration_change_cb; - waiting_for_decryption_key_cb_ = - media::BindToCurrentLoop(waiting_for_decryption_key_cb); - - chunk_demuxer_.reset(new media::ChunkDemuxer( - media::BindToCurrentLoop(base::BindOnce( - &MediaSourceDelegateEfl::OnDemuxerOpened, main_weak_this_)), - media::BindToCurrentLoop(base::BindOnce( - &MediaSourceDelegateEfl::OnEncryptedMediaInitData, main_weak_this_)), - media_log_, false)); - - media_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&MediaSourceDelegateEfl::InitializeDemuxer, - base::Unretained(this))); -} - -void MediaSourceDelegateEfl::OnBufferedTimeRangesChanged( - const media::Ranges& ranges) { - buffered_time_ranges_ = ranges; -} - -blink::WebTimeRanges MediaSourceDelegateEfl::Buffered() const { - return media::ConvertToWebTimeRanges(buffered_time_ranges_); -} - -void MediaSourceDelegateEfl::InitializeDemuxer() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - demuxer_client_->AddDelegate(demuxer_client_id_, this); - chunk_demuxer_->Initialize( - this, - base::BindOnce(&MediaSourceDelegateEfl::OnDemuxerInitDone, - media_weak_factory_.GetWeakPtr()), - false); -} - -void MediaSourceDelegateEfl::OnEncryptedMediaInitData ( - media::EmeInitDataType init_data_type, - const std::vector& init_data) { - DCHECK(main_loop_->BelongsToCurrentThread()); - if (emedia_init_data_cb_.is_null()) { - return; - } - emedia_init_data_cb_.Run(init_data_type, init_data); -} - -void MediaSourceDelegateEfl::OnDemuxerOpened() { - DCHECK(main_loop_->BelongsToCurrentThread()); - if (media_source_opened_cb_.is_null()) - return; - media_source_opened_cb_.Run(new media::WebMediaSourceImpl( - chunk_demuxer_.get(), media_log_)); -} - -void MediaSourceDelegateEfl::OnDemuxerError( - media::PipelineStatus status) { - if (status != media::PIPELINE_OK && !update_network_state_cb_.is_null()) - update_network_state_cb_.Run(PipelineErrorToNetworkState(status)); -} - -void MediaSourceDelegateEfl::AddTextStream( - media::DemuxerStream* /* text_stream */ , - const media::TextTrackConfig& /* config */ ) { - NOTIMPLEMENTED(); -} - -void MediaSourceDelegateEfl::RemoveTextStream( - media::DemuxerStream* /* text_stream */ ) { - NOTIMPLEMENTED(); -} - -bool MediaSourceDelegateEfl::CanNotifyDemuxerReady() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - return is_demuxer_ready_; -} - -void MediaSourceDelegateEfl::OnDemuxerInitDone( - media::PipelineStatus status) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - DCHECK(chunk_demuxer_); - if (status != media::PIPELINE_OK) { - OnDemuxerError(status); - return; - } - audio_stream_ = chunk_demuxer_->GetStream(media::DemuxerStream::AUDIO); - video_stream_ = chunk_demuxer_->GetStream(media::DemuxerStream::VIDEO); - if (audio_stream_ && audio_stream_->audio_decoder_config().is_encrypted() && - !set_cdm_ready_cb_.is_null()) { - InitAudioDecryptingDemuxerStream(); - return; - } - if (video_stream_ && video_stream_->video_decoder_config().is_encrypted() && - !set_cdm_ready_cb_.is_null()) { - InitVideoDecryptingDemuxerStream(); - return; - } - // Notify demuxer ready when both streams are not encrypted. - is_demuxer_ready_ = true; - NotifyDemuxerReady(); -} - -void MediaSourceDelegateEfl::InitAudioDecryptingDemuxerStream() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - audio_decrypting_demuxer_stream_.reset(new media::DecryptingDemuxerStream( - media_task_runner_, media_log_, waiting_for_decryption_key_cb_)); - - audio_decrypting_demuxer_stream_->Initialize( - audio_stream_, set_cdm_ready_cb_, - base::BindOnce( - &MediaSourceDelegateEfl::OnAudioDecryptingDemuxerStreamInitDone, - media_weak_factory_.GetWeakPtr())); -} - -void MediaSourceDelegateEfl::InitVideoDecryptingDemuxerStream() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - - video_decrypting_demuxer_stream_.reset(new media::DecryptingDemuxerStream( - media_task_runner_, media_log_, waiting_for_decryption_key_cb_)); - - video_decrypting_demuxer_stream_->Initialize( - video_stream_, set_cdm_ready_cb_, - base::BindOnce( - &MediaSourceDelegateEfl::OnVideoDecryptingDemuxerStreamInitDone, - media_weak_factory_.GetWeakPtr())); -} - - -void MediaSourceDelegateEfl::OnAudioDecryptingDemuxerStreamInitDone( - media::PipelineStatus status) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - DCHECK(chunk_demuxer_); - - if (status != media::PIPELINE_OK) - audio_decrypting_demuxer_stream_.reset(); - else - audio_stream_ = audio_decrypting_demuxer_stream_.get(); - - if (video_stream_ && video_stream_->video_decoder_config().is_encrypted()) { - InitVideoDecryptingDemuxerStream(); - return; - } - - // Try to notify demuxer ready when audio DDS initialization finished and - // video is not encrypted. - is_demuxer_ready_ = true; - NotifyDemuxerReady(); -} - -void MediaSourceDelegateEfl::OnVideoDecryptingDemuxerStreamInitDone( - media::PipelineStatus status) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - DCHECK(chunk_demuxer_); - - if (status != media::PIPELINE_OK) - video_decrypting_demuxer_stream_.reset(); - else - video_stream_ = video_decrypting_demuxer_stream_.get(); - - // Try to notify demuxer ready when video DDS initialization finished. - is_demuxer_ready_ = true; - NotifyDemuxerReady(); -} - -void MediaSourceDelegateEfl::NotifyDemuxerReady() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - DCHECK(is_demuxer_ready_); - if (!demuxer_client_ || (!audio_stream_ && !video_stream_)) { - OnDemuxerError(media::PIPELINE_ERROR_INITIALIZATION_FAILED); - return; - } - scoped_ptr configs(new media::DemuxerConfigs()); - if (audio_stream_) { - media::AudioDecoderConfig audio_config = - audio_stream_->audio_decoder_config(); - configs->audio_codec = audio_config.codec(); - configs->audio_channels = - media::ChannelLayoutToChannelCount(audio_config.channel_layout()); - configs->audio_sampling_rate = audio_config.samples_per_second(); - configs->is_audio_encrypted = audio_config.is_encrypted(); - configs->audio_extra_data = audio_config.extra_data(); - } - if (video_stream_) { - media::VideoDecoderConfig video_config = - video_stream_->video_decoder_config(); - configs->video_codec = video_config.codec(); - configs->video_size = video_config.natural_size(); - configs->is_video_encrypted = video_config.is_encrypted(); - configs->video_extra_data = video_config.extra_data(); - } - demuxer_client_->DemuxerReady(demuxer_client_id_, *configs); -} - -void MediaSourceDelegateEfl::OnReadFromDemuxer( - media::DemuxerStream::Type type) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - - if (is_seeking_) - return; - - if ((type == media::DemuxerStream::AUDIO) && audio_stream_ - && !is_audio_read_fired_) { - is_audio_read_fired_ = true; - audio_stream_->Read(base::BindOnce(&MediaSourceDelegateEfl::OnBufferReady, - media_weak_factory_.GetWeakPtr(), type)); - } - - if ((type == media::DemuxerStream::VIDEO) && video_stream_ - && !is_video_read_fired_) { - is_video_read_fired_ = true; - video_stream_->Read(base::BindOnce(&MediaSourceDelegateEfl::OnBufferReady, - media_weak_factory_.GetWeakPtr(), type)); - } -} - -void MediaSourceDelegateEfl::Stop(const base::Closure& stop_cb) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - if (!chunk_demuxer_) { - DCHECK(!demuxer_client_); - return; - } - - duration_change_cb_.Reset(); - update_network_state_cb_.Reset(); - media_source_opened_cb_.Reset(); - - main_weak_factory_.InvalidateWeakPtrs(); - DCHECK(!main_weak_factory_.HasWeakPtrs()); - - // 1. shutdown demuxer. - // 2. On media thread, call stop demuxer. - chunk_demuxer_->Shutdown(); - media_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&MediaSourceDelegateEfl::StopDemuxer, - base::Unretained(this), stop_cb)); -} - -void MediaSourceDelegateEfl::StopDemuxer(const base::Closure& stop_cb) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - DCHECK(chunk_demuxer_); - - demuxer_client_->RemoveDelegate(demuxer_client_id_); - demuxer_client_ = NULL; - audio_stream_ = NULL; - video_stream_ = NULL; - audio_decrypting_demuxer_stream_.reset(); - video_decrypting_demuxer_stream_.reset(); - - media_weak_factory_.InvalidateWeakPtrs(); - DCHECK(!media_weak_factory_.HasWeakPtrs()); - - chunk_demuxer_->Stop(); - chunk_demuxer_.reset(); - - stop_cb.Run(); -} - -void MediaSourceDelegateEfl::SeekInternal( - const base::TimeDelta& seek_time) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - chunk_demuxer_->Seek( - seek_time, base::BindOnce(&MediaSourceDelegateEfl::OnDemuxerSeekDone, - media_weak_factory_.GetWeakPtr())); -} - -void MediaSourceDelegateEfl::OnBufferReady( - media::DemuxerStream::Type type, - media::DemuxerStream::Status status, - const scoped_refptr& buffer) { - uint32_t shared_memory_size = -1; - base::SharedMemory shared_memory; - base::SharedMemoryHandle foreign_memory_handle; - - scoped_ptr meta_data( - new media::DemuxedBufferMetaData()); - meta_data->status = status; - meta_data->type = type; - - if (type == media::DemuxerStream::AUDIO) - is_audio_read_fired_ = false; - if (type == media::DemuxerStream::VIDEO) - is_video_read_fired_ = false; - - switch (status) { - case media::DemuxerStream::kAborted: - LOG (ERROR) << "[RENDER] : DemuxerStream::kAborted"; - break; - - case media::DemuxerStream::kConfigChanged: - NotifyDemuxerReady(); - break; - - case media::DemuxerStream::kOk: - if (buffer.get()->end_of_stream()) { - meta_data->end_of_stream = true; - break; - } - shared_memory_size = buffer.get()->data_size(); - if (!shared_memory.CreateAndMapAnonymous(shared_memory_size)) { - LOG (ERROR) << "Shared Memory creation failed."; - return; - } - if (!shared_memory.ShareToProcess(base::Process::Current().Handle(), - &foreign_memory_handle)) { - LOG (ERROR) << "Shared Memory handle could not be obtained"; - return; - } - memcpy(shared_memory.memory(), (void*)buffer.get()->writable_data(), - shared_memory_size); - meta_data->timestamp = buffer.get()->timestamp(); - meta_data->time_duration = buffer.get()->duration(); - meta_data->size = shared_memory_size; - break; - default: - NOTREACHED(); - } - - if (demuxer_client_) - demuxer_client_->ReadFromDemuxerAck(demuxer_client_id_, - foreign_memory_handle, - *meta_data); -} - -void MediaSourceDelegateEfl::StartWaitingForSeek( - const base::TimeDelta& seek_time) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - if (!chunk_demuxer_) - return; - - // Called from |webmediaplayerefl| only. - is_demuxer_seek_done_ = false; - seeking_pending_seek_ = false; - is_seeking_ = true; - chunk_demuxer_->StartWaitingForSeek(seek_time); -} - -void MediaSourceDelegateEfl::CancelPendingSeek( - const base::TimeDelta& seek_time) { - DCHECK(main_loop_->BelongsToCurrentThread()); - if (!chunk_demuxer_) - return; - is_seeking_ = true; - pending_seek_ = true; - pending_seek_time_ = seek_time; - - if (is_demuxer_seek_done_) { - // Since we already requested gstreamer to seek. And there are no pending - // seeks in |chunk_demuxer|. Cancelling pending seek makes no sense. - // - // This block will handle when |gstreamer| is seeking and new seek came in - // between. - is_demuxer_seek_done_ = false; - pending_seek_ = false; - chunk_demuxer_->StartWaitingForSeek(seek_time); - StartSeek(seek_time, true); - return; - } - - chunk_demuxer_->CancelPendingSeek(seek_time); -} - -void MediaSourceDelegateEfl::StartSeek( - const base::TimeDelta& seek_time, - bool is_seeking_pending_seek) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - - if (!chunk_demuxer_) - return; - - is_seeking_ = true; - is_demuxer_seek_done_ = false; - if (is_seeking_pending_seek) - seeking_pending_seek_ = is_seeking_pending_seek; - else if (seeking_pending_seek_) - return; - - seek_time_ = seek_time; - SeekInternal(seek_time); -} - -void MediaSourceDelegateEfl::OnDemuxerSeekDone( - media::PipelineStatus status) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - if (status != media::PIPELINE_OK) { - OnDemuxerError(status); - return; - } - if (pending_seek_) { - pending_seek_ = false; - StartSeek(pending_seek_time_, true); - seek_time_ = pending_seek_time_; - } else { - seeking_pending_seek_ = false; - is_seeking_ = false; - is_demuxer_seek_done_ = true; - ResetAudioDecryptingDemuxerStream(); - } -} - -void MediaSourceDelegateEfl::ResetAudioDecryptingDemuxerStream() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - if (audio_decrypting_demuxer_stream_) { - audio_decrypting_demuxer_stream_->Reset(base::BindOnce( - &MediaSourceDelegateEfl::ResetVideoDecryptingDemuxerStream, - media_weak_factory_.GetWeakPtr())); - return; - } - ResetVideoDecryptingDemuxerStream(); -} - -void MediaSourceDelegateEfl::ResetVideoDecryptingDemuxerStream() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - if (video_decrypting_demuxer_stream_) { - video_decrypting_demuxer_stream_->Reset(base::BindOnce( - &MediaSourceDelegateEfl::FinishResettingDecryptingDemuxerStreams, - media_weak_factory_.GetWeakPtr())); - return; - } - FinishResettingDecryptingDemuxerStreams(); -} - -void MediaSourceDelegateEfl::FinishResettingDecryptingDemuxerStreams() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - DCHECK(is_seeking_); - is_seeking_ = false; - demuxer_client_->DemuxerSeekDone(demuxer_client_id_, seek_time_); -} - -void MediaSourceDelegateEfl::SetDuration(base::TimeDelta duration) { - DCHECK(main_loop_->BelongsToCurrentThread()); - main_loop_->PostTask( - FROM_HERE, base::BindOnce(&MediaSourceDelegateEfl::OnDurationChanged, - main_weak_this_, duration)); -} - -void MediaSourceDelegateEfl::OnDurationChanged( - const base::TimeDelta& duration) { - DCHECK(main_loop_->BelongsToCurrentThread()); - if (demuxer_client_) - demuxer_client_->DurationChanged(demuxer_client_id_, duration); - - if (!duration_change_cb_.is_null()) - duration_change_cb_.Run(duration.InSecondsF()); -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.h b/tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.h deleted file mode 100644 index f6f69d3..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.h +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_MEDIA_EFL_MEDIA_SOURCE_DELEGATE_EFL_H_ -#define CONTENT_RENDERER_MEDIA_EFL_MEDIA_SOURCE_DELEGATE_EFL_H_ - -#include "content/renderer/media/efl/renderer_demuxer_efl.h" -#include "media/base/decoder_buffer.h" -#include "media/base/demuxer_stream.h" -#include "media/base/media_keys.h" -#include "media/filters/chunk_demuxer.h" -#include "media/filters/decrypting_demuxer_stream.h" -#include "third_party/blink/public/platform/WebMediaPlayer.h" - -namespace content { - -class MediaSourceDelegateEfl - : public media::DemuxerHost { - public: - typedef base::OnceCallback MediaSourceOpenedCB; - typedef base::OnceCallback - UpdateNetworkStateCB; - typedef base::OnceCallback DurationChangeCB; - - MediaSourceDelegateEfl( - RendererDemuxerEfl* demuxer_client, - int demuxer_client_id, - const scoped_refptr& media_task_runner, - media::MediaLog* media_log); - ~MediaSourceDelegateEfl(); - - //DemuxerHost implementation. - void OnBufferedTimeRangesChanged( - const media::Ranges& ranges) override; - - // Sets the duration of the media in microseconds. - // Duration may be kInfiniteDuration() if the duration is not known. - void SetDuration(base::TimeDelta duration) override; - - // Stops execution of the pipeline due to a fatal error. Do not call this - // method with PIPELINE_OK. - void OnDemuxerError(media::PipelineStatus error) override; - - // Add |text_stream| to the collection managed by the text renderer. - void AddTextStream( - media::DemuxerStream* text_stream, - const media::TextTrackConfig& config) override; - - // Remove |text_stream| from the presentation. - void RemoveTextStream(media::DemuxerStream* text_stream) override; - - void InitializeMediaSource( - const MediaSourceOpenedCB& media_source_opened_cb, - const media::Demuxer::EncryptedMediaInitDataCB& emedia_init_data_cb, - const media::SetCdmReadyCB& set_cdm_ready_cb, - const UpdateNetworkStateCB& update_network_state_cb, - const DurationChangeCB& duration_change_cb, - const base::Closure& waiting_for_decryption_key_cb); - - blink::WebTimeRanges Buffered() const; - - // Called when DemuxerStreamPlayer needs to read data from ChunkDemuxer. - void OnReadFromDemuxer(media::DemuxerStream::Type type); - - // Must be called explicitly before |this| can be destroyed. - void Stop(const base::Closure& stop_cb); - - // In MSE case, calls ChunkDemuxer::StartWaitingForSeek(), sets the - // expectation that a regular seek will be arriving. - void StartWaitingForSeek(const base::TimeDelta& seek_time); - - // Calls ChunkDemuxer::CancelPendingSeek(). Also sets the - // expectation that a regular seek will be arriving. - void CancelPendingSeek(const base::TimeDelta& seek_time); - - // Sets the expectation that a regular seek will be arriving. - void StartSeek( - const base::TimeDelta& seek_time, - bool is_seeking_pending_seek); - - // Callback for ChunkDemuxer::Seek(). - void OnDemuxerSeekDone(media::PipelineStatus status); - - private: - void OnEncryptedMediaInitData(media::EmeInitDataType init_data_type, - const std::vector& init_data); - void OnDemuxerOpened(); - void InitializeDemuxer(); - void OnDemuxerInitDone(media::PipelineStatus status); - // Stops and clears objects on the media thread. - void StopDemuxer(const base::Closure& stop_cb); - bool CanNotifyDemuxerReady(); - void NotifyDemuxerReady(); - void OnDurationChanged(const base::TimeDelta& duration); - void OnBufferReady( - media::DemuxerStream::Type type, - media::DemuxerStream::Status status, - const scoped_refptr& buffer); - void SeekInternal(const base::TimeDelta& seek_time); - - // Initializes DecryptingDemuxerStreams if audio/video stream is encrypted. - void InitAudioDecryptingDemuxerStream(); - void InitVideoDecryptingDemuxerStream(); - - // Callbacks for DecryptingDemuxerStream::Initialize(). - void OnAudioDecryptingDemuxerStreamInitDone(media::PipelineStatus status); - void OnVideoDecryptingDemuxerStreamInitDone(media::PipelineStatus status); - - // Runs on the media thread. - void ResetAudioDecryptingDemuxerStream(); - void ResetVideoDecryptingDemuxerStream(); - void FinishResettingDecryptingDemuxerStreams(); - - // Message loop for main renderer thread and corresponding weak pointer. - const scoped_refptr main_loop_; - base::WeakPtrFactory main_weak_factory_; - base::WeakPtr main_weak_this_; - - // Message loop for media thread and corresponding weak pointer. - const scoped_refptr media_task_runner_; - base::WeakPtrFactory media_weak_factory_; - RendererDemuxerEfl* demuxer_client_; - int demuxer_client_id_; - scoped_refptr media_log_; - - MediaSourceOpenedCB media_source_opened_cb_; - UpdateNetworkStateCB update_network_state_cb_; - DurationChangeCB duration_change_cb_; - base::Closure waiting_for_decryption_key_cb_; - - scoped_ptr chunk_demuxer_; - media::DemuxerStream* audio_stream_; - media::DemuxerStream* video_stream_; - media::Ranges buffered_time_ranges_; - - media::SetCdmReadyCB set_cdm_ready_cb_; - media::Demuxer::EncryptedMediaInitDataCB emedia_init_data_cb_; - scoped_ptr audio_decrypting_demuxer_stream_; - scoped_ptr video_decrypting_demuxer_stream_; - - base::TimeDelta seek_time_; - bool pending_seek_; - bool is_seeking_; - - // Will handle internal seek coming from |MediaSourcePlayerGstreamer| - // if new seek has been fired by |HTMLMediaElement|. - // Always one should seek to latest time and ignore previous seeks. - bool seeking_pending_seek_; - - // Will handle |seek| request coming after |chunk_demuxer| - // has requested |gstreamer| to seek. - bool is_demuxer_seek_done_; - base::TimeDelta pending_seek_time_; - - bool is_audio_read_fired_; - bool is_video_read_fired_; - - bool is_demuxer_ready_; -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_EFL_MEDIA_SOURCE_DELEGATE_EFL_H_ diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.cc b/tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.cc deleted file mode 100644 index c305830..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.cc +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/media/efl/renderer_demuxer_efl.h" - -#include "base/bind.h" -#include "base/message_loop/message_loop.h" -#include "content/child/thread_safe_sender.h" -#include "content/common/media/efl/media_player_messages_efl.h" -#include "content/renderer/media/efl/media_source_delegate_efl.h" -#include "content/renderer/media/efl/renderer_media_player_manager_efl.h" -#include "content/renderer/render_thread_impl.h" - -namespace content { - -scoped_refptr CreateRendererDemuxerEfl() { - return new RendererDemuxerEfl(); -} - -RendererDemuxerEfl::RendererDemuxerEfl() - : thread_safe_sender_(RenderThreadImpl::current()->thread_safe_sender()), - media_task_runner_( - RenderThreadImpl::current()->GetMediaThreadTaskRunner()) {} - -RendererDemuxerEfl::~RendererDemuxerEfl() {} - -int RendererDemuxerEfl::GetNextDemuxerClientID() { - // Don't use zero for IDs since it can be interpreted as having no ID. - return next_demuxer_client_id_.GetNext() + 1; -} - -void RendererDemuxerEfl::AddDelegate( - int demuxer_client_id, - MediaSourceDelegateEfl* delegate) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - delegates_.AddWithID(delegate, demuxer_client_id); -} - -void RendererDemuxerEfl::RemoveDelegate(int demuxer_client_id) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - delegates_.Remove(demuxer_client_id); -} - -bool RendererDemuxerEfl::OnMessageReceived(const IPC::Message& message) { - switch (message.type()) { - case MediaPlayerEflMsg_ReadFromDemuxer::ID: - case MediaPlayerEflMsg_DemuxerSeekRequest::ID: - media_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&RendererDemuxerEfl::DispatchMessage, this, message)); - return true; - } - return false; -} - -void RendererDemuxerEfl::DemuxerReady( - int demuxer_client_id, - const media::DemuxerConfigs& configs) { - thread_safe_sender_->Send(new MediaPlayerEflHostMsg_DemuxerReady( - demuxer_client_id, configs)); -} - -void RendererDemuxerEfl::ReadFromDemuxerAck( - int demuxer_client_id, - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data) { - thread_safe_sender_->Send(new MediaPlayerEflHostMsg_ReadFromDemuxerAck( - demuxer_client_id, foreign_memory_handle, meta_data)); -} - -void RendererDemuxerEfl::DemuxerSeekDone( - int demuxer_client_id, - const base::TimeDelta& actual_browser_seek_time) { - thread_safe_sender_->Send(new MediaPlayerEflHostMsg_DemuxerSeekDone( - demuxer_client_id, actual_browser_seek_time)); -} - -void RendererDemuxerEfl::DurationChanged(int demuxer_client_id, - const base::TimeDelta& duration) { - thread_safe_sender_->Send(new MediaPlayerEflHostMsg_DurationChanged( - demuxer_client_id, duration)); -} - -void RendererDemuxerEfl::DispatchMessage(const IPC::Message& message) { - IPC_BEGIN_MESSAGE_MAP(RendererDemuxerEfl, message) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_ReadFromDemuxer, OnReadFromDemuxer) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_DemuxerSeekRequest, - OnDemuxerSeekRequest) - IPC_END_MESSAGE_MAP() -} - -void RendererDemuxerEfl::OnReadFromDemuxer( - int demuxer_client_id, - media::DemuxerStream::Type type) { - MediaSourceDelegateEfl* delegate = delegates_.Lookup(demuxer_client_id); - if (delegate) - delegate->OnReadFromDemuxer(type); -} - -void RendererDemuxerEfl::OnDemuxerSeekRequest( - int demuxer_client_id, - const base::TimeDelta& time_to_seek) { - MediaSourceDelegateEfl* delegate = delegates_.Lookup(demuxer_client_id); - if (delegate) - delegate->StartSeek(time_to_seek, false); -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.h b/tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.h deleted file mode 100644 index 90b762b..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_MEDIA_EFL_RENDERER_DEMUXER_EFL_H_ -#define CONTENT_RENDERER_MEDIA_EFL_RENDERER_DEMUXER_EFL_H_ - -#include "base/atomic_sequence_num.h" -#include "base/id_map.h" -#include "base/memory/shared_memory.h" -#include "ipc/message_filter.h" -#include "media/base/efl/demuxer_stream_player_params_efl.h" - -namespace base { -class SingleThreadTaskRunner; -} - -namespace content { - -class MediaSourceDelegateEfl; -class ThreadSafeSender; - -// Represents the renderer process half of an IPC-based implementation of -// media::DemuxerEfl. -// -// Refer to BrowserDemuxerEfl for the browser process half. -class RendererDemuxerEfl : public IPC::MessageFilter { - public: - RendererDemuxerEfl(); - - RendererDemuxerEfl(const RendererDemuxerEfl&) = delete; - RendererDemuxerEfl& operator=(const RendererDemuxerEfl&) = delete; - - // Returns the next available demuxer client ID for use in IPC messages. - // - // Safe to call on any thread. - int GetNextDemuxerClientID(); - - // Associates |delegate| with |demuxer_client_id| for handling incoming IPC - // messages. - // - // Must be called on media thread. - void AddDelegate( - int demuxer_client_id, - MediaSourceDelegateEfl* delegate); - - // Removes the association created by AddDelegate(). - // - // Must be called on media thread. - void RemoveDelegate(int demuxer_client_id); - - // IPC::ChannelProxy::MessageFilter overrides. - bool OnMessageReceived(const IPC::Message& message) override; - - // media::DemuxerEflClient "implementation". - void DemuxerReady( - int demuxer_client_id, - const media::DemuxerConfigs& configs); - void ReadFromDemuxerAck( - int demuxer_client_id, - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data); - void DemuxerSeekDone( - int demuxer_client_id, - const base::TimeDelta& actual_browser_seek_time); - void DurationChanged(int demuxer_client_id, const base::TimeDelta& duration); - - protected: - friend class base::RefCountedThreadSafe; - ~RendererDemuxerEfl() override; - - private: - void DispatchMessage(const IPC::Message& message); - void OnReadFromDemuxer(int demuxer_client_id, - media::DemuxerStream::Type type); - void OnDemuxerSeekRequest(int demuxer_client_id, - const base::TimeDelta& time_to_seek); - - base::AtomicSequenceNumber next_demuxer_client_id_; - - IDMap delegates_; - scoped_refptr thread_safe_sender_; - scoped_refptr media_task_runner_; -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_EFL_RENDERER_DEMUXER_EFL_H_ diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.cc b/tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.cc deleted file mode 100644 index 8ff8263..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.cc +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/media/efl/renderer_media_player_manager_efl.h" - -#include "base/bind.h" -#include "base/message_loop/message_loop.h" -#include "content/common/media/efl/media_player_messages_efl.h" -#include "content/public/renderer/render_thread.h" -#include "content/renderer/media/efl/webmediaplayer_efl.h" -#include "media/base/bind_to_current_loop.h" - -namespace content { - -RendererMediaPlayerManager* CreateRendererMediaPlayerManager( - RenderFrame* render_frame) { - return new RendererMediaPlayerManager(render_frame); -} - -RendererMediaPlayerManager::RendererMediaPlayerManager( - RenderFrame* render_frame) - : RenderFrameObserver(render_frame), - next_media_player_id_(0) { -} - -RendererMediaPlayerManager::~RendererMediaPlayerManager() { - DCHECK(media_players_.empty()) - << "RendererMediaPlayerManager is owned by RenderFrameImpl and is " - "destroyed only after all media players are destroyed."; -} - -void RendererMediaPlayerManager::PausePlayingPlayers() { - for (auto player_it : media_players_) { - WebMediaPlayerEfl* player = player_it.second; - if (player && !player->paused() && player->hasVideo()) - player->RequestPause(); - } -} - -bool RendererMediaPlayerManager::OnMessageReceived( - const IPC::Message& message) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(RendererMediaPlayerManager, message) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_MediaDataChanged, - OnMediaDataChange) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_DurationChanged, OnDurationChange) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_TimeUpdate, OnTimeUpdate) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_BufferUpdate, OnBufferUpdate) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_ReadyStateChange, - OnReadyStateChange) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_NetworkStateChange, - OnNetworkStateChange) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_TimeChanged, OnTimeChanged) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_PauseStateChanged, - OnPauseStateChange) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_OnSeekStateChange, - OnSeekStateChange) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_SeekRequest, OnRequestSeek) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_NewFrameAvailable, - OnNewFrameAvailable) -#if defined(TIZEN_TBM_SUPPORT) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_NewTbmBufferAvailable, - OnNewTbmBufferAvailable) -#endif - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; -} - -void RendererMediaPlayerManager::WasHidden() { - PausePlayingPlayers(); -} - -void RendererMediaPlayerManager::OnStop() { - PausePlayingPlayers(); -} - -void RendererMediaPlayerManager::Initialize( - int player_id, - MediaPlayerHostMsg_Initialize_Type type, - const GURL& url, - double volume, - int demuxer_client_id) { - Send(new MediaPlayerEflHostMsg_Init(routing_id(), player_id, type, - url, volume, demuxer_client_id)); -} - -void RendererMediaPlayerManager::OnMediaDataChange(int player_id, int width, - int height, int media) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnMediaDataChange(width, height, media); -} - -void RendererMediaPlayerManager::OnDurationChange( - int player_id, - double duration) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnDurationChange(duration); -} - -void RendererMediaPlayerManager::OnTimeUpdate( - int player_id, - double current_time) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnTimeUpdate(current_time); -} - -void RendererMediaPlayerManager::OnBufferUpdate( - int player_id, - std::vector buffer_range) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnBufferUpdate(buffer_range); -} - -void RendererMediaPlayerManager::OnReadyStateChange( - int player_id, - blink::WebMediaPlayer::ReadyState state) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->SetReadyState( - static_cast(state)); -} - -void RendererMediaPlayerManager::OnNetworkStateChange( - int player_id, - blink::WebMediaPlayer::NetworkState state) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->SetNetworkState( - static_cast(state)); -} - -void RendererMediaPlayerManager::OnTimeChanged(int player_id) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnTimeChanged(); -} - -void RendererMediaPlayerManager::OnSeekStateChange(int player_id, - bool state) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnSeekStateChange(state); -} - -void RendererMediaPlayerManager::OnPauseStateChange(int player_id, - bool state) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnPauseStateChange(state); -} - -void RendererMediaPlayerManager::OnRequestSeek(int player_id, - double seek_time) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnRequestSeek(seek_time); -} - -void RendererMediaPlayerManager::OnNewFrameAvailable( - int player_id, - base::SharedMemoryHandle foreign_memory_handle, - uint32_t length, base::TimeDelta timestamp) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnNewFrameAvailable(foreign_memory_handle, length, timestamp); -} - -#if defined(TIZEN_TBM_SUPPORT) -void RendererMediaPlayerManager::OnNewTbmBufferAvailable( - int player_id, gfx::TbmBufferHandle tbm_handle, - base::TimeDelta timestamp) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - - if (player) - player->OnNewTbmBufferAvailable( - tbm_handle, timestamp, - media::BindToCurrentLoop( - base::BindOnce(&RendererMediaPlayerManager::OnTbmBufferRelease, - base::Unretained(this), tbm_handle))); -} - -void RendererMediaPlayerManager::OnTbmBufferRelease( - gfx::TbmBufferHandle tbm_handle) { - RenderThread::Get()->Send( - new MediaPlayerEflHostMsg_ReleaseTbmBuffer(tbm_handle)); -} -#endif - -WebMediaPlayerEfl* RendererMediaPlayerManager::GetMediaPlayer( - int player_id) { - std::map::iterator iter = - media_players_.find(player_id); - if (iter != media_players_.end()) - return iter->second; - return NULL; -} - -void RendererMediaPlayerManager::Play(int player_id) { - Send(new MediaPlayerEflHostMsg_Play(routing_id(), player_id)); -} - -void RendererMediaPlayerManager::Pause(int player_id, - bool is_media_related_action) { - Send(new MediaPlayerEflHostMsg_Pause(routing_id(), player_id)); -} - -void RendererMediaPlayerManager::Seek(int player_id, double time) { - Send(new MediaPlayerEflHostMsg_Seek(routing_id(), player_id, time)); -} - -void RendererMediaPlayerManager::SetVolume(int player_id, double volume) { - Send(new MediaPlayerEflHostMsg_SetVolume(routing_id(), player_id, volume)); -} - -void RendererMediaPlayerManager::SetRate(int player_id, double rate) { - Send(new MediaPlayerEflHostMsg_SetRate(routing_id(), player_id, rate)); -} - -void RendererMediaPlayerManager::DestroyPlayer(int player_id) { - Send(new MediaPlayerEflHostMsg_DeInit(routing_id(), player_id)); -} - -int RendererMediaPlayerManager::RegisterMediaPlayer( - WebMediaPlayerEfl* player) { - media_players_[next_media_player_id_] = player; - return next_media_player_id_++; -} - -void RendererMediaPlayerManager::UnregisterMediaPlayer(int player_id) { - media_players_.erase(player_id); -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.h b/tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.h deleted file mode 100644 index a9f888b..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.h +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_MEDIA_EFL_RENDERER_MEDIA_PLAYER_MANAGER_EFL_H_ -#define CONTENT_RENDERER_MEDIA_EFL_RENDERER_MEDIA_PLAYER_MANAGER_EFL_H_ - -#include - -#include "base/memory/shared_memory.h" -#include "content/common/media/efl/media_player_messages_enums_efl.h" -#include "content/public/renderer/render_frame_observer.h" -#include "media/base/efl/media_player_efl.h" -#include "third_party/blink/public/platform/WebMediaPlayer.h" -#include "url/gurl.h" -#if defined(TIZEN_TBM_SUPPORT) -#include "ui/gfx/gpu_memory_buffer.h" -#endif - -namespace content { -class WebMediaPlayerEfl; - -class RendererMediaPlayerManager : public RenderFrameObserver { - public: - // Constructs a RendererMediaPlayerManager object for the |render_frame|. - explicit RendererMediaPlayerManager(RenderFrame* render_frame); - ~RendererMediaPlayerManager() override; - - RendererMediaPlayerManager(const RendererMediaPlayerManager&) = delete; - RendererMediaPlayerManager& operator=(const RendererMediaPlayerManager&) = - delete; - - // Initializes a MediaPlayerEfl object in browser process. - void Initialize(int player_id, MediaPlayerHostMsg_Initialize_Type type, - const GURL& url, double volume, int demuxer_client_id); - - // Starts the player. - void Play(int player_id); - - // Pauses the player. - // is_media_related_action should be true if this pause is coming from an - // an action that explicitly pauses the video (user pressing pause, JS, etc.) - // Otherwise it should be false if Pause is being called due to other reasons - // (cleanup, freeing resources, etc.) - void Pause(int player_id, bool is_media_related_action); - - // Performs seek on the player. - void Seek(int player_id, double time); - - // Sets the player volume. - void SetVolume(int player_id, double volume); - - // Sets the playback rate. - void SetRate(int player_id, double rate); - - // Destroys the player in the browser process - void DestroyPlayer(int player_id); - - // Registers and unregisters a WebMediaPlayerEfl object. - int RegisterMediaPlayer(WebMediaPlayerEfl* player); - void UnregisterMediaPlayer(int player_id); - - // RenderFrameObserver overrides. - bool OnMessageReceived(const IPC::Message& message) override; - void WasHidden() override; - void OnStop() override; - - // Pause the playing media players when tab/webpage goes to background - void PausePlayingPlayers(); - - private: - void OnNewFrameAvailable(int player_id, - base::SharedMemoryHandle foreign_memory_handle, - uint32_t length, base::TimeDelta timestamp); - -#if defined(TIZEN_TBM_SUPPORT) - void OnNewTbmBufferAvailable(int player_id, gfx::TbmBufferHandle tbm_handle, - base::TimeDelta timestamp); - void OnTbmBufferRelease(gfx::TbmBufferHandle tbm_handle); -#endif - - WebMediaPlayerEfl* GetMediaPlayer(int player_id); - void OnMediaDataChange(int player_id, int width, int height, int media); - void OnDurationChange(int player_id, double duration); - void OnTimeUpdate(int player_id, double current_time); - void OnBufferUpdate( - int player_id, - std::vector buffer_range); - void OnTimeChanged(int player_id); - void OnPauseStateChange(int player_id, bool state); - void OnSeekStateChange(int player_id, bool state); - void OnRequestSeek(int player_id, double seek_time); - void OnReadyStateChange(int player_id, - blink::WebMediaPlayer::ReadyState state); - void OnNetworkStateChange(int player_id, - blink::WebMediaPlayer::NetworkState state); - - private: - std::map media_players_; - int next_media_player_id_; -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_EFL_RENDERER_MEDIA_PLAYER_MANAGER_EFL_H_ diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.cc b/tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.cc deleted file mode 100644 index e97faa6..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.cc +++ /dev/null @@ -1,636 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/media/efl/webmediaplayer_efl.h" - -#include "cc/blink/web_layer_impl.h" -#include "cc/layers/video_layer.h" -#include "content/renderer/media/render_media_log.h" -#include "content/renderer/media/renderer_gpu_video_accelerator_factories.h" -#include "content/renderer/render_frame_impl.h" -#include "content/renderer/render_thread_impl.h" -#include "media/base/bind_to_current_loop.h" -#include "media/base/efl/media_player_util_efl.h" -#include "media/base/video_frame.h" -#include "media/blink/webmediaplayer_util.h" -#include "third_party/blink/public/platform/WebMediaPlayer.h" -#include "third_party/blink/public/platform/WebMediaPlayerClient.h" -#include "third_party/libyuv/include/libyuv/planar_functions.h" - -#define BIND_TO_RENDER_LOOP(function) \ - (DCHECK(main_loop_->BelongsToCurrentThread()), \ - media::BindToCurrentLoop(base::BindOnce(function, AsWeakPtr()))) - -// Round up 'x' to Multiple of 'a' byte. -// To properly use planes from tbm, width and height should round up to 16. -#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) - -using media::VideoFrame; - -namespace content { - -blink::WebMediaPlayer* CreateWebMediaPlayerEfl( - content::RendererMediaPlayerManager* manager, - blink::WebFrame* frame, - blink::WebMediaPlayerClient* client, - base::WeakPtr delegate, - const media::WebMediaPlayerParams& params) { - return new WebMediaPlayerEfl(manager, frame, client, delegate, params); -} - -WebMediaPlayerEfl::WebMediaPlayerEfl( - RendererMediaPlayerManager* manager, - blink::WebFrame* frame, - blink::WebMediaPlayerClient* client, - base::WeakPtr delegate, - const media::WebMediaPlayerParams& params) - : frame_(frame), - network_state_(blink::WebMediaPlayer::NetworkStateEmpty), - ready_state_(blink::WebMediaPlayer::ReadyStateHaveNothing), - main_loop_(base::ThreadTaskRunnerHandle::Get()), - media_task_runner_(params.media_task_runner()), - manager_(manager), - client_(client), - media_log_(params.media_log()), - delegate_(delegate), - defer_load_cb_(params.defer_load_cb()), - // Threaded compositing isn't enabled universally yet. - compositor_task_runner_( - params.compositor_task_runner() - ? params.compositor_task_runner() - : base::MessageLoop::current()->task_runner()), - compositor_(new media::VideoFrameCompositor( - compositor_task_runner_, - BIND_TO_RENDER_LOOP(&WebMediaPlayerEfl::OnNaturalSizeChanged), - BIND_TO_RENDER_LOOP(&WebMediaPlayerEfl::OnOpacityChanged))), - weak_factory_(this), - video_width_(0), - video_height_(0), - audio_(false), - video_(false), - current_time_(0), - duration_(0), - is_paused_(true), - is_seeking_(false), - seek_time_(0), - pending_seek_(0), - pending_seek_time_(0), - opaque_(false), - natural_size_(0, 0), - did_loading_progress_(false), - gpu_factories_(RenderThreadImpl::current()->GetGpuFactories()) -#if defined(TIZEN_MULTIMEDIA_EME_SUPPORT) - , encrypted_media_support_( - params.CreateEncryptedMediaPlayerSupport(client)) -#endif - { - DCHECK(manager_); -#if defined(TIZEN_MULTIMEDIA_EME_SUPPORT) - DCHECK(encrypted_media_support_); -#endif - - player_id_ = manager_->RegisterMediaPlayer(this); - - media_log_->AddEvent( - media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); -} - -WebMediaPlayerEfl::~WebMediaPlayerEfl() { - if (manager_) { - manager_->DestroyPlayer(player_id_); - manager_->UnregisterMediaPlayer(player_id_); - } - - compositor_->SetVideoFrameProviderClient(NULL); - client_->setWebLayer(NULL); - if (delegate_.get()) - delegate_->PlayerGone(this); - compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_); - if (media_source_delegate_) { - // Part of |media_source_delegate_| needs to be stopped - // on the media thread. - // Wait until |media_source_delegate_| is fully stopped - // before tearing down other objects. - base::WaitableEvent waiter(false, false); - media_source_delegate_->Stop(base::BindOnce(&base::WaitableEvent::Signal, - base::Unretained(&waiter))); - waiter.Wait(); - } -} - -void WebMediaPlayerEfl::load(LoadType load_type, - const blink::WebURL& url, - CORSMode /* cors_mode */) { - if (!defer_load_cb_.is_null()) { - defer_load_cb_.Run(base::BindOnce(&WebMediaPlayerEfl::DoLoad, AsWeakPtr(), - load_type, url)); - return; - } - DoLoad(load_type, url); -} - -void WebMediaPlayerEfl::DoLoad(LoadType load_type, const blink::WebURL& url) { - int demuxer_client_id = 0; - if (load_type == LoadTypeMediaSource) { - player_type_ = MEDIA_PLAYER_TYPE_MEDIA_SOURCE; - RendererDemuxerEfl* demuxer = - static_cast( - RenderThreadImpl::current()->renderer_demuxer()); - demuxer_client_id = demuxer->GetNextDemuxerClientID(); - media_source_delegate_.reset(new MediaSourceDelegateEfl( - demuxer, demuxer_client_id, media_task_runner_, media_log_.get())); - media::SetCdmReadyCB set_cdm_ready_cb; - media::Demuxer::EncryptedMediaInitDataCB emedia_init_data_cb; -#if defined(TIZEN_MULTIMEDIA_EME_SUPPORT) - set_cdm_ready_cb = - encrypted_media_support_->CreateSetDecryptorReadyCB(); - emedia_init_data_cb = - encrypted_media_support_->CreateNeedKeyCB(); -#endif - media_source_delegate_->InitializeMediaSource( - base::BindOnce(&WebMediaPlayerEfl::OnMediaSourceOpened, - weak_factory_.GetWeakPtr()), - emedia_init_data_cb, set_cdm_ready_cb, - base::BindOnce(&WebMediaPlayerEfl::SetNetworkState, - weak_factory_.GetWeakPtr()), - base::BindOnce(&WebMediaPlayerEfl::OnDurationChange, - weak_factory_.GetWeakPtr()), - base::BindOnce(&WebMediaPlayerEfl::OnWaitingForDecryptionKey, - weak_factory_.GetWeakPtr())); - } else if (load_type == LoadTypeURL) { - player_type_ = MEDIA_PLAYER_TYPE_URL; - } else { - LOG(ERROR) << "Unsupported load type : " << load_type; - return; - } - - manager_->Initialize(player_id_, player_type_, - media::GetCleanURL(url.string().utf8()), - 0, demuxer_client_id); -} - -#if defined(TIZEN_MULTIMEDIA_EME_SUPPORT) -blink::WebMediaPlayer::MediaKeyException -WebMediaPlayerEfl::generateKeyRequest(const blink::WebString& key_system, - const unsigned char* init_data, - unsigned init_data_length) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - return encrypted_media_support_->GenerateKeyRequest( - frame_, key_system, init_data, init_data_length); -} - -blink::WebMediaPlayer::MediaKeyException WebMediaPlayerEfl::addKey( - const blink::WebString& key_system, - const unsigned char* key, - unsigned key_length, - const unsigned char* init_data, - unsigned init_data_length, - const blink::WebString& session_id) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - return encrypted_media_support_->AddKey( - key_system, key, key_length, init_data, init_data_length, session_id); -} - -blink::WebMediaPlayer::MediaKeyException WebMediaPlayerEfl::cancelKeyRequest( - const blink::WebString& key_system, - const blink::WebString& session_id) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - return encrypted_media_support_->CancelKeyRequest(key_system, session_id); -} - -void WebMediaPlayerEfl::setContentDecryptionModule( - blink::WebContentDecryptionModule* cdm) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - encrypted_media_support_->SetContentDecryptionModule(cdm); -} - -void WebMediaPlayerEfl::setContentDecryptionModule( - blink::WebContentDecryptionModule* cdm, - blink::WebContentDecryptionModuleResult result) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - encrypted_media_support_->SetContentDecryptionModule(cdm, result); -} -#endif - -void WebMediaPlayerEfl::OnMediaSourceOpened( - blink::WebMediaSource* web_media_source) { - DCHECK(client_); - client_->mediaSourceOpened(web_media_source); -} - -void WebMediaPlayerEfl::OnWaitingForDecryptionKey() { - encrypted_client_->didBlockPlaybackWaitingForKey(); - - // TODO(jrummell): didResumePlaybackBlockedForKey() should only be called - // when a key has been successfully added (e.g. OnSessionKeysChange() with - // |has_additional_usable_key| = true). http://crbug.com/461903 - encrypted_client_->didResumePlaybackBlockedForKey(); -} - -void WebMediaPlayerEfl::play() { - manager_->Play(player_id_); - // Has to be updated from |MediaPlayerEfl| but IPC causes delay. - // There are cases were play - pause are fired successively and would fail. - is_paused_ = false; -} - -void WebMediaPlayerEfl::pause() { - manager_->Pause(player_id_, true); - // Has to be updated from |MediaPlayerEfl| but IPC causes delay. - // There are cases were play - pause are fired successively and would fail. - is_paused_ = true; -} - -void WebMediaPlayerEfl::RequestPause() { - switch (network_state_) { - // Pause the media player and inform Blink if the player is in a good - // shape. - case WebMediaPlayer::NetworkStateIdle: - case WebMediaPlayer::NetworkStateLoading: - case WebMediaPlayer::NetworkStateLoaded: - pause(); - client_->playbackStateChanged(); - break; - // If a WebMediaPlayer instance has entered into other then above states, - // the internal network state in HTMLMediaElement could be set to empty. - // And calling playbackStateChanged() could get this object deleted. - default: - break; - } -} - -bool WebMediaPlayerEfl::supportsSave() const { - return false; -} - -void WebMediaPlayerEfl::seek(double seconds) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - if (is_seeking_) { - if (seconds == seek_time_) { - if (media_source_delegate_) { - if (!pending_seek_) { - // If using media source demuxer, only suppress redundant seeks if - // there is no pending seek. This enforces that any pending seek that - // results in a demuxer seek is preceded by matching - // CancelPendingSeek() and StartSeek() calls. - return; - } - } else { - // Suppress all redundant seeks if unrestricted by media source - // demuxer API. - pending_seek_ = false; - return; - } - } - - pending_seek_ = true; - pending_seek_time_ = seconds; - if (media_source_delegate_) - media_source_delegate_->CancelPendingSeek( - base::TimeDelta::FromSecondsD(pending_seek_time_)); - // Later, OnSeekComplete will trigger the pending seek. - return; - } - - is_seeking_ = true; - seek_time_ = seconds; - - // Once Chunk demuxer seeks |MediaPlayerEfl| seek will be intiated. - if (media_source_delegate_) - media_source_delegate_->StartWaitingForSeek( - base::TimeDelta::FromSecondsD(seek_time_)); - manager_->Seek(player_id_, seek_time_); - - // Draw empty frame during seek. - if (video_) { - gfx::Size size(video_width_, video_height_); - scoped_refptr video_frame = VideoFrame::CreateBlackFrame(size); - FrameReady(video_frame); - } -} - -void WebMediaPlayerEfl::setRate(double rate) { - manager_->SetRate(player_id_, rate); -} - -void WebMediaPlayerEfl::setVolume(double volume) { - manager_->SetVolume(player_id_, volume); -} - -blink::WebTimeRanges WebMediaPlayerEfl::buffered() const { - if (media_source_delegate_) - return media_source_delegate_->Buffered(); - return buffered_; -} - -blink::WebTimeRanges WebMediaPlayerEfl::seekable() const { - const double seekable_end = duration(); - if (std::isinf(seekable_end)) - return blink::WebTimeRanges(); - - blink::WebTimeRange seekable_range(0.0, seekable_end); - return blink::WebTimeRanges(&seekable_range, 1); -} - -void WebMediaPlayerEfl::setSinkId( - const blink::WebString& device_id, - const blink::WebSecurityOrigin& security_origin, - blink::WebSetSinkIdCallbacks* web_callback) { - DCHECK(main_loop_->BelongsToCurrentThread()); - scoped_ptr callback(web_callback); - callback->onError(blink::WebSetSinkIdError::NotSupported); -} - -void WebMediaPlayerEfl::paint(blink::WebCanvas* canvas, - const blink::WebRect& rect, - unsigned char alpha, - SkXfermode::Mode mode) { - scoped_refptr video_frame = - GetCurrentFrameFromCompositor(); - - gfx::RectF gfx_rect(rect); - media::Context3D context_3d; - skcanvas_video_renderer_.Paint( - video_frame.get(), canvas, gfx_rect, alpha, - SkXfermode::kSrcOver_Mode, media::VIDEO_ROTATION_0, context_3d); -} - -bool WebMediaPlayerEfl::hasVideo() const { - return video_; -} - -bool WebMediaPlayerEfl::hasAudio() const { - return audio_; -} - -blink::WebSize WebMediaPlayerEfl::naturalSize() const { - return blink::WebSize(natural_size_); -} - -bool WebMediaPlayerEfl::paused() const { - return is_paused_; -} - -bool WebMediaPlayerEfl::seeking() const { - return is_seeking_; -} - -double WebMediaPlayerEfl::duration() const { - return duration_; -} - -double WebMediaPlayerEfl::currentTime() const { - if (seeking()) - return pending_seek_ ? pending_seek_time_ : seek_time_; - return current_time_; -} - -blink::WebMediaPlayer::NetworkState WebMediaPlayerEfl::networkState() const { - return network_state_; -} - -blink::WebMediaPlayer::ReadyState WebMediaPlayerEfl::readyState() const { - return ready_state_; -} - -bool WebMediaPlayerEfl::didLoadingProgress() { - if (did_loading_progress_) { - did_loading_progress_ = false; - return true; - } - return false; -} - -bool WebMediaPlayerEfl::hasSingleSecurityOrigin() const { - return true; -} - -bool WebMediaPlayerEfl::didPassCORSAccessCheck() const { - return false; -} - -double WebMediaPlayerEfl::mediaTimeForTimeValue(double timeValue) const { - return base::TimeDelta::FromSecondsD(timeValue).InSecondsF(); -} - -unsigned WebMediaPlayerEfl::decodedFrameCount() const { - return 0; -}; - -unsigned WebMediaPlayerEfl::droppedFrameCount() const { - return 0; -}; - -unsigned WebMediaPlayerEfl::audioDecodedByteCount() const { - return 0; -}; - -unsigned WebMediaPlayerEfl::videoDecodedByteCount() const { - return 0; -}; - -void WebMediaPlayerEfl::SetReadyState(WebMediaPlayer::ReadyState state) { - ready_state_ = state; - client_->readyStateChanged(); -} - -void WebMediaPlayerEfl::SetNetworkState(WebMediaPlayer::NetworkState state) { - network_state_ = state; - client_->networkStateChanged(); -} - -#if defined(TIZEN_TBM_SUPPORT) -void WebMediaPlayerEfl::OnNewTbmBufferAvailable( - const gfx::TbmBufferHandle& tbm_handle, base::TimeDelta timestamp, - const base::Closure& cb) { - gfx::Size size(video_width_, video_height_); - scoped_refptr video_frame = - VideoFrame::WrapTBMSurface(size, timestamp, tbm_handle); - video_frame->AddDestructionObserver(cb); - FrameReady(video_frame); -} -#endif - -void WebMediaPlayerEfl::OnNewFrameAvailable(base::SharedMemoryHandle handle, - uint32 yuv_size, - base::TimeDelta timestamp) { - base::SharedMemory shared_memory(handle, false); - if (!shared_memory.Map(yuv_size)) { - LOG(ERROR) << "Failed to map shared memory for size " << yuv_size; - return; - } - - uint8* const yuv_buffer = static_cast(shared_memory.memory()); - gfx::Size size(video_width_, video_height_); - scoped_refptr video_frame = - VideoFrame::CreateFrame( - media::PIXEL_FORMAT_YV12, size, gfx::Rect(size), size, timestamp); - - uint8* video_buf = yuv_buffer; - const uint c_frm_size = yuv_size / 6; - const uint y_frm_size = c_frm_size << 2; // * 4; - - // U Plane buffer. - uint8* video_buf_u = video_buf + y_frm_size; - - // V Plane buffer. - uint8* video_buf_v = video_buf_u + c_frm_size; - - // Get the videoframe stride size. - // Calculate the video buffer stride size. - const uint uv_rows = video_frame.get()->rows(VideoFrame::kUPlane); - const uint video_stride = c_frm_size / uv_rows; - - libyuv::I420Copy(video_buf, 2 * video_stride, - video_buf_u, video_stride, - video_buf_v, video_stride, - video_frame.get()->data(VideoFrame::kYPlane), - video_frame.get()->stride(VideoFrame::kYPlane), - video_frame.get()->data(VideoFrame::kUPlane), - video_frame.get()->stride(VideoFrame::kUPlane), - video_frame.get()->data(VideoFrame::kVPlane), - video_frame.get()->stride(VideoFrame::kVPlane), - video_width_, video_height_); - FrameReady(video_frame); -} - -void WebMediaPlayerEfl::FrameReady( - const scoped_refptr& frame) { - compositor_task_runner_->PostTask( - FROM_HERE, - base::BindOnce( - &media::VideoFrameCompositor::PaintFrameUsingOldRenderingPath, - base::Unretained(compositor_), frame)); -} - -void WebMediaPlayerEfl::OnMediaDataChange(int width, int height, int media) { - video_height_ = height; - video_width_ = width; - audio_ = media & media::MEDIA_AUDIO_MASK ? true : false; - video_ = media & media::MEDIA_VIDEO_MASK ? true : false; - natural_size_ = gfx::Size(width, height); - SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); - if (hasVideo() && !video_weblayer_.get()) { - scoped_refptr layer = - cc::VideoLayer::Create(cc_blink::WebLayerImpl::LayerSettings(), - compositor_, media::VIDEO_ROTATION_0); - video_weblayer_.reset(new cc_blink::WebLayerImpl(layer)); - video_weblayer_->setOpaque(opaque_); - client_->setWebLayer(video_weblayer_.get()); - } -} - -void WebMediaPlayerEfl::OnTimeChanged() { - is_seeking_ = false; - - // Handling pending seek for ME. For MSE |CancelPendingSeek| - // will handle the pending seeks. - if (!media_source_delegate_ && pending_seek_) { - pending_seek_ = false; - seek(pending_seek_time_); - return; - } - client_->timeChanged(); -} - -void WebMediaPlayerEfl::OnDurationChange(double duration) { - duration_ = duration; - client_->durationChanged(); -} - -void WebMediaPlayerEfl::OnNaturalSizeChanged(gfx::Size size) { - DCHECK(main_loop_->BelongsToCurrentThread()); - DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); - media_log_->AddEvent( - media_log_->CreateVideoSizeSetEvent(size.width(), size.height())); - natural_size_ = size; - - client_->sizeChanged(); -} - -void WebMediaPlayerEfl::OnOpacityChanged(bool opaque) { - DCHECK(main_loop_->BelongsToCurrentThread()); - DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); - - opaque_ = opaque; - if (video_weblayer_) - video_weblayer_->setOpaque(opaque_); -} - -static void GetCurrentFrameAndSignal( - media::VideoFrameCompositor* compositor, - scoped_refptr* video_frame_out, - base::WaitableEvent* event) { - *video_frame_out = compositor->GetCurrentFrame(); - event->Signal(); -} - -scoped_refptr -WebMediaPlayerEfl::GetCurrentFrameFromCompositor() { - if (compositor_task_runner_->BelongsToCurrentThread()) - return compositor_->GetCurrentFrame(); - - // Use a posted task and waitable event instead of a lock otherwise - // WebGL/Canvas can see different content than what the compositor is seeing. - scoped_refptr video_frame; - base::WaitableEvent event(false, false); - compositor_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&GetCurrentFrameAndSignal, base::Unretained(compositor_), - &video_frame, &event)); - event.Wait(); - return video_frame; -} - -void WebMediaPlayerEfl::OnTimeUpdate(double current_time) { - current_time_ = current_time; -} - -void WebMediaPlayerEfl::OnBufferUpdate( - std::vector buffer_range) { - media::Ranges time_ranges; - std::vector::iterator tr_it; - for (tr_it = buffer_range.begin(); tr_it != buffer_range.end(); ++tr_it) { - time_ranges.Add( - base::TimeDelta::FromMicroseconds((*tr_it).start), - base::TimeDelta::FromMicroseconds((*tr_it).end)); - } - blink::WebTimeRanges web_ranges(ConvertToWebTimeRanges(time_ranges)); - buffered_.swap(web_ranges); - did_loading_progress_ = true; -} - -void WebMediaPlayerEfl::OnPauseStateChange(bool state) { - is_paused_ = state; - client_->playbackStateChanged(); - if (!delegate_) - return; - - if(is_paused_) - delegate_->DidPause(this); - else - delegate_->DidPlay(this); -} - -void WebMediaPlayerEfl::OnSeekStateChange(bool state) { - is_seeking_ = state; - // Draw empty frame during seek. - if (video_ && is_seeking_) { - gfx::Size size(video_width_, video_height_); - scoped_refptr video_frame = VideoFrame::CreateBlackFrame(size); - FrameReady(video_frame); - } -} - -void WebMediaPlayerEfl::OnRequestSeek(double seek_time) { - client_->requestSeek(seek_time); -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.h b/tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.h deleted file mode 100644 index bed7ba6..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.h +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_MEDIA_EFL_WEBMEDIAPLAYER_EFL_H_ -#define CONTENT_RENDERER_MEDIA_EFL_WEBMEDIAPLAYER_EFL_H_ - -#include - -#include "base/memory/shared_memory.h" -#include "base/message_loop/message_loop.h" -#include "cc/layers/video_frame_provider_client_impl.h" -#include "content/renderer/media/efl/media_source_delegate_efl.h" -#include "content/renderer/media/efl/renderer_media_player_manager_efl.h" -#include "media/base/efl/media_player_efl.h" -#include "media/blink/video_frame_compositor.h" -#include "media/blink/webmediaplayer_params.h" -#include "media/blink/webmediaplayer_util.h" -#include "media/renderers/skcanvas_video_renderer.h" -#include "third_party/blink/public/platform/WebMediaPlayer.h" -#include "third_party/blink/public/platform/WebMediaPlayerEncryptedMediaClient.h" - -#if defined(TIZEN_MULTIMEDIA_EME_SUPPORT) -#include "media/blink/encrypted_media_player_support.h" -#endif - -namespace blink { -class WebFrame; -class WebMediaPlayerClient; -} - -namespace cc_blink { -class WebLayerImpl; -} - -namespace media { -class GpuVideoAcceleratorFactories; -class MediaLog; -class MediaPlayerEfl; -class WebMediaPlayerDelegate; -class WebMediaPlayerEncryptedMediaClient; -} - -namespace content { -class RendererMediaPlayerManager; - -// This class implements blink::WebMediaPlayer by keeping the efl -// media player in the browser process. It listens to all the status changes -// sent from the browser process and sends playback controls to the media -// player. -class WebMediaPlayerEfl - : public blink::WebMediaPlayer, - public base::SupportsWeakPtr { - public: - // Construct a WebMediaPlayerEfl object. This class communicates - // with the WebMediaPlayerEfl object in the browser process through - // |proxy|. - WebMediaPlayerEfl( - RendererMediaPlayerManager* manager, - blink::WebFrame* frame, - blink::WebMediaPlayerClient* client, - base::WeakPtr delegate, - const media::WebMediaPlayerParams& params); - ~WebMediaPlayerEfl() override; - - WebMediaPlayerEfl(const WebMediaPlayerEfl&) = delete; - WebMediaPlayerEfl& operator=(const WebMediaPlayerEfl&) = delete; - - // blink::WebMediaPlayer implementation. - void load(LoadType load_type, - const blink::WebURL& url, - CORSMode cors_mode) override; - - // Playback controls. - void play() override; - void pause() override; - bool supportsSave() const override; - void seek(double seconds) override; - void setRate(double) override; - void setVolume(double) override; - blink::WebTimeRanges buffered() const override; - blink::WebTimeRanges seekable() const override; - void setSinkId(const blink::WebString& sink_id, - const blink::WebSecurityOrigin& security_origin, - blink::WebSetSinkIdCallbacks* web_callback) override; - - void paint(blink::WebCanvas*, - const blink::WebRect&, - unsigned char alpha, - SkXfermode::Mode) override; - - // True if the loaded media has a playable video/audio track. - bool hasVideo() const override; - bool hasAudio() const override; - - // Dimension of the video. - blink::WebSize naturalSize() const override; - - // Getters of playback state. - bool paused() const override; - bool seeking() const override; - double duration() const override; - double currentTime() const override; - - // Internal states of loading and network. - NetworkState networkState() const override; - ReadyState readyState() const override; - - bool didLoadingProgress() override; - - bool hasSingleSecurityOrigin() const override; - bool didPassCORSAccessCheck() const override; - - double mediaTimeForTimeValue(double timeValue) const override; - - unsigned decodedFrameCount() const override; - unsigned droppedFrameCount() const override; - unsigned audioDecodedByteCount() const override; - unsigned videoDecodedByteCount() const override; - -#if defined(TIZEN_MULTIMEDIA_EME_SUPPORT) - virtual MediaKeyException generateKeyRequest( - const blink::WebString& key_system, - const unsigned char* init_data, - unsigned init_data_length); - - virtual MediaKeyException addKey(const blink::WebString& key_system, - const unsigned char* key, - unsigned key_length, - const unsigned char* init_data, - unsigned init_data_length, - const blink::WebString& session_id); - - virtual MediaKeyException cancelKeyRequest( - const blink::WebString& key_system, - const blink::WebString& session_id); - - // TODO(jrummell): Remove this method once Blink updated to use the other - // method. - virtual void setContentDecryptionModule( - blink::WebContentDecryptionModule* cdm); - virtual void setContentDecryptionModule( - blink::WebContentDecryptionModule* cdm, - blink::WebContentDecryptionModuleResult result); -#endif - - void SetReadyState(WebMediaPlayer::ReadyState state); - void SetNetworkState(WebMediaPlayer::NetworkState state); - - void OnNewFrameAvailable(base::SharedMemoryHandle foreign_memory_handle, - uint32_t length, base::TimeDelta timestamp); - -#if defined(TIZEN_TBM_SUPPORT) - void OnNewTbmBufferAvailable( - const gfx::TbmBufferHandle& tbm_handle, - base::TimeDelta timestamp, - const base::Closure& cb); -#endif - - void OnMediaDataChange(int width, int height, int media); - void OnDurationChange(double duration); - void OnTimeUpdate(double current_time); - void OnBufferUpdate( - std::vector buffer_range); - void OnTimeChanged(); - void OnPauseStateChange(bool state); - void OnSeekStateChange(bool state); - void OnRequestSeek(double seek_time); - - void OnMediaSourceOpened(blink::WebMediaSource* web_media_source); - void OnDemuxerSeekDone(); - - void RequestPause(); - - // Called when a decoder detects that the key needed to decrypt the stream - // is not available. - void OnWaitingForDecryptionKey(); - - private: - // Called after |defer_load_cb_| has decided to allow the load. If - // |defer_load_cb_| is null this is called immediately. - void DoLoad(LoadType load_type, const blink::WebURL& url); - - void OnNaturalSizeChanged(gfx::Size size); - void OnOpacityChanged(bool opaque); - - // Returns the current video frame from |compositor_|. Blocks until the - // compositor can return the frame. - scoped_refptr GetCurrentFrameFromCompositor(); - - // Called whenever there is new frame to be painted. - void FrameReady(const scoped_refptr& frame); - - blink::WebFrame* frame_; - - blink::WebMediaPlayer::NetworkState network_state_; - blink::WebMediaPlayer::ReadyState ready_state_; - - // Message loops for posting tasks on Chrome's main thread. Also used - // for DCHECKs so methods calls won't execute in the wrong thread. - const scoped_refptr main_loop_; - scoped_refptr media_task_runner_; - - // Manager for managing this object and for delegating method calls on - // Render Thread. - content::RendererMediaPlayerManager* manager_; - - blink::WebMediaPlayerClient* client_; - blink::WebMediaPlayerEncryptedMediaClient* encrypted_client_; - - scoped_refptr media_log_; - - base::WeakPtr delegate_; - - media::WebMediaPlayerParams::DeferLoadCB defer_load_cb_; - - // The compositor layer for displaying the video content when using - // composited playback. - scoped_ptr video_weblayer_; - - // Video rendering members. - scoped_refptr compositor_task_runner_; - media::VideoFrameCompositor* compositor_; - media::SkCanvasVideoRenderer skcanvas_video_renderer_; - - base::WeakPtrFactory weak_factory_; - scoped_ptr media_source_delegate_; - MediaPlayerHostMsg_Initialize_Type player_type_; - - // Player ID assigned by the |manager_|. - int player_id_; - - int video_width_; - int video_height_; - - bool audio_; - bool video_; - - double current_time_; - double duration_; - bool is_paused_; - - bool is_seeking_; - double seek_time_; - bool pending_seek_; - double pending_seek_time_; - - // Whether the video is known to be opaque or not. - bool opaque_; - - gfx::Size natural_size_; - blink::WebTimeRanges buffered_; - mutable bool did_loading_progress_; - - // Factories for supporting video accelerators. May be null. - media::GpuVideoAcceleratorFactories* gpu_factories_; -#if defined(TIZEN_MULTIMEDIA_EME_SUPPORT) - scoped_ptr encrypted_media_support_; -#endif -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_EFL_WEBMEDIAPLAYER_EFL_H_ diff --git a/tizen_src/chromium_impl/content/renderer/media/tizen/audio_decoder_capi.cc b/tizen_src/chromium_impl/content/renderer/media/tizen/audio_decoder_capi.cc deleted file mode 100644 index 8f46615..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/tizen/audio_decoder_capi.cc +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/media/efl/audio_decoder_efl.h" - -#include "base/memory/shared_memory.h" -#include "base/posix/eintr_wrapper.h" -#include "base/process/process.h" -#include "base/strings/string_util.h" -#include "base/time/time.h" -#include "content/child/thread_safe_sender.h" -#include "content/common/render_messages_efl.h" -#include "media/base/audio_bus.h" -#include "media/base/efl/webaudio_media_codec_info_efl.h" -#include "media/base/limits.h" -#include "public/platform/Platform.h" -#include "third_party/blink/public/platform/WebAudioBus.h" - -namespace content { - -const size_t kAudioDataSizeLimit = 0x80000000; - -class AudioDecoderIO { - public: - AudioDecoderIO(const char* data, size_t data_size); - virtual ~AudioDecoderIO(); - - AudioDecoderIO(const AudioDecoderIO&) = delete; - AudioDecoderIO& operator=(const AudioDecoderIO&) = delete; - - bool ShareEncodedDataToProcess(base::SharedMemoryHandle* handle); - - // Returns true if |AudioDecoderIO| was successfully created. - bool IsValid() const; - - int GetReadFd() const { return read_fd_; } - int GetWriteFd() const { return write_fd_; } - - private: - // Shared memory that will hold the encoded audio data. This is - // used by |MediaCodec| for decoding. - base::SharedMemory encoded_data_handle_; - - // A pipe used to communicate with MediaCodec. MediaCodec owns - // write_fd_ and writes to it. - int read_fd_; - int write_fd_; -}; - -AudioDecoderIO::AudioDecoderIO(const char* data, size_t data_size) - : read_fd_(-1), write_fd_(-1) { - if (!data || data_size > kAudioDataSizeLimit || data_size <= 0) { - LOG(ERROR) << " Invalid Data"; - return; - } - - // Create the shared memory and copy our data to it so that - // |MediaCodec| can access it. - if(!encoded_data_handle_.CreateAndMapAnonymous(data_size)) { - LOG(ERROR) << " Creation of shared memory failed"; - return; - } - - if (!encoded_data_handle_.memory()) { - LOG(ERROR) << " Invalid shared memory"; - return; - } - - memcpy(encoded_data_handle_.memory(), data, data_size); - - // Create a pipe for reading/writing the decoded PCM data - int pipefd[2] = {0}; - if (-1 == pipe(pipefd)) { - LOG(INFO) <<" Pipe is already created"; - return; - } - - read_fd_ = pipefd[0]; - write_fd_ = pipefd[1]; -} - -AudioDecoderIO::~AudioDecoderIO() { - // Close the read end of the pipe. The write end should have been - // closed by |MediaCodec|. - if (read_fd_ >= 0 && close(read_fd_)) { - LOG(WARNING) << "Cannot close read fd " << read_fd_ - << ": " << strerror(errno); - } - read_fd_ = -1; - write_fd_ = -1; -} - -bool AudioDecoderIO::IsValid() const { - return read_fd_ >= 0 && write_fd_ >= 0 && - encoded_data_handle_.memory(); -} - -bool AudioDecoderIO::ShareEncodedDataToProcess( - base::SharedMemoryHandle* handle) { - return encoded_data_handle_.ShareToProcess(base::GetCurrentProcessHandle(), - handle); -} - -static void CopyPcmDataToBus(int input_fd, - blink::WebAudioBus* destination_bus, - size_t num_of_frames, - unsigned number_of_channels, - double file_sample_rate) { - - ssize_t lread = 0; - float sample = 0; - size_t samples_in_pipe = 0; - struct media::WebAudioMediaDataInfoEfl data_info; - std::vector decoded_samples[number_of_channels]; - while ((lread = - HANDLE_EINTR(read(input_fd, &data_info, sizeof(data_info)))) > 0) { - float pipe_data[data_info.size_ / sizeof(float)]; - - lread = HANDLE_EINTR(read(input_fd, pipe_data, sizeof(pipe_data))); - samples_in_pipe = lread / sizeof(float); - - for (size_t i = 0; i < number_of_channels; i++) { - if ((decoded_samples[i].size() + samples_in_pipe) > - decoded_samples[i].capacity()) { - decoded_samples[i].reserve( - std::max(samples_in_pipe, 2 * decoded_samples[i].capacity())); - } - } - std::copy(pipe_data, pipe_data + samples_in_pipe, - back_inserter(decoded_samples[data_info.channel_mask_ - 1])); - } - size_t number_of_samples = 0; - for (size_t i = 0; i < number_of_channels; i++) { - number_of_samples += decoded_samples[i].size(); - } - size_t number_of_frames = number_of_samples / number_of_channels; - size_t decoded_frames = 0; - destination_bus->initialize(number_of_channels, - number_of_frames, - file_sample_rate); - - for (size_t frames = 0; frames < number_of_frames; frames++) { - for (size_t channel = 0; channel < number_of_channels; channel++) { - sample = decoded_samples[channel][frames]; - destination_bus->channelData(channel)[decoded_frames] = sample; - } - ++decoded_frames; - } - LOG(INFO) << "decoded_frames : " << decoded_frames - << " number_of_frames : " << number_of_frames; - if (decoded_frames < number_of_frames) - destination_bus->resizeSmaller(decoded_frames); -} - -static void BufferAndCopyPcmDataToBus(int input_fd, - blink::WebAudioBus* destination_bus, - unsigned number_of_channels, - double file_sample_rate) { - ssize_t lread = 0; - float sample = 0; - size_t samples_in_pipe = 0; - struct media::WebAudioMediaDataInfoEfl data_info; - std::vector decoded_samples[number_of_channels]; - while ((lread = - HANDLE_EINTR(read(input_fd, &data_info, sizeof(data_info)))) > 0) { - float pipe_data[data_info.size_ / sizeof(float)]; - - lread = HANDLE_EINTR(read(input_fd, pipe_data, sizeof(pipe_data))); - samples_in_pipe = lread / sizeof(float); - - for (size_t i = 0; i < number_of_channels; i++) { - if ((decoded_samples[i].size() + samples_in_pipe) > - decoded_samples[i].capacity()) { - decoded_samples[i].reserve( - std::max(samples_in_pipe, 2 * decoded_samples[i].capacity())); - } - } - std::copy(pipe_data, pipe_data + samples_in_pipe, - back_inserter(decoded_samples[data_info.channel_mask_ - 1])); - } - size_t number_of_samples = 0; - for (size_t i = 0; i < number_of_channels; i++) { - number_of_samples += decoded_samples[i].size(); - } - size_t number_of_frames = number_of_samples / number_of_channels; - size_t decoded_frames = 0; - destination_bus->initialize(number_of_channels, - number_of_frames, - file_sample_rate); - - for (size_t frames = 0; frames < number_of_frames; frames++) { - for (size_t channel = 0; channel < number_of_channels; channel++) { - sample = decoded_samples[channel][frames]; - destination_bus->channelData(channel)[decoded_frames] = sample; - } - ++decoded_frames; - } - LOG(INFO) << "decoded_frames : " << decoded_frames - << " number_of_frames : " << number_of_frames; - - if (decoded_frames < number_of_frames) - destination_bus->resizeSmaller(decoded_frames); -} - -// Decode in-memory audio file data. -bool DecodeAudioFileData(blink::WebAudioBus* destination_bus, - const char* data, size_t data_size, - scoped_refptr sender) { - AudioDecoderIO audio_decoder(data, data_size); - - if (!audio_decoder.IsValid()) { - LOG(ERROR) << "Invalid audio_decoder"; - return false; - } - - base::SharedMemoryHandle encoded_data_handle; - audio_decoder.ShareEncodedDataToProcess(&encoded_data_handle); - base::FileDescriptor fd(audio_decoder.GetWriteFd(), true); - - // Start Decoding in browser process which will read from - // encoded_data_handle for our shared memory and write the decoded - // PCM samples (16-bit integer) to our pipe. - - sender->Send(new EflViewHostMsg_WebAudioDecode(encoded_data_handle, - fd, data_size)); - - int input_fd = audio_decoder.GetReadFd(); - struct media::WebAudioMediaCodecInfoEfl info; - - ssize_t nread = HANDLE_EINTR(read(input_fd, &info, sizeof(info))); - - if (nread != sizeof(info)) { - LOG(ERROR) << "Read Failed"; - return false; - } - - double file_sample_rate = static_cast(info.sample_rate_); - - // Sanity checks - if (!info.channel_count_ || - info.channel_count_ > media::limits::kMaxChannels || - file_sample_rate < media::limits::kMinSampleRate || - file_sample_rate > media::limits::kMaxSampleRate) { - return false; - } - - if (info.number_of_frames_> 0) { - CopyPcmDataToBus(input_fd, destination_bus, info.number_of_frames_, - info.channel_count_, file_sample_rate); - } else { - BufferAndCopyPcmDataToBus(input_fd, destination_bus, - info.channel_count_, file_sample_rate); - } - - return true; -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/renderer/renderer_efl.gni b/tizen_src/chromium_impl/content/renderer/renderer_efl.gni index 6e5706a..1b19cae 100644 --- a/tizen_src/chromium_impl/content/renderer/renderer_efl.gni +++ b/tizen_src/chromium_impl/content/renderer/renderer_efl.gni @@ -14,13 +14,6 @@ external_content_renderer_efl_configs = [ "//tizen_src/build:libtts", ] -if (tizen_multimedia_support) { - external_content_renderer_efl_configs += [ - "//tizen_src/build:capi-media-player", - "//tizen_src/build:libcapi-media-player", - ] -} - ############################################################################## # Dependency ############################################################################## @@ -34,23 +27,6 @@ external_content_renderer_efl_sources = [ "//tizen_src/chromium_impl/content/renderer/common_renderer_client.h", ] -if (tizen_multimedia_support) { - #"media/audio_decoder.cc", - #"media/audio_decoder.h", - external_content_renderer_efl_sources += [ - "media/efl/audio_decoder_efl.h", - "media/efl/media_source_delegate_efl.cc", - "media/efl/media_source_delegate_efl.h", - "media/efl/renderer_demuxer_efl.cc", - "media/efl/renderer_demuxer_efl.h", - "media/efl/renderer_media_player_manager_efl.cc", - "media/efl/renderer_media_player_manager_efl.h", - "media/efl/webmediaplayer_efl.cc", - "media/efl/webmediaplayer_efl.h", - "media/tizen/audio_decoder_capi.cc", - ] -} - if (tizen_multimedia) { external_content_renderer_efl_sources += [ "//tizen_src/chromium_impl/content/renderer/media/tizen/media_player_renderer_client.cc", diff --git a/tizen_src/chromium_impl/media/audio/tizen/audio_manager_tizen.cc b/tizen_src/chromium_impl/media/audio/tizen/audio_manager_tizen.cc deleted file mode 100644 index 7056b5b..0000000 --- a/tizen_src/chromium_impl/media/audio/tizen/audio_manager_tizen.cc +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2014 The Samsung Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#if defined(TIZEN_MULTIMEDIA_USE_CAPI_AUDIO_IO) -#include "media/audio/tizen/audio_manager_capi.h" -#else -#include "media/audio/pulse/audio_manager_pulse.h" -#endif - -namespace media { - -AudioManager* CreateAudioManager(AudioLogFactory* audio_log_factory) { -#if defined(TIZEN_MULTIMEDIA_USE_CAPI_AUDIO_IO) - return media::AudioManagerCapi::Create(audio_log_factory); -#else - return AudioManagerPulse::Create(audio_log_factory); -#endif -} - -} // namespace media diff --git a/tizen_src/chromium_impl/media/base/efl/demuxer_efl.h b/tizen_src/chromium_impl/media/base/efl/demuxer_efl.h deleted file mode 100644 index 12bd477..0000000 --- a/tizen_src/chromium_impl/media/base/efl/demuxer_efl.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_BASE_EFL_DEMUXER_EFL_H_ -#define MEDIA_BASE_EFL_DEMUXER_EFL_H_ - -#include "media/base/efl/demuxer_stream_player_params_efl.h" - -namespace media { - -// Defines the client callback interface. -class MEDIA_EXPORT DemuxerEflClient { - public: - // Called when the demuxer has initialized. - virtual void OnDemuxerConfigsAvailable(const DemuxerConfigs& params) = 0; - - // Called in response to RequestDemuxerData(). - virtual void OnDemuxerDataAvailable( - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data) = 0; - - // Called to inform demuxer seek completion. - virtual void OnDemuxerSeekDone( - const base::TimeDelta& actual_browser_seek_time) = 0; - - // Called whenever the demuxer has detected a duration change. - virtual void OnDemuxerDurationChanged(base::TimeDelta duration) = 0; - - protected: - virtual ~DemuxerEflClient() {} -}; - -// Defines a demuxer with asynchronous operations. -class MEDIA_EXPORT DemuxerEfl { - public: - virtual ~DemuxerEfl() {} - - // Initializes this demuxer with |client| as the callback handler. - // Must be called prior to calling any other methods. - virtual void Initialize(DemuxerEflClient* client) = 0; - - // Called to request demuxer seek. - virtual void RequestDemuxerSeek(const base::TimeDelta& time_to_seek) = 0; - - // Called to request additional data from the demuxer. - virtual void RequestDemuxerData(media::DemuxerStream::Type type) = 0; -}; - -} // namespace media - -#endif // MEDIA_BASE_EFL_DEMUXER_EFL_H_ \ No newline at end of file diff --git a/tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.cc b/tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.cc deleted file mode 100644 index 3e90f65..0000000 --- a/tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.cc +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "media/base/efl/demuxer_stream_player_params_efl.h" - -namespace media { - -DemuxerConfigs::DemuxerConfigs() - : audio_codec(kUnknownAudioCodec), - audio_channels(0), - audio_sampling_rate(0), - is_audio_encrypted(false), - video_codec(kUnknownVideoCodec), - is_video_encrypted(false), - duration_ms(0) {} - -DemuxerConfigs::~DemuxerConfigs() {} - -DemuxedBufferMetaData::DemuxedBufferMetaData() - : size(0), - end_of_stream(false), - type(DemuxerStream::UNKNOWN), - status(DemuxerStream::kAborted) {} - -DemuxedBufferMetaData::~DemuxedBufferMetaData() {} - -} // namespace media diff --git a/tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.h b/tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.h deleted file mode 100644 index 1678972..0000000 --- a/tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_BASE_EFL_DEMUXER_STREAM_PLAYER_PARAMS_EFL_H_ -#define MEDIA_BASE_EFL_DEMUXER_STREAM_PLAYER_PARAMS_EFL_H_ - -#include - -#include "media/base/audio_decoder_config.h" -#include "media/base/decrypt_config.h" -#include "media/base/demuxer_stream.h" -#include "media/base/media_export.h" -#include "media/base/video_decoder_config.h" -#include "ui/gfx/geometry/size.h" - -namespace media { - -struct MEDIA_EXPORT DemuxerConfigs { - DemuxerConfigs(); - ~DemuxerConfigs(); - - AudioCodec audio_codec; - int audio_channels; - int audio_sampling_rate; - bool is_audio_encrypted; - std::vector audio_extra_data; - - VideoCodec video_codec; - gfx::Size video_size; - bool is_video_encrypted; - std::vector video_extra_data; - - int duration_ms; -}; - -struct MEDIA_EXPORT DemuxedBufferMetaData { - DemuxedBufferMetaData(); - ~DemuxedBufferMetaData(); - - int size; - bool end_of_stream; - base::TimeDelta timestamp; - base::TimeDelta time_duration; - DemuxerStream::Type type; - DemuxerStream::Status status; -}; - -}; // namespace media - -#endif // MEDIA_BASE_EFL_DEMUXER_STREAM_PLAYER_PARAMS_EFL_H_ diff --git a/tizen_src/chromium_impl/media/base/efl/webaudio_decoder_efl.h b/tizen_src/chromium_impl/media/base/efl/webaudio_decoder_efl.h deleted file mode 100644 index 21a9412..0000000 --- a/tizen_src/chromium_impl/media/base/efl/webaudio_decoder_efl.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_BASE_EFL_WEBAUDIO_DECODER_EFL_H_ -#define MEDIA_BASE_EFL_WEBAUDIO_DECODER_EFL_H_ - -#include - -#include "base/memory/shared_memory.h" -#include "media/base/media_export.h" - -namespace media { - -class MEDIA_EXPORT WebAudioDecoder { - public: - static WebAudioDecoder* GetWebAudioDecoder(); - virtual void EncodedDataReceived(base::SharedMemoryHandle memory_handle, - base::FileDescriptor pcm_output, - uint32_t data_size) = 0; -}; - -} // namespace media -#endif // MEDIA_BASE_EFL_WEBAUDIO_DECODER_EFL_H_ diff --git a/tizen_src/chromium_impl/media/base/efl/webaudio_media_codec_info_efl.h b/tizen_src/chromium_impl/media/base/efl/webaudio_media_codec_info_efl.h deleted file mode 100644 index 734f820..0000000 --- a/tizen_src/chromium_impl/media/base/efl/webaudio_media_codec_info_efl.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_BASE_EFL_WEBAUDIO_MEDIA_CODEC_INFO_EFL_H_ -#define MEDIA_BASE_EFL_WEBAUDIO_MEDIA_CODEC_INFO_EFL_H_ - -namespace media { - -// This structure holds the information about the audio file -// determined by MediaCodec that is needed by the audio decoder to -// create the necessary destination bus. -struct WebAudioMediaCodecInfoEfl { - unsigned long channel_count_; - unsigned long sample_rate_; - unsigned long number_of_frames_; - WebAudioMediaCodecInfoEfl(unsigned long channel_count = 0, - unsigned long sample_rate = 0, - unsigned long number_of_frames = 0) - : channel_count_(channel_count), - sample_rate_(sample_rate), - number_of_frames_(number_of_frames) {} -}; - -struct WebAudioMediaDataInfoEfl { - int channel_mask_; - int size_; - WebAudioMediaDataInfoEfl(int channel_mask = 0, int size = 0) - : channel_mask_(channel_mask), - size_(size) {} -}; - -} // namespace media -#endif // MEDIA_BASE_EFL_WEBAUDIO_MEDIA_CODEC_INFO_EFL_H_ diff --git a/tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.cc b/tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.cc deleted file mode 100644 index 0f3f8ab..0000000 --- a/tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.cc +++ /dev/null @@ -1,951 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/process/process.h" -#include "base/thread_task_runner_handle.h" -#include "content/browser/media/efl/browser_demuxer_efl.h" -#include "media/base/efl/media_player_manager_efl.h" -#include "media/base/tizen/media_source_player_capi.h" -#include "third_party/libyuv/include/libyuv.h" - -namespace { -const int kDurationUpdateInterval = 100; - -// Waiting time for buffering while seeking. -const double kSeekBufferingWaitInSec = 2; - -// CAPI internal appsrc buffer size. -const uint64 max_size = 2097152; // 2MB - -// Appsrc minimum buffering level -const unsigned int min_threshold = 30; - -} // namespace - -namespace media { -void OnCapiPlayerPreparedCB(void* user_data) { - MediaSourcePlayerCapi* player = - static_cast(user_data); - player->OnPrepareComplete(); -} - -void OnSeekCompleteCB(void* user_data) { - MediaSourcePlayerCapi* player = - static_cast(user_data); - player->OnSeekComplete(); -} - -void OnHandleBufferingMessageCB(int percent, void* user_data) { - MediaSourcePlayerCapi* player = - static_cast(user_data); - player->OnHandleBufferingMessage(percent); -} - -void OnCapiAudioBufStatusCB(player_media_stream_buffer_status_e status, - void* user_data) { - MediaSourcePlayerCapi* player = - static_cast(user_data); - if (status == PLAYER_MEDIA_STREAM_BUFFER_UNDERRUN) { - player->OnUpdateDataStatus(media::DemuxerStream::AUDIO, true); - } else if (status == PLAYER_MEDIA_STREAM_BUFFER_OVERFLOW) { - player->OnUpdateDataStatus(media::DemuxerStream::AUDIO, false); - } -} - -void OnCapiVideoBufStatusCB(player_media_stream_buffer_status_e status, - void* user_data) { - MediaSourcePlayerCapi* player = - static_cast(user_data); - if (status == PLAYER_MEDIA_STREAM_BUFFER_UNDERRUN) { - player->OnUpdateDataStatus(media::DemuxerStream::VIDEO, true); - } else if (status == PLAYER_MEDIA_STREAM_BUFFER_OVERFLOW) { - player->OnUpdateDataStatus(media::DemuxerStream::VIDEO, false); - } -} - -static void OnMediaPacketDecoded(media_packet_h packet, void* data) { - if (!packet) { - LOG(ERROR) << "media_packet handle is null"; - return; - } - - MediaSourcePlayerCapi* player = static_cast(data); - player->OnMediaPacketUpdated(packet); -} - -void OnPlaybackCompleteCB(void* user_data) { - LOG(INFO) << "On playback complete Call back"; - MediaSourcePlayerCapi* player = - static_cast(user_data); - - if (!player) - return; - - player->OnPlaybackComplete(); -} - -void OnPlayerErrorCB(int error_code, void* user_data) { - MediaSourcePlayerCapi* player = - static_cast(user_data); - - if (!player) - return; - - player->OnHandlePlayerError(error_code, FROM_HERE); -} - -void MediaSourcePlayerCapi::PrepareComplete() { - player_prepared_ = true; - manager()->OnReadyStateChange( - GetPlayerId(), blink::WebMediaPlayer::ReadyStateHaveEnoughData); - manager()->OnNetworkStateChange( - GetPlayerId(), blink::WebMediaPlayer::NetworkStateLoaded); -} - -MediaPlayerEfl* MediaPlayerEfl::CreatePlayer( - int player_id, content::BrowserDemuxerEfl* demuxer, - int demuxer_id, MediaPlayerManager* manager) { - LOG(INFO) << "MediaSourceElement is using |CAPI| to play media"; - return new MediaSourcePlayerCapi(player_id, - demuxer->CreateDemuxer(demuxer_id), - manager); -} - -MediaSourcePlayerCapi::MediaSourcePlayerCapi(int player_id, - scoped_ptr demuxer, - MediaPlayerManager* manager) - : MediaPlayerEfl(player_id, manager), - demuxer_(std::move(demuxer)), - task_runner_(base::ThreadTaskRunnerHandle::Get()), - weak_this_(this), - player_(NULL), - media_type_(0), - duration_(0), - play_rate_(1.0f), - player_prepared_(false), - playing_(false), - is_end_reached_(false), - eos_audio_(false), - eos_video_(false), - error_occured_(false), - should_feed_audio_(false), - should_feed_video_(false), - seek_offset_(0), - seek_state_(MEDIA_SEEK_NONE), - media_packet_(NULL), - audio_format_(NULL), - video_format_(NULL), - weak_factory_(this) { - demuxer_->Initialize(this); - audio_buffer_queue_.clear(); - video_buffer_queue_.clear(); - - /*Init Player*/ - int ret = player_create(&player_); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - - ret = player_set_buffering_cb(player_, OnHandleBufferingMessageCB, this); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - - ret = player_set_sound_type(player_, SOUND_TYPE_MEDIA); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - ret = player_set_error_cb(player_, OnPlayerErrorCB, this); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - ret = player_set_completed_cb(player_, OnPlaybackCompleteCB, this); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - - ret = player_set_media_packet_video_frame_decoded_cb( - player_, OnMediaPacketDecoded, this); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - - player_set_display_visible(player_, true); - - ret = player_set_uri(player_, "es_buff://push_mode"); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } -} - -MediaSourcePlayerCapi::~MediaSourcePlayerCapi() { - Release(); - player_destroy(player_); -} - -void MediaSourcePlayerCapi::SeekComplete() { - DCHECK(task_runner_->BelongsToCurrentThread()); - UpdateSeekState(MEDIA_SEEK_NONE); - - // Initiate play for internal seeks. - if (GetPlayerState() != PLAYER_STATE_PLAYING) - Play(); - - manager()->OnTimeUpdate(GetPlayerId(), GetCurrentTime()); - manager()->OnTimeChanged(GetPlayerId()); -} - - -void MediaSourcePlayerCapi::UpdateSeekState(MediaSeekState state) { - switch (state) { - // Notify manager about player seek complete. - case MEDIA_SEEK_NONE: - manager()->OnSeekStateChange(GetPlayerId(), false); - break; - - // Notify manager about player seek start. - case MEDIA_SEEK_PLAYER: - manager()->OnSeekStateChange(GetPlayerId(), true); - break; - - // No need to notify manager about seek state change. - case MEDIA_SEEK_DEMUXER: - case MEDIA_SEEK_DEMUXER_DONE: - break; - - default: - NOTREACHED(); - break; - } - - seek_state_ = state; -} - -void MediaSourcePlayerCapi::SetRate(double rate) { - if (play_rate_ == rate) - return; - - if (rate == 0.0) { - play_rate_ = rate; - Pause(true); - return; - } - - // FIXME: |player_set_playback_rate| is always failing. - int err = player_set_playback_rate(player_, static_cast(rate)); - if (err != PLAYER_ERROR_NONE) { - OnHandlePlayerError(err, FROM_HERE); - return; - } else { - // If previous rate was zero and requested rate is non-zero, change the - // playback rate and call play. - if (play_rate_ == 0.0) { - play_rate_ = rate; - Play(); - } else { - play_rate_ = rate; - } - } -} - -void MediaSourcePlayerCapi::Seek(const double time) { - UpdateSeekState(MEDIA_SEEK_DEMUXER); - if (GetPlayerState() == PLAYER_STATE_PLAYING) - Pause(true); - - seek_offset_ = time; - - base::TimeDelta seek_time = base::TimeDelta::FromSecondsD(time); - demuxer_->RequestDemuxerSeek(seek_time); -} - -player_state_e MediaSourcePlayerCapi::GetPlayerState() { - player_state_e state = PLAYER_STATE_NONE; - player_get_state(player_, &state); - LOG(INFO) << __FUNCTION__ << " state " << state; - return state; -} - -void MediaSourcePlayerCapi::SeekInternal() { - if (error_occured_) - return; - - int ret = PLAYER_ERROR_NONE; - ret = player_set_play_position( - player_, ConvertSecondsToMilliSeconds(seek_offset_), - true, OnSeekCompleteCB, this); - - seek_offset_ = 0.0; - - MediaSeekState state = MEDIA_SEEK_PLAYER; - if (ret != PLAYER_ERROR_NONE) { - LOG(ERROR) << "Seek to " << " failed"; - OnHandlePlayerError(ret, FROM_HERE); - state = MEDIA_SEEK_NONE; - } - UpdateSeekState(state); -} - -void MediaSourcePlayerCapi::OnDemuxerDurationChanged( - base::TimeDelta duration) { - duration_ = duration.InSecondsF(); -} - -void MediaSourcePlayerCapi::OnDemuxerSeekDone( - const base::TimeDelta& actual_browser_seek_time) { - if (error_occured_) - return; - - seek_offset_ = actual_browser_seek_time.InSecondsF(); - UpdateSeekState(MEDIA_SEEK_DEMUXER_DONE); - - audio_buffer_queue_.clear(); - video_buffer_queue_.clear(); - - OnReadDemuxedData(media::DemuxerStream::AUDIO); - OnReadDemuxedData(media::DemuxerStream::VIDEO); -} - -void MediaSourcePlayerCapi::OnMediaPacketUpdated(media_packet_h packet) { - ScopedMediaPacket packet_proxy(packet); - task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&MediaSourcePlayerCapi::DeliverMediaPacket, - weak_factory_.GetWeakPtr(), base::Passed(&packet_proxy))); -} - -void MediaSourcePlayerCapi::SetVolume(double volume) { - if (GetPlayerState() <= PLAYER_STATE_IDLE) - return; - - if (player_set_volume(player_, volume, volume) != PLAYER_ERROR_NONE) - LOG(ERROR) << "|player_set_volume| failed"; -} - -double MediaSourcePlayerCapi::GetCurrentTime() { - if (error_occured_) - return 0.0; - - int position = 0; - player_get_play_position(player_, &position); - return ConvertMilliSecondsToSeconds(position); -} - -void MediaSourcePlayerCapi::OnCurrentTimeUpdateTimerFired() { - manager()->OnTimeUpdate(GetPlayerId(), GetCurrentTime()); -} - -void MediaSourcePlayerCapi::StartCurrentTimeUpdateTimer() { - if (current_time_update_timer_.IsRunning()) - return; - - current_time_update_timer_.Start( - FROM_HERE, - base::TimeDelta::FromMilliseconds(kDurationUpdateInterval), - this, - &MediaSourcePlayerCapi::OnCurrentTimeUpdateTimerFired); -} - -void MediaSourcePlayerCapi::StopCurrentTimeUpdateTimer() { - if (current_time_update_timer_.IsRunning()) - current_time_update_timer_.Stop(); -} - -void MediaSourcePlayerCapi::Play() { - if (error_occured_ || playing_ || !player_prepared_) - return; - - if (play_rate_ == 0.0) { - playing_ = true; - return; - } - - WakeUpDisplayAndAcquireDisplayLock(); - - int ret = player_start(player_); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - playing_ = true; - StartCurrentTimeUpdateTimer(); -} - -void MediaSourcePlayerCapi::Pause(bool is_media_related_action) { - if (error_occured_ || !playing_) - return; - - if (GetPlayerState() != PLAYER_STATE_PLAYING) { - LOG(WARNING) << "Can't PAUSE player"; - return; - } - - int ret = player_pause(player_); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - StopCurrentTimeUpdateTimer(); - if (!is_media_related_action) { - ReleaseDisplayLock(); - } - playing_ = false; -} - -void MediaSourcePlayerCapi::PlaybackComplete() { - double time = GetCurrentTime() != duration_ ? duration_ : GetCurrentTime(); - is_end_reached_ = true; - StopCurrentTimeUpdateTimer(); - manager()->OnTimeUpdate(GetPlayerId(), time); - manager()->OnTimeChanged(GetPlayerId()); - ReleaseDisplayLock(); -} - -// TODO(sam) : It's worked as bypass now. Need Suspend/Resume/Initialize -// implementation for MSE multiple instance. -void MediaSourcePlayerCapi::Initialize() { - manager()->OnInitComplete(GetPlayerId(), true); -} - -void MediaSourcePlayerCapi::Release() { - playing_ = false; - StopCurrentTimeUpdateTimer(); - audio_buffer_queue_.clear(); - video_buffer_queue_.clear(); - if (player_) { - player_unset_completed_cb(player_); - player_unset_media_packet_video_frame_decoded_cb(player_); - player_unprepare(player_); - } - manager()->OnSuspendComplete(GetPlayerId()); - if (media_packet_) - media_packet_destroy(media_packet_); - media_packet_ = NULL; -} - -void MediaSourcePlayerCapi::OnDemuxerConfigsAvailable( - const DemuxerConfigs& configs) { - - if (!player_) - return; - LOG(INFO) << "New width " << configs.video_size.width() - << " height " << configs.video_size.height(); - if (GetPlayerState() > PLAYER_STATE_IDLE) { - media_format_set_video_width(video_format_, configs.video_size.width()); - media_format_set_video_height(video_format_, configs.video_size.height()); - return; - } - int ret = PLAYER_ERROR_NONE; - - if ((configs.video_codec == kUnknownVideoCodec || - configs.video_codec != kCodecH264) && - (configs.audio_codec == kUnknownAudioCodec || - (configs.audio_codec != kCodecAAC && - configs.audio_codec != kCodecMP3))) { - LOG(ERROR) << "Audio and Video codecs not supported for MediaSource"; - OnHandlePlayerError(PLAYER_ERROR_NOT_SUPPORTED_FILE, FROM_HERE); - return; - } - int samplerate = configs.audio_sampling_rate; - int channel = configs.audio_channels; - width_ = configs.video_size.width(); - height_ = configs.video_size.height(); - - ret = media_format_create(&audio_format_); - if (ret != MEDIA_FORMAT_ERROR_NONE) { - LOG(ERROR) << "media_format_create : 0x" << ret; - return; - } - - media_format_mimetype_e audiomimeType = MEDIA_FORMAT_MP3; - if (configs.audio_codec == kCodecAAC) - audiomimeType = MEDIA_FORMAT_AAC; - - LOG(INFO) << "samplerate: " << samplerate - << ", channel: " << channel - << ", audiomimeType: " << audiomimeType; - - media_format_set_audio_mime(audio_format_, audiomimeType); - media_format_set_audio_channel(audio_format_, channel); - media_format_set_audio_samplerate(audio_format_, samplerate); - - ret = player_set_media_stream_info(player_, PLAYER_STREAM_TYPE_AUDIO, - audio_format_); - if (ret != PLAYER_ERROR_NONE) { - LOG(ERROR) << "player_set_audio_stream_info Error: " << ret; - return; - } - ret = player_set_media_stream_buffer_status_cb(player_, - PLAYER_STREAM_TYPE_AUDIO, - OnCapiAudioBufStatusCB, - this); - if (ret != PLAYER_ERROR_NONE) { - LOG(ERROR) << "player set audio buffer status cb failed :" << ret; - return; - } - - ret = media_format_create(&video_format_); - if (ret != MEDIA_FORMAT_ERROR_NONE) { - LOG(ERROR) << "media_format_create : 0x" << ret; - return; - } - - media_format_mimetype_e videomimeType = MEDIA_FORMAT_H264_SP; - - media_format_set_video_mime(video_format_, videomimeType); - media_format_set_video_width(video_format_, width_); - media_format_set_video_height(video_format_, height_); - - LOG(INFO) << "width: " << width_ - << ", height: " << height_ - << ", videomimeType: " << videomimeType; - - ret = player_set_media_stream_info(player_, - PLAYER_STREAM_TYPE_VIDEO, - video_format_); - if (ret != PLAYER_ERROR_NONE) { - LOG(ERROR) << "player_set_video_stream_info Error: " << ret; - return; - } - - // FIXME(Kodam): This property should be updated based on dynamic - // resolution change - player_set_media_stream_buffer_max_size( - player_, PLAYER_STREAM_TYPE_VIDEO, max_size); - player_set_media_stream_buffer_min_threshold( - player_, PLAYER_STREAM_TYPE_VIDEO, min_threshold); - ret = player_set_media_stream_buffer_status_cb(player_, - PLAYER_STREAM_TYPE_VIDEO, - OnCapiVideoBufStatusCB, - this); - if (ret != PLAYER_ERROR_NONE) { - LOG(ERROR) << "player set video buffer status cb failed : 0x" << ret; - return; - } - - // Audio stream is present if sample rate is valid. - if (samplerate > 0) - media_type_ |= MEDIA_AUDIO_MASK; - - // Video stream is present if both video width and height are valid. - if (width_ > 0 && height_ > 0) - media_type_ |= MEDIA_VIDEO_MASK; - - manager()->OnMediaDataChange(GetPlayerId(), width_, height_, media_type_); - manager()->OnReadyStateChange( - GetPlayerId(), blink::WebMediaPlayer::ReadyStateHaveMetadata); - - if (GetPlayerState() == PLAYER_STATE_IDLE) { - ret = player_prepare_async(player_, OnCapiPlayerPreparedCB, this); - if (ret != PLAYER_ERROR_NONE) { - LOG(ERROR) <<"player prepare failed : 0x " << ret; - return; - } - } - - // TODO(Venu): Need to check where is the exact place for this code. - // For make it work added this below code - // TODO(max): We have a contradiction here. - // To Complete preparing the capi-player, we have to get the first frame - // But to get the first frame we have to set readyState to EnoughData, - // even we are not ready for play(Setting the Enoughdata make HTML - // think that player is ready for play) - // We have to make some hack to get/set the first frame without notifying - // to HTML. - manager()->OnReadyStateChange( - GetPlayerId(), blink::WebMediaPlayer::ReadyStateHaveEnoughData); -} - -// Helper method that prints error occured with CAPI. -void MediaSourcePlayerCapi::OnMediaError(MediaError error_type) { - StopCurrentTimeUpdateTimer(); - MediaPlayerEfl::OnMediaError(error_type); -} - -void MediaSourcePlayerCapi::ReadDemuxedData( - media::DemuxerStream::Type type) { - demuxer_->RequestDemuxerData(type); -} - -void MediaSourcePlayerCapi::HandleBufferingMessage(int percent) { - // FIXME: add code if required - return; -} - -void MediaSourcePlayerCapi::HandleUnderFlowStatus( - media::DemuxerStream::Type type, bool underflow_status) { - if (underflow_status) { - if (type == media::DemuxerStream::VIDEO) { - should_feed_video_ = underflow_status; - LOG(INFO) << "Video Underflow " << should_feed_video_ - << " call CAPI Pause"; - } else if (type == media::DemuxerStream::AUDIO) { - should_feed_audio_ = underflow_status; - LOG(INFO) << "Audio Underflow " << should_feed_audio_ - << " call CAPI Pause"; - } - if (player_prepared_) { - task_runner_->PostTask(FROM_HERE, - base::BindOnce(&MediaSourcePlayerCapi::Pause, - weak_factory_.GetWeakPtr(), true)); - } - task_runner_->PostTask( - FROM_HERE, base::BindOnce(&MediaSourcePlayerCapi::ReadDemuxedData, - weak_factory_.GetWeakPtr(), type)); - } else if (!underflow_status) { - if (type == media::DemuxerStream::VIDEO) { - should_feed_video_ = underflow_status; - LOG(INFO) << "Video Overflow " << should_feed_video_ - << " call CAPI Play"; - } else if (type == media::DemuxerStream::AUDIO) { - should_feed_audio_ = underflow_status; - LOG(INFO) << "Audio Overflow " << should_feed_audio_ - << " call CAPI Play"; - } - - // FIXME(Kodam): Distinguish from user triggered PAUSE. - if ((!should_feed_audio_ || eos_audio_) && - (!should_feed_video_ || eos_video_)) { - task_runner_->PostTask(FROM_HERE, - base::BindOnce(&MediaSourcePlayerCapi::Play, - weak_factory_.GetWeakPtr())); - } - } -} - - -void MediaSourcePlayerCapi::OnDemuxerDataAvailable( - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data) { - if (error_occured_) { - LOG(ERROR) << "error occured"; - return; - } - - if (meta_data.status != media::DemuxerStream::kOk || - meta_data.end_of_stream) - BufferMetaDataAvailable(meta_data); - - if (seek_state_ == MEDIA_SEEK_DEMUXER_DONE) { - // Seek either reached to eos or buffered enough data to seek. - if (meta_data.end_of_stream || - (seek_offset_ + kSeekBufferingWaitInSec) <= - meta_data.timestamp.InSecondsF()) { - SeekInternal(); - } - } - - if (meta_data.size <= 0) { - LOG(ERROR) << "ERROR : Size of shared memory is Zero"; - return; - } - ReadFromQueueIfAny(meta_data.type); - - if (meta_data.type == media::DemuxerStream::AUDIO && !should_feed_audio_) { - // Why store the DecoderBuffer? we have requested for buffer - // from demuxer but gstreamer asked to stop. So need to save - // this buffer and use it on next |need_data| call. - SaveDecoderBuffer(foreign_memory_handle, meta_data); - return; - } - if (meta_data.type == media::DemuxerStream::VIDEO && !should_feed_video_) { - SaveDecoderBuffer(foreign_memory_handle, meta_data); - return; - } - - // Wrapping each frame and deleting shared memory using callback - // will not work as possibility of Gstreamer retaining frames (such as - // 'i' frames) is high. In that case shared memory will crash. So, we - // copy frames and release shared memory right away. - - base::SharedMemory shared_memory(foreign_memory_handle, false); - if (!shared_memory.Map(meta_data.size)) { - LOG(ERROR) << "Failed to map shared memory of size " << meta_data.size; - return; - } - - if (meta_data.type == media::DemuxerStream::AUDIO) { - if (media_packet_create_from_external_memory( - audio_format_, static_cast(shared_memory.memory()), - meta_data.size, NULL, NULL, &media_packet_) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "Audio media_packet_create_from_external_memory failed"; - return; - } - } else if (meta_data.type == media::DemuxerStream::VIDEO) { - if (media_packet_create_from_external_memory( - video_format_, static_cast(shared_memory.memory()), - meta_data.size, NULL, NULL, &media_packet_) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "Video media_packet_create_from_external_memory failed"; - return; - } - } - - if (media_packet_set_pts(media_packet_, meta_data.timestamp.InMilliseconds()) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "media_packet_set_pts failed"; - return; - } - if (player_push_media_stream(player_, media_packet_) - != MEDIA_PACKET_ERROR_NONE) - LOG(ERROR) << "player_push_media_stream failed"; - - if (meta_data.type == media::DemuxerStream::AUDIO) - media_format_unref(audio_format_); - else if (meta_data.type == media::DemuxerStream::VIDEO) - media_format_unref(video_format_); - - if (media_packet_) - media_packet_destroy(media_packet_); - media_packet_ = NULL; - - if (meta_data.type == media::DemuxerStream::AUDIO) - OnReadDemuxedData(media::DemuxerStream::AUDIO); - else if (meta_data.type == media::DemuxerStream::VIDEO) - OnReadDemuxedData(media::DemuxerStream::VIDEO); - return; -} - -void MediaSourcePlayerCapi::BufferMetaDataAvailable( - const media::DemuxedBufferMetaData& meta_data) { - LOG(INFO) << __FUNCTION__ << " meta_data.type " << meta_data.type; - if (error_occured_) { - LOG(ERROR) << "Pipeline_ null or error occured"; - return; - } - - switch (meta_data.status) { - case media::DemuxerStream::kAborted: - LOG(WARNING) << "[BROWSER] : DemuxerStream::kAborted, Stream type = " - << meta_data.type; - case media::DemuxerStream::kConfigChanged: - if (meta_data.type == media::DemuxerStream::AUDIO) - OnReadDemuxedData(media::DemuxerStream::AUDIO); - else if (meta_data.type == media::DemuxerStream::VIDEO) - OnReadDemuxedData(media::DemuxerStream::VIDEO); - break; - - case media::DemuxerStream::kOk: - if (meta_data.end_of_stream) { - ReadFromQueueIfAny(meta_data.type); - LOG(INFO) <<"[BROWSER] : DemuxerStream::kOk but |end_of_stream|"; - SendEosToCapi(meta_data); - if (!playing_) - Play(); - } - break; - - default: - NOTREACHED(); - } -} - -void MediaSourcePlayerCapi::SendEosToCapi( - const media::DemuxedBufferMetaData& meta_data) { - if (meta_data.type == media::DemuxerStream::AUDIO) { - if (!eos_audio_) { - if (media_packet_create(audio_format_, NULL, NULL, &media_packet_) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "Audio media_packet_create failed"; - return; - } - eos_audio_ = true; - } else { - LOG(ERROR) << "Audio EOS Already Pushed"; - return; - } - } else if (meta_data.type == media::DemuxerStream::VIDEO) { - if (!eos_video_) { - if (media_packet_create(video_format_, NULL, NULL, &media_packet_) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "Video media_packet_create failed"; - return; - } - eos_video_ = true; - } else { - LOG(ERROR) << "Video EOS Already Pushed"; - return; - } - } - - if (media_packet_set_flags(media_packet_, MEDIA_PACKET_END_OF_STREAM) - != MEDIA_PACKET_ERROR_NONE) - LOG(ERROR) << "media_packet_set_flags failed"; - - if (player_push_media_stream(player_, media_packet_) - != MEDIA_PACKET_ERROR_NONE) - LOG(ERROR) << "player_push_media_stream failed"; - - if (meta_data.type == media::DemuxerStream::AUDIO) - media_format_unref(audio_format_); - else if (meta_data.type == media::DemuxerStream::VIDEO) - media_format_unref(video_format_); - - if (media_packet_) - media_packet_destroy(media_packet_); - media_packet_ = NULL; -} - -void MediaSourcePlayerCapi::ReadFromQueueIfAny( - DemuxerStream::Type type) { - if (error_occured_) { - LOG(ERROR) << "error occured in capi"; - return; - } - - if (type == media::DemuxerStream::AUDIO) { - if (audio_buffer_queue_.empty() || !should_feed_audio_) - return; - } - - if (type == media::DemuxerStream::VIDEO) { - if (video_buffer_queue_.empty() || !should_feed_video_) - return; - } - - scoped_refptr decoder_buffer; - - if (type == media::DemuxerStream::AUDIO) { - decoder_buffer = audio_buffer_queue_.front(); - audio_buffer_queue_.pop_front(); - } else if (type == media::DemuxerStream::VIDEO) { - decoder_buffer = video_buffer_queue_.front(); - video_buffer_queue_.pop_front(); - } - uint64 size = static_cast(decoder_buffer.get()->data_size()); - - uint64 timestamp = - static_cast(decoder_buffer.get()->timestamp().InMilliseconds()); - if (type == media::DemuxerStream::AUDIO) { - if (media_packet_create_from_external_memory( - audio_format_, - static_cast(decoder_buffer.get()->writable_data()), - size, NULL, NULL, &media_packet_) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "Audio media_packet_create_from_external_memory failed"; - return; - } - } else if (type == media::DemuxerStream::VIDEO) { - if (media_packet_create_from_external_memory( - video_format_, - static_cast(decoder_buffer.get()->writable_data()), - size, NULL, NULL, &media_packet_) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "Video media_packet_create_from_external_memory failed"; - return; - } - } - - if (media_packet_set_pts(media_packet_, timestamp) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "media_packet_set_pts failed"; - return; - } - - if (player_push_media_stream(player_, media_packet_) - != MEDIA_PACKET_ERROR_NONE) - LOG(ERROR) << "player_push_media_stream failed"; - - if (type == media::DemuxerStream::AUDIO) - media_format_unref(audio_format_); - else if (type == media::DemuxerStream::VIDEO) - media_format_unref(video_format_); - - // Empty the Buffer before reading the new buffer from render process. - if (media_packet_) - media_packet_destroy(media_packet_); - media_packet_ = NULL; - - ReadFromQueueIfAny(type); - return; -} - -void MediaSourcePlayerCapi::SaveDecoderBuffer( - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data) { - if (error_occured_) { - LOG(ERROR) << "Error occured in capi"; - return; - } - - base::SharedMemory shared_memory(foreign_memory_handle, false); - if (!shared_memory.Map(meta_data.size)) { - LOG(ERROR) << "Failed to map shared memory of size " << meta_data.size; - return; - } - scoped_refptr buffer; - buffer = DecoderBuffer::CopyFrom(static_cast ( - shared_memory.memory()), meta_data.size); - - if (!buffer.get()) { - LOG(ERROR) << "DecoderBuffer::CopyFrom failed"; - return; - } - - buffer->set_timestamp(meta_data.timestamp); - buffer->set_duration(meta_data.time_duration); - - if (meta_data.type == media::DemuxerStream::AUDIO) - audio_buffer_queue_.push_back(buffer); - else if (meta_data.type == media::DemuxerStream::VIDEO) - video_buffer_queue_.push_back(buffer); -} - -void MediaSourcePlayerCapi::OnPrepareComplete() { - task_runner_->PostTask(FROM_HERE, - base::BindOnce(&MediaSourcePlayerCapi::PrepareComplete, - weak_factory_.GetWeakPtr())); -} - -void MediaSourcePlayerCapi::OnPlaybackComplete() { - task_runner_->PostTask( - FROM_HERE, base::BindOnce(&MediaSourcePlayerCapi::PlaybackComplete, - weak_factory_.GetWeakPtr())); -} - -void MediaSourcePlayerCapi::OnSeekComplete() { - task_runner_->PostTask(FROM_HERE, - base::BindOnce(&MediaSourcePlayerCapi::SeekComplete, - weak_factory_.GetWeakPtr())); -} - -void MediaSourcePlayerCapi::OnHandleBufferingMessage(int percent) { - task_runner_->PostTask( - FROM_HERE, base::BindOnce(&MediaSourcePlayerCapi::HandleBufferingMessage, - weak_factory_.GetWeakPtr(), percent)); -} - -void MediaSourcePlayerCapi::OnReadDemuxedData( - media::DemuxerStream::Type type) { - task_runner_->PostTask(FROM_HERE, - base::BindOnce(&MediaSourcePlayerCapi::ReadDemuxedData, - weak_factory_.GetWeakPtr(), type)); -} - -void MediaSourcePlayerCapi::OnUpdateDataStatus( - media::DemuxerStream::Type type, bool underflow_status) { - task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&MediaSourcePlayerCapi::HandleUnderFlowStatus, - weak_factory_.GetWeakPtr(), type, underflow_status)); -} - -void MediaSourcePlayerCapi::OnHandlePlayerError( - int player_error_code, const tracked_objects::Location& location) { - - LOG(ERROR) << GetErrorString(player_error_code) << " from " - << location.ToString(); - - OnMediaError(GetMediaError(player_error_code)); -} - -} // namespace media diff --git a/tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.h b/tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.h deleted file mode 100644 index 16b3c09..0000000 --- a/tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.h +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_BASE_TIZEN_MEDIA_SOURCE_PLAYER_CAPI_H_ -#define MEDIA_BASE_TIZEN_MEDIA_SOURCE_PLAYER_CAPI_H_ - -#include - -#include "base/cancelable_callback.h" -#include "base/threading/thread.h" -#include "base/time/default_tick_clock.h" -#include "base/timer/timer.h" -#include "media/base/decoder_buffer.h" -#include "media/base/efl/demuxer_efl.h" -#include "media/base/efl/media_player_efl.h" -#include "media/base/efl/media_player_util_efl.h" -#include "third_party/blink/public/platform/WebMediaPlayer.h" - -namespace media { - -// This class handles media source extensions for CAPI port. -class MEDIA_EXPORT MediaSourcePlayerCapi : public MediaPlayerEfl, - public DemuxerEflClient { - public: - // Constructs a player with the given ID and demuxer. |manager| must outlive - // the lifetime of this object. - MediaSourcePlayerCapi(int player_id, - std::unique_ptr demuxer, - MediaPlayerManager* manager); - MediaSourcePlayerCapi(const MediaSourcePlayerCapi&) = delete; - MediaSourcePlayerCapi& operator=(const MediaSourcePlayerCapi&) = delete; - ~MediaSourcePlayerCapi() override; - - MediaSourcePlayerCapi(const MediaSourcePlayerCapi&) = delete; - MediaSourcePlayerCapi& operator=(const MediaSourcePlayerCapi&) = delete; - - // MediaPlayerEfl implementation. - void Play() override; - void Pause(bool is_media_related_action) override; - void SetRate(double rate) override; - void Seek(const double time) override; - void SetVolume(double volume) override; - double GetCurrentTime() override; - void Initialize() override; - - // DemuxerEflClient implementation. - void OnDemuxerConfigsAvailable(const DemuxerConfigs& params) override; - void OnDemuxerDataAvailable( - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data) override; - void OnDemuxerSeekDone( - const base::TimeDelta& actual_browser_seek_time) override; - void OnDemuxerDurationChanged(base::TimeDelta duration) override; - - // To handle CAPI callbacks. - void OnReadDemuxedData(media::DemuxerStream::Type type); - void OnUpdateDataStatus(media::DemuxerStream::Type type, - bool underflow_status); - void OnSeekComplete(); - void OnHandleBufferingMessage(int percent); - void OnPlaybackComplete(); - void OnPrepareComplete(); - void OnHandlePlayerError(int player_error_code, - const tracked_objects::Location& loc); - - void OnMediaPacketUpdated(media_packet_h packet); - - protected: - void Release() override; - void OnMediaError(MediaError error_type) override; - - private: - player_state_e GetPlayerState(); - void PrepareComplete(); - - // For internal seeks. - void SeekInternal(); - void UpdateSeekState(MediaSeekState state); - void SeekComplete(); - - void BufferMetaDataAvailable(const media::DemuxedBufferMetaData& meta_data); - void ReadDemuxedData(media::DemuxerStream::Type type); - void HandleBufferingMessage(int percent); - - // To handle buffer underflow CB. - void HandleUnderFlowStatus(media::DemuxerStream::Type type, - bool underflow_status); - - void PlaybackComplete(); - void SendEosToCapi(const media::DemuxedBufferMetaData& meta_data); - - // |current_time_update_timer_| related - void OnCurrentTimeUpdateTimerFired(); - void StartCurrentTimeUpdateTimer(); - void StopCurrentTimeUpdateTimer(); - - void ReadFromQueueIfAny(DemuxerStream::Type type); - void SaveDecoderBuffer(base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data); - - std::unique_ptr demuxer_; - const scoped_refptr task_runner_; - - // Weak pointer passed to media decoder jobs for callbacks. - base::WeakPtrFactory weak_this_; - - player_h player_; - int media_type_; - double duration_; - double play_rate_; - - bool player_prepared_; - bool playing_; - bool is_end_reached_; - bool eos_audio_; - bool eos_video_; - bool error_occured_; - - // Will allow to listen to |prepare-xid| message only once. - bool should_feed_audio_; - bool should_feed_video_; - - double seek_offset_; - MediaSeekState seek_state_; - - media_packet_h media_packet_; - - // FIXME(Venu): Make them a smart pointer to avoid leak. - media_format_h audio_format_; - media_format_h video_format_; - - base::RepeatingTimer current_time_update_timer_; - - std::deque > audio_buffer_queue_; - std::deque > video_buffer_queue_; - - base::WeakPtrFactory weak_factory_; -}; - -} // namespace media - -#endif // MEDIA_BASE_TIZEN_MEDIA_SOURCE_PLAYER_CAPI_H_ diff --git a/tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.cc b/tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.cc deleted file mode 100644 index ce7904f..0000000 --- a/tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.cc +++ /dev/null @@ -1,318 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "media/base/tizen/webaudio_decoder_browser_capi.h" - -#include "base/bind.h" -#include "base/logging.h" -#include "media/base/efl/webaudio_media_codec_info_efl.h" - -namespace { - -const int kChannelCount = 2; - -const int kSampleRate = 44100; - -struct ErrorList { - player_error_e error_code; - std::string error_message; -}; - -// FIXME: Move to common place -const struct ErrorList errorlist[] = { - {PLAYER_ERROR_OUT_OF_MEMORY, "PLAYER_ERROR_OUT_OF_MEMORY"}, - {PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER"}, - {PLAYER_ERROR_NO_SUCH_FILE, "PLAYER_ERROR_NO_SUCH_FILE"}, - {PLAYER_ERROR_INVALID_OPERATION, "PLAYER_ERROR_INVALID_OPERATION"}, - {PLAYER_ERROR_FILE_NO_SPACE_ON_DEVICE, - "PLAYER_ERROR_FILE_NO_SPACE_ON_DEVICE"}, - {PLAYER_ERROR_FEATURE_NOT_SUPPORTED_ON_DEVICE, - "PLAYER_ERROR_FEATURE_NOT_SUPPORTED_ON_DEVICE"}, - {PLAYER_ERROR_SEEK_FAILED, "PLAYER_ERROR_SEEK_FAILED"}, - {PLAYER_ERROR_INVALID_STATE, "PLAYER_ERROR_INVALID_STATE"}, - {PLAYER_ERROR_NOT_SUPPORTED_FILE, "PLAYER_ERROR_NOT_SUPPORTED_FILE"}, - {PLAYER_ERROR_INVALID_URI, "PLAYER_ERROR_INVALID_URI"}, - {PLAYER_ERROR_SOUND_POLICY, "PLAYER_ERROR_SOUND_POLICY"}, - {PLAYER_ERROR_CONNECTION_FAILED, "PLAYER_ERROR_CONNECTION_FAILED"}, - {PLAYER_ERROR_VIDEO_CAPTURE_FAILED, "PLAYER_ERROR_VIDEO_CAPTURE_FAILED"}, - {PLAYER_ERROR_DRM_EXPIRED, "PLAYER_ERROR_DRM_EXPIRED"}, - {PLAYER_ERROR_DRM_NO_LICENSE, "PLAYER_ERROR_DRM_NO_LICENSE"}, - {PLAYER_ERROR_DRM_FUTURE_USE, "PLAYER_ERROR_DRM_FUTURE_USE"}, - {PLAYER_ERROR_DRM_NOT_PERMITTED, "PLAYER_ERROR_DRM_NOT_PERMITTED"}, - {PLAYER_ERROR_RESOURCE_LIMIT, "PLAYER_ERROR_RESOURCE_LIMIT"}, - {PLAYER_ERROR_PERMISSION_DENIED, "PLAYER_ERROR_PERMISSION_DENIED"}}; - -const int ERROR_MAX = sizeof(errorlist) / sizeof(errorlist[0]); - -static void PlayerPreparedCb(void* data) { - media::AudioDecoderCapi* player = - static_cast(data); - if (!player) - return; - player->OnPlayerPrepared(); -} - -static void PlayerDecodedBufferReadyCb(player_audio_raw_data_s* audio_data, - void* data) { - media::AudioDecoderCapi* player = - static_cast(data); - if (!player) - return; - player->OnPlayerDecodedBufferReady(audio_data); -} - -static void PlayerEosCb(void* data) { - media::AudioDecoderCapi* player = - static_cast(data); - if (!player) - return; - player->OnPlayerEos(); -} - -static void PlayerErrorCb(int error_code, void* data) { - media::AudioDecoderCapi* player = - static_cast(data); - if (!player) - return; - player->OnPlayerError(error_code, "PlayerErrorCb"); -} - -} // namespace - -namespace media { - -struct WAPCMdata{ - uint8_t* data_; - int rate_; - int size_; - int channel_mask_; - WAPCMdata(int rate, int size, int channel_mask) - : data_(NULL), - rate_(rate), - size_(size), - channel_mask_(channel_mask) {} -}; - -AudioDecoderCapi::AudioDecoderCapi( - base::FileDescriptor pcm_output, - uint8_t* data, - uint32_t data_size) - : decoder_thread_("CAPIAudioDecoder"), - player_(NULL), - pcm_output_(pcm_output.fd), - data_size_(data_size), - encoded_data_(data), - is_new_request_(true), - is_running_(true) { -} - -AudioDecoderCapi::~AudioDecoderCapi() { - if (player_) { - player_unset_error_cb(player_); - player_unset_completed_cb(player_); - player_unprepare(player_); - player_destroy(player_); - } - player_ = NULL; - if (decoder_thread_.IsRunning()) - decoder_thread_.Stop(); - - close(pcm_output_); -} - -void AudioDecoderCapi::InitializePlayer() { - int error = player_create(&player_); - if (error != PLAYER_ERROR_NONE) { - PlayerError(error, "player_create"); - return; - } - - player_set_completed_cb(player_, PlayerEosCb, this); - player_set_error_cb(player_, PlayerErrorCb, this); - player_set_pcm_extraction_mode(player_, false, - PlayerDecodedBufferReadyCb, this); - - player_set_pcm_spec(player_, "F32LE", kSampleRate, kChannelCount); - - error = player_set_memory_buffer(player_, encoded_data_, data_size_); - if (error != PLAYER_ERROR_NONE) { - PlayerError(error, "player_set_memory_buffer"); - return; - } - - error = player_prepare_async(player_, PlayerPreparedCb, this); - if (error != PLAYER_ERROR_NONE) { - PlayerError(error, "player_prepare_async"); - return; - } -} - -void AudioDecoderCapi::StartDecodeProcess() { - InitializePlayer(); -} - -void AudioDecoderCapi::PlayerPrepared() { - int error = player_start(player_); - if (error != PLAYER_ERROR_NONE) - PlayerError(error, "player_start()"); -} - -static void SendData(const int pcm_out, WAPCMdata* audio_data) { - if (!audio_data) - return; - uint8_t* data = audio_data->data_; - int data_size = audio_data->size_; - while (data_size > 0) { - int bytes_to_write = (data_size >= PIPE_BUF) ? PIPE_BUF : data_size; - media::WebAudioMediaDataInfoEfl data_info(audio_data->channel_mask_, - bytes_to_write); - HANDLE_EINTR(write(pcm_out, &data_info, sizeof(data_info))); - ssize_t bytes_written = HANDLE_EINTR(write(pcm_out, data, bytes_to_write)); - if (bytes_written == -1) { - LOG(ERROR) << "Write Failed\n"; - break; - } - data_size -= bytes_written; - data += bytes_written; - } -} - -void AudioDecoderCapi::PlayerDecodedBufferReady(WAPCMdata* audio_data) { - if (audio_data->size_ <= 0) { - LOG(ERROR) << "Decoded buffer size is invalid"; - return; - } - - if (is_new_request_) { - // TODO: How to handle more than 2 channels - media::WebAudioMediaCodecInfoEfl info( - static_cast(kChannelCount), - static_cast(audio_data->rate_), - static_cast((audio_data->size_ / sizeof(float)))); - - HANDLE_EINTR(write(pcm_output_, &info, sizeof(info))); - is_new_request_ = false; - } - SendData(pcm_output_, audio_data); - delete[] (audio_data->data_); - delete(audio_data); -} - -void AudioDecoderCapi::PlayerEos() { - is_running_ = false; -} - -void AudioDecoderCapi::PlayerError(int err, char const* from) { - for (int index = 0; index < ERROR_MAX; ++index) { - if (errorlist[index].error_code == err) { - LOG(ERROR) << "Stoping decoding due to error code : " << err - << " Error message : " << errorlist[index].error_message - << " from " << from; - break; - } - } - - is_running_ = false; -} - -void AudioDecoderCapi::OnPlayerPrepared() { - decoder_thread_.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&AudioDecoderCapi::PlayerPrepared, - base::Unretained(this))); -} - -void AudioDecoderCapi::OnPlayerDecodedBufferReady( - player_audio_raw_data_s* audio_data) { - DCHECK(!decoder_thread_.IsRunning()); - - // The buffer is resued by CAPI in next iteration, - // this leaves junk data in it hence making local copy. - WAPCMdata* localdata = new WAPCMdata(audio_data->rate, - audio_data->size, - audio_data->channel_mask); - localdata->data_ = new uint8_t[localdata->size_]; - memcpy(localdata->data_, audio_data->data, localdata->size_); - - decoder_thread_.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&AudioDecoderCapi::PlayerDecodedBufferReady, - base::Unretained(this), localdata)); -} - -void AudioDecoderCapi::OnPlayerEos() { - decoder_thread_.task_runner()->PostTask( - FROM_HERE, - base::BindOnce(&AudioDecoderCapi::PlayerEos, base::Unretained(this))); -} - -void AudioDecoderCapi::OnPlayerError(int error_code, const char* msg) { - decoder_thread_.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&AudioDecoderCapi::PlayerError, - base::Unretained(this), error_code, msg)); -} - -void AudioDecoderCapi::OnStartDecodeProcess() { - if (!decoder_thread_.IsRunning() && !decoder_thread_.Start()) { - LOG(ERROR) << "Decoder thread start failed"; - return; - } - - decoder_thread_.message_loop()->PostTask( - FROM_HERE, base::BindOnce(&AudioDecoderCapi::StartDecodeProcess, - base::Unretained(this))); - - // TODO(kodam): Need to refactor this class not to use usleep(10) in here. - while (is_running_) - usleep(10); -} - -// WebAudioDecoderCapi class -WebAudioDecoder* WebAudioDecoder::GetWebAudioDecoder(){ - return WebAudioDecoderCapi::GetInstance(); -} - -// static -WebAudioDecoderCapi* WebAudioDecoderCapi::GetInstance() { - return base::Singleton::get(); -} - -WebAudioDecoderCapi::WebAudioDecoderCapi() - : capi_thread_("CapiThread") { -} - -WebAudioDecoderCapi::~WebAudioDecoderCapi() { -} - -void WebAudioDecoderCapi::DecodeUsingCAPI( - base::SharedMemoryHandle foreign_memory_handle, - base::FileDescriptor pcm_output, - uint32_t data_size) { - base::SharedMemory shared_memory(foreign_memory_handle, false); - if (!shared_memory.Map(data_size)) { - LOG(ERROR) << "Failed to map shared memory for size " << data_size; - return; - } - - // This will execute until decoding is done - AudioDecoderCapi capi_Decoder(pcm_output, - static_cast(shared_memory.memory()), - data_size); - capi_Decoder.OnStartDecodeProcess(); -} - -void WebAudioDecoderCapi::EncodedDataReceived( - base::SharedMemoryHandle memory_handle, - base::FileDescriptor pcm_output, - uint32_t data_size) { - if (!capi_thread_.IsRunning() && !capi_thread_.Start()) { - LOG(ERROR) << "Starting capi thread failed"; - return; - } - - capi_thread_.message_loop()->PostTask( - FROM_HERE, base::BindOnce(&WebAudioDecoderCapi::DecodeUsingCAPI, - base::Unretained(this), memory_handle, - pcm_output, data_size)); -} - -} // namespace media diff --git a/tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.h b/tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.h deleted file mode 100644 index 147cd62..0000000 --- a/tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.h +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_BASE_TIZEN_WEBAUDIO_DECODER_BROWSER_CAPI_H_ -#define MEDIA_BASE_TIZEN_WEBAUDIO_DECODER_BROWSER_CAPI_H_ - -#include -#include - -#include "base/memory/singleton.h" -#include "base/memory/shared_memory.h" -#include "base/threading/thread.h" -#include "media/base/efl/webaudio_decoder_efl.h" -#include "media/base/media_export.h" - -namespace media { - -struct WAPCMdata; - -// WebAudioDecoderCapi class -class MEDIA_EXPORT WebAudioDecoderCapi : public WebAudioDecoder { - public: - static WebAudioDecoderCapi* GetInstance(); - virtual ~WebAudioDecoderCapi(); - - WebAudioDecoderCapi(const WebAudioDecoderCapi&) = delete; - WebAudioDecoderCapi& operator=(const WebAudioDecoderCapi&) = delete; - - // media::WebAudioDecoder implementation. - void EncodedDataReceived(base::SharedMemoryHandle memory_handle, - base::FileDescriptor pcm_output, - uint32_t data_size) override; - - private: - friend struct base::DefaultSingletonTraits; - WebAudioDecoderCapi(); - void DecodeUsingCAPI(base::SharedMemoryHandle foreign_memory_handle, - base::FileDescriptor pcm_output, - uint32_t data_size); - - base::Thread capi_thread_; -}; - -class AudioDecoderCapi { - public: - AudioDecoderCapi(base::FileDescriptor pcm_output, uint8_t* data, - uint32_t data_size); - virtual ~AudioDecoderCapi(); - void OnPlayerPrepared(); - void OnPlayerDecodedBufferReady(player_audio_raw_data_s* pcm_data); - void OnPlayerEos(); - void OnPlayerError(int error_code, const char* msg); - void OnStartDecodeProcess(); - - private: - void InitializePlayer(); - void StartDecodeProcess(); - - void PlayerPrepared(); - void PlayerDecodedBufferReady(WAPCMdata* pcm_data); - void PlayerEos(); - void PlayerError(int error_code, const char* msg); - - private: - base::Thread decoder_thread_; - - // CAPI player handle. - player_h player_; - - // The audio file information and decoded pcm data are written to - // this file descriptor. We take ownership of this descriptor. - int pcm_output_; - - // The length of the encoded data. - uint32_t data_size_; - - // Encoded audio data. - uint8_t* encoded_data_; - - bool is_new_request_; - bool is_running_; -}; - -} // namespace media - -#endif // MEDIA_BASE_TIZEN_WEBAUDIO_DECODER_BROWSER_CAPI_H_ diff --git a/tizen_src/chromium_impl/media/media_efl.gni b/tizen_src/chromium_impl/media/media_efl.gni index 8227060..7a06278 100644 --- a/tizen_src/chromium_impl/media/media_efl.gni +++ b/tizen_src/chromium_impl/media/media_efl.gni @@ -17,78 +17,6 @@ if (use_ozone) { external_media_efl_deps += [ "//tizen_src/chromium_impl/ui/ozone:ozone_efl" ] } -if (tizen_multimedia_support) { - external_media_efl_deps += [ - "//tizen_src/build:capi-media-audio-io", - "//tizen_src/build:capi-media-camera", - "//tizen_src/build:capi-media-player", - "//tizen_src/build:ecore", - "//tizen_src/build:libcapi-media-audio-io", - "//tizen_src/build:libcapi-media-camera", - "//tizen_src/build:libcapi-media-player", - "//tizen_src/build:libecore", - "//tizen_src/build:mm_player", - ] - - if (!use_wayland) { - external_media_efl_deps += [ - "//tizen_src/build:ecore-x", - "//tizen_src/build:libecore-x", - "//ui/gl:gl", - ] - } else { - external_media_efl_deps += [ "//tizen_src/build:ecore-wayland" ] - external_media_efl_deps += [ "//tizen_src/build:libecore-wayland" ] - } - - if (is_tizen) { - external_media_efl_deps += [ "//tizen_src/build:capi-system-device" ] - external_media_efl_deps += [ "//tizen_src/build:libcapi-system-device" ] - } - - external_media_efl_sources += [ - "audio/tizen/audio_manager_capi.cc", - "audio/tizen/audio_manager_capi.h", - "audio/tizen/audio_manager_tizen.cc", - "audio/tizen/capi_audio_input.cc", - "audio/tizen/capi_audio_input.h", - "audio/tizen/capi_audio_output.cc", - "audio/tizen/capi_audio_output.h", - "audio/tizen/capi_util.cc", - "audio/tizen/capi_util.h", - "base/efl/demuxer_efl.h", - "base/efl/demuxer_stream_player_params_efl.cc", - "base/efl/demuxer_stream_player_params_efl.h", - "base/efl/media_player_efl.cc", - "base/efl/media_player_efl.h", - "base/efl/media_player_manager_efl.h", - "base/efl/media_player_util_efl.cc", - "base/efl/media_player_util_efl.h", - "base/efl/webaudio_decoder_efl.h", - "base/efl/webaudio_media_codec_info_efl.h", - "base/tizen/media_player_bridge_capi.cc", - "base/tizen/media_player_bridge_capi.h", - "base/tizen/media_source_player_capi.cc", - "base/tizen/media_source_player_capi.h", - "base/tizen/webaudio_decoder_browser_capi.cc", - "base/tizen/webaudio_decoder_browser_capi.h", - "capture/video/tizen/video_capture_device_factory_tizen.cc", - "capture/video/tizen/video_capture_device_factory_tizen.h", - "capture/video/tizen/video_capture_device_tizen.cc", - "capture/video/tizen/video_capture_device_tizen.h", - ] - - external_exclude_media_efl_sources += [ - "audio/linux/audio_manager_linux.cc", - "capture/video/linux/video_capture_device_factory_linux.cc", - "capture/video/linux/video_capture_device_factory_linux.h", - "capture/video/linux/video_capture_device_linux.cc", - "capture/video/linux/video_capture_device_linux.h", - ] - - external_media_efl_config += [ ":media_efl_config" ] -} - if (tizen_multimedia) { external_media_video_decode_config += [ "//tizen_src/build:esplusplayer", diff --git a/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.cc b/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.cc index 8c44038..c39ef0b 100644 --- a/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.cc +++ b/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.cc @@ -15,10 +15,6 @@ #include "ipc_message_start_ewk.h" #include "net/url_request/url_request_context_getter.h" -#if defined(TIZEN_MULTIMEDIA_SUPPORT) -#include "media/base/efl/webaudio_decoder_efl.h" -#endif - using content::BrowserThread; using web_contents_utils::WebContentsFromFrameID; using web_contents_utils::WebViewFromWebContents; @@ -45,12 +41,9 @@ void RenderMessageFilterEfl::OverrideThreadForMessage( bool RenderMessageFilterEfl::OnMessageReceived(const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(RenderMessageFilterEfl, message) - IPC_MESSAGE_HANDLER(EwkHostMsg_DecideNavigationPolicy, + IPC_MESSAGE_HANDLER(EwkHostMsg_DecideNavigationPolicy, OnDecideNavigationPolicy) -#if defined(TIZEN_MULTIMEDIA_SUPPORT) - IPC_MESSAGE_HANDLER(EflViewHostMsg_WebAudioDecode, OnWebAudioDecode) -#endif - IPC_MESSAGE_UNHANDLED(handled = false) + IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; } @@ -65,13 +58,3 @@ void RenderMessageFilterEfl::OnDecideNavigationPolicy( ->InvokePolicyNavigationCallback(params, handled); } } - -#if defined(TIZEN_MULTIMEDIA_SUPPORT) -void RenderMessageFilterEfl::OnWebAudioDecode( - base::SharedMemoryHandle encoded_data_handle, - base::FileDescriptor pcm_output, - uint32_t data_size) { - media::WebAudioDecoder::GetWebAudioDecoder()->EncodedDataReceived( - encoded_data_handle, pcm_output, data_size); -} -#endif diff --git a/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.h b/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.h index 1a11f33..27d1f0f 100644 --- a/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.h +++ b/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.h @@ -12,11 +12,6 @@ #include "third_party/blink/public/web/web_navigation_type.h" #include "url/gurl.h" -#if defined(TIZEN_MULTIMEDIA_SUPPORT) -#include "base/file_descriptor_posix.h" -#include "base/memory/shared_memory.h" -#endif - struct NavigationPolicyParams; namespace net { @@ -41,13 +36,6 @@ class RenderMessageFilterEfl : public content::BrowserMessageFilter { void OnReceivedHitTestData(int view, const _Ewk_Hit_Test& hit_test_data, const NodeAttributesMap& node_attributes); -#if defined(TIZEN_MULTIMEDIA_SUPPORT) - void OnWebAudioDecode(base::SharedMemoryHandle encoded_data_handle, - base::FileDescriptor pcm_output, - uint32_t data_size); -#endif - int render_process_id_; }; - #endif diff --git a/tizen_src/ewk/efl_integration/command_line_efl.cc b/tizen_src/ewk/efl_integration/command_line_efl.cc index de01912..57911c2 100644 --- a/tizen_src/ewk/efl_integration/command_line_efl.cc +++ b/tizen_src/ewk/efl_integration/command_line_efl.cc @@ -71,10 +71,6 @@ content::MainFunctionParams CommandLineEfl::GetDefaultPortParams() { if (IsDesktopProfile()) p_command_line->AppendSwitch(switches::kDisableES3GLContext); -#if defined(TIZEN_MULTIMEDIA_SUPPORT) && defined(ENABLE_WEBRTC) - p_command_line->AppendSwitch(switches::kEnableWebRtcHWH264Encoding); -#endif - #if BUILDFLAG(IS_TIZEN) // For optimizing discardable memory. [limit:MB, delay:ms] if (!p_command_line->HasSwitch(switches::kDiscardableMemoryLimit)) -- 2.7.4 From e00ead702ae0d66ebad4af4a69599f9ee4ae4dc3 Mon Sep 17 00:00:00 2001 From: fang fengrong Date: Sat, 25 Feb 2023 15:32:47 +0800 Subject: [PATCH 06/16] [M108 Migration] Support Url conversion on the multi process model 1. Instantiate WrtDynamicPlugin for browser process on multi process. 2. Revise WrtUrlRequestInterceptor. Added to Support app scheme. If parsed URL is not file scheme, the request will be redirected, not handled directly in WrtUrlRequestInterceptor. The parsed URL will be exposed to the content side(WebApp) after redirection. 3. Cleanup WrtWidget related codes Remove duplicated codes and unify codes for TV product and public in a single interface 4. Remove URLRequestInterceptingJobFactory 5.Fix the crash in EWebContext::SetWidgetInfo There is a crash when EWebContext::SetWidgetInfo is invoked without injected bundle in the single process mode. References: https://review.tizen.org/gerrit/#/c/247502/ https://review.tizen.org/gerrit/#/c/250497/ Change-Id: Id057f3c74e4f4168515b15d9a0509a17bde96479 Signed-off-by: fang fengrong --- tizen_src/ewk/efl_integration/eweb_context.cc | 32 +++--- tizen_src/ewk/efl_integration/eweb_context.h | 2 +- .../efl_integration/private/ewk_context_private.cc | 7 +- .../efl_integration/private/ewk_context_private.h | 5 +- .../ewk/efl_integration/public/ewk_context.cc | 8 +- .../renderer/content_renderer_client_efl.cc | 38 +------ .../renderer/content_renderer_client_efl.h | 2 - .../url_request_context_getter_efl.cc | 18 +++- .../url_request_context_getter_efl.h | 5 + tizen_src/ewk/efl_integration/wrt/dynamicplugin.cc | 114 ++++++++++++-------- tizen_src/ewk/efl_integration/wrt/dynamicplugin.h | 32 ++++-- tizen_src/ewk/efl_integration/wrt/v8widget.cc | 46 ++------- tizen_src/ewk/efl_integration/wrt/v8widget.h | 37 +++++-- .../ewk/efl_integration/wrt/wrt_dynamicplugin.cc | 113 ++++++++++---------- .../ewk/efl_integration/wrt/wrt_dynamicplugin.h | 22 ++-- .../wrt/wrt_file_protocol_handler.cc | 115 --------------------- .../wrt/wrt_file_protocol_handler.h | 45 -------- tizen_src/ewk/efl_integration/wrt/wrtwidget.cc | 46 +++++---- tizen_src/ewk/efl_integration/wrt/wrtwidget.h | 16 +-- 19 files changed, 278 insertions(+), 425 deletions(-) delete mode 100644 tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.cc delete mode 100644 tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.h diff --git a/tizen_src/ewk/efl_integration/eweb_context.cc b/tizen_src/ewk/efl_integration/eweb_context.cc index f344603..1af63b7 100644 --- a/tizen_src/ewk/efl_integration/eweb_context.cc +++ b/tizen_src/ewk/efl_integration/eweb_context.cc @@ -43,15 +43,16 @@ #include "content/common/plugin_list.h" #endif -#include "browser_context_efl.h" -#include "ewk_global_data.h" -#include "browser/password_manager/password_store_factory.h" #include "browser/browsing_data_remover_efl.h" +#include "browser/password_manager/password_store_factory.h" #include "browser/vibration/vibration_provider_client.h" +#include "browser_context_efl.h" #include "components/password_manager/core/browser/password_manager.h" #include "content/common/render_messages_efl.h" +#include "ewk_global_data.h" #include "private/ewk_favicon_database_private.h" #include "private/ewk_security_origin_private.h" +#include "wrt/dynamicplugin.h" #include "wrt/wrt_widget_host.h" #if BUILDFLAG(IS_TIZEN) @@ -239,28 +240,17 @@ bool EwkMimeOverrideCallback::TriggerCallback(const std::string& url_spec, return result; } -void EWebContext::SetWidgetInfo(const std::string& tizen_app_id, - double scale, - const string& theme, - const string& encoded_bundle) { +void EWebContext::SetTizenAppId(const std::string& tizen_app_id) { tizen_app_id_ = tizen_app_id; - widget_scale_ = scale; - widget_theme_ = theme; - widget_encoded_bundle_ = encoded_bundle; #if BUILDFLAG(IS_TIZEN) base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); // Add the switches in here to load injected bundle in renderer thread // in single process mode - if (command_line.HasSwitch(switches::kSingleProcess)) { + if (command_line.HasSwitch(switches::kSingleProcess) && + (!injected_bundle_path_.empty())) { command_line.AppendSwitchASCII(switches::kInjectedBundlePath, injected_bundle_path_); - command_line.AppendSwitchASCII(switches::kTizenAppId, tizen_app_id_); - command_line.AppendSwitchASCII(switches::kWidgetScale, - std::to_string(widget_scale_)); - command_line.AppendSwitchASCII(switches::kWidgetTheme, widget_theme_); - command_line.AppendSwitchASCII(switches::kWidgetEncodedBundle, - widget_encoded_bundle_); #if BUILDFLAG(IS_TIZEN_TV) // Drop process privillages while web app is launching @@ -274,6 +264,14 @@ void EWebContext::SetWidgetInfo(const std::string& tizen_app_id, // because it is handled in crosswalk side in single process mode. content::GetGenericZygote()->DropProcessPrivileges(tizen_app_id_); } +#if !defined(EWK_BRINGUP) // FIXME: m108 bringup + // Set DynamicPlugin to convert file scheme(file://) for Tizen HbbTV. + // Important: WRT doesn't use 'injected bundle' anymore + if (!tizen_app_id_.empty() && !injected_bundle_path_.empty()) { + DynamicPlugin* plugin = &DynamicPlugin::Get(V8Widget::Type::WRT); + plugin->Init(injected_bundle_path_); + } +#endif // EWK_BRINGUP #endif // IS_TIZEN } diff --git a/tizen_src/ewk/efl_integration/eweb_context.h b/tizen_src/ewk/efl_integration/eweb_context.h index 651941c..a2162df 100644 --- a/tizen_src/ewk/efl_integration/eweb_context.h +++ b/tizen_src/ewk/efl_integration/eweb_context.h @@ -146,7 +146,7 @@ class EWebContext { bool SetFaviconDatabasePath(const base::FilePath& path); Evas_Object *AddFaviconObject(const char *uri, Evas *canvas) const; - void SetWidgetInfo(const std::string& tizen_app_id, double scale, const std::string &theme, const std::string &encoded_bundle); + void SetTizenAppId(const std::string& tizen_app_id); bool SetAppVersion(const std::string& tizen_app_version); void SendWrtMessage(const Ewk_Wrt_Message_Data& message); diff --git a/tizen_src/ewk/efl_integration/private/ewk_context_private.cc b/tizen_src/ewk/efl_integration/private/ewk_context_private.cc index e10e87a..1215b15 100644 --- a/tizen_src/ewk/efl_integration/private/ewk_context_private.cc +++ b/tizen_src/ewk/efl_integration/private/ewk_context_private.cc @@ -249,11 +249,8 @@ Evas_Object * Ewk_Context::AddFaviconObject(const char *uri, Evas *canvas) const return impl->AddFaviconObject(uri, canvas); } -void Ewk_Context::SetWidgetInfo(const std::string& tizen_app_id, - double scale, - const std::string& theme, - const std::string& encoded_bundle) { - impl->SetWidgetInfo(tizen_app_id, scale, theme, encoded_bundle); +void Ewk_Context::SetTizenAppId(const std::string& tizen_app_id) { + impl->SetTizenAppId(tizen_app_id); } bool Ewk_Context::SetAppVersion(const std::string& tizen_app_version) { diff --git a/tizen_src/ewk/efl_integration/private/ewk_context_private.h b/tizen_src/ewk/efl_integration/private/ewk_context_private.h index 869cde0..294f21e 100644 --- a/tizen_src/ewk/efl_integration/private/ewk_context_private.h +++ b/tizen_src/ewk/efl_integration/private/ewk_context_private.h @@ -112,10 +112,7 @@ struct Ewk_Context : public base::RefCounted { Evas_Object *AddFaviconObject(const char *uri, Evas *canvas) const; // Widget - void SetWidgetInfo(const std::string& tizen_app_id, - double scale, - const std::string& theme, - const std::string& encoded_bundle); + void SetTizenAppId(const std::string& tizen_app_id); bool SetAppVersion(const std::string& tizen_app_version); // Pixmap diff --git a/tizen_src/ewk/efl_integration/public/ewk_context.cc b/tizen_src/ewk/efl_integration/public/ewk_context.cc index a7e298a..545869b 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_context.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_context.cc @@ -600,17 +600,15 @@ void ewk_send_widget_info(Ewk_Context *context, EINA_SAFETY_ON_NULL_RETURN(theme); EINA_SAFETY_ON_NULL_RETURN(encodedBundle); EINA_SAFETY_ON_NULL_RETURN(context); - context->SetWidgetInfo(tizen_id, scale, theme, encodedBundle); + context->SetTizenAppId(tizen_id); } void ewk_context_tizen_app_id_set(Ewk_Context* context, const char* tizen_app_id) { EINA_SAFETY_ON_NULL_RETURN(context); EINA_SAFETY_ON_NULL_RETURN(tizen_app_id); - // Ewk_Context::SetWidgetInfo() will be changed with removal of argumets - // hardcoded in this call once bug - // http://107.108.218.239/bugzilla/show_bug.cgi?id=15424 is merged. - context->SetWidgetInfo(tizen_app_id, 1.0, "theme", "encoded_bundle"); + LOG(INFO) << "tizen_app_id:" << tizen_app_id; + context->SetTizenAppId(tizen_app_id); } Eina_Bool ewk_context_tizen_app_version_set(Ewk_Context* context, const char* tizen_app_version) diff --git a/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.cc b/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.cc index b65f276..2e0016e 100644 --- a/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.cc +++ b/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.cc @@ -78,21 +78,6 @@ static const float maximum_legible_scale = 2.0f; static const float minimum_page_scale_for_mobile = 0.25f; static const float maximum_page_scale_for_mobile = 5.f; -class WrtUrlParseImpl : public content::WrtUrlParseBase { - public: - WrtUrlParseImpl(WrtWidget* wrt_widget) : wrt_widget_(wrt_widget) {} - GURL parseUrl(const GURL& old_url) const override { - if (!wrt_widget_->IsWidgetInfoSet()) - return old_url; - GURL new_url; - wrt_widget_->ParseUrl(old_url, new_url); - return new_url; - } - - private: - WrtWidget* wrt_widget_; -}; - ContentRendererClientEfl::ContentRendererClientEfl() {} ContentRendererClientEfl::~ContentRendererClientEfl() {} @@ -116,25 +101,10 @@ void ContentRendererClientEfl::RenderThreadStarted() { #endif if (command_line.HasSwitch(switches::kInjectedBundlePath)) { - std::string tizen_app_id = - command_line.GetSwitchValueASCII(switches::kTizenAppId); - - WrtWidget* wrt_widget = new WrtWidget; - widget_.reset(wrt_widget); - thread->AddObserver(wrt_widget->GetObserver()); - wrt_url_parser_.reset(new WrtUrlParseImpl(wrt_widget)); - - std::string theme = - command_line.GetSwitchValueASCII(switches::kWidgetTheme); - std::string encoded_bundle = - command_line.GetSwitchValueASCII(switches::kWidgetEncodedBundle); - std::string scale = - command_line.GetSwitchValueASCII(switches::kWidgetScale); - double scale_factor = 0; - base::StringToDouble(scale, &scale_factor); - - wrt_widget->SetWidgetInfo(tizen_app_id, scale_factor, theme, - encoded_bundle); + V8Widget::Type type = V8Widget::Type::WRT; + widget_.reset(V8Widget::CreateWidget(type, command_line)); + if (widget_->GetObserver()) + thread->AddObserver(widget_->GetObserver()); } render_thread_observer_.reset(new RenderThreadObserverEfl(this)); diff --git a/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.h b/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.h index 3d5a537..2067164 100644 --- a/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.h +++ b/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.h @@ -26,7 +26,6 @@ class VisitedLinkReader; class Ewk_Wrt_Message_Data; class V8Widget; -class WrtUrlParseImpl; class ContentRendererClientEfl : public content::ContentRendererClient { public: @@ -103,7 +102,6 @@ class ContentRendererClientEfl : public content::ContentRendererClient { static void ApplyCustomMobileSettings(blink::WebView*); std::unique_ptr widget_; - std::unique_ptr wrt_url_parser_; std::unique_ptr render_thread_observer_; std::unique_ptr visited_link_reader_; bool javascript_can_open_windows_ = true; diff --git a/tizen_src/ewk/efl_integration/url_request_context_getter_efl.cc b/tizen_src/ewk/efl_integration/url_request_context_getter_efl.cc index 82a6dce..a53e96b 100644 --- a/tizen_src/ewk/efl_integration/url_request_context_getter_efl.cc +++ b/tizen_src/ewk/efl_integration/url_request_context_getter_efl.cc @@ -38,7 +38,7 @@ #include "network_delegate_efl.h" #include "services/network/public/cpp/network_switches.h" #include "url_request_interceptor_efl.h" -#include "wrt/wrt_file_protocol_handler.h" +#include "wrt/dynamicplugin.h" using net::SQLitePersistentCookieStore; @@ -205,8 +205,8 @@ net::URLRequestContext* URLRequestContextGetterEfl::GetURLRequestContext() { // Use WrtFileProtocolHandler for File URI scheme. set_protocol = job_factory->SetProtocolHandler( url::kFileScheme, - base::WrapUnique(new net::WrtFileProtocolHandler( - base::CreateTaskRunnerWithTraits( + base::WrapUnique(new net::FileProtocolHandler( + base::CreateTaskRunner( {base::MayBlock(), base::TaskPriority::BEST_EFFORT, base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}) .get()))); @@ -344,4 +344,16 @@ void URLRequestContextGetterEfl::SetInterceptRequestCallback( } } +void URLRequestContextGetterEfl::SetDynamicPlugin( + const std::string& tizen_app_id, + DynamicPlugin* dynamic_plugin) { + if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { + content::GetIOThreadTaskRunner({}) + ->PostTask( // PostTaskWithTraits is deprecated + FROM_HERE, + base::BindOnce(&URLRequestContextGetterEfl::SetDynamicPlugin, this, + tizen_app_id, dynamic_plugin)); + return; + } +} }; // namespace content diff --git a/tizen_src/ewk/efl_integration/url_request_context_getter_efl.h b/tizen_src/ewk/efl_integration/url_request_context_getter_efl.h index 112d191..7dba57a 100644 --- a/tizen_src/ewk/efl_integration/url_request_context_getter_efl.h +++ b/tizen_src/ewk/efl_integration/url_request_context_getter_efl.h @@ -6,6 +6,7 @@ #ifndef _URL_REQUEST_CONTEXT_GETTER_EFL_H_ #define _URL_REQUEST_CONTEXT_GETTER_EFL_H_ +#include #include "base/memory/weak_ptr.h" #include "base/task/thread_pool.h" #include "content/public/browser/browser_context.h" @@ -21,6 +22,8 @@ #include "public/ewk_context.h" #include "public/ewk_cookie_manager_internal.h" +class DynamicPlugin; + namespace net { class CertVerifier; class HostResolver; @@ -63,6 +66,8 @@ class URLRequestContextGetterEfl : public net::URLRequestContextGetter { Ewk_Context* ewk_context, Ewk_Context_Intercept_Request_Callback callback, void* user_data); + void SetDynamicPlugin(const std::string& tizen_app_id, + DynamicPlugin* dynamic_plugin); protected: virtual ~URLRequestContextGetterEfl(); diff --git a/tizen_src/ewk/efl_integration/wrt/dynamicplugin.cc b/tizen_src/ewk/efl_integration/wrt/dynamicplugin.cc index 4fe4c47..4520178 100644 --- a/tizen_src/ewk/efl_integration/wrt/dynamicplugin.cc +++ b/tizen_src/ewk/efl_integration/wrt/dynamicplugin.cc @@ -2,86 +2,116 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "dynamicplugin.h" +#include "wrt/dynamicplugin.h" #include -#include "base/command_line.h" #include "base/logging.h" #include "common/content_switches_efl.h" +#include "wrt/wrt_dynamicplugin.h" namespace { -const char* const START_SESSION_FUNCTION = "DynamicPluginStartSession"; -const char* const STOP_SESSION_FUNCTION = "DynamicPluginStopSession"; -const char* const VERSION_FUNCTION = "DynamicPluginVersion"; +const char* const kStartSessionFunction = "DynamicPluginStartSession"; +const char* const kStopSessionFunction = "DynamicPluginStopSession"; +const char* const kVersionFunction = "DynamicPluginVersion"; + +typedef unsigned int (*VersionFunction)(void); +typedef void (*StartSessionFun_v0)(const char* tizen_app_id, + v8::Handle context, + int routing_handle, + double scale_factor, + const char* encoded_bundle, + const char* theme, + const char* baseURL); } DynamicPlugin::DynamicPlugin() - : handle_(0), - version_(0), - version_function_(0), - start_session_(0), - stop_session_(0) { - const base::CommandLine& commandLine = - *base::CommandLine::ForCurrentProcess(); - std::string injectedBundlePath = - commandLine.GetSwitchValueASCII(switches::kInjectedBundlePath); - if (injectedBundlePath.empty()) - return; - handle_ = dlopen(injectedBundlePath.c_str(), RTLD_LAZY); + : handle_(0), version_(0), start_session_(0), stop_session_(0) {} + +bool DynamicPlugin::Init(const std::string& injected_bundle_path) { + if (handle_ || injected_bundle_path.empty()) + return handle_ != nullptr; + + handle_ = dlopen(injected_bundle_path.c_str(), RTLD_LAZY); + if (!handle_) + LOG(ERROR) << "No handle to " << injected_bundle_path << " " << dlerror(); + return handle_ != nullptr; +} + +bool DynamicPlugin::InitRenderer(const std::string& injected_bundle_path) { if (!handle_) { - LOG(ERROR) << "No handle to " << injectedBundlePath.c_str() << " " - << dlerror() << "\n"; - return; + if (!Init(injected_bundle_path)) + return false; } - *reinterpret_cast(&version_function_) = - dlsym(handle_, VERSION_FUNCTION); - if (!version_function_) { - LOG(ERROR) << "No " << VERSION_FUNCTION << " symbol found!\n"; - } else { - version_ = version_function_(); + VersionFunction version_function = + reinterpret_cast(GetFunction(kVersionFunction)); + if (version_function) { + version_ = version_function(); if (version_ != 0 && version_ != 1) { LOG(ERROR) << "Unknown plugin version: " << version_ << "!\n"; - return; + return false; } } - *reinterpret_cast(&start_session_) = - dlsym(handle_, START_SESSION_FUNCTION); - if (!start_session_) - LOG(ERROR) << "No " << START_SESSION_FUNCTION << " symbol found!\n"; - *reinterpret_cast(&stop_session_) = - dlsym(handle_, STOP_SESSION_FUNCTION); - if (!stop_session_) - LOG(ERROR) << "No " << STOP_SESSION_FUNCTION << " symbol found!\n"; + start_session_ = reinterpret_cast( + GetFunction(kStartSessionFunction)); + stop_session_ = + reinterpret_cast(GetFunction(kStopSessionFunction)); + return start_session_ && stop_session_; } void DynamicPlugin::StartSession(const char* session_id, v8::Handle context, int routing_handle, - const void* session_blob) { + const void* session_blob, + double scale_factor, + const char* encoded_bundle, + const char* theme) const { if (!start_session_) return; - start_session_(session_id, context, routing_handle, session_blob); + switch (version_) { + case 0: { + auto startSession_v0 = + reinterpret_cast(start_session_); + startSession_v0(session_id, context, routing_handle, scale_factor, + encoded_bundle, theme, + reinterpret_cast(session_blob)); + break; + } + case 1: { + start_session_(session_id, context, routing_handle, session_blob); + break; + } + default: + return; + } } void DynamicPlugin::StopSession(const char* session_id, - v8::Handle context) { + v8::Handle context) const { if (!stop_session_) return; stop_session_(session_id, context); } +void* DynamicPlugin::GetFunction(const char* funcation_name) const { + if (!handle_) + return nullptr; + + void* function_addr = dlsym(handle_, funcation_name); + if (!function_addr) + LOG(ERROR) << "No " << funcation_name << " symbol found! " << dlerror(); + return function_addr; +} + DynamicPlugin::~DynamicPlugin() { if (handle_) dlclose(handle_); } -DynamicPlugin& DynamicPlugin::instance() { - static DynamicPlugin dynamicPlugin; - return dynamicPlugin; +DynamicPlugin& DynamicPlugin::Get(V8Widget::Type type) { + return WrtDynamicPlugin::Get(); } - diff --git a/tizen_src/ewk/efl_integration/wrt/dynamicplugin.h b/tizen_src/ewk/efl_integration/wrt/dynamicplugin.h index f71ac92..c822bd9 100644 --- a/tizen_src/ewk/efl_integration/wrt/dynamicplugin.h +++ b/tizen_src/ewk/efl_integration/wrt/dynamicplugin.h @@ -7,8 +7,7 @@ #include #include "v8/include/v8.h" - -typedef unsigned int (*VersionFunction)(void); +#include "wrt/v8widget.h" typedef void (*StartSessionFunction)(const char* session_id, v8::Handle context, @@ -20,24 +19,39 @@ typedef void (*StopSessionFunction)(const char* session_id, class DynamicPlugin { public: + virtual ~DynamicPlugin(); + virtual bool Init(const std::string& injectedBundlePath); + virtual bool InitRenderer(const std::string& injected_bundle_path); + + // Interface for WebApp URL Conversion + virtual void SetWidgetInfo(const std::string& tizen_app_id) = 0; + virtual bool CanHandleParseUrl(const std::string& scheme) const = 0; + virtual void ParseURL(std::string* old_url, + std::string* new_url, + const char* tizen_app_id, + bool* is_decrypted_file = nullptr) = 0; + void StartSession(const char* session_id, v8::Handle context, int routing_handle, - const void* session_blob); - void StopSession(const char* session_id, v8::Handle context); + const void* session_blob, + double scale_factor = 1.0f, + const char* encoded_bundle = nullptr, + const char* theme = nullptr) const; + void StopSession(const char* session_id, + v8::Handle context) const; - virtual ~DynamicPlugin(); + void* GetFunction(const char* funcation_name) const; + void* handle() const { return handle_; } - static DynamicPlugin& instance(); + static DynamicPlugin& Get(V8Widget::Type type); protected: DynamicPlugin(); - DynamicPlugin(const DynamicPlugin&); - DynamicPlugin& operator=(const DynamicPlugin&); + private: void* handle_; unsigned int version_; - VersionFunction version_function_; StartSessionFunction start_session_; StopSessionFunction stop_session_; }; diff --git a/tizen_src/ewk/efl_integration/wrt/v8widget.cc b/tizen_src/ewk/efl_integration/wrt/v8widget.cc index f6a8044..e2b99b5 100644 --- a/tizen_src/ewk/efl_integration/wrt/v8widget.cc +++ b/tizen_src/ewk/efl_integration/wrt/v8widget.cc @@ -6,48 +6,22 @@ #include "base/notreached.h" #include "wrt/dynamicplugin.h" -#include "wrt/wrt_dynamicplugin.h" +#include "wrt/wrtwidget.h" -V8Widget::V8Widget(Type type) : type_(type) {} - -V8Widget::~V8Widget() {} - -void V8Widget::SetId(const std::string& id) { - id_ = id; -} - -V8Widget::Type V8Widget::GetType() const { - return type_; -} - -bool V8Widget::ParseUrl(const GURL& url, GURL& new_url) { - if (id_.empty()) - return false; - - std::string old_url = url.possibly_invalid_spec(); - std::string s_new_url; - if (type_ == V8Widget::Type::WRT) - WrtDynamicPlugin::instance().ParseURL(&old_url, &s_new_url, id_.c_str()); - if (!s_new_url.empty()) { - new_url = GURL(s_new_url); - return true; - } - - return false; +// static +V8Widget* V8Widget::CreateWidget(Type type, + const base::CommandLine& command_line) { + return new WrtWidget(command_line); } void V8Widget::StopSession(v8::Handle context) { - if (!id_.empty() && !context.IsEmpty()) { - if (type_ == V8Widget::Type::WRT) - WrtDynamicPlugin::instance().StopSession(id_.c_str(), context); - } + if (plugin_ && !id_.empty() && !context.IsEmpty()) + plugin_->StopSession(id_.c_str(), context); } void V8Widget::StartSession(v8::Handle context, int routing_handle, - const void* session_blob) { - if (!id_.empty() && !context.IsEmpty()) { - if (type_ == V8Widget::Type::WRT) - NOTREACHED(); - } + const char* session_blob) { + if (plugin_ && !id_.empty() && !context.IsEmpty()) + plugin_->StartSession(id_.c_str(), context, routing_handle, session_blob); } diff --git a/tizen_src/ewk/efl_integration/wrt/v8widget.h b/tizen_src/ewk/efl_integration/wrt/v8widget.h index 7b08e43..2b69876 100644 --- a/tizen_src/ewk/efl_integration/wrt/v8widget.h +++ b/tizen_src/ewk/efl_integration/wrt/v8widget.h @@ -11,28 +11,51 @@ #include "url/gurl.h" #include "v8/include/v8.h" +class DynamicPlugin; +namespace base { +class CommandLine; +} +namespace content { +class RenderThreadObserver; +} + // Have to be created on the RenderThread. class V8Widget { public: enum class Type { HBBTV, WRT }; - explicit V8Widget(Type type); - virtual ~V8Widget() = 0; + virtual ~V8Widget(){}; + + virtual content::RenderThreadObserver* GetObserver() = 0; + + // TODO(is46.kim) Remove ParseUrl. + // These interfaces will no longer be called from renderer and will be called + // directly form browser. + virtual bool ParseUrl(const GURL& url, + GURL& new_url, + bool* is_decrypted_file = nullptr) { + // NOTIMPLEMENTED(); + return false; + } - void SetId(const std::string& id); - Type GetType() const; + void SetId(const std::string& id) { id_ = id; } + Type GetType() const { return type_; } + void SetPlugin(DynamicPlugin* plugin) { plugin_ = plugin; } virtual void StartSession(v8::Handle, int routing_handle, - const void* session_blob); + const char* session_blob); - virtual void StopSession(v8::Handle); + void StopSession(v8::Handle); - bool ParseUrl(const GURL& url, GURL& new_url); + static V8Widget* CreateWidget(Type type, + const base::CommandLine& command_line); protected: + explicit V8Widget(Type type) : type_(type), plugin_(nullptr) {} std::string id_; Type type_; + DynamicPlugin* plugin_; }; #endif // EWK_EFL_INTEGRATION_WRT_V8WIDGET_H_ diff --git a/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.cc b/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.cc index 6906770..e430b91 100644 --- a/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.cc +++ b/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.cc @@ -12,99 +12,92 @@ namespace { -const char* const SET_WIDGET_INFO_FUNCTION = "DynamicSetWidgetInfo"; -const char* const DATABASE_ATTACH_FUNCTION = "DynamicDatabaseAttach"; +const char* const kSetWidgetInfoFunction = "DynamicSetWidgetInfo"; +const char* const kDatabaseAttachFunction = "DynamicDatabaseAttach"; +const char* const kOnIpcMessageFunction = "DynamicOnIPCMessage"; #if BUILDFLAG(IS_TIZEN_TV) -const char* const URL_PARSING_FUNCTION = "DynamicTVUrlParsing"; +const char* const kUrlParsingFunction = "DynamicTVUrlParsing"; +const char* const kGetFileDecryptedDataBufferFunction = + "DynamicGetFileDecryptedDataBuffer"; #else -const char* const URL_PARSING_FUNCTION = "DynamicUrlParsing"; +const char* const kUrlParsingFunction = "DynamicUrlParsing"; #endif - -typedef void (*StartSessionFun_v0)(const char* tizen_app_id, - v8::Handle context, - int routing_handle, - double scale_factor, - const char* encoded_bundle, - const char* theme, - const char* baseURL); } // namespace WrtDynamicPlugin::WrtDynamicPlugin() : DynamicPlugin(), - parseURL_(0), + url_parser_(0), set_widget_info_(0), - database_attach_(0), - on_IPC_message_(0) { - *reinterpret_cast(&parseURL_) = dlsym(handle_, URL_PARSING_FUNCTION); - if (!parseURL_) - LOG(ERROR) << "No " << URL_PARSING_FUNCTION << " symbol found!\n"; - - *reinterpret_cast(&set_widget_info_) = - dlsym(handle_, SET_WIDGET_INFO_FUNCTION); - if (!set_widget_info_) - LOG(ERROR) << "No " << SET_WIDGET_INFO_FUNCTION << " symbol found!"; + on_IPC_message_(0) {} + +bool WrtDynamicPlugin::Init(const std::string& injected_bundle_path) { + if (!DynamicPlugin::Init(injected_bundle_path)) + return false; + set_widget_info_ = + reinterpret_cast(GetFunction(kSetWidgetInfoFunction)); + url_parser_ = reinterpret_cast(GetFunction(kUrlParsingFunction)); +#if BUILDFLAG(IS_TIZEN_TV) +#if !defined(EWK_BRINGUP) + get_file_encrypted_data_buffer_ = + reinterpret_cast( + GetFunction(kGetFileDecryptedDataBufferFunction)); + if (!get_file_encrypted_data_buffer_) + return false; +#endif // EWK_BRINGUP +#endif + return set_widget_info_ && url_parser_; +} - *reinterpret_cast(&database_attach_) = - dlsym(handle_, DATABASE_ATTACH_FUNCTION); - if (!database_attach_) { - LOG(ERROR) << "No " << DATABASE_ATTACH_FUNCTION << " symbol found!\n"; - return; - } +bool WrtDynamicPlugin::InitRenderer(const std::string& injected_bundle_path) { + if (!DynamicPlugin::InitRenderer(injected_bundle_path)) + return false; + database_attach_ = + reinterpret_cast(GetFunction(kDatabaseAttachFunction)); + if (!database_attach_) + return false; + + on_IPC_message_ = + reinterpret_cast(GetFunction(kOnIpcMessageFunction)); - *reinterpret_cast(&on_IPC_message_) = - dlsym(handle_, "DynamicOnIPCMessage"); - if (!on_IPC_message_) - LOG(ERROR) << "No DynamicOnIPCMessage symbol found!\n"; database_attach_(1); + return on_IPC_message_ && database_attach_; } void WrtDynamicPlugin::StartSession(const char* tizen_app_id, v8::Handle context, int routing_handle, - double scale_factor, - const char* encoded_bundle, - const char* theme, const char* baseURL) { - if (!start_session_ || !database_attach_) + if (!database_attach_) return; - switch (version_) { - case 0: { - auto startSession_v0 = - reinterpret_cast(start_session_); - startSession_v0(tizen_app_id, context, routing_handle, scale_factor, - encoded_bundle, theme, baseURL); - break; - } - case 1: { - DynamicPlugin::StartSession(tizen_app_id, context, routing_handle, - baseURL); - break; - } - default: - return; - } + DynamicPlugin::StartSession(tizen_app_id, context, routing_handle, baseURL); } void WrtDynamicPlugin::StopSession(const char* tizen_app_id, v8::Handle context) { - if (!stop_session_ || !database_attach_) + if (!database_attach_) return; DynamicPlugin::StopSession(tizen_app_id, context); } +bool WrtDynamicPlugin::CanHandleParseUrl(const std::string& scheme) const { + // xwalk handles only file and app scheme. + if (scheme == url::kFileScheme || scheme == "app") + return true; + return false; +} + void WrtDynamicPlugin::ParseURL(std::string* old_url, std::string* new_url, const char* tizen_app_id, bool* is_encrypted_file) { - if (!parseURL_ || !database_attach_) - return; - + if (url_parser_) { #if BUILDFLAG(IS_TIZEN_TV) - parseURL_(old_url, new_url, tizen_app_id, is_encrypted_file); + url_parser_(old_url, new_url, tizen_app_id, is_encrypted_file); #else - parseURL_(old_url, new_url, tizen_app_id); + url_parser_(old_url, new_url, tizen_app_id); #endif + } } void WrtDynamicPlugin::SetWidgetInfo(const std::string& tizen_app_id) { @@ -119,7 +112,7 @@ WrtDynamicPlugin::~WrtDynamicPlugin() { database_attach_(0); } -WrtDynamicPlugin& WrtDynamicPlugin::instance() { +WrtDynamicPlugin& WrtDynamicPlugin::Get() { static WrtDynamicPlugin dynamicPlugin; return dynamicPlugin; } diff --git a/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.h b/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.h index 7653e12..8f02125 100644 --- a/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.h +++ b/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.h @@ -29,24 +29,32 @@ typedef void (*DatabaseAttachFun)(int database_attach); class WrtDynamicPlugin : public DynamicPlugin { public: + // For Browser and Renderer + bool Init(const std::string& injected_bundle_path) override; + // Only for Renderer + bool InitRenderer(const std::string& injected_bundle_path) override; + void StartSession(const char* tizen_app_id, v8::Handle context, int routing_handle, - double scale_factor, - const char* encoded_bundle, - const char* theme, const char* baseURL); void StopSession(const char* tizen_app_id, v8::Handle context); + // TODO(is46.kim) : |WrtDynamicPlugin| was designed to run on the renderer + // with the injected bundle of xwalk. But currently, the implementation is + // changed to call from WrtUrlRequestInterceptor in browser IO Thread. File + // scheme conversion implementations should be separated only to browser side. + void SetWidgetInfo(const std::string& tizen_app_id) override; + bool CanHandleParseUrl(const std::string& scheme) const override; + void ParseURL(std::string* old_url, std::string* new_url, const char* tizen_app_id, - bool* is_encrypted_file = nullptr); + bool* is_decrypted_file = nullptr); - void SetWidgetInfo(const std::string& tizen_app_id); void MessageReceived(const Ewk_Wrt_Message_Data& data); - static WrtDynamicPlugin& instance(); + static WrtDynamicPlugin& Get(); ~WrtDynamicPlugin() override; private: @@ -55,7 +63,7 @@ class WrtDynamicPlugin : public DynamicPlugin { WrtDynamicPlugin(const WrtDynamicPlugin&) = delete; WrtDynamicPlugin& operator=(const WrtDynamicPlugin&) = delete; - ParseUrlFun parseURL_; + ParseUrlFun url_parser_; SetWidgetInfoFun set_widget_info_; DatabaseAttachFun database_attach_; OnIPCMessageFun on_IPC_message_; diff --git a/tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.cc b/tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.cc deleted file mode 100644 index 4e78072..0000000 --- a/tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.cc +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (c) 2014,2015 Samsung Electronics. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "wrt_file_protocol_handler.h" - -#include "base/command_line.h" -#include "common/content_switches_efl.h" -#include "content/public/common/content_client.h" -#include "content/public/renderer/content_renderer_client.h" -#include "net/base/filename_util.h" -#include "net/url_request/url_request_data_job.h" -#include "net/url_request/url_request_error_job.h" -#include "net/url_request/url_request_file_dir_job.h" -#include "net/url_request/url_request_file_job.h" -#include "net/url_request/url_request_simple_job.h" - -#include "wrt/wrt_dynamicplugin.h" - -namespace net { - -class WrtURLRequestDataJob : public URLRequestSimpleJob { - public: - WrtURLRequestDataJob(URLRequest* request, - NetworkDelegate* network_delegate, - const GURL& data_url) - : URLRequestSimpleJob(request, network_delegate) { - data_url_ = data_url; - } - - int GetData(std::string* mime_type, - std::string* charset, - std::string* data, - CompletionOnceCallback callback) const override; - - private: - ~WrtURLRequestDataJob() override {} - GURL data_url_; -}; - -int WrtURLRequestDataJob::GetData(std::string* mime_type, - std::string* charset, - std::string* data, - CompletionOnceCallback callback) const { - if (!data_url_.is_valid()) - return ERR_INVALID_URL; - - return URLRequestDataJob::BuildResponse(data_url_, mime_type, charset, data, - nullptr); -} - -bool WrtFileProtocolHandler::GetWrtParsedUrl(const GURL& url, - GURL& parsed_url) const { - static std::string tizen_app_id = - base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - switches::kTizenAppId); - if (tizen_app_id.empty()) - return false; - - std::string url_str = url.possibly_invalid_spec(); - std::string parsed_url_str; - bool is_encrypted_file; - // Need to check if variable is_encrypted_file is needed or not - // if we do not pass is_encrypted_file to ParseURL() we observe - // that code flow is blocked before ParseURL(). - WrtDynamicPlugin::instance().ParseURL( - &url_str, &parsed_url_str, tizen_app_id.c_str(), &is_encrypted_file); - if (!parsed_url_str.empty()) { - parsed_url = GURL(parsed_url_str); - return true; - } - return false; -} - -std::unique_ptr CreateJob(URLRequest* request) const { -#if !defined(EWK_BRINGUP) // FIXME: m94 bringup - GURL parsed_url; - if (GetWrtParsedUrl(request->url(), parsed_url)) { - // Data URI scheme for WRT encryption content - if (parsed_url.SchemeIs(url::kDataScheme)) - return new WrtURLRequestDataJob(request, network_delegate, parsed_url); - } else { - parsed_url = request->url(); - } - - base::FilePath file_path; - const bool is_file = FileURLToFilePath(parsed_url, &file_path); - - // Check file access permissions. - // FIXME: The third parameter of net::URLRequestErrorJob sould be - // absolute_path. - - if (!network_delegate || - !network_delegate->CanAccessFile(*request, file_path, file_path)) - return std::make_unique(request, ERR_ACCESS_DENIED); - - // We need to decide whether to create URLRequestFileJob for file access or - // URLRequestFileDirJob for directory access. To avoid accessing the - // filesystem, we only look at the path string here. - // The code in the URLRequestFileJob::Start() method discovers that a path, - // which doesn't end with a slash, should really be treated as a directory, - // and it then redirects to the URLRequestFileDirJob. - if (is_file && file_path.EndsWithSeparator() && file_path.IsAbsolute()) - return std::make_unique(request, file_path); - - // Use a regular file request job for all non-directories (including invalid - // file names). - return std::make_unique(request, file_path, - file_task_runner_); -#else - return URLRequestHttpJob::Create(request); -#endif -} - -} // namespace diff --git a/tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.h b/tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.h deleted file mode 100644 index ed2f7a9..0000000 --- a/tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2014,2015 Samsung Electronics. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef WRT_FILE_PROTOCOL_HANDLER -#define WRT_FILE_PROTOCOL_HANDLER - -#include "base/memory/ref_counted.h" -#include "net/url_request/url_request_job_factory.h" - -class GURL; - -namespace base { -class TaskRunner; -} - -namespace net { - -class NetworkDelegate; -class URLRequestJob; - -class WrtFileProtocolHandler : public URLRequestJobFactory::ProtocolHandler { - public: - explicit WrtFileProtocolHandler( - const scoped_refptr& file_task_runner) - : file_task_runner_(file_task_runner) {} - ~WrtFileProtocolHandler() override {} - - WrtFileProtocolHandler(const WrtFileProtocolHandler&) = delete; - WrtFileProtocolHandler& operator=(const WrtFileProtocolHandler&) = delete; - - std::unique_ptr CreateJob(URLRequest* request) const override; - bool IsSafeRedirectTarget(const GURL& location) const override { - return false; - } - - private: - bool GetWrtParsedUrl(const GURL& url, GURL& parsed_url) const; - - const scoped_refptr file_task_runner_; -}; - -} // namespace net - -#endif // WRT_FILE_PROTOCOL_HANDLER diff --git a/tizen_src/ewk/efl_integration/wrt/wrtwidget.cc b/tizen_src/ewk/efl_integration/wrt/wrtwidget.cc index c4fbde5..34347cb 100644 --- a/tizen_src/ewk/efl_integration/wrt/wrtwidget.cc +++ b/tizen_src/ewk/efl_integration/wrt/wrtwidget.cc @@ -2,8 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "wrtwidget.h" +#include "wrt/wrtwidget.h" +#include "base/strings/string_number_conversions.h" +#include "command_line_efl.h" +#include "common/content_switches_efl.h" #include "common/render_messages_ewk.h" #include "content/public/renderer/render_thread.h" #include "ipc/ipc_sync_channel.h" @@ -48,31 +51,31 @@ class WrtRenderThreadObserver : public content::RenderThreadObserver { IPC::SyncChannel* channel_; }; -WrtWidget::WrtWidget() - : V8Widget(V8Widget::Type::WRT), - scale_(0), - observer_(new WrtRenderThreadObserver(this)) { +WrtWidget::WrtWidget(const base::CommandLine& command_line) + : V8Widget(V8Widget::Type::WRT) { DCHECK(content::RenderThread::Get()) << "WrtWidget must be constructed on the render thread"; -} -WrtWidget::~WrtWidget() { - delete observer_; + std::string injected_bundle_path = + command_line.GetSwitchValueASCII(switches::kInjectedBundlePath); + CHECK(!injected_bundle_path.empty()); + WrtDynamicPlugin::Get().InitRenderer(injected_bundle_path); + SetPlugin(&WrtDynamicPlugin::Get()); + + observer_.reset(new WrtRenderThreadObserver(this)); + + SetWidgetInfo(command_line.GetSwitchValueASCII(switches::kTizenAppId)); } +WrtWidget::~WrtWidget() {} + content::RenderThreadObserver* WrtWidget::GetObserver() { - return observer_; + return observer_.get(); } -void WrtWidget::SetWidgetInfo(const std::string& tizen_app_id, - double scale_factor, - const std::string& theme, - const std::string& encoded_bundle) { +void WrtWidget::SetWidgetInfo(const std::string& tizen_app_id) { id_ = tizen_app_id; - scale_ = scale_factor; - theme_ = theme; - encoded_bundle_ = encoded_bundle; - WrtDynamicPlugin::instance().SetWidgetInfo(id_); + WrtDynamicPlugin::Get().SetWidgetInfo(id_); } bool WrtWidget::IsWidgetInfoSet() const { @@ -81,15 +84,14 @@ bool WrtWidget::IsWidgetInfoSet() const { void WrtWidget::StartSession(v8::Handle context, int routing_handle, - const void* session_blob) { + const char* session_blob) { if (!id_.empty() && !context.IsEmpty()) { - WrtDynamicPlugin::instance().StartSession( - id_.c_str(), context, routing_handle, scale_, encoded_bundle_.c_str(), - theme_.c_str(), reinterpret_cast(session_blob)); + WrtDynamicPlugin::Get().StartSession(id_.c_str(), context, routing_handle, + session_blob); } } void WrtWidget::MessageReceived(const Ewk_Wrt_Message_Data& data) { if (!id_.empty()) - WrtDynamicPlugin::instance().MessageReceived(data); + WrtDynamicPlugin::Get().MessageReceived(data); } diff --git a/tizen_src/ewk/efl_integration/wrt/wrtwidget.h b/tizen_src/ewk/efl_integration/wrt/wrtwidget.h index 5078964..8125115 100644 --- a/tizen_src/ewk/efl_integration/wrt/wrtwidget.h +++ b/tizen_src/ewk/efl_integration/wrt/wrtwidget.h @@ -18,15 +18,12 @@ class WrtRenderThreadObserver; // Have to be created on the RenderThread. class WrtWidget : public V8Widget { public: - WrtWidget(); + WrtWidget(const base::CommandLine& command_line); ~WrtWidget() override; - content::RenderThreadObserver* GetObserver(); + content::RenderThreadObserver* GetObserver() override; - void SetWidgetInfo(const std::string& tizen_app_id, - double scaleFactor, - const std::string& theme, - const std::string& encodedBundle); + void SetWidgetInfo(const std::string& tizen_app_id); bool IsWidgetInfoSet() const; @@ -34,13 +31,10 @@ class WrtWidget : public V8Widget { void StartSession(v8::Handle, int routing_handle, - const void* session_blob) override; + const char* session_blob) override; private: - double scale_; - std::string encoded_bundle_; - std::string theme_; - WrtRenderThreadObserver* observer_; + std::unique_ptr observer_; }; #endif // EWK_EFL_INTEGRATION_WRT_WRTWIDGET_H_ -- 2.7.4 From 5092db101889e7bfa804cc54daf9bcc07de19edf Mon Sep 17 00:00:00 2001 From: Surya Kumar Date: Fri, 24 Feb 2023 14:00:23 +0530 Subject: [PATCH 07/16] [M108 Migration] Fix WRTJS build errors This patch adds necessary changes to resolve dependency errors occurring during various wrtjs profile builds. Reference: https://review.tizen.org/gerrit/271777 Change-Id: I2a00b44c4d9b4d4b22d4c94462b3197ce1adf876 Signed-off-by: Surya Kumar --- packaging/chromium-efl.spec | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) mode change 100644 => 100755 packaging/chromium-efl.spec diff --git a/packaging/chromium-efl.spec b/packaging/chromium-efl.spec old mode 100644 new mode 100755 index e8e97a4..49fb87b --- a/packaging/chromium-efl.spec +++ b/packaging/chromium-efl.spec @@ -236,6 +236,11 @@ BuildRequires: pkgconfig(capi-ui-inputmethod) BuildRequires: pkgconfig(privileged-service) %endif +# node module is required for nmt and category public features. +%if "%{?profile}" != "tv" && "%{?profile}" != "wearable" && "%{?_with_da_profile}" != "1" +%define _support_node_module 1 +%endif + %description Browser Engine based on Chromium EFL (Shared Library) @@ -487,6 +492,13 @@ install -m 0644 tizen_src/ewk/efl_webview_app/efl_webview_app.png %{buildroot}%{ install -m 0644 "%{OUTPUT_FOLDER}"/pkgconfig/*.pc "%{buildroot}"%{_libdir}/pkgconfig/ install -m 0644 tizen_src/ewk/efl_integration/public/*.h "%{buildroot}"%{_includedir}/chromium-ewk/ install -m 0644 v8/include/*.h "%{buildroot}"%{_includedir}/v8/ +install -d "%{buildroot}"%{_includedir}/v8/cppgc +install -m 0644 v8/include/cppgc/common.h "%{buildroot}"%{_includedir}/v8/cppgc/ + +%if 0%{?_support_node_module} +install -d "%{buildroot}"%{_includedir}/node +install -m 0644 third_party/electron_node/src/*.h "%{buildroot}"%{_includedir}/node/ +%endif install -m 0755 "%{OUTPUT_FOLDER}"/libminigbm.so "%{buildroot}"%{_libdir} @@ -721,6 +733,10 @@ setcap cap_mac_admin=eip %{_bindir}/wrt-service %{_libdir}/pkgconfig/*.pc %{_includedir}/v8/* +%if 0%{?_support_node_module} +%{_includedir}/node/* +%endif + %if 0%{?__enable_wrt_js} %{_includedir}/wrt/* %endif -- 2.7.4 From 59e9bb5ecc915c1d0bad687770c8bd60b122db06 Mon Sep 17 00:00:00 2001 From: liuxd Date: Fri, 24 Feb 2023 09:39:34 +0800 Subject: [PATCH 08/16] [M108 Migration][VD] Fix IME focus issue 1. Add WebView focus and Widget show state check 2. Fix WebPage auto focus to input,ime have not focus in issue. refer: https://review.tizen.org/gerrit/#/c/282680/ Change-Id: I7c55cf139766af540119d4633a952816e264032d Signed-off-by: liuxd --- third_party/blink/renderer/core/dom/element.cc | 10 ++++++++++ .../blink/renderer/core/frame/web_frame_widget_impl.cc | 5 +++++ .../blink/renderer/core/frame/web_frame_widget_impl.h | 3 +++ third_party/blink/renderer/core/page/chrome_client.h | 3 +++ .../blink/renderer/core/page/chrome_client_impl.cc | 9 +++++++++ .../blink/renderer/core/page/chrome_client_impl.h | 3 +++ .../blink/renderer/platform/widget/widget_base.cc | 18 +++++++++++++++++- .../blink/renderer/platform/widget/widget_base.h | 5 +++++ 8 files changed, 55 insertions(+), 1 deletion(-) diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 6f4a5a2..6b8d7dd 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc @@ -5688,6 +5688,16 @@ void Element::Focus(const FocusParams& params) { chrome_client.ClearKeyboardTriggeredTooltip(*GetDocument().GetFrame()); } } +#if BUILDFLAG(IS_EFL) + if (!LocalFrame::HasTransientUserActivation(nullptr)) { + // Called when value of focused text field gets dirty, + // e.g. value is modified by script, not by user input. + GetDocument() + .GetPage() + ->GetChromeClient() + .DidUpdateTextOfFocusedElementByNonUserInput(*GetDocument().GetFrame()); + } +#endif } void Element::UpdateSelectionOnFocus( diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc index f96ba43..3ed5097 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc +++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc @@ -3510,6 +3510,11 @@ void WebFrameWidgetImpl::ShowVirtualKeyboardOnElementFocus() { widget_base_->ShowVirtualKeyboardOnElementFocus(); } +#if BUILDFLAG(IS_EFL) +void WebFrameWidgetImpl::DidUpdateTextOfFocusedElementByNonUserInput() { + widget_base_->DidUpdateTextOfFocusedElementByNonUserInput(); +} +#endif void WebFrameWidgetImpl::ProcessTouchAction(WebTouchAction touch_action) { widget_base_->ProcessTouchAction(touch_action); } diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h index 90e4b65..098e503 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h +++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h @@ -544,6 +544,9 @@ class CORE_EXPORT WebFrameWidgetImpl void ClearKeyboardTriggeredTooltip(); void ShowVirtualKeyboardOnElementFocus(); +#if BUILDFLAG(IS_EFL) + void DidUpdateTextOfFocusedElementByNonUserInput(); +#endif void ProcessTouchAction(WebTouchAction touch_action); void SetPanAction(mojom::blink::PanAction pan_action); diff --git a/third_party/blink/renderer/core/page/chrome_client.h b/third_party/blink/renderer/core/page/chrome_client.h index bee1063..316b8e7 100644 --- a/third_party/blink/renderer/core/page/chrome_client.h +++ b/third_party/blink/renderer/core/page/chrome_client.h @@ -502,6 +502,9 @@ class CORE_EXPORT ChromeClient : public GarbageCollected { // Input method editor related functions. virtual void ShowVirtualKeyboardOnElementFocus(LocalFrame&) {} +#if BUILDFLAG(IS_EFL) + virtual void DidUpdateTextOfFocusedElementByNonUserInput(LocalFrame&) {} +#endif virtual TransformationMatrix GetDeviceEmulationTransform() const { return TransformationMatrix(); } diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc index ec0e285..434c4b3 100644 --- a/third_party/blink/renderer/core/page/chrome_client_impl.cc +++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc @@ -1194,6 +1194,15 @@ void ChromeClientImpl::ShowVirtualKeyboardOnElementFocus(LocalFrame& frame) { ->ShowVirtualKeyboardOnElementFocus(); } +#if BUILDFLAG(IS_EFL) +void ChromeClientImpl::DidUpdateTextOfFocusedElementByNonUserInput( + LocalFrame& frame) { + WebLocalFrameImpl::FromFrame(frame) + ->LocalRootFrameWidget() + ->DidUpdateTextOfFocusedElementByNonUserInput(); +} +#endif + void ChromeClientImpl::OnMouseDown(Node& mouse_down_node) { if (auto* fill_client = AutofillClientFromFrame(mouse_down_node.GetDocument().GetFrame())) { diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.h b/third_party/blink/renderer/core/page/chrome_client_impl.h index 76433dc..42933c6 100644 --- a/third_party/blink/renderer/core/page/chrome_client_impl.h +++ b/third_party/blink/renderer/core/page/chrome_client_impl.h @@ -268,6 +268,9 @@ class CORE_EXPORT ChromeClientImpl final : public ChromeClient { void ShowVirtualKeyboardOnElementFocus(LocalFrame&) override; +#if BUILDFLAG(IS_EFL) + void DidUpdateTextOfFocusedElementByNonUserInput(LocalFrame&) override; +#endif TransformationMatrix GetDeviceEmulationTransform() const override; void OnMouseDown(Node&) override; diff --git a/third_party/blink/renderer/platform/widget/widget_base.cc b/third_party/blink/renderer/platform/widget/widget_base.cc index 5f2147f..dbeadca 100644 --- a/third_party/blink/renderer/platform/widget/widget_base.cc +++ b/third_party/blink/renderer/platform/widget/widget_base.cc @@ -1210,8 +1210,15 @@ void WidgetBase::ShowVirtualKeyboardOnElementFocus() { UpdateTextInputState(); #elif BUILDFLAG(IS_EFL) // If webview hasn't focus, IME shouldn't be shown. - if (has_focus_) + if (has_focus_) { +#if BUILDFLAG(IS_TIZEN_TV) + LOG(INFO) << __FUNCTION__; + DidUpdateTextOfFocusedElementByNonUserInput(); +#else ShowVirtualKeyboard(); +#endif // endif defined(OS_TIZEN_TV_PRODUCT) + } + #else ShowVirtualKeyboard(); #endif @@ -1223,6 +1230,15 @@ void WidgetBase::ShowVirtualKeyboardOnElementFocus() { #endif } +#if BUILDFLAG(IS_EFL) +void WidgetBase::DidUpdateTextOfFocusedElementByNonUserInput() { + if (GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE) { + LOG(INFO) << __FUNCTION__ << " set is_user_action_ FALSE"; + is_user_action_ = false; + ShowVirtualKeyboard(); + } +} +#endif void WidgetBase::ProcessTouchAction(cc::TouchAction touch_action) { if (!input_handler_.ProcessTouchAction(touch_action)) return; diff --git a/third_party/blink/renderer/platform/widget/widget_base.h b/third_party/blink/renderer/platform/widget/widget_base.h index f701e65..e1bda87 100644 --- a/third_party/blink/renderer/platform/widget/widget_base.h +++ b/third_party/blink/renderer/platform/widget/widget_base.h @@ -223,6 +223,11 @@ class PLATFORM_EXPORT WidgetBase : public mojom::blink::Widget, // Dispatch the virtual keyboard and update text input state. void ShowVirtualKeyboardOnElementFocus(); +#if BUILDFLAG(IS_EFL) + // Called when value of focused text field gets dirty, e.g. value is modified + // by script, not by user input. + void DidUpdateTextOfFocusedElementByNonUserInput(); +#endif // Process the touch action. void ProcessTouchAction(cc::TouchAction touch_action); -- 2.7.4 From e0fd0b26759ab879e7f0a50c4b0c7c481bb3bbbf Mon Sep 17 00:00:00 2001 From: "qiang.ji" Date: Mon, 27 Feb 2023 09:16:18 +0800 Subject: [PATCH 09/16] [M108 Migration] Add empty impl for tree api to avoid compile error. refs: ewk_view_clear_tiles_on_hide_enabled_set https://review.tizen.org/gerrit/#/c/279483/ ewk_view_edge_scroll_by https://review.tizen.org/gerrit/#/c/platform/framework/web/chromium-efl/+/271182/ ewk_view_tile_cover_area_multiplier_set https://review.tizen.org/gerrit/#/c/platform/framework/web/chromium-efl/+/271942/ Change-Id: Iaf207739e1029a4c6f87637feb927ff6293a19b9 Signed-off-by: qiang.ji --- tizen_src/ewk/efl_integration/public/ewk_view.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tizen_src/ewk/efl_integration/public/ewk_view.cc b/tizen_src/ewk/efl_integration/public/ewk_view.cc index dc263e2..82cb5e5 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_view.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_view.cc @@ -508,6 +508,11 @@ Eina_Bool ewk_view_scroll_size_get(const Evas_Object* view, int* width, int* hei return EINA_TRUE; } +void ewk_view_clear_tiles_on_hide_enabled_set(Evas_Object* ewkView, Eina_Bool enable) +{ + LOG_EWK_API_MOCKUP(); +} + void ewk_view_password_confirm_popup_callback_set(Evas_Object* view, Ewk_View_Password_Confirm_Popup_Callback callback, void* user_data) { LOG_EWK_API_MOCKUP(); @@ -1425,6 +1430,12 @@ void ewk_view_clear_all_tiles_resources(Evas_Object* ewkView) { LOG_EWK_API_MOCKUP(); } +Eina_Bool ewk_view_edge_scroll_by(Evas_Object *ewkView, int dx, int dy) +{ + LOG_EWK_API_MOCKUP(); + return EINA_FALSE; +} + Eina_Bool ewk_view_set_support_video_hole(Evas_Object* ewkView, void* window, Eina_Bool enable, @@ -1472,6 +1483,11 @@ Eina_Bool ewk_view_set_support_canvas_hole(Evas_Object* ewkView, const char* url return EINA_FALSE; } +void ewk_view_tile_cover_area_multiplier_set(Evas_Object* ewkView, + float cover_area_multiplier) { + LOG_EWK_API_MOCKUP(); +} + Eina_Bool ewk_view_marlin_enable_set(Evas_Object* ewkView, Eina_Bool is_enable) { LOG_EWK_API_MOCKUP(); -- 2.7.4 From 12b7371db56ef1170bc406cd01747391f10b2264 Mon Sep 17 00:00:00 2001 From: Bakka Uday Kiran Date: Mon, 20 Feb 2023 16:42:11 +0530 Subject: [PATCH 10/16] [M108 Migration][ContextPopup] Bring up Context Popup 2/2 This patch migrates changes related to context popup bringup and Also handles, 1. Displaying context menu(text_selection) when touchevent is consumed. 2. Simplify logic of text selection. 3. Correcting context menu Show/Hide behaviour by maintaining state machine. 4. Fix for scrolling not smooth when context menu is shown. 5. Remove focusing codes in ContextMenuControllerEfl. 6. Check the status of context menu just before display. 7. Adjust the position of context menu for text selection Reference: https://review.tizen.org/gerrit/c/282372 Change-Id: I6d66c9c0ea4f96c602378515434af23a62ca37f6 Signed-off-by: Bakka Uday Kiran --- .../renderer_host/render_widget_host_view_aura.cc | 8 + .../context_menu_data/context_menu_mojom_traits.cc | 1 + .../context_menu_params_builder.cc | 1 + .../untrustworthy_context_menu_params.cc | 1 + .../common/context_menu_data/context_menu_data.h | 6 + .../context_menu_data/context_menu_mojom_traits.h | 5 + .../untrustworthy_context_menu_params.h | 3 + .../public/mojom/context_menu/context_menu.mojom | 4 + .../renderer/core/page/context_menu_controller.cc | 3 + .../rwhv_aura_offscreen_helper_efl.cc | 14 + .../renderer_host/rwhv_aura_offscreen_helper_efl.h | 8 + .../browser/selection/selection_controller_efl.cc | 164 +++++---- .../browser/selection/selection_controller_efl.h | 20 +- .../efl_integration/context_menu_controller_efl.cc | 367 ++++++++++++++------- .../efl_integration/context_menu_controller_efl.h | 19 +- .../download_manager_delegate_efl.cc | 6 + .../download_manager_delegate_efl.h | 2 + tizen_src/ewk/efl_integration/eweb_view.cc | 36 +- tizen_src/ewk/efl_integration/eweb_view.h | 4 + 19 files changed, 485 insertions(+), 187 deletions(-) diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index 21d097e..398f442 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc @@ -1187,6 +1187,14 @@ void RenderWidgetHostViewAura::ProcessAckedTouchEvent( break; } +#if BUILDFLAG(IS_EFL) + if (touch.event.GetType() == blink::WebInputEvent::Type::kTouchStart) + offscreen_helper_->SetTouchStartConsumed(result == ui::ER_HANDLED); + + if (touch.event.GetType() == blink::WebInputEvent::Type::kTouchEnd) + offscreen_helper_->SetTouchEndConsumed(result == ui::ER_HANDLED); +#endif + // Only send acks for one changed touch point. bool sent_ack = false; for (size_t i = 0; i < touch.event.touches_length; ++i) { diff --git a/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc b/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc index 4a34262..116fc00 100644 --- a/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc +++ b/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc @@ -61,6 +61,7 @@ bool StructTraitsis_editable = data.is_editable(); #if BUILDFLAG(IS_EFL) out->is_text_node = data.is_text_node(); + out->is_user_select_none = data.is_user_select_none(); #endif #if BUILDFLAG(IS_TIZEN) diff --git a/third_party/blink/common/context_menu_data/context_menu_params_builder.cc b/third_party/blink/common/context_menu_data/context_menu_params_builder.cc index b9532c7..9332437 100644 --- a/third_party/blink/common/context_menu_data/context_menu_params_builder.cc +++ b/third_party/blink/common/context_menu_data/context_menu_params_builder.cc @@ -57,6 +57,7 @@ UntrustworthyContextMenuParams ContextMenuParamsBuilder::Build( params.is_editable = data.is_editable; #if BUILDFLAG(IS_EFL) params.is_text_node = data.is_text_node; + params.is_user_select_none = !data.is_selectable; #endif #if BUILDFLAG(IS_TIZEN) diff --git a/third_party/blink/common/context_menu_data/untrustworthy_context_menu_params.cc b/third_party/blink/common/context_menu_data/untrustworthy_context_menu_params.cc index 5e99669..5167a97 100644 --- a/third_party/blink/common/context_menu_data/untrustworthy_context_menu_params.cc +++ b/third_party/blink/common/context_menu_data/untrustworthy_context_menu_params.cc @@ -64,6 +64,7 @@ void UntrustworthyContextMenuParams::Assign( is_editable = other.is_editable; #if BUILDFLAG(IS_EFL) is_text_node = other.is_text_node; + is_user_select_none = other.is_user_select_none; #endif #if BUILDFLAG(IS_TIZEN) diff --git a/third_party/blink/public/common/context_menu_data/context_menu_data.h b/third_party/blink/public/common/context_menu_data/context_menu_data.h index 0168924..81c2a97 100644 --- a/third_party/blink/public/common/context_menu_data/context_menu_data.h +++ b/third_party/blink/public/common/context_menu_data/context_menu_data.h @@ -119,6 +119,12 @@ struct ContextMenuData { #if BUILDFLAG(IS_EFL) bool is_text_node; + + // Whether element has -webkit-user-select: none attribute. + bool is_user_select_none; + + // Whether the node is selectable. + bool is_selectable = false; #endif #if BUILDFLAG(IS_TIZEN) diff --git a/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h b/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h index 3fc5f80..57cb588 100644 --- a/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h +++ b/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h @@ -119,6 +119,11 @@ struct BLINK_COMMON_EXPORT static bool is_text_node(const blink::UntrustworthyContextMenuParams& r) { return r.is_text_node; } + + static bool is_user_select_none( + const blink::UntrustworthyContextMenuParams& r) { + return r.is_user_select_none; + } #endif #if BUILDFLAG(IS_TIZEN) diff --git a/third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h b/third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h index d1676b0..2d1bd14 100644 --- a/third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h +++ b/third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h @@ -106,6 +106,9 @@ struct BLINK_COMMON_EXPORT UntrustworthyContextMenuParams { #if BUILDFLAG(IS_EFL) // Whether node context menu was invoked on is a text node. bool is_text_node; + + // Whether element has -webkit-user-select: none attribute. + bool is_user_select_none; #endif #if BUILDFLAG(IS_TIZEN) diff --git a/third_party/blink/public/mojom/context_menu/context_menu.mojom b/third_party/blink/public/mojom/context_menu/context_menu.mojom index 60259f1..7200b7d 100644 --- a/third_party/blink/public/mojom/context_menu/context_menu.mojom +++ b/third_party/blink/public/mojom/context_menu/context_menu.mojom @@ -175,6 +175,10 @@ struct UntrustworthyContextMenuParams { [EnableIf=is_tizen] bool is_draggable; + // Whether element has -webkit-user-select: none attribute. + [EnableIf=is_efl] + bool is_user_select_none; + // Writing direction menu items. int32 writing_direction_default; int32 writing_direction_left_to_right; diff --git a/third_party/blink/renderer/core/page/context_menu_controller.cc b/third_party/blink/renderer/core/page/context_menu_controller.cc index 854831a..8dfb5e5 100644 --- a/third_party/blink/renderer/core/page/context_menu_controller.cc +++ b/third_party/blink/renderer/core/page/context_menu_controller.cc @@ -690,6 +690,9 @@ bool ContextMenuController::ShowContextMenu(LocalFrame* frame, } #if BUILDFLAG(IS_EFL) + data.is_selectable = result.InnerNode()->GetLayoutObject() && + result.InnerNode()->GetLayoutObject()->IsSelectable(); + data.is_text_node = result.InnerNode()->IsTextNode(); #endif diff --git a/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc b/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc index ee3e3f8..8b1e6ef 100644 --- a/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc +++ b/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc @@ -1321,6 +1321,13 @@ void RWHVAuraOffscreenHelperEfl::SendGestureEvent( return; } + // TODO: In this case, double tap should be filtered in + // TouchDispositionGestureFilter. (See http://goo.gl/5G8PWJ) + if (event_type == blink::WebInputEvent::Type::kGestureDoubleTap && + touchend_consumed_) { + return; + } + if (event_type != blink::WebInputEvent::Type::kUndefined) { rwhv_aura_->host()->ForwardGestureEventWithLatencyInfo( event, CreateLatencyInfo(event)); @@ -1487,4 +1494,11 @@ void RWHVAuraOffscreenHelperEfl::UpdateEdgeEffect() { EnsureEdgeEffect().UpdateRect(); } +void RWHVAuraOffscreenHelperEfl::SetTouchStartConsumed( + bool touchstart_consumed) { + touchstart_consumed_ = touchstart_consumed; +} +void RWHVAuraOffscreenHelperEfl::SetTouchEndConsumed(bool touchend_consumed) { + touchend_consumed_ = touchend_consumed; +} } // namespace content diff --git a/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h b/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h index 42ad061..a1ce4e0 100644 --- a/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h +++ b/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h @@ -74,6 +74,11 @@ class CONTENT_EXPORT RWHVAuraOffscreenHelperEfl { gfx::Size GetPhysicalBackingSize() const; void OnGetFocusedNodeBounds(const gfx::RectF& rect); + void SetTouchStartConsumed(bool touchstart_consumed); + void SetTouchEndConsumed(bool touchend_consumed); + bool IsTouchstartConsumed() const { return touchstart_consumed_; } + bool IsTouchendConsumed() const { return touchend_consumed_; } + void SetTouchEventsEnabled(bool enabled); bool TouchEventsEnabled(); @@ -254,6 +259,9 @@ class CONTENT_EXPORT RWHVAuraOffscreenHelperEfl { bool magnifier_ = false; + bool touchstart_consumed_ = false; + bool touchend_consumed_ = false; + OnFocusCallback on_focus_in_callback_; OnFocusCallback on_focus_out_callback_; diff --git a/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.cc b/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.cc index d6e172f..efca84b 100644 --- a/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.cc +++ b/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.cc @@ -12,8 +12,10 @@ #include "content/browser/renderer_host/render_widget_host_view_aura.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/browser/web_contents/web_contents_impl_efl.h" +#include "content/browser/web_contents/web_contents_view_aura.h" #include "content/public/browser/context_menu_params.h" #include "content/public/browser/web_contents.h" +#include "tizen/system_info.h" #include "ui/base/clipboard/clipboard_helper_efl.h" #include "ui/display/device_display_info_efl.h" #include "ui/display/screen.h" @@ -74,8 +76,7 @@ SelectionControllerEfl::SelectionControllerEfl(RenderWidgetHostViewAura* rwhva) new SelectionHandleEfl(*this, SelectionHandleEfl::HANDLE_TYPE_RIGHT)), input_handle_( new SelectionHandleEfl(*this, SelectionHandleEfl::HANDLE_TYPE_INPUT)), - magnifier_(new SelectionMagnifierEfl(this)), - selection_mode_(None) { + magnifier_(new SelectionMagnifierEfl(this)) { evas_object_event_callback_add(rwhva_->offscreen_helper()->content_image(), EVAS_CALLBACK_MOVE, &EvasParentViewMoveCallback, this); @@ -131,9 +132,9 @@ bool SelectionControllerEfl::GetSelectionEditable() const { } bool SelectionControllerEfl::GetCaretSelectionStatus() const { - TRACE_EVENT1("selection,efl", __PRETTY_FUNCTION__, - "caret selection", selection_mode_ == Caret); - return selection_mode_ == Caret; + TRACE_EVENT1("selection,efl", __PRETTY_FUNCTION__, "caret selection", + selection_mode_ == SelectionMode::CARET); + return selection_mode_ == SelectionMode::CARET; } void SelectionControllerEfl::SetControlsTemporarilyHidden( @@ -277,11 +278,11 @@ void SelectionControllerEfl::DetermineSelectionMode( const gfx::Rect& right_rect) { if (left_rect == gfx::Rect() && right_rect == gfx::Rect()) - SetSelectionMode(None); + SetSelectionMode(SelectionMode::NONE); else if (left_rect == right_rect && GetSelectionEditable()) - SetSelectionMode(Caret); + SetSelectionMode(SelectionMode::CARET); else - SetSelectionMode(Range); + SetSelectionMode(SelectionMode::RANGE); } bool SelectionControllerEfl::UpdateSelectionDataAndShow( @@ -315,11 +316,17 @@ bool SelectionControllerEfl::UpdateSelectionDataAndShow( return true; } +bool SelectionControllerEfl::IsCaretMode() const { + return selection_data_->IsInEditField() && GetLeftRect() == GetRightRect(); +} + void SelectionControllerEfl::ShowHandleAndContextMenuIfRequired( Reason explicit_reason) { TRACE_EVENT0("selection,efl", __PRETTY_FUNCTION__); + Reason saved_reason = selection_change_reason_; Reason effective_reason = selection_change_reason_; + if (explicit_reason != Reason::Irrelevant) effective_reason = explicit_reason; @@ -340,8 +347,25 @@ void SelectionControllerEfl::ShowHandleAndContextMenuIfRequired( return; } - bool is_selection_range_visible = - start_selection_.visible() || end_selection_.visible(); + bool is_start_selection_visible = start_selection_.visible(); + bool is_end_selection_visible = end_selection_.visible(); + + // When the view is only partially visible we need to check if + // the visible part contains selection rects. + auto visible_viewport_rect = GetVisibleViewportRect(); + if (!visible_viewport_rect.IsEmpty() || + rwhva_->offscreen_helper()->GetTopControlsHeight() > 0) { + auto view_offset = + rwhva_->offscreen_helper()->GetViewBoundsInPix().OffsetFromOrigin(); + is_start_selection_visible = + is_start_selection_visible && + !IsRectEmpty(IntersectRects(visible_viewport_rect, left + view_offset, + true /*ignore_width*/)); + is_end_selection_visible = + is_end_selection_visible && + !IsRectEmpty(IntersectRects(visible_viewport_rect, right + view_offset, + true /*ignore_width*/)); + } // Is in edit field and no text is selected. show only single handle if (selection_data_->IsInEditField() && left == right) { @@ -350,21 +374,21 @@ void SelectionControllerEfl::ShowHandleAndContextMenuIfRequired( CHECK(start_selection_ == end_selection_); - if (GetCaretSelectionStatus() && is_selection_range_visible) { - gfx::Rect left = selection_data_->GetLeftRect(); + if (GetCaretSelectionStatus() && is_start_selection_visible) { input_handle_->SetBasePosition(gfx::Point(left.x(), left.y())); input_handle_->Move(left.bottom_right()); input_handle_->Show(); } bool show_context_menu = - IsAnyHandleVisible() && + input_handle_->IsVisible() && effective_reason != Reason::ScrollOrZoomGestureEnded && effective_reason != Reason::Tap && effective_reason != Reason::Irrelevant; - if (!handle_being_dragged_ && show_context_menu) + if (!handle_being_dragged_ && show_context_menu) { + selection_change_reason_ = saved_reason; ShowContextMenu(); - + } return; } input_handle_->Hide(); @@ -384,54 +408,62 @@ void SelectionControllerEfl::ShowHandleAndContextMenuIfRequired( start_handle_->SetBasePosition(left.bottom_left()); start_handle->Move(left.bottom_left()); - if (start_selection_.visible()) + if (is_start_selection_visible) start_handle->Show(); else start_handle->Hide(); end_handle_->SetBasePosition(right.bottom_right()); end_handle->Move(right.bottom_right()); - if (end_selection_.visible()) + if (is_end_selection_visible) end_handle->Show(); else end_handle->Hide(); // Do not show the context menu during selection extend and // offscreen selection. - if (!handle_being_dragged_ && effective_reason != Reason::Irrelevant && - IsAnyHandleVisible()) { + if (!handle_being_dragged_ && selection_mode_ != SelectionMode::NONE) { + selection_change_reason_ = saved_reason; ShowContextMenu(); } } void SelectionControllerEfl::ShowContextMenu() { -#if !defined(USE_AURA) - content::ContextMenuParams convertedParams = *(selection_data_->GetContextMenuParams()); - - RenderWidgetHostViewEfl* rwhv = - static_cast(web_contents_.GetRenderWidgetHostView()); - if (rwhv) { - int blinkX, blinkY; - rwhv->EvasToBlinkCords(convertedParams.x, convertedParams.y, &blinkX, &blinkY); - convertedParams.x = blinkX; - convertedParams.y = blinkY; - - // TODO(a1.gomes): In case of EWK apps, the call below end up calling - // EWebView::ShowContextMenu. We have to make sure parameters - // are correct. - WebContentsImpl* wci = static_cast(&web_contents_); - WebContentsViewEfl* wcve = static_cast(wci->GetView()); - wcve->ShowContextMenu(convertedParams); + if (!rwhva_) + return; + + if (IsMobileProfile()) { + if (context_menu_status_ == ContextMenuStatus::INPROGRESS) + return; + else + context_menu_status_ = ContextMenuStatus::INPROGRESS; } -#endif + content::ContextMenuParams convertedParams = + *(selection_data_->GetContextMenuParams()); + + int blinkX, blinkY; + rwhva_->offscreen_helper()->EvasToBlinkCords( + convertedParams.x, convertedParams.y, &blinkX, &blinkY); + convertedParams.x = blinkX; + convertedParams.y = blinkY; + + // TODO(a1.gomes): In case of EWK apps, the call below end up calling + // EWebView::ShowContextMenu. We have to make sure parameters + // are correct. + WebContentsImpl* wci = static_cast(web_contents()); + WebContentsViewAura* wcva = static_cast(wci->GetView()); + wcva->wcva_helper()->ShowContextMenu(convertedParams); } void SelectionControllerEfl::CancelContextMenu(int request_id) { -#if !defined(USE_AURA) - WebContentsImpl* wci = static_cast(&web_contents_); - WebContentsViewEfl* wcve = static_cast(wci->GetView()); - wcve->CancelContextMenu(request_id); -#endif + if (IsMobileProfile() && (context_menu_status_ == ContextMenuStatus::HIDDEN || + context_menu_status_ == ContextMenuStatus::NONE)) { + return; + } + + WebContentsImpl* wci = static_cast(web_contents()); + WebContentsViewAura* wcva = static_cast(wci->GetView()); + wcva->wcva_helper()->CancelContextMenu(request_id); } void SelectionControllerEfl::HideHandles() { @@ -593,11 +625,11 @@ void SelectionControllerEfl::HandleDragEndNotification() { ecore_event_filter_del(ecore_events_filter_); ecore_events_filter_ = nullptr; - selection_change_reason_ = Reason::Irrelevant; + selection_change_reason_ = Reason::HandleReleased; start_handle_->SetBasePosition(selection_data_->GetLeftRect().bottom_left()); end_handle_->SetBasePosition(selection_data_->GetRightRect().bottom_right()); handle_being_dragged_ = false; - ShowHandleAndContextMenuIfRequired(Reason::HandleReleased); + ShowHandleAndContextMenuIfRequired(); } void SelectionControllerEfl::GetSelectionBounds(gfx::Rect* left, @@ -649,14 +681,12 @@ void SelectionControllerEfl::HandlePostponedGesture(int x, int y, ui::EventType type) { DVLOG(0) << "HandlePostponedGesture :: " << type; -#if !defined(USE_AURA) - RenderWidgetHostViewEfl* rwhv = - static_cast(web_contents_.GetRenderWidgetHostView()); + RenderWidgetHostViewAura* rwhva = static_cast( + web_contents()->GetRenderWidgetHostView()); gfx::Point point = gfx::Point(x, y); - if (rwhv) - point = rwhv->ConvertPointInViewPix(point); -#endif + if (rwhva) + point = rwhva->offscreen_helper()->ConvertPointInViewPix(point); switch (type) { case ui::ET_GESTURE_LONG_PRESS: { ClearSelectionViaEWebView(); @@ -692,13 +722,12 @@ bool SelectionControllerEfl::HandleLongPressEvent( } SetSelectionStatus(true); SetSelectionEditable(true); - if (selection_mode_ == None) - SetSelectionMode(Caret); + if (selection_mode_ == SelectionMode::NONE) + SetSelectionMode(SelectionMode::CARET); HandleLongPressEventPrivate(touch_point); return true; } else if (params.link_url.is_empty() && params.src_url.is_empty() && - params.is_text_node || - !params.selection_text.empty()) { + (params.is_text_node || !params.selection_text.empty())) { // If user is long pressing on a content with // -webkit-user-select: none, we should bail and not enter // selection neither show magnigier class or context menu. @@ -791,7 +820,7 @@ void SelectionControllerEfl::ClearSelection() { CancelContextMenu(0); SetSelectionStatus(false); SetSelectionEditable(false); - SetSelectionMode(None); + SetSelectionMode(SelectionMode::NONE); selection_change_reason_ = Reason::Irrelevant; } @@ -820,9 +849,7 @@ gfx::Rect SelectionControllerEfl::GetForbiddenRegionRect( left_rect.Offset(visible_viewport_rect.x(), visible_viewport_rect.y()); right_rect.Offset(visible_viewport_rect.x(), visible_viewport_rect.y()); - bool is_caret_mode = - selection_data_->IsInEditField() && left_rect == right_rect; - if (is_caret_mode) { + if (IsCaretMode()) { forbidden_region.set_x(left_rect.x()); forbidden_region.set_y(input_handle_->IsTop() ? left_rect.y() - kLargeHandleHeight @@ -861,7 +888,7 @@ gfx::Rect SelectionControllerEfl::GetForbiddenRegionRect( forbidden_region.set_height(forbidden_region.height() + 2 * kMenuPadding); return IntersectRects(forbidden_region, visible_viewport_rect, - is_caret_mode /*ignore_width*/); + IsCaretMode() /*ignore_width*/); } gfx::Rect SelectionControllerEfl::GetVisibleViewportRect() const { @@ -915,4 +942,23 @@ bool SelectionControllerEfl::ExistsSelectedText() { return selection_data_->IsInEditField() && (selection_data_->GetLeftRect() != selection_data_->GetRightRect()); } + +void SelectionControllerEfl::SetVisiblityStatus(bool visiblity) { + if (!visiblity && !handle_being_dragged_ && !is_caret_mode_forced_) + selection_change_reason_ = Reason::Irrelevant; + else if (selection_change_reason_ == Reason::Irrelevant) + selection_change_reason_ = Reason::RequestedByContextMenu; +} + +void SelectionControllerEfl::ContextMenuStatusHidden() { + if (IsMobileProfile()) + context_menu_status_ = ContextMenuStatus::HIDDEN; + SetVisiblityStatus(false); +} + +void SelectionControllerEfl::ContextMenuStatusVisible() { + if (IsMobileProfile()) + context_menu_status_ = ContextMenuStatus::VISIBLE; + SetVisiblityStatus(true); +} } diff --git a/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.h b/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.h index 8247b16..b41234c 100644 --- a/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.h +++ b/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.h @@ -143,15 +143,22 @@ class CONTENT_EXPORT SelectionControllerEfl { bool ExistsSelectedText(); + bool IsCaretMode() const; + + void ContextMenuStatusHidden(); + void ContextMenuStatusVisible(); + private: - enum SelectionMode { - None = 0, - Caret, - Range - }; + enum class SelectionMode { NONE = 0, CARET, RANGE }; + + enum class ContextMenuStatus { NONE = 0, HIDDEN, INPROGRESS, VISIBLE }; + void DetermineSelectionMode(const gfx::Rect& left_rect, const gfx::Rect& right_rect); void SetSelectionMode(enum SelectionMode); + // Sets selection_change_reason_ based on visibility + void SetVisiblityStatus(bool visiblity); + // To update the selection bounds // returns false if rects are invalid, otherwise true bool UpdateSelectionDataAndShow(const gfx::Rect& left_rect, @@ -231,7 +238,8 @@ class CONTENT_EXPORT SelectionControllerEfl { SelectionHandleEfl* dragged_handle_ = nullptr; - enum SelectionMode selection_mode_; + enum ContextMenuStatus context_menu_status_ = ContextMenuStatus::NONE; + enum SelectionMode selection_mode_ = SelectionMode::NONE; gfx::SelectionBound start_selection_; gfx::SelectionBound end_selection_; }; diff --git a/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc b/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc index 21aea88..b85d8ac 100644 --- a/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc +++ b/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc @@ -9,6 +9,7 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/path_service.h" +#include "base/strings/escape.h" #include "base/strings/utf_string_conversions.h" #include "browser_context_efl.h" #include "common/web_contents_utils.h" @@ -30,6 +31,8 @@ #include "tizen/system_info.h" #include "ui/base/clipboard/clipboard.h" #include "ui/base/clipboard/clipboard_helper_efl.h" +#include "ui/display/screen.h" +#include "ui/gfx/geometry/dip_util.h" #include "ui/gfx/geometry/rect.h" #if BUILDFLAG(IS_TIZEN) @@ -48,11 +51,15 @@ namespace { // The height of the selection menu. static const int kMenuHeight = 64; +// Popup will be restored after kRestoreTime if it is dismissed unexpectedly. +static const float kRestoreTime = 0.5f; + const int kMinHeightVertical = 840; const int kMinHeightHorizontal = 420; const std::string kWebSearchLink("https://www.google.com/search?q="); const char* const kEditCommandUnselect = "Unselect"; +const char* const kDefaultImageExtension = "jpg"; } namespace content { @@ -62,12 +69,7 @@ std::vector ContextMenuControllerEfl::_context_menu_listdata ContextMenuControllerEfl::ContextMenuControllerEfl(EWebView* wv, WebContents& web_contents) - : webview_(wv), - popup_(nullptr), - menu_items_(nullptr), - web_contents_(web_contents), - is_text_selection_(false), - weak_ptr_factory_(this) { + : webview_(wv), web_contents_(web_contents), weak_ptr_factory_(this) { native_view_ = static_cast(&web_contents_)->GetEflNativeView(); } @@ -183,6 +185,7 @@ void ContextMenuControllerEfl::GetProposedContextMenu() { blink::mojom::ContextMenuDataInputFieldType::kPassword) { AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION, EWK_CONTEXT_MENU_ITEM_TAG_COPY, std::string(dgettext("WebKit", "IDS_WEBVIEW_OPT_COPY"))); + if (!params_.is_editable) { AddItemToProposedList( EWK_CONTEXT_MENU_ITEM_TYPE_ACTION, @@ -215,7 +218,7 @@ void ContextMenuControllerEfl::GetProposedContextMenu() { std::string(dgettext("WebKit", "IDS_WEBVIEW_OPT_COPY_IMAGE")), params_.src_url.spec(), params_.src_url.spec()); - } else if (!params_.link_url.is_empty()) { + } else if (!params_.link_url.is_empty() && !params_.is_user_select_none) { AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION, EWK_CONTEXT_MENU_ITEM_TAG_TEXT_SELECTION_MODE, std::string(dgettext("WebKit", "IDS_WEBVIEW_OPT_SELECTION_MODE_ABB")), @@ -284,22 +287,24 @@ bool ContextMenuControllerEfl::CreateContextMenu( #endif elm_object_tree_focus_allow_set(popup_, false); } else { - evas_object_data_set(native_view_, "ContextMenuContollerEfl", this); - popup_ = elm_popup_add(native_view_); - elm_popup_align_set(popup_, 0.5, 0.5); + top_widget_ = elm_object_top_widget_get( + elm_object_parent_widget_get(webview_->evas_object())); + evas_object_data_set(top_widget_, "ContextMenuContollerEfl", this); + popup_ = elm_popup_add(top_widget_); + + if (IsMobileProfile()) + elm_popup_align_set(popup_, ELM_NOTIFY_ALIGN_FILL, 1.0); + else + elm_popup_align_set(popup_, 0.5, 0.5); } if (!popup_) return false; - auto smart_parent = evas_object_smart_parent_get(native_view_); - if (!smart_parent) { - LOG(ERROR) << "Unable to get smart parent from native view"; - evas_object_del(popup_); - popup_ = nullptr; - return false; - } - evas_object_smart_member_add(popup_, smart_parent); - elm_object_part_content_set(smart_parent, "context_menu_popup", popup_); + + if (!IsMobileProfile()) + evas_object_smart_member_add(popup_, webview_->evas_object()); + + elm_object_tree_focus_allow_set(popup_, EINA_FALSE); evas_object_data_set(popup_, "ContextMenuContollerEfl", this); @@ -338,40 +343,29 @@ bool ContextMenuControllerEfl::CreateContextMenu( } else { std::string selected_link(params_.link_url.spec()); if (!selected_link.empty()) { - if (base::StartsWith(selected_link, - std::string("mailto:"), - base::CompareCase::INSENSITIVE_ASCII) - || base::StartsWith(selected_link, - std::string("tel:"), - base::CompareCase::INSENSITIVE_ASCII)) { - std::vector link_split; + if (base::StartsWith(selected_link, std::string("mailto:"), + base::CompareCase::INSENSITIVE_ASCII) || + base::StartsWith(selected_link, std::string("tel:"), + base::CompareCase::INSENSITIVE_ASCII)) { size_t current_pos = 0; size_t next_delimiter = 0; - while ((next_delimiter = selected_link.find(":", current_pos)) - != std::string::npos) { - std::string part = selected_link.substr(current_pos, - next_delimiter - current_pos); - link_split.push_back(part); + // Remove the First part and Extract actual URL or title + // (mailto:abc@d.com?id=345 ==> abc@d.com?id=345) + if ((next_delimiter = selected_link.find(":", current_pos)) != + std::string::npos) { current_pos = next_delimiter + 1; } + std::string last_part = selected_link.substr(current_pos); - if (!last_part.empty()) - link_split.push_back(last_part); - - if (!link_split[1].size()) { - std::vector real_link_split; - size_t current_pos = 0; - size_t next_delimiter = 0; - while ((next_delimiter = link_split[1].find("?", current_pos)) != std::string::npos) { - std::string part = link_split[1].substr(current_pos, next_delimiter - current_pos); - real_link_split.push_back(part); - current_pos = next_delimiter + 1; - } - std::string last_part = link_split[1].substr(current_pos); - if (!last_part.empty()) - real_link_split.push_back(last_part); - - elm_object_part_text_set(popup_, "title,text", real_link_split[0].c_str()); + std::string core_part = selected_link.substr(current_pos); + current_pos = 0; + next_delimiter = 0; + // Trim the core by removing ? at the end (abc@d.com?id=345 ==> + // abc@d.com) + if ((next_delimiter = core_part.find("?", current_pos)) != + std::string::npos) { + last_part = + core_part.substr(current_pos, next_delimiter - current_pos); } } else { elm_object_part_text_set(popup_, "title,text", selected_link.c_str()); @@ -433,14 +427,53 @@ void ContextMenuControllerEfl::ContextMenuHWBackKey(void* data, Evas_Object* obj } } +// static +Eina_Bool ContextMenuControllerEfl::RestoreTimerCallback(void* data) { + auto* menu_controller = static_cast(data); + if (!menu_controller) + return ECORE_CALLBACK_CANCEL; + + auto selection_controller = + menu_controller->webview_->GetSelectionController(); + + if (menu_controller->popup_ && selection_controller && + selection_controller->GetSelectionStatus()) + evas_object_show(menu_controller->popup_); + + menu_controller->restore_timer_ = nullptr; + + return ECORE_CALLBACK_CANCEL; +} + void ContextMenuControllerEfl::ContextMenuCancelCallback(void* data, Evas_Object* obj, void* event_info) { - ContextMenuControllerEfl* menu_controller = static_cast(evas_object_data_get(obj, "ContextEfl")); - if (menu_controller) { - menu_controller->HideContextMenu(); - menu_controller->HideSelectionHandle(); - evas_object_data_del(obj, "ContextEfl"); + ContextMenuControllerEfl* menu_controller = + static_cast( + evas_object_data_get(obj, "ContextMenuContollerEfl")); + if (!menu_controller) + return; + + RenderWidgetHostViewAura* rwhva = static_cast( + menu_controller->web_contents_.GetRenderWidgetHostView()); + if (!rwhva) + return; + + // context_menu is dismissed when we touch outside of popup. + // It is policy of elm_ctxpopup by EFL team. + // But according to wcs TC(21~23) context_menu should be displayed, + // when touchevent is consumed. So we should show context_menu again when + // touchevent is consumed. + if (rwhva->offscreen_helper()->IsTouchstartConsumed() || + rwhva->offscreen_helper()->IsTouchendConsumed()) { + evas_object_show(menu_controller->popup_); + return; } + + // TODO: If |elm_ctxpopup_auto_hide_disabled_set| is works properly, + // We should remove this timer. + // Bug: http://suprem.sec.samsung.net/jira/browse/TNEXT-67 + menu_controller->restore_timer_ = + ecore_timer_add(kRestoreTime, RestoreTimerCallback, menu_controller); } void ContextMenuControllerEfl::ContextMenuItemSelectedCallback(void* data, @@ -465,16 +498,11 @@ void ContextMenuControllerEfl::RequestSelectionRect() const { } gfx::Point ContextMenuControllerEfl::CalculateSelectionMenuPosition( - gfx::Rect selection_rect) { - auto rwhva = static_cast( - web_contents_.GetRenderWidgetHostView()); - auto selection_controller = webview_->GetSelectionController(); - CHECK(rwhva); - CHECK(selection_controller); - auto webview_bounds = rwhva->offscreen_helper()->GetViewBoundsInPix(); + const gfx::Rect& selection_rect) { + auto* selection_controller = webview_->GetSelectionController(); + if (!selection_controller) + return gfx::Point(); - // Consider a webview offset. - selection_rect.Offset(webview_bounds.x(), webview_bounds.y()); auto visible_viewport_rect = selection_controller->GetVisibleViewportRect(); auto forbidden_rect = selection_controller->GetForbiddenRegionRect(selection_rect); @@ -482,36 +510,62 @@ gfx::Point ContextMenuControllerEfl::CalculateSelectionMenuPosition( // Selection menu should always be placed at the centre of visible selection // area horizontally. position.set_x(forbidden_rect.CenterPoint().x()); - // If possible, selection menu should always be placed above forbidden - // region. + if (forbidden_rect.y() > visible_viewport_rect.y() + kMenuHeight) { + // If possible, selection menu should always be placed above forbidden + // region. position.set_y(forbidden_rect.y()); - return position; - } - // If there is no sufficient space above, we're trying to place selection menu - // below forbidden region. - if (forbidden_rect.bottom() + kMenuHeight < visible_viewport_rect.bottom()) { + } else if (forbidden_rect.bottom() + kMenuHeight < + visible_viewport_rect.bottom()) { + // If there is no sufficient space above, we're trying to place selection + // menu below forbidden region. position.set_y(forbidden_rect.bottom() + kMenuHeight); - return position; + } else { + // If there is no sufficient space above and below, selection menu will be + // shown at the centre of visible selection area vertically. + position.set_y(forbidden_rect.CenterPoint().y()); } - // If there is no sufficient space above and below, selection menu will be - // shown at the centre of visible selection area vertically. - position.set_y(forbidden_rect.CenterPoint().y()); + return position; } void ContextMenuControllerEfl::OnSelectionRectReceived( - const gfx::Rect& selection_rect) { - gfx::Point selection_menu_position = - CalculateSelectionMenuPosition(selection_rect); - if (!webview_->GetSelectionController()->GetVisibleViewportRect().Contains( - selection_menu_position)) { + gfx::Rect selection_rect) { + auto rwhva = static_cast( + web_contents_.GetRenderWidgetHostView()); + auto controller = webview_->GetSelectionController(); + + if (IsMobileProfile() && (context_menu_status_ != INPROGRESS)) + return; + if (!popup_ || !rwhva || !controller) + return; + + float device_scale = + display::Screen::GetScreen()->GetPrimaryDisplay().device_scale_factor(); + gfx::Rect selection_rect_dip = gfx::ToEnclosingRect( + ConvertRectToPixels(gfx::Rect(selection_rect), device_scale)); + + // Consider a webview offset. + selection_rect_dip.Offset( + rwhva->offscreen_helper()->GetViewBoundsInPix().OffsetFromOrigin()); + + auto visible_viewport_rect = controller->GetVisibleViewportRect(); + + // In case of the caret mode selection_rect is empty + if (!webview_->GetSelectionController()->IsCaretMode() && + gfx::IntersectRects(visible_viewport_rect, selection_rect_dip) + .IsEmpty()) { return; } + gfx::Point selection_menu_position = + CalculateSelectionMenuPosition(selection_rect_dip); + if (!visible_viewport_rect.Contains(selection_menu_position)) + return; + evas_object_smart_callback_add(popup_, "dismissed", ContextMenuCancelCallback, this); - web_contents_.Focus(); + if (IsMobileProfile()) elm_ctxpopup_auto_hide_disabled_set(popup_, EINA_TRUE); @@ -521,14 +575,22 @@ void ContextMenuControllerEfl::OnSelectionRectReceived( #endif evas_object_move(popup_, selection_menu_position.x(), selection_menu_position.y()); + + controller->ContextMenuStatusVisible(); + evas_object_show(popup_); evas_object_raise(popup_); + if (IsMobileProfile()) + context_menu_status_ = VISIBLE; } bool ContextMenuControllerEfl::ShowContextMenu() { if (!popup_) return false; + if (IsMobileProfile()) + context_menu_status_ = INPROGRESS; + if (is_text_selection_) { // Selection menu will be shown in OnSelectionRectReceived after receiving // selection rectangle form the renderer. @@ -536,17 +598,18 @@ bool ContextMenuControllerEfl::ShowContextMenu() { } else { evas_object_smart_callback_add(popup_, "block,clicked", BlockClickedCallback, this); - } #if BUILDFLAG(IS_TIZEN) eext_object_event_callback_add(popup_, EEXT_CALLBACK_BACK, ContextMenuHWBackKey, this); - // Workaround. After context menu shows up, there is "unfocused" event fired. - // evas_object_smart_callback_add(popup_, "unfocused", ContextMenuHWBackKey, this); - evas_object_focus_set(popup_, EINA_TRUE); + eext_object_event_callback_add(popup_, EEXT_CALLBACK_MORE, + ContextMenuHWBackKey, this); #endif evas_object_show(popup_); evas_object_raise(popup_); - return true; + if (IsMobileProfile()) + context_menu_status_ = VISIBLE; + } + return true; } void ContextMenuControllerEfl::HideSelectionHandle() { @@ -576,6 +639,8 @@ void ContextMenuControllerEfl::RequestShowSelectionHandleAndContextMenu( void ContextMenuControllerEfl::OnClipboardDownload( download::DownloadItem* item, download::DownloadInterruptReason interrupt_reason) { + item->SetUserData(DownloadManagerDelegateEfl::kDownloadTemporaryFile, + base::WrapUnique(new base::SupportsUserData::Data())); item->AddObserver(this); clipboard_download_items_.insert(item); } @@ -601,14 +666,11 @@ void ContextMenuControllerEfl::OnDiskDownload( void ContextMenuControllerEfl::OnDownloadUpdated( download::DownloadItem* download) { if(download && download->AllDataSaved()) { - if (clipboard_download_items_.find(download) != clipboard_download_items_.end()) { -#if !defined(WAYLAND_BRINGUP) + if (clipboard_download_items_.find(download) != + clipboard_download_items_.end()) { const std::string& download_path = download->GetForcedFilePath().value(); ClipboardHelperEfl::GetInstance()->SetData(download_path, ClipboardDataTypeEfl::IMAGE); -#else - NOTIMPLEMENTED(); -#endif download->RemoveObserver(this); clipboard_download_items_.erase(download); } @@ -627,6 +689,7 @@ void ContextMenuControllerEfl::OnDownloadUpdated( base::FilePath ContextMenuControllerEfl::DownloadFile( const GURL url, const base::FilePath outputDir, + const base::FilePath suggested_filename, download::DownloadUrlParameters::OnStartedCallback callback) { LOG(INFO) << "Downloading file: " << url << "to: "<< outputDir.value(); const GURL referrer = web_contents_.GetVisibleURL(); @@ -645,7 +708,11 @@ base::FilePath ContextMenuControllerEfl::DownloadFile( dl_params->set_referrer(referrer); #endif dl_params->set_referrer_encoding("utf8"); - base::FilePath fileName = net::GenerateFileName(url,"","","","",""); + base::FilePath fileName; + if (suggested_filename.empty()) + fileName = net::GenerateFileName(url, "", "", "", "", ""); + else + fileName = suggested_filename; base::FilePath fullPath = outputDir.Append(fileName); while (base::PathExists(fullPath)) { @@ -706,6 +773,24 @@ static void destroy_app_handle(app_control_h* handle) { std::ignore = app_control_destroy(*handle); } +void ContextMenuControllerEfl::LaunchBrowserWithWebSearch( + const std::string& text) { + app_control_h app_control; + app_control_create(&app_control); + + app_control_set_operation(app_control, APP_CONTROL_OPERATION_SEARCH); + if (IsMobileProfile()) { + app_control_add_extra_data( + app_control, "http://tizen.org/appcontrol/data/keyword", text.c_str()); + } else { + app_control_add_extra_data(app_control, APP_CONTROL_DATA_TEXT, + text.c_str()); + } + app_control_send_launch_request(app_control, NULL, NULL); + + app_control_destroy(app_control); +} + void ContextMenuControllerEfl::LaunchShareApp(const std::string& text) { app_control_h handle = nullptr; int error_code = app_control_create(&handle); @@ -803,8 +888,7 @@ void ContextMenuControllerEfl::MenuItemSelected(ContextMenuItemEfl* menu_item) if (!webview_) return; - if (popup_) - evas_object_hide(popup_); + HideContextMenu(); // FIXME: Add cases as and when required switch(menu_item->GetContextMenuOption()) { @@ -863,20 +947,43 @@ void ContextMenuControllerEfl::MenuItemSelected(ContextMenuItemEfl* menu_item) break; } case EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_TO_CLIPBOARD: { - LOG(INFO) << "[CLIPBOARD] copying image to clipboard!"; - std::string plain_text = params_.src_url.spec(); - ClipboardHelperEfl::GetInstance()->SetData( - plain_text, ClipboardDataTypeEfl::PLAIN_TEXT); + // FIXME(g.ludwikowsk): Find the correct path for temporarily saving + // images to clipboard. + base::FilePath copy_image_dir("/tmp/"); + base::FilePath suggested_filename; + if (params_.src_url.has_query()) { + suggested_filename = base::FilePath(base::UnescapeURLComponent( + params_.src_url.query(), + base::UnescapeRule::SPACES | base::UnescapeRule::PATH_SEPARATORS | + base::UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS)); + } else { + suggested_filename = net::GenerateFileName(GURL(params_.src_url.spec()), + "", "", "", "", ""); + } - // FIXME(g.ludwikowsk): Setting markup data doesn't work like this, - // selection_text doesn't contain html. Do we actually need to do this? - ClipboardHelperEfl::GetInstance()->SetData( - base::UTF16ToASCII(params_.selection_text), - ClipboardDataTypeEfl::MARKUP); - DownloadFile( - GURL(params_.src_url.spec()), base::FilePath("/tmp/"), - base::BindRepeating(&ContextMenuControllerEfl::OnClipboardDownload, - weak_ptr_factory_.GetWeakPtr())); + if (suggested_filename.Extension().empty()) { + suggested_filename = + suggested_filename.AddExtension(kDefaultImageExtension); + } + + base::FilePath fullPath = copy_image_dir.Append(suggested_filename); + // For files with the same name clipboard app refuses to add another one, + // saying that it is already copied to clipboard. When DownloadFile + // tries to download a file which already exists, it appends a number + // to the file name. This causes clipboard app to recognize it as a + // different file and clipboard is filled with duplicate images. + // To prevent this, we do not download file if a file with the same name + // already exists. We still call SetData, so clipboard app would show + // toast popup for duplicates. This is for Tizen 2.4 compatibility. + if (PathExists(fullPath)) { + ClipboardHelperEfl::GetInstance()->SetData(fullPath.value(), + ClipboardDataTypeEfl::IMAGE); + } else { + DownloadFile( + GURL(params_.src_url.spec()), copy_image_dir, suggested_filename, + base::BindRepeating(&ContextMenuControllerEfl::OnClipboardDownload, + weak_ptr_factory_.GetWeakPtr())); + } break; } case EWK_CONTEXT_MENU_ITEM_TAG_COPY_LINK_DATA: { @@ -896,7 +1003,7 @@ void ContextMenuControllerEfl::MenuItemSelected(ContextMenuItemEfl* menu_item) LOG(ERROR) << "Could not get downloads directory."; break; } - DownloadFile(GURL(params_.link_url.spec()), path, + DownloadFile(GURL(params_.link_url.spec()), path, base::FilePath(), base::BindOnce(&ContextMenuControllerEfl::OnDiskDownload, weak_ptr_factory_.GetWeakPtr())); } @@ -909,7 +1016,7 @@ void ContextMenuControllerEfl::MenuItemSelected(ContextMenuItemEfl* menu_item) LOG(ERROR) << "Could not get image downloads directory."; break; } - DownloadFile(GURL(params_.src_url.spec()), path, + DownloadFile(GURL(params_.src_url.spec()), path, base::FilePath(), base::BindOnce(&ContextMenuControllerEfl::OnDiskDownload, weak_ptr_factory_.GetWeakPtr())); } @@ -948,8 +1055,17 @@ void ContextMenuControllerEfl::MenuItemSelected(ContextMenuItemEfl* menu_item) case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB: { std::string search_text = base::UTF16ToUTF8(params_.selection_text); webview_->ClearSelection(); +#if BUILDFLAG(IS_TIZEN) + if (IsMobileProfile()) { + LaunchBrowserWithWebSearch(search_text); + } else { + OpenURL(GURL(kWebSearchLink + search_text), + WindowOpenDisposition::NEW_FOREGROUND_TAB); + } +#else OpenURL(GURL(kWebSearchLink + search_text), WindowOpenDisposition::NEW_FOREGROUND_TAB); +#endif break; } case EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD: { @@ -976,6 +1092,16 @@ void ContextMenuControllerEfl::MenuItemSelected(ContextMenuItemEfl* menu_item) } void ContextMenuControllerEfl::HideContextMenu() { + if (IsMobileProfile() && + (context_menu_status_ == HIDDEN || context_menu_status_ == NONE)) + return; + + if (is_text_selection_) { + SelectionControllerEfl* controller = webview_->GetSelectionController(); + if (controller) + controller->ContextMenuStatusHidden(); + } + if (popup_) { evas_object_event_callback_del(popup_, EVAS_CALLBACK_RESIZE, ContextMenuPopupResize); @@ -983,14 +1109,17 @@ void ContextMenuControllerEfl::HideContextMenu() { popup_ = nullptr; } + if (restore_timer_) { + ecore_timer_del(restore_timer_); + restore_timer_ = nullptr; + } + if (IsMobileProfile()) { -#if !defined(EWK_BRINGUP) context_menu_status_ = HIDDEN; -#endif } else if (menu_items_) { void* data; EINA_LIST_FREE(menu_items_, data) { - _Ewk_Context_Menu_Item *item = static_cast<_Ewk_Context_Menu_Item*> (data); + _Ewk_Context_Menu_Item* item = static_cast<_Ewk_Context_Menu_Item*>(data); delete item; } menu_items_ = nullptr; @@ -1008,6 +1137,9 @@ void ContextMenuControllerEfl::Resize(const gfx::Rect& webview_rect) { if (!popup_) return; + if (IsMobileProfile() && context_menu_status_ != VISIBLE) + return; + if (is_text_selection_) { RequestSelectionRect(); } else { @@ -1016,12 +1148,19 @@ void ContextMenuControllerEfl::Resize(const gfx::Rect& webview_rect) { } void ContextMenuControllerEfl::DeletePopup() { - if (native_view_) - evas_object_data_set(native_view_, "ContextMenuContollerEfl", 0); + if (top_widget_) + evas_object_data_set(top_widget_, "ContextMenuContollerEfl", 0); + + if (is_text_selection_) { + SelectionControllerEfl* controller = webview_->GetSelectionController(); + if (controller) + controller->ContextMenuStatusHidden(); + } if (popup_) { evas_object_data_set(popup_, "ContextMenuContollerEfl", 0); - evas_object_smart_member_del(popup_); + if (!IsMobileProfile()) + evas_object_smart_member_del(popup_); evas_object_del(popup_); popup_ = nullptr; list_ = nullptr; @@ -1035,5 +1174,7 @@ void ContextMenuControllerEfl::DeletePopup() { } menu_items_ = nullptr; } + if (IsMobileProfile()) + context_menu_status_ = NONE; } } diff --git a/tizen_src/ewk/efl_integration/context_menu_controller_efl.h b/tizen_src/ewk/efl_integration/context_menu_controller_efl.h index eb17afe..1c898d2 100644 --- a/tizen_src/ewk/efl_integration/context_menu_controller_efl.h +++ b/tizen_src/ewk/efl_integration/context_menu_controller_efl.h @@ -82,14 +82,15 @@ class ContextMenuControllerEfl : public download::DownloadItem::Observer { void Resize(const gfx::Rect& webview_rect); void RequestSelectionRect() const; - void OnSelectionRectReceived(const gfx::Rect& selection_rect); - gfx::Point CalculateSelectionMenuPosition(gfx::Rect selection_rect); + void OnSelectionRectReceived(gfx::Rect selection_rect); + gfx::Point CalculateSelectionMenuPosition(const gfx::Rect& selection_rect); private: static void ContextMenuPopupResize(void* data, Evas* e, Evas_Object* obj, void* event_info); + enum ContextMenuStatusTag { NONE = 0, HIDDEN, INPROGRESS, VISIBLE }; static void BlockClickedCallback(void*, Evas_Object*, void*); void ContextMenuPopupListResize(); void CustomMenuItemSelected(ContextMenuItemEfl*); @@ -114,30 +115,38 @@ class ContextMenuControllerEfl : public download::DownloadItem::Observer { base::FilePath DownloadFile( const GURL url, const base::FilePath outputDir, + const base::FilePath suggested_filename, download::DownloadUrlParameters::OnStartedCallback callback); bool TriggerDownloadCb(const GURL url); void OpenURL(const GURL url, const WindowOpenDisposition disposition); #if BUILDFLAG(IS_TIZEN) + void LaunchBrowserWithWebSearch(const std::string& text); void LaunchShareApp(const std::string& text); #endif void DeletePopup(); + static Eina_Bool RestoreTimerCallback(void* data); + static std::vector _context_menu_listdata; static int _popup_item_height; static bool _context_menu_resized; EWebView* webview_; Evas_Object* native_view_; - Evas_Object* popup_; + Evas_Object* top_widget_ = nullptr; + Evas_Object* popup_ = nullptr; Evas_Object* list_ = nullptr; - Eina_List* menu_items_; + Eina_List* menu_items_ = nullptr; ContextMenuParams params_; WebContents& web_contents_; gfx::Point context_menu_show_pos_; - bool is_text_selection_; + bool is_text_selection_ = false; std::set clipboard_download_items_; std::set disk_download_items_; std::unique_ptr file_saved_dialog_; std::unique_ptr save_fail_dialog_; + Ecore_Timer* restore_timer_ = nullptr; + ContextMenuStatusTag context_menu_status_ = NONE; + base::WeakPtrFactory weak_ptr_factory_; }; diff --git a/tizen_src/ewk/efl_integration/download_manager_delegate_efl.cc b/tizen_src/ewk/efl_integration/download_manager_delegate_efl.cc index 74c01a6..ba15e89 100644 --- a/tizen_src/ewk/efl_integration/download_manager_delegate_efl.cc +++ b/tizen_src/ewk/efl_integration/download_manager_delegate_efl.cc @@ -14,6 +14,9 @@ #include "ewk/efl_integration/eweb_view.h" #include "third_party/blink/public/common/mime_util/mime_util.h" +const void* const DownloadManagerDelegateEfl::kDownloadTemporaryFile = + &DownloadManagerDelegateEfl::kDownloadTemporaryFile; + DownloadManagerDelegateEfl::DownloadManagerDelegateEfl( content::DownloadManager* download_manager) : download_manager_(download_manager) {} @@ -58,6 +61,9 @@ base::FilePath DownloadManagerDelegateEfl::GetPlatformDownloadPath( bool DownloadManagerDelegateEfl::DetermineDownloadTarget( download::DownloadItem* item, content::DownloadTargetCallback* callback) { + if (item->GetUserData(kDownloadTemporaryFile)) + return false; + if (TriggerExternalDownloadManager(item)) { std::move(*callback).Run( base::FilePath(), /* Empty file path for cancellation */ diff --git a/tizen_src/ewk/efl_integration/download_manager_delegate_efl.h b/tizen_src/ewk/efl_integration/download_manager_delegate_efl.h index fc9141c..11c6c9f 100644 --- a/tizen_src/ewk/efl_integration/download_manager_delegate_efl.h +++ b/tizen_src/ewk/efl_integration/download_manager_delegate_efl.h @@ -31,6 +31,8 @@ public: content::DownloadOpenDelayedCallback) override; void GetNextId(content::DownloadIdCallback) override; + static const void* const kDownloadTemporaryFile; + private: // If the external download manager is available, trigger download // with it and return true, otherwise return false. diff --git a/tizen_src/ewk/efl_integration/eweb_view.cc b/tizen_src/ewk/efl_integration/eweb_view.cc index a9a6708..40f93c3 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.cc +++ b/tizen_src/ewk/efl_integration/eweb_view.cc @@ -122,6 +122,8 @@ const char* kCustomScrollBeginSignalName = "custom,scroll,begin"; // email-app specific signal which informs that custom scrolling is finished. const char* kCustomScrollEndSignalName = "custom,scroll,end"; +const float kDelayShowContextMenuTime = 0.2f; + inline void SetDefaultStringIfNull(const char*& variable, const char* default_string) { if (!variable) { @@ -1290,11 +1292,37 @@ void EWebView::UpdateContextMenuWithParams( const content::ContextMenuParams& params) { context_menu_.reset( new content::ContextMenuControllerEfl(this, *web_contents_.get())); - if (!context_menu_->PopulateAndShowContextMenu(params)) { - context_menu_.reset(); - if (GetSelectionController()) - GetSelectionController()->HideHandles(); + + if (IsMobileProfile()) { + if (delayed_show_context_menu_timer_) { + ecore_timer_del(delayed_show_context_menu_timer_); + delayed_show_context_menu_timer_ = nullptr; + } + saved_context_menu_params_ = params; + delayed_show_context_menu_timer_ = ecore_timer_add( + kDelayShowContextMenuTime, DelayedPopulateAndShowContextMenu, this); + } else { + if (!context_menu_->PopulateAndShowContextMenu(params)) { + context_menu_.reset(); + if (GetSelectionController()) + GetSelectionController()->HideHandles(); + } + } +} + +Eina_Bool EWebView::DelayedPopulateAndShowContextMenu(void* data) { + if (IsMobileProfile) { + EWebView* view = static_cast(data); + if (view) { + if (view->context_menu_ && + !(view->context_menu_->PopulateAndShowContextMenu( + view->saved_context_menu_params_))) { + view->context_menu_.reset(); + } + view->delayed_show_context_menu_timer_ = nullptr; + } } + return ECORE_CALLBACK_CANCEL; } void EWebView::CancelContextMenu(int request_id) { diff --git a/tizen_src/ewk/efl_integration/eweb_view.h b/tizen_src/ewk/efl_integration/eweb_view.h index 601562e..42f4698 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.h +++ b/tizen_src/ewk/efl_integration/eweb_view.h @@ -738,6 +738,8 @@ class EWebView { void* event_info); void UpdateContextMenuWithParams(const content::ContextMenuParams& params); + static Eina_Bool DelayedPopulateAndShowContextMenu(void* data); + scoped_refptr evas_event_handler_; scoped_refptr context_; std::unique_ptr web_contents_; @@ -877,6 +879,8 @@ class EWebView { #if defined(TIZEN_VIDEO_HOLE) bool pending_video_hole_setting_ = false; #endif + + Ecore_Timer* delayed_show_context_menu_timer_ = nullptr; }; const unsigned int g_default_tilt_motion_sensitivity = 3; -- 2.7.4 From 4ed343250147480e53755a771124358956193f20 Mon Sep 17 00:00:00 2001 From: "shurong.chen" Date: Tue, 21 Feb 2023 11:07:53 +0800 Subject: [PATCH 11/16] [M108 Migration][VD] Provide ewk_settings_clipboard_enabled_set api The patch is for the requirement: Support ewk setting api for handle ctrl+x/c/v(clipboard). When clipboard enabled, text input can paste from clipboard. This patch is migrated from M94 Aura: https://review.tizen.org/gerrit/#/c/282689/ Change-Id: I2de1e97720968c27d5271e63c2afba3935ec30e9 Signed-off-by: shurong.chen --- .../base/clipboard/clipboard_helper_efl_wayland.cc | 4 ---- .../efl_integration/context_menu_controller_efl.cc | 2 +- tizen_src/ewk/efl_integration/eweb_view.cc | 24 +++++++++++++--------- .../private/ewk_settings_private.cc | 8 ++++++++ .../efl_integration/private/ewk_settings_private.h | 3 +++ .../ewk/efl_integration/public/ewk_settings.cc | 14 +++++++++++-- 6 files changed, 38 insertions(+), 17 deletions(-) diff --git a/tizen_src/chromium_impl/ui/base/clipboard/clipboard_helper_efl_wayland.cc b/tizen_src/chromium_impl/ui/base/clipboard/clipboard_helper_efl_wayland.cc index 2599142a..ed21a61 100644 --- a/tizen_src/chromium_impl/ui/base/clipboard/clipboard_helper_efl_wayland.cc +++ b/tizen_src/chromium_impl/ui/base/clipboard/clipboard_helper_efl_wayland.cc @@ -202,11 +202,7 @@ bool ClipboardHelperEfl::RetrieveClipboardItem( } bool ClipboardHelperEfl::CanPasteFromClipboardApp() const { -#if BUILDFLAG(IS_TIZEN_TV) - return false; -#else return CbhmNumberOfItems() > 0; -#endif } void ClipboardHelperEfl::RefreshClipboard() { diff --git a/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc b/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc index b85d8ac..0590549 100644 --- a/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc +++ b/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc @@ -253,7 +253,7 @@ void ContextMenuControllerEfl::GetProposedContextMenu() { } #endif - if (params_.is_editable && + if (params_.is_editable && webview_->GetSettings()->getClipboardEnabled() && ClipboardHelperEfl::GetInstance()->CanPasteFromClipboardApp()) { AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, std::string(dgettext("WebKit", "IDS_WEBVIEW_OPT_CLIPBOARD"))); diff --git a/tizen_src/ewk/efl_integration/eweb_view.cc b/tizen_src/ewk/efl_integration/eweb_view.cc index 40f93c3..b57d167 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.cc +++ b/tizen_src/ewk/efl_integration/eweb_view.cc @@ -408,8 +408,9 @@ EWebView::~EWebView() { evas_object_event_callback_del(native_view_, EVAS_CALLBACK_RESIZE, EWebView::NativeViewResize); -#if defined(USE_WAYLAND) && !BUILDFLAG(IS_TIZEN_TV) - ClipboardHelperEfl::GetInstance()->MaybeInvalidateActiveWebview(this); +#if defined(USE_WAYLAND) + if (GetSettings()->getClipboardEnabled()) + ClipboardHelperEfl::GetInstance()->MaybeInvalidateActiveWebview(this); #endif std::map::iterator @@ -1686,21 +1687,24 @@ void EWebView::OnCopyFromBackingStore(bool success, const SkBitmap& bitmap) {} void EWebView::OnFocusIn() { SmartCallback().call(); -#if defined(USE_WAYLAND) && !BUILDFLAG(IS_TIZEN_TV) +#if defined(USE_WAYLAND) if (!rwhva() || !rwhva()->offscreen_helper()) return; - ClipboardHelperEfl::GetInstance()->OnWebviewFocusIn( - this, rwhva()->offscreen_helper()->content_image_elm_host(), - rwhva()->offscreen_helper()->IsFocusedNodeContentEditable(), - base::BindRepeating(&EWebView::ExecuteEditCommand, - base::Unretained(this))); + if (GetSettings()->getClipboardEnabled()) { + ClipboardHelperEfl::GetInstance()->OnWebviewFocusIn( + this, rwhva()->offscreen_helper()->content_image_elm_host(), + rwhva()->offscreen_helper()->IsFocusedNodeContentEditable(), + base::BindRepeating(&EWebView::ExecuteEditCommand, + base::Unretained(this))); + } #endif } void EWebView::OnFocusOut() { SmartCallback().call(); -#if defined(USE_WAYLAND) && !BUILDFLAG(IS_TIZEN_TV) - ClipboardHelperEfl::GetInstance()->MaybeInvalidateActiveWebview(this); +#if defined(USE_WAYLAND) + if (GetSettings()->getClipboardEnabled()) + ClipboardHelperEfl::GetInstance()->MaybeInvalidateActiveWebview(this); #endif } diff --git a/tizen_src/ewk/efl_integration/private/ewk_settings_private.cc b/tizen_src/ewk/efl_integration/private/ewk_settings_private.cc index 607544f..a36de09 100644 --- a/tizen_src/ewk/efl_integration/private/ewk_settings_private.cc +++ b/tizen_src/ewk/efl_integration/private/ewk_settings_private.cc @@ -5,6 +5,7 @@ #include "ewk_settings_private.h" #include "net/http/http_stream_factory.h" +#include "tizen/system_info.h" Ewk_Settings::Ewk_Settings(Evas_Object* evas_object, const WebPreferences& preferences) @@ -29,3 +30,10 @@ void Ewk_Settings::setEdgeEffectEnabled(bool enable) { content::EdgeEffect::EnableGlobally(enable); #endif } + +bool Ewk_Settings::getClipboardEnabled() const { + if (IsTvProfile()) + return m_clipboardEnabled; + else + return true; +} diff --git a/tizen_src/ewk/efl_integration/private/ewk_settings_private.h b/tizen_src/ewk/efl_integration/private/ewk_settings_private.h index f1fa82b..497ef14 100644 --- a/tizen_src/ewk/efl_integration/private/ewk_settings_private.h +++ b/tizen_src/ewk/efl_integration/private/ewk_settings_private.h @@ -92,6 +92,8 @@ class Ewk_Settings { bool getURLBarHideEnabled() const { return m_URLBarHide; } void setTouchFocusEnabled(bool enable) { m_touchFocusEnabled = enable; } bool touchFocusEnabled() const { return m_touchFocusEnabled; } + void setClipboardEnabled(bool enable) { m_clipboardEnabled = enable; } + bool getClipboardEnabled() const; private: WebPreferences m_preferences; @@ -126,6 +128,7 @@ class Ewk_Settings { bool m_allowRestrictedURL = true; bool m_URLBarHide = false; bool m_touchFocusEnabled = true; + bool m_clipboardEnabled = false; }; #endif // ewk_settings_private_h diff --git a/tizen_src/ewk/efl_integration/public/ewk_settings.cc b/tizen_src/ewk/efl_integration/public/ewk_settings.cc index d406e3fd..2891773 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_settings.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_settings.cc @@ -865,13 +865,23 @@ Eina_Bool ewk_settings_drag_drop_enabled_get(const Ewk_Settings* settings) void ewk_settings_clipboard_enabled_set(Ewk_Settings* settings, Eina_Bool enabled) { - LOG_EWK_API_MOCKUP(); +#if BUILDFLAG(IS_TIZEN_TV) + EINA_SAFETY_ON_NULL_RETURN(settings); + settings->setClipboardEnabled(!!enabled); +#else + LOG_EWK_API_MOCKUP("Only for Tizen TV"); +#endif } Eina_Bool ewk_settings_clipboard_enabled_get(const Ewk_Settings* settings) { - LOG_EWK_API_MOCKUP(); +#if BUILDFLAG(IS_TIZEN_TV) + EINA_SAFETY_ON_NULL_RETURN_VAL(settings, EINA_FALSE); + return settings->getClipboardEnabled(); +#else + LOG_EWK_API_MOCKUP("Only for Tizen TV"); return EINA_FALSE; +#endif } Eina_Bool ewk_settings_javascript_can_access_clipboard_set(Ewk_Settings* settings, Eina_Bool enable) -- 2.7.4 From d16bfd645f7ab9cea5ac99bc08fef938a927a81f Mon Sep 17 00:00:00 2001 From: Gajendra N Date: Mon, 27 Feb 2023 11:02:46 +0530 Subject: [PATCH 12/16] Add dummy implementation for ewk_set_version_policy API ewk_set_version_policy api comes from UWE feature. Since UWE patch is not yet applied to beta branch due to some error, this patch applies dummy impl for the above api to succeed 7.5 VD QB build. Change-Id: I2b6cef8e87e3e480a3ae8f49847e8743d9224aed Signed-off-by: Gajendra N --- tizen_src/ewk/efl_integration/public/ewk_main.cc | 8 ++++++++ .../ewk/efl_integration/public/ewk_main_internal.h | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/tizen_src/ewk/efl_integration/public/ewk_main.cc b/tizen_src/ewk/efl_integration/public/ewk_main.cc index 2a29423..5900023 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_main.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_main.cc @@ -62,6 +62,14 @@ int _ewk_log_dom = -1; Ecore_Wl2_Display* _ecore_wl2_display = NULL; #endif +/* LCOV_EXCL_START */ +int ewk_set_version_policy(int preference) { + // TODO: Remove below mockup log during UWE bringup + LOG_EWK_API_MOCKUP(); + return 1; +} +/* LCOV_EXCL_STOP */ + int ewk_init(void) { if (_ewkInitCount) diff --git a/tizen_src/ewk/efl_integration/public/ewk_main_internal.h b/tizen_src/ewk/efl_integration/public/ewk_main_internal.h index a787025..c0d7498 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_main_internal.h +++ b/tizen_src/ewk/efl_integration/public/ewk_main_internal.h @@ -139,6 +139,28 @@ EXPORT_API void ewk_set_arguments(int argc, char** argv); */ EINA_DEPRECATED EXPORT_API void ewk_home_directory_set(const char* path); +/** + * @brief Set version selection policy + * + * @details Set a version selection policy when plural web engines are + * installed. If the runtime prefers preload version, set 0. + * If the runtime prefers updated version, set 1. + * Each product may have a different default policy so this function + * provides a way to set a definitive policy to each runtime. + * + * @since_tizen 5.5 + * + * @note Must be called before ewk_init. Calling the function after ewk_init has + * no effect. + * + * @param[in] preference 0 means conservative. 1 means progressive. + * + * @return current policy + * + * @see ewk_init + */ +EXPORT_API int ewk_set_version_policy(int preference); + #ifdef __cplusplus } #endif -- 2.7.4 From c06c03e7456e91320fe3e42f9825e6335022aacc Mon Sep 17 00:00:00 2001 From: Bakka Uday Kiran Date: Thu, 23 Feb 2023 14:51:28 +0530 Subject: [PATCH 13/16] [M108 Migration][Native Control] JsPopup Migration & Bring up This patch brings up popup functionality for JavaScript APIs like window.alert(), window.prompt() etc. Reference: https://review.tizen.org/gerrit/c/278533 https://review.tizen.org/gerrit/c/271926 Change-Id: I9f50d76b8f5d8b309eb1749f6cb18a3e2ffccc4c Signed-off-by: Bakka Uday Kiran --- .../javascript_dialog_manager_efl.cc | 2 +- tizen_src/ewk/efl_integration/BUILD.gn | 11 +- .../browser/javascript_dialog_manager_efl.cc | 175 +++++++++------------ .../browser/javascript_dialog_manager_efl.h | 58 +++---- tizen_src/ewk/efl_integration/eweb_view.cc | 24 +++ tizen_src/ewk/efl_integration/eweb_view.h | 8 + tizen_src/ewk/efl_integration/public/ewk_view.cc | 7 +- .../efl_integration/resource/JavaScriptPopup.edc | 2 +- .../resource/images/popup_btn_cancel.png | Bin 0 -> 1184 bytes .../resource/images/popup_btn_ok.png | Bin 0 -> 1392 bytes 10 files changed, 143 insertions(+), 144 deletions(-) create mode 100644 tizen_src/ewk/efl_integration/resource/images/popup_btn_cancel.png create mode 100644 tizen_src/ewk/efl_integration/resource/images/popup_btn_ok.png diff --git a/tizen_src/chromium_impl/components/js_dialogs_efl/javascript_dialog_manager_efl.cc b/tizen_src/chromium_impl/components/js_dialogs_efl/javascript_dialog_manager_efl.cc index 1554d90..9f0fab3 100644 --- a/tizen_src/chromium_impl/components/js_dialogs_efl/javascript_dialog_manager_efl.cc +++ b/tizen_src/chromium_impl/components/js_dialogs_efl/javascript_dialog_manager_efl.cc @@ -62,7 +62,7 @@ void JavaScriptDialogManagerEfl::RunBeforeUnloadDialog( open_dialogs_[web_contents] = new JavaScriptModalDialogEfl( web_contents, JavaScriptModalDialogEfl::NAVIGATION, base::UTF8ToUTF16( - std::string(dgettext("WebKit", "IDS_WEBVIEW_BEFOREUNLOAD_MESSAGE"))), + std::string(dgettext("WebKit", "IDS_WEBVIEW_POP_LEAVE_THIS_PAGE_Q"))), std::u16string(), std::move(callback)); } diff --git a/tizen_src/ewk/efl_integration/BUILD.gn b/tizen_src/ewk/efl_integration/BUILD.gn index 3e32f33..2624586 100755 --- a/tizen_src/ewk/efl_integration/BUILD.gn +++ b/tizen_src/ewk/efl_integration/BUILD.gn @@ -644,6 +644,7 @@ shared_library("chromium-ewk") { } deps += [ "resource:edje_resources_ewk" ] deps += [ ":broken_image" ] + deps += [ ":popup_btns" ] } executable("efl_webprocess") { @@ -663,4 +664,12 @@ copy("launch_exec_script") { copy("broken_image") { sources = [ "./resource/images/broken_image.png" ] outputs = [ "$root_out_dir/images/{{source_file_part}}" ] -} \ No newline at end of file +} + +copy("popup_btns") { + sources = [ + "./resource/images/popup_btn_cancel.png", + "./resource/images/popup_btn_ok.png", + ] + outputs = [ "$root_out_dir/images/{{source_file_part}}" ] +} diff --git a/tizen_src/ewk/efl_integration/browser/javascript_dialog_manager_efl.cc b/tizen_src/ewk/efl_integration/browser/javascript_dialog_manager_efl.cc index b11690a..3a5b308 100644 --- a/tizen_src/ewk/efl_integration/browser/javascript_dialog_manager_efl.cc +++ b/tizen_src/ewk/efl_integration/browser/javascript_dialog_manager_efl.cc @@ -11,70 +11,7 @@ using content::BrowserThread; using web_contents_utils::WebViewFromWebContents; -JavaScriptModalCallbacksData::JavaScriptModalCallbacksData( - content::JavaScriptDialogType javascript_dialog_type, - void* user_data) - : alert_callback_(NULL), - user_data_(user_data), - javascript_dialog_type_(javascript_dialog_type) {} - -bool JavaScriptModalCallbacksData::Run(Evas_Object* obj, - const char* message_text, - const char* default_text) { - switch (javascript_dialog_type_) { - case content::JAVASCRIPT_DIALOG_TYPE_ALERT: { - if (alert_callback_) - return alert_callback_(obj, message_text, user_data_); - break; - } - case content::JAVASCRIPT_DIALOG_TYPE_CONFIRM: { - if (confirm_callback_) - return confirm_callback_(obj, message_text, user_data_); - break; - } - case content::JAVASCRIPT_DIALOG_TYPE_PROMPT: { - if (prompt_callback_) - return prompt_callback_(obj, message_text, default_text, user_data_); - break; - } - } - return false; -} - -JavaScriptModalCallbacksData* -JavaScriptModalCallbacksData::CreateWithAlertDialogData( - Ewk_View_JavaScript_Alert_Callback callback, - void* user_data) { - JavaScriptModalCallbacksData* callback_data = - new JavaScriptModalCallbacksData(content::JAVASCRIPT_DIALOG_TYPE_ALERT, - user_data); - callback_data->alert_callback_ = callback; - return callback_data; -} - -JavaScriptModalCallbacksData* -JavaScriptModalCallbacksData::CreateWithConfirmDialogData( - Ewk_View_JavaScript_Confirm_Callback callback, - void* user_data) { - JavaScriptModalCallbacksData* callback_data = - new JavaScriptModalCallbacksData(content::JAVASCRIPT_DIALOG_TYPE_CONFIRM, - user_data); - callback_data->confirm_callback_ = callback; - return callback_data; -} - -JavaScriptModalCallbacksData* -JavaScriptModalCallbacksData::CreateWithPromptDialogData( - Ewk_View_JavaScript_Prompt_Callback callback, - void* user_data) { - JavaScriptModalCallbacksData* callback_data = - new JavaScriptModalCallbacksData(content::JAVASCRIPT_DIALOG_TYPE_PROMPT, - user_data); - callback_data->prompt_callback_ = callback; - return callback_data; -} - -JavaScriptDialogManagerEfl::JavaScriptDialogManagerEfl() {} +JavaScriptDialogManagerEfl::JavaScriptDialogManagerEfl() : dialog_(nullptr) {} JavaScriptDialogManagerEfl::~JavaScriptDialogManagerEfl() {} @@ -93,34 +30,45 @@ void JavaScriptDialogManagerEfl::RunJavaScriptDialog( wv->SmartCallback().call(0); JavaScriptModalDialogEfl::Type type = JavaScriptModalDialogEfl::ALERT; - if (dialog_type == content::JAVASCRIPT_DIALOG_TYPE_ALERT) { - type = JavaScriptModalDialogEfl::ALERT; - if (alert_callback_data_) { - if (!(alert_callback_data_->Run(wv->evas_object(), - base::UTF16ToUTF8(message_text).c_str(), - NULL))) - ExecuteDialogClosedCallBack(false, std::string()); - } - } - if (dialog_type == content::JAVASCRIPT_DIALOG_TYPE_CONFIRM) { - type = JavaScriptModalDialogEfl::CONFIRM; - if (confirm_callback_data_) { - if (!(confirm_callback_data_->Run(wv->evas_object(), - base::UTF16ToUTF8(message_text).c_str(), - NULL))) - ExecuteDialogClosedCallBack(false, std::string()); - } - } - if (dialog_type == content::JAVASCRIPT_DIALOG_TYPE_PROMPT) { - type = JavaScriptModalDialogEfl::PROMPT; - if (prompt_callback_data_) { - if (!(prompt_callback_data_->Run( - wv->evas_object(), base::UTF16ToUTF8(message_text).c_str(), - base::UTF16ToUTF8(default_prompt_text).c_str()))) - ExecuteDialogClosedCallBack(false, std::string()); - } + switch (dialog_type) { + case content::JAVASCRIPT_DIALOG_TYPE_ALERT: + type = JavaScriptModalDialogEfl::ALERT; + if (alert_callback_data_.callback) { + if (!alert_callback_data_.callback( + wv->evas_object(), base::UTF16ToUTF8(message_text).c_str(), + alert_callback_data_.user_data)) { + ExecuteDialogClosedCallBack(false, std::string()); + } + return; + } + break; + case content::JAVASCRIPT_DIALOG_TYPE_CONFIRM: + type = JavaScriptModalDialogEfl::CONFIRM; + if (confirm_callback_data_.callback) { + if (!confirm_callback_data_.callback( + wv->evas_object(), base::UTF16ToUTF8(message_text).c_str(), + confirm_callback_data_.user_data)) { + ExecuteDialogClosedCallBack(false, std::string()); + } + return; + } + break; + case content::JAVASCRIPT_DIALOG_TYPE_PROMPT: + type = JavaScriptModalDialogEfl::PROMPT; + if (prompt_callback_data_.callback) { + if (!prompt_callback_data_.callback( + wv->evas_object(), base::UTF16ToUTF8(message_text).c_str(), + base::UTF16ToUTF8(default_prompt_text).c_str(), + prompt_callback_data_.user_data)) { + ExecuteDialogClosedCallBack(false, std::string()); + } + return; + } + break; + default: + break; } - + // If "*_callback_data_" doen't exist, create default popup dialog_.reset(JavaScriptModalDialogEfl::CreateDialogAndShow( web_contents, type, message_text, default_prompt_text, std::move(dialog_closed_callback_))); @@ -129,34 +77,33 @@ void JavaScriptDialogManagerEfl::RunJavaScriptDialog( void JavaScriptDialogManagerEfl::SetAlertCallback( Ewk_View_JavaScript_Alert_Callback callback, void* user_data) { - alert_callback_data_.reset( - JavaScriptModalCallbacksData::CreateWithAlertDialogData(callback, - user_data)); + alert_callback_data_.callback = callback; + alert_callback_data_.user_data = user_data; } void JavaScriptDialogManagerEfl::SetConfirmCallback( Ewk_View_JavaScript_Confirm_Callback callback, void* user_data) { - confirm_callback_data_.reset( - JavaScriptModalCallbacksData::CreateWithConfirmDialogData(callback, - user_data)); + confirm_callback_data_.callback = callback; + confirm_callback_data_.user_data = user_data; } void JavaScriptDialogManagerEfl::SetPromptCallback( Ewk_View_JavaScript_Prompt_Callback callback, void* user_data) { - prompt_callback_data_.reset( - JavaScriptModalCallbacksData::CreateWithPromptDialogData(callback, - user_data)); + prompt_callback_data_.callback = callback; + prompt_callback_data_.user_data = user_data; } void JavaScriptDialogManagerEfl::ExecuteDialogClosedCallBack( bool result, const std::string prompt_data) { - std::move(dialog_closed_callback_) - .Run(result, base::UTF8ToUTF16(prompt_data)); - if (dialog_) { + // If default dialog was created, callback is handled in dtor of dialog. + if (dialog_) dialog_.reset(nullptr); + else { + std::move(dialog_closed_callback_) + .Run(result, base::UTF8ToUTF16(prompt_data)); } } @@ -176,6 +123,16 @@ void JavaScriptDialogManagerEfl::RunBeforeUnloadDialog( EWebView* wv = WebViewFromWebContents(web_contents); wv->SmartCallback().call(0); + // TODO(karan.kumar): remove message argument from the callback + // http://suprem.sec.samsung.net/jira/browse/RWASP-204 + if (before_unload_confirm_panel_callback_.callback && + !before_unload_confirm_panel_callback_.callback( + wv->evas_object(), nullptr, + before_unload_confirm_panel_callback_.user_data)) { + std::move(dialog_closed_callback_).Run(false, std::u16string()); + return; + } + dialog_.reset(JavaScriptModalDialogEfl::CreateDialogAndShow( web_contents, JavaScriptModalDialogEfl::NAVIGATION, base::UTF8ToUTF16( @@ -194,3 +151,15 @@ bool JavaScriptDialogManagerEfl::HandleJavaScriptDialog( void JavaScriptDialogManagerEfl::CancelDialogs( content::WebContents* web_contents, bool reset_state) {} + +void JavaScriptDialogManagerEfl::SetBeforeUnloadConfirmPanelCallback( + Ewk_View_Before_Unload_Confirm_Panel_Callback callback, + void* user_data) { + before_unload_confirm_panel_callback_.callback = callback; + before_unload_confirm_panel_callback_.user_data = user_data; +} + +void JavaScriptDialogManagerEfl::ReplyBeforeUnloadConfirmPanel( + Eina_Bool result) { + std::move(dialog_closed_callback_).Run(result, std::u16string()); +} diff --git a/tizen_src/ewk/efl_integration/browser/javascript_dialog_manager_efl.h b/tizen_src/ewk/efl_integration/browser/javascript_dialog_manager_efl.h index 12a8314..9524650 100644 --- a/tizen_src/ewk/efl_integration/browser/javascript_dialog_manager_efl.h +++ b/tizen_src/ewk/efl_integration/browser/javascript_dialog_manager_efl.h @@ -2,13 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef JAVASCRIPT_DIALOG_MANAGER_EFL_H_ -#define JAVASCRIPT_DIALOG_MANAGER_EFL_H_ +#ifndef EWK_EFL_INTEGRATION_BROWSER_JAVASCRIPT_DIALOG_MANAGER_EFL_H_ +#define EWK_EFL_INTEGRATION_BROWSER_JAVASCRIPT_DIALOG_MANAGER_EFL_H_ #include #include "content/public/browser/javascript_dialog_manager.h" #include "eweb_view.h" #include "public/ewk_view_internal.h" +#include "public/ewk_view_product.h" #include "url/gurl.h" namespace content { @@ -16,39 +17,10 @@ class WebContents; } class JavaScriptModalDialogEfl; -class JavaScriptModalCallbacksData { - public: - bool Run(Evas_Object* obj, - const char* content_text, - const char* default_text); - static JavaScriptModalCallbacksData* CreateWithAlertDialogData( - Ewk_View_JavaScript_Alert_Callback callback, - void* user_data); - static JavaScriptModalCallbacksData* CreateWithConfirmDialogData( - Ewk_View_JavaScript_Confirm_Callback callback, - void* user_data); - static JavaScriptModalCallbacksData* CreateWithPromptDialogData( - Ewk_View_JavaScript_Prompt_Callback callback, - void* user_data); - ~JavaScriptModalCallbacksData() {} - - private: - JavaScriptModalCallbacksData( - content::JavaScriptDialogType javascript_dialog_type, - void* user_data); - union { - Ewk_View_JavaScript_Alert_Callback alert_callback_; - Ewk_View_JavaScript_Confirm_Callback confirm_callback_; - Ewk_View_JavaScript_Prompt_Callback prompt_callback_; - }; - void* user_data_; - content::JavaScriptDialogType javascript_dialog_type_; -}; - class JavaScriptDialogManagerEfl : public content::JavaScriptDialogManager { public: JavaScriptDialogManagerEfl(); - virtual ~JavaScriptDialogManagerEfl(); + ~JavaScriptDialogManagerEfl() override; JavaScriptDialogManagerEfl(const JavaScriptDialogManagerEfl&) = delete; JavaScriptDialogManagerEfl& operator=(const JavaScriptDialogManagerEfl&) = @@ -80,13 +52,27 @@ class JavaScriptDialogManagerEfl : public content::JavaScriptDialogManager { void* user_data); void ExecuteDialogClosedCallBack(bool result, const std::string prompt_data); void SetPopupSize(int width, int height); + void SetBeforeUnloadConfirmPanelCallback( + Ewk_View_Before_Unload_Confirm_Panel_Callback callback, + void* user_data); + void ReplyBeforeUnloadConfirmPanel(Eina_Bool result); private: + template + struct CallbackData { + CallbackData() : callback(nullptr), user_data(nullptr) {} + + CallbackType callback; + void* user_data; + }; + std::unique_ptr dialog_; - std::unique_ptr alert_callback_data_; - std::unique_ptr confirm_callback_data_; - std::unique_ptr prompt_callback_data_; + CallbackData alert_callback_data_; + CallbackData confirm_callback_data_; + CallbackData prompt_callback_data_; + CallbackData + before_unload_confirm_panel_callback_; DialogClosedCallback dialog_closed_callback_; }; -#endif /* JAVASCRIPT_DIALOG_MANAGER_EFL_H_ */ +#endif // EWK_EFL_INTEGRATION_BROWSER_JAVASCRIPT_DIALOG_MANAGER_EFL_H_ diff --git a/tizen_src/ewk/efl_integration/eweb_view.cc b/tizen_src/ewk/efl_integration/eweb_view.cc index b57d167..cfac19e 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.cc +++ b/tizen_src/ewk/efl_integration/eweb_view.cc @@ -139,6 +139,15 @@ void GetEinaRectFromGfxRect(const gfx::Rect& gfx_rect, eina_rect->h = gfx_rect.height(); } +#if BUILDFLAG(IS_TIZEN) +static Eina_Bool RotateWindowCb(void* data, int type, void* event) { + auto wv = static_cast(data); + wv->SetOrientation( + ecore_evas_rotation_get(ecore_evas_ecore_evas_get(wv->GetEvas()))); + return ECORE_CALLBACK_PASS_ON; +} +#endif + static content::WebContents* NullCreateWebContents(void*) { return NULL; } @@ -333,6 +342,10 @@ EWebView::EWebView(Ewk_Context* context, Evas_Object* object) OnViewFocusIn, this); evas_object_event_callback_add(evas_object_, EVAS_CALLBACK_FOCUS_OUT, OnViewFocusOut, this); +#if BUILDFLAG(IS_TIZEN) + window_rotate_handler_ = ecore_event_handler_add( + ECORE_WL2_EVENT_WINDOW_ROTATE, RotateWindowCb, this); +#endif } } @@ -2892,6 +2905,17 @@ void EWebView::SetSessionTimeout(uint64_t timeout) { rwhva()->host()->SetLongPollingGlobalTimeout(timeout); } +void EWebView::SetBeforeUnloadConfirmPanelCallback( + Ewk_View_Before_Unload_Confirm_Panel_Callback callback, + void* user_data) { + GetJavaScriptDialogManagerEfl()->SetBeforeUnloadConfirmPanelCallback( + callback, user_data); +} + +void EWebView::ReplyBeforeUnloadConfirmPanel(Eina_Bool result) { + GetJavaScriptDialogManagerEfl()->ReplyBeforeUnloadConfirmPanel(result); +} + void EWebView::SetExceededIndexedDatabaseQuotaCallback( Ewk_View_Exceeded_Indexed_Database_Quota_Callback callback, void* user_data) { diff --git a/tizen_src/ewk/efl_integration/eweb_view.h b/tizen_src/ewk/efl_integration/eweb_view.h index 42f4698..3df69fb 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.h +++ b/tizen_src/ewk/efl_integration/eweb_view.h @@ -640,6 +640,10 @@ class EWebView { Ewk_View_Request_Manifest_Callback callback, void* user_data); + void SetBeforeUnloadConfirmPanelCallback( + Ewk_View_Before_Unload_Confirm_Panel_Callback callback, + void* user_data); + void ReplyBeforeUnloadConfirmPanel(Eina_Bool result); void SyncAcceptLanguages(const std::string& accept_languages); void OnOverscrolled(const gfx::Vector2dF& accumulated_overscroll, @@ -844,6 +848,10 @@ class EWebView { content::QuotaPermissionContext::PermissionCallback> quota_permission_request_map_; +#if BUILDFLAG(IS_TIZEN) + Ecore_Event_Handler* window_rotate_handler_ = nullptr; +#endif + bool is_initialized_; std::unique_ptr<_Ewk_Back_Forward_List> back_forward_list_; diff --git a/tizen_src/ewk/efl_integration/public/ewk_view.cc b/tizen_src/ewk/efl_integration/public/ewk_view.cc index 82cb5e5..e2c3269 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_view.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_view.cc @@ -564,12 +564,15 @@ void ewk_view_javascript_prompt_reply(Evas_Object* view, const char* result) void ewk_view_before_unload_confirm_panel_callback_set(Evas_Object* ewkView, Ewk_View_Before_Unload_Confirm_Panel_Callback callback, void* userData) { - LOG_EWK_API_MOCKUP(); + EWK_VIEW_IMPL_GET_OR_RETURN(ewkView, impl); + EINA_SAFETY_ON_NULL_RETURN(callback); + impl->SetBeforeUnloadConfirmPanelCallback(callback, userData); } void ewk_view_before_unload_confirm_panel_reply(Evas_Object* ewkView, Eina_Bool result) { - LOG_EWK_API_MOCKUP(); + EWK_VIEW_IMPL_GET_OR_RETURN(ewkView, impl); + impl->ReplyBeforeUnloadConfirmPanel(result); } Eina_Bool ewk_view_web_application_capable_get(Evas_Object* ewkView, Ewk_Web_App_Capable_Get_Callback callback, void* userData) diff --git a/tizen_src/ewk/efl_integration/resource/JavaScriptPopup.edc b/tizen_src/ewk/efl_integration/resource/JavaScriptPopup.edc index efb3d8d..25292f1 100644 --- a/tizen_src/ewk/efl_integration/resource/JavaScriptPopup.edc +++ b/tizen_src/ewk/efl_integration/resource/JavaScriptPopup.edc @@ -30,7 +30,7 @@ collections { scale : 1; description { state: "default" 0.0; - min: 0 70; + min: 0 30; align: 0.5 0.5; fixed: 1 0; rel1 { diff --git a/tizen_src/ewk/efl_integration/resource/images/popup_btn_cancel.png b/tizen_src/ewk/efl_integration/resource/images/popup_btn_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..5f346cb1623ffc78d757ca3d0e4528043ca5e42a GIT binary patch literal 1184 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVin%-qt%z{teX!qLRg(AC7!$;r*t#LUvz z$<)%)%)kPs*Cju>G&eP`1g19ysMpZa)X?0>&;qE}6sulPV#qB3+U$~Alv$RV;#QQO zs{r=2RVHq?7~yscL~jZfw?O@2j8m^Z&@uX;s6~oum=G}ifSB-v3*^9)erg^ty%zx! zHjl2}Yz78KAx{^_kcwMxW?tkyWWeJRe9CIg5t%fmO&)4Vaw1J4oi!p!le@LT(@)w@ zO}g(byJMU8Im?Q^-~u@o1qMbA2L`5yB;A=_r&x4@vez#Q&DUOdW^2l+`2vS;#d!sr zUyWO}b(-4R3YC_eE55hBP7|!kiP_EHH~EUxthmFBVXkcJbIMDY|D1o7y=j{QPUmrh$$_!6eKbLh* G2~7Z}D~yo< literal 0 HcmV?d00001 diff --git a/tizen_src/ewk/efl_integration/resource/images/popup_btn_ok.png b/tizen_src/ewk/efl_integration/resource/images/popup_btn_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..f20f62e7f8872c282aa2bb8135b3393de9dff42f GIT binary patch literal 1392 zcmbVMZA=?=7(aoHm&u?Sw6bZ=gJp@*-b=49cT(WEYgr@ZrEMH8e&BjN=%rk*-W|47 zRE8#2Hg)oWWeI}Gf*NCR(?pCirpdBpya;A7OSX)ez@~F!#QK6{!+3?3`GM?%m%ID_ z|IauP*+$`S^xk*p=%%G(N-k&>K;vw^M`&-0Z4kR23!EozIqp5!Fa$fk6RF)^Z{0id!v7Gb#%uY!KQT?pHu z9@WLdNXSx?NJ+ zr^GM>uB)gaJG2p0i@OP=C7B1!M#R7&78JDLMifT~oTvaX1VvyJgAuC%MM$%iL{Kn& zL7F!?&_;R~XWEx`vO_^tjgT-LjYf@8lTnh}VU!>U7{Oo+GiVwHr7NtmF+*4>%UED| zg_DJdDo9~4Ws&tuovIzuBHc(qjJVyKhQmslD2*~W#ztV&h`^$l%4=O)Q9b;Wt1L)sT(KnRcyim^Bd z6vs_w+<~KLt%ETW6y~&=EDVKPv5bwau!zZILl84X*lZMvI&h-4*6F}4gsIj{5EjIi z!MehV%7!^U<5$r9rm@6*u_P_?tSZSqN$SXSKvPgsB_$|DK-z0IqM)1Qgm6ldD$qv0 z3@-~W@d2kSiQqcJq_9N_qpW*XZ5V1@X1lADu`AD0dAh}}M|uZ~aw9?&_$2XCLa>wFa}!}))X_kMCsSu3^`RQAZz zr}l1NJ@8Q1W#Ij9UpbtZXj|UZ;(kinb)xJK6UOWg{Wbpj*N3|My}^scXwJy7g?ArJ zhDMXFtc0CDGc%l^XHf5n+jNxxoRkt@0rr_oxxv5tqxs;@H?AD%zVOj_sOJXWe15EZ z>P{YVs`>b84qKX>$f_Uyz5Hs!v-9mezaDyL@fl(A&Q7pl-1~?6_N0c#kZNwP|r;n;w|WU0S;JTJg=)KhWi9U`A_Od;bN2{Oh;? literal 0 HcmV?d00001 -- 2.7.4 From c43ec8bd9412a6d422e3aa63bafec1ac3685e77b Mon Sep 17 00:00:00 2001 From: Suhaspoornachandra Date: Tue, 21 Feb 2023 14:50:12 +0530 Subject: [PATCH 14/16] fixup! [M108 Migration][MM] Migrate Tbm feature for Tizen Multimedia Currently |DestroyMediaPacket| function is called twice(|OnTbmBufferExhausted| and |GLImageEGL|) per each media packet. Changed to call |DestroyMediaPacket| function only once per each packet. Reference: https://review.tizen.org/gerrit/278415 Change-Id: Ife888684dca419a0d9629e1c39594ce1c71238d1 Signed-off-by: Suhaspoornachandra --- .../renderer/media/tizen/media_player_renderer_client.cc | 4 ++++ .../media/filters/media_player_bridge_capi_adapter.cc | 12 +++++++++++- .../media/filters/media_player_bridge_capi_adapter.h | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/tizen_src/chromium_impl/content/renderer/media/tizen/media_player_renderer_client.cc b/tizen_src/chromium_impl/content/renderer/media/tizen/media_player_renderer_client.cc index 9cc558b..308894a 100644 --- a/tizen_src/chromium_impl/content/renderer/media/tizen/media_player_renderer_client.cc +++ b/tizen_src/chromium_impl/content/renderer/media/tizen/media_player_renderer_client.cc @@ -150,6 +150,10 @@ void MediaPlayerRendererClient::OnTbmBufferExhausted( media::VideoFrame* video_frame, void* media_packet, int player_id) { + // In this case, media packet will be released in destructor of |GLImageEGL|. + if (video_frame->GetTbmTexture()) + return; + gfx::TbmBufferHandle tbm_handle; tbm_handle.media_packet = reinterpret_cast(media_packet); tbm_handle.player_id = player_id; diff --git a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.cc b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.cc index 97f1fbe..196a797 100644 --- a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.cc +++ b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.cc @@ -23,6 +23,8 @@ MediaPlayerBridgeCapiAdapter::MediaPlayerBridgeCapiAdapter(const GURL& url, MediaPlayerBridgeCapiAdapter::~MediaPlayerBridgeCapiAdapter() { LOG(INFO) << "(" << static_cast(this) << ") " << __func__; MediaPlayerRegistry::GetInstance()->UnregisterMediaPlayer(player_id_); + Release(); + weak_factory_.InvalidateWeakPtrs(); } bool MediaPlayerBridgeCapiAdapter::CreatePlayer() { @@ -63,7 +65,7 @@ void MediaPlayerBridgeCapiAdapter::Release() { void MediaPlayerBridgeCapiAdapter::SetTaskRunner( const scoped_refptr& task_runner) { - NOTIMPLEMENTED(); + task_runner_ = task_runner; } void MediaPlayerBridgeCapiAdapter::SetStreamInfo(DemuxerStream::Type /*type*/, @@ -190,6 +192,14 @@ void MediaPlayerBridgeCapiAdapter::OnMediaDataChange(int player_id, #if defined(TIZEN_TBM_SUPPORT) void MediaPlayerBridgeCapiAdapter::DestroyMediaPacket(void* media_packet) { + if (!task_runner_->BelongsToCurrentThread()) { + task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&MediaPlayerBridgeCapiAdapter::DestroyMediaPacket, + weak_factory_.GetWeakPtr(), media_packet)); + return; + } + if (MEDIA_PACKET_ERROR_NONE != media_packet_destroy(static_cast(media_packet))) { LOG(WARNING) << "Fail to release media_packet"; diff --git a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.h b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.h index c93a172..b65a555 100644 --- a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.h +++ b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.h @@ -117,6 +117,9 @@ class MEDIA_EXPORT MediaPlayerBridgeCapiAdapter : public MediaPlayerTizen, int width_ = 0; int height_ = 0; + + scoped_refptr task_runner_; + base::WeakPtrFactory weak_factory_{this}; }; } // namespace media -- 2.7.4 From c6061608566a8bc31d459cf70044a9925a143222 Mon Sep 17 00:00:00 2001 From: Gajendra N Date: Mon, 27 Feb 2023 13:54:52 +0530 Subject: [PATCH 15/16] fixup! [M108 Migration][clang] set default value for _clang variable This commit enables clang build by default for both VD QB and SR QB. Signed-off-by: Gajendra N Change-Id: I481464121e0d500829b714f94920db5000e25523 --- packaging/chromium-efl.spec | 2 -- 1 file changed, 2 deletions(-) diff --git a/packaging/chromium-efl.spec b/packaging/chromium-efl.spec index 49fb87b..351af4f 100755 --- a/packaging/chromium-efl.spec +++ b/packaging/chromium-efl.spec @@ -176,9 +176,7 @@ BuildRequires: binutils-gold %define ARCHITECTURE x86_64 %endif -%if "%{?tizen_profile_name}" == "tv" %{!?_clang: %define _clang 1} -%endif %if "%{?_clang}" == "1" && "%{ARCHITECTURE}" == "armv7l" %define __use_clang 1 -- 2.7.4 From a3181f69eee3eee1c1ecb6e6bdaff1c9f5b36a87 Mon Sep 17 00:00:00 2001 From: xiaofang Date: Mon, 27 Feb 2023 10:19:08 +0800 Subject: [PATCH 16/16] [M108 Aura Migration] Add media playback ewk api ewk api: ewk_view_stop_video ewk_view_broadcast_decoder_set ewk_view_media_device_list_get ewk_settings_default_audio_input_device_set ewk_view_is_video_playing Refer: https://review.tizen.org/gerrit/#/c/270947/ https://review.tizen.org/gerrit/#/c/271619/ https://review.tizen.org/gerrit/#/c/284880/ https://review.tizen.org/gerrit/#/c/284853/ https://review.tizen.org/gerrit/#/c/276711/ https://review.tizen.org/gerrit/#/c/270211/ Change-Id: I406d049dca2b07ae4f4757c6412f0ceff9509e81 Signed-off-by: xiaofang --- .../ewk/efl_integration/eweb_view_callbacks.h | 26 +++++ .../public/ewk_media_playback_info.cc | 23 +++++ .../public/ewk_media_playback_info.h | 114 +++++++++++++++++++++ .../public/ewk_media_playback_info_product.h | 28 +++++ .../public/ewk_media_subtitle_info.h | 99 ++++++++++++++++++ .../ewk/efl_integration/public/ewk_settings.cc | 5 + .../efl_integration/public/ewk_settings_product.h | 1 + .../public/ewk_user_media_internal.h | 12 +++ tizen_src/ewk/efl_integration/public/ewk_view.cc | 23 +++++ .../ewk/efl_integration/public/ewk_view_internal.h | 20 ++++ .../ewk/efl_integration/public/ewk_view_product.h | 10 ++ 11 files changed, 361 insertions(+) create mode 100644 tizen_src/ewk/efl_integration/public/ewk_media_playback_info.h create mode 100644 tizen_src/ewk/efl_integration/public/ewk_media_subtitle_info.h diff --git a/tizen_src/ewk/efl_integration/eweb_view_callbacks.h b/tizen_src/ewk/efl_integration/eweb_view_callbacks.h index 36b1345..7ab0b9d 100644 --- a/tizen_src/ewk/efl_integration/eweb_view_callbacks.h +++ b/tizen_src/ewk/efl_integration/eweb_view_callbacks.h @@ -107,6 +107,16 @@ enum CallbackType { EdgeRight, EdgeTop, EdgeBottom, +#if BUILDFLAG(IS_TIZEN_TV) + DeviceConnectionChanged, + PlaybackLoad, + PlaybackVideoReady, + PlaybackReady, + PlaybackStart, + PlaybackFinish, + PlaybackStop, + UserMediaState, +#endif OverscrolledLeft, OverscrolledRight, OverscrolledTop, @@ -251,6 +261,22 @@ DECLARE_EWK_VIEW_CALLBACK(EdgeLeft, "edge,left", void); DECLARE_EWK_VIEW_CALLBACK(EdgeTop, "edge,top", void); DECLARE_EWK_VIEW_CALLBACK(EdgeBottom, "edge,bottom", void); DECLARE_EWK_VIEW_CALLBACK(EdgeRight, "edge,right", void); +#if BUILDFLAG(IS_TIZEN_TV) +DECLARE_EWK_VIEW_CALLBACK(DeviceConnectionChanged, + "device,connection,changed", + int*); +DECLARE_EWK_VIEW_CALLBACK(PlaybackLoad, "notification,playback,load", void*); +DECLARE_EWK_VIEW_CALLBACK(PlaybackVideoReady, + "notification,playback,videoready", + void*); +DECLARE_EWK_VIEW_CALLBACK(PlaybackReady, "notification,playback,ready", void*); +DECLARE_EWK_VIEW_CALLBACK(PlaybackStart, "notification,playback,start", void*); +DECLARE_EWK_VIEW_CALLBACK(PlaybackStop, "notification,playback,stop", void*); +DECLARE_EWK_VIEW_CALLBACK(PlaybackFinish, + "notification,playback,finish", + void*); +DECLARE_EWK_VIEW_CALLBACK(UserMediaState, "usermedia,state", void*); +#endif DECLARE_EWK_VIEW_CALLBACK(OverscrolledLeft, "overscrolled,left", void); DECLARE_EWK_VIEW_CALLBACK(OverscrolledRight, "overscrolled,right", void); DECLARE_EWK_VIEW_CALLBACK(OverscrolledTop, "overscrolled,top", void); diff --git a/tizen_src/ewk/efl_integration/public/ewk_media_playback_info.cc b/tizen_src/ewk/efl_integration/public/ewk_media_playback_info.cc index b7baf7e..1d7d318 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_media_playback_info.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_media_playback_info.cc @@ -28,6 +28,16 @@ #include "build/build_config.h" #include "private/ewk_private.h" +struct _Ewk_Media_Playback_Info { + int video_id; + const char* media_url; + const char* mime_type; + Eina_Bool media_resource_acquired; + const char* translated_url; + const char* drm_info; + Ewk_Hardware_Decoders decoder; +}; + const char* ewk_media_playback_info_media_url_get( Ewk_Media_Playback_Info* data) { LOG_EWK_API_MOCKUP(); @@ -68,6 +78,19 @@ void ewk_media_playback_info_drm_info_set(Ewk_Media_Playback_Info* data, LOG_EWK_API_MOCKUP(); } +Ewk_Hardware_Decoders ewk_media_playback_info_decoder_get( + Ewk_Media_Playback_Info* data) { + EINA_SAFETY_ON_NULL_RETURN_VAL(data, EWK_HARDWARE_DECODERS_NONE); + return data->decoder; +} + +void ewk_media_playback_info_decoder_set( + Ewk_Media_Playback_Info* data, + Ewk_Hardware_Decoders decoder) { + if (data) + data->decoder = decoder; +} + const int ewk_media_playback_info_video_id_get(Ewk_Media_Playback_Info* data) { LOG_EWK_API_MOCKUP(); diff --git a/tizen_src/ewk/efl_integration/public/ewk_media_playback_info.h b/tizen_src/ewk/efl_integration/public/ewk_media_playback_info.h new file mode 100644 index 0000000..b12341e --- /dev/null +++ b/tizen_src/ewk/efl_integration/public/ewk_media_playback_info.h @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2022 Samsung Electronics. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY SAMSUNG ELECTRONICS. AND ITS CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SAMSUNG ELECTRONICS. OR ITS + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file ewk_media_playback_info.h + * @brief This file describes the ewk media playback info API. + */ + +#ifndef ewk_media_playback_info_h +#define ewk_media_playback_info_h +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _Ewk_Media_Playback_Info Ewk_Media_Playback_Info; + +/** + * Get url of media. + * + * @param meia playback info's structure + * + * @return @c media url + */ +EXPORT_API const char* ewk_media_playback_info_media_url_get( + Ewk_Media_Playback_Info* data); + +/** + * Get mime type of media. + * + * @param meia playback info's structure + * + * @return @c mime type + */ +EXPORT_API const char* ewk_media_playback_info_mime_type_get( + Ewk_Media_Playback_Info* data); + +/** + * Get translated url of media. + * + * @param media playback info's structure + * + * @return @c translated url + */ +EXPORT_API const char* ewk_media_playback_info_translated_url_get( + Ewk_Media_Playback_Info* data); + +/** + * Get drm info of media. + * + * @param media playback info's structure + * + * @return @c drm info + */ +EXPORT_API const char* ewk_media_playback_info_drm_info_get( + Ewk_Media_Playback_Info* data); + +/** + * Set media resource acquired of media. + * + * @param media playback info's structure + */ +EXPORT_API void ewk_media_playback_info_media_resource_acquired_set( + Ewk_Media_Playback_Info* data, + Eina_Bool media_resource_acquired); + +/** + * Set translated url of media. + * + * @param media playback info's structure + */ +EXPORT_API void ewk_media_playback_info_translated_url_set( + Ewk_Media_Playback_Info* data, + const char* translated_url); + +/** + * Set drm info of media. + * + * @param media playback info's structure + */ +EXPORT_API void ewk_media_playback_info_drm_info_set( + Ewk_Media_Playback_Info* data, + const char* drm_info); + +#ifdef __cplusplus +} +#endif +#endif // ewk_media_playback_info_h + diff --git a/tizen_src/ewk/efl_integration/public/ewk_media_playback_info_product.h b/tizen_src/ewk/efl_integration/public/ewk_media_playback_info_product.h index a7689d5..3fbc080 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_media_playback_info_product.h +++ b/tizen_src/ewk/efl_integration/public/ewk_media_playback_info_product.h @@ -39,6 +39,15 @@ extern "C" { #endif +/** + * Enum values used to inform webengine about decoder used by broadcast. + */ +typedef enum Ewk_Hardware_Decoders { + EWK_HARDWARE_DECODERS_NONE, + EWK_HARDWARE_DECODERS_MAIN, + EWK_HARDWARE_DECODERS_SUB, +} Ewk_Hardware_Decoders; + typedef struct _Ewk_Media_Playback_Info Ewk_Media_Playback_Info; /** @@ -92,6 +101,16 @@ EXPORT_API const char* ewk_media_playback_info_drm_info_get( Ewk_Media_Playback_Info* data); /** + * Get decoder info of media. + * + * @param data playback info's structure + * + * @return @c decoder name + */ +EXPORT_API Ewk_Hardware_Decoders ewk_media_playback_info_decoder_get( + Ewk_Media_Playback_Info* data); + +/** * Set media resource acquired of media. * * @param media playback info's structure @@ -118,6 +137,15 @@ EXPORT_API void ewk_media_playback_info_drm_info_set( Ewk_Media_Playback_Info* data, const char* drm_info); +/** + * Set decoder info of media. + * + * @param media playback info's structure + */ +EXPORT_API void ewk_media_playback_info_decoder_set( + Ewk_Media_Playback_Info* data, + Ewk_Hardware_Decoders decoder); + Ewk_Media_Playback_Info* ewkMediaPlaybackInfoCreate(const int player_id, const char* url, const char* mime_type); diff --git a/tizen_src/ewk/efl_integration/public/ewk_media_subtitle_info.h b/tizen_src/ewk/efl_integration/public/ewk_media_subtitle_info.h new file mode 100644 index 0000000..ed82339 --- /dev/null +++ b/tizen_src/ewk/efl_integration/public/ewk_media_subtitle_info.h @@ -0,0 +1,99 @@ +// Copyright 2022 Samsung Electronics. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** +* @file ewk_media_subtitle_info.h +* @brief . +*/ + +#ifndef ewk_media_subtitle_info_h +#define ewk_media_subtitle_info_h +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _Ewk_Media_Subtitle_Info Ewk_Media_Subtitle_Info; + +/** +* Get id of subtitle. +* +* @param meia subtitle info's structure +* +* @return @c subtitle id +*/ +EXPORT_API int ewk_media_subtitle_info_id_get(Ewk_Media_Subtitle_Info *data); + +/** +* Get url of subtitle. +* +* @param meia subtitle info's structure +* +* @return @c subtitle url +*/ +EXPORT_API const char *ewk_media_subtitle_info_url_get(Ewk_Media_Subtitle_Info *data); + +/** +* Get srcLang of subtitle. +* +* @param meia subtitle info's structure +* +* @return @c subtitle srcLang +*/ +EXPORT_API const char *ewk_media_subtitle_info_lang_get(Ewk_Media_Subtitle_Info *data); + +/** +* Get label of subtitle. +* +* @param meia subtitle info's structure +* +* @return @c subtitle label +*/ +EXPORT_API const char *ewk_media_subtitle_info_label_get(Ewk_Media_Subtitle_Info *data); + +typedef struct _Ewk_Media_Subtitle_Data Ewk_Media_Subtitle_Data; + +/** +* Get id of subtitle. +* +* @param meia subtitle data's structure +* +* @return @c subtitle id +*/ +EXPORT_API int ewk_media_subtitle_data_id_get(Ewk_Media_Subtitle_Data *data); + +/** +* Get timestamp of subtitle. +* +* @param meia subtitle data's structure +* +* @return @c subtitle timestamp +*/ +EXPORT_API double ewk_media_subtitle_data_timestamp_get(Ewk_Media_Subtitle_Data *data); + +/** +* Get data size of subtitle. +* +* @param meia subtitle data's structure +* +* @return @c subtitle data size +*/ +EXPORT_API unsigned ewk_media_subtitle_data_size_get(Ewk_Media_Subtitle_Data *data); + +/** +* Get data of subtitle. +* +* @param meia subtitle data's structure +* +* @return @c subtitle data +*/ +EXPORT_API const void* ewk_media_subtitle_data_get(Ewk_Media_Subtitle_Data *data); + +#ifdef __cplusplus +} +#endif +#endif // ewk_media_subtitle_info_h \ No newline at end of file diff --git a/tizen_src/ewk/efl_integration/public/ewk_settings.cc b/tizen_src/ewk/efl_integration/public/ewk_settings.cc index 2891773..3fdb1e9 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_settings.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_settings.cc @@ -716,6 +716,11 @@ Eina_Bool ewk_settings_uses_scrollbar_thumb_focus_notifications_set(Ewk_Settings return EINA_FALSE; } +void ewk_settings_default_audio_input_device_set(Ewk_Settings* settings, const char* device_id) +{ + LOG_EWK_API_MOCKUP(); +} + void ewk_settings_media_playback_notification_set(Ewk_Settings* settings, Eina_Bool enabled) { LOG_EWK_API_MOCKUP(); diff --git a/tizen_src/ewk/efl_integration/public/ewk_settings_product.h b/tizen_src/ewk/efl_integration/public/ewk_settings_product.h index 7f6bdfa..ed82333 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_settings_product.h +++ b/tizen_src/ewk/efl_integration/public/ewk_settings_product.h @@ -869,6 +869,7 @@ EXPORT_API void ewk_settings_clipboard_enabled_set(Ewk_Settings* settings, Eina_ */ EXPORT_API Eina_Bool ewk_settings_clipboard_enabled_get(const Ewk_Settings* settings); +EXPORT_API void ewk_settings_default_audio_input_device_set(Ewk_Settings* settings, const char* device_id); #ifdef __cplusplus } diff --git a/tizen_src/ewk/efl_integration/public/ewk_user_media_internal.h b/tizen_src/ewk/efl_integration/public/ewk_user_media_internal.h index d6c0ce6..9b933e9 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_user_media_internal.h +++ b/tizen_src/ewk/efl_integration/public/ewk_user_media_internal.h @@ -55,6 +55,18 @@ enum _Ewk_User_Media_Device_Type { typedef enum _Ewk_User_Media_Device_Type Ewk_User_Media_Device_Type; /** + * struct _Ewk_User_Media_State_Info + * @brief Get user media device usability status. + * + */ +struct _Ewk_User_Media_State_Info { + Ewk_User_Media_Device_Type device_type; + uint32_t previous_state; + uint32_t current_state; +}; +typedef struct _Ewk_User_Media_State_Info Ewk_User_Media_State_Info; + +/** * Requests for getting origin of local media permission request. * * @param request Ewk_User_Media_Permission_Request object to get origin for diff --git a/tizen_src/ewk/efl_integration/public/ewk_view.cc b/tizen_src/ewk/efl_integration/public/ewk_view.cc index e2c3269..de1b81a 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_view.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_view.cc @@ -1503,12 +1503,31 @@ Eina_Bool ewk_view_key_system_whitelist_set(Evas_Object* ewkView, const char** l return EINA_FALSE; } +Eina_Bool ewk_view_is_video_playing(Evas_Object* o, Ewk_Is_Video_Playing_Callback callback, void* user_data) +{ + LOG_EWK_API_MOCKUP(); + return EINA_FALSE; +} + Eina_Bool ewk_view_active_drm_set(Evas_Object* view, const char* drm_system_id) { LOG_EWK_API_MOCKUP(); return EINA_FALSE; } +void ewk_view_broadcast_decoder_set( + Evas_Object* view, + Ewk_Hardware_Decoders decoder) +{ +#if BUILDFLAG(IS_TIZEN_TV) + EWK_VIEW_IMPL_GET_OR_RETURN(view, impl); + /* waiting for implement*/ + //impl->SetBroadcastDecoder(decoder); +#else + LOG_EWK_API_MOCKUP("Only for Tizen TV."); +#endif +} + void ewk_media_set_subtitle_lang(Evas_Object* ewkView, const char* lang_list) { LOG_EWK_API_MOCKUP(); @@ -1629,3 +1648,7 @@ void ewk_view_request_manifest(Evas_Object* o, EWK_VIEW_IMPL_GET_OR_RETURN(o, impl); impl->RequestManifest(callback, user_data); } + +void ewk_view_media_device_list_get(Evas_Object* o, Ewk_Media_Device_List_Get_Callback callback, void* user_data) { + //TODO +} \ No newline at end of file diff --git a/tizen_src/ewk/efl_integration/public/ewk_view_internal.h b/tizen_src/ewk/efl_integration/public/ewk_view_internal.h index 986e3ef..a7ba801 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_view_internal.h +++ b/tizen_src/ewk/efl_integration/public/ewk_view_internal.h @@ -33,6 +33,8 @@ #ifndef ewk_view_internal_h #define ewk_view_internal_h +#include + #include "ewk_app_installation_request_internal.h" #include "ewk_auth_challenge_internal.h" #include "ewk_context_internal.h" @@ -157,6 +159,20 @@ enum Ewk_Mouse_Button_Type { }; typedef enum Ewk_Mouse_Button_Type Ewk_Mouse_Button_Type; +typedef enum _EwkMediaDeviceType{ + MEDIA_DEVICE_TYPE_AUDIO_INPUT, + MEDIA_DEVICE_TYPE_VIDEO_INPUT, + MEDIA_DEVICE_TYPE_AUDIO_OUTPUT, + NUM_MEDIA_DEVICE_TYPES, +} EwkMediaDeviceType; + +typedef struct _EwkMediaDeviceInfo{ + const char* device_id; + const char* label; + EwkMediaDeviceType type; + bool connected; +} EwkMediaDeviceInfo; + /// Ewk view's class, to be overridden by sub-classes. struct Ewk_View_Smart_Class { Evas_Smart_Class sc; /**< all but 'data' is free to be changed. */ @@ -285,6 +301,8 @@ typedef void (*Ewk_View_Scale_Changed_Callback)(Evas_Object *o, double scale_fac */ typedef void (*Ewk_View_SmartRC_Mic_Notification_Callback)(Evas_Object *o, Eina_Bool show, void *user_data); +typedef void (*Ewk_Media_Device_List_Get_Callback)(EwkMediaDeviceInfo* device_list, int size, void* user_data); + /** * The version you have to put into the version field * in the @a Ewk_View_Smart_Class structure. @@ -1487,6 +1505,8 @@ EXPORT_API void ewk_view_feed_mouse_wheel(Evas_Object* o, int x, int y); +EXPORT_API void ewk_view_media_device_list_get(Evas_Object* o, Ewk_Media_Device_List_Get_Callback callback, void* user_data); + #ifdef __cplusplus } #endif diff --git a/tizen_src/ewk/efl_integration/public/ewk_view_product.h b/tizen_src/ewk/efl_integration/public/ewk_view_product.h index 18b8752..6afdf45 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_view_product.h +++ b/tizen_src/ewk/efl_integration/public/ewk_view_product.h @@ -34,6 +34,7 @@ #define ewk_view_product_h #include "ewk_context_product.h" +#include "ewk_media_playback_info_product.h" #include "ewk_value_product.h" #include "ewk_view_internal.h" @@ -792,6 +793,15 @@ EXPORT_API Eina_Bool ewk_view_key_system_whitelist_set(Evas_Object* ewkView, EXPORT_API Eina_Bool ewk_view_active_drm_set(Evas_Object* view, const char* drm_system_id); /** + * Inform webengine about decoder used by broadcast for dual decoding. + * + * @param view View object + * @param decoder Identifier of used decoder + */ +EXPORT_API void ewk_view_broadcast_decoder_set(Evas_Object* view, + Ewk_Hardware_Decoders decoder); + +/** * Set the selected text track language to media player. * * @param ewkView view object -- 2.7.4