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

Side by Side Diff: third_party/WebKit/Source/core/svg/SVGUseElement.cpp

Issue 2875303002: Nested <use>s can resolve against an external resource (Closed)
Patch Set: Avoid adding observers for targets of nested <use> elements 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 unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/core/svg/SVGUseElement.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann
3 * <zimmermann@kde.org> 3 * <zimmermann@kde.org>
4 * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org> 4 * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
5 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. 5 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
6 * Copyright (C) 2011 Torch Mobile (Beijing) Co. Ltd. All rights reserved. 6 * Copyright (C) 2011 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
7 * Copyright (C) 2012 University of Szeged 7 * Copyright (C) 2012 University of Szeged
8 * Copyright (C) 2012 Renata Hodovan <reni@webkit.org> 8 * Copyright (C) 2012 Renata Hodovan <reni@webkit.org>
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 void SVGUseElement::ClearInstanceRoot() { 291 void SVGUseElement::ClearInstanceRoot() {
292 target_element_instance_ = nullptr; 292 target_element_instance_ = nullptr;
293 } 293 }
294 294
295 void SVGUseElement::ClearResourceReference() { 295 void SVGUseElement::ClearResourceReference() {
296 UnobserveTarget(target_id_observer_); 296 UnobserveTarget(target_id_observer_);
297 ClearInstanceRoot(); 297 ClearInstanceRoot();
298 RemoveAllOutgoingReferences(); 298 RemoveAllOutgoingReferences();
299 } 299 }
300 300
301 Element* SVGUseElement::ResolveTargetElement() { 301 Element* SVGUseElement::ResolveTargetElement(ObserveBehavior observe_behavior) {
302 if (element_identifier_.IsEmpty()) 302 if (element_identifier_.IsEmpty())
303 return nullptr; 303 return nullptr;
304 if (element_identifier_is_local_) { 304 if (element_identifier_is_local_) {
305 if (observe_behavior == kDontAddObserver)
306 return GetTreeScope().getElementById(element_identifier_);
305 return ObserveTarget(target_id_observer_, GetTreeScope(), 307 return ObserveTarget(target_id_observer_, GetTreeScope(),
306 element_identifier_, 308 element_identifier_,
307 WTF::Bind(&SVGUseElement::InvalidateShadowTree, 309 WTF::Bind(&SVGUseElement::InvalidateShadowTree,
308 WrapWeakPersistent(this))); 310 WrapWeakPersistent(this)));
309 } 311 }
310 if (!ResourceIsValid()) 312 if (!ResourceIsValid())
311 return nullptr; 313 return nullptr;
312 return resource_->GetDocument()->getElementById(element_identifier_); 314 return resource_->GetDocument()->getElementById(element_identifier_);
313 } 315 }
314 316
315 void SVGUseElement::BuildPendingResource() { 317 void SVGUseElement::BuildPendingResource() {
316 if (InUseShadowTree()) 318 if (InUseShadowTree())
317 return; 319 return;
318 // FIXME: We should try to optimize this, to at least allow partial reclones. 320 // FIXME: We should try to optimize this, to at least allow partial reclones.
319 UseShadowRoot().RemoveChildren(kOmitSubtreeModifiedEvent); 321 UseShadowRoot().RemoveChildren(kOmitSubtreeModifiedEvent);
320 ClearResourceReference(); 322 ClearResourceReference();
321 CancelShadowTreeRecreation(); 323 CancelShadowTreeRecreation();
322 if (!isConnected()) 324 if (!isConnected())
323 return; 325 return;
324 Element* target = ResolveTargetElement(); 326 Element* target = ResolveTargetElement(kAddObserver);
325 // TODO(fs): Why would the Element not be "connected" at this point? 327 // TODO(fs): Why would the Element not be "connected" at this point?
326 if (target && target->isConnected() && target->IsSVGElement()) { 328 if (target && target->isConnected() && target->IsSVGElement()) {
327 BuildShadowAndInstanceTree(ToSVGElement(*target)); 329 BuildShadowAndInstanceTree(ToSVGElement(*target));
328 InvalidateDependentShadowTrees(); 330 InvalidateDependentShadowTrees();
329 } 331 }
330 332
331 DCHECK(!needs_shadow_tree_recreation_); 333 DCHECK(!needs_shadow_tree_recreation_);
332 } 334 }
333 335
334 String SVGUseElement::title() const { 336 String SVGUseElement::title() const {
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 for (SVGElement& element : 549 for (SVGElement& element :
548 Traversal<SVGElement>::DescendantsOf(UseShadowRoot())) { 550 Traversal<SVGElement>::DescendantsOf(UseShadowRoot())) {
549 if (EventTargetData* data = 551 if (EventTargetData* data =
550 element.CorrespondingElement()->GetEventTargetData()) { 552 element.CorrespondingElement()->GetEventTargetData()) {
551 data->event_listener_map.CopyEventListenersNotCreatedFromMarkupToTarget( 553 data->event_listener_map.CopyEventListenersNotCreatedFromMarkupToTarget(
552 &element); 554 &element);
553 } 555 }
554 } 556 }
555 } 557 }
556 558
557 bool SVGUseElement::HasCycleUseReferencing(const SVGUseElement& use, 559 bool SVGUseElement::HasCycleUseReferencing(SVGUseElement& use,
558 const ContainerNode& target_instance, 560 const ContainerNode& target_instance,
559 SVGElement*& new_target) const { 561 SVGElement*& new_target) const {
560 Element* target_element = 562 Element* target_element = use.ResolveTargetElement(kDontAddObserver);
pdr. 2017/05/13 03:10:50 Can you help me understand why we don't want to ad
fs 2017/05/13 08:24:06 We don't want to add an observer, because the elem
561 TargetElementFromIRIString(use.HrefString(), use.GetTreeScope());
562 new_target = 0; 563 new_target = 0;
563 if (target_element && target_element->IsSVGElement()) 564 if (target_element && target_element->IsSVGElement())
564 new_target = ToSVGElement(target_element); 565 new_target = ToSVGElement(target_element);
565 566
566 if (!new_target) 567 if (!new_target)
567 return false; 568 return false;
568 569
569 // Shortcut for self-references 570 // Shortcut for self-references
570 if (new_target == this) 571 if (new_target == this)
571 return true; 572 return true;
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 747
747 if (resource_) 748 if (resource_)
748 resource_->RemoveClient(this); 749 resource_->RemoveClient(this);
749 750
750 resource_ = resource; 751 resource_ = resource;
751 if (resource_) 752 if (resource_)
752 resource_->AddClient(this); 753 resource_->AddClient(this);
753 } 754 }
754 755
755 } // namespace blink 756 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/svg/SVGUseElement.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698