| Index: Source/WebCore/html/HTMLOptionElement.cpp
|
| diff --git a/Source/WebCore/html/HTMLOptionElement.cpp b/Source/WebCore/html/HTMLOptionElement.cpp
|
| index ac0bb7ff1422d2562de922317d6eba4ddfac1f8f..6836ef0db301ce16e6a24e404d6140ded7ed00d8 100644
|
| --- a/Source/WebCore/html/HTMLOptionElement.cpp
|
| +++ b/Source/WebCore/html/HTMLOptionElement.cpp
|
| @@ -34,12 +34,11 @@
|
| #include "HTMLNames.h"
|
| #include "HTMLParserIdioms.h"
|
| #include "HTMLSelectElement.h"
|
| -#include "NodeRenderStyle.h"
|
| -#include "NodeRenderingContext.h"
|
| #include "NodeTraversal.h"
|
| #include "RenderMenuList.h"
|
| #include "RenderTheme.h"
|
| #include "ScriptElement.h"
|
| +#include "ShadowRoot.h"
|
| #include "StyleResolver.h"
|
| #include "Text.h"
|
| #include <wtf/StdLibExtras.h>
|
| @@ -62,18 +61,20 @@ HTMLOptionElement::HTMLOptionElement(const QualifiedName& tagName, Document* doc
|
|
|
| PassRefPtr<HTMLOptionElement> HTMLOptionElement::create(Document* document)
|
| {
|
| - return adoptRef(new HTMLOptionElement(optionTag, document));
|
| + return HTMLOptionElement::create(optionTag, document);
|
| }
|
|
|
| PassRefPtr<HTMLOptionElement> HTMLOptionElement::create(const QualifiedName& tagName, Document* document)
|
| {
|
| - return adoptRef(new HTMLOptionElement(tagName, document));
|
| + RefPtr<HTMLOptionElement> option = adoptRef(new HTMLOptionElement(tagName, document));
|
| + option->ensureUserAgentShadowRoot();
|
| + return option.release();
|
| }
|
|
|
| PassRefPtr<HTMLOptionElement> HTMLOptionElement::createForJSConstructor(Document* document, const String& data, const String& value,
|
| bool defaultSelected, bool selected, ExceptionCode& ec)
|
| {
|
| - RefPtr<HTMLOptionElement> element = adoptRef(new HTMLOptionElement(optionTag, document));
|
| + RefPtr<HTMLOptionElement> element = HTMLOptionElement::create(optionTag, document);
|
|
|
| RefPtr<Text> text = Text::create(document, data.isNull() ? "" : data);
|
|
|
| @@ -91,22 +92,6 @@ PassRefPtr<HTMLOptionElement> HTMLOptionElement::createForJSConstructor(Document
|
| return element.release();
|
| }
|
|
|
| -void HTMLOptionElement::attach()
|
| -{
|
| - HTMLElement::attach();
|
| - // If after attaching nothing called styleForRenderer() on this node we
|
| - // manually cache the value. This happens if our parent doesn't have a
|
| - // renderer like <optgroup> or if it doesn't allow children like <select>.
|
| - if (!m_style && parentNode()->renderStyle())
|
| - updateNonRenderStyle();
|
| -}
|
| -
|
| -void HTMLOptionElement::detach()
|
| -{
|
| - m_style.clear();
|
| - HTMLElement::detach();
|
| -}
|
| -
|
| bool HTMLOptionElement::supportsFocus() const
|
| {
|
| return HTMLElement::supportsFocus();
|
| @@ -216,6 +201,8 @@ void HTMLOptionElement::parseAttribute(const QualifiedName& name, const AtomicSt
|
| // that we need to do more than just set m_isSelected to select in that
|
| // case; we'd need to do the other work from the setSelected function.
|
| m_isSelected = !value.isNull();
|
| + } else if (name == labelAttr) {
|
| + updateLabel();
|
| } else
|
| HTMLElement::parseAttribute(name, value);
|
| }
|
| @@ -272,6 +259,7 @@ void HTMLOptionElement::childrenChanged(bool changedByParser, Node* beforeChange
|
| #endif
|
| if (HTMLSelectElement* select = ownerSelectElement())
|
| select->optionElementChildrenChanged();
|
| + updateLabel();
|
| HTMLElement::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta);
|
| }
|
|
|
| @@ -311,34 +299,6 @@ void HTMLOptionElement::setLabel(const String& label)
|
| setAttribute(labelAttr, label);
|
| }
|
|
|
| -void HTMLOptionElement::updateNonRenderStyle()
|
| -{
|
| - m_style = document()->styleResolver()->styleForElement(this);
|
| -}
|
| -
|
| -RenderStyle* HTMLOptionElement::nonRendererStyle() const
|
| -{
|
| - return m_style.get();
|
| -}
|
| -
|
| -PassRefPtr<RenderStyle> HTMLOptionElement::customStyleForRenderer()
|
| -{
|
| - // styleForRenderer is called whenever a new style should be associated
|
| - // with an Element so now is a good time to update our cached style.
|
| - updateNonRenderStyle();
|
| - return m_style;
|
| -}
|
| -
|
| -void HTMLOptionElement::didRecalcStyle(StyleChange)
|
| -{
|
| - // FIXME: This is nasty, we ask our owner select to repaint even if the new
|
| - // style is exactly the same.
|
| - if (HTMLSelectElement* select = ownerSelectElement()) {
|
| - if (RenderObject* renderer = select->renderer())
|
| - renderer->repaint();
|
| - }
|
| -}
|
| -
|
| String HTMLOptionElement::textIndentedToRespectGroupLabel() const
|
| {
|
| ContainerNode* parent = parentNode();
|
| @@ -390,6 +350,30 @@ String HTMLOptionElement::collectOptionInnerText() const
|
| return text.toString();
|
| }
|
|
|
| +void HTMLOptionElement::updateLabel()
|
| +{
|
| + Text* const textNode = toText(userAgentShadowRoot()->firstChild());
|
| + if (textNode)
|
| + textNode->replaceWholeText(text(), ASSERT_NO_EXCEPTION);
|
| + else
|
| + userAgentShadowRoot()->appendChild(Text::create(document(), text()), ASSERT_NO_EXCEPTION);
|
| +}
|
| +
|
| +PassRefPtr<RenderStyle> HTMLOptionElement::customStyleForRenderer()
|
| +{
|
| + RefPtr<RenderStyle> originalStyle = document()->styleResolver()->styleForElement(this);
|
| + RefPtr<RenderStyle> style = RenderStyle::clone(originalStyle.get());
|
| +
|
| + HTMLSelectElement* selectElement = ownerSelectElement();
|
| + if (selectElement) {
|
| + const Vector<HTMLElement*>& items = selectElement->listItems();
|
| + if (items[items.size() - 1] == this)
|
| + style->setPaddingBottom(Length(0, Fixed));
|
| + }
|
| +
|
| + return style.release();
|
| +}
|
| +
|
| #ifndef NDEBUG
|
|
|
| HTMLOptionElement* toHTMLOptionElement(Node* node)
|
|
|