Chromium Code Reviews| Index: third_party/WebKit/Source/core/dom/VisitedLinkState.cpp |
| diff --git a/third_party/WebKit/Source/core/dom/VisitedLinkState.cpp b/third_party/WebKit/Source/core/dom/VisitedLinkState.cpp |
| index 4d7876030bcff6497ae96219ea37906a14d862b9..da0c1a85c977e5dd04ee564cfe4b522c02c8fb2f 100644 |
| --- a/third_party/WebKit/Source/core/dom/VisitedLinkState.cpp |
| +++ b/third_party/WebKit/Source/core/dom/VisitedLinkState.cpp |
| @@ -30,6 +30,8 @@ |
| #include "core/HTMLNames.h" |
| #include "core/dom/ElementTraversal.h" |
| +#include "core/dom/shadow/ElementShadow.h" |
| +#include "core/dom/shadow/ShadowRoot.h" |
| #include "core/html/HTMLAnchorElement.h" |
| #include "core/svg/SVGURIReference.h" |
| #include "public/platform/Platform.h" |
| @@ -58,11 +60,9 @@ VisitedLinkState::VisitedLinkState(const Document& document) |
| { |
| } |
| -void VisitedLinkState::invalidateStyleForAllLinks(bool invalidateVisitedLinkHashes) |
| +static void invalidateStyleForAllLinksRecursively(Node& rootNode, bool invalidateVisitedLinkHashes) |
| { |
| - if (m_linksCheckedForVisitedState.isEmpty()) |
| - return; |
| - for (Node& node : NodeTraversal::startsAt(document().firstChild())) { |
| + for (Node& node : NodeTraversal::startsAt(&rootNode)) { |
| if (node.isLink()) { |
| if (invalidateVisitedLinkHashes && isHTMLAnchorElement(node)) |
| toHTMLAnchorElement(node).invalidateCachedVisitedLinkHash(); |
| @@ -70,22 +70,39 @@ void VisitedLinkState::invalidateStyleForAllLinks(bool invalidateVisitedLinkHash |
| toElement(node).pseudoStateChanged(CSSSelector::PseudoVisited); |
| toElement(node).pseudoStateChanged(CSSSelector::PseudoAnyLink); |
| } |
| + if (isShadowHost(&node)) { |
| + for (ShadowRoot* root = node.youngestShadowRoot(); root; root = root->olderShadowRoot()) |
| + invalidateStyleForAllLinksRecursively(*root, invalidateVisitedLinkHashes); |
| + } |
| } |
| } |
| -void VisitedLinkState::invalidateStyleForLink(LinkHash linkHash) |
| +void VisitedLinkState::invalidateStyleForAllLinks(bool invalidateVisitedLinkHashes) |
| { |
| - if (!m_linksCheckedForVisitedState.contains(linkHash)) |
| - return; |
| - for (Node& node : NodeTraversal::startsAt(document().firstChild())) { |
| + if (!m_linksCheckedForVisitedState.isEmpty()) |
| + invalidateStyleForAllLinksRecursively(*document().firstChild(), invalidateVisitedLinkHashes); |
|
esprehn
2016/04/21 08:14:03
I think the document firstChild can be null here.
|
| +} |
| + |
| +static void invalidateStyleForLinkRecursively(Node& rootNode, LinkHash linkHash) |
| +{ |
| + for (Node& node : NodeTraversal::startsAt(&rootNode)) { |
| if (node.isLink() && linkHashForElement(toElement(node)) == linkHash) { |
| toElement(node).pseudoStateChanged(CSSSelector::PseudoLink); |
| toElement(node).pseudoStateChanged(CSSSelector::PseudoVisited); |
| toElement(node).pseudoStateChanged(CSSSelector::PseudoAnyLink); |
| } |
| + if (isShadowHost(&node)) |
| + for (ShadowRoot* root = node.youngestShadowRoot(); root; root = root->olderShadowRoot()) |
| + invalidateStyleForLinkRecursively(*root, linkHash); |
| } |
| } |
| +void VisitedLinkState::invalidateStyleForLink(LinkHash linkHash) |
| +{ |
| + if (m_linksCheckedForVisitedState.contains(linkHash)) |
| + invalidateStyleForLinkRecursively(*document().firstChild(), linkHash); |
|
esprehn
2016/04/21 08:14:03
Ditto.
|
| +} |
| + |
| EInsideLink VisitedLinkState::determineLinkStateSlowCase(const Element& element) |
| { |
| DCHECK(element.isLink()); |