15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "AutofillPopupMenuClient.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "CSSValueKeywords.h" 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "WebAutofillClient.h" 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "WebNode.h" 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "WebViewClient.h" 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "WebViewImpl.h" 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSFontSelector.h" 4081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/css/resolver/StyleResolver.h" 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h" 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h" 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Frame.h" 4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameView.h" 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h" 4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h" 475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebString.h" 485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebVector.h" 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WebCore; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebKit { 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)AutofillPopupMenuClient::AutofillPopupMenuClient() 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_selectedIndex(-1) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_textField(0) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_useLegacyBehavior(false) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)AutofillPopupMenuClient::~AutofillPopupMenuClient() 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned AutofillPopupMenuClient::getSuggestionsCount() const 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_names.size(); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString AutofillPopupMenuClient::getSuggestion(unsigned listIndex) const 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_WITH_SECURITY_IMPLICATION(listIndex < m_names.size()); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_names[listIndex]; 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString AutofillPopupMenuClient::getLabel(unsigned listIndex) const 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_WITH_SECURITY_IMPLICATION(listIndex < m_labels.size()); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_labels[listIndex]; 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString AutofillPopupMenuClient::getIcon(unsigned listIndex) const 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_WITH_SECURITY_IMPLICATION(listIndex < m_icons.size()); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_icons[listIndex]; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void AutofillPopupMenuClient::removeSuggestionAtIndex(unsigned listIndex) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!canRemoveSuggestionAtIndex(listIndex)) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_WITH_SECURITY_IMPLICATION(listIndex < m_names.size()); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_names.remove(listIndex); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_labels.remove(listIndex); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_icons.remove(listIndex); 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_itemIDs.remove(listIndex); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool AutofillPopupMenuClient::canRemoveSuggestionAtIndex(unsigned listIndex) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_itemIDs[listIndex] == WebAutofillClient::MenuItemIDAutocompleteEntry || m_itemIDs[listIndex] == WebAutofillClient::MenuItemIDPasswordEntry; 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void AutofillPopupMenuClient::valueChanged(unsigned listIndex, bool fireEvents) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebViewImpl* webView = getWebView(); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!webView) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_WITH_SECURITY_IMPLICATION(listIndex < m_names.size()); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_useLegacyBehavior) { 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < m_itemIDs.size(); ++i) { 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_itemIDs[i] == WebAutofillClient::MenuItemIDSeparator) { 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (listIndex > i) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) listIndex--; 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) webView->autofillClient()->didAcceptAutofillSuggestion(WebNode(getTextField()), 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_names[listIndex], 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_labels[listIndex], 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_itemIDs[listIndex], 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) listIndex); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void AutofillPopupMenuClient::selectionChanged(unsigned listIndex, bool fireEvents) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebViewImpl* webView = getWebView(); 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!webView) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_WITH_SECURITY_IMPLICATION(listIndex < m_names.size()); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) webView->autofillClient()->didSelectAutofillSuggestion(WebNode(getTextField()), 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_names[listIndex], 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_labels[listIndex], 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_itemIDs[listIndex]); 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void AutofillPopupMenuClient::selectionCleared() 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebViewImpl* webView = getWebView(); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webView) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) webView->autofillClient()->didClearAutofillSelection(WebNode(getTextField())); 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String AutofillPopupMenuClient::itemText(unsigned listIndex) const 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getSuggestion(listIndex); 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String AutofillPopupMenuClient::itemLabel(unsigned listIndex) const 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getLabel(listIndex); 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String AutofillPopupMenuClient::itemIcon(unsigned listIndex) const 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getIcon(listIndex); 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool AutofillPopupMenuClient::itemIsEnabled(unsigned listIndex) const 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !itemIsWarning(listIndex); 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PopupMenuStyle AutofillPopupMenuClient::itemStyle(unsigned listIndex) const 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return itemIsWarning(listIndex) ? *m_warningStyle : *m_regularStyle; 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PopupMenuStyle AutofillPopupMenuClient::menuStyle() const 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return *m_regularStyle; 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebCore::LayoutUnit AutofillPopupMenuClient::clientPaddingLeft() const 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Bug http://crbug.com/7708 seems to indicate the style can be 0. 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderStyle* style = textFieldStyle(); 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!style) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return RenderTheme::defaultTheme()->popupInternalPaddingLeft(style); 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebCore::LayoutUnit AutofillPopupMenuClient::clientPaddingRight() const 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Bug http://crbug.com/7708 seems to indicate the style can be 0. 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderStyle* style = textFieldStyle(); 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!style) 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return RenderTheme::defaultTheme()->popupInternalPaddingRight(style); 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void AutofillPopupMenuClient::popupDidHide() 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebViewImpl* webView = getWebView(); 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!webView) 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) webView->autofillPopupDidHide(); 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) webView->autofillClient()->didClearAutofillSelection(WebNode(getTextField())); 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool AutofillPopupMenuClient::itemIsSeparator(unsigned listIndex) const 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_itemIDs[listIndex] == WebAutofillClient::MenuItemIDSeparator; 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool AutofillPopupMenuClient::itemIsWarning(unsigned listIndex) const 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_itemIDs[listIndex] == WebAutofillClient::MenuItemIDWarningMessage; 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void AutofillPopupMenuClient::setTextFromItem(unsigned listIndex) 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_textField->setValue(getSuggestion(listIndex)); 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FontSelector* AutofillPopupMenuClient::fontSelector() const 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_textField->document()->styleResolver()->fontSelector(); 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HostWindow* AutofillPopupMenuClient::hostWindow() const 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_textField->document()->view()->hostWindow(); 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<Scrollbar> AutofillPopupMenuClient::createScrollbar( 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ScrollableArea* scrollableArea, 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ScrollbarOrientation orientation, 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ScrollbarControlSize size) 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Scrollbar::createNativeScrollbar(scrollableArea, orientation, size); 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void AutofillPopupMenuClient::initialize( 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLInputElement* textField, 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebVector<WebString>& names, 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebVector<WebString>& labels, 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebVector<WebString>& icons, 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebVector<int>& itemIDs, 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int separatorIndex) 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(names.size() == labels.size()); 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(names.size() == icons.size()); 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(names.size() == itemIDs.size()); 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_selectedIndex = -1; 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_textField = textField; 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (separatorIndex == -1) { 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The suggestions must be set before initializing the 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // AutofillPopupMenuClient. 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setSuggestions(names, labels, icons, itemIDs); 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_useLegacyBehavior = true; 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebVector<WebString> namesWithSeparator(names.size() + 1); 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebVector<WebString> labelsWithSeparator(labels.size() + 1); 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebVector<WebString> iconsWithSeparator(icons.size() + 1); 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebVector<int> itemIDsWithSeparator(itemIDs.size() + 1); 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < names.size(); ++i) { 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t j = i < static_cast<size_t>(separatorIndex) ? i : i + 1; 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) namesWithSeparator[j] = names[i]; 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) labelsWithSeparator[j] = labels[i]; 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) iconsWithSeparator[j] = icons[i]; 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) itemIDsWithSeparator[j] = itemIDs[i]; 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) itemIDsWithSeparator[separatorIndex] = WebAutofillClient::MenuItemIDSeparator; 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setSuggestions(namesWithSeparator, labelsWithSeparator, iconsWithSeparator, itemIDsWithSeparator); 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FontDescription regularFontDescription; 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTheme::defaultTheme()->systemFont(CSSValueWebkitControl, 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) regularFontDescription); 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderStyle* style = m_textField->computedStyle(); 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) regularFontDescription.setComputedSize(style->fontDescription().computedSize()); 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Font regularFont(regularFontDescription, 0, 0); 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) regularFont.update(textField->document()->styleResolver()->fontSelector()); 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The direction of text in popup menu is set the same as the direction of 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the input element: textField. 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_regularStyle = adoptPtr(new PopupMenuStyle(Color::black, Color::white, regularFont, true, false, 292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Length(WebCore::Fixed), textField->renderer()->style()->direction(), 293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) textField->renderer()->style()->unicodeBidi() == Override, 294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) PopupMenuStyle::CustomBackgroundColor, PopupMenuStyle::AutofillPopup)); 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FontDescription warningFontDescription = regularFont.fontDescription(); 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) warningFontDescription.setItalic(true); 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Font warningFont(warningFontDescription, regularFont.letterSpacing(), regularFont.wordSpacing()); 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) warningFont.update(regularFont.fontSelector()); 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_warningStyle = adoptPtr(new PopupMenuStyle(Color::darkGray, m_regularStyle->backgroundColor(), warningFont, 301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_regularStyle->isVisible(), m_regularStyle->isDisplayNone(), 302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_regularStyle->textIndent(), m_regularStyle->textDirection(), 303926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_regularStyle->hasTextDirectionOverride(), 304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) PopupMenuStyle::CustomBackgroundColor, PopupMenuStyle::AutofillPopup)); 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void AutofillPopupMenuClient::setSuggestions(const WebVector<WebString>& names, 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebVector<WebString>& labels, 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebVector<WebString>& icons, 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebVector<int>& itemIDs) 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(names.size() == labels.size()); 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(names.size() == icons.size()); 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(names.size() == itemIDs.size()); 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_names.clear(); 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_labels.clear(); 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_icons.clear(); 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_itemIDs.clear(); 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < names.size(); ++i) { 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_names.append(names[i]); 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_labels.append(labels[i]); 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_icons.append(icons[i]); 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_itemIDs.append(itemIDs[i]); 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Try to preserve selection if possible. 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (getSelectedIndex() >= static_cast<int>(names.size())) 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setSelectedIndex(-1); 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebViewImpl* AutofillPopupMenuClient::getWebView() const 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Frame* frame = m_textField->document()->frame(); 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Page* page = frame->page(); 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page) 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return static_cast<WebViewImpl*>(page->chrome().client()->webView()); 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderStyle* AutofillPopupMenuClient::textFieldStyle() const 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderStyle* style = m_textField->computedStyle(); 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!style) { 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It seems we can only have a 0 style in a TextField if the 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node is detached, in which case we the popup should not be 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // showing. Please report this in http://crbug.com/7708 and 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // include the page you were visiting. 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style; 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebKit 359