diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/WebCore/html/HTMLOptGroupElement.cpp | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/WebCore/html/HTMLOptGroupElement.cpp')
-rw-r--r-- | Source/WebCore/html/HTMLOptGroupElement.cpp | 60 |
1 files changed, 45 insertions, 15 deletions
diff --git a/Source/WebCore/html/HTMLOptGroupElement.cpp b/Source/WebCore/html/HTMLOptGroupElement.cpp index 862268119..2927adac5 100644 --- a/Source/WebCore/html/HTMLOptGroupElement.cpp +++ b/Source/WebCore/html/HTMLOptGroupElement.cpp @@ -41,11 +41,12 @@ inline HTMLOptGroupElement::HTMLOptGroupElement(const QualifiedName& tagName, Do : HTMLElement(tagName, document) { ASSERT(hasTagName(optgroupTag)); + setHasCustomStyleResolveCallbacks(); } -Ref<HTMLOptGroupElement> HTMLOptGroupElement::create(const QualifiedName& tagName, Document& document) +PassRefPtr<HTMLOptGroupElement> HTMLOptGroupElement::create(const QualifiedName& tagName, Document& document) { - return adoptRef(*new HTMLOptGroupElement(tagName, document)); + return adoptRef(new HTMLOptGroupElement(tagName, document)); } bool HTMLOptGroupElement::isDisabledFormControl() const @@ -55,16 +56,13 @@ bool HTMLOptGroupElement::isDisabledFormControl() const bool HTMLOptGroupElement::isFocusable() const { - if (!supportsFocus()) - return false; - // Optgroup elements do not have a renderer. - auto* style = const_cast<HTMLOptGroupElement&>(*this).computedStyle(); - return style && style->display() != NONE; + // Optgroup elements do not have a renderer so we check the renderStyle instead. + return supportsFocus() && renderStyle() && renderStyle()->display() != NONE; } const AtomicString& HTMLOptGroupElement::formControlType() const { - static NeverDestroyed<const AtomicString> optgroup("optgroup", AtomicString::ConstructFromLiteral); + DEFINE_STATIC_LOCAL(const AtomicString, optgroup, ("optgroup", AtomicString::ConstructFromLiteral)); return optgroup; } @@ -80,21 +78,53 @@ void HTMLOptGroupElement::parseAttribute(const QualifiedName& name, const Atomic recalcSelectOptions(); if (name == disabledAttr) - setNeedsStyleRecalc(); + didAffectSelector(AffectedSelectorDisabled | AffectedSelectorEnabled); } void HTMLOptGroupElement::recalcSelectOptions() { ContainerNode* select = parentNode(); - while (select && !is<HTMLSelectElement>(*select)) + while (select && !select->hasTagName(selectTag)) select = select->parentNode(); if (select) - downcast<HTMLSelectElement>(*select).setRecalcListItems(); + toHTMLSelectElement(select)->setRecalcListItems(); +} + +void HTMLOptGroupElement::didAttachRenderers() +{ + // 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 HTMLOptGroupElement::willDetachRenderers() +{ + m_style.clear(); +} + +void HTMLOptGroupElement::updateNonRenderStyle() +{ + m_style = document().ensureStyleResolver().styleForElement(this); +} + +RenderStyle* HTMLOptGroupElement::nonRendererStyle() const +{ + return m_style.get(); +} + +PassRefPtr<RenderStyle> HTMLOptGroupElement::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; } String HTMLOptGroupElement::groupLabelText() const { - String itemText = document().displayStringModifiedByEncoding(fastGetAttribute(labelAttr)); + String itemText = document().displayStringModifiedByEncoding(getAttribute(labelAttr)); // In WinIE, leading and trailing whitespace is ignored in options and optgroups. We match this behavior. itemText = itemText.stripWhiteSpace(); @@ -107,13 +137,13 @@ String HTMLOptGroupElement::groupLabelText() const HTMLSelectElement* HTMLOptGroupElement::ownerSelectElement() const { ContainerNode* select = parentNode(); - while (select && !is<HTMLSelectElement>(*select)) + while (select && !select->hasTagName(selectTag)) select = select->parentNode(); if (!select) - return nullptr; + return 0; - return downcast<HTMLSelectElement>(select); + return toHTMLSelectElement(select); } void HTMLOptGroupElement::accessKeyAction(bool) |