Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef SVGElementProxy_h | |
| 6 #define SVGElementProxy_h | |
| 7 | |
| 8 #include "core/fetch/DocumentResource.h" | |
| 9 #include "platform/heap/Handle.h" | |
| 10 #include "wtf/text/AtomicString.h" | |
| 11 #include "wtf/text/WTFString.h" | |
| 12 | |
| 13 namespace blink { | |
| 14 | |
| 15 class Document; | |
| 16 class SVGElement; | |
| 17 class SVGResourceClient; | |
| 18 class TreeScope; | |
| 19 | |
| 20 // A proxy to an SVGElement. Allows access to an element with a certain 'id', | |
|
pdr.
2016/10/20 19:03:42
Do you mind expanding this comment to describe the
fs
2016/10/21 11:17:12
Thanks, I tried to jot something down that I hope
| |
| 21 // and provides its clients with notifications when the reference changes. | |
| 22 class SVGElementProxy : public GarbageCollectedFinalized<SVGElementProxy>, | |
| 23 private DocumentResourceClient { | |
| 24 USING_GARBAGE_COLLECTED_MIXIN(SVGElementProxy); | |
| 25 USING_PRE_FINALIZER(SVGElementProxy, detachDocumentClient); | |
| 26 | |
| 27 public: | |
| 28 // Create a proxy to an element in the same document. (See also | |
| 29 // SVGURLReferenceResolver and the definition of 'local url'.) | |
| 30 static SVGElementProxy* create(const AtomicString& id) { | |
| 31 return new SVGElementProxy(id); | |
| 32 } | |
| 33 | |
| 34 // Create a proxy to an element in a different document (indicated by |url|.) | |
| 35 static SVGElementProxy* create(const String& url, const AtomicString& id) { | |
| 36 return new SVGElementProxy(url, id); | |
| 37 } | |
| 38 virtual ~SVGElementProxy(); | |
| 39 | |
| 40 void addClient(SVGResourceClient*); | |
| 41 void removeClient(SVGResourceClient*); | |
| 42 | |
| 43 // Resolve a potentially external reference. | |
| 44 void resolve(Document&); | |
| 45 | |
| 46 // Returns the proxied element, or null if the proxy is invalid. | |
| 47 SVGElement* element(TreeScope&); | |
| 48 | |
| 49 // Notify the proxy that the structure of the subtree rooted at the proxied | |
| 50 // element has mutated. This should generally only be called via a proxy | |
| 51 // tracker. | |
| 52 void contentChanged(); | |
| 53 | |
| 54 // Notify the proxy that the reference it holds may now be pointing somewhere | |
| 55 // else (the id of an element changed, the resource document of the proxy | |
| 56 // finished loading, the element was removed from the document tree etc.) | |
| 57 // This should generally only be called via a proxy tracker. | |
| 58 void referenceChanged(); | |
| 59 | |
| 60 const AtomicString& id() const { return m_id; } | |
| 61 | |
| 62 // The current "generation" of this proxy. This is essentially a sequence | |
| 63 // number (or counter) incremented with each change to the proxy reference. | |
|
pdr.
2016/10/20 19:03:42
Nit: "reference" was a little confusing to me when
fs
2016/10/21 11:17:12
I tried to replace "reference" with "proxied eleme
| |
| 64 unsigned generation() const { return m_generation; } | |
| 65 | |
| 66 DECLARE_VIRTUAL_TRACE(); | |
| 67 | |
| 68 private: | |
| 69 explicit SVGElementProxy(const AtomicString&); | |
| 70 SVGElementProxy(const String&, const AtomicString&); | |
| 71 | |
| 72 void detachDocumentClient(); | |
| 73 // ResourceClient implementation. Used when referencing an external resource | |
| 74 // document. | |
| 75 void notifyFinished(Resource*) override; | |
| 76 String debugName() const override { return "SVGElementProxy"; } | |
| 77 | |
| 78 void incrementGeneration() { m_generation++; } | |
| 79 TreeScope* treeScopeForLookup(TreeScope&) const; | |
| 80 | |
| 81 HeapHashSet<Member<SVGResourceClient>> m_clients; | |
| 82 Member<DocumentResource> m_document; | |
| 83 AtomicString m_id; | |
| 84 // URL for resolving references to external resource documents. Contains an | |
| 85 // absolute URL to the resource to load. Cleared when a load has been | |
| 86 // initiated. Ignored if m_isLocal is true. | |
| 87 String m_url; | |
| 88 unsigned m_generation; | |
| 89 bool m_isLocal; | |
| 90 }; | |
| 91 | |
| 92 // Collection of SVGElementProxys. This is hosted by elements that can be | |
| 93 // subject to proxies (currently only SVGFilterElement), and is mainly a helper | |
| 94 // for dealing with the many-to-one structure of SVGElementProxy. | |
| 95 class SVGElementProxySet : public GarbageCollected<SVGElementProxySet> { | |
| 96 public: | |
| 97 void add(SVGElementProxy&); | |
| 98 bool isEmpty() const; | |
| 99 | |
| 100 // Notify proxy clients that the (content of the) proxied element has | |
| 101 // changed. | |
| 102 void notifyContentChanged(); | |
| 103 | |
| 104 // Notify proxy clients that the reference to the is no longer valid. This | |
| 105 // also clears references to the proxied element. | |
| 106 void invalidateProxies(); | |
| 107 | |
| 108 DECLARE_TRACE(); | |
| 109 | |
| 110 private: | |
| 111 using ProxySet = HeapHashSet<WeakMember<SVGElementProxy>>; | |
| 112 ProxySet m_elementProxies; | |
| 113 }; | |
| 114 | |
| 115 } // namespace blink | |
| 116 | |
| 117 #endif // SVGElementProxy_h | |
| OLD | NEW |