Merge from Chromium at DEPS revision r207203

This commit was generated by merge_to_master.py.

Change-Id: Ia8a6c2a997232c94108d8937f8c2556f42be1c37
diff --git a/Source/core/html/shadow/ClearButtonElement.cpp b/Source/core/html/shadow/ClearButtonElement.cpp
index 97ccd40..58acf52 100644
--- a/Source/core/html/shadow/ClearButtonElement.cpp
+++ b/Source/core/html/shadow/ClearButtonElement.cpp
@@ -41,22 +41,23 @@
     , m_clearButtonOwner(&clearButtonOwner)
     , m_capturing(false)
 {
-    setPseudo(AtomicString("-webkit-clear-button", AtomicString::ConstructFromLiteral));
-    setAttribute(idAttr, ShadowElementNames::clearButton());
 }
 
 PassRefPtr<ClearButtonElement> ClearButtonElement::create(Document* document, ClearButtonOwner& clearButtonOwner)
 {
-    return adoptRef(new ClearButtonElement(document, clearButtonOwner));
+    RefPtr<ClearButtonElement> element = adoptRef(new ClearButtonElement(document, clearButtonOwner));
+    element->setPseudo(AtomicString("-webkit-clear-button", AtomicString::ConstructFromLiteral));
+    element->setAttribute(idAttr, ShadowElementNames::clearButton());
+    return element.release();
 }
 
-void ClearButtonElement::detach()
+void ClearButtonElement::detach(const AttachContext& context)
 {
     if (m_capturing) {
         if (Frame* frame = document()->frame())
             frame->eventHandler()->setCapturingMouseEventsNode(0);
     }
-    HTMLDivElement::detach();
+    HTMLDivElement::detach(context);
 }
 
 void ClearButtonElement::releaseCapture()
diff --git a/Source/core/html/shadow/ClearButtonElement.h b/Source/core/html/shadow/ClearButtonElement.h
index 9b9c0c0..a08b1d3 100644
--- a/Source/core/html/shadow/ClearButtonElement.h
+++ b/Source/core/html/shadow/ClearButtonElement.h
@@ -47,7 +47,7 @@
 
 private:
     ClearButtonElement(Document*, ClearButtonOwner&);
-    virtual void detach();
+    virtual void detach(const AttachContext& = AttachContext()) OVERRIDE;
     virtual bool isMouseFocusable() const { return false; }
     virtual void defaultEventHandler(Event*);
     virtual bool isClearButtonElement() const OVERRIDE;
diff --git a/Source/core/html/shadow/DateTimeEditElement.cpp b/Source/core/html/shadow/DateTimeEditElement.cpp
index 37beb2f..07b774d 100644
--- a/Source/core/html/shadow/DateTimeEditElement.cpp
+++ b/Source/core/html/shadow/DateTimeEditElement.cpp
@@ -447,9 +447,6 @@
     : HTMLDivElement(divTag, document)
     , m_editControlOwner(&editControlOwner)
 {
-    DEFINE_STATIC_LOCAL(AtomicString, dateTimeEditPseudoId, ("-webkit-datetime-edit", AtomicString::ConstructFromLiteral));
-    setPseudo(dateTimeEditPseudoId);
-    setAttribute(idAttr, ShadowElementNames::dateTimeEdit());
     setHasCustomStyleCallbacks();
 }
 
@@ -491,6 +488,8 @@
 PassRefPtr<DateTimeEditElement> DateTimeEditElement::create(Document* document, EditControlOwner& editControlOwner)
 {
     RefPtr<DateTimeEditElement> container = adoptRef(new DateTimeEditElement(document, editControlOwner));
+    container->setPseudo(AtomicString("-webkit-datetime-edit", AtomicString::ConstructFromLiteral));
+    container->setAttribute(idAttr, ShadowElementNames::dateTimeEdit());
     return container.release();
 }
 
diff --git a/Source/core/html/shadow/DateTimeFieldElement.cpp b/Source/core/html/shadow/DateTimeFieldElement.cpp
index 545ac02..db8f421 100644
--- a/Source/core/html/shadow/DateTimeFieldElement.cpp
+++ b/Source/core/html/shadow/DateTimeFieldElement.cpp
@@ -46,9 +46,6 @@
     : HTMLSpanElement(spanTag, document)
     , m_fieldOwner(&fieldOwner)
 {
-    // On accessibility, DateTimeFieldElement acts like spin button.
-    setAttribute(roleAttr, "spinbutton");
-    setAttribute(aria_valuetextAttr, AXDateTimeFieldEmptyValueText());
 }
 
 void DateTimeFieldElement::defaultEventHandler(Event* event)
