Changeset 150684 in webkit


Ignore:
Timestamp:
May 25, 2013 2:16:30 AM (11 years ago)
Author:
akling@apple.com
Message:

Move "hover" state logic from Node to Element.
<http://webkit.org/b/116757>

Reviewed by Antti Koivisto.

Resolve a 7 year old FIXME by merging the "hover" state logic from Node and ContainerNode
and moving it all to Element instead.

  • dom/Node.cpp:

(WebCore::Node::detach):

  • dom/Element.cpp:

(WebCore::Element::detach):

Move Document::hoveredNodeDetached() call from Node::detach() to Element::detach().

(WebCore::Element::isUserActionElementHovered):
(WebCore::Element::setHovered):

  • dom/Element.h:

(WebCore::Element::hovered):

Moved here from Node/ContainerNode.

  • dom/UserActionElementSet.h:

(WebCore::UserActionElementSet::setHovered):
(WebCore::UserActionElementSet::setFlags):

Make setHovered() take an Element* instead of a Node*. I'd like to do this will all
of these methods eventually, so added a setFlags() helper with the tighter type.

  • html/HTMLLabelElement.h:
  • html/shadow/SpinButtonElement.h:

Sprinkle OVERRIDE on setHovered() overrides.

  • dom/Document.cpp:

(WebCore::Document::updateHoverActiveState):

  • accessibility/AccessibilityNodeObject.cpp:

(WebCore::AccessibilityNodeObject::isHovered):

  • rendering/RenderTheme.cpp:

(WebCore::RenderTheme::isHovered):

Check if the inspected Node is an element before asking if it's hovered.

