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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutMenuList.cpp

Issue 2093563005: Improve performance to remove OPTIONs from a single-selection SELECT. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2743
Patch Set: Created 4 years, 5 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
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutMenuList.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * This file is part of the select element layoutObject in WebCore. 2 * This file is part of the select element layoutObject in WebCore.
3 * 3 *
4 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 4 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
5 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed. 5 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed.
6 * 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 6 * 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 LayoutBlock::styleDidChange(diff, oldStyle); 152 LayoutBlock::styleDidChange(diff, oldStyle);
153 153
154 if (!m_innerBlock) 154 if (!m_innerBlock)
155 createInnerBlock(); 155 createInnerBlock();
156 156
157 m_buttonText->setStyle(mutableStyle()); 157 m_buttonText->setStyle(mutableStyle());
158 adjustInnerStyle(); 158 adjustInnerStyle();
159 159
160 bool fontChanged = !oldStyle || oldStyle->font() != style()->font(); 160 bool fontChanged = !oldStyle || oldStyle->font() != style()->font();
161 if (fontChanged) 161 if (fontChanged)
162 updateOptionsWidth(); 162 m_optionsChanged = true;
163 } 163 }
164 164
165 void LayoutMenuList::updateOptionsWidth() 165 void LayoutMenuList::updateOptionsWidth() const
166 { 166 {
167 if (!m_optionsChanged)
168 return;
169
167 float maxOptionWidth = 0; 170 float maxOptionWidth = 0;
168 const HeapVector<Member<HTMLElement>>& listItems = selectElement()->listItem s(); 171 const HeapVector<Member<HTMLElement>>& listItems = selectElement()->listItem s();
169 int size = listItems.size(); 172 int size = listItems.size();
170 173
171 for (int i = 0; i < size; ++i) { 174 for (int i = 0; i < size; ++i) {
172 HTMLElement* element = listItems[i]; 175 HTMLElement* element = listItems[i];
173 if (!isHTMLOptionElement(*element)) 176 if (!isHTMLOptionElement(*element))
174 continue; 177 continue;
175 178
176 String text = toHTMLOptionElement(element)->textIndentedToRespectGroupLa bel(); 179 String text = toHTMLOptionElement(element)->textIndentedToRespectGroupLa bel();
177 applyTextTransform(style(), text, ' '); 180 applyTextTransform(style(), text, ' ');
178 if (LayoutTheme::theme().popupOptionSupportsTextIndent()) { 181 if (LayoutTheme::theme().popupOptionSupportsTextIndent()) {
179 // Add in the option's text indent. We can't calculate percentage v alues for now. 182 // Add in the option's text indent. We can't calculate percentage v alues for now.
180 float optionWidth = 0; 183 float optionWidth = 0;
181 if (const ComputedStyle* optionStyle = element->computedStyle()) 184 if (const ComputedStyle* optionStyle = element->computedStyle())
182 optionWidth += minimumValueForLength(optionStyle->textIndent(), LayoutUnit()); 185 optionWidth += minimumValueForLength(optionStyle->textIndent(), LayoutUnit());
183 if (!text.isEmpty()) 186 if (!text.isEmpty())
184 optionWidth += computeTextWidth(text); 187 optionWidth += computeTextWidth(text);
185 maxOptionWidth = std::max(maxOptionWidth, optionWidth); 188 maxOptionWidth = std::max(maxOptionWidth, optionWidth);
186 } else if (!text.isEmpty()) { 189 } else if (!text.isEmpty()) {
187 maxOptionWidth = std::max(maxOptionWidth, computeTextWidth(text)); 190 maxOptionWidth = std::max(maxOptionWidth, computeTextWidth(text));
188 } 191 }
189 } 192 }
190 193
191 int width = static_cast<int>(ceilf(maxOptionWidth)); 194 m_optionsWidth = static_cast<int>(ceilf(maxOptionWidth));
192 if (m_optionsWidth == width) 195 m_optionsChanged = false;
193 return; 196 }
194 197
195 m_optionsWidth = width; 198 void LayoutMenuList::setOptionsChanged(bool changed)
196 if (parent()) 199 {
197 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalida tionReason::MenuWidthChanged); 200 m_optionsChanged = changed;
201 if (changed && parent())
202 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalida tionReason::MenuOptionsChanged);
198 } 203 }
199 204
200 float LayoutMenuList::computeTextWidth(const String& text) const 205 float LayoutMenuList::computeTextWidth(const String& text) const
201 { 206 {
202 return style()->font().width(constructTextRun(style()->font(), text, styleRe f())); 207 return style()->font().width(constructTextRun(style()->font(), text, styleRe f()));
203 } 208 }
204 209
205 void LayoutMenuList::updateFromElement() 210 void LayoutMenuList::updateFromElement()
206 { 211 {
207 if (m_optionsChanged) {
208 updateOptionsWidth();
209 m_optionsChanged = false;
210 }
211
212 updateText();
213 }
214
215 void LayoutMenuList::updateText()
216 {
217 setTextFromOption(selectElement()->optionIndexToBeShown()); 212 setTextFromOption(selectElement()->optionIndexToBeShown());
218 } 213 }
219 214
220 void LayoutMenuList::setTextFromOption(int optionIndex) 215 void LayoutMenuList::setTextFromOption(int optionIndex)
221 { 216 {
222 HTMLSelectElement* select = selectElement(); 217 HTMLSelectElement* select = selectElement();
223 const HeapVector<Member<HTMLElement>>& listItems = select->listItems(); 218 const HeapVector<Member<HTMLElement>>& listItems = select->listItems();
224 const int size = listItems.size(); 219 const int size = listItems.size();
225 220
226 String text = emptyString(); 221 String text = emptyString();
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 296
302 LayoutRect innerBox(additionalOffset + m_innerBlock->location() 297 LayoutRect innerBox(additionalOffset + m_innerBlock->location()
303 + LayoutSize(m_innerBlock->paddingLeft(), m_innerBlock->paddingTop()) 298 + LayoutSize(m_innerBlock->paddingLeft(), m_innerBlock->paddingTop())
304 , m_innerBlock->contentSize()); 299 , m_innerBlock->contentSize());
305 300
306 return intersection(outerBox, innerBox); 301 return intersection(outerBox, innerBox);
307 } 302 }
308 303
309 void LayoutMenuList::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const 304 void LayoutMenuList::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const
310 { 305 {
306 updateOptionsWidth();
311 maxLogicalWidth = std::max(m_optionsWidth, LayoutTheme::theme().minimumMenuL istSize(styleRef())) + m_innerBlock->paddingLeft() + m_innerBlock->paddingRight( ); 307 maxLogicalWidth = std::max(m_optionsWidth, LayoutTheme::theme().minimumMenuL istSize(styleRef())) + m_innerBlock->paddingLeft() + m_innerBlock->paddingRight( );
312 if (!style()->width().hasPercent()) 308 if (!style()->width().hasPercent())
313 minLogicalWidth = maxLogicalWidth; 309 minLogicalWidth = maxLogicalWidth;
314 } 310 }
315 311
316 void LayoutMenuList::didSetSelectedIndex(int optionIndex) 312 void LayoutMenuList::didSetSelectedIndex(int optionIndex)
317 { 313 {
318 didUpdateActiveOption(optionIndex); 314 didUpdateActiveOption(optionIndex);
319 } 315 }
320 316
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 // space appear on the side of the popup menu. 353 // space appear on the side of the popup menu.
358 return LayoutUnit(endOfLinePadding); 354 return LayoutUnit(endOfLinePadding);
359 } 355 }
360 356
361 // If the appearance isn't MenulistPart, then the select is styled (non-nati ve), so 357 // If the appearance isn't MenulistPart, then the select is styled (non-nati ve), so
362 // we want to return the user specified padding. 358 // we want to return the user specified padding.
363 return paddingRight() + m_innerBlock->paddingRight(); 359 return paddingRight() + m_innerBlock->paddingRight();
364 } 360 }
365 361
366 } // namespace blink 362 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutMenuList.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698