[M108 Migration] Migrate patches related to contents size and page scale factor 41/286641/2
authorayush.k123 <ayush.k123@samsung.com>
Tue, 10 Jan 2023 10:07:41 +0000 (15:37 +0530)
committerAyush Kumar <ayush.k123@samsung.com>
Wed, 11 Jan 2023 03:19:26 +0000 (08:49 +0530)
This patch enables proper functionality for below ewk apis:
ewk_view_contents_size_*
ewk_view_scale_*
ewk_view_scroll_*

References: https://review.tizen.org/gerrit/273350/

Change-Id: Id50aaf1abfa970288be3e6953c92a057927ef934
Signed-off-by: Ayush Kumar <ayush.k123@samsung.com>
17 files changed:
content/public/renderer/render_frame_observer.h
content/renderer/render_frame_impl.cc
content/renderer/render_frame_impl.h
third_party/blink/public/web/web_local_frame_client.h
third_party/blink/renderer/core/exported/web_view_impl.cc
tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc
tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h
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/public/ewk_view.cc
tizen_src/ewk/efl_integration/renderer/render_frame_observer_efl.cc
tizen_src/ewk/efl_integration/renderer/render_frame_observer_efl.h
tizen_src/ewk/efl_integration/web_contents_delegate_efl.cc
tizen_src/ewk/efl_integration/web_contents_delegate_efl.h
tizen_src/ewk/unittest/utc_blink_ewk_view_scale_set_func.cpp [changed mode: 0755->0644]

index 0af40eb..99e8ad2 100644 (file)
@@ -125,6 +125,9 @@ class CONTENT_EXPORT RenderFrameObserver : public IPC::Listener,
   // being created occurs).
   virtual void DidCreateNewDocument() {}
   virtual void DidCreateDocumentElement() {}
+#if BUILDFLAG(IS_EFL)
+  virtual void DidUpdateMainFrameLayout() {}
+#endif
   // TODO(dgozman): replace next two methods with DidFinishNavigation.
   // DidCommitProvisionalLoad is only called for new-document navigations.
   // Use DidFinishSameDocumentNavigation for same-document navigations.
index e8d27f6..efba244 100644 (file)
@@ -3893,6 +3893,13 @@ void RenderFrameImpl::DidDispatchDOMContentLoadedEvent() {
   UpdateEncoding(frame_, frame_->View()->PageEncoding().Utf8());
 }
 
+#if BUILDFLAG(IS_EFL)
+void RenderFrameImpl::DidUpdateMainFrameLayout() {
+  for (auto& observer : observers_)
+    observer.DidUpdateMainFrameLayout();
+}
+#endif
+
 void RenderFrameImpl::RunScriptsAtDocumentReady() {
   DCHECK(initialized_);
   GetContentClient()->renderer()->RunScriptsAtDocumentEnd(this);
index 0e1296d..8e056c3 100644 (file)
@@ -540,6 +540,9 @@ class CONTENT_EXPORT RenderFrameImpl
       blink::WebDocumentLoader* document_loader) override;
   void DidClearWindowObject() override;
   void DidCreateDocumentElement() override;
+#if BUILDFLAG(IS_EFL)
+  void DidUpdateMainFrameLayout() override;
+#endif
   void RunScriptsAtDocumentElementAvailable() override;
   void DidReceiveTitle(const blink::WebString& title) override;
   void DidDispatchDOMContentLoadedEvent() override;
