Chromium Code Reviews| 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 6471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6482 // Do not set hover state if event is from touch and on mobile. | 6482 // Do not set hover state if event is from touch and on mobile. |
| 6483 bool allow_hover_changes = | 6483 bool allow_hover_changes = |
| 6484 !(request.TouchEvent() && GetPage() && | 6484 !(request.TouchEvent() && GetPage() && |
| 6485 GetPage()->GetVisualViewport().ShouldDisableDesktopWorkarounds()); | 6485 GetPage()->GetVisualViewport().ShouldDisableDesktopWorkarounds()); |
| 6486 | 6486 |
| 6487 // If the mouse has just been pressed, set :active on the chain. Those (and | 6487 // If the mouse has just been pressed, set :active on the chain. Those (and |
| 6488 // only those) nodes should remain :active until the mouse is released. | 6488 // only those) nodes should remain :active until the mouse is released. |
| 6489 bool allow_active_changes = !old_active_element && ActiveHoverElement(); | 6489 bool allow_active_changes = !old_active_element && ActiveHoverElement(); |
| 6490 | 6490 |
| 6491 // If the mouse is down and if this is a mouse move event, we want to restrict | 6491 // If the mouse is down and if this is a mouse move event, we want to restrict |
| 6492 // changes in :hover/:active to only apply to elements that are in the :active | 6492 // changes in :active to only apply to elements that are in the :active |
| 6493 // chain that we froze at the time the mouse went down. | 6493 // chain that we froze at the time the mouse went down. |
| 6494 bool must_be_in_active_chain = request.Active() && request.Move(); | 6494 bool must_be_in_active_chain = request.Active() && request.Move(); |
| 6495 | 6495 |
| 6496 Element* old_hover_element = HoverElement(); | 6496 Element* old_hover_element = HoverElement(); |
| 6497 | 6497 |
| 6498 // The passed in innerElement may not be a result of a hit test for the | 6498 // The passed in innerElement may not be a result of a hit test for the |
| 6499 // current up-to-date flat/layout tree. That means the element may be | 6499 // current up-to-date flat/layout tree. That means the element may be |
| 6500 // display:none at this point. Skip up the ancestor chain until we reach an | 6500 // display:none at this point. Skip up the ancestor chain until we reach an |
| 6501 // element with a layoutObject or a display:contents element. | 6501 // element with a layoutObject or a display:contents element. |
| 6502 Element* new_hover_element = | 6502 Element* new_hover_element = |
| 6503 SkipDisplayNoneAncestors(inner_element_in_document); | 6503 SkipDisplayNoneAncestors(inner_element_in_document); |
| 6504 | 6504 |
| 6505 // Update our current hover element. | 6505 // Update our current hover element. |
| 6506 if (allow_hover_changes) | 6506 if (allow_hover_changes) |
| 6507 SetHoverElement(new_hover_element); | 6507 SetHoverElement(new_hover_element); |
| 6508 | 6508 |
| 6509 Node* ancestor_element = nullptr; | 6509 Node* ancestor_element = nullptr; |
| 6510 if (old_hover_element && old_hover_element->isConnected() && | 6510 if (old_hover_element && old_hover_element->isConnected() && |
| 6511 new_hover_element) { | 6511 new_hover_element) { |
| 6512 Node* ancestor = FlatTreeTraversal::CommonAncestor(*old_hover_element, | 6512 Node* ancestor = FlatTreeTraversal::CommonAncestor(*old_hover_element, |
| 6513 *new_hover_element); | 6513 *new_hover_element); |
| 6514 if (ancestor && ancestor->IsElementNode()) | 6514 if (ancestor && ancestor->IsElementNode()) |
| 6515 ancestor_element = ToElement(ancestor); | 6515 ancestor_element = ToElement(ancestor); |
| 6516 } | 6516 } |
| 6517 | 6517 |
| 6518 HeapVector<Member<Element>, 32> elements_to_remove_from_chain; | 6518 HeapVector<Member<Element>, 32> elements_to_remove_from_chain; |
| 6519 HeapVector<Member<Element>, 32> elements_to_add_to_chain; | 6519 HeapVector<Member<Element>, 32> elements_to_add_to_active_chain; |
| 6520 HeapVector<Member<Element>, 32> elements_to_add_to_hover_chain; | |
| 6520 | 6521 |
| 6521 if (old_hover_element != new_hover_element) { | 6522 if (old_hover_element != new_hover_element) { |
| 6522 // The old hover path only needs to be cleared up to (and not including) the | 6523 // The old hover path only needs to be cleared up to (and not including) the |
| 6523 // common ancestor; | 6524 // common ancestor; |
| 6524 // | 6525 // |
| 6525 // FIXME(ecobos@igalia.com): oldHoverElement may be disconnected from the | 6526 // FIXME(ecobos@igalia.com): oldHoverElement may be disconnected from the |
| 6526 // tree already. This is due to our handling of m_hoverElement in | 6527 // tree already. This is due to our handling of m_hoverElement in |
| 6527 // hoveredElementDetached (which assumes all the parents are hovered) and | 6528 // hoveredElementDetached (which assumes all the parents are hovered) and |
| 6528 // mustBeInActiveChain (which makes this not hold). | 6529 // mustBeInActiveChain (which makes this not hold). |
| 6529 // | 6530 // |
| 6530 // In that case, none of the nodes in the chain have the flags, so there's | 6531 // In that case, none of the nodes in the chain have the flags, so there's |
| 6531 // no problem in skipping this step. | 6532 // no problem in skipping this step. |
|
Navid Zolghadr
2017/07/04 17:51:59
I believe this comment doesn't hold anymore. Does
lanwei
2017/07/06 15:33:38
Done.
| |
| 6532 if (old_hover_element && old_hover_element->isConnected()) { | 6533 if (old_hover_element && old_hover_element->isConnected()) { |
| 6533 for (Element* curr = old_hover_element; curr && curr != ancestor_element; | 6534 for (Element* curr = old_hover_element; curr && curr != ancestor_element; |
| 6534 curr = FlatTreeTraversal::ParentElement(*curr)) { | 6535 curr = FlatTreeTraversal::ParentElement(*curr)) { |
| 6535 if (!must_be_in_active_chain || curr->InActiveChain()) | 6536 elements_to_remove_from_chain.push_back(curr); |
| 6536 elements_to_remove_from_chain.push_back(curr); | |
| 6537 } | 6537 } |
| 6538 } | 6538 } |
| 6539 } | 6539 } |
| 6540 | 6540 |
| 6541 // Now set the hover state for our new object up to the root. | 6541 // Now set the hover state for our new object up to the root. |
| 6542 for (Element* curr = new_hover_element; curr; | 6542 for (Element* curr = new_hover_element; curr; |
| 6543 curr = FlatTreeTraversal::ParentElement(*curr)) { | 6543 curr = FlatTreeTraversal::ParentElement(*curr)) { |
| 6544 elements_to_add_to_hover_chain.push_back(curr); | |
|
Navid Zolghadr
2017/07/04 17:51:59
Do we need a check like old_hover_element != new_h
| |
| 6544 if (!must_be_in_active_chain || curr->InActiveChain()) | 6545 if (!must_be_in_active_chain || curr->InActiveChain()) |
| 6545 elements_to_add_to_chain.push_back(curr); | 6546 elements_to_add_to_active_chain.push_back(curr); |
| 6546 } | 6547 } |
| 6547 | 6548 |
| 6548 if (allow_hover_changes) { | 6549 if (allow_hover_changes) { |
| 6549 for (Element* element : elements_to_remove_from_chain) | 6550 for (Element* element : elements_to_remove_from_chain) |
| 6550 element->SetHovered(false); | 6551 element->SetHovered(false); |
| 6551 } | 6552 } |
| 6552 | 6553 |
| 6554 // Elements past the common ancestor do not change hover state, but might | |
| 6555 // change active state. | |
| 6556 for (Element* element : elements_to_add_to_active_chain) { | |
| 6557 if (allow_active_changes) | |
| 6558 element->SetActive(true); | |
| 6559 } | |
| 6560 | |
| 6553 bool saw_common_ancestor = false; | 6561 bool saw_common_ancestor = false; |
| 6554 for (Element* element : elements_to_add_to_chain) { | 6562 for (Element* element : elements_to_add_to_hover_chain) { |
| 6555 // Elements past the common ancestor do not change hover state, but might | |
| 6556 // change active state. | |
| 6557 if (element == ancestor_element) | 6563 if (element == ancestor_element) |
| 6558 saw_common_ancestor = true; | 6564 saw_common_ancestor = true; |
| 6559 if (allow_active_changes) | |
| 6560 element->SetActive(true); | |
| 6561 if (allow_hover_changes && | 6565 if (allow_hover_changes && |
| 6562 (!saw_common_ancestor || element == hover_element_)) | 6566 (!saw_common_ancestor || element == hover_element_)) |
| 6563 element->SetHovered(true); | 6567 element->SetHovered(true); |
| 6564 } | 6568 } |
| 6565 } | 6569 } |
| 6566 | 6570 |
| 6567 bool Document::HaveScriptBlockingStylesheetsLoaded() const { | 6571 bool Document::HaveScriptBlockingStylesheetsLoaded() const { |
| 6568 return style_engine_->HaveScriptBlockingStylesheetsLoaded(); | 6572 return style_engine_->HaveScriptBlockingStylesheetsLoaded(); |
| 6569 } | 6573 } |
| 6570 | 6574 |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6920 } | 6924 } |
| 6921 | 6925 |
| 6922 void showLiveDocumentInstances() { | 6926 void showLiveDocumentInstances() { |
| 6923 WeakDocumentSet& set = liveDocumentSet(); | 6927 WeakDocumentSet& set = liveDocumentSet(); |
| 6924 fprintf(stderr, "There are %u documents currently alive:\n", set.size()); | 6928 fprintf(stderr, "There are %u documents currently alive:\n", set.size()); |
| 6925 for (blink::Document* document : set) | 6929 for (blink::Document* document : set) |
| 6926 fprintf(stderr, "- Document %p URL: %s\n", document, | 6930 fprintf(stderr, "- Document %p URL: %s\n", document, |
| 6927 document->Url().GetString().Utf8().data()); | 6931 document->Url().GetString().Utf8().data()); |
| 6928 } | 6932 } |
| 6929 #endif | 6933 #endif |
| OLD | NEW |