blob: 89d4e0d8b42fe1dadea02c705085fa7b3244863d [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CustomElementUpgradeSorter_h
#define CustomElementUpgradeSorter_h
#include "core/CoreExport.h"
#include "platform/heap/Handle.h"
namespace blink {
class Element;
class Node;
// Does a shadow-including tree order sort of a subset of elements.
// https://dom.spec.whatwg.org/#concept-shadow-including-tree-order
class CORE_EXPORT CustomElementUpgradeSorter {
STACK_ALLOCATED();
public:
CustomElementUpgradeSorter();
// Record an element of interest. The DOM tree must not be
// modified between calls to add and the call to sorted.
void add(Element*);
// Adds shadow-including descendents of parent to result in
// shadow-including tree order. This operation is destroys the
// state of this sorter; after calling sorted, you must not call
// add or sorted again with this object.
void sorted(HeapVector<Member<Element>>* result, Node* parent);
private:
using ChildSet = HeapHashSet<Member<Node>>;
using ParentChildMap = HeapHashMap<Member<Node>, ChildSet>;
enum AddResult {
kParentAlreadyExistsInMap,
kParentAddedToMap
};
AddResult addToParentChildMap(Node* parent, Node* child);
void visit(
HeapVector<Member<Element>>* result,
ChildSet&,
const ChildSet::iterator&);
Member<HeapHashSet<Member<Element>>> m_elements;
// This is the subset of the tree, from root node (usually
// document) through elements and shadow roots, to candidates.
Member<ParentChildMap> m_parentChildMap;
};
} // namespace blink
#endif // CustomElementUpgradeSorter_h