15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org> 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Rob Buis <buis@kde.org> 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGDocumentExtensions.h" 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "XLinkNames.h" 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/SVGResourcesCache.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGElement.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGSVGElement.h" 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/animation/SMILTimeContainer.h" 31f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#include "wtf/text/AtomicString.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGDocumentExtensions::SVGDocumentExtensions(Document* document) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_document(document) 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_resourcesCache(adoptPtr(new SVGResourcesCache)) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGDocumentExtensions::~SVGDocumentExtensions() 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::addTimeContainer(SVGSVGElement* element) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_timeContainers.add(element); 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::removeTimeContainer(SVGSVGElement* element) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_timeContainers.remove(element); 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::addResource(const AtomicString& id, RenderSVGResourceContainer* resource) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(resource); 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (id.isEmpty()) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Replaces resource if already present, to handle potential id changes 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_resources.set(id, resource); 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::removeResource(const AtomicString& id) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (id.isEmpty() || !m_resources.contains(id)) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_resources.remove(id); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderSVGResourceContainer* SVGDocumentExtensions::resourceById(const AtomicString& id) const 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (id.isEmpty()) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_resources.get(id); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::startAnimations() 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Eventually every "Time Container" will need a way to latch on to some global timer 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // starting animations for a document will do this "latching" 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: We hold a ref pointers to prevent a shadow tree from getting removed out from underneath us. 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In the future we should refactor the use-element to avoid this. See https://webkit.org/b/53704 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<RefPtr<SVGSVGElement> > timeContainers; 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) timeContainers.appendRange(m_timeContainers.begin(), m_timeContainers.end()); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<RefPtr<SVGSVGElement> >::iterator end = timeContainers.end(); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Vector<RefPtr<SVGSVGElement> >::iterator itr = timeContainers.begin(); itr != end; ++itr) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (*itr)->timeContainer()->begin(); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::pauseAnimations() 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashSet<SVGSVGElement*>::iterator end = m_timeContainers.end(); 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (HashSet<SVGSVGElement*>::iterator itr = m_timeContainers.begin(); itr != end; ++itr) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (*itr)->pauseAnimations(); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::unpauseAnimations() 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashSet<SVGSVGElement*>::iterator end = m_timeContainers.end(); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (HashSet<SVGSVGElement*>::iterator itr = m_timeContainers.begin(); itr != end; ++itr) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (*itr)->unpauseAnimations(); 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::dispatchSVGLoadEventToOutermostSVGElements() 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<RefPtr<SVGSVGElement> > timeContainers; 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) timeContainers.appendRange(m_timeContainers.begin(), m_timeContainers.end()); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<RefPtr<SVGSVGElement> >::iterator end = timeContainers.end(); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Vector<RefPtr<SVGSVGElement> >::iterator it = timeContainers.begin(); it != end; ++it) { 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGSVGElement* outerSVG = (*it).get(); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!outerSVG->isOutermostSVGSVGElement()) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) outerSVG->sendSVGLoadEventIfPossible(); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void reportMessage(Document* document, MessageLevel level, const String& message) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (document->frame()) 126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) document->addConsoleMessage(RenderingMessageSource, level, message); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::reportWarning(const String& message) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) reportMessage(m_document, WarningMessageLevel, "Warning: " + message); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::reportError(const String& message) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) reportMessage(m_document, ErrorMessageLevel, "Error: " + message); 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void SVGDocumentExtensions::addPendingResource(const AtomicString& id, Element* element) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(element); 142f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) ASSERT(element->inDocument()); 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (id.isEmpty()) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HashMap<AtomicString, OwnPtr<SVGPendingElements> >::AddResult result = m_pendingResources.add(id, nullptr); 148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (result.isNewEntry) 149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) result.iterator->value = adoptPtr(new SVGPendingElements); 150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) result.iterator->value->add(element); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) element->setHasPendingResources(); 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SVGDocumentExtensions::hasPendingResource(const AtomicString& id) const 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (id.isEmpty()) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_pendingResources.contains(id); 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool SVGDocumentExtensions::isElementPendingResources(Element* element) const 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This algorithm takes time proportional to the number of pending resources and need not. 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If performance becomes an issue we can keep a counted set of elements and answer the question efficiently. 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(element); 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HashMap<AtomicString, OwnPtr<SVGPendingElements> >::const_iterator end = m_pendingResources.end(); 171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (HashMap<AtomicString, OwnPtr<SVGPendingElements> >::const_iterator it = m_pendingResources.begin(); it != end; ++it) { 172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) SVGPendingElements* elements = it->value.get(); 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(elements); 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (elements->contains(element)) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool SVGDocumentExtensions::isElementPendingResource(Element* element, const AtomicString& id) const 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(element); 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!hasPendingResource(id)) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_pendingResources.get(id)->contains(element); 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void SVGDocumentExtensions::clearHasPendingResourcesIfPossible(Element* element) 192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!isElementPendingResources(element)) 194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) element->clearHasPendingResources(); 195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void SVGDocumentExtensions::removeElementFromPendingResources(Element* element) 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(element); 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Remove the element from pending resources. 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_pendingResources.isEmpty() && element->hasPendingResources()) { 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<AtomicString> toBeRemoved; 204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HashMap<AtomicString, OwnPtr<SVGPendingElements> >::iterator end = m_pendingResources.end(); 205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (HashMap<AtomicString, OwnPtr<SVGPendingElements> >::iterator it = m_pendingResources.begin(); it != end; ++it) { 206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) SVGPendingElements* elements = it->value.get(); 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(elements); 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!elements->isEmpty()); 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) elements->remove(element); 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (elements->isEmpty()) 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toBeRemoved.append(it->key); 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) clearHasPendingResourcesIfPossible(element); 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We use the removePendingResource function here because it deals with set lifetime correctly. 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<AtomicString>::iterator vectorEnd = toBeRemoved.end(); 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Vector<AtomicString>::iterator it = toBeRemoved.begin(); it != vectorEnd; ++it) 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) removePendingResource(*it); 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Remove the element from pending resources that were scheduled for removal. 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_pendingResourcesForRemoval.isEmpty()) { 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<AtomicString> toBeRemoved; 226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HashMap<AtomicString, OwnPtr<SVGPendingElements> >::iterator end = m_pendingResourcesForRemoval.end(); 227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (HashMap<AtomicString, OwnPtr<SVGPendingElements> >::iterator it = m_pendingResourcesForRemoval.begin(); it != end; ++it) { 228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) SVGPendingElements* elements = it->value.get(); 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(elements); 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!elements->isEmpty()); 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) elements->remove(element); 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (elements->isEmpty()) 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toBeRemoved.append(it->key); 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We use the removePendingResourceForRemoval function here because it deals with set lifetime correctly. 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<AtomicString>::iterator vectorEnd = toBeRemoved.end(); 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Vector<AtomicString>::iterator it = toBeRemoved.begin(); it != vectorEnd; ++it) 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) removePendingResourceForRemoval(*it); 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassOwnPtr<SVGDocumentExtensions::SVGPendingElements> SVGDocumentExtensions::removePendingResource(const AtomicString& id) 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_pendingResources.contains(id)); 247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_pendingResources.take(id); 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassOwnPtr<SVGDocumentExtensions::SVGPendingElements> SVGDocumentExtensions::removePendingResourceForRemoval(const AtomicString& id) 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_pendingResourcesForRemoval.contains(id)); 253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_pendingResourcesForRemoval.take(id); 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::markPendingResourcesForRemoval(const AtomicString& id) 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (id.isEmpty()) 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_pendingResourcesForRemoval.contains(id)); 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) OwnPtr<SVGPendingElements> existing = m_pendingResources.take(id); 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (existing && !existing->isEmpty()) 265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_pendingResourcesForRemoval.add(id, existing.release()); 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Element* SVGDocumentExtensions::removeElementFromPendingResourcesForRemoval(const AtomicString& id) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (id.isEmpty()) 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGPendingElements* resourceSet = m_pendingResourcesForRemoval.get(id); 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!resourceSet || resourceSet->isEmpty()) 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGPendingElements::iterator firstElement = resourceSet->begin(); 278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Element* element = *firstElement; 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) resourceSet->remove(firstElement); 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (resourceSet->isEmpty()) 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) removePendingResourceForRemoval(id); 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return element; 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HashSet<SVGElement*>* SVGDocumentExtensions::setOfElementsReferencingTarget(SVGElement* referencedElement) const 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(referencedElement); 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::const_iterator it = m_elementDependencies.find(referencedElement); 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it == m_elementDependencies.end()) 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return it->value.get(); 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::addElementReferencingTarget(SVGElement* referencingElement, SVGElement* referencedElement) 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(referencingElement); 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(referencedElement); 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (HashSet<SVGElement*>* elements = m_elementDependencies.get(referencedElement)) { 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) elements->add(referencingElement); 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<HashSet<SVGElement*> > elements = adoptPtr(new HashSet<SVGElement*>); 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) elements->add(referencingElement); 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_elementDependencies.set(referencedElement, elements.release()); 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::removeAllTargetReferencesForElement(SVGElement* referencingElement) 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<SVGElement*> toBeRemoved; 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator end = m_elementDependencies.end(); 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator it = m_elementDependencies.begin(); it != end; ++it) { 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGElement* referencedElement = it->key; 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashSet<SVGElement*>* referencingElements = it->value.get(); 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashSet<SVGElement*>::iterator setIt = referencingElements->find(referencingElement); 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (setIt == referencingElements->end()) 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) referencingElements->remove(setIt); 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (referencingElements->isEmpty()) 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toBeRemoved.append(referencedElement); 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<SVGElement*>::iterator vectorEnd = toBeRemoved.end(); 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Vector<SVGElement*>::iterator it = toBeRemoved.begin(); it != vectorEnd; ++it) 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_elementDependencies.remove(*it); 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void SVGDocumentExtensions::rebuildAllElementReferencesForTarget(SVGElement* referencedElement) 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(referencedElement); 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator it = m_elementDependencies.find(referencedElement); 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it == m_elementDependencies.end()) 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(it->key == referencedElement); 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<SVGElement*> toBeNotified; 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashSet<SVGElement*>* referencingElements = it->value.get(); 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashSet<SVGElement*>::iterator setEnd = referencingElements->end(); 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (HashSet<SVGElement*>::iterator setIt = referencingElements->begin(); setIt != setEnd; ++setIt) 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toBeNotified.append(*setIt); 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Force rebuilding the referencingElement so it knows about this change. 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<SVGElement*>::iterator vectorEnd = toBeNotified.end(); 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (Vector<SVGElement*>::iterator vectorIt = toBeNotified.begin(); vectorIt != vectorEnd; ++vectorIt) { 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Before rebuilding referencingElement ensure it was not removed from under us. 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (HashSet<SVGElement*>* referencingElements = setOfElementsReferencingTarget(referencedElement)) { 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (referencingElements->contains(*vectorIt)) 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (*vectorIt)->svgAttributeChanged(XLinkNames::hrefAttr); 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void SVGDocumentExtensions::removeAllElementReferencesForTarget(SVGElement* referencedElement) 360926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 361926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(referencedElement); 362926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator it = m_elementDependencies.find(referencedElement); 363926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (it == m_elementDependencies.end()) 364926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(it->key == referencedElement); 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 367926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_elementDependencies.remove(it); 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(SVG_FONTS) 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::registerSVGFontFaceElement(SVGFontFaceElement* element) 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_svgFontFaceElements.add(element); 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::unregisterSVGFontFaceElement(SVGFontFaceElement* element) 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_svgFontFaceElements.contains(element)); 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_svgFontFaceElements.remove(element); 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 384