[M34-Merge] Implementation of ewk_view_scroll_* API.
authorMichał Pakuła vel Rutka <m.pakula@samsung.com>
Thu, 3 Jul 2014 13:02:08 +0000 (15:02 +0200)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 10 Jul 2018 06:57:09 +0000 (06:57 +0000)
When some changes happend to ScrollView, RenderWidgetHostView received
only information about maximum available scroll offset. There was missing
information about current scroll offset. There was no possibility to get
current offset from browser process. I have added signal which transfers
information about current scroll offset (vertical and horizontal) whenever
it changes.

Added scroll,* smart callback calls after scroll position change. In
addition when scroll,* smart callback occured value returned by
RenderWidgetHost::GetLastScrollPosition was invalid, because value of
GetLastScrollPosition was updated after repaint event occured not after
scroll event. This change was required to return proper value after
scroll,* smart callback call.

RenderWidgetHostView object may not be created on EFL API call.
Thus every time rwhv() method is used (in eweb_view) it must be check
against nullness.

Scroll size is a content size reduced by view port size, so previous
implementation ("Fix Scroll bar does not work properly in Email app")
was wrong. That's why I'm removing it. Test improved in the way it checks
whether API returns non-zero values. Additionally more assertions have
been added to test API with negative values.

When ewk_view_scroll_pos_get is executed just after ewk_view_scroll_set
without running main loop the get function shall return new value even if
engine didn't scroll the page yet

This is a combination of five commits:
Added signal for providing current scroll information.
by Daniel Waslicki,

Change implementation details of scroll position related APIs
http://165.213.202.130:8080/#/c/68588/
by Kamil Klimek, and

ewk_view_scroll_* APIs can cause segmentation fault
http://165.213.202.130:8080/#/c/71201/
Fixup! Fix Scroll bar does not work properly in Email app
http://165.213.202.130:8080/#/c/71568/
ewk_view_scroll_pos_* functions shall behave like synchronous
http://165.213.202.130:8080/#/c/71205/
by Wojciech Bielawski
Reviewed by: Antonio Gomes, SeungSeop Park

Change-Id: I09af9ac17b9f0c0ce53fc832f2fa8b0f884097f0
Signed-off-by: Michał Pakuła vel Rutka <m.pakula@samsung.com>
14 files changed:
tizen_src/ewk/efl_integration/public/ewk_view.cc
tizen_src/ewk/unittest/utc_blink_ewk_view_scroll_pos_get_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_view_scroll_size_get_func.cpp
tizen_src/impl/browser/renderer_host/render_widget_host_view_efl.cc
tizen_src/impl/browser/renderer_host/render_widget_host_view_efl.h
tizen_src/impl/browser/renderer_host/scroll_detector.cc
tizen_src/impl/browser/renderer_host/scroll_detector.h
tizen_src/impl/common/render_messages_efl.h
tizen_src/impl/eweb_view.cc
tizen_src/impl/eweb_view.h
tizen_src/impl/renderer/render_view_observer_efl.cc
tizen_src/impl/renderer/render_view_observer_efl.h
tizen_src/impl/tizen_webview/public/tw_webview.cc
tizen_src/impl/tizen_webview/public/tw_webview.h

index 2799fb6c6c041d49460d7b5591ce7edc7f05a52a..86852f4f90be933d5da94fec5b9f93f39eb0c7f0 100644 (file)
@@ -459,8 +459,7 @@ Eina_Bool ewk_view_scroll_pos_get(Evas_Object* ewkView, int* x, int* y)
   EWK_VIEW_IMPL_GET_OR_RETURN(ewkView, impl, false);
   EINA_SAFETY_ON_NULL_RETURN_VAL(x, EINA_FALSE);
   EINA_SAFETY_ON_NULL_RETURN_VAL(y, EINA_FALSE);
-  impl->GetScrollPosition(x, y);
-  return true;
+  return impl->GetScrollPosition(x, y);
 }
 
 Eina_Bool ewk_view_scroll_set(Evas_Object* view, int x, int y)