@@ -149,9 +146,13 @@
 
 void DateTimeFieldElement::initialize(const AtomicString& pseudo, const String& axHelpText, int axMinimum, int axMaximum)
 {
-    setAttribute(aria_helpAttr, axHelpText);
+    // On accessibility, DateTimeFieldElement acts like spin button.
+    setAttribute(roleAttr, AtomicString("spinbutton", AtomicString::ConstructFromLiteral));
+    setAttribute(aria_valuetextAttr, AXDateTimeFieldEmptyValueText());
     setAttribute(aria_valueminAttr, String::number(axMinimum));
     setAttribute(aria_valuemaxAttr, String::number(axMaximum));
+
+    setAttribute(aria_helpAttr, axHelpText);
     setPseudo(pseudo);
     appendChild(Text::create(document(), visibleValue()));
 }
@@ -171,15 +172,6 @@
     return m_fieldOwner && m_fieldOwner->isFieldOwnerReadOnly();
 }
 
-bool DateTimeFieldElement::isFocusable() const
-{
-    if (isDisabled())
-        return false;
-    if (isFieldOwnerDisabled())
-        return false;
-    return HTMLElement::isFocusable();
-}
-
 bool DateTimeFieldElement::isDisabled() const
 {
     return fastHasAttribute(disabledAttr);
@@ -210,7 +202,7 @@
 
 bool DateTimeFieldElement::supportsFocus() const
 {
-    return true;
+    return !isDisabled() && !isFieldOwnerDisabled();
 }
 
 void DateTimeFieldElement::updateVisibleValue(EventBehavior eventBehavior)
diff --git a/Source/core/html/shadow/DateTimeFieldElement.h b/Source/core/html/shadow/DateTimeFieldElement.h
index 0b0118d..896d6bc 100644
--- a/Source/core/html/shadow/DateTimeFieldElement.h
+++ b/Source/core/html/shadow/DateTimeFieldElement.h
@@ -64,7 +64,6 @@
     virtual void defaultEventHandler(Event*) OVERRIDE;
     virtual bool hasValue() const = 0;
     bool isDisabled() const;
-    virtual bool isFocusable() const OVERRIDE FINAL;
     virtual float maximumWidth(const Font&);
     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) = 0;
     void removeEventHandler() { m_fieldOwner = 0; }
diff --git a/Source/core/html/shadow/DetailsMarkerControl.cpp b/Source/core/html/shadow/DetailsMarkerControl.cpp
index e797072..84fa604 100644
--- a/Source/core/html/shadow/DetailsMarkerControl.cpp
+++ b/Source/core/html/shadow/DetailsMarkerControl.cpp
@@ -54,12 +54,6 @@
     return summaryElement()->isMainSummary() && HTMLDivElement::rendererIsNeeded(context);
 }
 
-const AtomicString& DetailsMarkerControl::shadowPseudoId() const
-{
-    DEFINE_STATIC_LOCAL(AtomicString, pseudId, ("-webkit-details-marker", AtomicString::ConstructFromLiteral));
-    return pseudId;
-}
-
 HTMLSummaryElement* DetailsMarkerControl::summaryElement()
 {
     Element* element = shadowHost();
diff --git a/Source/core/html/shadow/DetailsMarkerControl.h b/Source/core/html/shadow/DetailsMarkerControl.h
index 867f6f1..9cd6e66 100644
--- a/Source/core/html/shadow/DetailsMarkerControl.h
+++ b/Source/core/html/shadow/DetailsMarkerControl.h
@@ -46,14 +46,15 @@
 private:
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
     virtual bool rendererIsNeeded(const NodeRenderingContext&);
-    virtual const AtomicString& shadowPseudoId() const;
 
     HTMLSummaryElement* summaryElement();
 };
 
 inline PassRefPtr<DetailsMarkerControl> DetailsMarkerControl::create(Document* document)
 {
-    return adoptRef(new DetailsMarkerControl(document));
+    RefPtr<DetailsMarkerControl> element = adoptRef(new DetailsMarkerControl(document));
+    element->setPseudo(AtomicString("-webkit-details-marker", AtomicString::ConstructFromLiteral));
+    return element.release();
 }
 
 }
