[M108 Migration] Bringup Drag and Drop (DnD) 97/288097/10
authorBakka Uday Kiran <b.kiran@samsung.com>
Fri, 10 Feb 2023 09:32:59 +0000 (15:02 +0530)
committerDae-Hyun Ko <dhyuna.ko@samsung.com>
Fri, 24 Feb 2023 01:27:57 +0000 (01:27 +0000)
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 <b.kiran@samsung.com>
43 files changed:
content/browser/web_contents/web_contents_impl.cc
content/browser/web_contents/web_contents_impl.h
content/browser/web_contents/web_contents_view_aura.cc
content/public/browser/web_contents.h
content/test/test_page_broadcast.cc
content/test/test_page_broadcast.h
packaging/chromium-efl.spec
third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc
third_party/blink/common/context_menu_data/context_menu_params_builder.cc
third_party/blink/common/context_menu_data/untrustworthy_context_menu_params.cc
third_party/blink/public/common/context_menu_data/context_menu_data.h
third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h
third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h
third_party/blink/public/mojom/BUILD.gn
third_party/blink/public/mojom/context_menu/context_menu.mojom
third_party/blink/public/mojom/page/page.mojom
third_party/blink/public/web/web_frame.h
third_party/blink/renderer/core/exported/web_view_impl.cc
third_party/blink/renderer/core/exported/web_view_impl.h
third_party/blink/renderer/core/frame/web_local_frame_impl.cc
third_party/blink/renderer/core/frame/web_local_frame_impl.h
third_party/blink/renderer/core/input/event_handler.cc
third_party/blink/renderer/core/input/event_handler.h
third_party/blink/renderer/core/input/gesture_manager.cc
third_party/blink/renderer/core/input/gesture_manager.h
third_party/blink/renderer/core/input/mouse_event_manager.cc
third_party/blink/renderer/core/input/mouse_event_manager.h
third_party/blink/renderer/core/page/context_menu_controller.cc
tizen_src/build/config/tizen_features.gni
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
tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.h
tizen_src/chromium_impl/content/common/BUILD.gn
tizen_src/chromium_impl/content/common/paths_efl.cc
tizen_src/ewk/efl_integration/BUILD.gn
tizen_src/ewk/efl_integration/command_line_efl.cc
tizen_src/ewk/efl_integration/context_menu_controller_efl.cc
tizen_src/ewk/efl_integration/eweb_view.cc
tizen_src/ewk/efl_integration/eweb_view.h
tizen_src/ewk/efl_integration/resource/images/broken_image.png [new file with mode: 0644]

index 9818f54..b8dbef7 100644 (file)
@@ -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<RenderViewHostImpl*>(render_view_host)
+                            ->GetAssociatedPageBroadcast()) {
+    broadcast->EnterDragState();
+  }
+}
+#endif
+
 void WebContentsImpl::ReloadFocusedFrame() {
   OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::ReloadFocusedFrame");
   RenderFrameHost* focused_frame = GetFocusedFrame();
index c9399b5..1c2f209 100755 (executable)
@@ -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|
index f371758..0d13728 100644 (file)
@@ -720,6 +720,8 @@ WebContentsViewAura::WebContentsViewAura(
 
   wcva_helper_ = std::make_unique<WebContentsViewAuraHelperEfl>(
       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);
index 273d548..bbb8bca 100755 (executable)
@@ -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;
 
index 57fad67..c74ac78 100644 (file)
@@ -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<SkColor> color) {}
 
index c501cfc..2058bdc 100644 (file)
@@ -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<SkColor> color) override;
   void CreateRemoteMainFrame(
       const blink::RemoteFrameToken& token,
index 04fa71a..e8e97a4 100644 (file)
@@ -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
index a26b986..4a34262 100644 (file)
@@ -62,6 +62,11 @@ bool StructTraits<blink::mojom::UntrustworthyContextMenuParamsDataView,
 #if BUILDFLAG(IS_EFL)
   out->is_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();
index e257944..b9532c7 100644 (file)
@@ -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;
index 5ede70a..5e99669 100644 (file)
@@ -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;
index 611b3a8..0168924 100644 (file)
@@ -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;
 
index 40c94c4..3fc5f80 100644 (file)
@@ -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;
index 99a5b3a..d1676b0 100644 (file)
@@ -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;
index da550e3..3d36e4a 100644 (file)
@@ -1114,6 +1114,11 @@ mojom("mojom_core") {
   ]
 
   enabled_features = []
+
+  if (is_tizen) {
+    enabled_features += [ "is_tizen" ]
+  }
+
   if (use_efl) {
     enabled_features += [ "is_efl" ]
   }
index 0aaa56f..60259f1 100644 (file)
@@ -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;
index d48ab58..d8e81cc 100644 (file)
@@ -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);
 
