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 |