diff --git a/Source/core/html/shadow/HTMLShadowElement.cpp b/Source/core/html/shadow/HTMLShadowElement.cpp
index 7c1383f..3c69757 100644
--- a/Source/core/html/shadow/HTMLShadowElement.cpp
+++ b/Source/core/html/shadow/HTMLShadowElement.cpp
@@ -61,12 +61,13 @@
     if (!containingRoot)
         return 0;
 
-    ContentDistributor::ensureDistribution(containingRoot);
+    containingRoot->host()->ensureDistribution();
 
     ShadowRoot* older = containingRoot->olderShadowRoot();
-    if (!older || older->type() != ShadowRoot::AuthorShadowRoot || ScopeContentDistribution::assignedTo(older) != this)
+    if (!older || !older->shouldExposeToBindings() || ScopeContentDistribution::assignedTo(older) != this)
         return 0;
 
+    ASSERT(older->shouldExposeToBindings());
     return older;
 }
 
diff --git a/Source/core/html/shadow/HTMLShadowElement.idl b/Source/core/html/shadow/HTMLShadowElement.idl
index a252e14..3b6351b 100644
--- a/Source/core/html/shadow/HTMLShadowElement.idl
+++ b/Source/core/html/shadow/HTMLShadowElement.idl
@@ -30,5 +30,5 @@
 
 interface HTMLShadowElement : HTMLElement {
     attribute boolean resetStyleInheritance;
-    readonly attribute ShadowRoot olderShadowRoot;
+    [DeprecateAs=HTMLShadowElementOlderShadowRoot] readonly attribute ShadowRoot olderShadowRoot;
 };
diff --git a/Source/core/html/shadow/MediaControlElements.cpp b/Source/core/html/shadow/MediaControlElements.cpp
index 6eae3dd..243144a 100644
--- a/Source/core/html/shadow/MediaControlElements.cpp
+++ b/Source/core/html/shadow/MediaControlElements.cpp
@@ -34,6 +34,7 @@
 #include "core/dom/EventNames.h"
 #include "core/dom/EventTarget.h"
 #include "core/dom/ExceptionCodePlaceholder.h"
+#include "core/dom/FullscreenController.h"
 #include "core/dom/MouseEvent.h"
 #include "core/html/DOMTokenList.h"
 #include "core/html/HTMLVideoElement.h"
@@ -588,10 +589,10 @@
         // video implementation without requiring them to implement their own full
         // screen behavior.
         if (document()->settings() && document()->settings()->fullScreenEnabled()) {
-            if (document()->webkitIsFullScreen() && document()->webkitCurrentFullScreenElement() == toParentMediaElement(this))
-                document()->webkitCancelFullScreen();
+            if (FullscreenController::isActiveFullScreenElement(toParentMediaElement(this)))
+                FullscreenController::from(document())->webkitCancelFullScreen();
             else
-                document()->requestFullScreenForElement(toParentMediaElement(this), 0, Document::ExemptIFrameAllowFullScreenRequirement);
+                FullscreenController::from(document())->requestFullScreenForElement(toParentMediaElement(this), 0, FullscreenController::ExemptIFrameAllowFullScreenRequirement);
         } else
             mediaController()->enterFullscreen();
         event->setDefaultHandled();
diff --git a/Source/core/html/shadow/MeterShadowElement.cpp b/Source/core/html/shadow/MeterShadowElement.cpp
index 8b79697..482c4eb 100644
--- a/Source/core/html/shadow/MeterShadowElement.cpp
+++ b/Source/core/html/shadow/MeterShadowElement.cpp
@@ -42,7 +42,7 @@
 
 using namespace HTMLNames;
 
-MeterShadowElement::MeterShadowElement(Document* document) 
+inline MeterShadowElement::MeterShadowElement(Document* document)
     : HTMLDivElement(HTMLNames::divTag, document)
 {
 }
@@ -58,11 +58,16 @@
     return render && !render->theme()->supportsMeter(render->style()->appearance()) && HTMLDivElement::rendererIsNeeded(context);
 }
 
-MeterInnerElement::MeterInnerElement(Document* document)
+inline MeterInnerElement::MeterInnerElement(Document* document)
     : MeterShadowElement(document)
 {
-    DEFINE_STATIC_LOCAL(AtomicString, pseudoId, ("-webkit-meter-inner-element", AtomicString::ConstructFromLiteral));
-    setPseudo(pseudoId);
+}
+
+PassRefPtr<MeterInnerElement> MeterInnerElement::create(Document* document)
+{
+    RefPtr<MeterInnerElement> element = adoptRef(new MeterInnerElement(document));
+    element->setPseudo(AtomicString("-webkit-meter-inner-element", AtomicString::ConstructFromLiteral));
+    return element.release();
 }
 
 bool MeterInnerElement::rendererIsNeeded(const NodeRenderingContext& context)
