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); |
} |