Changeset 155351 in webkit
- Timestamp:
- Sep 9, 2013 7:39:41 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r155350 r155351 1 2013-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 1 13 2013-09-09 Mihai Maerean <mmaerean@adobe.com> 2 14 -
trunk/LayoutTests/fast/events/mouseenterleave-on-subframe-expected.txt
r155349 r155351 1 1 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 .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, and if the logged nodeNames of event targets does not include '#document'. 3 3 4 4 mouseenter on DIV 5 5 mouseenter on BODY 6 6 mouseenter on HTML 7 mouseenter on #document8 7 mouseleave on DIV 9 8 mouseleave on BODY 10 9 mouseleave on HTML 11 mouseleave on #document12 10 -
trunk/Source/WebCore/ChangeLog
r155348 r155351 1 2013-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 1 17 2013-09-09 Allan Sandfeld Jensen <allan.jensen@digia.com> 2 18 -
trunk/Source/WebCore/dom/Document.cpp
r155348 r155351 5820 5820 RenderObject* ancestor = nearestCommonHoverAncestor(oldHoverObj, newHoverObj); 5821 5821 5822 Vector<RefPtr< Node>, 32> nodesToRemoveFromChain;5823 Vector<RefPtr< Node>, 32> nodesToAddToChain;5822 Vector<RefPtr<Element>, 32> elementsToRemoveFromChain; 5823 Vector<RefPtr<Element>, 32> elementsToAddToChain; 5824 5824 5825 5825 // mouseenter and mouseleave events are only dispatched if there is a capturing eventhandler on an ancestor … … 5848 5848 // must be updated, to ensure it's normal style is re-applied. 5849 5849 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); 5853 5853 } 5854 5854 } … … 5856 5856 // The old hover path only needs to be cleared up to (and not including) the common ancestor; 5857 5857 for (RenderObject* curr = oldHoverObj; curr && curr != ancestor; curr = curr->hoverAncestor()) { 5858 if (!curr->node() || curr->isText())5858 if (!curr->node() || !curr->node()->isElementNode()) 5859 5859 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); 5862 5863 } 5863 5864 // Unset hovered nodes in sub frame documents if the old hovered node was a frame owner. … … 5870 5871 // Now set the hover state for our new object up to the root. 5871 5872 for (RenderObject* curr = newHoverObj; curr; curr = curr->hoverAncestor()) { 5872 if (!curr->node() || curr->isText())5873 if (!curr->node() || !curr->node()->isElementNode()) 5873 5874 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(); 5879 5881 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); 5884 5885 } 5885 5886 5886 5887 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()) 5892 5892 sawCommonAncestor = true; 5893 5893 if (!sawCommonAncestor) { 5894 5894 // 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()); 5899 5898 } 5900 5899 }
Note: See TracChangeset
for help on using the changeset viewer.