Index: Source/core/html/HTMLOptGroupElement.cpp |
diff --git a/Source/core/html/HTMLOptGroupElement.cpp b/Source/core/html/HTMLOptGroupElement.cpp |
index eacf865b5af74cb5a31647d148e3d28faca2a330..5c867f161de4324e2ffa9ed77c7d667b4727c54e 100644 |
--- a/Source/core/html/HTMLOptGroupElement.cpp |
+++ b/Source/core/html/HTMLOptGroupElement.cpp |
@@ -27,8 +27,14 @@ |
#include "core/HTMLNames.h" |
#include "core/dom/NodeRenderStyle.h" |
+#include "core/dom/Text.h" |
+#include "core/editing/htmlediting.h" |
+#include "core/html/HTMLContentElement.h" |
+#include "core/html/HTMLDivElement.h" |
#include "core/html/HTMLSelectElement.h" |
+#include "core/html/shadow/ShadowElementNames.h" |
#include "wtf/StdLibExtras.h" |
+#include "wtf/unicode/CharacterNames.h" |
namespace WebCore { |
@@ -37,21 +43,19 @@ using namespace HTMLNames; |
inline HTMLOptGroupElement::HTMLOptGroupElement(Document& document) |
: HTMLElement(optgroupTag, document) |
{ |
- setHasCustomStyleCallbacks(); |
ScriptWrappable::init(this); |
} |
-DEFINE_NODE_FACTORY(HTMLOptGroupElement) |
- |
-bool HTMLOptGroupElement::isDisabledFormControl() const |
+PassRefPtrWillBeRawPtr<HTMLOptGroupElement> HTMLOptGroupElement::create(Document& document) |
{ |
- return fastHasAttribute(disabledAttr); |
+ RefPtrWillBeRawPtr<HTMLOptGroupElement> optGroupElement = adoptRefWillBeNoop(new HTMLOptGroupElement(document)); |
+ optGroupElement->ensureUserAgentShadowRoot(); |
+ return optGroupElement.release(); |
} |
-bool HTMLOptGroupElement::rendererIsFocusable() const |
+bool HTMLOptGroupElement::isDisabledFormControl() const |
{ |
- // Optgroup elements do not have a renderer so we check the renderStyle instead. |
- return renderStyle() && renderStyle()->display() != NONE; |
+ return fastHasAttribute(disabledAttr); |
} |
void HTMLOptGroupElement::childrenChanged(const ChildrenChange& change) |
@@ -67,6 +71,8 @@ void HTMLOptGroupElement::parseAttribute(const QualifiedName& name, const Atomic |
if (name == disabledAttr) |
didAffectSelector(AffectedSelectorDisabled | AffectedSelectorEnabled); |
+ else if (name == labelAttr) |
+ updateGroupLabel(); |
} |
void HTMLOptGroupElement::recalcSelectOptions() |
@@ -75,42 +81,6 @@ void HTMLOptGroupElement::recalcSelectOptions() |
select->setRecalcListItems(); |
} |
-void HTMLOptGroupElement::attach(const AttachContext& context) |
-{ |
- if (context.resolvedStyle) { |
- ASSERT(!m_style || m_style == context.resolvedStyle); |
- m_style = context.resolvedStyle; |
- } |
- HTMLElement::attach(context); |
-} |
- |
-void HTMLOptGroupElement::detach(const AttachContext& context) |
-{ |
- m_style.clear(); |
- HTMLElement::detach(context); |
-} |
- |
-void HTMLOptGroupElement::updateNonRenderStyle() |
-{ |
- bool oldDisplayNoneStatus = isDisplayNone(); |
- m_style = originalStyleForRenderer(); |
- if (oldDisplayNoneStatus != isDisplayNone()) { |
- if (HTMLSelectElement* select = ownerSelectElement()) |
- select->updateListOnRenderer(); |
- } |
-} |
- |
-RenderStyle* HTMLOptGroupElement::nonRendererStyle() const |
-{ |
- return m_style.get(); |
-} |
- |
-PassRefPtr<RenderStyle> HTMLOptGroupElement::customStyleForRenderer() |
-{ |
- updateNonRenderStyle(); |
- return m_style; |
-} |
- |
String HTMLOptGroupElement::groupLabelText() const |
{ |
String itemText = getAttribute(labelAttr); |
@@ -136,10 +106,34 @@ void HTMLOptGroupElement::accessKeyAction(bool) |
select->accessKeyAction(false); |
} |
-bool HTMLOptGroupElement::isDisplayNone() const |
+void HTMLOptGroupElement::didAddUserAgentShadowRoot(ShadowRoot& root) |
+{ |
+ DEFINE_STATIC_LOCAL(AtomicString, labelPadding, ("0 2px 1px 2px", AtomicString::ConstructFromLiteral)); |
+ DEFINE_STATIC_LOCAL(AtomicString, labelMinHeight, ("1.2em", AtomicString::ConstructFromLiteral)); |
+ RefPtrWillBeRawPtr<HTMLDivElement> label = HTMLDivElement::create(document()); |
+ label->setAttribute(roleAttr, AtomicString("group", AtomicString::ConstructFromLiteral)); |
+ label->setAttribute(aria_labelAttr, AtomicString()); |
+ label->setInlineStyleProperty(CSSPropertyPadding, labelPadding); |
+ label->setInlineStyleProperty(CSSPropertyMinHeight, labelMinHeight); |
+ label->setIdAttribute(ShadowElementNames::optGroupLabel()); |
+ root.appendChild(label); |
+ |
+ RefPtrWillBeRawPtr<HTMLContentElement> content = HTMLContentElement::create(document()); |
+ content->setAttribute(selectAttr, "option,optgroup"); |
+ root.appendChild(content); |
+} |
+ |
+void HTMLOptGroupElement::updateGroupLabel() |
+{ |
+ const String& labelText = groupLabelText(); |
+ HTMLDivElement& label = optGroupLabelElement(); |
+ label.setTextContent(labelText); |
+ label.setAttribute(aria_labelAttr, AtomicString(labelText)); |
+} |
+ |
+HTMLDivElement& HTMLOptGroupElement::optGroupLabelElement() const |
{ |
- RenderStyle* style = nonRendererStyle(); |
- return style && style->display() == NONE; |
+ return *toHTMLDivElement(userAgentShadowRoot()->getElementById(ShadowElementNames::optGroupLabel())); |
} |
} // namespace |