Chromium Code Reviews| Index: Source/core/rendering/RenderMenuList.cpp |
| diff --git a/Source/core/rendering/RenderMenuList.cpp b/Source/core/rendering/RenderMenuList.cpp |
| index 1c93e0292dae2b4ca86b994d7e9ca8596cb6cf47..5be89d13f8497df58a554d06c3722a294bbbd2fe 100644 |
| --- a/Source/core/rendering/RenderMenuList.cpp |
| +++ b/Source/core/rendering/RenderMenuList.cpp |
| @@ -45,6 +45,7 @@ |
| #include "core/rendering/RenderView.h" |
| #include "platform/fonts/FontCache.h" |
| #include "platform/geometry/IntSize.h" |
| +#include "platform/text/PlatformLocale.h" |
| using namespace std; |
| @@ -215,19 +216,52 @@ void RenderMenuList::setTextFromOption(int optionIndex) |
| { |
| HTMLSelectElement* select = selectElement(); |
| const WillBeHeapVector<RawPtrWillBeMember<HTMLElement> >& listItems = select->listItems(); |
| - int size = listItems.size(); |
| + const int size = listItems.size(); |
| - int i = select->optionToListIndex(optionIndex); |
| String text = emptyString(); |
| - if (i >= 0 && i < size) { |
| - Element* element = listItems[i]; |
| - if (isHTMLOptionElement(*element)) { |
| - text = toHTMLOptionElement(element)->textIndentedToRespectGroupLabel(); |
| - m_optionStyle = element->renderStyle(); |
| + m_optionStyle.clear(); |
| + |
| + if (multiple()) { |
| + unsigned selectedCount = 0; |
| + int firstSelectedIndex = -1; |
| + for (int i = 0; i < size; ++i) { |
| + Element* element = listItems[i]; |
| + if (isHTMLOptionElement(*element)) { |
|
tkent
2014/05/27 00:52:10
nit: We prefer early exit. That is to say,
if
|
| + HTMLOptionElement* optionElement = toHTMLOptionElement(element); |
| + if (optionElement->selected()) { |
|
tkent
2014/05/27 00:52:10
if (toHTMLOptionElement(element)->selected()) {
i
|
| + ++selectedCount; |
| + if (selectedCount == 1) { |
| + firstSelectedIndex = i; |
|
tkent
2014/05/27 00:52:10
if (++selectedCount == 1)
firstSelectedIndex =
|
| + } |
| + } |
| + } |
| + } |
| + |
| + if (selectedCount == 1) { |
| + ASSERT(0 <= firstSelectedIndex && firstSelectedIndex < size); |
|
tkent
2014/05/27 00:52:10
Do not put two conditions with && into a single AS
|
| + HTMLOptionElement* selectedOptionElement = toHTMLOptionElement(listItems[firstSelectedIndex]); |
| + ASSERT(selectedOptionElement->selected()); |
| + text = selectedOptionElement->textIndentedToRespectGroupLabel(); |
| + m_optionStyle = selectedOptionElement->renderStyle(); |
| + } else { |
| + Locale& locale = select->locale(); |
|
tkent
2014/05/27 00:52:10
This code applies the else clause for selectedCoun
|
| + String localizedNumberString = locale.convertToLocalizedNumber(String::number(selectedCount)); |
| + text = locale.queryString(blink::WebLocalizedString::SelectMenuListText, localizedNumberString); |
| + ASSERT(!m_optionStyle); |
| + } |
| + } else { |
| + const int i = select->optionToListIndex(optionIndex); |
| + if (i >= 0 && i < size) { |
| + Element* element = listItems[i]; |
| + if (isHTMLOptionElement(*element)) { |
| + text = toHTMLOptionElement(element)->textIndentedToRespectGroupLabel(); |
| + m_optionStyle = element->renderStyle(); |
| + } |
| } |
| } |
| setText(text.stripWhiteSpace()); |
| + |
| didUpdateActiveOption(optionIndex); |
| } |