Changeset 107524 in webkit


Ignore:
Timestamp:
Feb 12, 2012 7:53:06 PM (12 years ago)
Author:
commit-queue@webkit.org
Message:

INPUT shouldn't create ShadowRoot dynamically.
https://bugs.webkit.org/show_bug.cgi?id=77930

Patch by Shinya Kawanaka <shinyak@google.com> on 2012-02-12
Reviewed by Dimitri Glazkov.

Source/WebCore:

When input type is changed, ShadowRoot was being re-created. This makes it difficult to
support multiple shadow subtrees. This patch makes input re-use the existing shadow root
instead of re-creating a shaow root. A shadow root should be created when an element is created.

Since media control elements are implemented using input elements, these elements should also
create a shadow root in their construction phase.

Test: fast/dom/shadow/input-shadow-nochange.html
Tests related to media controls should be covered by existing tests.

  • html/ColorInputType.cpp:

(WebCore::ColorInputType::createShadowSubtree):

  • html/FileInputType.cpp:

(WebCore::FileInputType::createShadowSubtree):
(WebCore::FileInputType::multipleAttributeChanged):

  • html/HTMLInputElement.cpp:

(WebCore::HTMLInputElement::createShadowSubtree):

  • html/InputType.cpp:

(WebCore::InputType::destroyShadowSubtree):

  • html/RangeInputType.cpp:

(WebCore::RangeInputType::createShadowSubtree):

  • html/TextFieldInputType.cpp:

(WebCore::TextFieldInputType::createShadowSubtree):

  • html/shadow/MediaControlElements.cpp: Creates a shadow tree in the construction phase.

(WebCore::MediaControlPanelMuteButtonElement::create):
(WebCore::MediaControlVolumeSliderMuteButtonElement::create):
(WebCore::MediaControlPlayButtonElement::create):
(WebCore::MediaControlSeekForwardButtonElement::create):
(WebCore::MediaControlSeekBackButtonElement::create):
(WebCore::MediaControlRewindButtonElement::create):
(WebCore::MediaControlReturnToRealtimeButtonElement::create):
(WebCore::MediaControlToggleClosedCaptionsButtonElement::create):
(WebCore::MediaControlTimelineElement::create):
(WebCore::MediaControlVolumeSliderElement::create):
(WebCore::MediaControlFullscreenVolumeSliderElement::create):
(WebCore::MediaControlFullscreenButtonElement::create):
(WebCore::MediaControlFullscreenVolumeMinButtonElement::create):
(WebCore::MediaControlFullscreenVolumeMaxButtonElement::create):

LayoutTests:

Ensures cheaging input type does not cause shadow root recreation.

  • fast/dom/shadow/input-shadow-nochange.html: Added.
  • fast/dom/shadow/input-shadow-nochange-expected.txt: Added.
