diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/core/layout/svg/svg_resources_cycle_solver.h')
-rw-r--r-- | chromium/third_party/blink/renderer/core/layout/svg/svg_resources_cycle_solver.h | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/chromium/third_party/blink/renderer/core/layout/svg/svg_resources_cycle_solver.h b/chromium/third_party/blink/renderer/core/layout/svg/svg_resources_cycle_solver.h index bf44ebdde60..6a9068479c5 100644 --- a/chromium/third_party/blink/renderer/core/layout/svg/svg_resources_cycle_solver.h +++ b/chromium/third_party/blink/renderer/core/layout/svg/svg_resources_cycle_solver.h @@ -21,15 +21,12 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_SVG_SVG_RESOURCES_CYCLE_SOLVER_H_ #include "base/macros.h" +#include "third_party/blink/renderer/core/layout/svg/layout_svg_resource_container.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/hash_set.h" namespace blink { -class LayoutObject; -class LayoutSVGResourceContainer; -class SVGResources; - // This class traverses the graph formed by SVGResources of // LayoutObjects, maintaining the active path as LayoutObjects are // visited. It also maintains a cache of sub-graphs that has already @@ -38,22 +35,40 @@ class SVGResourcesCycleSolver { STACK_ALLOCATED(); public: - SVGResourcesCycleSolver(LayoutObject&); + SVGResourcesCycleSolver(); ~SVGResourcesCycleSolver(); - // Traverse the graph starting at the resource container - // passed. Returns true if a cycle is detected. - bool FindCycle(LayoutSVGResourceContainer*); + bool IsKnownAcyclic(const LayoutSVGResourceContainer*) const; + void AddAcyclicSubgraph(const LayoutSVGResourceContainer*); - typedef HashSet<LayoutSVGResourceContainer*> ResourceSet; + class Scope { + STACK_ALLOCATED(); - private: - bool TraverseResourceContainer(LayoutSVGResourceContainer*); - bool TraverseResources(LayoutObject&); - bool TraverseResources(SVGResources*); + public: + Scope(SVGResourcesCycleSolver& solver) + : solver_(solver), resource_(nullptr) {} + ~Scope() { + if (resource_) + solver_.LeaveResource(resource_); + } + + bool Enter(const LayoutSVGResourceContainer* resource) { + if (!solver_.EnterResource(resource)) + return false; + resource_ = resource; + return true; + } - LayoutObject& layout_object_; + private: + SVGResourcesCycleSolver& solver_; + const LayoutSVGResourceContainer* resource_; + }; + + private: + bool EnterResource(const LayoutSVGResourceContainer*); + void LeaveResource(const LayoutSVGResourceContainer*); + using ResourceSet = HashSet<const LayoutSVGResourceContainer*>; ResourceSet active_resources_; ResourceSet dag_cache_; DISALLOW_COPY_AND_ASSIGN(SVGResourcesCycleSolver); |