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
+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
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);
}
WebPagePopupImpl::WebPagePopupImpl(WebWidgetClient* client)
: m_widgetClient(client)
+ , m_isPutAboveOrigin(false)
{
ASSERT(client);
}
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);
OwnPtr<WebCore::Page> m_page;
OwnPtr<PagePopupChromeClient> m_chromeClient;
WebCore::PagePopupClient* m_popupClient;
+ bool m_isPutAboveOrigin;
friend class WebPagePopup;
friend class PagePopupChromeClient;