Location:
trunk/Source/WebCore
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r150683 r150684  
     12013-05-24  Andreas Kling  <akling@apple.com>
     2
     3        Move "hover" state logic from Node to Element.
     4        <http://webkit.org/b/116757>
     5
     6        Reviewed by Antti Koivisto.
     7
     8        Resolve a 7 year old FIXME by merging the "hover" state logic from Node and ContainerNode
     9        and moving it all to Element instead.
     10
     11        * dom/Node.cpp:
     12        (WebCore::Node::detach):
     13        * dom/Element.cpp:
     14        (WebCore::Element::detach):
     15
     16            Move Document::hoveredNodeDetached() call from Node::detach() to Element::detach().
     17
     18        (WebCore::Element::isUserActionElementHovered):
     19        (WebCore::Element::setHovered):
     20        * dom/Element.h:
     21        (WebCore::Element::hovered):
     22
     23            Moved here from Node/ContainerNode.
     24
     25        * dom/UserActionElementSet.h:
     26        (WebCore::UserActionElementSet::setHovered):
     27        (WebCore::UserActionElementSet::setFlags):
     28
     29            Make setHovered() take an Element* instead of a Node*. I'd like to do this will all
     30            of these methods eventually, so added a setFlags() helper with the tighter type.
     31
     32        * html/HTMLLabelElement.h:
     33        * html/shadow/SpinButtonElement.h:
     34
     35            Sprinkle OVERRIDE on setHovered() overrides.
     36
     37        * dom/Document.cpp:
     38        (WebCore::Document::updateHoverActiveState):
     39        * accessibility/AccessibilityNodeObject.cpp:
     40        (WebCore::AccessibilityNodeObject::isHovered):
     41        * rendering/RenderTheme.cpp:
     42        (WebCore::RenderTheme::isHovered):
     43
     44            Check if the inspected Node is an element before asking if it's hovered.
     45
    1462013-05-25  Andreas Kling  <akling@apple.com>
    247
  • trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp

    r149581 r150684  
    673673        return false;
    674674
    675     return node->hovered();
     675    return node->isElementNode() && toElement(node)->hovered();
    676676}
    677677
  • trunk/Source/WebCore/dom/ContainerNode.cpp

    r150214 r150684  
    10301030}
    10311031
    1032 void ContainerNode::setHovered(bool over)
    1033 {
    1034     if (over == hovered()) return;
    1035 
    1036     Node::setHovered(over);
    1037 
    1038     // note that we need to recalc the style
    1039     // FIXME: Move to Element
    1040     if (renderer()) {
    1041         if (renderStyle()->affectedByHover() || (isElementNode() && toElement(this)->childrenAffectedByHover()))
    1042             setNeedsStyleRecalc();
    1043         if (renderer() && renderer()->style()->hasAppearance())
    1044             renderer()->theme()->stateChanged(renderer(), HoverState);
    1045     }
    1046 }
    1047 
    10481032unsigned ContainerNode::childNodeCount() const
    10491033{
  • trunk/Source/WebCore/dom/ContainerNode.h

    r149960 r150684  
    112112    virtual void setFocus(bool) OVERRIDE;
    113113    virtual void setActive(bool active = true, bool pause = false) OVERRIDE;
    114     virtual void setHovered(bool = true) OVERRIDE;
    115114    virtual void scheduleSetNeedsStyleRecalc(StyleChangeType = FullStyleChange) OVERRIDE FINAL;
    116115
  • trunk/Source/WebCore/dom/Document.cpp

    r150683 r150684  
    59705970    size_t removeCount = nodesToRemoveFromChain.size();
    59715971    for (size_t i = 0; i < removeCount; ++i) {
    5972         nodesToRemoveFromChain[i]->setHovered(false);
     5972        if (nodesToRemoveFromChain[i]->isElementNode())
     5973            toElement(nodesToRemoveFromChain[i].get())->setHovered(false);
    59735974        if (event && (hasCapturingMouseLeaveListener || nodesToRemoveFromChain[i]->hasEventListeners(eventNames().mouseleaveEvent)))
    59745975            nodesToRemoveFromChain[i]->dispatchMouseEvent(*event, eventNames().mouseleaveEvent, 0, newHoverNode);
     
    59845985        if (!sawCommonAncestor) {
    59855986            // Elements after the common hover ancestor does not change hover state, but are iterated over because they may change active state.
    5986             nodesToAddToChain[i]->setHovered(true);
     5987            if (nodesToAddToChain[i]->isElementNode())
     5988                toElement(nodesToAddToChain[i].get())->setHovered(true);
    59875989            if (event && (hasCapturingMouseEnterListener || nodesToAddToChain[i]->hasEventListeners(eventNames().mouseenterEvent)))
    59885990                nodesToAddToChain[i]->dispatchMouseEvent(*event, eventNames().mouseenterEvent, 0, oldHoverNode.get());
  • trunk/Source/WebCore/dom/Element.cpp

    r150187 r150684  
    7171#include "PseudoElement.h"
    7272#include "RenderRegion.h"
     73#include "RenderTheme.h"
    7374#include "RenderView.h"
    7475#include "RenderWidget.h"
     
    400401        return attribute->value();
    401402    return nullAtom;
     403}
     404
     405bool Element::isUserActionElementHovered() const
     406{
     407    ASSERT(isUserActionElement());
     408    return document()->userActionElements().isHovered(this);
     409}
     410
     411void Element::setHovered(bool flag)
     412{
     413    if (flag == hovered())
     414        return;
     415
     416    if (Document* document = this->document())
     417        document->userActionElements().setHovered(this, flag);
     418
     419    if (!renderer())
     420        return;
     421
     422    if (renderer()->style()->affectedByHover() || childrenAffectedByHover())
     423        setNeedsStyleRecalc();
     424
     425    if (renderer()->style()->hasAppearance())
     426        renderer()->theme()->stateChanged(renderer(), HoverState);
    402427}
    403428
     
    13271352        shadow->detach();
    13281353    }
     1354
     1355    if (hovered())
     1356        document()->hoveredNodeDetached(this);
     1357
    13291358    ContainerNode::detach();
    13301359}
  • trunk/Source/WebCore/dom/Element.h

    r150297 r150684  
    427427    virtual const AtomicString& shadowPseudoId() const;
    428428
     429    bool hovered() const { return isUserActionElement() && isUserActionElementHovered(); }
     430    virtual void setHovered(bool flag = true);
     431
    429432    RenderStyle* computedStyle(PseudoId = NOPSEUDO);
    430433
     
    655658
    656659private:
     660    bool isUserActionElementHovered() const;
     661
    657662    void updatePseudoElement(PseudoId, StyleChange = NoChange);
    658663    PassRefPtr<PseudoElement> createPseudoElementIfNeeded(PseudoId);
  • trunk/Source/WebCore/dom/Node.cpp

    r150214 r150684  
    11081108    Document* doc = document();
    11091109    if (isUserActionElement()) {
    1110         if (hovered())
    1111             doc->hoveredNodeDetached(this);
    11121110        if (inActiveChain())
    11131111            doc->activeChainNodeDetached(this);
     
    27522750}
    27532751
    2754 void Node::setHovered(bool flag)
    2755 {
    2756     if (Document* document = this->document())
    2757         document->userActionElements().setHovered(this, flag);
    2758 }
    2759 
    27602752bool Node::isUserActionElementActive() const
    27612753{
     
    27702762}
    27712763
    2772 bool Node::isUserActionElementHovered() const
    2773 {
    2774     ASSERT(isUserActionElement());
    2775     return document()->userActionElements().isHovered(this);
    2776 }
    2777 
    27782764bool Node::isUserActionElementFocused() const
    27792765{
  • trunk/Source/WebCore/dom/Node.h

    r149974 r150684  
    361361    bool active() const { return isUserActionElement() && isUserActionElementActive(); }
    362362    bool inActiveChain() const { return isUserActionElement() && isUserActionElementInActiveChain(); }
    363     bool hovered() const { return isUserActionElement() && isUserActionElementHovered(); }
    364363    bool focused() const { return isUserActionElement() && isUserActionElementFocused(); }
    365364
     
    402401    virtual void setFocus(bool flag);
    403402    virtual void setActive(bool flag = true, bool pause = false);
    404     virtual void setHovered(bool flag = true);
    405403
    406404    virtual short tabIndex() const;
     
    792790    bool isUserActionElementActive() const;
    793791    bool isUserActionElementInActiveChain() const;
    794     bool isUserActionElementHovered() const;
    795792    bool isUserActionElementFocused() const;
    796793
  • trunk/Source/WebCore/dom/UserActionElementSet.cpp

    r137277 r150684  
    7373}
    7474
    75 inline bool UserActionElementSet::hasFlags(const Element* element, unsigned flags) const
     75bool UserActionElementSet::hasFlags(const Element* element, unsigned flags) const
    7676{
    7777    ASSERT(element->isUserActionElement());
     
    8282}
    8383
    84 inline void UserActionElementSet::clearFlags(Element* element, unsigned flags)
     84void UserActionElementSet::clearFlags(Element* element, unsigned flags)
    8585{
    8686    if (!element->isUserActionElement()) {
     
    105105}
    106106
    107 inline void UserActionElementSet::setFlags(Element* element, unsigned flags)
     107void UserActionElementSet::setFlags(Element* element, unsigned flags)
    108108{
    109109    ElementFlagMap::iterator result = m_elements.find(element);
  • trunk/Source/WebCore/dom/UserActionElementSet.h

    r137277 r150684  
    5050    void setActive(Node* node, bool enable) { setFlags(node, enable, IsActiveFlag); }
    5151    void setInActiveChain(Node* node, bool enable) { setFlags(node, enable, InActiveChainFlag); }
    52     void setHovered(Node* node, bool enable) { setFlags(node, enable, IsHoveredFlag); }
     52    void setHovered(Element* element, bool enable) { setFlags(element, enable, IsHoveredFlag); }
    5353
    5454    UserActionElementSet();
     
    7171    bool hasFlags(const Node*, unsigned flags) const;
    7272
     73    void setFlags(Element* element, bool enable, unsigned flags) { enable ? setFlags(element, flags) : clearFlags(element, flags); }
    7374    void setFlags(Element*, unsigned);
    7475    void clearFlags(Element*, unsigned);
  • trunk/Source/WebCore/html/HTMLLabelElement.h

    r149960 r150684  
    4848    // Overridden to update the hover/active state of the corresponding control.
    4949    virtual void setActive(bool = true, bool pause = false);
    50     virtual void setHovered(bool = true);
     50    virtual void setHovered(bool = true) OVERRIDE;
    5151
    5252    // Overridden to either click() or focus() the corresponding control.
  • trunk/Source/WebCore/html/shadow/SpinButtonElement.h

    r149960 r150684  
    8282    void stopRepeatingTimer();
    8383    void repeatingTimerFired(Timer<SpinButtonElement>*);
    84     virtual void setHovered(bool = true);
     84    virtual void setHovered(bool = true) OVERRIDE;
    8585    bool shouldRespondToMouseEvents();
    8686    virtual bool isMouseFocusable() const { return false; }
  • trunk/Source/WebCore/rendering/RenderTheme.cpp

    r149839 r150684  
    832832{
    833833    Node* node = o->node();
    834     if (!node)
    835         return false;
    836     if (!node->isElementNode() || !toElement(node)->isSpinButtonElement())
    837         return node->hovered();
     834    if (!node || !node->isElementNode())
     835        return false;
     836    if (!toElement(node)->isSpinButtonElement())
     837        return toElement(node)->hovered();
    838838    SpinButtonElement* element = static_cast<SpinButtonElement*>(node);
    839839    return element->hovered() && element->upDownState() != SpinButtonElement::Indeterminate;
Note: See TracChangeset for help on using the changeset viewer.