Reimplement range and page scale functionality
authorGrzegorz Czajkowski <g.czajkowski@samsung.com>
Mon, 23 Nov 2015 14:53:35 +0000 (15:53 +0100)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 10 Jul 2018 07:55:23 +0000 (07:55 +0000)
minimumPageScaleFactor and maximumPageScaleFactor were removed from
blink::WebView by upstream. Those values were cached by
RenderViewObserverEfl::DidUpdateLayout() to:

1. Prevent user from setting a new scale which is out of the limits.
We don't need to worry about this. Blink will do that for us.

2. Get current scale limits.
Currently it's error prone. For different page (based on their
content width and auto fit calculated scale), call to
ewk_view_scale_range_get() may return different values.
If such functionality is really needed, it should be implemented
using smart callbacks.
Now, ewk_view_scale_range_get() returns default values from
content::WebPreferences.

This commit mostly gets rid of caching scale limits as they are
useless now.

Restore RenderViewObserverEfl::DidChangePageScaleFactor and cache
page scale once it was validated and successfully set by Blink.
This gives us a correct value on Browser side which is currently
using by engine.

Additionally, implemented ubrowser's slider range by using
ewk_view_scale_range_get().

Since the page scale is set asynchronously this patch fixes
utc_blink_ewk_view_scale_get_func.cpp as well.

Bug: http://web.sec.samsung.net/bugzilla/show_bug.cgi?id=12080

Reviewed by: a.renevier, a1.gomes, djmix.kim

Change-Id: I62668f2f0f17a59844022dc0df273576b8dfa4f5
Signed-off-by: Grzegorz Czajkowski <g.czajkowski@samsung.com>
tizen_src/ewk/efl_integration/browser/web_view_browser_message_filter.cc
tizen_src/ewk/efl_integration/common/render_messages_ewk.h
tizen_src/ewk/efl_integration/eweb_view.cc
tizen_src/ewk/efl_integration/eweb_view.h
tizen_src/ewk/efl_integration/renderer/render_view_observer_efl.cc
tizen_src/ewk/efl_integration/renderer/render_view_observer_efl.h
tizen_src/ewk/ubrowser/window.cc
tizen_src/ewk/ubrowser/window.h
tizen_src/ewk/ubrowser/window_ui.cc
tizen_src/ewk/unittest/utc_blink_ewk_view_scale_get_func.cpp

index 5816ecc..de1f162 100644 (file)
@@ -134,11 +134,6 @@ class WebViewBrowserMessageFilterPrivate
       web_view_->OnMHTMLContentGet(mhtml_content, callback_id);
   }
 