index b88fb1a..4c4121f 100644 (file)
@@ -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&);
index 06b1fac..3f64b57 100644 (file)
@@ -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);
 }
index f4a0b57..e0947c1 100644 (file)
@@ -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<SkColor> color) override;
   void CreateRemoteMainFrame(
       const RemoteFrameToken& frame_token,
index 5e4f00b..c041fe2 100644 (file)
@@ -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,
index 6031575..b226256 100644 (file)
@@ -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(
index 825d76e..d451ade 100644 (file)
@@ -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;
index 325d6a7..6f7855e 100644 (file)
@@ -261,6 +261,10 @@ class CORE_EXPORT EventHandler final : public GarbageCollected<EventHandler> {
   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();
index dd71c13..5c38e9a 100644 (file)
@@ -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
index 2553a4a..3a4c62b 100644 (file)
@@ -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<MouseEventManager> mouse_event_manager_;
   Member<PointerEventManager> 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).
index e8cce48..18cc985 100644 (file)
 #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)
index bfd4d72..e153cfe 100644 (file)
@@ -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
index 27ec0bf..854831a 100644 (file)
@@ -508,6 +508,9 @@ bool ContextMenuController::ShowContextMenu(LocalFrame* frame,
 
   auto* html_element = DynamicTo<HTMLElement>(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();
   }
index 3b91599..47b30e0 100644 (file)
@@ -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
index 8b2ea46..30584d7 100644 (file)
@@ -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
index a732c19..3639625 100644 (file)
@@ -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,
index 75dc051..79d920c 100644 (file)
@@ -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<Evas_Object*>(web_contents->GetNativeView());
-#endif
   device_scale_factor_ = display::Screen::GetScreen()->
       GetPrimaryDisplay().device_scale_factor();
+  parent_view_ =
+      static_cast<WebContentsImpl*>(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
index 26efada..05e0714 100644 (file)
 
 #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_;
 
index 0e3182c..6bad9c0 100644 (file)
@@ -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<WebContentsImpl*>(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<Evas_Object*>(web_contents->GetNativeView());
-#endif
+  parent_view_ =
+      static_cast<WebContentsImpl*>(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<Elm_Sel_Format>(targets_mask),
-      reinterpret_cast<char*>(drop_data_.get()),
+      base::UTF16ToUTF8(elm_drag_data).c_str(),
       static_cast<Elm_Xdnd_Action>(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);
 
index da355cb..99eb872 100644 (file)
@@ -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<DropData> drop_data_;
-
   // The image used for depicting the drag, and the offset between the cursor
   // and the top left pixel.
   SkBitmap image_;
index d1ffc54..85a125f 100644 (file)
@@ -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\"",
     ]
   }
index 174e2b1..7f1f716 100644 (file)
@@ -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;
   }
index 3254f23..3e32f33 100755 (executable)
@@ -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
index eddd778..de01912 100644 (file)
@@ -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);
index 2e33c0b..21aea88 100644 (file)
@@ -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<ContextMenuItemEfl> ContextMenuControllerEfl::_context_menu_listdata
 ContextMenuControllerEfl::ContextMenuControllerEfl(EWebView* wv,
                                                    WebContents& web_contents)
     : webview_(wv),
-#if !defined(USE_AURA)
-      native_view_(static_cast<Evas_Object*>(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<WebContentsImpl*>(&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;
     }
index 76e4b48..a9a6708 100644 (file)
@@ -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;
index 571af8c..601562e 100644 (file)
@@ -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 (file)
index 0000000..45edebc
Binary files /dev/null and b/tizen_src/ewk/efl_integration/resource/images/broken_image.png differ