Skip to content
  • commit-queue@webkit.org's avatar
    :hover style not applied on hover if its display property is different from original style's · 83fb9b9a
    commit-queue@webkit.org authored
    https://bugs.webkit.org/show_bug.cgi?id=7555
    
    Source/WebCore:
    
    Properly apply the :hover pseudo-class when reattaching is required (e.g. when changing the display type)
    
    A new AttachContext class was created to be passed along as an optional parameter to the attach/detach/reattach methods.
    This new parameter is used to:
        - prevent the element from being removed from the list of hovered/active elements upon detach when a reattach is in progress
        - prevent the style from being incorrectly computed (due to the previous point)
        - prevent the style from being computed twice (the attach() method used to recompute it)
    
    Special care was required to the case when display:none is specified in the :hover class. Enabling the :hover style
    was leaving the element without a renderer, which was causing it to remain stuck in the :hover state (subsequent mouseMove
    events were not able to reset the element to its normal style due to the fact that it had no renderer).
    
    The DragController::startDrag method was updated to properly handle the case when dragImage is NULL
    (for instance by setting display:none inside the -webkit-drag pseudo-class).
    
    Patch by Radu Stavila <stavila@adobe.com> on 2013-06-06
    Reviewed by Antti Koivisto.
    
    Tests: fast/regions/hover-display-block-inline.html
           fast/regions/hover-display-block-none.html
    
    * page/DragController.cpp:
    (WebCore::DragController::startDrag):
    * dom/ContainerNode.cpp:
    (WebCore::ContainerNode::attach):
    (WebCore::ContainerNode::detach):
    * dom/ContainerNode.h:
    * dom/Document.cpp:
    (WebCore::Document::attach):
    (WebCore::Document::detach):
    (WebCore::Document::updateHoverActiveState):
    * dom/Document.h:
    * dom/Element.cpp:
    (WebCore::Element::setHovered):
    (WebCore::Element::createRendererIfNeeded):
    (WebCore::Element::attach):
    (WebCore::Element::detach):
    (WebCore::Element::recalcStyle):
    * dom/Element.h:
    * dom/Node.cpp:
    (WebCore::Node::AttachDetachContext::AttachDetachContext):
    (WebCore::Node::AttachDetachContext::~AttachDetachContext):
    (WebCore::Node::attach):
    (WebCore::Node::detach):
    * dom/Node.h:
    (WebCore::Node::reattach):
    (WebCore::Node::reattachIfAttached):
    * dom/NodeRenderingContext.cpp:
    (WebCore::NodeRenderingContext::NodeRenderingContext):
    * dom/PseudoElement.cpp:
    (WebCore::PseudoElement::attach):
    * dom/PseudoElement.h:
    * dom/ShadowRoot.cpp:
    (WebCore::ShadowRoot::attach):
    * dom/ShadowRoot.h:
    * dom/Text.cpp:
    (WebCore::Text::attach):
    * dom/Text.h:
    * html/HTMLCanvasElement.cpp:
    (WebCore::HTMLCanvasElement::attach):
    * html/HTMLCanvasElement.h:
    * html/HTMLFormControlElement.cpp:
    (WebCore::HTMLFormControlElement::attach):
    * html/HTMLFormControlElement.h:
    * html/HTMLFrameElement.cpp:
    (WebCore::HTMLFrameElement::attach):
    * html/HTMLFrameElement.h:
    * html/HTMLFrameElementBase.cpp:
    (WebCore::HTMLFrameElementBase::attach):
    * html/HTMLFrameElementBase.h:
    * html/HTMLFrameSetElement.cpp:
    (WebCore::HTMLFrameSetElement::attach):
    * html/HTMLFrameSetElement.h:
    * html/HTMLImageElement.cpp:
    (WebCore::HTMLImageElement::attach):
    * html/HTMLImageElement.h:
    * html/HTMLInputElement.cpp:
    (WebCore::HTMLInputElement::attach):
    (WebCore::HTMLInputElement::detach):
    * html/HTMLInputElement.h:
    * html/HTMLLIElement.cpp:
    (WebCore::HTMLLIElement::attach):
    * html/HTMLLIElement.h:
    * html/HTMLMediaElement.cpp:
    (WebCore::HTMLMediaElement::attach):
    * html/HTMLMediaElement.h:
    * html/HTMLOptGroupElement.cpp:
    (WebCore::HTMLOptGroupElement::attach):
    (WebCore::HTMLOptGroupElement::detach):
    * html/HTMLOptGroupElement.h:
    * html/HTMLOptionElement.cpp:
    (WebCore::HTMLOptionElement::attach):
    (WebCore::HTMLOptionElement::detach):
    * html/HTMLOptionElement.h:
    * html/HTMLPlugInElement.cpp:
    (WebCore::HTMLPlugInElement::detach):
    * html/HTMLPlugInElement.h:
    * html/HTMLPlugInImageElement.cpp:
    (WebCore::HTMLPlugInImageElement::attach):
    (WebCore::HTMLPlugInImageElement::detach):
    * html/HTMLPlugInImageElement.h:
    * html/HTMLProgressElement.cpp:
    (WebCore::HTMLProgressElement::attach):
    * html/HTMLProgressElement.h:
    * html/HTMLTextAreaElement.cpp:
    (WebCore::HTMLTextAreaElement::attach):
    * html/HTMLTextAreaElement.h:
    * html/HTMLVideoElement.cpp:
    (WebCore::HTMLVideoElement::attach):
    * html/HTMLVideoElement.h:
    * html/PluginDocument.cpp:
    (WebCore::PluginDocument::detach):
    * html/PluginDocument.h:
    * html/shadow/InsertionPoint.cpp:
    (WebCore::InsertionPoint::attach):
    (WebCore::InsertionPoint::detach):
    * html/shadow/InsertionPoint.h:
    * html/shadow/SliderThumbElement.cpp:
    (WebCore::SliderThumbElement::detach):
    * html/shadow/SliderThumbElement.h:
    * html/shadow/SpinButtonElement.cpp:
    (WebCore::SpinButtonElement::detach):
    * html/shadow/SpinButtonElement.h:
    * html/shadow/TextControlInnerElements.cpp:
    (WebCore::SearchFieldCancelButtonElement::detach):
    (WebCore::InputFieldSpeechButtonElement::attach):
    (WebCore::InputFieldSpeechButtonElement::detach):
    * html/shadow/TextControlInnerElements.h:
    * loader/PlaceholderDocument.cpp:
    (WebCore::PlaceholderDocument::attach):
    * loader/PlaceholderDocument.h:
    * svg/SVGImageElement.cpp:
    (WebCore::SVGImageElement::attach):
    * svg/SVGImageElement.h:
    
    LayoutTests:
    
    Patch by Radu Stavila <stavila@adobe.com> on 2013-06-06
    Reviewed by Antti Koivisto.
    
    * fast/regions/hover-display-block-inline-expected.txt: Added.
    * fast/regions/hover-display-block-inline.html: Added.
    * fast/regions/hover-display-block-none-expected.txt: Added.
    * fast/regions/hover-display-block-none.html: Added.
    * fast/events/drag-display-none-element-expected.txt:
    * fast/events/drag-display-none-element:
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@151282 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    83fb9b9a