Changeset 150684 in webkit
- Timestamp:
- May 25, 2013 2:16:30 AM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r150683 r150684 1 2013-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 1 46 2013-05-25 Andreas Kling <akling@apple.com> 2 47 -
trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp
r149581 r150684 673 673 return false; 674 674 675 return node-> hovered();675 return node->isElementNode() && toElement(node)->hovered(); 676 676 } 677 677 -
trunk/Source/WebCore/dom/ContainerNode.cpp
r150214 r150684 1030 1030 } 1031 1031 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 style1039 // FIXME: Move to Element1040 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 1048 1032 unsigned ContainerNode::childNodeCount() const 1049 1033 { -
trunk/Source/WebCore/dom/ContainerNode.h
r149960 r150684 112 112 virtual void setFocus(bool) OVERRIDE; 113 113 virtual void setActive(bool active = true, bool pause = false) OVERRIDE; 114 virtual void setHovered(bool = true) OVERRIDE;115 114 virtual void scheduleSetNeedsStyleRecalc(StyleChangeType = FullStyleChange) OVERRIDE FINAL; 116 115 -
trunk/Source/WebCore/dom/Document.cpp
r150683 r150684 5970 5970 size_t removeCount = nodesToRemoveFromChain.size(); 5971 5971 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); 5973 5974 if (event && (hasCapturingMouseLeaveListener || nodesToRemoveFromChain[i]->hasEventListeners(eventNames().mouseleaveEvent))) 5974 5975 nodesToRemoveFromChain[i]->dispatchMouseEvent(*event, eventNames().mouseleaveEvent, 0, newHoverNode); … … 5984 5985 if (!sawCommonAncestor) { 5985 5986 // 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); 5987 5989 if (event && (hasCapturingMouseEnterListener || nodesToAddToChain[i]->hasEventListeners(eventNames().mouseenterEvent))) 5988 5990 nodesToAddToChain[i]->dispatchMouseEvent(*event, eventNames().mouseenterEvent, 0, oldHoverNode.get()); -
trunk/Source/WebCore/dom/Element.cpp
r150187 r150684 71 71 #include "PseudoElement.h" 72 72 #include "RenderRegion.h" 73 #include "RenderTheme.h" 73 74 #include "RenderView.h" 74 75 #include "RenderWidget.h" … … 400 401 return attribute->value(); 401 402 return nullAtom; 403 } 404 405 bool Element::isUserActionElementHovered() const 406 { 407 ASSERT(isUserActionElement()); 408 return document()->userActionElements().isHovered(this); 409 } 410 411 void 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); 402 427 } 403 428 … … 1327 1352 shadow->detach(); 1328 1353 } 1354 1355 if (hovered()) 1356 document()->hoveredNodeDetached(this); 1357 1329 1358 ContainerNode::detach(); 1330 1359 } -
trunk/Source/WebCore/dom/Element.h
r150297 r150684 427 427 virtual const AtomicString& shadowPseudoId() const; 428 428 429 bool hovered() const { return isUserActionElement() && isUserActionElementHovered(); } 430 virtual void setHovered(bool flag = true); 431 429 432 RenderStyle* computedStyle(PseudoId = NOPSEUDO); 430 433 … … 655 658 656 659 private: 660 bool isUserActionElementHovered() const; 661 657 662 void updatePseudoElement(PseudoId, StyleChange = NoChange); 658 663 PassRefPtr<PseudoElement> createPseudoElementIfNeeded(PseudoId); -
trunk/Source/WebCore/dom/Node.cpp
r150214 r150684 1108 1108 Document* doc = document(); 1109 1109 if (isUserActionElement()) { 1110 if (hovered())1111 doc->hoveredNodeDetached(this);1112 1110 if (inActiveChain()) 1113 1111 doc->activeChainNodeDetached(this); … … 2752 2750 } 2753 2751 2754 void Node::setHovered(bool flag)2755 {2756 if (Document* document = this->document())2757 document->userActionElements().setHovered(this, flag);2758 }2759 2760 2752 bool Node::isUserActionElementActive() const 2761 2753 { … … 2770 2762 } 2771 2763 2772 bool Node::isUserActionElementHovered() const2773 {2774 ASSERT(isUserActionElement());2775 return document()->userActionElements().isHovered(this);2776 }2777 2778 2764 bool Node::isUserActionElementFocused() const 2779 2765 { -
trunk/Source/WebCore/dom/Node.h
r149974 r150684 361 361 bool active() const { return isUserActionElement() && isUserActionElementActive(); } 362 362 bool inActiveChain() const { return isUserActionElement() && isUserActionElementInActiveChain(); } 363 bool hovered() const { return isUserActionElement() && isUserActionElementHovered(); }364 363 bool focused() const { return isUserActionElement() && isUserActionElementFocused(); } 365 364 … … 402 401 virtual void setFocus(bool flag); 403 402 virtual void setActive(bool flag = true, bool pause = false); 404 virtual void setHovered(bool flag = true);405 403 406 404 virtual short tabIndex() const; … … 792 790 bool isUserActionElementActive() const; 793 791 bool isUserActionElementInActiveChain() const; 794 bool isUserActionElementHovered() const;795 792 bool isUserActionElementFocused() const; 796 793 -
trunk/Source/WebCore/dom/UserActionElementSet.cpp
r137277 r150684 73 73 } 74 74 75 inlinebool UserActionElementSet::hasFlags(const Element* element, unsigned flags) const75 bool UserActionElementSet::hasFlags(const Element* element, unsigned flags) const 76 76 { 77 77 ASSERT(element->isUserActionElement()); … … 82 82 } 83 83 84 inlinevoid UserActionElementSet::clearFlags(Element* element, unsigned flags)84 void UserActionElementSet::clearFlags(Element* element, unsigned flags) 85 85 { 86 86 if (!element->isUserActionElement()) { … … 105 105 } 106 106 107 inlinevoid UserActionElementSet::setFlags(Element* element, unsigned flags)107 void UserActionElementSet::setFlags(Element* element, unsigned flags) 108 108 { 109 109 ElementFlagMap::iterator result = m_elements.find(element); -
trunk/Source/WebCore/dom/UserActionElementSet.h
r137277 r150684 50 50 void setActive(Node* node, bool enable) { setFlags(node, enable, IsActiveFlag); } 51 51 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); } 53 53 54 54 UserActionElementSet(); … … 71 71 bool hasFlags(const Node*, unsigned flags) const; 72 72 73 void setFlags(Element* element, bool enable, unsigned flags) { enable ? setFlags(element, flags) : clearFlags(element, flags); } 73 74 void setFlags(Element*, unsigned); 74 75 void clearFlags(Element*, unsigned); -
trunk/Source/WebCore/html/HTMLLabelElement.h
r149960 r150684 48 48 // Overridden to update the hover/active state of the corresponding control. 49 49 virtual void setActive(bool = true, bool pause = false); 50 virtual void setHovered(bool = true) ;50 virtual void setHovered(bool = true) OVERRIDE; 51 51 52 52 // Overridden to either click() or focus() the corresponding control. -
trunk/Source/WebCore/html/shadow/SpinButtonElement.h
r149960 r150684 82 82 void stopRepeatingTimer(); 83 83 void repeatingTimerFired(Timer<SpinButtonElement>*); 84 virtual void setHovered(bool = true) ;84 virtual void setHovered(bool = true) OVERRIDE; 85 85 bool shouldRespondToMouseEvents(); 86 86 virtual bool isMouseFocusable() const { return false; } -
trunk/Source/WebCore/rendering/RenderTheme.cpp
r149839 r150684 832 832 { 833 833 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(); 838 838 SpinButtonElement* element = static_cast<SpinButtonElement*>(node); 839 839 return element->hovered() && element->upDownState() != SpinButtonElement::Indeterminate;
Note: See TracChangeset
for help on using the changeset viewer.