-  void OnDidChangePageScaleRange(double min_scale, double max_scale) {
-    if (web_view_)
-      web_view_->DidChangePageScaleRange(min_scale, max_scale);
-  }
-
   void OnDidChangeMaxScrollOffset(int maxScrollX, int maxScrollY) {
     if (web_view_)
       web_view_->GetScrollDetector()->SetMaxScroll(maxScrollX, maxScrollY);
@@ -235,8 +230,6 @@ bool WebViewBrowserMessageFilter::OnMessageReceived(
         WebViewBrowserMessageFilterPrivate::OnMHTMLContentGet)
     IPC_MESSAGE_FORWARD(EwkHostMsg_DidChangePageScaleFactor, private_,
         WebViewBrowserMessageFilterPrivate::OnDidChangePageScaleFactor)
-    IPC_MESSAGE_FORWARD(EwkHostMsg_DidChangePageScaleRange, private_,
-        WebViewBrowserMessageFilterPrivate::OnDidChangePageScaleRange)
     IPC_MESSAGE_FORWARD(EwkHostMsg_DidChangeMaxScrollOffset, private_,
         WebViewBrowserMessageFilterPrivate::OnDidChangeMaxScrollOffset)
     IPC_MESSAGE_FORWARD(EwkHostMsg_DidChangeScrollOffset, private_,
index 78b8ab1..999e627 100644 (file)
@@ -252,10 +252,6 @@ IPC_MESSAGE_ROUTED2(EwkHostMsg_ReadMHTMLData,
 IPC_MESSAGE_ROUTED1(EwkHostMsg_DidChangePageScaleFactor,
                     double /* page scale factor */)
 
-IPC_MESSAGE_ROUTED2(EwkHostMsg_DidChangePageScaleRange,
-                    double, /* minimum page scale factor */
-                    double  /* maximum page scale factor */)
-
 IPC_MESSAGE_ROUTED1(EwkViewMsg_SetDrawsTransparentBackground,
                     bool /* enabled */)
 
index 77c8289..cc55ac2 100644 (file)
@@ -282,8 +282,6 @@ EWebView::EWebView(Ewk_Context* context, Evas_Object* object)
       progress_(0.0),
       hit_test_completion_(false, false),
       page_scale_factor_(1.0),
-      min_page_scale_factor_(-1.0),
-      max_page_scale_factor_(-1.0),
       is_initialized_(false) {
 }
 
@@ -1193,10 +1191,9 @@ void EWebView::Find(const char* text, Ewk_Find_Options find_options) {
 
 void EWebView::SetScale(double scale_factor, int x, int y) {
   RenderViewHost* render_view_host = web_contents_->GetRenderViewHost();
-  //saving the scale value in the proxy variable before sending IPC
-  page_scale_factor_ = std::min(std::max(scale_factor, min_page_scale_factor_),
-                                max_page_scale_factor_);
-  GetWebContentsViewEfl()->SetPageScaleFactor(page_scale_factor_);
+  // Do not cache |scale_factor| here as it may be discarded by Blink's
+  // minimumPageScaleFactor and maximumPageScaleFactor.
+  // |scale_factor| is cached as responde to DidChangePageScaleFactor.
   render_view_host->Send(new EwkViewMsg_Scale(render_view_host->GetRoutingID(), scale_factor, x, y));
 }
 
@@ -1845,15 +1842,20 @@ void EWebView::JavaScriptPromptReply(const char* result) {
 }
 
 void EWebView::GetPageScaleRange(double *min_scale, double *max_scale) {
+  RenderViewHost* render_view_host = web_contents_->GetRenderViewHost();
+  if (!render_view_host) {
+    if (min_scale)
+      *min_scale = -1.f;
+    if (max_scale)
+      *max_scale = -1.f;
+    return;
+  }
+
+  WebPreferences prefs = render_view_host->GetWebkitPreferences();
   if (min_scale)
-    *min_scale = min_page_scale_factor_;
+    *min_scale = prefs.default_minimum_page_scale_factor;
   if (max_scale)
-    *max_scale = max_page_scale_factor_;
-}
-
-void EWebView::DidChangePageScaleRange(double min_scale, double max_scale) {
-  min_page_scale_factor_ = min_scale;
-  max_page_scale_factor_ = max_scale;
+    *max_scale = prefs.default_maximum_page_scale_factor;
 }
 
 void EWebView::SetDrawsTransparentBackground(bool enabled) {
index 0ee9650..5e2f922 100644 (file)
@@ -395,7 +395,6 @@ class EWebView {
   void JavaScriptPromptReply(const char* result);
   void set_renderer_crashed();
   void GetPageScaleRange(double *min_scale, double *max_scale);
-  void DidChangePageScaleRange(double min_scale, double max_scale);
   void SetDrawsTransparentBackground(bool enabled);
   void GetSessionData(const char **data, unsigned *length) const;
   bool RestoreFromSessionData(const char *data, unsigned length);
index a0d2f33..88de0ce 100644 (file)
@@ -146,8 +146,6 @@ RenderViewObserverEfl::RenderViewObserverEfl(
     content::RenderView* render_view,
     ContentRendererClientEfl* render_client)
   : content::RenderViewObserver(render_view),
-    cached_min_page_scale_factor_(-1.0),
-    cached_max_page_scale_factor_(-1.0),
     renderer_client_(render_client)
 {
 }
@@ -341,7 +339,6 @@ void RenderViewObserverEfl::OnGetMHTMLData(int callback_id)
   Send(new EwkHostMsg_ReadMHTMLData(render_view()->GetRoutingID(), content_string, callback_id));
 }
 
-#if !defined(EWK_BRINGUP)
 void RenderViewObserverEfl::DidChangePageScaleFactor()
 {
   blink::WebView* view = render_view()->GetWebView();
@@ -350,7 +347,6 @@ void RenderViewObserverEfl::DidChangePageScaleFactor()
 
   Send(new EwkHostMsg_DidChangePageScaleFactor(render_view()->GetRoutingID(), view->pageScaleFactor()));
 }
-#endif
 
 void RenderViewObserverEfl::DidFailLoad(blink::WebLocalFrame* frame,
                                         const blink::WebURLError& error) {
@@ -383,28 +379,6 @@ void RenderViewObserverEfl::DidFailLoad(blink::WebLocalFrame* frame,
 
 void RenderViewObserverEfl::DidUpdateLayout()
 {
-  blink::WebView* view = render_view()->GetWebView();
-  if (!view)
-    return;
-
-#if !defined(EWK_BRINGUP)
-  float min_scale = view->minimumPageScaleFactor();
-  float max_scale = view->maximumPageScaleFactor();
-#else
-  // TODO: (m42_2311) WebView has no minimumPageScaleFactor, maximumPageScaleFactor
-  float min_scale = 1.0; //view->minimumPageScaleFactor();
-  float max_scale = 5.0; //view->maximumPageScaleFactor();
-#endif
-
-  // Checking for change in minimum and maximum page scale factors
-  if (std::abs(cached_max_page_scale_factor_ - max_scale) < std::numeric_limits<float>::epsilon() &&
-        std::abs(cached_min_page_scale_factor_ - min_scale) < std::numeric_limits<float>::epsilon())
-    return;
-
-  cached_max_page_scale_factor_ = max_scale;
-  cached_min_page_scale_factor_ = min_scale;
-  Send(new EwkHostMsg_DidChangePageScaleRange(render_view()->GetRoutingID(), min_scale, max_scale));
-
   // Check if the timer is already running
   if (check_contents_size_timer_.IsRunning())
     return;
index 94fc023..53c0006 100644 (file)
@@ -49,9 +49,7 @@ class RenderViewObserverEfl: public content::RenderViewObserver {
 
   bool OnMessageReceived(const IPC::Message& message) override;
   virtual void DidCreateDocumentElement(blink::WebLocalFrame* frame) override;
-#if !defined(EWK_BRINGUP)
   virtual void DidChangePageScaleFactor() override;
-#endif
   void DidFailLoad(blink::WebLocalFrame* frame,
                    const blink::WebURLError& error) override;
   void DidFailProvisionalLoad(blink::WebLocalFrame* frame,
@@ -91,8 +89,6 @@ class RenderViewObserverEfl: public content::RenderViewObserver {
   void OnSetViewMode(blink::WebViewMode view_mode);
   void OnSetTextZoomFactor(float zoom_factor);
 
-  float cached_min_page_scale_factor_;
-  float cached_max_page_scale_factor_;
   gfx::Size last_sent_contents_size_;
   base::OneShotTimer check_contents_size_timer_;
 
index 361f433..0bb63af 100644 (file)
@@ -255,6 +255,11 @@ double Window::GetScale() const {
   return ewk_view_scale_get(web_view_);
 }
 
+void Window::GetScaleRange(double* minScale, double* maxScale) const {
+  log_trace("%s", __PRETTY_FUNCTION__);
+  ewk_view_scale_range_get(web_view_, minScale, maxScale);
+}
+
 void Window::SetScale(double scale) {
   log_trace("%s", __PRETTY_FUNCTION__);
   ewk_view_scale_set(web_view_, scale, 0, 0);
index 6c034ca..5a19c4a 100644 (file)
@@ -45,6 +45,7 @@ class Window {
   bool IsFormProfileEnabled() const;
   bool IsPrivateBrowsingEnabled() const;
   double GetScale() const;
+  void GetScaleRange(double* minScale, double* maxScale) const;
   void SetScale(double);
   void Exit() const;
 
index 5769c58..bc16d8e 100644 (file)
@@ -540,6 +540,7 @@ void WindowUI::OnShowZoomPopup(void* data, Evas_Object* obj, void*) {
   Evas_Object* btn = elm_button_add(popup);
 
   Evas_Object* slider = elm_slider_add(popup);
+  thiz->window_.GetScaleRange(&kMinViewScale, &kMaxViewScale);
   elm_slider_min_max_set(slider, kMinViewScale, kMaxViewScale);
   elm_slider_value_set(slider, thiz->window_.GetScale());
   elm_slider_indicator_format_set(slider, "%1.2f");
index 6a00672..5f1a3ef 100755 (executable)
@@ -48,25 +48,27 @@ TEST_F(utc_blink_ewk_view_scale_get, POS_TEST)
   const Evas_Coord centerY = 5;
 
   ASSERT_TRUE(ewk_view_scale_set(GetEwkWebView(), scaleFactor, centerX, centerY));
-  double currentScale = ewk_view_scale_get(GetEwkWebView());
-  ASSERT_LT(abs(scaleFactor - currentScale), precision);
-
   ecore_timer_add(0.5f, mainLoopQuit, this);
   ASSERT_EQ(Success, EventLoopStart());
-
-  currentScale = ewk_view_scale_get(GetEwkWebView());
+  double currentScale = ewk_view_scale_get(GetEwkWebView());
   ASSERT_LT(abs(scaleFactor - currentScale), precision);
 
   ASSERT_TRUE(ewk_view_scale_set(GetEwkWebView(), maxScale + 1, centerX, centerY));
+  ecore_timer_add(0.5f, mainLoopQuit, this);
+  ASSERT_EQ(Success, EventLoopStart());
   currentScale = ewk_view_scale_get(GetEwkWebView());
   ASSERT_LT(abs(maxScale - currentScale), precision);
 
   // Now scale is set to max. Set overscale once again to make sure getter return correct value
   ASSERT_TRUE(ewk_view_scale_set(GetEwkWebView(), maxScale + 1, centerX, centerY));
+  ecore_timer_add(0.5f, mainLoopQuit, this);
+  ASSERT_EQ(Success, EventLoopStart());
   currentScale = ewk_view_scale_get(GetEwkWebView());
   ASSERT_LT(abs(maxScale - currentScale), precision);
 
   ASSERT_TRUE(ewk_view_scale_set(GetEwkWebView(), minScale - 1, centerX, centerY));
+  ecore_timer_add(0.5f, mainLoopQuit, this);
+  ASSERT_EQ(Success, EventLoopStart());
   currentScale = ewk_view_scale_get(GetEwkWebView());
   ASSERT_LT(abs(minScale - currentScale), precision);
 }