// 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. #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_RESOURCE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_RESOURCE_H_ #include "third_party/blink/renderer/core/loader/resource/image_resource_observer.h" #include "third_party/blink/renderer/core/svg/svg_resource_document_observer.h" #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_map.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/prefinalizer.h" #include "third_party/blink/renderer/platform/loader/fetch/cross_origin_attribute_value.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" namespace WTF { class String; } // namespace WTF namespace blink { class Document; class Element; class IdTargetObserver; class ImageResourceObserver; class LayoutSVGResourceContainer; class QualifiedName; class SVGFilterPrimitiveStandardAttributes; class SVGResourceClient; class SVGResourceDocumentContent; class TreeScope; // A class tracking a reference to an SVG resource (an element that constitutes // a paint server, mask, clip-path, filter et.c.) // // Elements can be referenced using CSS, for example like: // // filter: url(#baz); ("local") // // or // // filter: url(foo.com/bar.svg#baz); ("external") // // SVGResource provide a mechanism to persistently reference an element in such // cases - regardless of if the element reside in the same document (read: tree // scope) or in an external (resource) document. Loading events related to the // external documents case are handled by the SVGResource. // // For same document references, changes that could affect the 'id' lookup will // be tracked, to handle elements being added, removed or having their 'id' // mutated. (This does not apply for the external document case because it's // assumed they will not mutate after load, due to scripts not being run etc.) // // SVGResources are created, and managed, either by SVGTreeScopeResources // (local) or CSSURIValue (external), and have SVGResourceClients as a means to // deliver change notifications. Clients that are interested in change // notifications hence need to register a SVGResourceClient or a // ImageResourceObserver with the SVGResource. Most commonly this registration // would take place when the computed style changes. If an // ImageResourceObserver is registered, an SVGResourceClient is created // internally, which can be accessed using // SVGResource::GetObserverResourceClient() if needed. // // The element is bound either when the SVGResource is created (for local // resources) or after the referenced resource has completed loading (for // external resources.) // // As content is mutated, clients will get notified via the SVGResource. // // <event> -> SVG...Element -> SVGResource -> SVGResourceClient(0..N) // class SVGResource : public GarbageCollected<SVGResource> { … }; // Local resource reference (see SVGResource.) class LocalSVGResource final : public SVGResource { … }; // External resource reference (see SVGResource) with an // SVGResourceDocumentContent as the "data source". class ExternalSVGResourceDocumentContent final : public SVGResource, public SVGResourceDocumentObserver { … }; // External resource reference (see SVGResource) with an ImageResourceContent // as the "data source". class ExternalSVGResourceImageContent final : public SVGResource, public ImageResourceObserver { … }; } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_RESOURCE_H_