Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / svg / SVGElementRareData.cpp
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 }