Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(150)

Side by Side Diff: Source/WebKit/chromium/src/AutofillPopupMenuClient.cpp

Issue 10037002: Datalist UI (WebKit part) (Closed) Base URL: http://svn.webkit.org/repository/webkit/trunk
Patch Set: fixed Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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_selectedIndex(-1)
56 , m_selectedIndex(-1)
57 , m_textField(0) 56 , m_textField(0)
58 { 57 {
59 } 58 }
60 59
61 AutofillPopupMenuClient::~AutofillPopupMenuClient() 60 AutofillPopupMenuClient::~AutofillPopupMenuClient()
62 { 61 {
63 } 62 }
64 63
65 unsigned AutofillPopupMenuClient::getSuggestionsCount() const 64 unsigned AutofillPopupMenuClient::getSuggestionsCount() const
66 { 65 {
67 return m_names.size() + ((m_separatorIndex == -1) ? 0 : 1); 66 return m_names.size();
68 } 67 }
69 68
70 WebString AutofillPopupMenuClient::getSuggestion(unsigned listIndex) const 69 WebString AutofillPopupMenuClient::getSuggestion(unsigned listIndex) const
71 { 70 {
72 int index = convertListIndexToInternalIndex(listIndex); 71 ASSERT(listIndex < m_names.size());
73 if (index == -1) 72 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 } 73 }
79 74
80 WebString AutofillPopupMenuClient::getLabel(unsigned listIndex) const 75 WebString AutofillPopupMenuClient::getLabel(unsigned listIndex) const
81 { 76 {
82 int index = convertListIndexToInternalIndex(listIndex); 77 ASSERT(listIndex < m_labels.size());
83 if (index == -1) 78 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 } 79 }
89 80
90 WebString AutofillPopupMenuClient::getIcon(unsigned listIndex) const 81 WebString AutofillPopupMenuClient::getIcon(unsigned listIndex) const
91 { 82 {
92 int index = convertListIndexToInternalIndex(listIndex); 83 ASSERT(listIndex < m_icons.size());
93 if (index == -1) 84 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 } 85 }
99 86
100 void AutofillPopupMenuClient::removeSuggestionAtIndex(unsigned listIndex) 87 void AutofillPopupMenuClient::removeSuggestionAtIndex(unsigned listIndex)
101 { 88 {
102 if (!canRemoveSuggestionAtIndex(listIndex)) 89 if (!canRemoveSuggestionAtIndex(listIndex))
103 return; 90 return;
104 91
105 int index = convertListIndexToInternalIndex(listIndex); 92 ASSERT(listIndex < m_names.size());
106 93
107 ASSERT(static_cast<unsigned>(index) < m_names.size()); 94 m_names.remove(listIndex);
108 95 m_labels.remove(listIndex);
109 m_names.remove(index); 96 m_icons.remove(listIndex);
110 m_labels.remove(index); 97 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 } 98 }
118 99
119 bool AutofillPopupMenuClient::canRemoveSuggestionAtIndex(unsigned listIndex) 100 bool AutofillPopupMenuClient::canRemoveSuggestionAtIndex(unsigned listIndex)
120 { 101 {
121 // Only allow deletion of items before the separator that have unique id 0 102 return m_itemIDs[listIndex] == AutocompleteEntryMenuItemID ||
122 // (i.e. are autocomplete rather than autofill items). 103 m_itemIDs[listIndex] == PasswordEntryMenuItemID;
123 int index = convertListIndexToInternalIndex(listIndex);
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
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
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
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
OLDNEW
« no previous file with comments | « Source/WebKit/chromium/src/AutofillPopupMenuClient.h ('k') | Source/WebKit/chromium/src/WebDataListElement.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698