https://bugs.webkit.org/show_bug.cgi?id=80027
Patch by Tim Dresser <tdresser@chromium.org> on 2012-03-21
Reviewed by Darin Fisher.
Source/WebCore:
Scale Combo box popups by defaultDeviceScaleFactor, and add padding to
<option> elements when touch is enabled.
Manually tested with --default-device-scale-factor=1,2 and unset.
Each of these were tested with RuntimeEnabledFeatures::touchEnabled
set to true and false.
* platform/chromium/PopupListBox.cpp:
(WebCore::PopupListBox::paint):
(WebCore::PopupListBox::paintRow):
(WebCore::PopupListBox::getRowHeight):
* platform/chromium/PopupListBox.h:
(PopupContainerSettings):
* platform/chromium/PopupMenuChromium.cpp:
(WebCore):
(WebCore::PopupMenuChromium::show):
* platform/chromium/PopupMenuChromium.h:
(WebCore::PopupMenuChromium::optionPaddingForTouch):
(WebCore::PopupMenuChromium::setOptionPaddingForTouch):
(PopupMenuChromium):
* rendering/RenderMenuList.cpp:
(WebCore::RenderMenuList::showPopup):
Source/WebKit/chromium:
* src/WebViewImpl.cpp:
(WebKit::WebViewImpl::gestureEvent):
(WebKit::WebViewImpl::applyAutofillSuggestions):
* tests/PopupMenuTest.cpp:
(WebKit::TestWebViewClient::screenInfo):
(WebKit::SelectPopupMenuTest::SetUp):
(WebKit::SelectPopupMenuTest::TearDown):
(SelectPopupMenuTest):
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@111539
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2012-03-21 Tim Dresser <tdresser@chromium.org>
+
+ [chromium] Increase size of Combo Box Options for touch and high DPI devices
+ https://bugs.webkit.org/show_bug.cgi?id=80027
+
+ Reviewed by Darin Fisher.
+
+ Scale Combo box popups by defaultDeviceScaleFactor, and add padding to
+ <option> elements when touch is enabled.
+
+ Manually tested with --default-device-scale-factor=1,2 and unset.
+ Each of these were tested with RuntimeEnabledFeatures::touchEnabled
+ set to true and false.
+
+ * platform/chromium/PopupListBox.cpp:
+ (WebCore::PopupListBox::paint):
+ (WebCore::PopupListBox::paintRow):
+ (WebCore::PopupListBox::getRowHeight):
+ * platform/chromium/PopupListBox.h:
+ (PopupContainerSettings):
+ * platform/chromium/PopupMenuChromium.cpp:
+ (WebCore):
+ (WebCore::PopupMenuChromium::show):
+ * platform/chromium/PopupMenuChromium.h:
+ (WebCore::PopupMenuChromium::optionPaddingForTouch):
+ (WebCore::PopupMenuChromium::setOptionPaddingForTouch):
+ (PopupMenuChromium):
+ * rendering/RenderMenuList.cpp:
+ (WebCore::RenderMenuList::showPopup):
+
2012-03-21 Takashi Toyoshima <toyoshim@chromium.org>
[Chromium] [WebSocket] provide WebFrameClient with a chance of
#include "PopupMenuChromium.h"
#include "PopupMenuClient.h"
#include "RenderTheme.h"
+#include "RuntimeEnabledFeatures.h"
#include "ScrollbarTheme.h"
#include "StringTruncator.h"
#include "TextRun.h"
void PopupListBox::paint(GraphicsContext* gc, const IntRect& rect)
{
+ int scale = m_settings.defaultDeviceScaleFactor;
// adjust coords for scrolled frame
IntRect r = intersection(rect, frameRect());
int tx = x() - scrollX();
// FIXME: Can we optimize scrolling to not require repainting the entire
// window? Should we?
+ if (scale != 1)
+ gc->scale(FloatSize(scale, scale));
for (int i = 0; i < numItems(); ++i)
paintRow(gc, r, i);
if (!rowRect.intersects(rect))
return;
+ int scale = m_settings.defaultDeviceScaleFactor;
+ // RowRect has already been scaled by the defaultDeviceScaleFactor.
+ // To avoid scaling it twice, we have to unscale it before drawing.
+ if (scale != 1) {
+ // Height and y should both be evenly divisible by scale.
+ ASSERT(!(rowRect.y() % scale));
+ rowRect.setY(rowRect.y() / scale);
+ ASSERT(!(rowRect.height() % scale));
+ rowRect.setHeight(rowRect.height() / scale);
+ rowRect.setWidth(ceilf(static_cast<float>(rowRect.width()) / scale));
+ // rowRect.x is always 0.
+ }
+
PopupMenuStyle style = m_popupClient->itemStyle(rowIndex);
// Paint background
int PopupListBox::getRowHeight(int index)
{
- if (index < 0)
- return PopupMenuChromium::minimumRowHeight();
-
- if (m_popupClient->itemStyle(index).isDisplayNone())
- return PopupMenuChromium::minimumRowHeight();
+ int scale = m_settings.defaultDeviceScaleFactor;
+ int paddingForTouch = 0;
+ if (RuntimeEnabledFeatures::touchEnabled())
+ paddingForTouch = PopupMenuChromium::optionPaddingForTouch();
+ if (index < 0 || m_popupClient->itemStyle(index).isDisplayNone())
+ return PopupMenuChromium::minimumRowHeight() * scale;
// Separator row height is the same size as itself.
if (m_popupClient->itemIsSeparator(index))
- return max(separatorHeight, PopupMenuChromium::minimumRowHeight());
+ return max(separatorHeight, (PopupMenuChromium::minimumRowHeight())) * scale;
String icon = m_popupClient->itemIcon(index);
RefPtr<Image> image(Image::loadPlatformResource(icon.utf8().data()));
int linePaddingHeight = m_popupClient->menuStyle().menuType() == PopupMenuStyle::AutofillPopup ? kLinePaddingHeight : 0;
int calculatedRowHeight = max(fontHeight, iconHeight) + linePaddingHeight * 2;
- return max(calculatedRowHeight, PopupMenuChromium::minimumRowHeight());
+ return (max(calculatedRowHeight, PopupMenuChromium::minimumRowHeight()) + paddingForTouch) * scale;
}
IntRect PopupListBox::getRowBounds(int index)
// Whether we should restrict the width of the PopupListBox or not.
// Autocomplete popups are restricted, combo-boxes (select tags) aren't.
bool restrictWidthOfListBox;
+
+ int defaultDeviceScaleFactor;
};
// A container for the data for each menu item (e.g. represented by <option>
#include "config.h"
#include "PopupMenuChromium.h"
+
+#include "Frame.h"
+#include "FrameView.h"
+#include "Page.h"
#include "PopupContainer.h"
+#include "Settings.h"
namespace WebCore {
int PopupMenuChromium::s_minimumRowHeight = 0;
+int PopupMenuChromium::s_optionPaddingForTouch = 30;
// The settings used for the drop down menu.
// This is the delegate used if none is provided.
void PopupMenuChromium::show(const IntRect& r, FrameView* v, int index)
{
- if (!p.popup)
- p.popup = PopupContainer::create(client(), PopupContainer::Select, dropDownSettings);
+ if (!p.popup) {
+ PopupContainerSettings popupSettings = dropDownSettings;
+ popupSettings.defaultDeviceScaleFactor =
+ v->frame()->page()->settings()->defaultDeviceScaleFactor();
+ if (!popupSettings.defaultDeviceScaleFactor)
+ popupSettings.defaultDeviceScaleFactor = 1;
+ p.popup = PopupContainer::create(client(), PopupContainer::Select, popupSettings);
+ }
p.popup->showInRect(r, v, index);
}
static int minimumRowHeight() { return s_minimumRowHeight; }
static void setMinimumRowHeight(int minimumRowHeight) { s_minimumRowHeight = minimumRowHeight; }
+ static int optionPaddingForTouch() { return s_optionPaddingForTouch; }
+ static void setOptionPaddingForTouch(int optionPaddingForTouch) { s_optionPaddingForTouch = optionPaddingForTouch; }
+
private:
PopupMenuClient* client() const { return m_popupClient; }
PopupMenuPrivate p;
static int s_minimumRowHeight;
+ static int s_optionPaddingForTouch;
};
} // namespace WebCore
#include "RenderBR.h"
#include "RenderScrollbar.h"
#include "RenderTheme.h"
+#include "Settings.h"
#include "TextRun.h"
#include <math.h>
// the actual width of the element to size the popup.
FloatPoint absTopLeft = localToAbsolute(FloatPoint(), false, true);
LayoutRect absBounds = absoluteBoundingBoxRectIgnoringTransforms();
+ int scale = document()->page()->settings()->defaultDeviceScaleFactor();
+ if (scale && scale != 1)
+ absBounds.scale(scale);
absBounds.setLocation(roundedLayoutPoint(absTopLeft));
HTMLSelectElement* select = toHTMLSelectElement(node());
m_popup->show(absBounds, document()->view(), select->optionToListIndex(select->selectedIndex()));
+2012-03-21 Tim Dresser <tdresser@chromium.org>
+
+ [chromium] Increase size of Combo Box Options for touch and high DPI devices
+ https://bugs.webkit.org/show_bug.cgi?id=80027
+
+ Reviewed by Darin Fisher.
+
+ * src/WebViewImpl.cpp:
+ (WebKit::WebViewImpl::gestureEvent):
+ (WebKit::WebViewImpl::applyAutofillSuggestions):
+ * tests/PopupMenuTest.cpp:
+ (WebKit::TestWebViewClient::screenInfo):
+ (WebKit::SelectPopupMenuTest::SetUp):
+ (WebKit::SelectPopupMenuTest::TearDown):
+ (SelectPopupMenuTest):
+
2012-03-21 Takashi Toyoshima <toyoshim@chromium.org>
[Chromium] [WebSocket] provide WebFrameClient with a chance of
return true;
}
return false;
+ case WebInputEvent::GestureTap: {
+ PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), event);
+ RefPtr<WebCore::PopupContainer> selectPopup;
+ selectPopup = m_selectPopup;
+ hideSelectPopup();
+ ASSERT(!m_selectPopup);
+ bool gestureHandled = mainFrameImpl()->frame()->eventHandler()->handleGestureEvent(platformEvent);
+ if (m_selectPopup && m_selectPopup == selectPopup) {
+ // That tap triggered a select popup which is the same as the one that
+ // was showing before the tap. It means the user tapped the select
+ // while the popup was showing, and as a result we first closed then
+ // immediately reopened the select popup. It needs to be closed.
+ hideSelectPopup();
+ }
+ return gestureHandled;
+ }
case WebInputEvent::GestureScrollBegin:
case WebInputEvent::GestureScrollEnd:
case WebInputEvent::GestureScrollUpdate:
- case WebInputEvent::GestureTap:
case WebInputEvent::GestureTapDown:
case WebInputEvent::GestureDoubleTap:
case WebInputEvent::GesturePinchBegin:
inputElem, names, labels, icons, uniqueIDs, separatorIndex);
if (!m_autofillPopup) {
+ PopupContainerSettings popupSettings = autofillPopupSettings;
+ popupSettings.defaultDeviceScaleFactor =
+ m_page->settings()->defaultDeviceScaleFactor();
+ if (!popupSettings.defaultDeviceScaleFactor)
+ popupSettings.defaultDeviceScaleFactor = 1;
m_autofillPopup = PopupContainer::create(m_autofillPopupClient.get(),
PopupContainer::Suggestion,
- autofillPopupSettings);
+ popupSettings);
}
if (m_autofillPopupShowing) {
#include "PopupMenu.h"
#include "PopupMenuClient.h"
#include "PopupMenuChromium.h"
+#include "RuntimeEnabledFeatures.h"
#include "WebDocument.h"
#include "WebElement.h"
#include "WebFrame.h"
// We need to override this so that the popup menu size is not 0
// (the layout code checks to see if the popup fits on the screen).
virtual WebScreenInfo screenInfo()
- {
+ {
WebScreenInfo screenInfo;
screenInfo.availableRect.height = 2000;
screenInfo.availableRect.width = 2000;
protected:
virtual void SetUp()
{
+ // When touch is enabled, padding is added to option elements
+ // In these tests, we'll assume touch is disabled.
+ m_touchWasEnabled = RuntimeEnabledFeatures::touchEnabled();
+ RuntimeEnabledFeatures::setTouchEnabled(false);
m_webView = static_cast<WebViewImpl*>(WebView::create(&m_webviewClient));
m_webView->initializeMainFrame(&m_webFrameClient);
m_popupMenu = adoptRef(new PopupMenuChromium(&m_popupMenuClient));
m_popupMenu = 0;
m_webView->close();
webkit_support::UnregisterAllMockedURLs();
+ RuntimeEnabledFeatures::setTouchEnabled(m_touchWasEnabled);
}
// Returns true if there currently is a select popup in the WebView.
TestWebFrameClient m_webFrameClient;
TestPopupMenuClient m_popupMenuClient;
RefPtr<PopupMenu> m_popupMenu;
+ bool m_touchWasEnabled;
std::string baseURL;
};