Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |