summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/layout/svg/svg_resources_cycle_solver.h
diff options
context:
space:
mode:
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.h43
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);