From 5f1ab04193ad0130ca8204aadaceae083aca9881 Mon Sep 17 00:00:00 2001 From: Feng Qian Date: Wed, 17 Jun 2009 12:12:20 -0700 Subject: Get WebKit r44544. --- WebCore/rendering/RenderMenuList.cpp | 75 +++++++++++++++++------------------- 1 file changed, 35 insertions(+), 40 deletions(-) (limited to 'WebCore/rendering/RenderMenuList.cpp') diff --git a/WebCore/rendering/RenderMenuList.cpp b/WebCore/rendering/RenderMenuList.cpp index d61c16b..95de7a2 100644 --- a/WebCore/rendering/RenderMenuList.cpp +++ b/WebCore/rendering/RenderMenuList.cpp @@ -27,7 +27,6 @@ #include "CSSStyleSelector.h" #include "FrameView.h" #include "HTMLNames.h" -#include "HTMLSelectElement.h" #include "NodeRenderStyle.h" #include "OptionElement.h" #include "OptionGroupElement.h" @@ -35,6 +34,7 @@ #include "RenderBR.h" #include "RenderScrollbar.h" #include "RenderTheme.h" +#include "SelectElement.h" #include using namespace std; @@ -43,7 +43,7 @@ namespace WebCore { using namespace HTMLNames; -RenderMenuList::RenderMenuList(HTMLSelectElement* element) +RenderMenuList::RenderMenuList(Element* element) : RenderFlexibleBox(element) , m_buttonText(0) , m_innerBlock(0) @@ -61,12 +61,6 @@ RenderMenuList::~RenderMenuList() m_popup = 0; } -// this static cast is safe because RenderMenuLists are only created for HTMLSelectElements -HTMLSelectElement* RenderMenuList::selectElement() -{ - return static_cast(node()); -} - void RenderMenuList::createInnerBlock() { if (m_innerBlock) { @@ -134,10 +128,10 @@ void RenderMenuList::styleDidChange(StyleDifference diff, const RenderStyle* old void RenderMenuList::updateOptionsWidth() { float maxOptionWidth = 0; - const Vector& listItems = static_cast(node())->listItems(); + const Vector& listItems = toSelectElement(static_cast(node()))->listItems(); int size = listItems.size(); for (int i = 0; i < size; ++i) { - HTMLElement* element = listItems[i]; + Element* element = listItems[i]; OptionElement* optionElement = toOptionElement(element); if (!optionElement) continue; @@ -160,7 +154,8 @@ void RenderMenuList::updateOptionsWidth() return; m_optionsWidth = width; - setNeedsLayoutAndPrefWidthsRecalc(); + if (parent()) + setNeedsLayoutAndPrefWidthsRecalc(); } void RenderMenuList::updateFromElement() @@ -173,13 +168,13 @@ void RenderMenuList::updateFromElement() if (m_popupIsVisible) m_popup->updateFromElement(); else - setTextFromOption(static_cast(node())->selectedIndex()); + setTextFromOption(toSelectElement(static_cast(node()))->selectedIndex()); } void RenderMenuList::setTextFromOption(int optionIndex) { - HTMLSelectElement* select = static_cast(node()); - const Vector& listItems = select->listItems(); + SelectElement* select = toSelectElement(static_cast(node())); + const Vector& listItems = select->listItems(); int size = listItems.size(); int i = select->optionToListIndex(optionIndex); @@ -280,7 +275,7 @@ void RenderMenuList::showPopup() createInnerBlock(); if (!m_popup) m_popup = PopupMenu::create(this); - HTMLSelectElement* select = static_cast(node()); + SelectElement* select = toSelectElement(static_cast(node())); m_popupIsVisible = true; // Compute the top left taking transforms into account, but use @@ -301,14 +296,14 @@ void RenderMenuList::hidePopup() void RenderMenuList::valueChanged(unsigned listIndex, bool fireOnChange) { - HTMLSelectElement* select = static_cast(node()); + SelectElement* select = toSelectElement(static_cast(node())); select->setSelectedIndex(select->listToOptionIndex(listIndex), true, fireOnChange); } String RenderMenuList::itemText(unsigned listIndex) const { - HTMLSelectElement* select = static_cast(node()); - HTMLElement* element = select->listItems()[listIndex]; + SelectElement* select = toSelectElement(static_cast(node())); + Element* element = select->listItems()[listIndex]; if (OptionGroupElement* optionGroupElement = toOptionGroupElement(element)) return optionGroupElement->groupLabelText(); else if (OptionElement* optionElement = toOptionElement(element)) @@ -318,26 +313,26 @@ String RenderMenuList::itemText(unsigned listIndex) const bool RenderMenuList::itemIsEnabled(unsigned listIndex) const { - HTMLSelectElement* select = static_cast(node()); - HTMLElement* element = select->listItems()[listIndex]; - if (!element->hasTagName(optionTag)) + SelectElement* select = toSelectElement(static_cast(node())); + Element* element = select->listItems()[listIndex]; + if (!isOptionElement(element)) return false; + bool groupEnabled = true; - if (element->parentNode() && element->parentNode()->hasTagName(optgroupTag)) { - FormControlElement* formControlElement = toFormControlElement(static_cast(element->parentNode())); - groupEnabled = formControlElement->isEnabled(); + if (Element* parentElement = element->parentElement()) { + if (isOptionGroupElement(parentElement)) + groupEnabled = parentElement->isEnabledFormControl(); } - if (!groupEnabled) return false; - return toFormControlElement(element)->isEnabled(); + return element->isEnabledFormControl(); } PopupMenuStyle RenderMenuList::itemStyle(unsigned listIndex) const { - HTMLSelectElement* select = static_cast(node()); - HTMLElement* element = select->listItems()[listIndex]; + SelectElement* select = toSelectElement(static_cast(node())); + Element* element = select->listItems()[listIndex]; RenderStyle* style = element->renderStyle() ? element->renderStyle() : element->computedStyle(); return style ? PopupMenuStyle(style->color(), itemBackgroundColor(listIndex), style->font(), style->visibility() == VISIBLE, style->textIndent(), style->direction()) : menuStyle(); @@ -345,8 +340,8 @@ PopupMenuStyle RenderMenuList::itemStyle(unsigned listIndex) const Color RenderMenuList::itemBackgroundColor(unsigned listIndex) const { - HTMLSelectElement* select = static_cast(node()); - HTMLElement* element = select->listItems()[listIndex]; + SelectElement* select = toSelectElement(static_cast(node())); + Element* element = select->listItems()[listIndex]; Color backgroundColor; if (element->renderStyle()) @@ -409,34 +404,34 @@ int RenderMenuList::clientPaddingRight() const int RenderMenuList::listSize() const { - HTMLSelectElement* select = static_cast(node()); + SelectElement* select = toSelectElement(static_cast(node())); return select->listItems().size(); } int RenderMenuList::selectedIndex() const { - HTMLSelectElement* select = static_cast(node()); + SelectElement* select = toSelectElement(static_cast(node())); return select->optionToListIndex(select->selectedIndex()); } bool RenderMenuList::itemIsSeparator(unsigned listIndex) const { - HTMLSelectElement* select = static_cast(node()); - HTMLElement* element = select->listItems()[listIndex]; + SelectElement* select = toSelectElement(static_cast(node())); + Element* element = select->listItems()[listIndex]; return element->hasTagName(hrTag); } bool RenderMenuList::itemIsLabel(unsigned listIndex) const { - HTMLSelectElement* select = static_cast(node()); - HTMLElement* element = select->listItems()[listIndex]; - return element->hasTagName(optgroupTag); + SelectElement* select = toSelectElement(static_cast(node())); + Element* element = select->listItems()[listIndex]; + return isOptionGroupElement(element); } bool RenderMenuList::itemIsSelected(unsigned listIndex) const { - HTMLSelectElement* select = static_cast(node()); - HTMLElement* element = select->listItems()[listIndex]; + SelectElement* select = toSelectElement(static_cast(node())); + Element* element = select->listItems()[listIndex]; if (OptionElement* optionElement = toOptionElement(element)) return optionElement->selected(); return false; @@ -444,7 +439,7 @@ bool RenderMenuList::itemIsSelected(unsigned listIndex) const void RenderMenuList::setTextFromItem(unsigned listIndex) { - HTMLSelectElement* select = static_cast(node()); + SelectElement* select = toSelectElement(static_cast(node())); setTextFromOption(select->listToOptionIndex(listIndex)); } -- cgit v1.1