Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 45 #include "WebViewClient.h" | 45 #include "WebViewClient.h" |
| 46 #include "WebViewImpl.h" | 46 #include "WebViewImpl.h" |
| 47 #include "platform/WebString.h" | 47 #include "platform/WebString.h" |
| 48 #include "platform/WebVector.h" | 48 #include "platform/WebVector.h" |
| 49 | 49 |
| 50 using namespace WebCore; | 50 using namespace WebCore; |
| 51 | 51 |
| 52 namespace WebKit { | 52 namespace WebKit { |
| 53 | 53 |
| 54 AutofillPopupMenuClient::AutofillPopupMenuClient() | 54 AutofillPopupMenuClient::AutofillPopupMenuClient() |
| 55 : m_separatorIndex(-1) | 55 : m_textField(0) |
| 56 , m_selectedIndex(-1) | |
|
Ilya Sherman
2012/04/11 00:27:52
nit: We should still initialize m_selectedIndex.
keishi
2012/04/11 12:13:12
Done.
| |
| 57 , m_textField(0) | |
| 58 { | 56 { |
| 59 } | 57 } |
| 60 | 58 |
| 61 AutofillPopupMenuClient::~AutofillPopupMenuClient() | 59 AutofillPopupMenuClient::~AutofillPopupMenuClient() |
| 62 { | 60 { |
| 63 } | 61 } |
| 64 | 62 |
| 65 unsigned AutofillPopupMenuClient::getSuggestionsCount() const | 63 unsigned AutofillPopupMenuClient::getSuggestionsCount() const |
| 66 { | 64 { |
| 67 return m_names.size() + ((m_separatorIndex == -1) ? 0 : 1); | 65 return m_names.size(); |
| 68 } | 66 } |
| 69 | 67 |
| 70 WebString AutofillPopupMenuClient::getSuggestion(unsigned listIndex) const | 68 WebString AutofillPopupMenuClient::getSuggestion(unsigned listIndex) const |
| 71 { | 69 { |
| 72 int index = convertListIndexToInternalIndex(listIndex); | 70 ASSERT(listIndex >= 0 && static_cast<size_t>(listIndex) < m_names.size()); |
|
Ilya Sherman
2012/04/11 00:27:52
nit: No need to check nonnegativity nor to cast --
keishi
2012/04/11 12:13:12
Done.
| |
| 73 if (index == -1) | 71 return m_names[listIndex]; |
| 74 return WebString(); | |
| 75 | |
| 76 ASSERT(index >= 0 && static_cast<size_t>(index) < m_names.size()); | |
| 77 return m_names[index]; | |
| 78 } | 72 } |
| 79 | 73 |
| 80 WebString AutofillPopupMenuClient::getLabel(unsigned listIndex) const | 74 WebString AutofillPopupMenuClient::getLabel(unsigned listIndex) const |
| 81 { | 75 { |
| 82 int index = convertListIndexToInternalIndex(listIndex); | 76 ASSERT(listIndex >= 0 && static_cast<size_t>(listIndex) < m_labels.size()); |
|
Ilya Sherman
2012/04/11 00:27:52
nit: Ditto
keishi
2012/04/11 12:13:12
Done.
| |
| 83 if (index == -1) | 77 return m_labels[listIndex]; |
| 84 return WebString(); | |
| 85 | |
| 86 ASSERT(index >= 0 && static_cast<size_t>(index) < m_labels.size()); | |
| 87 return m_labels[index]; | |
| 88 } | 78 } |
| 89 | 79 |
| 90 WebString AutofillPopupMenuClient::getIcon(unsigned listIndex) const | 80 WebString AutofillPopupMenuClient::getIcon(unsigned listIndex) const |
| 91 { | 81 { |
| 92 int index = convertListIndexToInternalIndex(listIndex); | 82 ASSERT(listIndex >= 0 && static_cast<size_t>(listIndex) < m_icons.size()); |
|
Ilya Sherman
2012/04/11 00:27:52
nit: Ditto
keishi
2012/04/11 12:13:12
Done.
| |
| 93 if (index == -1) | 83 return m_icons[listIndex]; |
| 94 return WebString(); | |
| 95 | |
| 96 ASSERT(index >= 0 && static_cast<size_t>(index) < m_icons.size()); | |
| 97 return m_icons[index]; | |
| 98 } | 84 } |
| 99 | 85 |
| 100 void AutofillPopupMenuClient::removeSuggestionAtIndex(unsigned listIndex) | 86 void AutofillPopupMenuClient::removeSuggestionAtIndex(unsigned listIndex) |
| 101 { | 87 { |
| 102 if (!canRemoveSuggestionAtIndex(listIndex)) | 88 if (!canRemoveSuggestionAtIndex(listIndex)) |
| 103 return; | 89 return; |
| 104 | 90 |
| 105 int index = convertListIndexToInternalIndex(listIndex); | 91 ASSERT(static_cast<unsigned>(listIndex) < m_names.size()); |
|
Ilya Sherman
2012/04/11 00:27:52
nit: No need to cast, the listIndex is already uns
keishi
2012/04/11 12:13:12
Done.
| |
| 106 | 92 |
| 107 ASSERT(static_cast<unsigned>(index) < m_names.size()); | 93 m_names.remove(listIndex); |
| 108 | 94 m_labels.remove(listIndex); |
| 109 m_names.remove(index); | 95 m_icons.remove(listIndex); |
| 110 m_labels.remove(index); | 96 m_itemIDs.remove(listIndex); |
| 111 m_icons.remove(index); | |
| 112 m_uniqueIDs.remove(index); | |
| 113 | |
| 114 // Shift the separator index if necessary. | |
| 115 if (m_separatorIndex != -1) | |
| 116 m_separatorIndex--; | |
| 117 } | 97 } |
| 118 | 98 |
| 119 bool AutofillPopupMenuClient::canRemoveSuggestionAtIndex(unsigned listIndex) | 99 bool AutofillPopupMenuClient::canRemoveSuggestionAtIndex(unsigned listIndex) |
| 120 { | 100 { |
| 121 // Only allow deletion of items before the separator that have unique id 0 | 101 return m_itemIDs[listIndex] > 0 || // Is autofill entry? |
|
Ilya Sherman
2012/04/11 00:27:52
It's not currently possible to remove Autofill ent
keishi
2012/04/11 12:13:12
Done. I'll match the current behavior.
| |
| 122 // (i.e. are autocomplete rather than autofill items). | 102 m_itemIDs[listIndex] == AutocompleteEntryMenuItemID || |
| 123 int index = convertListIndexToInternalIndex(listIndex); | 103 m_itemIDs[listIndex] == PasswordEntryMenuItemID; |
| 124 return !m_uniqueIDs[index] && (m_separatorIndex == -1 || listIndex < static_ cast<unsigned>(m_separatorIndex)); | |
| 125 } | 104 } |
| 126 | 105 |
| 127 void AutofillPopupMenuClient::valueChanged(unsigned listIndex, bool fireEvents) | 106 void AutofillPopupMenuClient::valueChanged(unsigned listIndex, bool fireEvents) |
| 128 { | 107 { |
| 129 WebViewImpl* webView = getWebView(); | 108 WebViewImpl* webView = getWebView(); |
| 130 if (!webView) | 109 if (!webView) |
| 131 return; | 110 return; |
| 132 | 111 |
| 133 if (m_separatorIndex != -1 && listIndex > static_cast<unsigned>(m_separatorI ndex)) | |
| 134 --listIndex; | |
| 135 | |
| 136 ASSERT(listIndex < m_names.size()); | 112 ASSERT(listIndex < m_names.size()); |
| 137 | 113 |
| 138 webView->autofillClient()->didAcceptAutofillSuggestion(WebNode(getTextField( )), | 114 webView->autofillClient()->didAcceptAutofillSuggestion(WebNode(getTextField( )), |
| 139 m_names[listIndex], | 115 m_names[listIndex], |
| 140 m_labels[listIndex], | 116 m_labels[listIndex], |
| 141 m_uniqueIDs[listIndex ], | 117 m_itemIDs[listIndex], |
| 142 listIndex); | 118 listIndex); |
| 143 } | 119 } |
| 144 | 120 |
| 145 void AutofillPopupMenuClient::selectionChanged(unsigned listIndex, bool fireEven ts) | 121 void AutofillPopupMenuClient::selectionChanged(unsigned listIndex, bool fireEven ts) |
| 146 { | 122 { |
| 147 WebViewImpl* webView = getWebView(); | 123 WebViewImpl* webView = getWebView(); |
| 148 if (!webView) | 124 if (!webView) |
| 149 return; | 125 return; |
| 150 | 126 |
| 151 if (m_separatorIndex != -1 && listIndex > static_cast<unsigned>(m_separatorI ndex)) | |
| 152 --listIndex; | |
| 153 | |
| 154 ASSERT(listIndex < m_names.size()); | 127 ASSERT(listIndex < m_names.size()); |
| 155 | 128 |
| 156 webView->autofillClient()->didSelectAutofillSuggestion(WebNode(getTextField( )), | 129 webView->autofillClient()->didSelectAutofillSuggestion(WebNode(getTextField( )), |
| 157 m_names[listIndex], | 130 m_names[listIndex], |
| 158 m_labels[listIndex], | 131 m_labels[listIndex], |
| 159 m_uniqueIDs[listIndex ]); | 132 m_itemIDs[listIndex]) ; |
| 160 } | 133 } |
| 161 | 134 |
| 162 void AutofillPopupMenuClient::selectionCleared() | 135 void AutofillPopupMenuClient::selectionCleared() |
| 163 { | 136 { |
| 164 WebViewImpl* webView = getWebView(); | 137 WebViewImpl* webView = getWebView(); |
| 165 if (webView) | 138 if (webView) |
| 166 webView->autofillClient()->didClearAutofillSelection(WebNode(getTextFiel d())); | 139 webView->autofillClient()->didClearAutofillSelection(WebNode(getTextFiel d())); |
| 167 } | 140 } |
| 168 | 141 |
| 169 String AutofillPopupMenuClient::itemText(unsigned listIndex) const | 142 String AutofillPopupMenuClient::itemText(unsigned listIndex) const |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 221 WebViewImpl* webView = getWebView(); | 194 WebViewImpl* webView = getWebView(); |
| 222 if (!webView) | 195 if (!webView) |
| 223 return; | 196 return; |
| 224 | 197 |
| 225 webView->autofillPopupDidHide(); | 198 webView->autofillPopupDidHide(); |
| 226 webView->autofillClient()->didClearAutofillSelection(WebNode(getTextField()) ); | 199 webView->autofillClient()->didClearAutofillSelection(WebNode(getTextField()) ); |
| 227 } | 200 } |
| 228 | 201 |
| 229 bool AutofillPopupMenuClient::itemIsSeparator(unsigned listIndex) const | 202 bool AutofillPopupMenuClient::itemIsSeparator(unsigned listIndex) const |
| 230 { | 203 { |
| 231 return (m_separatorIndex != -1 && static_cast<unsigned>(m_separatorIndex) == listIndex); | 204 return m_itemIDs[listIndex] == SeparatorMenuItemID; |
| 232 } | 205 } |
| 233 | 206 |
| 234 bool AutofillPopupMenuClient::itemIsWarning(unsigned listIndex) const | 207 bool AutofillPopupMenuClient::itemIsWarning(unsigned listIndex) const |
| 235 { | 208 { |
| 236 int index = convertListIndexToInternalIndex(listIndex); | 209 return m_itemIDs[listIndex] == WarningMessageMenuItemID; |
| 237 if (index == -1) | |
| 238 return false; | |
| 239 | |
| 240 ASSERT(index >= 0 && static_cast<size_t>(index) < m_uniqueIDs.size()); | |
| 241 return m_uniqueIDs[index] < 0; | |
| 242 } | 210 } |
| 243 | 211 |
| 244 void AutofillPopupMenuClient::setTextFromItem(unsigned listIndex) | 212 void AutofillPopupMenuClient::setTextFromItem(unsigned listIndex) |
| 245 { | 213 { |
| 246 m_textField->setValue(getSuggestion(listIndex)); | 214 m_textField->setValue(getSuggestion(listIndex)); |
| 247 } | 215 } |
| 248 | 216 |
| 249 FontSelector* AutofillPopupMenuClient::fontSelector() const | 217 FontSelector* AutofillPopupMenuClient::fontSelector() const |
| 250 { | 218 { |
| 251 return m_textField->document()->styleSelector()->fontSelector(); | 219 return m_textField->document()->styleSelector()->fontSelector(); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 262 ScrollbarControlSize size) | 230 ScrollbarControlSize size) |
| 263 { | 231 { |
| 264 return Scrollbar::createNativeScrollbar(scrollableArea, orientation, size); | 232 return Scrollbar::createNativeScrollbar(scrollableArea, orientation, size); |
| 265 } | 233 } |
| 266 | 234 |
| 267 void AutofillPopupMenuClient::initialize( | 235 void AutofillPopupMenuClient::initialize( |
| 268 HTMLInputElement* textField, | 236 HTMLInputElement* textField, |
| 269 const WebVector<WebString>& names, | 237 const WebVector<WebString>& names, |
| 270 const WebVector<WebString>& labels, | 238 const WebVector<WebString>& labels, |
| 271 const WebVector<WebString>& icons, | 239 const WebVector<WebString>& icons, |
| 272 const WebVector<int>& uniqueIDs, | 240 const WebVector<int>& itemIDs) |
| 273 int separatorIndex) | |
| 274 { | 241 { |
| 275 ASSERT(names.size() == labels.size()); | 242 ASSERT(names.size() == labels.size()); |
| 276 ASSERT(names.size() == icons.size()); | 243 ASSERT(names.size() == icons.size()); |
| 277 ASSERT(names.size() == uniqueIDs.size()); | 244 ASSERT(names.size() == itemIDs.size()); |
| 278 ASSERT(separatorIndex < static_cast<int>(names.size())); | |
| 279 | 245 |
| 280 m_selectedIndex = -1; | 246 m_selectedIndex = -1; |
| 281 m_textField = textField; | 247 m_textField = textField; |
| 282 | 248 |
| 283 // The suggestions must be set before initializing the | 249 // The suggestions must be set before initializing the |
| 284 // AutofillPopupMenuClient. | 250 // AutofillPopupMenuClient. |
| 285 setSuggestions(names, labels, icons, uniqueIDs, separatorIndex); | 251 setSuggestions(names, labels, icons, itemIDs); |
| 286 | 252 |
| 287 FontDescription regularFontDescription; | 253 FontDescription regularFontDescription; |
| 288 RenderTheme::defaultTheme()->systemFont(CSSValueWebkitControl, | 254 RenderTheme::defaultTheme()->systemFont(CSSValueWebkitControl, |
| 289 regularFontDescription); | 255 regularFontDescription); |
| 290 RenderStyle* style = m_textField->computedStyle(); | 256 RenderStyle* style = m_textField->computedStyle(); |
| 291 regularFontDescription.setComputedSize(style->fontDescription().computedSize ()); | 257 regularFontDescription.setComputedSize(style->fontDescription().computedSize ()); |
| 292 | 258 |
| 293 Font regularFont(regularFontDescription, 0, 0); | 259 Font regularFont(regularFontDescription, 0, 0); |
| 294 regularFont.update(textField->document()->styleSelector()->fontSelector()); | 260 regularFont.update(textField->document()->styleSelector()->fontSelector()); |
| 295 // The direction of text in popup menu is set the same as the direction of | 261 // The direction of text in popup menu is set the same as the direction of |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 306 m_warningStyle = adoptPtr(new PopupMenuStyle(Color::darkGray, m_regularStyle ->backgroundColor(), warningFont, | 272 m_warningStyle = adoptPtr(new PopupMenuStyle(Color::darkGray, m_regularStyle ->backgroundColor(), warningFont, |
| 307 m_regularStyle->isVisible(), m_ regularStyle->isDisplayNone(), | 273 m_regularStyle->isVisible(), m_ regularStyle->isDisplayNone(), |
| 308 m_regularStyle->textIndent(), m _regularStyle->textDirection(), | 274 m_regularStyle->textIndent(), m _regularStyle->textDirection(), |
| 309 m_regularStyle->hasTextDirectio nOverride(), | 275 m_regularStyle->hasTextDirectio nOverride(), |
| 310 PopupMenuStyle::AutofillPopup)) ; | 276 PopupMenuStyle::AutofillPopup)) ; |
| 311 } | 277 } |
| 312 | 278 |
| 313 void AutofillPopupMenuClient::setSuggestions(const WebVector<WebString>& names, | 279 void AutofillPopupMenuClient::setSuggestions(const WebVector<WebString>& names, |
| 314 const WebVector<WebString>& labels, | 280 const WebVector<WebString>& labels, |
| 315 const WebVector<WebString>& icons, | 281 const WebVector<WebString>& icons, |
| 316 const WebVector<int>& uniqueIDs, | 282 const WebVector<int>& itemIDs) |
| 317 int separatorIndex) | |
| 318 { | 283 { |
| 319 ASSERT(names.size() == labels.size()); | 284 ASSERT(names.size() == labels.size()); |
| 320 ASSERT(names.size() == icons.size()); | 285 ASSERT(names.size() == icons.size()); |
| 321 ASSERT(names.size() == uniqueIDs.size()); | 286 ASSERT(names.size() == itemIDs.size()); |
| 322 ASSERT(separatorIndex < static_cast<int>(names.size())); | |
| 323 | 287 |
| 324 m_names.clear(); | 288 m_names.clear(); |
| 325 m_labels.clear(); | 289 m_labels.clear(); |
| 326 m_icons.clear(); | 290 m_icons.clear(); |
| 327 m_uniqueIDs.clear(); | 291 m_itemIDs.clear(); |
| 328 for (size_t i = 0; i < names.size(); ++i) { | 292 for (size_t i = 0; i < names.size(); ++i) { |
| 329 m_names.append(names[i]); | 293 m_names.append(names[i]); |
| 330 m_labels.append(labels[i]); | 294 m_labels.append(labels[i]); |
| 331 m_icons.append(icons[i]); | 295 m_icons.append(icons[i]); |
| 332 m_uniqueIDs.append(uniqueIDs[i]); | 296 m_itemIDs.append(itemIDs[i]); |
| 333 } | 297 } |
| 334 | 298 |
| 335 m_separatorIndex = separatorIndex; | |
| 336 | |
| 337 // Try to preserve selection if possible. | 299 // Try to preserve selection if possible. |
| 338 if (getSelectedIndex() >= static_cast<int>(names.size())) | 300 if (getSelectedIndex() >= static_cast<int>(names.size())) |
| 339 setSelectedIndex(-1); | 301 setSelectedIndex(-1); |
| 340 } | 302 } |
| 341 | 303 |
| 342 int AutofillPopupMenuClient::convertListIndexToInternalIndex(unsigned listIndex) const | |
| 343 { | |
| 344 if (listIndex == static_cast<unsigned>(m_separatorIndex)) | |
| 345 return -1; | |
| 346 | |
| 347 if (m_separatorIndex == -1 || listIndex < static_cast<unsigned>(m_separatorI ndex)) | |
| 348 return listIndex; | |
| 349 return listIndex - 1; | |
| 350 } | |
| 351 | |
| 352 WebViewImpl* AutofillPopupMenuClient::getWebView() const | 304 WebViewImpl* AutofillPopupMenuClient::getWebView() const |
| 353 { | 305 { |
| 354 Frame* frame = m_textField->document()->frame(); | 306 Frame* frame = m_textField->document()->frame(); |
| 355 if (!frame) | 307 if (!frame) |
| 356 return 0; | 308 return 0; |
| 357 | 309 |
| 358 Page* page = frame->page(); | 310 Page* page = frame->page(); |
| 359 if (!page) | 311 if (!page) |
| 360 return 0; | 312 return 0; |
| 361 | 313 |
| 362 return static_cast<WebViewImpl*>(page->chrome()->client()->webView()); | 314 return static_cast<WebViewImpl*>(page->chrome()->client()->webView()); |
| 363 } | 315 } |
| 364 | 316 |
| 365 RenderStyle* AutofillPopupMenuClient::textFieldStyle() const | 317 RenderStyle* AutofillPopupMenuClient::textFieldStyle() const |
| 366 { | 318 { |
| 367 RenderStyle* style = m_textField->computedStyle(); | 319 RenderStyle* style = m_textField->computedStyle(); |
| 368 if (!style) { | 320 if (!style) { |
| 369 // It seems we can only have a 0 style in a TextField if the | 321 // It seems we can only have a 0 style in a TextField if the |
| 370 // node is detached, in which case we the popup should not be | 322 // node is detached, in which case we the popup should not be |
| 371 // showing. Please report this in http://crbug.com/7708 and | 323 // showing. Please report this in http://crbug.com/7708 and |
| 372 // include the page you were visiting. | 324 // include the page you were visiting. |
| 373 ASSERT_NOT_REACHED(); | 325 ASSERT_NOT_REACHED(); |
| 374 } | 326 } |
| 375 return style; | 327 return style; |
| 376 } | 328 } |
| 377 | 329 |
| 378 } // namespace WebKit | 330 } // namespace WebKit |
| OLD | NEW |