Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(744)

Unified Diff: Source/core/html/HTMLOptGroupElement.cpp

Issue 347773002: Implement select listbox using shadow DOM (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/html/HTMLOptGroupElement.cpp
diff --git a/Source/core/html/HTMLOptGroupElement.cpp b/Source/core/html/HTMLOptGroupElement.cpp
index 47e6e701ef70f507eae8ca3fae491a6bbe373c45..5da4991ef9e75c55b543ab1fb6f7a2a57be8b353 100644
--- a/Source/core/html/HTMLOptGroupElement.cpp
+++ b/Source/core/html/HTMLOptGroupElement.cpp
@@ -27,33 +27,37 @@
#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 {
using namespace HTMLNames;
+PassRefPtrWillBeRawPtr<HTMLOptGroupElement> HTMLOptGroupElement::create(Document& document)
+{
+ RefPtrWillBeRawPtr<HTMLOptGroupElement> optGroupElement = adoptRefWillBeNoop(new HTMLOptGroupElement(document));
+ optGroupElement->ensureUserAgentShadowRoot();
+ return optGroupElement.release();
+}
+
inline HTMLOptGroupElement::HTMLOptGroupElement(Document& document)
: HTMLElement(optgroupTag, document)
{
- setHasCustomStyleCallbacks();
ScriptWrappable::init(this);
}
-DEFINE_NODE_FACTORY(HTMLOptGroupElement)
-
bool HTMLOptGroupElement::isDisabledFormControl() const
{
return fastHasAttribute(disabledAttr);
}
-bool HTMLOptGroupElement::rendererIsFocusable() const
-{
- // Optgroup elements do not have a renderer so we check the renderStyle instead.
- return renderStyle() && renderStyle()->display() != NONE;
-}
-
void HTMLOptGroupElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta)
{
recalcSelectOptions();
@@ -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,28 @@ void HTMLOptGroupElement::accessKeyAction(bool)
select->accessKeyAction(false);
}
-bool HTMLOptGroupElement::isDisplayNone() const
+void HTMLOptGroupElement::didAddUserAgentShadowRoot(ShadowRoot& root)
+{
+ RefPtrWillBeRawPtr<HTMLDivElement> label = HTMLDivElement::create(document());
+ label->setShadowPseudoId(AtomicString("-webkit-optgroup-label", AtomicString::ConstructFromLiteral));
tkent 2014/07/01 06:45:41 We can't add non-standard pseudo ID. Can we make
keishi 2014/07/02 04:27:22 I think it is hard to add pseudo ids that are only
+ label->setIdAttribute(ShadowElementNames::optGroupLabel());
+ label->setTextContent(nonBreakingSpaceString());
+ root.appendChild(label);
+
+ RefPtrWillBeRawPtr<HTMLContentElement> content = HTMLContentElement::create(document());
+ content->setAttribute(selectAttr, "option,optgroup");
+ root.appendChild(content);
+}
+
+void HTMLOptGroupElement::updateGroupLabel()
+{
+ const String& labelText = groupLabelText();
+ optGroupLabelElement()->setTextContent(labelText.isEmpty() ? nonBreakingSpaceString() : labelText);
+}
+
+HTMLDivElement* HTMLOptGroupElement::optGroupLabelElement() const
{
- RenderStyle* style = nonRendererStyle();
- return style && style->display() == NONE;
+ return toHTMLDivElement(userAgentShadowRoot()->getElementById(ShadowElementNames::optGroupLabel()));
}
} // namespace

Powered by Google App Engine
This is Rietveld 408576698