Add WebContentsViewAuraHelperEfl class 62/286962/6
authorGajendra N <gajendra.n@samsung.com>
Tue, 17 Jan 2023 09:09:53 +0000 (14:39 +0530)
committerBot Blink <blinkbot@samsung.com>
Wed, 18 Jan 2023 12:12:43 +0000 (12:12 +0000)
This patch introduces helper class for WebContentsViewAura for routing
some calls to efl delegate classes. Also cleans up unnecessary code.

Change-Id: I2949b17af7cdd05610973fb7f7b616b6d466cdb8
Signed-off-by: Gajendra N <gajendra.n@samsung.com>
content/browser/web_contents/web_contents_view_aura.cc
content/browser/web_contents/web_contents_view_aura.h
tizen_src/chromium_impl/content/browser/browser_efl.gni
tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.cc [new file with mode: 0644]
tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.h [new file with mode: 0644]
tizen_src/ewk/efl_integration/eweb_view.cc
tizen_src/ewk/efl_integration/eweb_view.h

index bdbb5a3..1662f20 100644 (file)
@@ -711,7 +711,17 @@ WebContentsViewAura::WebContentsViewAura(
       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_)
index 3425436..db0945e 100644 (file)
 #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;
@@ -76,6 +80,12 @@ class CONTENT_EXPORT WebContentsViewAura
   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.
@@ -398,6 +408,10 @@ class CONTENT_EXPORT WebContentsViewAura
   // 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};
 };
 
index 668d5d0..4a1548a 100644 (file)
@@ -87,6 +87,8 @@ external_content_browser_efl_sources = [
   "//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",
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
new file mode 100644 (file)
index 0000000..abdc627
--- /dev/null
@@ -0,0 +1,181 @@
+// 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
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
new file mode 100644 (file)
index 0000000..a732c19
--- /dev/null
@@ -0,0 +1,100 @@
+// 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
index 3e44712..7da077e 100644 (file)
@@ -26,6 +26,8 @@
 #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"
@@ -185,11 +187,6 @@ void EWebView::Initialize() {
 
   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.
@@ -311,6 +308,11 @@ content::RenderWidgetHostViewAura* EWebView::rwhva() const {
       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();
 }
@@ -645,12 +647,7 @@ void EWebView::HandleTouchEvents(Ewk_Touch_Event_Type type,
   }
 #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_;
 }
@@ -1965,9 +1962,7 @@ double EWebView::GetScale() {
 
 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();
 }
 
@@ -2114,11 +2109,7 @@ void EWebView::SetCertificatePem(const std::string& certificate) {
 }
 
 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,
@@ -2302,6 +2293,8 @@ void EWebView::InitializeContent() {
   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()));
 
index 83b9bd4..6b09cf1 100644 (file)
@@ -66,6 +66,7 @@ class RenderFrameHost;
 class RenderViewHost;
 class RenderWidgetHostViewAura;
 class WebContentsDelegateEfl;
+class WebContentsViewAura;
 class ContextMenuControllerEfl;
 class PopupControllerEfl;
 }
@@ -184,6 +185,7 @@ class EWebView {
       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_; }
@@ -506,9 +508,6 @@ class EWebView {
       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,