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