From 42c07c2e367b63473290887fda5e1f85fb24e9a5 Mon Sep 17 00:00:00 2001 From: Grzegorz Czajkowski Date: Mon, 23 Nov 2015 15:53:35 +0100 Subject: [PATCH] Reimplement range and page scale functionality 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 --- .../browser/web_view_browser_message_filter.cc | 7 ------ .../efl_integration/common/render_messages_ewk.h | 4 ---- tizen_src/ewk/efl_integration/eweb_view.cc | 28 ++++++++++++---------- tizen_src/ewk/efl_integration/eweb_view.h | 1 - .../renderer/render_view_observer_efl.cc | 26 -------------------- .../renderer/render_view_observer_efl.h | 4 ---- tizen_src/ewk/ubrowser/window.cc | 5 ++++ tizen_src/ewk/ubrowser/window.h | 1 + tizen_src/ewk/ubrowser/window_ui.cc | 1 + .../unittest/utc_blink_ewk_view_scale_get_func.cpp | 12 ++++++---- 10 files changed, 29 insertions(+), 60 deletions(-) diff --git a/tizen_src/ewk/efl_integration/browser/web_view_browser_message_filter.cc b/tizen_src/ewk/efl_integration/browser/web_view_browser_message_filter.cc index 5816ecc..de1f162 100644 --- a/tizen_src/ewk/efl_integration/browser/web_view_browser_message_filter.cc +++ b/tizen_src/ewk/efl_integration/browser/web_view_browser_message_filter.cc @@ -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_, diff --git a/tizen_src/ewk/efl_integration/common/render_messages_ewk.h b/tizen_src/ewk/efl_integration/common/render_messages_ewk.h index 78b8ab1..999e627 100644 --- a/tizen_src/ewk/efl_integration/common/render_messages_ewk.h +++ b/tizen_src/ewk/efl_integration/common/render_messages_ewk.h @@ -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 */) diff --git a/tizen_src/ewk/efl_integration/eweb_view.cc b/tizen_src/ewk/efl_integration/eweb_view.cc index 77c8289..cc55ac2 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.cc +++ b/tizen_src/ewk/efl_integration/eweb_view.cc @@ -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) { diff --git a/tizen_src/ewk/efl_integration/eweb_view.h b/tizen_src/ewk/efl_integration/eweb_view.h index 0ee9650..5e2f922 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.h +++ b/tizen_src/ewk/efl_integration/eweb_view.h @@ -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); diff --git a/tizen_src/ewk/efl_integration/renderer/render_view_observer_efl.cc b/tizen_src/ewk/efl_integration/renderer/render_view_observer_efl.cc index a0d2f33..88de0ce 100644 --- a/tizen_src/ewk/efl_integration/renderer/render_view_observer_efl.cc +++ b/tizen_src/ewk/efl_integration/renderer/render_view_observer_efl.cc @@ -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::epsilon() && - std::abs(cached_min_page_scale_factor_ - min_scale) < std::numeric_limits::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; diff --git a/tizen_src/ewk/efl_integration/renderer/render_view_observer_efl.h b/tizen_src/ewk/efl_integration/renderer/render_view_observer_efl.h index 94fc023..53c0006 100644 --- a/tizen_src/ewk/efl_integration/renderer/render_view_observer_efl.h +++ b/tizen_src/ewk/efl_integration/renderer/render_view_observer_efl.h @@ -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_; diff --git a/tizen_src/ewk/ubrowser/window.cc b/tizen_src/ewk/ubrowser/window.cc index 361f433..0bb63af 100644 --- a/tizen_src/ewk/ubrowser/window.cc +++ b/tizen_src/ewk/ubrowser/window.cc @@ -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); diff --git a/tizen_src/ewk/ubrowser/window.h b/tizen_src/ewk/ubrowser/window.h index 6c034ca..5a19c4a 100644 --- a/tizen_src/ewk/ubrowser/window.h +++ b/tizen_src/ewk/ubrowser/window.h @@ -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; diff --git a/tizen_src/ewk/ubrowser/window_ui.cc b/tizen_src/ewk/ubrowser/window_ui.cc index 5769c58..bc16d8e 100644 --- a/tizen_src/ewk/ubrowser/window_ui.cc +++ b/tizen_src/ewk/ubrowser/window_ui.cc @@ -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"); diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_view_scale_get_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_view_scale_get_func.cpp index 6a00672..5f1a3ef 100755 --- a/tizen_src/ewk/unittest/utc_blink_ewk_view_scale_get_func.cpp +++ b/tizen_src/ewk/unittest/utc_blink_ewk_view_scale_get_func.cpp @@ -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); } -- 2.7.4