blob: 39d598afc92d638ef2a9b846c8f1a3398639b39b [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/core/css/style_invalidation_root.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/dom/element.h"
#include "third_party/blink/renderer/core/dom/shadow_root.h"
namespace blink {
Element* StyleInvalidationRoot::RootElement() const {
Node* root_node = GetRootNode();
DCHECK(root_node);
if (auto* shadow_root = DynamicTo<ShadowRoot>(root_node)) {
return &shadow_root->host();
}
if (root_node->IsDocumentNode()) {
return root_node->GetDocument().documentElement();
}
return To<Element>(root_node);
}
#if DCHECK_IS_ON()
ContainerNode* StyleInvalidationRoot::Parent(const Node& node) const {
return node.ParentOrShadowHostNode();
}
bool StyleInvalidationRoot::IsChildDirty(const Node& node) const {
return node.ChildNeedsStyleInvalidation();
}
#endif // DCHECK_IS_ON()
bool StyleInvalidationRoot::IsDirty(const Node& node) const {
return node.NeedsStyleInvalidation();
}
void StyleInvalidationRoot::SubtreeModified(ContainerNode& parent) {
if (!GetRootNode() || GetRootNode()->isConnected()) {
return;
}
for (Node* ancestor = &parent; ancestor;
ancestor = ancestor->ParentOrShadowHostNode()) {
DCHECK(ancestor->ChildNeedsStyleInvalidation());
DCHECK(!ancestor->NeedsStyleInvalidation());
ancestor->ClearChildNeedsStyleInvalidation();
}
Clear();
}
} // namespace blink