@@ -79,6 +84,30 @@
     return new (arena) RenderMeter(this);
 }
 
+inline MeterBarElement::MeterBarElement(Document* document)
+    : MeterShadowElement(document)
+{
+}
+
+PassRefPtr<MeterBarElement> MeterBarElement::create(Document* document)
+{
+    RefPtr<MeterBarElement> element = adoptRef(new MeterBarElement(document));
+    element->setPseudo(AtomicString("-webkit-meter-bar", AtomicString::ConstructFromLiteral));
+    return element.release();
+}
+
+inline MeterValueElement::MeterValueElement(Document* document)
+    : MeterShadowElement(document)
+{
+}
+
+PassRefPtr<MeterValueElement> MeterValueElement::create(Document* document)
+{
+    RefPtr<MeterValueElement> element = adoptRef(new MeterValueElement(document));
+    element->updatePseudo();
+    return element.release();
+}
+
 const AtomicString& MeterValueElement::valuePseudoId() const
 {
     DEFINE_STATIC_LOCAL(AtomicString, optimumPseudoId, ("-webkit-meter-optimum-value", AtomicString::ConstructFromLiteral));
diff --git a/Source/core/html/shadow/MeterShadowElement.h b/Source/core/html/shadow/MeterShadowElement.h
index 3f4bdd4..e076515 100644
--- a/Source/core/html/shadow/MeterShadowElement.h
+++ b/Source/core/html/shadow/MeterShadowElement.h
@@ -40,7 +40,7 @@
 class RenderMeter;
 
 class MeterShadowElement : public HTMLDivElement {
-public:
+protected:
     MeterShadowElement(Document*);
     HTMLMeterElement* meterElement() const;
 
@@ -50,57 +50,33 @@
 
 class MeterInnerElement FINAL : public MeterShadowElement {
 public:
-    MeterInnerElement(Document*);
     static PassRefPtr<MeterInnerElement> create(Document*);
 
 private:
+    MeterInnerElement(Document*);
     virtual bool rendererIsNeeded(const NodeRenderingContext&) OVERRIDE;
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) OVERRIDE;
 };
 
-inline PassRefPtr<MeterInnerElement> MeterInnerElement::create(Document* document)
-{
-    return adoptRef(new MeterInnerElement(document));
-}
-
 class MeterBarElement FINAL : public MeterShadowElement {
-public:
-    MeterBarElement(Document* document) 
-        : MeterShadowElement(document)
-    {
-        DEFINE_STATIC_LOCAL(AtomicString, pseudoId, ("-webkit-meter-bar", AtomicString::ConstructFromLiteral));
-        setPseudo(pseudoId);
-    }
+private:
+    MeterBarElement(Document*);
 
+public:
     static PassRefPtr<MeterBarElement> create(Document*);
 };
 
-inline PassRefPtr<MeterBarElement> MeterBarElement::create(Document* document)
-{
-    return adoptRef(new MeterBarElement(document));
-}
-
 class MeterValueElement FINAL : public MeterShadowElement {
 public:
-    MeterValueElement(Document* document) 
-        : MeterShadowElement(document)
-    {
-        updatePseudo();
-    }
-
     static PassRefPtr<MeterValueElement> create(Document*);
     void setWidthPercentage(double);
     void updatePseudo() { setPseudo(valuePseudoId()); }
 
 private:
+    MeterValueElement(Document*);
     const AtomicString& valuePseudoId() const;
 };
 
-inline PassRefPtr<MeterValueElement> MeterValueElement::create(Document* document)
-{
-    return adoptRef(new MeterValueElement(document));
-}
-
 }
 
 #endif // MeterShadowElement_h