@@ -473,6 +472,10 @@ Eina_Bool ewk_view_scroll_set(Evas_Object* view, int x, int y)
 
 Eina_Bool ewk_view_scroll_size_get(const Evas_Object* view, int* width, int* height)
 {
+  if (width)
+    *width = 0;
+  if (height)
+    *height = 0;
   EWK_VIEW_IMPL_GET_OR_RETURN(view, impl, EINA_FALSE);
   impl->GetScrollSize(width,height);
   return EINA_TRUE;
index 667a95bf3518feea40a96900424b511cd02079bc..f56263bafd5c3a5758289fe85ca268af5a39138b 100755 (executable)
@@ -7,33 +7,27 @@
 class utc_blink_ewk_view_scroll_pos_get : public utc_blink_ewk_base
 {
  protected:
-  static void frameRendered(void* data, Evas_Object* eObject, void* dataFinished)
+  void LoadFinished(Evas_Object*)
   {
-    utc_message("[frameRendered] :: \n");
-    if(data)
-      static_cast<utc_blink_ewk_view_scroll_pos_get*>(data)->EventLoopStop(Success);
+    evas_object_focus_set(GetEwkWebView(), EINA_TRUE);
+    EventLoopStop(Success);
   }
 
-  /* Startup function */
-  void PostSetUp()
+  static Eina_Bool quitMainLoop(void* data)
   {
-    evas_object_smart_callback_add(GetEwkWebView(), "frame,rendered", frameRendered, this);
-  }
-
-  /* Cleanup function */
-  void PreTearDown()
-  {
-    evas_object_smart_callback_del(GetEwkWebView(), "frame,rendered", frameRendered);
+    if (data)
+      static_cast<utc_blink_ewk_view_scroll_pos_get*>(data)->EventLoopStop(Success);
+    return EINA_FALSE;
   }
 
 protected:
-  static const char*const resource;
+  static const char* resource;
 };
 
-const char*const utc_blink_ewk_view_scroll_pos_get::resource="/ewk_view/index_big_red_square.html";
+const char* utc_blink_ewk_view_scroll_pos_get::resource="/ewk_view/index_big_red_square.html";
 
 /**
- * @brief Positive test case of ewk_view_scroll_pos_get(),tseting scroll postion against after set, and scroll
+ * @brief Positive test case of ewk_view_scroll_pos_get(), setting scroll position against after set, and scroll
  */
 TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_TEST1)
 {
@@ -51,10 +45,11 @@ TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_TEST1)
   Eina_Bool result = EINA_FALSE;
   if (x == valScrollSet && y == valScrollSet)
     result = EINA_TRUE;
+  ASSERT_TRUE(result);
 }
 
 /**
- * @brief Positive test case of ewk_view_scroll_pos_get(),tseting scroll postion against after set, and scroll
+ * @brief Positive test case of ewk_view_scroll_pos_get(), setting scroll position against after set, and scroll
  */
 TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_TEST2)
 {
@@ -72,6 +67,84 @@ TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_TEST2)
   utc_check_eq(result, EINA_TRUE);
 }
 
