1 // Copyright 2014 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 #include "config.h" 6 #include "core/svg/SVGElementRareData.h" 7 8 #include "core/css/CSSCursorImageValue.h" 9 #include "core/css/resolver/StyleResolver.h" 10 #include "core/dom/Document.h" 11 #include "core/svg/SVGCursorElement.h" 12 13 namespace blink { 14 15 MutableStylePropertySet* SVGElementRareData::ensureAnimatedSMILStyleProperties() 16 { 17 if (!m_animatedSMILStyleProperties) 18 m_animatedSMILStyleProperties = MutableStylePropertySet::create(SVGAttributeMode); 19 return m_animatedSMILStyleProperties.get(); 20 } 21 22 RenderStyle* SVGElementRareData::overrideComputedStyle(Element* element, RenderStyle* parentStyle) 23 { 24 ASSERT(element); 25 if (!m_useOverrideComputedStyle) 26 return 0; 27 if (!m_overrideComputedStyle || m_needsOverrideComputedStyleUpdate) { 28 // The style computed here contains no CSS Animations/Transitions or SMIL induced rules - this is needed to compute the "base value" for the SMIL animation sandwhich model. 29 m_overrideComputedStyle = element->document().ensureStyleResolver().styleForElement(element, parentStyle, DisallowStyleSharing, MatchAllRulesExcludingSMIL); 30 m_needsOverrideComputedStyleUpdate = false; 31 } 32 ASSERT(m_overrideComputedStyle); 33 return m_overrideComputedStyle.get(); 34 } 35 36 void SVGElementRareData::trace(Visitor* visitor) 37 { 38 #if ENABLE(OILPAN) 39 visitor->trace(m_outgoingReferences); 40 visitor->trace(m_incomingReferences); 41 visitor->trace(m_animatedSMILStyleProperties); 42 visitor->trace(m_elementInstances); 43 visitor->trace(m_correspondingElement); 44 visitor->trace(m_owner); 45 visitor->registerWeakMembers<SVGElementRareData, &SVGElementRareData::processWeakMembers>(this); 46 #endif 47 } 48 49 void SVGElementRareData::processWeakMembers(Visitor* visitor) 50 { 51 #if ENABLE(OILPAN) 52 ASSERT(m_owner); 53 if (!visitor->isAlive(m_cursorElement)) 54 m_cursorElement = nullptr; 55 56 if (!visitor->isAlive(m_cursorImageValue)) { 57 // The owning SVGElement is still alive and if it is pointing to an SVGCursorElement 58 // we unregister it when the CSSCursorImageValue dies. 59 if (m_cursorElement) { 60 m_cursorElement->removeReferencedElement(m_owner); 61 m_cursorElement = nullptr; 62 } 63 m_cursorImageValue = nullptr; 64 } 65 ASSERT(!m_cursorElement || visitor->isAlive(m_cursorElement)); 66 ASSERT(!m_cursorImageValue || visitor->isAlive(m_cursorImageValue)); 67 #endif 68 } 69 70 71 } 72