Location:
trunk
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r107523 r107524  
     12012-02-12  Shinya Kawanaka  <shinyak@google.com>
     2
     3        INPUT shouldn't create ShadowRoot dynamically.
     4        https://bugs.webkit.org/show_bug.cgi?id=77930
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        Ensures cheaging input type does not cause shadow root recreation.
     9
     10        * fast/dom/shadow/input-shadow-nochange.html: Added.
     11        * fast/dom/shadow/input-shadow-nochange-expected.txt: Added.
     12
    1132012-02-12  Shinya Kawanaka  <shinyak@google.com>
    214
  • trunk/Source/WebCore/ChangeLog

    r107523 r107524  
     12012-02-12  Shinya Kawanaka  <shinyak@google.com>
     2
     3        INPUT shouldn't create ShadowRoot dynamically.
     4        https://bugs.webkit.org/show_bug.cgi?id=77930
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        When input type is changed, ShadowRoot was being re-created. This makes it difficult to
     9        support multiple shadow subtrees. This patch makes input re-use the existing shadow root
     10        instead of re-creating a shaow root. A shadow root should be created when an element is created.
     11
     12        Since media control elements are implemented using input elements, these elements should also
     13        create a shadow root in their construction phase.
     14
     15        Test: fast/dom/shadow/input-shadow-nochange.html
     16        Tests related to media controls should be covered by existing tests.
     17
     18        * html/ColorInputType.cpp:
     19        (WebCore::ColorInputType::createShadowSubtree):
     20        * html/FileInputType.cpp:
     21        (WebCore::FileInputType::createShadowSubtree):
     22        (WebCore::FileInputType::multipleAttributeChanged):
     23        * html/HTMLInputElement.cpp:
     24        (WebCore::HTMLInputElement::createShadowSubtree):
     25        * html/InputType.cpp:
     26        (WebCore::InputType::destroyShadowSubtree):
     27        * html/RangeInputType.cpp:
     28        (WebCore::RangeInputType::createShadowSubtree):
     29        * html/TextFieldInputType.cpp:
     30        (WebCore::TextFieldInputType::createShadowSubtree):
     31        * html/shadow/MediaControlElements.cpp:
     32          Creates a shadow tree in the construction phase.
     33        (WebCore::MediaControlPanelMuteButtonElement::create):
     34        (WebCore::MediaControlVolumeSliderMuteButtonElement::create):
     35        (WebCore::MediaControlPlayButtonElement::create):
     36        (WebCore::MediaControlSeekForwardButtonElement::create):
     37        (WebCore::MediaControlSeekBackButtonElement::create):
     38        (WebCore::MediaControlRewindButtonElement::create):
     39        (WebCore::MediaControlReturnToRealtimeButtonElement::create):
     40        (WebCore::MediaControlToggleClosedCaptionsButtonElement::create):
     41        (WebCore::MediaControlTimelineElement::create):
     42        (WebCore::MediaControlVolumeSliderElement::create):
     43        (WebCore::MediaControlFullscreenVolumeSliderElement::create):
     44        (WebCore::MediaControlFullscreenButtonElement::create):
     45        (WebCore::MediaControlFullscreenVolumeMinButtonElement::create):
     46        (WebCore::MediaControlFullscreenVolumeMaxButtonElement::create):
     47
    1482012-02-12  Shinya Kawanaka  <shinyak@google.com>
    249
  • trunk/Source/WebCore/html/ColorInputType.cpp

    r106628 r107524  
    107107void ColorInputType::createShadowSubtree()
    108108{
     109    ASSERT(element()->shadowRoot());
     110
    109111    Document* document = element()->document();
    110112    RefPtr<HTMLDivElement> wrapperElement = HTMLDivElement::create(document);
     
    115117    wrapperElement->appendChild(colorSwatch.release(), ec);
    116118    ASSERT(!ec);
    117     element()->ensureShadowRoot()->appendChild(wrapperElement.release(), ec);
     119    element()->shadowRoot()->appendChild(wrapperElement.release(), ec);
    118120    ASSERT(!ec);
    119121   
  • trunk/Source/WebCore/html/FileInputType.cpp

    r106538 r107524  
    266266void FileInputType::createShadowSubtree()
    267267{
     268    ASSERT(element()->shadowRoot());
    268269    ExceptionCode ec = 0;
    269     element()->ensureShadowRoot()->appendChild(element()->multiple() ? UploadButtonElement::createForMultiple(element()->document()): UploadButtonElement::create(element()->document()), ec);
     270    element()->shadowRoot()->appendChild(element()->multiple() ? UploadButtonElement::createForMultiple(element()->document()): UploadButtonElement::create(element()->document()), ec);
    270271}
    271272
    272273void FileInputType::multipleAttributeChanged()
    273274{
    274     UploadButtonElement* button = static_cast<UploadButtonElement*>(element()->ensureShadowRoot()->firstChild());
     275    ASSERT(element()->shadowRoot());
     276    UploadButtonElement* button = static_cast<UploadButtonElement*>(element()->shadowRoot()->firstChild());
    275277    if (button)
    276278        button->setValue(element()->multiple() ? fileButtonChooseMultipleFilesLabel() : fileButtonChooseFileLabel());
  • trunk/Source/WebCore/html/HTMLInputElement.cpp

    r107491 r107524  
    5252#include "RenderTheme.h"
    5353#include "SearchInputType.h"
     54#include "ShadowRoot.h"
    5455#include "ScriptEventListener.h"
    5556#include "WheelEvent.h"
     
    109110void HTMLInputElement::createShadowSubtree()
    110111{
     112    ASSERT(!shadowRoot());
     113    ShadowRoot::create(this, ShadowRoot::CreatingUserAgentShadowRoot, ASSERT_NO_EXCEPTION);
     114
    111115    m_inputType->createShadowSubtree();
    112116}
  • trunk/Source/WebCore/html/InputType.cpp

    r107175 r107524  
    379379void InputType::destroyShadowSubtree()
    380380{
    381     element()->removeShadowRoot();
     381    if (ShadowRoot* root = element()->shadowRoot())
     382        root->removeAllChildren();
    382383}
    383384
  • trunk/Source/WebCore/html/RangeInputType.cpp

    r100805 r107524  
    234234void RangeInputType::createShadowSubtree()
    235235{
     236    ASSERT(element()->shadowRoot());
     237
    236238    Document* document = element()->document();
    237239    RefPtr<HTMLDivElement> track = HTMLDivElement::create(document);
     
    242244    container->appendChild(track.release(), ec);
    243245    container->appendChild(TrackLimiterElement::create(document), ec);
    244     element()->ensureShadowRoot()->appendChild(container.release(), ec);
     246    element()->shadowRoot()->appendChild(container.release(), ec);
    245247}
    246248
  • trunk/Source/WebCore/html/TextFieldInputType.cpp

    r105937 r107524  
    190190void TextFieldInputType::createShadowSubtree()
    191191{
     192    ASSERT(element()->shadowRoot());
     193
    192194    ASSERT(!m_innerText);
    193195    ASSERT(!m_innerBlock);
     
    202204    m_innerText = TextControlInnerTextElement::create(document);
    203205    if (!createsContainer) {
    204         element()->ensureShadowRoot()->appendChild(m_innerText, ec);
    205         return;
    206     }
    207 
    208     ShadowRoot* shadowRoot = element()->ensureShadowRoot();
     206        element()->shadowRoot()->appendChild(m_innerText, ec);
     207        return;
     208    }
     209
     210    ShadowRoot* shadowRoot = element()->shadowRoot();
    209211    m_container = HTMLDivElement::create(document);
    210212    m_container->setShadowPseudoId("-webkit-textfield-decoration-container");
  • trunk/Source/WebCore/html/shadow/MediaControlElements.cpp

    r106681 r107524  
    494494
    495495    RefPtr<MediaControlPanelMuteButtonElement> button = adoptRef(new MediaControlPanelMuteButtonElement(document, controls));
     496    button->createShadowSubtree();
    496497    button->setType("button");
    497498    return button.release();
     
    522523{
    523524    RefPtr<MediaControlVolumeSliderMuteButtonElement> button = adoptRef(new MediaControlVolumeSliderMuteButtonElement(document));
     525    button->createShadowSubtree();
    524526    button->setType("button");
    525527    return button.release();
     
    542544{
    543545    RefPtr<MediaControlPlayButtonElement> button = adoptRef(new MediaControlPlayButtonElement(document));
     546    button->createShadowSubtree();
    544547    button->setType("button");
    545548    return button.release();
     
    661664{
    662665    RefPtr<MediaControlSeekForwardButtonElement> button = adoptRef(new MediaControlSeekForwardButtonElement(document));
     666    button->createShadowSubtree();
    663667    button->setType("button");
    664668    return button.release();
     
    681685{
    682686    RefPtr<MediaControlSeekBackButtonElement> button = adoptRef(new MediaControlSeekBackButtonElement(document));
     687    button->createShadowSubtree();
    683688    button->setType("button");
    684689    return button.release();
     
    701706{
    702707    RefPtr<MediaControlRewindButtonElement> button = adoptRef(new MediaControlRewindButtonElement(document));
     708    button->createShadowSubtree();
    703709    button->setType("button");
    704710    return button.release();
     
    731737{
    732738    RefPtr<MediaControlReturnToRealtimeButtonElement> button = adoptRef(new MediaControlReturnToRealtimeButtonElement(document));
     739    button->createShadowSubtree();
    733740    button->setType("button");
    734741    button->hide();
     
    761768{
    762769    RefPtr<MediaControlToggleClosedCaptionsButtonElement> button = adoptRef(new MediaControlToggleClosedCaptionsButtonElement(document));
     770    button->createShadowSubtree();
    763771    button->setType("button");
    764772    button->hide();
     
    802810
    803811    RefPtr<MediaControlTimelineElement> timeline = adoptRef(new MediaControlTimelineElement(document, controls));
     812    timeline->createShadowSubtree();
    804813    timeline->setType("range");
    805814    timeline->setAttribute(precisionAttr, "float");
     
    866875{
    867876    RefPtr<MediaControlVolumeSliderElement> slider = adoptRef(new MediaControlVolumeSliderElement(document));
     877    slider->createShadowSubtree();
    868878    slider->setType("range");
    869879    slider->setAttribute(precisionAttr, "float");
     
    916926{
    917927    RefPtr<MediaControlFullscreenVolumeSliderElement> slider = adoptRef(new MediaControlFullscreenVolumeSliderElement(document));
     928    slider->createShadowSubtree();
    918929    slider->setType("range");
    919930    slider->setAttribute(precisionAttr, "float");
     
    941952
    942953    RefPtr<MediaControlFullscreenButtonElement> button = adoptRef(new MediaControlFullscreenButtonElement(document, controls));
     954    button->createShadowSubtree();
    943955    button->setType("button");
    944956    button->hide();
     
    984996{
    985997    RefPtr<MediaControlFullscreenVolumeMinButtonElement> button = adoptRef(new MediaControlFullscreenVolumeMinButtonElement(document));
     998    button->createShadowSubtree();
    986999    button->setType("button");
    9871000    return button.release();
     
    10141027{
    10151028    RefPtr<MediaControlFullscreenVolumeMaxButtonElement> button = adoptRef(new MediaControlFullscreenVolumeMaxButtonElement(document));
     1029    button->createShadowSubtree();
    10161030    button->setType("button");
    10171031    return button.release();
Note: See TracChangeset for help on using the changeset viewer.