+/**
+ * @brief ewk_view_scroll_pos_get() should return the same value as it has been set if main loop wasn't fired
+ */
+TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_TEST3)
+{
+  int x = 0, y = 0;
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(),GetResourceUrl(resource).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ASSERT_TRUE(ewk_view_scroll_set(GetEwkWebView(), 10, 10));
+  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
+  ASSERT_EQ(10, x);
+  ASSERT_EQ(10, y);
+
+  ASSERT_TRUE(ewk_view_scroll_set(GetEwkWebView(), 20, 20));
+  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
+  ASSERT_EQ(20, x);
+  ASSERT_EQ(20, y);
+}
+
+/**
+ * @brief ewk_view_scroll_pos_get() should return proper value after the engine tries to scroll over the page size
+ */
+TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_TEST4)
+{
+  int x = 0, y = 0;
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(),GetResourceUrl(resource).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  int scrollSizeX = -1, scrollSizeY = -1;
+  ASSERT_TRUE(ewk_view_scroll_size_get(GetEwkWebView(), &scrollSizeX, &scrollSizeY));
+
+  int oversizeX = scrollSizeX + 100;
+  ASSERT_TRUE(ewk_view_scroll_set(GetEwkWebView(), oversizeX, 10));
+  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
+  ASSERT_EQ(scrollSizeX, x);
+  ASSERT_EQ(10, y);
+
+  ecore_timer_add(5.0f, quitMainLoop, this);
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
+  ASSERT_NE(scrollSizeX, x);
+  ASSERT_EQ(10, y);
+
+  // Now at the end of the page
+  ASSERT_TRUE(ewk_view_scroll_set(GetEwkWebView(), oversizeX, 10));
+  ecore_timer_add(5.0f, quitMainLoop, this);
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
+  ASSERT_EQ(scrollSizeX, x);
+}
+
+/**
+ * @brief Same as POS_TEST4, but with negative value
+ */
+TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_TEST5)
+{
+  int x = 0, y = 0;
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(),GetResourceUrl(resource).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ASSERT_TRUE(ewk_view_scroll_set(GetEwkWebView(), -100, 10));
+  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
+  ASSERT_EQ(0, x);
+  ASSERT_EQ(10, y);
+
+  ecore_timer_add(5.0f, quitMainLoop, this);
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
+  ASSERT_EQ(0, x);
+  ASSERT_EQ(10, y);
+}
+
 /**
  * @brief Negative test case of ewk_view_scroll_pos_get(), testing for null
  */
index 3b1086c2b7f67694c554c2cee2791726aa77abda..4a8bf5e48967fc0953b27e2bc53ac966846e996e 100755 (executable)
@@ -35,13 +35,13 @@ const char*const utc_blink_ewk_view_scroll_size_get::resource="/ewk_view/index_b
  */
 TEST_F(utc_blink_ewk_view_scroll_size_get, POS_TEST)
 {
-  if(!ewk_view_url_set(GetEwkWebView(),GetResourceUrl(resource).c_str()))
-    utc_fail();
-  if(Success!=EventLoopStart())
-    utc_fail();
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(),GetResourceUrl(resource).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
 
-  int xPossibleScrollArea, yPossibleScrollArea;
-  utc_check_eq(ewk_view_scroll_size_get(GetEwkWebView(), &xPossibleScrollArea, &yPossibleScrollArea), EINA_TRUE);
+  int xPossibleScrollArea = 0, yPossibleScrollArea = 0;
+  ASSERT_TRUE(ewk_view_scroll_size_get(GetEwkWebView(), &xPossibleScrollArea, &yPossibleScrollArea));
+  ASSERT_GT(xPossibleScrollArea, 0);
+  ASSERT_GT(yPossibleScrollArea, 0);
 }
 
 /**
@@ -49,6 +49,19 @@ TEST_F(utc_blink_ewk_view_scroll_size_get, POS_TEST)
   */
 TEST_F(utc_blink_ewk_view_scroll_size_get, NEG_TEST)
 {
-  int xPossibleScrollArea, yPossibleScrollArea;
-  utc_check_eq(ewk_view_scroll_size_get(NULL, &xPossibleScrollArea,&yPossibleScrollArea), EINA_FALSE);
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(),GetResourceUrl(resource).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  int xPossibleScrollArea = 0, yPossibleScrollArea = 0;
+  ASSERT_TRUE(ewk_view_scroll_size_get(GetEwkWebView(), NULL, &yPossibleScrollArea));
+  ASSERT_GT(yPossibleScrollArea, 0);
+
+  ASSERT_TRUE(ewk_view_scroll_size_get(GetEwkWebView(), &xPossibleScrollArea, NULL));
+  ASSERT_GT(xPossibleScrollArea, 0);
+
+  ASSERT_TRUE(ewk_view_scroll_size_get(GetEwkWebView(), NULL, NULL));
+
+  ASSERT_FALSE(ewk_view_scroll_size_get(NULL, &xPossibleScrollArea, &yPossibleScrollArea));
+  ASSERT_EQ(0, xPossibleScrollArea);
+  ASSERT_EQ(0, yPossibleScrollArea);
 }
