Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1083)

Unified Diff: third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceContainer.cpp

Issue 2824823003: DOM-based SVG resource tracking (Closed)
Patch Set: Update baselines Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceContainer.cpp
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceContainer.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceContainer.cpp
index 0a419cf9d5d14b97968e0463a88c5df04c0c2aa6..1a224e9fb3144af0216c03b69f4a7aff36387370 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceContainer.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceContainer.cpp
@@ -27,17 +27,22 @@
namespace blink {
-static inline SVGTreeScopeResources& SvgTreeScopeResourcesFromElement(
- Element* element) {
- DCHECK(element);
- return element->GetTreeScope().EnsureSVGTreeScopedResources();
+namespace {
+
+SVGTreeScopeResources::Resource* ResourceForContainer(
+ const LayoutSVGResourceContainer& resource_container) {
+ const SVGElement& element = *resource_container.GetElement();
+ return element.GetTreeScope()
+ .EnsureSVGTreeScopedResources()
+ .ExistingResourceForId(element.GetIdAttribute());
}
+} // namespace
+
LayoutSVGResourceContainer::LayoutSVGResourceContainer(SVGElement* node)
: LayoutSVGHiddenContainer(node),
is_in_layout_(false),
invalidation_mask_(0),
- registered_(false),
is_invalidating_(false) {}
LayoutSVGResourceContainer::~LayoutSVGResourceContainer() {}
@@ -68,45 +73,42 @@ void LayoutSVGResourceContainer::NotifyContentChanged() {
void LayoutSVGResourceContainer::WillBeDestroyed() {
LayoutSVGHiddenContainer::WillBeDestroyed();
- SvgTreeScopeResourcesFromElement(GetElement())
- .RemoveResource(GetElement()->GetIdAttribute(), this);
- DCHECK(clients_.IsEmpty());
+ // The resource is being torn down. If we have any clients, move those to be
+ // pending on the resource (if one exists.)
+ if (SVGTreeScopeResources::Resource* resource = ResourceForContainer(*this))
+ MakeClientsPending(*resource);
}
void LayoutSVGResourceContainer::StyleDidChange(
StyleDifference diff,
const ComputedStyle* old_style) {
LayoutSVGHiddenContainer::StyleDidChange(diff, old_style);
- SvgTreeScopeResourcesFromElement(GetElement())
- .UpdateResource(GetElement()->GetIdAttribute(), this);
+ // The resource has (read: may have) been attached. Notify any pending
+ // clients that they can now try to add themselves as clients to the
+ // resource.
+ if (SVGTreeScopeResources::Resource* resource = ResourceForContainer(*this)) {
+ if (resource->Target() == GetElement())
+ resource->NotifyResourceClients();
+ }
}
-void LayoutSVGResourceContainer::DetachAllClients(const AtomicString& to_id) {
+void LayoutSVGResourceContainer::MakeClientsPending(
+ SVGTreeScopeResources::Resource& resource) {
RemoveAllClientsFromCache();
for (auto* client : clients_) {
- // Unlink the resource from the client's SVGResources. (The actual
- // removal will be signaled after processing all the clients.)
+ // Unlink the resource from the client's SVGResources.
SVGResources* resources =
SVGResourcesCache::CachedResourcesForLayoutObject(client);
// Or else the client wouldn't be in the list in the first place.
DCHECK(resources);
resources->ResourceDestroyed(this);
- // Add a pending resolution based on the id of the old resource.
- Element* client_element = ToElement(client->GetNode());
- SvgTreeScopeResourcesFromElement(client_element)
- .AddPendingResource(to_id, *client_element);
+ resource.AddWatch(ToSVGElement(*client->GetNode()));
}
clients_.clear();
}
-void LayoutSVGResourceContainer::IdChanged(const AtomicString& old_id,
- const AtomicString& new_id) {
- SvgTreeScopeResourcesFromElement(GetElement())
- .UpdateResource(old_id, new_id, this);
-}
-
void LayoutSVGResourceContainer::MarkAllClientsForInvalidation(
InvalidationMode mode) {
if (is_invalidating_)
@@ -177,10 +179,11 @@ void LayoutSVGResourceContainer::AddClient(LayoutObject* client) {
ClearInvalidationMask();
}
-void LayoutSVGResourceContainer::RemoveClient(LayoutObject* client) {
+bool LayoutSVGResourceContainer::RemoveClient(LayoutObject* client) {
DCHECK(client);
RemoveClientFromCache(client, false);
clients_.erase(client);
+ return clients_.IsEmpty();
}
void LayoutSVGResourceContainer::InvalidateCacheAndMarkForLayout(

Powered by Google App Engine
This is Rietveld 408576698