index 149ca59..05ddf22 100644 (file)
@@ -377,6 +377,10 @@ class BLINK_EXPORT WebLocalFrameClient {
   // This method may not invalidate the frame, nor execute JavaScript code.
   virtual void DidCreateDocumentElement() {}
 
+#if BUILDFLAG(IS_EFL)
+  virtual void DidUpdateMainFrameLayout() {}
+#endif
+
   // Like |didCreateDocumentElement|, except this method may run JavaScript
   // code (and possibly invalidate the frame).
   virtual void RunScriptsAtDocumentElementAvailable() {}
index 33cd38a..604c0e0 100644 (file)
@@ -3561,6 +3561,11 @@ void WebViewImpl::MainFrameLayoutUpdated() {
   if (!web_view_client_)
     return;
 
+#if BUILDFLAG(IS_EFL)
+  if (MainFrameImpl() && MainFrameImpl()->Client())
+    MainFrameImpl()->Client()->DidUpdateMainFrameLayout();
+#endif
+
   for (auto& observer : observers_)
     observer.DidUpdateMainFrameLayout();
   needs_preferred_size_update_ = true;
index 80685b6..8b5be5b 100644 (file)
@@ -586,4 +586,32 @@ int RWHVAuraOffscreenHelperEfl::GetTopControlsHeight() {
   return y;
 }
 
+gfx::Rect RWHVAuraOffscreenHelperEfl::GetViewBoundsInPix() const {
+  int x, y, w, h;
+  evas_object_geometry_get(content_image_, &x, &y, &w, &h);
+  return gfx::Rect(x, y, w, h);
+}
+
+const gfx::Size RWHVAuraOffscreenHelperEfl::GetScrollableSize() const {
+  int width = 0;
+  int height = 0;
+  gfx::Rect viewport_size = GetViewBoundsInPix();
+  if (scaled_contents_size_.width() > viewport_size.width()) {
+    width = scaled_contents_size_.width() - viewport_size.width();
+    // When device scale factor is larger than 1.0, content size is ceiled up
+    // during converting pixel to dip in RenderWidgetHostViewEfl::GetViewBounds.
+    // So we ignore when scroll size is 1. It is also same for height.
+    // Please refer to https://review.tizen.org/gerrit/#/c/74044/.
+    if (device_scale_factor_ > 1.0f && width == 1)
+      width = 0;
+  }
+  if (scaled_contents_size_.height() > viewport_size.height()) {
+    height = scaled_contents_size_.height() - viewport_size.height();
+    if (device_scale_factor_ > 1.0f && height == 1)
+      height = 0;
+  }
+
+  return gfx::Size(width, height);
+}
+
 }  // namespace content
index 6c49df0..661f6da 100644 (file)
@@ -54,6 +54,10 @@ class CONTENT_EXPORT RWHVAuraOffscreenHelperEfl {
   void SetCustomViewportSize(const gfx::Size& size);
   gfx::Size GetPhysicalBackingSize() const;
   gfx::Rect GetViewBoundsInPix() const;
+  const gfx::Size GetScrollableSize() const;
+  void SetScaledContentSize(const gfx::SizeF& size) {
+    scaled_contents_size_ = size;
+  }
   int GetTopControlsHeight();
 
   void Focus(bool focus);
index b777dea..3dc018f 100644 (file)
@@ -108,22 +108,11 @@ class WebViewBrowserMessageFilterPrivate
       web_view_->InvokeWebAppCapableGetCallback(capable, callback_id);
   }
 
-  void OnDidChangeContentsSize(int width, int height) {
-    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-    if (web_view_)
-      web_view_->DidChangeContentsSize(width, height);
-  }
-
   void OnSelectionTextStyleState(const SelectionStylePrams& params) {
     if (web_view_)
       web_view_->OnQuerySelectionStyleReply(params);
   }
 
-  void OnDidChangePageScaleFactor(double scale_factor) {
-    if (web_view_)
-      web_view_->DidChangePageScaleFactor(scale_factor);
-  }
-
   void OnMHTMLContentGet(const std::string& mhtml_content, int callback_id) {
     if (web_view_)
       web_view_->OnMHTMLContentGet(mhtml_content, callback_id);
@@ -197,7 +186,6 @@ void WebViewBrowserMessageFilter::OverrideThreadForMessage(
     case EwkHostMsg_WebAppIconUrlGet::ID:
     case EwkHostMsg_WebAppIconUrlsGet::ID:
     case EwkHostMsg_WebAppCapableGet::ID:
-    case EwkHostMsg_DidChangeContentsSize::ID:
       *thread = BrowserThread::UI;
       break;
   }
@@ -221,14 +209,10 @@ bool WebViewBrowserMessageFilter::OnMessageReceived(
         WebViewBrowserMessageFilterPrivate::OnWebAppIconUrlsGet)
     IPC_MESSAGE_FORWARD(EwkHostMsg_WebAppCapableGet, private_,
         WebViewBrowserMessageFilterPrivate::OnWebAppCapableGet)
-    IPC_MESSAGE_FORWARD(EwkHostMsg_DidChangeContentsSize, private_,
-        WebViewBrowserMessageFilterPrivate::OnDidChangeContentsSize)
     IPC_MESSAGE_FORWARD(EwkViewMsg_SelectionTextStyleState, private_,
         WebViewBrowserMessageFilterPrivate::OnSelectionTextStyleState)
     IPC_MESSAGE_FORWARD(EwkHostMsg_ReadMHTMLData, private_,
         WebViewBrowserMessageFilterPrivate::OnMHTMLContentGet)
-    IPC_MESSAGE_FORWARD(EwkHostMsg_DidChangePageScaleFactor, private_,
-        WebViewBrowserMessageFilterPrivate::OnDidChangePageScaleFactor)
     IPC_MESSAGE_FORWARD(EwkHostMsg_DidChangeMaxScrollOffset, private_,
         WebViewBrowserMessageFilterPrivate::OnDidChangeMaxScrollOffset)
     IPC_MESSAGE_FORWARD(EwkHostMsg_DidChangeScrollOffset, private_,
index 273fd8a..ce935e3 100644 (file)
@@ -159,11 +159,6 @@ IPC_SYNC_MESSAGE_ROUTED0_2(EwkHostMsg_GetContentSecurityPolicy,
                            std::string, /* policy */
                            Ewk_CSP_Header_Type /* header type */)
 
-IPC_MESSAGE_ROUTED3(EwkViewMsg_Scale,
-                    double, /* scale factor */
-                    int, /* center x */
-                    int /* center y */)
-
 IPC_MESSAGE_ROUTED1(EwkHostMsg_DidPrintPagesToPdf,
                     DidPrintPagesParams /* pdf document parameters */)
 
@@ -234,9 +229,6 @@ IPC_MESSAGE_ROUTED2(EwkHostMsg_ReadMHTMLData,
                     std::string, /* Mhtml text */
                     int /* callback id */)
 
-IPC_MESSAGE_ROUTED1(EwkHostMsg_DidChangePageScaleFactor,
-                    double /* page scale factor */)
-
 IPC_MESSAGE_ROUTED1(EwkViewMsg_SetDrawsTransparentBackground,
                     bool /* enabled */)
 
index cd892ab..15c34bc 100644 (file)
@@ -1192,24 +1192,20 @@ void EWebView::Find(const char* text, Ewk_Find_Options find_options) {
 #endif
 }
 
-void EWebView::SetScale(double scale_factor, int x, int y) {
-#if !defined(EWK_BRINGUP)  // FIXME: m94 bringup
-  RenderViewHost* render_view_host = web_contents_->GetRenderViewHost();
+void EWebView::SetScale(double 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));
-#endif
+  WebContentsImpl* wci = static_cast<WebContentsImpl*>(web_contents_.get());
+  wci->GetPrimaryMainFrame()->GetAssociatedLocalMainFrame()->SetScaleFactor(
+      scale_factor);
 }
 
 bool EWebView::GetScrollPosition(int* x, int* y) const {
-#if !defined(USE_AURA)
-  if (!rwhv()) {
-    LOG(ERROR) << "rwhv() returns nullptr";
+  if (!rwhva()) {
+    LOG(ERROR) << "rwhva() returns nullptr";
     return false;
   }
-#endif
   if (scroll_detector_->IsScrollOffsetChanged()) {
     if (x)
       *x = previous_scroll_position_.x();
@@ -1234,12 +1230,10 @@ bool EWebView::GetScrollPosition(int* x, int* y) const {
 }
 
 void EWebView::ChangeScroll(int& x, int& y) {
-#if !defined(USE_AURA)
-  if (!rwhv()) {
-    LOG(ERROR) << "rwhv() returns nullptr";
+  if (!rwhva()) {
+    LOG(ERROR) << "rwhva() returns nullptr";
     return;
   }
-#endif
   int max_x = 0;
   int max_y = 0;
   GetScrollSize(&max_x, &max_y);
@@ -1285,6 +1279,7 @@ void EWebView::UseSettingsFont() {
 void EWebView::DidChangeContentsSize(int width, int height) {
   contents_size_ = gfx::Size(width, height);
   SmartCallback<EWebViewCallbacks::ContentsSizeChanged>().call();
+  SetScaledContentsSize();
 }
 
 const Eina_Rectangle EWebView::GetContentsSize() const {
@@ -1294,23 +1289,31 @@ const Eina_Rectangle EWebView::GetContentsSize() const {
   return rect;
 }
 
-void EWebView::GetScrollSize(int* width, int* height) {
-  if (width)
-    *width = 0;
-  if (height)
-    *height = 0;
+void EWebView::SetScaledContentsSize() {
+  if (!rwhva())
+    return;  // LCOV_EXCL_LINE
 
-  Eina_Rectangle last_view_port =
-      WebViewDelegateEwk::GetInstance().GetLastUsedViewPortArea(evas_object());
-  int scaled_content_width =
-      static_cast<int>(contents_size_.width() * page_scale_factor_);
-  int scaled_content_height =
-      static_cast<int>(contents_size_.height() * page_scale_factor_);
+  const float device_scale_factor =
+      display::Screen::GetScreen()->GetPrimaryDisplay().device_scale_factor();
+  gfx::SizeF scaled_contents_size = gfx::ConvertSizeToPixels(
+      contents_size_, device_scale_factor * page_scale_factor_);
+  rwhva()->offscreen_helper()->SetScaledContentSize(scaled_contents_size);
+}
 
-  if (width && scaled_content_width > last_view_port.w)
-    *width = scaled_content_width - last_view_port.w;
-  if (height && scaled_content_height > last_view_port.h)
-    *height = scaled_content_height - last_view_port.h;
+void EWebView::GetScrollSize(int* width, int* height) {
+  int w = 0, h = 0;
+  if (width) {
+    *width = (rwhva() &&
+              (w = rwhva()->offscreen_helper()->GetScrollableSize().width()))
+                 ? w
+                 : 0;
+  }
+  if (height) {
+    *height = (rwhva() &&
+               (h = rwhva()->offscreen_helper()->GetScrollableSize().height()))
+                  ? h
+                  : 0;
+  }
 }
 
 void EWebView::MoveCaret(const gfx::Point& point) {
@@ -1957,6 +1960,7 @@ void EWebView::DidChangePageScaleFactor(double scale_factor) {
 #if !defined(USE_AURA)
   GetWebContentsViewEfl()->SetPageScaleFactor(scale_factor);
 #endif
+  SetScaledContentsSize();
 }
 
 inline JavaScriptDialogManagerEfl* EWebView::GetJavaScriptDialogManagerEfl() {
index 9cd498f..c25546d 100644 (file)
@@ -289,7 +289,7 @@ class EWebView {
   void HandleLongPressGesture(const content::ContextMenuParams&);
   void ShowContextMenu(const content::ContextMenuParams&);
   void CancelContextMenu(int request_id);
-  void SetScale(double scale_factor, int x, int y);
+  void SetScale(double scale_factor);
   bool GetScrollPosition(int* x, int* y) const;
   void SetScroll(int x, int y);
   void UrlRequestSet(const char* url,
@@ -413,6 +413,7 @@ class EWebView {
   void ExitFullscreen();
   double GetScale();
   void DidChangePageScaleFactor(double scale_factor);
+  void SetScaledContentsSize();
   void SetJavaScriptAlertCallback(Ewk_View_JavaScript_Alert_Callback callback,
                                   void* user_data);
   void JavaScriptAlertReply();
index 7094600..05864b8 100644 (file)
@@ -194,15 +194,14 @@ double ewk_view_load_progress_get(const Evas_Object* view)
 
 Eina_Bool ewk_view_scale_set(Evas_Object* view, double scale_factor, int x, int y)
 {
-  // TODO: We should implement AC in order to work this API normally.
   EWK_VIEW_IMPL_GET_OR_RETURN(view, impl, EINA_FALSE);
-  impl->SetScale(scale_factor, x, y);
+  impl->SetScale(scale_factor);
+  impl->SetScroll(x, y);
   return EINA_TRUE;
 }
 
 double ewk_view_scale_get(const Evas_Object *view)
 {
-  // TODO: We should implement AC in order to work this API normally.
   EWK_VIEW_IMPL_GET_OR_RETURN(view, impl, -1);
   return impl->GetScale();
 }
index 0edf0b5..170608a 100644 (file)
@@ -190,6 +190,31 @@ void RenderFrameObserverEfl::DidChangeScrollOffset() {
 #endif
 }
 
+void RenderFrameObserverEfl::DidUpdateMainFrameLayout() {
+  blink::WebView* view = render_frame()->GetWebView();
+  if (!view || !view->MainFrame() || !view->MainFrame()->IsWebLocalFrame())
+    return;
+
+  gfx::Size contents_size =
+      view->MainFrame()->ToWebLocalFrame()->DocumentSize();
+
+  // Fall back to contentsPreferredMinimumSize if the mainFrame is reporting a
+  // 0x0 size (this happens during initial load).
+  if (contents_size.IsEmpty()) {
+    contents_size = render_frame()
+                        ->GetWebView()
+                        ->ContentsPreferredMinimumSize();
+  }
+
+  if (contents_size == last_sent_contents_size_)
+    return;
+
+  last_sent_contents_size_ = contents_size;
+  Send(new EwkHostMsg_DidChangeContentsSize(render_frame()->GetRoutingID(),
+                                            contents_size.width(),
+                                            contents_size.height()));
+}
+
 void RenderFrameObserverEfl::WillSubmitForm(
     const blink::WebFormElement& form) {
   GURL url(blink::WebStringToGURL(form.Action()));
index 5d59de4..ebd5523 100644 (file)
@@ -36,6 +36,7 @@ class RenderFrameObserverEfl : public RenderFrameObserver {
                               int world_id) override;
   void WillReleaseScriptContext(v8::Handle<v8::Context> context,
                                 int world_id) override;
+  void DidUpdateMainFrameLayout() override;
 
  private:
   void OnSelectPopupMenuItems(bool canceled,
@@ -48,6 +49,7 @@ class RenderFrameObserverEfl : public RenderFrameObserver {
 
   gfx::Size max_scroll_offset_;
   gfx::Size last_scroll_offset_;
+  gfx::Size last_sent_contents_size_;
 };
 
 } // namespace content
index 844ff2c..8936be0 100644 (file)
@@ -613,6 +613,8 @@ bool WebContentsDelegateEfl::OnMessageReceived(
     IPC_MESSAGE_HANDLER(EwkHostMsg_WrtMessage, OnWrtPluginMessage)
     IPC_MESSAGE_HANDLER_DELAY_REPLY(EwkHostMsg_WrtSyncMessage,
                                     OnWrtPluginSyncMessage)
+    IPC_MESSAGE_HANDLER(EwkHostMsg_DidChangeContentsSize,
+                        OnDidChangeContentsSize)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
 
@@ -817,4 +819,12 @@ void WebContentsDelegateEfl::OnDidGetManifest(
   }
 }
 
+void WebContentsDelegateEfl::OnPageScaleFactorChanged(float page_scale_factor) {
+  web_view_->DidChangePageScaleFactor(page_scale_factor);
+}
+
+void WebContentsDelegateEfl::OnDidChangeContentsSize(int width, int height) {
+  web_view_->DidChangeContentsSize(width, height);
+}
+
 }  // namespace content
index 012c140..ba107b6 100644 (file)
@@ -166,6 +166,7 @@ class WebContentsDelegateEfl : public WebContentsDelegate,
   void LoadProgressChanged(double progress) override;
   void DidFinishLoad(RenderFrameHost* render_frame_host,
                      const GURL& validated_url) override;
+  void OnPageScaleFactorChanged(float page_scale_factor) override;
 
   void DidFailLoad(RenderFrameHost* render_frame_host,
                    const GURL& validated_url,
@@ -199,6 +200,7 @@ class WebContentsDelegateEfl : public WebContentsDelegate,
   void OnWrtPluginMessage(const Ewk_Wrt_Message_Data& data);
   void OnWrtPluginSyncMessage(const Ewk_Wrt_Message_Data& data,
                               IPC::Message* reply);
+  void OnDidChangeContentsSize(int width, int height);
 
   void OnDidGetManifest(Ewk_View_Request_Manifest_Callback callback,
                         void* user_data,
old mode 100755 (executable)
new mode 100644 (file)
index 24b0ceb..d071b5d
@@ -25,7 +25,8 @@ protected:
   static const char*const sample;
 };
 
-const char*const utc_blink_ewk_view_scale_set::sample="/common/sample.html";
+const char* const utc_blink_ewk_view_scale_set::sample =
+    "/common/sample_2.html";
 
 /**
   * @brief Positive test case of ewk_view_scale_set(). Page is loaded, APIs for setting scale and retrieving its value are called.
@@ -48,7 +49,11 @@ const char*const utc_blink_ewk_view_scale_set::sample="/common/sample.html";
 
     const double getScaleFactor = ewk_view_scale_get(GetEwkWebView());
 
-    if (scaleFactor != getScaleFactor)
+    Evas_Coord getCenterX = 0, getCenterY = 0;
+    ewk_view_scroll_pos_get(GetEwkWebView(), &getCenterX, &getCenterY);
+
+    if (scaleFactor != getScaleFactor || centerX != getCenterX ||
+        centerY != getCenterY)
       result = EINA_FALSE;
 
     utc_check_eq(result, EINA_TRUE);