index 7e53c576f99c4239b4f696401ac0dacb24c6dda7..c012b8ffd35f88286daf93f68a8966e77a37b73c 100755 (executable)
@@ -106,7 +106,8 @@ RenderWidgetHostViewEfl::RenderWidgetHostViewEfl(RenderWidgetHost* widget, EWebV
     next_pixmap_id_(0),
     surface_id_(0),
     is_hw_accelerated_(true),
-    is_modifier_key_(false) {
+    is_modifier_key_(false),
+    scroll_offset_changed_(false) {
 
 #if defined(OS_TIZEN)
 #if !defined(EWK_BRINGUP)
@@ -389,6 +390,7 @@ bool RenderWidgetHostViewEfl::OnMessageReceived(const IPC::Message& message) {
     IPC_MESSAGE_HANDLER(EwkHostMsg_OrientationChangeEvent, OnOrientationChangeEvent)
     IPC_MESSAGE_HANDLER(EwkViewMsg_SelectionTextStyleState, OnSelectionTextStyleState)
     IPC_MESSAGE_HANDLER(EwkHostMsg_DidChangeMaxScrollOffset, OnDidChangeMaxScrollOffset)
+    IPC_MESSAGE_HANDLER(EwkHostMsg_DidChangeScrollOffset, OnDidChangeScrollOffset)
     IPC_MESSAGE_HANDLER(EwkHostMsg_ReadMHTMLData, OnMHTMLContentGet)
     IPC_MESSAGE_HANDLER(EwkHostMsg_DidChangePageScaleFactor, OnDidChangePageScaleFactor)
     IPC_MESSAGE_HANDLER(EwkHostMsg_DidChangePageScaleRange, OnDidChangePageScaleRange)
@@ -1388,6 +1390,11 @@ void RenderWidgetHostViewEfl::OnDidChangeMaxScrollOffset(int maxScrollX, int max
   scroll_detector_->SetMaxScroll(maxScrollX, maxScrollY);
 }
 
+void RenderWidgetHostViewEfl::OnDidChangeScrollOffset(int scrollX, int scrollY) {
+  scroll_detector_->OnChangeScrollOffset(web_view_, gfx::Vector2d(scrollX, scrollY));
+  scroll_offset_changed_ = false;
+}
+
 void RenderWidgetHostViewEfl::SelectRange(const gfx::Point& start, const gfx::Point& end) {
   RenderViewHost* rvh =  RenderViewHost::From(host_);
   WebContentsImpl* wci = static_cast<WebContentsImpl*>(
@@ -1556,4 +1563,7 @@ void RenderWidgetHostViewEfl::SetViewMode(tizen_webview::View_Mode view_mode) {
   host_->Send(new ViewMsg_SetViewMode(host_->GetRoutingID(), view_mode_for_blink));
 }
 
+gfx::Vector2d RenderWidgetHostViewEfl::scroll_offset() const {
+  return scroll_detector_->GetLastScrollPosition();
+}
 }  // namespace content
index 5aea29ac1d536290bf4a595b6bd976b17bb3aa37..f0956a9be0786512e17c386a9367a2b477803161 100755 (executable)
@@ -169,6 +169,7 @@ class RenderWidgetHostViewEfl
 
   void OnSelectionTextStyleState(const SelectionStylePrams& params);
   void OnDidChangeMaxScrollOffset(int maxScrollX, int maxScrollY);
+  void OnDidChangeScrollOffset(int scrollX, int scrollY);
 
 #ifdef OS_TIZEN
   void FilterInputMotion(const blink::WebGestureEvent& gesture_event);
@@ -191,6 +192,7 @@ class RenderWidgetHostViewEfl
   EWebView* eweb_view() const { return web_view_; }
   RenderWidgetHostImpl* host() const { return host_; }
   IMContextEfl* im_context() const { return im_context_; }
+  gfx::Vector2d scroll_offset() const;
 
   float device_scale_factor() const { return device_scale_factor_; }
 
@@ -230,6 +232,9 @@ class RenderWidgetHostViewEfl
 
   void SetComposition(const ui::CompositionText& composition_text);
   void ConfirmComposition(base::string16& text);
+  
+  bool IsScrollOffsetChanged() const { return scroll_offset_changed_; }
+  void SetScrollOffsetChanged() { scroll_offset_changed_ = true; }
 
  protected:
   friend class RenderWidgetHostView;
@@ -340,6 +345,8 @@ class RenderWidgetHostViewEfl
 
   // The last scroll offset of the view.
   gfx::Vector2dF last_scroll_offset_;
+  gfx::Point scroll_offset_;
+  bool scroll_offset_changed_;
 
   gpu::Mailbox pending_mailbox_;
 
index b96c6fa90de9c9085e99076619f6127ca6ca4d81..0117e8b0ff30778c668ef9a685ee918892d8c9fe 100644 (file)
@@ -15,9 +15,14 @@ ScrollDetector::ScrollDetector()
       edge_Flag_(false) {
 }
 
-void ScrollDetector::OnChangeScrollOffset(EWebView* web_view, const gfx::Vector2d& scroll_delta) {
+void ScrollDetector::OnChangeScrollOffset(EWebView* web_view,
+    const gfx::Vector2d& scroll_position) {
   edge_Flag_ = true;
 
+  gfx::Vector2d scroll_delta = scroll_position;
+  scroll_delta -= last_scroll_position_;
+  last_scroll_position_ = scroll_position;
+
   DetectEdge(web_view, scroll_delta);
 
   if (edge_Flag_ && scroll_delta.x() > 0)
@@ -31,17 +36,13 @@ void ScrollDetector::OnChangeScrollOffset(EWebView* web_view, const gfx::Vector2
 }
 
 void ScrollDetector::DetectEdge(EWebView* web_view, const gfx::Vector2d& scroll_delta) {
-  int x, y; //current scroll position
-  web_view->GetScrollPosition(&x, &y);
-
-  if (last_scroll_position_.x() != x)
-    CheckForLeftRightEdges(web_view, x);
-
-  if (last_scroll_position_.y() != y)
-    CheckForTopBottomEdges(web_view, y);
+  if (scroll_delta.x()) {
+    CheckForLeftRightEdges(web_view, last_scroll_position_.x());
+  }
 
-  last_scroll_position_.set_x(x);
-  last_scroll_position_.set_y(y);
+  if (scroll_delta.y()) {
+    CheckForTopBottomEdges(web_view, last_scroll_position_.y());
+  }
 }
 
 void ScrollDetector::SetMaxScroll(int x, int y) {
index 377718eabc2c75e1155060c8ea1523bfb03ab260..9807bc130b6588bede69ef1cd442f3dbc2e4591b 100644 (file)
@@ -14,8 +14,10 @@ namespace EflWebview {
 class ScrollDetector {
  public:
   ScrollDetector();
-  void OnChangeScrollOffset(EWebView* web_view, const gfx::Vector2d& scroll_delta);
+  void OnChangeScrollOffset(EWebView* web_view,
+                            const gfx::Vector2d& scroll_position);
   void SetMaxScroll(int x, int y);
+  gfx::Vector2d GetLastScrollPosition() const { return last_scroll_position_; }
 
  private:
   void DetectEdge(EWebView* web_view, const gfx::Vector2d& scroll_delta);
index 020773052c954aed63200c6931899cc0eefbe5ef..fe306b3fa0314aad003fe737956d4847ca084563 100644 (file)
@@ -235,6 +235,10 @@ IPC_MESSAGE_ROUTED2(EwkHostMsg_DidChangeMaxScrollOffset,
                     int, /*max scrollX*/
                     int  /*max scrollY*/)
 
+IPC_MESSAGE_ROUTED2(EwkHostMsg_DidChangeScrollOffset,
+                    int, /*scrollX*/
+                    int  /*scrollY*/)
+
 IPC_MESSAGE_CONTROL3(EwkViewHostMsg_HitTestReply,
                     int, /* render_view_id */
                     _Ewk_Hit_Test, /* Ewk Hit test data without node map */
index 0576037dc2ff4b302d250fb3fa4e9560f3d9691f..befb43a552c82b0500312debf9e46a1ffc24da47 100644 (file)
@@ -1058,12 +1058,23 @@ void EWebView::SetScale(double scale_factor, int x, int y) {
   render_view_host->Send(new EwkViewMsg_Scale(render_view_host->GetRoutingID(), scale_factor, x, y));
 }
 
-void EWebView::GetScrollPosition(int* x, int* y) const {
+bool EWebView::GetScrollPosition(int* x, int* y) const {
   DCHECK(x);
   DCHECK(y);
-  const gfx::Vector2dF scroll_position = rwhv()->GetLastScrollOffset();
-  *x = scroll_position.x();
-  *y = scroll_position.y();
+  if (!rwhv()) {
+    *y = *x = 0;
+    return false;
+  }
+
+  if (rwhv()->IsScrollOffsetChanged()) {
+    *x = previous_scroll_position_.x();
+    *y = previous_scroll_position_.y();
+  } else {
+    const gfx::Vector2d scroll_position = rwhv()->scroll_offset();
+    *x = scroll_position.x();
+    *y = scroll_position.y();
+  }
+  return true;
 }
 
 void EWebView::SetScroll(int x, int y) {
@@ -1071,6 +1082,14 @@ void EWebView::SetScroll(int x, int y) {
   if (!render_view_host)
     return;
 
+  if (rwhv()) {
+    rwhv()->SetScrollOffsetChanged();
+    int maxX, maxY;
+    GetScrollSize(&maxX, &maxY);
+    previous_scroll_position_.set_x(std::min(std::max(x, 0), maxX));
+    previous_scroll_position_.set_y(std::min(std::max(y, 0), maxY));
+  }
+
   render_view_host->Send(new EwkViewMsg_SetScroll(render_view_host->GetRoutingID(), x, y));
 }
 
@@ -1081,7 +1100,6 @@ void EWebView::UseSettingsFont() {
 }
 
 void EWebView::DidChangeContentsArea(int width, int height) {
-  contents_area_ = gfx::Size(width, height);
 }
 
 void EWebView::DidChangeContentsSize(int width, int height) {
@@ -1103,17 +1121,10 @@ void EWebView::GetScrollSize(int* width, int* height) {
   Eina_Rectangle last_view_port =
       WebViewDelegate::GetInstance()->GetLastUsedViewPortArea(evas_object());
 
-#ifdef OS_TIZEN
-  if (width && contents_area_.width() > last_view_port.w)
-    *width = contents_area_.width() - last_view_port.w;
-  if (height && contents_area_.height() > last_view_port.h)
-    *height = contents_area_.height() - last_view_port.h;
-#else
   if (width && contents_size_.width() > last_view_port.w)
     *width = contents_size_.width() - last_view_port.w;
   if (height && contents_size_.height() > last_view_port.h)
     *height = contents_size_.height() - last_view_port.h;
-#endif
 }
 
 void EWebView::SelectRange(const gfx::Point& start, const gfx::Point& end) {
index eed38918ea483395b63681f65d0a47ddc9b72879..91bcff041e3bb29591e869184111a3e5cd50a19f 100644 (file)
@@ -270,7 +270,7 @@ class EWebView {
   void ShowContextMenu(const content::ContextMenuParams& params, content::ContextMenuType type = content::MENU_TYPE_LINK);
   void CancelContextMenu(int request_id);
   void SetScale(double scale_factor, int x, int y);
-  void GetScrollPosition(int* x, int* y) const;
+  bool GetScrollPosition(int* x, int* y) const;
   void SetScroll(int x, int y);
   void UrlRequestSet(const char* url, std::string method, Eina_Hash* headers, const char* body);
 
@@ -462,7 +462,6 @@ class EWebView {
   static int find_request_id_counter_;
   IDMap<EwkViewPlainTextGetCallback, IDMapOwnPointer> plain_text_get_callback_map_;
   gfx::Size contents_size_;
-  gfx::Size contents_area_;
   double progress_;
   mutable std::string title_;
   _Ewk_Hit_Test hit_test_data_;
@@ -494,6 +493,8 @@ class EWebView {
   scoped_ptr<tizen_webview::BackForwardList> back_forward_list_;
 
 private:
+  gfx::Vector2d previous_scroll_position_;
+
   // only tizen_webview::WebView can create and delete this
   EWebView(tizen_webview::WebView* owner, tizen_webview::WebContext*, Evas_Object* smart_object);
   ~EWebView();
index ca947307a3024a6e0ec8d8288058467ad0540f3f..d286671a31d7919067b2db76aca468d8f7a94cf6 100644 (file)
@@ -223,12 +223,19 @@ void RenderViewObserverEfl::DidChangeScrollOffset(blink::WebLocalFrame* frame)
   if (!frame || (render_view()->GetWebView()->mainFrame() != frame))
     return;
 
-  if (max_scroll_offset_ != frame->maximumScrollOffset()) { //Check for change in MaxScrollOffset
+  if (max_scroll_offset_ != frame->maximumScrollOffset()) {
     max_scroll_offset_ = frame->maximumScrollOffset();
     Send(new EwkHostMsg_DidChangeMaxScrollOffset(render_view()->GetRoutingID(),
                                                  frame->maximumScrollOffset().width,
                                                  frame->maximumScrollOffset().height));
   }
+
+  if(last_scroll_offset_ != frame->scrollOffset()) {
+    last_scroll_offset_ = frame->scrollOffset();
+    Send(new EwkHostMsg_DidChangeScrollOffset(render_view()->GetRoutingID(),
+                                              frame->scrollOffset().width,
+                                              frame->scrollOffset().height));
+  }
 }
 
 void RenderViewObserverEfl::OnGetSelectionStyle()
index 43216b9334d6c95b462df4220490792ba0241f4b..b39c76fb9c11bef2d7e3fdd83543103127f97160 100644 (file)
@@ -75,6 +75,7 @@ class RenderViewObserverEfl: public content::RenderViewObserver {
   void OnSetViewMode(blink::WebViewMode view_mode);
 
   blink::WebSize max_scroll_offset_;
+  blink::WebSize last_scroll_offset_;
   float cached_min_page_scale_factor_;
   float cached_max_page_scale_factor_;
   gfx::Size last_sent_contents_size_;
index 6ed055ed5c2f01ceb7846288cb6e5e632ff432fe..3e191ef40ba85fe96a7c63d78e9b2bbe4d87782e 100644 (file)
@@ -265,7 +265,7 @@ void WebView::DidChangePageScaleRange(double min_scale, double max_scale) {
   return impl_->DidChangePageScaleRange(min_scale, max_scale);
 }
 
-void WebView::GetScrollPosition(int* x, int* y) const {
+bool WebView::GetScrollPosition(int* x, int* y) const {
   return impl_->GetScrollPosition(x, y);
 }
 
index 58487a7f7f98e8312216a724a35b5e9fb47e06bd..40ac0eada61a3a902dbb8f3e22d4dab96d2101b7 100644 (file)
@@ -127,7 +127,7 @@ class WebView {
   void GetPageScaleRange(double *min_scale, double *max_scale);
   void DidChangePageScaleRange(double min_scale, double max_scale);
   // > View Scroll
-  void GetScrollPosition(int* x, int* y) const;
+  bool GetScrollPosition(int* x, int* y) const;
   void SetScroll(int x, int y);       // TODO: rename to ScrollTo (x,y) x,y is left top (see GetScrollSize)
   void GetScrollSize(int* w, int* h); // TODO: rename to GetPossibleScrollSize
   // > View Orientation