diff --git a/Source/core/html/shadow/PickerIndicatorElement.cpp b/Source/core/html/shadow/PickerIndicatorElement.cpp
index dbe8453..37531e4 100644
--- a/Source/core/html/shadow/PickerIndicatorElement.cpp
+++ b/Source/core/html/shadow/PickerIndicatorElement.cpp
@@ -48,13 +48,14 @@
     : HTMLDivElement(divTag, document)
     , m_pickerIndicatorOwner(&pickerIndicatorOwner)
 {
-    setPseudo(AtomicString("-webkit-calendar-picker-indicator", AtomicString::ConstructFromLiteral));
-    setAttribute(idAttr, ShadowElementNames::pickerIndicator());
 }
 
 PassRefPtr<PickerIndicatorElement> PickerIndicatorElement::create(Document* document, PickerIndicatorOwner& pickerIndicatorOwner)
 {
-    return adoptRef(new PickerIndicatorElement(document, pickerIndicatorOwner));
+    RefPtr<PickerIndicatorElement> element = adoptRef(new PickerIndicatorElement(document, pickerIndicatorOwner));
+    element->setPseudo(AtomicString("-webkit-calendar-picker-indicator", AtomicString::ConstructFromLiteral));
+    element->setAttribute(idAttr, ShadowElementNames::pickerIndicator());
+    return element.release();
 }
 
 PickerIndicatorElement::~PickerIndicatorElement()
@@ -125,10 +126,10 @@
     m_chooser->endChooser();
 }
 
-void PickerIndicatorElement::detach()
+void PickerIndicatorElement::detach(const AttachContext& context)
 {
     closePopup();
-    HTMLDivElement::detach();
+    HTMLDivElement::detach(context);
 }
 
 bool PickerIndicatorElement::isPickerIndicatorElement() const
diff --git a/Source/core/html/shadow/PickerIndicatorElement.h b/Source/core/html/shadow/PickerIndicatorElement.h
index a380672..496d151 100644
--- a/Source/core/html/shadow/PickerIndicatorElement.h
+++ b/Source/core/html/shadow/PickerIndicatorElement.h
@@ -69,7 +69,7 @@
     PickerIndicatorElement(Document*, PickerIndicatorOwner&);
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) OVERRIDE;
     virtual void defaultEventHandler(Event*) OVERRIDE;
-    virtual void detach() OVERRIDE;
+    virtual void detach(const AttachContext& = AttachContext()) OVERRIDE;
     virtual bool isPickerIndicatorElement() const OVERRIDE;
 
     HTMLInputElement* hostInput();
diff --git a/Source/core/html/shadow/ProgressShadowElement.cpp b/Source/core/html/shadow/ProgressShadowElement.cpp
index 030c1ce..f7fdc8a 100644
--- a/Source/core/html/shadow/ProgressShadowElement.cpp
+++ b/Source/core/html/shadow/ProgressShadowElement.cpp
@@ -65,7 +65,9 @@
 
 PassRefPtr<ProgressInnerElement> ProgressInnerElement::create(Document* document)
 {
-    return adoptRef(new ProgressInnerElement(document));
+    RefPtr<ProgressInnerElement> element = adoptRef(new ProgressInnerElement(document));
+    element->setPseudo(AtomicString("-webkit-progress-inner-element", AtomicString::ConstructFromLiteral));
+    return element.release();
 }
 
 RenderObject* ProgressInnerElement::createRenderer(RenderArena* arena, RenderStyle*)
