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) 255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/XLinkNames.h" 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 27e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/inspector/ConsoleMessage.h" 28323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "core/rendering/RenderView.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/SVGResourcesCache.h" 30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/svg/SVGElementRareData.h" 3107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "core/svg/SVGFontFaceElement.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGSVGElement.h" 33323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "core/svg/SVGViewSpec.h" 34323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "core/svg/SVGZoomAndPan.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/animation/SMILTimeContainer.h" 36bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "wtf/TemporaryChange.h" 37f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#include "wtf/text/AtomicString.h" 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGDocumentExtensions::SVGDocumentExtensions(Document* document) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_document(document) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_resourcesCache(adoptPtr(new SVGResourcesCache)) 44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT) 45bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) , m_inRelativeLengthSVGRootsInvalidation(false) 46bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#endif 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGDocumentExtensions::~SVGDocumentExtensions() 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::addTimeContainer(SVGSVGElement* element) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_timeContainers.add(element); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::removeTimeContainer(SVGSVGElement* element) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_timeContainers.remove(element); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::addResource(const AtomicString& id, RenderSVGResourceContainer* resource) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(resource); 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (id.isEmpty()) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Replaces resource if already present, to handle potential id changes 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_resources.set(id, resource); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::removeResource(const AtomicString& id) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 779bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (id.isEmpty()) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_resources.remove(id); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderSVGResourceContainer* SVGDocumentExtensions::resourceById(const AtomicString& id) const 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (id.isEmpty()) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_resources.get(id); 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 91d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void SVGDocumentExtensions::serviceOnAnimationFrame(Document& document, double monotonicAnimationStartTime) 92d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 93d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!document.svgExtensions()) 94d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 95d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) document.accessSVGExtensions().serviceAnimations(monotonicAnimationStartTime); 96d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 97d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 98d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void SVGDocumentExtensions::serviceAnimations(double monotonicAnimationStartTime) 99d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 100d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> > timeContainers; 101d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) timeContainers.appendRange(m_timeContainers.begin(), m_timeContainers.end()); 102d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> >::iterator end = timeContainers.end(); 103d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) for (WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> >::iterator itr = timeContainers.begin(); itr != end; ++itr) 104d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) (*itr)->timeContainer()->serviceAnimations(monotonicAnimationStartTime); 105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::startAnimations() 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Eventually every "Time Container" will need a way to latch on to some global timer 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // starting animations for a document will do this "latching" 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: We hold a ref pointers to prevent a shadow tree from getting removed out from underneath us. 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In the future we should refactor the use-element to avoid this. See https://webkit.org/b/53704 113d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> > timeContainers; 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) timeContainers.appendRange(m_timeContainers.begin(), m_timeContainers.end()); 115d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> >::iterator end = timeContainers.end(); 116d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) for (WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> >::iterator itr = timeContainers.begin(); itr != end; ++itr) { 117d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) SMILTimeContainer* timeContainer = (*itr)->timeContainer(); 118d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (!timeContainer->isStarted()) 119d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) timeContainer->begin(); 120d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::pauseAnimations() 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 125d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WillBeHeapHashSet<RawPtrWillBeMember<SVGSVGElement> >::iterator end = m_timeContainers.end(); 126d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) for (WillBeHeapHashSet<RawPtrWillBeMember<SVGSVGElement> >::iterator itr = m_timeContainers.begin(); itr != end; ++itr) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (*itr)->pauseAnimations(); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::dispatchSVGLoadEventToOutermostSVGElements() 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 132d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> > timeContainers; 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) timeContainers.appendRange(m_timeContainers.begin(), m_timeContainers.end()); 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 135d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> >::iterator end = timeContainers.end(); 136d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) for (WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> >::iterator it = timeContainers.begin(); it != end; ++it) { 137d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) SVGSVGElement* outerSVG = it->get(); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!outerSVG->isOutermostSVGSVGElement()) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 14009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 14109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // don't dispatch the load event document is not wellformed (for XML/standalone svg) 14209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (outerSVG->document().wellFormed() || !outerSVG->document().isSVGDocument()) 14309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) outerSVG->sendSVGLoadEventIfPossible(); 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void reportMessage(Document* document, MessageLevel level, const String& message) 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (document->frame()) 150e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) document->addConsoleMessage(ConsoleMessage::create(RenderingMessageSource, level, message)); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::reportWarning(const String& message) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) reportMessage(m_document, WarningMessageLevel, "Warning: " + message); 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::reportError(const String& message) 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) reportMessage(m_document, ErrorMessageLevel, "Error: " + message); 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void SVGDocumentExtensions::addPendingResource(const AtomicString& id, Element* element) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(element); 166f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) ASSERT(element->inDocument()); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (id.isEmpty()) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 171197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WillBeHeapHashMap<AtomicString, OwnPtrWillBeMember<SVGPendingElements> >::AddResult result = m_pendingResources.add(id, nullptr); 172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (result.isNewEntry) 173197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch result.storedValue->value = adoptPtrWillBeNoop(new SVGPendingElements); 17409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) result.storedValue->value->add(element); 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) element->setHasPendingResources(); 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SVGDocumentExtensions::hasPendingResource(const AtomicString& id) const 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (id.isEmpty()) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_pendingResources.contains(id); 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool SVGDocumentExtensions::isElementPendingResources(Element* element) const 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This algorithm takes time proportional to the number of pending resources and need not. 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If performance becomes an issue we can keep a counted set of elements and answer the question efficiently. 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(element); 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 194197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WillBeHeapHashMap<AtomicString, OwnPtrWillBeMember<SVGPendingElements> >::const_iterator end = m_pendingResources.end(); 195197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch for (WillBeHeapHashMap<AtomicString, OwnPtrWillBeMember<SVGPendingElements> >::const_iterator it = m_pendingResources.begin(); it != end; ++it) { 196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) SVGPendingElements* elements = it->value.get(); 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(elements); 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (elements->contains(element)) 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool SVGDocumentExtensions::isElementPendingResource(Element* element, const AtomicString& id) const 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(element); 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!hasPendingResource(id)) 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_pendingResources.get(id)->contains(element); 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void SVGDocumentExtensions::clearHasPendingResourcesIfPossible(Element* element) 216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!isElementPendingResources(element)) 218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) element->clearHasPendingResources(); 219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void SVGDocumentExtensions::removeElementFromPendingResources(Element* element) 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(element); 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Remove the element from pending resources. 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_pendingResources.isEmpty() && element->hasPendingResources()) { 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<AtomicString> toBeRemoved; 228197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WillBeHeapHashMap<AtomicString, OwnPtrWillBeMember<SVGPendingElements> >::iterator end = m_pendingResources.end(); 229197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch for (WillBeHeapHashMap<AtomicString, OwnPtrWillBeMember<SVGPendingElements> >::iterator it = m_pendingResources.begin(); it != end; ++it) { 230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) SVGPendingElements* elements = it->value.get(); 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(elements); 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!elements->isEmpty()); 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) elements->remove(element); 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (elements->isEmpty()) 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toBeRemoved.append(it->key); 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) clearHasPendingResourcesIfPossible(element); 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We use the removePendingResource function here because it deals with set lifetime correctly. 242197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Vector<AtomicString>::iterator itEnd = toBeRemoved.end(); 243197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch for (Vector<AtomicString>::iterator it = toBeRemoved.begin(); it != itEnd; ++it) 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) removePendingResource(*it); 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Remove the element from pending resources that were scheduled for removal. 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_pendingResourcesForRemoval.isEmpty()) { 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<AtomicString> toBeRemoved; 250197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WillBeHeapHashMap<AtomicString, OwnPtrWillBeMember<SVGPendingElements> >::iterator end = m_pendingResourcesForRemoval.end(); 251197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch for (WillBeHeapHashMap<AtomicString, OwnPtrWillBeMember<SVGPendingElements> >::iterator it = m_pendingResourcesForRemoval.begin(); it != end; ++it) { 252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) SVGPendingElements* elements = it->value.get(); 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(elements); 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!elements->isEmpty()); 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) elements->remove(element); 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (elements->isEmpty()) 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toBeRemoved.append(it->key); 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We use the removePendingResourceForRemoval function here because it deals with set lifetime correctly. 262197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Vector<AtomicString>::iterator itEnd = toBeRemoved.end(); 263197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch for (Vector<AtomicString>::iterator it = toBeRemoved.begin(); it != itEnd; ++it) 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) removePendingResourceForRemoval(*it); 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 268197021e6b966cfb06891637935ef33fff06433d1Ben MurdochPassOwnPtrWillBeRawPtr<SVGDocumentExtensions::SVGPendingElements> SVGDocumentExtensions::removePendingResource(const AtomicString& id) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_pendingResources.contains(id)); 271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_pendingResources.take(id); 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 274197021e6b966cfb06891637935ef33fff06433d1Ben MurdochPassOwnPtrWillBeRawPtr<SVGDocumentExtensions::SVGPendingElements> SVGDocumentExtensions::removePendingResourceForRemoval(const AtomicString& id) 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_pendingResourcesForRemoval.contains(id)); 277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_pendingResourcesForRemoval.take(id); 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::markPendingResourcesForRemoval(const AtomicString& id) 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (id.isEmpty()) 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_pendingResourcesForRemoval.contains(id)); 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 287197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch OwnPtrWillBeMember<SVGPendingElements> existing = m_pendingResources.take(id); 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (existing && !existing->isEmpty()) 289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_pendingResourcesForRemoval.add(id, existing.release()); 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Element* SVGDocumentExtensions::removeElementFromPendingResourcesForRemoval(const AtomicString& id) 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (id.isEmpty()) 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGPendingElements* resourceSet = m_pendingResourcesForRemoval.get(id); 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!resourceSet || resourceSet->isEmpty()) 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGPendingElements::iterator firstElement = resourceSet->begin(); 302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Element* element = *firstElement; 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) resourceSet->remove(firstElement); 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (resourceSet->isEmpty()) 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) removePendingResourceForRemoval(id); 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return element; 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 312bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void SVGDocumentExtensions::addSVGRootWithRelativeLengthDescendents(SVGSVGElement* svgRoot) 313bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 314bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) ASSERT(!m_inRelativeLengthSVGRootsInvalidation); 315bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) m_relativeLengthSVGRoots.add(svgRoot); 316bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 317bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 318bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void SVGDocumentExtensions::removeSVGRootWithRelativeLengthDescendents(SVGSVGElement* svgRoot) 319bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 320bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) ASSERT(!m_inRelativeLengthSVGRootsInvalidation); 321bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) m_relativeLengthSVGRoots.remove(svgRoot); 322bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 323bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 324bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)bool SVGDocumentExtensions::isSVGRootWithRelativeLengthDescendents(SVGSVGElement* svgRoot) const 325bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 326bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return m_relativeLengthSVGRoots.contains(svgRoot); 327bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 328bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 329bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void SVGDocumentExtensions::invalidateSVGRootsWithRelativeLengthDescendents(SubtreeLayoutScope* scope) 330bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 331bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) ASSERT(!m_inRelativeLengthSVGRootsInvalidation); 332197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT) 333bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) TemporaryChange<bool> inRelativeLengthSVGRootsChange(m_inRelativeLengthSVGRootsInvalidation, true); 334bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#endif 335bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 3365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) WillBeHeapHashSet<RawPtrWillBeMember<SVGSVGElement> >::iterator end = m_relativeLengthSVGRoots.end(); 3375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) for (WillBeHeapHashSet<RawPtrWillBeMember<SVGSVGElement> >::iterator it = m_relativeLengthSVGRoots.begin(); it != end; ++it) 338bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) (*it)->invalidateRelativeLengthClients(scope); 339bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 340bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(SVG_FONTS) 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::registerSVGFontFaceElement(SVGFontFaceElement* element) 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_svgFontFaceElements.add(element); 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGDocumentExtensions::unregisterSVGFontFaceElement(SVGFontFaceElement* element) 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_svgFontFaceElements.contains(element)); 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_svgFontFaceElements.remove(element); 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 35207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 353d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void SVGDocumentExtensions::registerPendingSVGFontFaceElementsForRemoval(PassRefPtrWillBeRawPtr<SVGFontFaceElement> font) 35407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{ 35507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch m_pendingSVGFontFaceElementsForRemoval.add(font); 35607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 35707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 35807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid SVGDocumentExtensions::removePendingSVGFontFaceElementsForRemoval() 35907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{ 36007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch m_pendingSVGFontFaceElementsForRemoval.clear(); 36107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 36207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 365323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)bool SVGDocumentExtensions::zoomAndPanEnabled() const 366323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 367323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (SVGSVGElement* svg = rootElement(*m_document)) { 368323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (svg->useCurrentView()) { 369323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (svg->currentView()) 370323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return svg->currentView()->zoomAndPan() == SVGZoomAndPanMagnify; 371323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } else { 372323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return svg->zoomAndPan() == SVGZoomAndPanMagnify; 373323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 374323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 375323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 376323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return false; 377323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 378323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 379323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void SVGDocumentExtensions::startPan(const FloatPoint& start) 380323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 381323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (SVGSVGElement* svg = rootElement(*m_document)) 382323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_translate = FloatPoint(start.x() - svg->currentTranslate().x(), start.y() - svg->currentTranslate().y()); 383323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 384323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 385323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void SVGDocumentExtensions::updatePan(const FloatPoint& pos) const 386323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 387323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (SVGSVGElement* svg = rootElement(*m_document)) 388323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) svg->setCurrentTranslate(FloatPoint(pos.x() - m_translate.x(), pos.y() - m_translate.y())); 389323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 390323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 391323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)SVGSVGElement* SVGDocumentExtensions::rootElement(const Document& document) 392323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 393323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) Element* elem = document.documentElement(); 394323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return isSVGSVGElement(elem) ? toSVGSVGElement(elem) : 0; 395323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 396323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 397323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)SVGSVGElement* SVGDocumentExtensions::rootElement() const 398323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 399323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ASSERT(m_document); 400323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return rootElement(*m_document); 401323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 402323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 403d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void SVGDocumentExtensions::trace(Visitor* visitor) 404d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 405197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(OILPAN) 4065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) visitor->trace(m_document); 407d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) visitor->trace(m_timeContainers); 4085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#if ENABLE(SVG_FONTS) 409d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) visitor->trace(m_svgFontFaceElements); 410d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) visitor->trace(m_pendingSVGFontFaceElementsForRemoval); 4115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#endif 4125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) visitor->trace(m_relativeLengthSVGRoots); 413197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch visitor->trace(m_pendingResources); 414197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch visitor->trace(m_pendingResourcesForRemoval); 415197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif 416d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 417d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 419