[Chromium] Calendar Picker: Popup position is wrong when there are
authortkent@chromium.org <tkent@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Apr 2012 07:40:30 +0000 (07:40 +0000)
committertkent@chromium.org <tkent@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Apr 2012 07:40:30 +0000 (07:40 +0000)
no enough space below the target date field
https://bugs.webkit.org/show_bug.cgi?id=84007

Reviewed by Hajime Morita.

The popup was detached from the origin element because
calendarPicker.js resizes its window. To fix this bug, we move the
window position vertically when it is resized.

No new tests. This is not testable in WebKit.

* src/WebPagePopupImpl.cpp:
(WebKit::PagePopupChromeClient::setWindowRect):
If this request is just a resize and m_isPutAboveOrigin is true,
update the vertical position so that the popup attaches to the
origin rectangle.
(WebKit::WebPagePopupImpl::WebPagePopupImpl):
Initialize m_isPutAboveOrigin with false.
(WebKit::WebPagePopupImpl::init): Set m_isPutAboveOrigin true.
* src/WebPagePopupImpl.h:
(WebPagePopupImpl): Add m_isPutAboveOrigin.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@114357 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/src/WebPagePopupImpl.cpp
Source/WebKit/chromium/src/WebPagePopupImpl.h

index ec0d03f..760cda5 100644 (file)
@@ -1,3 +1,28 @@
+2012-04-17  Kent Tamura  <tkent@chromium.org>
+
+        [Chromium] Calendar Picker: Popup position is wrong when there are
+        no enough space below the target date field
+        https://bugs.webkit.org/show_bug.cgi?id=84007
+
+        Reviewed by Hajime Morita.
+
+        The popup was detached from the origin element because
+        calendarPicker.js resizes its window. To fix this bug, we move the
+        window position vertically when it is resized.
+
+        No new tests. This is not testable in WebKit.
+
+        * src/WebPagePopupImpl.cpp:
+        (WebKit::PagePopupChromeClient::setWindowRect):
+        If this request is just a resize and m_isPutAboveOrigin is true,
+        update the vertical position so that the popup attaches to the
+        origin rectangle.
+        (WebKit::WebPagePopupImpl::WebPagePopupImpl):
+        Initialize m_isPutAboveOrigin with false.
+        (WebKit::WebPagePopupImpl::init): Set m_isPutAboveOrigin true.
+        * src/WebPagePopupImpl.h:
+        (WebPagePopupImpl): Add m_isPutAboveOrigin.
+
 2012-04-16  Kent Tamura  <tkent@chromium.org>
 
         Rename LocalizedNumberICU.h to ICULocale.h
index 7fb6f34..291f243 100644 (file)
@@ -79,7 +79,11 @@ private:
 
     virtual void setWindowRect(const FloatRect& rect) OVERRIDE
     {
-        m_popup->m_windowRectInScreen = IntRect(rect);
+        IntRect intRect(rect);
+        const WebRect currentRect = m_popup->m_windowRectInScreen;
+        if (intRect.x() == currentRect.x && intRect.y() == currentRect.y && m_popup->m_isPutAboveOrigin)
+            intRect.setY(currentRect.y + currentRect.height - intRect.height());
+        m_popup->m_windowRectInScreen = intRect;
         m_popup->widgetClient()->setWindowRect(m_popup->m_windowRectInScreen);
     }
 
@@ -127,6 +131,7 @@ private:
 
 WebPagePopupImpl::WebPagePopupImpl(WebWidgetClient* client)
     : m_widgetClient(client)
+    , m_isPutAboveOrigin(false)
 {
     ASSERT(client);
 }
@@ -146,8 +151,10 @@ bool WebPagePopupImpl::init(WebViewImpl* webView, PagePopupClient* popupClient,
     WebSize rootViewSize = webView->size();
     IntSize popupSize = popupClient->contentSize();
     IntRect popupBoundsInRootView(IntPoint(max(0, originBoundsInRootView.x()), max(0, originBoundsInRootView.maxY())), popupSize);
-    if (popupBoundsInRootView.maxY() > rootViewSize.height)
+    if (popupBoundsInRootView.maxY() > rootViewSize.height) {
         popupBoundsInRootView.setY(max(0, originBoundsInRootView.y() - popupSize.height()));
+        m_isPutAboveOrigin = true;
+    }
     if (popupBoundsInRootView.maxX() > rootViewSize.width)
         popupBoundsInRootView.setX(max(0, rootViewSize.width - popupSize.width()));
     IntRect boundsInScreen = webView->page()->chrome()->rootViewToScreen(popupBoundsInRootView);
index 3b776f1..dfdb9d8 100644 (file)
@@ -90,6 +90,7 @@ private:
     OwnPtr<WebCore::Page> m_page;
     OwnPtr<PagePopupChromeClient> m_chromeClient;
     WebCore::PagePopupClient* m_popupClient;
+    bool m_isPutAboveOrigin;
 
     friend class WebPagePopup;
     friend class PagePopupChromeClient;