1d0825bca7fe65beaee391d30da42e937db621564Steve Block/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) Research In Motion Limited 2010. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * This library is free software; you can redistribute it and/or
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modify it under the terms of the GNU Library General Public
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * License as published by the Free Software Foundation; either
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * version 2 of the License, or (at your option) any later version.
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * This library is distributed in the hope that it will be useful,
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Library General Public License for more details.
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * You should have received a copy of the GNU Library General Public License
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * along with this library; see the file COPYING.LIB.  If not, write to
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Boston, MA 02110-1301, USA.
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
19d0825bca7fe65beaee391d30da42e937db621564Steve Block
20d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "config.h"
21d0825bca7fe65beaee391d30da42e937db621564Steve Block
22d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(SVG)
23d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "RenderSVGShadowTreeRootContainer.h"
24d0825bca7fe65beaee391d30da42e937db621564Steve Block
25d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "MouseEvent.h"
26d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "SVGShadowTreeElements.h"
27d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "SVGUseElement.h"
28d0825bca7fe65beaee391d30da42e937db621564Steve Block
29d0825bca7fe65beaee391d30da42e937db621564Steve Blocknamespace WebCore {
30d0825bca7fe65beaee391d30da42e937db621564Steve Block
31d0825bca7fe65beaee391d30da42e937db621564Steve BlockRenderSVGShadowTreeRootContainer::RenderSVGShadowTreeRootContainer(SVGUseElement* node)
32d0825bca7fe65beaee391d30da42e937db621564Steve Block    : RenderSVGTransformableContainer(node)
33d0825bca7fe65beaee391d30da42e937db621564Steve Block    , m_recreateTree(false)
34d0825bca7fe65beaee391d30da42e937db621564Steve Block{
35d0825bca7fe65beaee391d30da42e937db621564Steve Block}
36d0825bca7fe65beaee391d30da42e937db621564Steve Block
37d0825bca7fe65beaee391d30da42e937db621564Steve BlockRenderSVGShadowTreeRootContainer::~RenderSVGShadowTreeRootContainer()
38d0825bca7fe65beaee391d30da42e937db621564Steve Block{
39f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (m_shadowRoot && m_shadowRoot->attached()) {
40d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_shadowRoot->detach();
412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_shadowRoot->clearSVGShadowHost();
42f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
43d0825bca7fe65beaee391d30da42e937db621564Steve Block}
44d0825bca7fe65beaee391d30da42e937db621564Steve Block
45d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid RenderSVGShadowTreeRootContainer::updateStyle(Node::StyleChange change)
46d0825bca7fe65beaee391d30da42e937db621564Steve Block{
47d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (m_shadowRoot && m_shadowRoot->attached())
48d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_shadowRoot->recalcStyle(change);
49d0825bca7fe65beaee391d30da42e937db621564Steve Block}
50d0825bca7fe65beaee391d30da42e937db621564Steve Block
51d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid RenderSVGShadowTreeRootContainer::updateFromElement()
52d0825bca7fe65beaee391d30da42e937db621564Steve Block{
53d0825bca7fe65beaee391d30da42e937db621564Steve Block    bool hadExistingTree = m_shadowRoot;
54d0825bca7fe65beaee391d30da42e937db621564Steve Block
55d0825bca7fe65beaee391d30da42e937db621564Steve Block    SVGUseElement* useElement = static_cast<SVGUseElement*>(node());
56d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!m_shadowRoot) {
57d0825bca7fe65beaee391d30da42e937db621564Steve Block        ASSERT(!m_recreateTree);
585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_shadowRoot = SVGShadowTreeRootElement::create(document(), useElement);
59d0825bca7fe65beaee391d30da42e937db621564Steve Block        useElement->buildPendingResource();
60d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
61d0825bca7fe65beaee391d30da42e937db621564Steve Block
622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(m_shadowRoot->svgShadowHost() == useElement);
63d0825bca7fe65beaee391d30da42e937db621564Steve Block
64d0825bca7fe65beaee391d30da42e937db621564Steve Block    bool shouldRecreateTree = m_recreateTree;
65d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (m_recreateTree) {
66d0825bca7fe65beaee391d30da42e937db621564Steve Block        ASSERT(hadExistingTree);
67d0825bca7fe65beaee391d30da42e937db621564Steve Block
68d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (m_shadowRoot->attached())
69d0825bca7fe65beaee391d30da42e937db621564Steve Block            m_shadowRoot->detach();
70d0825bca7fe65beaee391d30da42e937db621564Steve Block
71d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_shadowRoot->removeAllChildren();
72d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_recreateTree = false;
73d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
74d0825bca7fe65beaee391d30da42e937db621564Steve Block
75d0825bca7fe65beaee391d30da42e937db621564Steve Block    // Only rebuild the shadow tree, if we a) never had a tree or b) we were specifically asked to do so
76d0825bca7fe65beaee391d30da42e937db621564Steve Block    // If the use element is a pending resource, and a) or b) is true, do nothing, and wait for the use
77d0825bca7fe65beaee391d30da42e937db621564Steve Block    // element to be asked to buildPendingResource(), this will call us again, with m_recreateTrue=true.
78d0825bca7fe65beaee391d30da42e937db621564Steve Block    if ((shouldRecreateTree || !hadExistingTree) && !useElement->isPendingResource()) {
79d0825bca7fe65beaee391d30da42e937db621564Steve Block        useElement->buildShadowAndInstanceTree(m_shadowRoot.get());
80d0825bca7fe65beaee391d30da42e937db621564Steve Block
81d0825bca7fe65beaee391d30da42e937db621564Steve Block        // Attach shadow root element
82d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_shadowRoot->attachElement(style(), renderArena());
83d0825bca7fe65beaee391d30da42e937db621564Steve Block
84d0825bca7fe65beaee391d30da42e937db621564Steve Block        // Attach subtree, as if it was a regular non-shadow tree
85d0825bca7fe65beaee391d30da42e937db621564Steve Block        for (Node* child = m_shadowRoot->firstChild(); child; child = child->nextSibling())
86d0825bca7fe65beaee391d30da42e937db621564Steve Block            child->attach();
87d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
88d0825bca7fe65beaee391d30da42e937db621564Steve Block
89d0825bca7fe65beaee391d30da42e937db621564Steve Block    ASSERT(!m_recreateTree);
90d0825bca7fe65beaee391d30da42e937db621564Steve Block    RenderSVGTransformableContainer::updateFromElement();
91d0825bca7fe65beaee391d30da42e937db621564Steve Block}
92d0825bca7fe65beaee391d30da42e937db621564Steve Block
93d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid RenderSVGShadowTreeRootContainer::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
94d0825bca7fe65beaee391d30da42e937db621564Steve Block{
95d0825bca7fe65beaee391d30da42e937db621564Steve Block    RenderSVGTransformableContainer::styleDidChange(diff, oldStyle);
96d0825bca7fe65beaee391d30da42e937db621564Steve Block
97d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (RenderObject* shadowRootRenderer = m_shadowRoot ? m_shadowRoot->renderer() : 0)
98d0825bca7fe65beaee391d30da42e937db621564Steve Block        shadowRootRenderer->setStyle(style());
99d0825bca7fe65beaee391d30da42e937db621564Steve Block}
100d0825bca7fe65beaee391d30da42e937db621564Steve Block
101967717af5423377c967781471ee106e2bb4e11c8Ben MurdochNode* RenderSVGShadowTreeRootContainer::rootElement() const
102967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
103967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return m_shadowRoot.get();
104967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
105967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
106d0825bca7fe65beaee391d30da42e937db621564Steve Block}
107d0825bca7fe65beaee391d30da42e937db621564Steve Block
108d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
109