OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All |
7 * rights reserved. | 7 * rights reserved. |
8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. |
9 * (http://www.torchmobile.com/) | 9 * (http://www.torchmobile.com/) |
10 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. | 10 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. |
(...skipping 3929 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3940 | 3940 |
3941 // We can't be focused if we're not in the document. | 3941 // We can't be focused if we're not in the document. |
3942 if (!node->isConnected()) | 3942 if (!node->isConnected()) |
3943 return; | 3943 return; |
3944 bool contains = | 3944 bool contains = |
3945 node->isShadowIncludingInclusiveAncestorOf(m_focusedElement.get()); | 3945 node->isShadowIncludingInclusiveAncestorOf(m_focusedElement.get()); |
3946 if (contains && (m_focusedElement != node || !amongChildrenOnly)) | 3946 if (contains && (m_focusedElement != node || !amongChildrenOnly)) |
3947 clearFocusedElement(); | 3947 clearFocusedElement(); |
3948 } | 3948 } |
3949 | 3949 |
| 3950 static Node* skipDisplayNoneAncestors(Node* node) { |
| 3951 while (node) { |
| 3952 if (node->layoutObject()) |
| 3953 return node; |
| 3954 if (node->isElementNode() && toElement(node)->hasDisplayContentsStyle()) |
| 3955 return node; |
| 3956 node = FlatTreeTraversal::parent(*node); |
| 3957 } |
| 3958 return nullptr; |
| 3959 } |
| 3960 |
3950 void Document::hoveredNodeDetached(Element& element) { | 3961 void Document::hoveredNodeDetached(Element& element) { |
3951 if (!m_hoverNode) | 3962 if (!m_hoverNode) |
3952 return; | 3963 return; |
3953 | 3964 |
3954 m_hoverNode->updateDistribution(); | 3965 m_hoverNode->updateDistribution(); |
3955 if (element != m_hoverNode && | 3966 if (element != m_hoverNode && |
3956 (!m_hoverNode->isTextNode() || | 3967 (!m_hoverNode->isTextNode() || |
3957 element != FlatTreeTraversal::parent(*m_hoverNode))) | 3968 element != FlatTreeTraversal::parent(*m_hoverNode))) |
3958 return; | 3969 return; |
3959 | 3970 |
3960 m_hoverNode = FlatTreeTraversal::parent(element); | 3971 m_hoverNode = skipDisplayNoneAncestors(&element); |
3961 while (m_hoverNode && !m_hoverNode->layoutObject()) | |
3962 m_hoverNode = FlatTreeTraversal::parent(*m_hoverNode); | |
3963 | 3972 |
3964 // If the mouse cursor is not visible, do not clear existing | 3973 // If the mouse cursor is not visible, do not clear existing |
3965 // hover effects on the ancestors of |element| and do not invoke | 3974 // hover effects on the ancestors of |element| and do not invoke |
3966 // new hover effects on any other element. | 3975 // new hover effects on any other element. |
3967 if (!page()->isCursorVisible()) | 3976 if (!page()->isCursorVisible()) |
3968 return; | 3977 return; |
3969 | 3978 |
3970 if (frame()) | 3979 if (frame()) |
3971 frame()->eventHandler().scheduleHoverStateUpdate(); | 3980 frame()->eventHandler().scheduleHoverStateUpdate(); |
3972 } | 3981 } |
3973 | 3982 |
3974 void Document::activeChainNodeDetached(Element& element) { | 3983 void Document::activeChainNodeDetached(Element& element) { |
3975 if (!m_activeHoverElement) | 3984 if (!m_activeHoverElement) |
3976 return; | 3985 return; |
3977 | 3986 |
3978 if (element != m_activeHoverElement) | 3987 if (element != m_activeHoverElement) |
3979 return; | 3988 return; |
3980 | 3989 |
3981 Node* activeNode = FlatTreeTraversal::parent(element); | 3990 Node* activeNode = skipDisplayNoneAncestors(&element); |
3982 while (activeNode && activeNode->isElementNode() && | |
3983 !activeNode->layoutObject()) | |
3984 activeNode = FlatTreeTraversal::parent(*activeNode); | |
3985 | |
3986 m_activeHoverElement = activeNode && activeNode->isElementNode() | 3991 m_activeHoverElement = activeNode && activeNode->isElementNode() |
3987 ? toElement(activeNode) | 3992 ? toElement(activeNode) |
3988 : nullptr; | 3993 : nullptr; |
3989 } | 3994 } |
3990 | 3995 |
3991 const Vector<AnnotatedRegionValue>& Document::annotatedRegions() const { | 3996 const Vector<AnnotatedRegionValue>& Document::annotatedRegions() const { |
3992 return m_annotatedRegions; | 3997 return m_annotatedRegions; |
3993 } | 3998 } |
3994 | 3999 |
3995 void Document::setAnnotatedRegions( | 4000 void Document::setAnnotatedRegions( |
(...skipping 2207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6203 // only those) nodes should remain :active until the mouse is released. | 6208 // only those) nodes should remain :active until the mouse is released. |
6204 bool allowActiveChanges = !oldActiveElement && activeHoverElement(); | 6209 bool allowActiveChanges = !oldActiveElement && activeHoverElement(); |
6205 | 6210 |
6206 // If the mouse is down and if this is a mouse move event, we want to restrict | 6211 // If the mouse is down and if this is a mouse move event, we want to restrict |
6207 // changes in :hover/:active to only apply to elements that are in the :active | 6212 // changes in :hover/:active to only apply to elements that are in the :active |
6208 // chain that we froze at the time the mouse went down. | 6213 // chain that we froze at the time the mouse went down. |
6209 bool mustBeInActiveChain = request.active() && request.move(); | 6214 bool mustBeInActiveChain = request.active() && request.move(); |
6210 | 6215 |
6211 Node* oldHoverNode = hoverNode(); | 6216 Node* oldHoverNode = hoverNode(); |
6212 | 6217 |
6213 // Check to see if the hovered node has changed. | 6218 // The passed in innerElement may not be a result of a hit test for the |
6214 // If it hasn't, we do not need to do anything. | 6219 // current up-to-date flat/layout tree. That means the element may be |
6215 Node* newHoverNode = innerElementInDocument; | 6220 // display:none at this point. Skip up the ancestor chain until we reach an |
6216 while (newHoverNode && !newHoverNode->layoutObject()) | 6221 // element with a layoutObject or a display:contents element. |
6217 newHoverNode = newHoverNode->parentOrShadowHostNode(); | 6222 Node* newHoverNode = skipDisplayNoneAncestors(innerElementInDocument); |
6218 | 6223 |
6219 // Update our current hover node. | 6224 // Update our current hover node. |
6220 setHoverNode(newHoverNode); | 6225 setHoverNode(newHoverNode); |
6221 | 6226 |
6222 Node* ancestor = | 6227 Node* ancestor = |
6223 (oldHoverNode && oldHoverNode->isConnected() && newHoverNode) | 6228 (oldHoverNode && oldHoverNode->isConnected() && newHoverNode) |
6224 ? FlatTreeTraversal::commonAncestor(*oldHoverNode, *newHoverNode) | 6229 ? FlatTreeTraversal::commonAncestor(*oldHoverNode, *newHoverNode) |
6225 : nullptr; | 6230 : nullptr; |
6226 | 6231 |
6227 HeapVector<Member<Node>, 32> nodesToRemoveFromChain; | 6232 HeapVector<Member<Node>, 32> nodesToRemoveFromChain; |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6628 } | 6633 } |
6629 | 6634 |
6630 void showLiveDocumentInstances() { | 6635 void showLiveDocumentInstances() { |
6631 WeakDocumentSet& set = liveDocumentSet(); | 6636 WeakDocumentSet& set = liveDocumentSet(); |
6632 fprintf(stderr, "There are %u documents currently alive:\n", set.size()); | 6637 fprintf(stderr, "There are %u documents currently alive:\n", set.size()); |
6633 for (blink::Document* document : set) | 6638 for (blink::Document* document : set) |
6634 fprintf(stderr, "- Document %p URL: %s\n", document, | 6639 fprintf(stderr, "- Document %p URL: %s\n", document, |
6635 document->url().getString().utf8().data()); | 6640 document->url().getString().utf8().data()); |
6636 } | 6641 } |
6637 #endif | 6642 #endif |
OLD | NEW |