15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef SVGUseElement_h
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define SVGUseElement_h
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/SVGNames.h"
25e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/DocumentResource.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGAnimatedBoolean.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGAnimatedLength.h"
28591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/svg/SVGGraphicsElement.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGURIReference.h"
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
333c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochclass DocumentResource;
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochclass SVGUseElement FINAL : public SVGGraphicsElement,
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                            public SVGURIReference,
373c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch                            public DocumentResourceClient {
387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    DEFINE_WRAPPERTYPEINFO();
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
40d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    static PassRefPtrWillBeRawPtr<SVGUseElement> create(Document&);
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~SVGUseElement();
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void invalidateShadowTree();
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* rendererClipChild() const;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    SVGAnimatedLength* x() const { return m_x.get(); }
4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    SVGAnimatedLength* y() const { return m_y.get(); }
4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    SVGAnimatedLength* width() const { return m_width.get(); }
5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    SVGAnimatedLength* height() const { return m_height.get(); }
5109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void buildPendingResource() OVERRIDE;
5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
54323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
55323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
57d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    explicit SVGUseElement(Document&);
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool isStructurallyExternal() const OVERRIDE { return !hrefString().isNull() && isExternalURIReference(hrefString(), document()); }
6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void removedFrom(ContainerNode*) OVERRIDE;
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isSupportedAttribute(const QualifiedName&);
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void svgAttributeChanged(const QualifiedName&) OVERRIDE;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE;
6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void toClipPath(Path&) OVERRIDE;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearResourceReferences();
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void buildShadowAndInstanceTree(SVGElement* target);
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void scheduleShadowTreeRecreation();
7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool haveLoadedRequiredResources() OVERRIDE { return !isStructurallyExternal() || m_haveFiredLoadEvent; }
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool selfHasRelativeLengths() const OVERRIDE;
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Instance tree handling
805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool buildShadowTree(SVGElement* target, SVGElement* targetInstance, bool foundUse);
815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool hasCycleUseReferencing(SVGUseElement*, ContainerNode* targetInstance, SVGElement*& newTarget);
825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool expandUseElementsInShadowTree(SVGElement*);
835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void expandSymbolElementsInShadowTree(SVGElement*);
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void transferUseAttributesToReplacedElement(SVGElement* from, SVGElement* to) const;
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void invalidateDependentShadowTrees();
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
893c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    bool resourceIsStillLoading();
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* externalDocument() const;
915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool instanceTreeIsLoading(SVGElement*);
9209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void notifyFinished(Resource*) OVERRIDE;
9310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    TreeScope* referencedScope() const;
943c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    void setDocumentResource(ResourcePtr<DocumentResource>);
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual Timer<SVGElement>* svgLoadEventTimer() OVERRIDE { return &m_svgLoadEventTimer; }
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtr<SVGAnimatedLength> m_x;
995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtr<SVGAnimatedLength> m_y;
1005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtr<SVGAnimatedLength> m_width;
1015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtr<SVGAnimatedLength> m_height;
1025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_haveFiredLoadEvent;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_needsShadowTreeRecreation;
1055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<SVGElement> m_targetElementInstance;
1063c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    ResourcePtr<DocumentResource> m_resource;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Timer<SVGElement> m_svgLoadEventTimer;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} // namespace blink
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif // SVGUseElement_h
113