Changeset 155351 in webkit


Ignore:
Timestamp:
Sep 9, 2013 7:39:41 AM (11 years ago)
Author:
allan.jensen@digia.com
Message:

MouseEnter and MouseLeave may be emitted on Document nodes
https://bugs.webkit.org/show_bug.cgi?id=120862

Reviewed by Antonio Gomes.

Source/WebCore:

Replace the overgeneric use of Nodes with Elements in updateHoverActiveState.
This also fixes the bug of emitting mouseenter/mouseleave events on Document,
since Document is not an Element.

This is tested by fast/events/mouseenterleave-on-subframe.html

  • dom/Document.cpp:

(WebCore::Document::updateHoverActiveState):

LayoutTests:

Update expectations now we correctly do not get mouseenter/mouseleave events
targeted for Document nodes.

  • fast/events/mouseenterleave-on-subframe-expected.txt:
Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r155350 r155351  
     12013-09-09  Allan Sandfeld Jensen  <allan.jensen@digia.com>
     2
     3        MouseEnter and MouseLeave may be emitted on Document nodes
     4        https://bugs.webkit.org/show_bug.cgi?id=120862
     5
     6        Reviewed by Antonio Gomes.
     7
     8        Update expectations now we correctly do not get mouseenter/mouseleave events
     9        targeted for Document nodes.
     10
     11        * fast/events/mouseenterleave-on-subframe-expected.txt:
     12
    1132013-09-09  Mihai Maerean  <mmaerean@adobe.com>
    214
  • trunk/LayoutTests/fast/events/mouseenterleave-on-subframe-expected.txt

    r155349 r155351  
    11
    2 This is a test of a mouseleave events in an inner-document. The test is success if we get matching mouseleave events for every mouseenter event.
     2This is a test of a mouseleave events in an inner-document. The test is success if we get matching mouseleave events for every mouseenter event, and if the logged nodeNames of event targets does not include '#document'.
    33
    44mouseenter on DIV
    55mouseenter on BODY
    66mouseenter on HTML
    7 mouseenter on #document
    87mouseleave on DIV
    98mouseleave on BODY
    109mouseleave on HTML
    11 mouseleave on #document
    1210
  • trunk/Source/WebCore/ChangeLog

    r155348 r155351  
     12013-09-09  Allan Sandfeld Jensen  <allan.jensen@digia.com>
     2
     3        MouseEnter and MouseLeave may be emitted on Document nodes
     4        https://bugs.webkit.org/show_bug.cgi?id=120862
     5
     6        Reviewed by Antonio Gomes.
     7
     8        Replace the overgeneric use of Nodes with Elements in updateHoverActiveState.
     9        This also fixes the bug of emitting mouseenter/mouseleave events on Document,
     10        since Document is not an Element.
     11
     12        This is tested by fast/events/mouseenterleave-on-subframe.html
     13
     14        * dom/Document.cpp:
     15        (WebCore::Document::updateHoverActiveState):
     16
    1172013-09-09  Allan Sandfeld Jensen  <allan.jensen@digia.com>
    218
  • trunk/Source/WebCore/dom/Document.cpp

    r155348 r155351  
    58205820    RenderObject* ancestor = nearestCommonHoverAncestor(oldHoverObj, newHoverObj);
    58215821
    5822     Vector<RefPtr<Node>, 32> nodesToRemoveFromChain;
    5823     Vector<RefPtr<Node>, 32> nodesToAddToChain;
     5822    Vector<RefPtr<Element>, 32> elementsToRemoveFromChain;
     5823    Vector<RefPtr<Element>, 32> elementsToAddToChain;
    58245824
    58255825    // mouseenter and mouseleave events are only dispatched if there is a capturing eventhandler on an ancestor
     
    58485848        // must be updated, to ensure it's normal style is re-applied.
    58495849        if (oldHoveredElement && !oldHoverObj) {
    5850             for (Node* node = oldHoveredElement.get(); node; node = node->parentNode()) {
    5851                 if (!mustBeInActiveChain || (node->isElementNode() && toElement(node)->inActiveChain()))
    5852                     nodesToRemoveFromChain.append(node);
     5850            for (Element* element= oldHoveredElement.get(); element; element = element->parentElement()) {
     5851                if (!mustBeInActiveChain || element->inActiveChain())
     5852                    elementsToRemoveFromChain.append(element);
    58535853            }
    58545854        }
     
    58565856        // The old hover path only needs to be cleared up to (and not including) the common ancestor;
    58575857        for (RenderObject* curr = oldHoverObj; curr && curr != ancestor; curr = curr->hoverAncestor()) {
    5858             if (!curr->node() || curr->isText())
     5858            if (!curr->node() || !curr->node()->isElementNode())
    58595859                continue;
    5860             if (!mustBeInActiveChain || (curr->node()->isElementNode() && toElement(curr->node())->inActiveChain()))
    5861                 nodesToRemoveFromChain.append(curr->node());
     5860            Element* element = toElement(curr->node());
     5861            if (!mustBeInActiveChain || element->inActiveChain())
     5862                elementsToRemoveFromChain.append(element);
    58625863        }
    58635864        // Unset hovered nodes in sub frame documents if the old hovered node was a frame owner.
     
    58705871    // Now set the hover state for our new object up to the root.
    58715872    for (RenderObject* curr = newHoverObj; curr; curr = curr->hoverAncestor()) {
    5872         if (!curr->node() || curr->isText())
     5873        if (!curr->node() || !curr->node()->isElementNode())
    58735874            continue;
    5874         if (!mustBeInActiveChain || (curr->node()->isElementNode() && toElement(curr->node())->inActiveChain()))
    5875             nodesToAddToChain.append(curr->node());
    5876     }
    5877 
    5878     size_t removeCount = nodesToRemoveFromChain.size();
     5875        Element* element = toElement(curr->node());
     5876        if (!mustBeInActiveChain || element->inActiveChain())
     5877            elementsToAddToChain.append(element);
     5878    }
     5879
     5880    size_t removeCount = elementsToRemoveFromChain.size();
    58795881    for (size_t i = 0; i < removeCount; ++i) {
    5880         if (nodesToRemoveFromChain[i]->isElementNode())
    5881             toElement(nodesToRemoveFromChain[i].get())->setHovered(false);
    5882         if (event && (hasCapturingMouseLeaveListener || nodesToRemoveFromChain[i]->hasEventListeners(eventNames().mouseleaveEvent)))
    5883             nodesToRemoveFromChain[i]->dispatchMouseEvent(*event, eventNames().mouseleaveEvent, 0, newHoveredElement);
     5882        elementsToRemoveFromChain[i]->setHovered(false);
     5883        if (event && (hasCapturingMouseLeaveListener || elementsToRemoveFromChain[i]->hasEventListeners(eventNames().mouseleaveEvent)))
     5884            elementsToRemoveFromChain[i]->dispatchMouseEvent(*event, eventNames().mouseleaveEvent, 0, newHoveredElement);
    58845885    }
    58855886
    58865887    bool sawCommonAncestor = false;
    5887     size_t addCount = nodesToAddToChain.size();
    5888     for (size_t i = 0; i < addCount; ++i) {
    5889         if (allowActiveChanges && nodesToAddToChain[i]->isElementNode())
    5890             toElement(nodesToAddToChain[i].get())->setActive(true);
    5891         if (ancestor && nodesToAddToChain[i] == ancestor->node())
     5888    for (size_t i = 0, size = elementsToAddToChain.size(); i < size; ++i) {
     5889        if (allowActiveChanges)
     5890            elementsToAddToChain[i]->setActive(true);
     5891        if (ancestor && elementsToAddToChain[i] == ancestor->node())
    58925892            sawCommonAncestor = true;
    58935893        if (!sawCommonAncestor) {
    58945894            // Elements after the common hover ancestor does not change hover state, but are iterated over because they may change active state.
    5895             if (nodesToAddToChain[i]->isElementNode())
    5896                 toElement(nodesToAddToChain[i].get())->setHovered(true);
    5897             if (event && (hasCapturingMouseEnterListener || nodesToAddToChain[i]->hasEventListeners(eventNames().mouseenterEvent)))
    5898                 nodesToAddToChain[i]->dispatchMouseEvent(*event, eventNames().mouseenterEvent, 0, oldHoveredElement.get());
     5895            elementsToAddToChain[i]->setHovered(true);
     5896            if (event && (hasCapturingMouseEnterListener || elementsToAddToChain[i]->hasEventListeners(eventNames().mouseenterEvent)))
     5897                elementsToAddToChain[i]->dispatchMouseEvent(*event, eventNames().mouseenterEvent, 0, oldHoveredElement.get());
    58995898        }
    59005899    }
Note: See TracChangeset for help on using the changeset viewer.