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