RenderSVGShadowTreeRootContainer.cpp revision 65f03d4f644ce73618e5f4f50dd694b26f55ae12
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(); 41f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_shadowRoot->clearShadowHost(); 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 62cad810f21b803229eb11403f9209855525a25d57Steve Block ASSERT(m_shadowRoot->shadowHost() == 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