current_rvh_for_drag_(ChildProcessHost::kInvalidUniqueID,
MSG_ROUTING_NONE),
drag_in_progress_(false),
- init_rwhv_with_null_parent_for_testing_(false) {}
+ init_rwhv_with_null_parent_for_testing_(false) {
+#if BUILDFLAG(IS_EFL)
+ if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableOffscreenRendering)) {
+ return;
+ }
+
+ wcva_helper_ = std::make_unique<WebContentsViewAuraHelperEfl>(
+ this, web_contents_, delegate_.get());
+#endif
+}
WebContentsViewAura::~WebContentsViewAura() {
if (!window_)
#include "ui/base/dragdrop/drop_target_event.h"
#include "ui/base/dragdrop/mojom/drag_drop_types.mojom-forward.h"
+#if BUILDFLAG(IS_EFL)
+#include "content/browser/web_contents/web_contents_view_aura_helper_efl.h"
+#endif
+
namespace ui {
class DropTargetEvent;
class TouchSelectionController;
static void InstallCreateHookForTests(
RenderWidgetHostViewCreateFunction create_render_widget_host_view);
+#if BUILDFLAG(IS_EFL)
+ WebContentsViewAuraHelperEfl* wcva_helper() const {
+ return wcva_helper_.get();
+ }
+#endif
+
private:
// Just the metadata from DropTargetEvent that's safe and cheap to copy to
// help locate drop events in the callback.
// Non-null when the WebContents is being captured for video.
std::unique_ptr<aura::WindowTreeHost::VideoCaptureLock> video_capture_lock_;
+#if BUILDFLAG(IS_EFL)
+ std::unique_ptr<WebContentsViewAuraHelperEfl> wcva_helper_;
+#endif
+
base::WeakPtrFactory<WebContentsViewAura> weak_ptr_factory_{this};
};
"//tizen_src/chromium_impl/content/browser/tracing/tracing_controller_efl.h",
"//tizen_src/chromium_impl/content/browser/web_contents/web_contents_impl_efl.cc",
"//tizen_src/chromium_impl/content/browser/web_contents/web_contents_impl_efl.h",
+ "//tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.cc",
+ "//tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.h",
"//tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.cc",
"//tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.h",
"//tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.cc",
--- /dev/null
+// Copyright (c) 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.
+
+#include "content/browser/web_contents/web_contents_view_aura_helper_efl.h"
+
+#include "content/browser/web_contents/web_contents_view_aura.h"
+
+namespace content {
+
+WebContentsViewAuraHelperEfl::WebContentsViewAuraHelperEfl(
+ WebContentsViewAura* wcva,
+ WebContentsImpl* web_contents,
+ WebContentsViewDelegate* delegate)
+ : wcv_aura_(wcva), web_contents_(web_contents), view_delegate_(delegate) {}
+
+WebContentsViewAuraHelperEfl::~WebContentsViewAuraHelperEfl() {
+ popup_client_.reset();
+}
+
+void WebContentsViewAuraHelperEfl::DidSelectPopupMenuItems(
+ std::vector<int>& indices) {
+ popup_client_->DidAcceptIndices(indices);
+}
+
+#if BUILDFLAG(USE_EXTERNAL_POPUP_MENU)
+void WebContentsViewAuraHelperEfl::ShowPopupMenu(
+ RenderFrameHost* render_frame_host,
+ mojo::PendingRemote<blink::mojom::PopupMenuClient> popup_client,
+ const gfx::Rect& bounds,
+ int item_height,
+ double item_font_size,
+ int selected_item,
+ std::vector<blink::mojom::MenuItemPtr> items,
+ bool right_aligned,
+ bool allow_multiple_selection) {
+ if (popup_client_)
+ HidePopupMenu();
+
+ popup_client_.Bind(std::move(popup_client));
+ popup_client_.set_disconnect_handler(base::BindOnce(
+ &WebContentsViewAuraHelperEfl::HidePopupMenu, base::Unretained(this)));
+
+ if (efl_delegate_) {
+ efl_delegate_->ShowPopupMenu(
+ render_frame_host, bounds, item_height, item_font_size, selected_item,
+ std::move(items), right_aligned, allow_multiple_selection);
+ }
+}
+
+void WebContentsViewAuraHelperEfl::HidePopupMenu() {
+ if (efl_delegate_)
+ efl_delegate_->HidePopupMenu();
+ popup_client_.reset();
+}
+
+void WebContentsViewAuraHelperEfl::DidCancelPopupMenu() {
+ if (popup_client_)
+ popup_client_->DidCancel();
+}
+#endif
+
+void WebContentsViewAuraHelperEfl::SetEflDelegate(
+ WebContentsEflDelegate* delegate) {
+ efl_delegate_ = delegate;
+}
+
+WebContentsEflDelegate* WebContentsViewAuraHelperEfl::GetEflDelegate() {
+ return efl_delegate_;
+}
+
+void WebContentsViewAuraHelperEfl::UpdateDragDest(RenderViewHost* host) {
+ // Drag-and-drop is entirely managed by BrowserPluginGuest for guest
+ // processes in a largely platform independent way. WebDragDestEfl
+ // will result in spurious messages being sent to the guest process which
+ // will violate assumptions.
+ if (host->GetProcess() && host->GetProcess()->IsForGuestsOnly()) {
+ DCHECK(!drag_dest_);
+ return;
+ }
+
+ RenderWidgetHostView* view = web_contents_->GetRenderWidgetHostView();
+ if (!view)
+ return;
+
+ // Create the new drag_dest_.
+ drag_dest_.reset(new WebDragDestEfl(web_contents_));
+ drag_dest_->SetPageScaleFactor(page_scale_factor_);
+
+ if (view_delegate_)
+ drag_dest_->SetDelegate(view_delegate_->GetDragDestDelegate());
+}
+
+void WebContentsViewAuraHelperEfl::StartDragging(
+ const DropData& drop_data,
+ blink::DragOperationsMask allowed_ops,
+ const gfx::ImageSkia& image,
+ const gfx::Vector2d& image_offset,
+ const blink::mojom::DragEventSourceInfo& event_info,
+ RenderWidgetHostImpl* source_rwh) {
+ if (drag_dest_) {
+ drag_dest_->SetDropData(drop_data);
+ drag_dest_->SetAction(allowed_ops);
+ }
+
+ if (!drag_source_) {
+ drag_source_.reset(new WebDragSourceEfl(web_contents_));
+ drag_source_->SetPageScaleFactor(page_scale_factor_);
+ }
+
+ if (!drag_source_->StartDragging(drop_data, allowed_ops, event_info.location,
+ *image.bitmap(), image_offset)) {
+ web_contents_->SystemDragEnded(source_rwh);
+ }
+}
+
+DropData* WebContentsViewAuraHelperEfl::GetDropData() const {
+ if (drag_dest_)
+ return drag_dest_->GetDropData();
+ return nullptr;
+}
+
+bool WebContentsViewAuraHelperEfl::IsDragging() const {
+ if (!drag_source_)
+ return false;
+ return drag_source_->IsDragging();
+}
+
+void WebContentsViewAuraHelperEfl::SetPageScaleFactor(float scale) {
+ page_scale_factor_ = scale;
+ if (drag_source_)
+ drag_source_->SetPageScaleFactor(scale);
+ if (drag_dest_)
+ drag_dest_->SetPageScaleFactor(scale);
+}
+
+void WebContentsViewAuraHelperEfl::OnSelectionRectReceived(
+ const gfx::Rect& selection_rect) const {
+#if !defined(EWK_BRINGUP)
+ view_delegate_->OnSelectionRectReceived(selection_rect);
+#endif
+}
+
+void WebContentsViewAuraHelperEfl::ShowContextMenu(
+ const ContextMenuParams& params) {
+ if (efl_delegate_)
+ efl_delegate_->ShowContextMenu(params);
+}
+
+void WebContentsViewAuraHelperEfl::CancelContextMenu(int request_id) {
+ if (efl_delegate_)
+ efl_delegate_->CancelContextMenu(request_id);
+}
+
+bool WebContentsViewAuraHelperEfl::ImePanelEnabled() const {
+#if !defined(EWK_BRINGUP)
+ if (efl_delegate_)
+ return efl_delegate_->ImePanelEnabled();
+#endif
+ return true;
+}
+
+bool WebContentsViewAuraHelperEfl::ImeHandleKeyEventEnabled() const {
+#if !defined(EWK_BRINGUP)
+ if (efl_delegate_)
+ return efl_delegate_->ImeHandleKeyEventEnabled();
+#endif
+ return true;
+}
+
+void WebContentsViewAuraHelperEfl::OnOverscrolled(
+ const gfx::Vector2dF& accumulated_overscroll,
+ const gfx::Vector2dF& latest_overscroll_delta) {
+#if !defined(EWK_BRINGUP)
+ if (efl_delegate_)
+ efl_delegate_->OnOverscrolled(accumulated_overscroll,
+ latest_overscroll_delta);
+#endif
+}
+
+} // namespace content
--- /dev/null
+// Copyright (c) 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.
+
+#ifndef WEB_CONTENTS_VIEW_AURA_HELPER_EFL
+#define WEB_CONTENTS_VIEW_AURA_HELPER_EFL
+
+#include "content/browser/web_contents/web_contents_impl.h"
+#include "content/browser/web_contents/web_contents_view.h"
+#include "content/browser/web_contents/web_drag_dest_efl.h"
+#include "content/browser/web_contents/web_drag_source_efl.h"
+#include "content/common/buildflags.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/web_contents_efl_delegate.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#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 "ui/gfx/image/image_skia.h"
+
+namespace content {
+
+class RenderFrameHost;
+class RenderWidgetHostImpl;
+class RenderWidgetHostViewBase;
+class WebContentsViewAura;
+class WebContentsImpl;
+
+class CONTENT_EXPORT WebContentsViewAuraHelperEfl {
+ public:
+ WebContentsViewAuraHelperEfl(WebContentsViewAura* wcva,
+ WebContentsImpl* web_contents,
+ WebContentsViewDelegate* delegate);
+ ~WebContentsViewAuraHelperEfl();
+
+ WebContentsViewAuraHelperEfl(const WebContentsViewAuraHelperEfl&) = delete;
+ WebContentsViewAuraHelperEfl& operator=(const WebContentsViewAuraHelperEfl&) =
+ delete;
+
+ void DidSelectPopupMenuItems(std::vector<int>& indices);
+#if BUILDFLAG(USE_EXTERNAL_POPUP_MENU)
+ void ShowPopupMenu(
+ RenderFrameHost* render_frame_host,
+ mojo::PendingRemote<blink::mojom::PopupMenuClient> popup_client,
+ const gfx::Rect& bounds,
+ int item_height,
+ double item_font_size,
+ int selected_item,
+ std::vector<blink::mojom::MenuItemPtr> items,
+ bool right_aligned,
+ bool allow_multiple_selection);
+ void HidePopupMenu();
+ void DidCancelPopupMenu();
+#endif
+ bool ImePanelEnabled() const;
+ bool ImeHandleKeyEventEnabled() const;
+
+ void SetEflDelegate(WebContentsEflDelegate*);
+ WebContentsEflDelegate* GetEflDelegate();
+ void UpdateDragDest(RenderViewHost* host);
+ void StartDragging(const DropData& drop_data,
+ blink::DragOperationsMask allowed_ops,
+ const gfx::ImageSkia& image,
+ const gfx::Vector2d& image_offset,
+ const blink::mojom::DragEventSourceInfo& event_info,
+ RenderWidgetHostImpl* source_rwh);
+
+ DropData* GetDropData() const;
+ bool IsDragging() const;
+ void SetPageScaleFactor(float);
+
+ void OnSelectionRectReceived(const gfx::Rect& selection_rect) const;
+ void ShowContextMenu(const ContextMenuParams& params);
+ void CancelContextMenu(int request_id);
+
+ void OnOverscrolled(const gfx::Vector2dF& accumulated_overscroll,
+ const gfx::Vector2dF& latest_overscroll_delta);
+
+ private:
+ mojo::Remote<blink::mojom::PopupMenuClient> popup_client_;
+
+ WebContentsViewAura* wcv_aura_ = nullptr;
+ WebContentsImpl* web_contents_ = nullptr;
+
+ // Delegate owned by WebContentsImplEfl
+ WebContentsEflDelegate* efl_delegate_ = nullptr;
+
+ // Our optional, generic views wrapper.
+ WebContentsViewDelegate* view_delegate_ = nullptr;
+
+ // Helpers handling drag source/destination related interactions with EFL.
+ std::unique_ptr<WebDragSourceEfl> drag_source_;
+ std::unique_ptr<WebDragDestEfl> drag_dest_;
+ float page_scale_factor_ = 1.0f;
+};
+
+} // namespace content
+
+#endif
#include "content/browser/renderer_host/ui_events_helper.h"
#include "content/browser/web_contents/web_contents_impl_efl.h"
#include "content/browser/web_contents/web_contents_view.h"
+#include "content/browser/web_contents/web_contents_view_aura.h"
+#include "content/browser/web_contents/web_contents_view_aura_helper_efl.h"
#include "content/common/content_client_export.h"
#include "content/public/browser/browser_message_filter.h"
#include "content/public/browser/browser_task_traits.h"
scroll_detector_.reset(new ScrollDetector(this));
- web_contents_delegate_.reset(new WebContentsDelegateEfl(this));
- web_contents_->SetDelegate(web_contents_delegate_.get());
- back_forward_list_.reset(
- new _Ewk_Back_Forward_List(web_contents_->GetController()));
-
DCHECK(web_contents_->GetRenderViewHost());
// Settings (content::WebPreferences) will be initalized by
// RenderViewHostImpl::ComputeWebkitPrefs() based on command line switches.
web_contents_->GetRenderWidgetHostView());
}
+content::WebContentsViewAura* EWebView::wcva() const {
+ WebContentsImpl* wc = static_cast<WebContentsImpl*>(web_contents_.get());
+ return static_cast<WebContentsViewAura*>(wc->GetView());
+}
+
void EWebView::ResetContextMenuController() {
return context_menu_.reset();
}
}
#endif
}
-#if !defined(USE_AURA)
-content::WebContentsViewEfl* EWebView::GetWebContentsViewEfl() const {
- WebContentsImpl* wc = static_cast<WebContentsImpl*>(web_contents_.get());
- return static_cast<WebContentsViewEfl*>(wc->GetView());
-}
-#endif
+
bool EWebView::TouchEventsEnabled() const {
return touch_events_enabled_;
}
void EWebView::DidChangePageScaleFactor(double scale_factor) {
page_scale_factor_ = scale_factor;
-#if !defined(USE_AURA)
- GetWebContentsViewEfl()->SetPageScaleFactor(scale_factor);
-#endif
+ wcva()->wcva_helper()->SetPageScaleFactor(scale_factor);
SetScaledContentsSize();
}
}
bool EWebView::IsDragging() const {
-#if !defined(USE_AURA)
- return GetWebContentsViewEfl()->IsDragging();
-#else
- return false;
-#endif
+ return wcva()->wcva_helper()->IsDragging();
}
void EWebView::ShowFileChooser(content::RenderFrameHost* render_frame_host,
WebContentsImplEfl* wc_efl =
static_cast<WebContentsImplEfl*>(web_contents_.get());
wc_efl->SetEflDelegate(new WebContentsEflDelegateEwk(this));
+ wcva()->wcva_helper()->SetEflDelegate(wc_efl->GetEflDelegate());
+
back_forward_list_.reset(
new _Ewk_Back_Forward_List(web_contents_->GetController()));
class RenderViewHost;
class RenderWidgetHostViewAura;
class WebContentsDelegateEfl;
+class WebContentsViewAura;
class ContextMenuControllerEfl;
class PopupControllerEfl;
}
content::WebContentsEflDelegate::WebContentsCreateCallback);
static Evas_Object* GetHostWindowDelegate(const content::WebContents*);
+ content::WebContentsViewAura* wcva() const;
content::RenderWidgetHostViewAura* rwhva() const;
Ewk_Context* context() const { return context_.get(); }
Evas_Object* evas_object() const { return evas_object_; }
int y,
Ewk_Hit_Test_Mode mode,
WebViewAsyncRequestHitTestDataCallback* cb);
-#if !defined(USE_AURA)
- content::WebContentsViewEfl* GetWebContentsViewEfl() const;
-#endif
#if BUILDFLAG(IS_TIZEN) && !defined(EWK_BRINGUP)
static void cameraResultCb(service_h request,
service_h reply,