diff --git a/Source/core/html/shadow/SliderThumbElement.cpp b/Source/core/html/shadow/SliderThumbElement.cpp
index cdcddf3..3579d9a 100644
--- a/Source/core/html/shadow/SliderThumbElement.cpp
+++ b/Source/core/html/shadow/SliderThumbElement.cpp
@@ -72,8 +72,8 @@
 
 SliderThumbElement* sliderThumbElementOf(Node* node)
 {
-    ASSERT(node);
-    ShadowRoot* shadow = node->toInputElement()->userAgentShadowRoot();
+    RELEASE_ASSERT(node->hasTagName(inputTag));
+    ShadowRoot* shadow = toHTMLInputElement(node)->userAgentShadowRoot();
     ASSERT(shadow);
     Node* thumb = shadow->firstChild()->firstChild()->firstChild();
     ASSERT(thumb);
@@ -82,8 +82,8 @@
 
 HTMLElement* sliderTrackElementOf(Node* node)
 {
-    ASSERT(node);
-    ShadowRoot* shadow = node->toInputElement()->userAgentShadowRoot();
+    RELEASE_ASSERT(node->hasTagName(inputTag));
+    ShadowRoot* shadow = toHTMLInputElement(node)->userAgentShadowRoot();
     ASSERT(shadow);
     Node* track = shadow->firstChild()->firstChild();
     ASSERT(track);
@@ -135,7 +135,7 @@
 
 void RenderSliderContainer::computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop, LogicalExtentComputedValues& computedValues) const
 {
-    HTMLInputElement* input = node()->shadowHost()->toInputElement();
+    HTMLInputElement* input = toHTMLInputElement(node()->shadowHost());
     bool isVertical = hasVerticalAppearance(input);
 
     if (input->renderer()->isSlider() && !isVertical && input->list()) {
@@ -161,7 +161,7 @@
 
 void RenderSliderContainer::layout()
 {
-    HTMLInputElement* input = node()->shadowHost()->toInputElement();
+    HTMLInputElement* input = toHTMLInputElement(node()->shadowHost());
     bool isVertical = hasVerticalAppearance(input);
     style()->setFlexDirection(isVertical ? FlowColumn : FlowRow);
     TextDirection oldTextDirection = style()->direction();
@@ -227,7 +227,7 @@
 
 bool SliderThumbElement::isDisabledFormControl() const
 {
-    return hostInput()->isDisabledFormControl();
+    return hostInput() && hostInput()->isDisabledFormControl();
 }
 
 bool SliderThumbElement::matchesReadOnlyPseudoClass() const
@@ -388,20 +388,20 @@
     return HTMLDivElement::willRespondToMouseClickEvents();
 }
 
-void SliderThumbElement::detach()
+void SliderThumbElement::detach(const AttachContext& context)
 {
     if (m_inDragMode) {
         if (Frame* frame = document()->frame())
             frame->eventHandler()->setCapturingMouseEventsNode(0);
     }
-    HTMLDivElement::detach();
+    HTMLDivElement::detach(context);
 }
 
 HTMLInputElement* SliderThumbElement::hostInput() const
 {
     // Only HTMLInputElement creates SliderThumbElement instances as its shadow nodes.
     // So, shadowHost() must be an HTMLInputElement.
-    return shadowHost()->toInputElement();
+    return toHTMLInputElement(shadowHost());
 }
 
 static const AtomicString& sliderThumbShadowPseudoId()
@@ -458,11 +458,10 @@
     DEFINE_STATIC_LOCAL(const AtomicString, mediaSliderContainer, ("-webkit-media-slider-container", AtomicString::ConstructFromLiteral));
     DEFINE_STATIC_LOCAL(const AtomicString, sliderContainer, ("-webkit-slider-container", AtomicString::ConstructFromLiteral));
 
-    HTMLInputElement* input = shadowHost()->toInputElement();
-    if (!input)
+    if (!shadowHost()->hasTagName(inputTag))
         return sliderContainer;
 
-    RenderStyle* sliderStyle = input->renderer()->style();
+    RenderStyle* sliderStyle = toHTMLInputElement(shadowHost())->renderer()->style();
     switch (sliderStyle->appearance()) {
     case MediaSliderPart:
     case MediaSliderThumbPart:
diff --git a/Source/core/html/shadow/SliderThumbElement.h b/Source/core/html/shadow/SliderThumbElement.h
index 1b935e6..983d44b 100644
--- a/Source/core/html/shadow/SliderThumbElement.h
+++ b/Source/core/html/shadow/SliderThumbElement.h
@@ -56,7 +56,7 @@
     virtual void defaultEventHandler(Event*);
     virtual bool willRespondToMouseMoveEvents() OVERRIDE;
     virtual bool willRespondToMouseClickEvents() OVERRIDE;
-    virtual void detach();
+    virtual void detach(const AttachContext& = AttachContext()) OVERRIDE;
     virtual const AtomicString& shadowPseudoId() const;
     HTMLInputElement* hostInput() const;
     void setPositionFromPoint(const LayoutPoint&);
diff --git a/Source/core/html/shadow/SpinButtonElement.cpp b/Source/core/html/shadow/SpinButtonElement.cpp
index f2d8709..f82212f 100644
--- a/Source/core/html/shadow/SpinButtonElement.cpp
+++ b/Source/core/html/shadow/SpinButtonElement.cpp
@@ -51,24 +51,20 @@
     , m_pressStartingState(Indeterminate)
     , m_repeatingTimer(this, &SpinButtonElement::repeatingTimerFired)
 {
-    setAttribute(idAttr, ShadowElementNames::spinButton());
 }
 
 PassRefPtr<SpinButtonElement> SpinButtonElement::create(Document* document, SpinButtonOwner& spinButtonOwner)
 {
-    return adoptRef(new SpinButtonElement(document, spinButtonOwner));
+    RefPtr<SpinButtonElement> element = adoptRef(new SpinButtonElement(document, spinButtonOwner));
+    element->setPseudo(AtomicString("-webkit-inner-spin-button", AtomicString::ConstructFromLiteral));
+    element->setAttribute(idAttr, ShadowElementNames::spinButton());
+    return element.release();
 }
 
-const AtomicString& SpinButtonElement::shadowPseudoId() const
-{
-    DEFINE_STATIC_LOCAL(AtomicString, innerPseudoId, ("-webkit-inner-spin-button", AtomicString::ConstructFromLiteral));
-    return innerPseudoId;
-}
-
-void SpinButtonElement::detach()
+void SpinButtonElement::detach(const AttachContext& context)
 {
     releaseCapture();
-    HTMLDivElement::detach();
+    HTMLDivElement::detach(context);
 }
 
 void SpinButtonElement::defaultEventHandler(Event* event)
diff --git a/Source/core/html/shadow/SpinButtonElement.h b/Source/core/html/shadow/SpinButtonElement.h
index 6f6611b..03f7da4 100644
--- a/Source/core/html/shadow/SpinButtonElement.h
+++ b/Source/core/html/shadow/SpinButtonElement.h
@@ -69,8 +69,7 @@
 private:
     SpinButtonElement(Document*, SpinButtonOwner&);
 
-    virtual const AtomicString& shadowPseudoId() const;
-    virtual void detach();
+    virtual void detach(const AttachContext& = AttachContext()) OVERRIDE;
     virtual bool isSpinButtonElement() const { return true; }
     virtual bool isDisabledFormControl() const OVERRIDE { return shadowHost() && shadowHost()->isDisabledFormControl(); }
     virtual bool matchesReadOnlyPseudoClass() const OVERRIDE;
diff --git a/Source/core/html/shadow/TextControlInnerElements.cpp b/Source/core/html/shadow/TextControlInnerElements.cpp
index 811f994..0eb551d 100644
--- a/Source/core/html/shadow/TextControlInnerElements.cpp
+++ b/Source/core/html/shadow/TextControlInnerElements.cpp
@@ -145,8 +145,8 @@
     Element* host = shadowHost();
     if (!host)
         return resultsDecorationId;
-    if (HTMLInputElement* input = host->toInputElement()) {
-        if (input->maxResults() < 0)
+    if (host->hasTagName(inputTag)) {
+        if (toHTMLInputElement(host)->maxResults() < 0)
             return decorationId;
         return resultsDecorationId;
     }
@@ -183,22 +183,18 @@
 
 PassRefPtr<SearchFieldCancelButtonElement> SearchFieldCancelButtonElement::create(Document* document)
 {
-    return adoptRef(new SearchFieldCancelButtonElement(document));
+    RefPtr<SearchFieldCancelButtonElement> element = adoptRef(new SearchFieldCancelButtonElement(document));
+    element->setPseudo(AtomicString("-webkit-search-cancel-button", AtomicString::ConstructFromLiteral));
+    return element.release();
 }
 
-const AtomicString& SearchFieldCancelButtonElement::shadowPseudoId() const
-{
-    DEFINE_STATIC_LOCAL(AtomicString, pseudoId, ("-webkit-search-cancel-button", AtomicString::ConstructFromLiteral));
-    return pseudoId;
-}
-
-void SearchFieldCancelButtonElement::detach()
+void SearchFieldCancelButtonElement::detach(const AttachContext& context)
 {
     if (m_capturing) {
         if (Frame* frame = document()->frame())
             frame->eventHandler()->setCapturingMouseEventsNode(0);
     }
-    HTMLDivElement::detach();
+    HTMLDivElement::detach(context);
 }
 
 
@@ -275,7 +271,9 @@
 
 PassRefPtr<InputFieldSpeechButtonElement> InputFieldSpeechButtonElement::create(Document* document)
 {
-    return adoptRef(new InputFieldSpeechButtonElement(document));
+    RefPtr<InputFieldSpeechButtonElement> element = adoptRef(new InputFieldSpeechButtonElement(document));
+    element->setPseudo(AtomicString("-webkit-input-speech-button", AtomicString::ConstructFromLiteral));
+    return element.release();
 }
 
 void InputFieldSpeechButtonElement::defaultEventHandler(Event* event)
@@ -401,15 +399,15 @@
         renderer()->repaint();
 }
 
-void InputFieldSpeechButtonElement::attach()
+void InputFieldSpeechButtonElement::attach(const AttachContext& context)
 {
     ASSERT(!m_listenerId);
     if (SpeechInput* input = SpeechInput::from(document()->page()))
         m_listenerId = input->registerListener(this);
-    HTMLDivElement::attach();
+    HTMLDivElement::attach(context);
 }
 
-void InputFieldSpeechButtonElement::detach()
+void InputFieldSpeechButtonElement::detach(const AttachContext& context)
 {
     if (m_capturing) {
         if (Frame* frame = document()->frame())
@@ -423,7 +421,7 @@
         m_listenerId = 0;
     }
 
-    HTMLDivElement::detach();
+    HTMLDivElement::detach(context);
 }
 
 void InputFieldSpeechButtonElement::startSpeechInput()
@@ -444,13 +442,6 @@
     if (m_state == Recording)
         speechInput()->stopRecording(m_listenerId);
 }
-
-const AtomicString& InputFieldSpeechButtonElement::shadowPseudoId() const
-{
-    DEFINE_STATIC_LOCAL(AtomicString, pseudoId, ("-webkit-input-speech-button", AtomicString::ConstructFromLiteral));
-    return pseudoId;
-}
-
 #endif // ENABLE(INPUT_SPEECH)
 
 }
diff --git a/Source/core/html/shadow/TextControlInnerElements.h b/Source/core/html/shadow/TextControlInnerElements.h
index 7a74919..78ad561 100644
--- a/Source/core/html/shadow/TextControlInnerElements.h
+++ b/Source/core/html/shadow/TextControlInnerElements.h
@@ -90,8 +90,7 @@
 
 private:
     SearchFieldCancelButtonElement(Document*);
-    virtual const AtomicString& shadowPseudoId() const;
-    virtual void detach();
+    virtual void detach(const AttachContext& = AttachContext()) OVERRIDE;
     virtual bool isMouseFocusable() const { return false; }
 
     bool m_capturing;
@@ -112,7 +111,7 @@
     static PassRefPtr<InputFieldSpeechButtonElement> create(Document*);
     virtual ~InputFieldSpeechButtonElement();
 
-    virtual void detach();
+    virtual void detach(const AttachContext& = AttachContext()) OVERRIDE;
     virtual void defaultEventHandler(Event*);
     virtual bool willRespondToMouseClickEvents();
     virtual bool isInputFieldSpeechButtonElement() const { return true; }
@@ -129,9 +128,8 @@
     InputFieldSpeechButtonElement(Document*);
     SpeechInput* speechInput();
     void setState(SpeechInputState state);
-    virtual const AtomicString& shadowPseudoId() const;
     virtual bool isMouseFocusable() const { return false; }
-    virtual void attach();
+    virtual void attach(const AttachContext& = AttachContext()) OVERRIDE;
 
     bool m_capturing;
     SpeechInputState m_state;
diff --git a/Source/core/html/shadow/TextFieldDecorationElement.cpp b/Source/core/html/shadow/TextFieldDecorationElement.cpp
index d20fb0d..f281d43 100644
--- a/Source/core/html/shadow/TextFieldDecorationElement.cpp
+++ b/Source/core/html/shadow/TextFieldDecorationElement.cpp
@@ -169,16 +169,16 @@
     return image;
 }
 
-void TextFieldDecorationElement::attach()
+void TextFieldDecorationElement::attach(const AttachContext& context)
 {
-    HTMLDivElement::attach();
+    HTMLDivElement::attach(context);
     updateImage();
 }
 
-void TextFieldDecorationElement::detach()
+void TextFieldDecorationElement::detach(const AttachContext& context)
 {
     m_textFieldDecorator->willDetach(hostInput());
-    HTMLDivElement::detach();
+    HTMLDivElement::detach(context);
 }
 
 bool TextFieldDecorationElement::isMouseFocusable() const
diff --git a/Source/core/html/shadow/TextFieldDecorationElement.h b/Source/core/html/shadow/TextFieldDecorationElement.h
index cf34338..5222044 100644
--- a/Source/core/html/shadow/TextFieldDecorationElement.h
+++ b/Source/core/html/shadow/TextFieldDecorationElement.h
@@ -80,8 +80,8 @@
     virtual bool isTextFieldDecoration() const OVERRIDE;
     virtual PassRefPtr<RenderStyle> customStyleForRenderer() OVERRIDE;
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) OVERRIDE;
-    virtual void attach() OVERRIDE;
-    virtual void detach() OVERRIDE;
+    virtual void attach(const AttachContext& = AttachContext()) OVERRIDE;
+    virtual void detach(const AttachContext& = AttachContext()) OVERRIDE;
     virtual bool isMouseFocusable() const OVERRIDE;
     virtual void defaultEventHandler(Event*) OVERRIDE;