summaryrefslogtreecommitdiff
path: root/Source/WebCore/html/HTMLOptGroupElement.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/WebCore/html/HTMLOptGroupElement.cpp
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-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.cpp60
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)