18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
3dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Rob Buis <buis@kde.org>
4dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2007 Apple Inc. All rights reserved.
5dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
6dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is free software; you can redistribute it and/or
7dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * modify it under the terms of the GNU Library General Public
8dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * License as published by the Free Software Foundation; either
9dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * version 2 of the License, or (at your option) any later version.
10dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
11dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is distributed in the hope that it will be useful,
12dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of
13dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Library General Public License for more details.
15dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
16dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * You should have received a copy of the GNU Library General Public License
17dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * along with this library; see the file COPYING.LIB.  If not, write to
18dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Boston, MA 02110-1301, USA.
20dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch */
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGSVGElement.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#include "AffineTransform.h"
28e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "Attribute.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSHelper.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSPropertyNames.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventListener.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventNames.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatConversion.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatRect.h"
365af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "FrameView.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
38967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "RenderSVGResource.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderSVGRoot.h"
405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "RenderSVGViewportContainer.h"
415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SMILTimeContainer.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGAngle.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGNames.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGPreserveAspectRatio.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGTransform.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGTransformList.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGViewElement.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGViewSpec.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGZoomEvent.h"
505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "ScriptEventListener.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectionController.h"
52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/StdLibExtras.h>
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch// Animated property definitions
57f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochDEFINE_ANIMATED_LENGTH(SVGSVGElement, SVGNames::xAttr, X, x)
58f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochDEFINE_ANIMATED_LENGTH(SVGSVGElement, SVGNames::yAttr, Y, y)
59f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochDEFINE_ANIMATED_LENGTH(SVGSVGElement, SVGNames::widthAttr, Width, width)
60f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochDEFINE_ANIMATED_LENGTH(SVGSVGElement, SVGNames::heightAttr, Height, height)
61f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochDEFINE_ANIMATED_BOOLEAN(SVGSVGElement, SVGNames::externalResourcesRequiredAttr, ExternalResourcesRequired, externalResourcesRequired)
62f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochDEFINE_ANIMATED_PRESERVEASPECTRATIO(SVGSVGElement, SVGNames::preserveAspectRatioAttr, PreserveAspectRatio, preserveAspectRatio)
63f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochDEFINE_ANIMATED_RECT(SVGSVGElement, SVGNames::viewBoxAttr, ViewBox, viewBox)
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochinline SVGSVGElement::SVGSVGElement(const QualifiedName& tagName, Document* doc)
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : SVGStyledLocatableElement(tagName, doc)
67d0825bca7fe65beaee391d30da42e937db621564Steve Block    , m_x(LengthModeWidth)
68d0825bca7fe65beaee391d30da42e937db621564Steve Block    , m_y(LengthModeHeight)
69d0825bca7fe65beaee391d30da42e937db621564Steve Block    , m_width(LengthModeWidth, "100%")
70d0825bca7fe65beaee391d30da42e937db621564Steve Block    , m_height(LengthModeHeight, "100%")
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_useCurrentView(false)
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_timeContainer(SMILTimeContainer::create(this))
73d0825bca7fe65beaee391d30da42e937db621564Steve Block    , m_scale(1)
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_viewSpec(0)
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_containerSize(300, 150)
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_hasSetContainerSize(false)
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    doc->registerForDocumentActivationCallbacks(this);
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassRefPtr<SVGSVGElement> SVGSVGElement::create(const QualifiedName& tagName, Document* document)
825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return adoptRef(new SVGSVGElement(tagName, document));
845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGSVGElement::~SVGSVGElement()
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->unregisterForDocumentActivationCallbacks(this);
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // There are cases where removedFromDocument() is not called.
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // see ContainerNode::removeAllChildren, called by its destructor.
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->accessSVGExtensions()->removeTimeContainer(this);
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid SVGSVGElement::willMoveToNewOwnerDocument()
956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    document()->unregisterForDocumentActivationCallbacks(this);
976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    SVGStyledLocatableElement::willMoveToNewOwnerDocument();
986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
1006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid SVGSVGElement::didMoveToNewOwnerDocument()
1016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
1026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    document()->registerForDocumentActivationCallbacks(this);
1036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    SVGStyledLocatableElement::didMoveToNewOwnerDocument();
1046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
1056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst AtomicString& SVGSVGElement::contentScriptType() const
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(const AtomicString, defaultValue, ("text/ecmascript"));
109f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    const AtomicString& n = getAttribute(SVGNames::contentScriptTypeAttr);
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return n.isNull() ? defaultValue : n;
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::setContentScriptType(const AtomicString& type)
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setAttribute(SVGNames::contentScriptTypeAttr, type);
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst AtomicString& SVGSVGElement::contentStyleType() const
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(const AtomicString, defaultValue, ("text/css"));
121f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    const AtomicString& n = getAttribute(SVGNames::contentStyleTypeAttr);
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return n.isNull() ? defaultValue : n;
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::setContentStyleType(const AtomicString& type)
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setAttribute(SVGNames::contentStyleTypeAttr, type);
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFloatRect SVGSVGElement::viewport() const
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    FloatRect viewRectangle;
13381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!isOutermostSVG())
13481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        viewRectangle.setLocation(FloatPoint(x().value(this), y().value(this)));
13581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
13681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    viewRectangle.setSize(FloatSize(width().value(this), height().value(this)));
13781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return viewBoxToViewTransform(viewRectangle.width(), viewRectangle.height()).mapRect(viewRectangle);
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint SVGSVGElement::relativeWidthValue() const
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SVGLength w = width();
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (w.unitType() != LengthTypePercentage)
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<int>(w.valueAsPercentage() * m_containerSize.width());
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint SVGSVGElement::relativeHeightValue() const
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SVGLength h = height();
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (h.unitType() != LengthTypePercentage)
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<int>(h.valueAsPercentage() * m_containerSize.height());
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat SVGSVGElement::pixelUnitToMillimeterX() const
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // 2.54 / cssPixelsPerInch gives CM.
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return (2.54f / cssPixelsPerInch) * 10.0f;
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat SVGSVGElement::pixelUnitToMillimeterY() const
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // 2.54 / cssPixelsPerInch gives CM.
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return (2.54f / cssPixelsPerInch) * 10.0f;
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat SVGSVGElement::screenPixelToMillimeterX() const
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pixelUnitToMillimeterX();
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat SVGSVGElement::screenPixelToMillimeterY() const
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pixelUnitToMillimeterY();
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SVGSVGElement::useCurrentView() const
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_useCurrentView;
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::setUseCurrentView(bool currentView)
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_useCurrentView = currentView;
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGViewSpec* SVGSVGElement::currentView() const
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_viewSpec)
193e14391e94c850b8bd03680c23b38978db68687a8John Reck        m_viewSpec = adoptPtr(new SVGViewSpec(const_cast<SVGSVGElement*>(this)));
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_viewSpec.get();
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat SVGSVGElement::currentScale() const
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
199692e5dbf12901edacf14812a6fae25462920af42Steve Block    // Only the page zoom factor is relevant for SVG
20068513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (Frame* frame = document()->frame())
20168513a70bcd92384395513322f1b801e7bf9c729Steve Block        return frame->pageZoomFactor();
202d0825bca7fe65beaee391d30da42e937db621564Steve Block    return m_scale;
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::setCurrentScale(float scale)
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20768513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (Frame* frame = document()->frame()) {
208692e5dbf12901edacf14812a6fae25462920af42Steve Block        // Calling setCurrentScale() on the outermost <svg> element in a standalone SVG document
209692e5dbf12901edacf14812a6fae25462920af42Steve Block        // is allowed to change the page zoom factor, influencing the document size, scrollbars etc.
210692e5dbf12901edacf14812a6fae25462920af42Steve Block        if (parentNode() == document())
21168513a70bcd92384395513322f1b801e7bf9c729Steve Block            frame->setPageZoomFactor(scale);
212d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
213d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
214d0825bca7fe65beaee391d30da42e937db621564Steve Block
215d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_scale = scale;
216967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (RenderObject* object = renderer())
217967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        RenderSVGResource::markForLayoutAndParentResourceInvalidation(object);
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid SVGSVGElement::setCurrentTranslate(const FloatPoint& translation)
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    m_translation = translation;
22328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    updateCurrentTranslate();
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid SVGSVGElement::updateCurrentTranslate()
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
228e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (RenderObject* object = renderer())
229e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        object->setNeedsLayout(true);
230e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parentNode() == document() && document()->renderer())
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        document()->renderer()->repaint();
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
235e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid SVGSVGElement::parseMappedAttribute(Attribute* attr)
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!nearestViewportElement()) {
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool setListener = true;
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Only handle events if we're the outermost <svg> element
241f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (attr->name() == HTMLNames::onunloadAttr)
2425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            document()->setWindowAttributeEventListener(eventNames().unloadEvent, createAttributeEventListener(document()->frame(), attr));
243f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        else if (attr->name() == HTMLNames::onresizeAttr)
2445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            document()->setWindowAttributeEventListener(eventNames().resizeEvent, createAttributeEventListener(document()->frame(), attr));
245f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        else if (attr->name() == HTMLNames::onscrollAttr)
2465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            document()->setWindowAttributeEventListener(eventNames().scrollEvent, createAttributeEventListener(document()->frame(), attr));
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (attr->name() == SVGNames::onzoomAttr)
2485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            document()->setWindowAttributeEventListener(eventNames().zoomEvent, createAttributeEventListener(document()->frame(), attr));
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            setListener = false;
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (setListener)
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
256f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (attr->name() == HTMLNames::onabortAttr)
2575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        document()->setWindowAttributeEventListener(eventNames().abortEvent, createAttributeEventListener(document()->frame(), attr));
258f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    else if (attr->name() == HTMLNames::onerrorAttr)
2595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        document()->setWindowAttributeEventListener(eventNames().errorEvent, createAttributeEventListener(document()->frame(), attr));
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attr->name() == SVGNames::xAttr)
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setXBaseValue(SVGLength(LengthModeWidth, attr->value()));
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attr->name() == SVGNames::yAttr)
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setYBaseValue(SVGLength(LengthModeHeight, attr->value()));
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attr->name() == SVGNames::widthAttr) {
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setWidthBaseValue(SVGLength(LengthModeWidth, attr->value()));
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addCSSProperty(attr, CSSPropertyWidth, attr->value());
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (widthBaseValue().value(this) < 0.0)
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            document()->accessSVGExtensions()->reportError("A negative value for svg attribute <width> is not allowed");
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (attr->name() == SVGNames::heightAttr) {
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setHeightBaseValue(SVGLength(LengthModeHeight, attr->value()));
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addCSSProperty(attr, CSSPropertyHeight, attr->value());
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (heightBaseValue().value(this) < 0.0)
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            document()->accessSVGExtensions()->reportError("A negative value for svg attribute <height> is not allowed");
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (SVGTests::parseMappedAttribute(attr))
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (SVGLangSpace::parseMappedAttribute(attr))
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (SVGExternalResourcesRequired::parseMappedAttribute(attr))
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
281cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (SVGFitToViewBox::parseMappedAttribute(document(), attr))
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (SVGZoomAndPan::parseMappedAttribute(attr))
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SVGStyledLocatableElement::parseMappedAttribute(attr);
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// This hack will not handle the case where we're setting a width/height
2915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// on a root <svg> via svg.width.baseValue = when it has none.
2925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic void updateCSSForAttribute(SVGSVGElement* element, const QualifiedName& attrName, CSSPropertyID property, const SVGLength& value)
2935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
2945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    Attribute* attribute = element->attributes(false)->getAttributeItem(attrName);
2955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!attribute || !attribute->isMappedAttribute())
2965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return;
297e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    element->addCSSProperty(attribute, property, value.valueAsString());
2985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
2995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::svgAttributeChanged(const QualifiedName& attrName)
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SVGStyledElement::svgAttributeChanged(attrName);
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // FIXME: Ugly, ugly hack to around that parseMappedAttribute is not called
3055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // when svg.width.baseValue = 100 is evaluated.
306bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // Thus the CSS length value for width is not updated, and width() computeLogicalWidth()
3075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // calculations on RenderSVGRoot will be wrong.
3085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // https://bugs.webkit.org/show_bug.cgi?id=25387
309ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    bool updateRelativeLengths = false;
310ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (attrName == SVGNames::widthAttr) {
3115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        updateCSSForAttribute(this, attrName, CSSPropertyWidth, widthBaseValue());
312ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        updateRelativeLengths = true;
313ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    } else if (attrName == SVGNames::heightAttr) {
3145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        updateCSSForAttribute(this, attrName, CSSPropertyHeight, heightBaseValue());
315ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        updateRelativeLengths = true;
316ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
317ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
318ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (updateRelativeLengths
319ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        || attrName == SVGNames::xAttr
320ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        || attrName == SVGNames::yAttr
321ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        || SVGFitToViewBox::isKnownAttribute(attrName)) {
322ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        updateRelativeLengths = true;
323ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        updateRelativeLengthsInformation();
324ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
3255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (SVGTests::handleAttributeChange(this, attrName))
3276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
3286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!renderer())
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
332ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (updateRelativeLengths
333ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        || SVGLangSpace::isKnownAttribute(attrName)
334ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        || SVGExternalResourcesRequired::isKnownAttribute(attrName)
335ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        || SVGZoomAndPan::isKnownAttribute(attrName)
336ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        || SVGStyledLocatableElement::isKnownAttribute(attrName))
337967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer());
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
340d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid SVGSVGElement::synchronizeProperty(const QualifiedName& attrName)
341d0825bca7fe65beaee391d30da42e937db621564Steve Block{
342d0825bca7fe65beaee391d30da42e937db621564Steve Block    SVGStyledElement::synchronizeProperty(attrName);
343d0825bca7fe65beaee391d30da42e937db621564Steve Block
344d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (attrName == anyQName()) {
345d0825bca7fe65beaee391d30da42e937db621564Steve Block        synchronizeX();
346d0825bca7fe65beaee391d30da42e937db621564Steve Block        synchronizeY();
347d0825bca7fe65beaee391d30da42e937db621564Steve Block        synchronizeWidth();
348d0825bca7fe65beaee391d30da42e937db621564Steve Block        synchronizeHeight();
349d0825bca7fe65beaee391d30da42e937db621564Steve Block        synchronizeExternalResourcesRequired();
350d0825bca7fe65beaee391d30da42e937db621564Steve Block        synchronizeViewBox();
351d0825bca7fe65beaee391d30da42e937db621564Steve Block        synchronizePreserveAspectRatio();
3524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        SVGTests::synchronizeProperties(this, attrName);
353d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
354d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
355d0825bca7fe65beaee391d30da42e937db621564Steve Block
356d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (attrName == SVGNames::xAttr)
357d0825bca7fe65beaee391d30da42e937db621564Steve Block        synchronizeX();
358d0825bca7fe65beaee391d30da42e937db621564Steve Block    else if (attrName == SVGNames::yAttr)
359d0825bca7fe65beaee391d30da42e937db621564Steve Block        synchronizeY();
360d0825bca7fe65beaee391d30da42e937db621564Steve Block    else if (attrName == SVGNames::widthAttr)
361d0825bca7fe65beaee391d30da42e937db621564Steve Block        synchronizeWidth();
362d0825bca7fe65beaee391d30da42e937db621564Steve Block    else if (attrName == SVGNames::heightAttr)
363d0825bca7fe65beaee391d30da42e937db621564Steve Block        synchronizeHeight();
364d0825bca7fe65beaee391d30da42e937db621564Steve Block    else if (SVGExternalResourcesRequired::isKnownAttribute(attrName))
365d0825bca7fe65beaee391d30da42e937db621564Steve Block        synchronizeExternalResourcesRequired();
3664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    else if (attrName == SVGNames::viewBoxAttr)
367d0825bca7fe65beaee391d30da42e937db621564Steve Block        synchronizeViewBox();
3684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    else if (attrName == SVGNames::preserveAspectRatioAttr)
369d0825bca7fe65beaee391d30da42e937db621564Steve Block        synchronizePreserveAspectRatio();
3704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    else if (SVGTests::isKnownAttribute(attrName))
3714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        SVGTests::synchronizeProperties(this, attrName);
372d0825bca7fe65beaee391d30da42e937db621564Steve Block}
373d0825bca7fe65beaee391d30da42e937db621564Steve Block
3742fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockAttributeToPropertyTypeMap& SVGSVGElement::attributeToPropertyTypeMap()
3752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AttributeToPropertyTypeMap, s_attributeToPropertyTypeMap, ());
3772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return s_attributeToPropertyTypeMap;
3782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3802fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid SVGSVGElement::fillAttributeToPropertyTypeMap()
3812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    AttributeToPropertyTypeMap& attributeToPropertyTypeMap = this->attributeToPropertyTypeMap();
3832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    attributeToPropertyTypeMap.set(SVGNames::xAttr, AnimatedLength);
3842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    attributeToPropertyTypeMap.set(SVGNames::yAttr, AnimatedLength);
3852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    attributeToPropertyTypeMap.set(SVGNames::widthAttr, AnimatedLength);
3862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    attributeToPropertyTypeMap.set(SVGNames::heightAttr, AnimatedLength);
3872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    attributeToPropertyTypeMap.set(SVGNames::viewBoxAttr, AnimatedRect);
3882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    attributeToPropertyTypeMap.set(SVGNames::preserveAspectRatioAttr, AnimatedPreserveAspectRatio);
3892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
391231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockunsigned SVGSVGElement::suspendRedraw(unsigned /* maxWaitMilliseconds */)
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Implement me (see bug 11275)
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
397231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid SVGSVGElement::unsuspendRedraw(unsigned /* suspendHandleId */)
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Implement me (see bug 11275)
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::unsuspendRedrawAll()
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Implement me (see bug 11275)
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::forceRedraw()
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Implement me (see bug 11275)
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
412635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNodeList* SVGSVGElement::getIntersectionList(const FloatRect&, SVGElement*)
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Implement me (see bug 11274)
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
418635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNodeList* SVGSVGElement::getEnclosureList(const FloatRect&, SVGElement*)
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Implement me (see bug 11274)
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
424635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool SVGSVGElement::checkIntersection(SVGElement*, const FloatRect& rect)
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // TODO : take into account pointer-events?
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Why is element ignored??
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Implement me (see bug 11274)
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return rect.intersects(getBBox());
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
432635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool SVGSVGElement::checkEnclosure(SVGElement*, const FloatRect& rect)
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // TODO : take into account pointer-events?
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Why is element ignored??
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Implement me (see bug 11274)
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return rect.contains(getBBox());
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::deselectAll()
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
442dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (Frame* frame = document()->frame())
443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        frame->selection()->clear();
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat SVGSVGElement::createSVGNumber()
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0.0f;
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGLength SVGSVGElement::createSVGLength()
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return SVGLength();
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
456d0825bca7fe65beaee391d30da42e937db621564Steve BlockSVGAngle SVGSVGElement::createSVGAngle()
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
458d0825bca7fe65beaee391d30da42e937db621564Steve Block    return SVGAngle();
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFloatPoint SVGSVGElement::createSVGPoint()
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return FloatPoint();
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerSVGMatrix SVGSVGElement::createSVGMatrix()
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return SVGMatrix();
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFloatRect SVGSVGElement::createSVGRect()
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return FloatRect();
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGTransform SVGSVGElement::createSVGTransform()
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
478ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return SVGTransform(SVGTransform::SVG_TRANSFORM_MATRIX);
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerSVGTransform SVGSVGElement::createSVGTransformFromMatrix(const SVGMatrix& matrix)
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return SVGTransform(static_cast<const AffineTransform&>(matrix));
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
486dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockAffineTransform SVGSVGElement::localCoordinateSpaceTransform(SVGLocatable::CTMScope mode) const
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
488dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    AffineTransform viewBoxTransform;
489dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (attributes()->getAttributeItem(SVGNames::viewBoxAttr))
490dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        viewBoxTransform = viewBoxToViewTransform(width().value(this), height().value(this));
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
492dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    AffineTransform transform;
493dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!isOutermostSVG())
494dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        transform.translate(x().value(this), y().value(this));
495dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else if (mode == SVGLocatable::ScreenScope) {
496dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (RenderObject* renderer = this->renderer()) {
497dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Translate in our CSS parent coordinate space
498635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // FIXME: This doesn't work correctly with CSS transforms.
499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            FloatPoint location = renderer->localToAbsolute(FloatPoint(), false, true);
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
501dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Be careful here! localToAbsolute() includes the x/y offset coming from the viewBoxToViewTransform(), because
502dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // RenderSVGRoot::localToBorderBoxTransform() (called through mapLocalToContainer(), called from localToAbsolute())
503dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // also takes the viewBoxToViewTransform() into account, so we have to subtract it here (original cause of bug #27183)
504dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            transform.translate(location.x() - viewBoxTransform.e(), location.y() - viewBoxTransform.f());
5055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
5065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            // Respect scroll offset.
5075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            if (FrameView* view = document()->view()) {
5085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                IntSize scrollOffset = view->scrollOffset();
5095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                transform.translate(-scrollOffset.width(), -scrollOffset.height());
5105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
511dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
514ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return transform.multiply(viewBoxTransform);
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* SVGSVGElement::createRenderer(RenderArena* arena, RenderStyle*)
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isOutermostSVG())
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return new (arena) RenderSVGRoot(this);
521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return new (arena) RenderSVGViewportContainer(this);
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::insertedIntoDocument()
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->accessSVGExtensions()->addTimeContainer(this);
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SVGStyledLocatableElement::insertedIntoDocument();
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::removedFromDocument()
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->accessSVGExtensions()->removeTimeContainer(this);
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SVGStyledLocatableElement::removedFromDocument();
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::pauseAnimations()
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_timeContainer->isPaused())
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_timeContainer->pause();
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::unpauseAnimations()
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_timeContainer->isPaused())
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_timeContainer->resume();
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SVGSVGElement::animationsPaused() const
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_timeContainer->isPaused();
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat SVGSVGElement::getCurrentTime() const
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return narrowPrecisionToFloat(m_timeContainer->elapsed().value());
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::setCurrentTime(float /* seconds */)
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Implement me, bug 12073
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
564ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool SVGSVGElement::selfHasRelativeLengths() const
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
566ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return x().isRelative()
567ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        || y().isRelative()
568ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        || width().isRelative()
569ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        || height().isRelative()
570ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        || hasAttribute(SVGNames::viewBoxAttr);
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SVGSVGElement::isOutermostSVG() const
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // Element may not be in the document, pretend we're outermost for viewport(), getCTM(), etc.
5765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!parentNode())
5775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return true;
5785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
579ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#if ENABLE(SVG_FOREIGN_OBJECT)
58006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // We act like an outermost SVG element, if we're a direct child of a <foreignObject> element.
58106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (parentNode()->hasTagName(SVGNames::foreignObjectTag))
58206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return true;
583ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif
58406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This is true whenever this is the outermost SVG, even if there are HTML elements outside it
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !parentNode()->isSVGElement();
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5898a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockAffineTransform SVGSVGElement::viewBoxToViewTransform(float viewWidth, float viewHeight) const
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FloatRect viewBoxRect;
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (useCurrentView()) {
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (currentView()) // what if we should use it but it is not set?
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            viewBoxRect = currentView()->viewBox();
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        viewBoxRect = viewBox();
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    AffineTransform ctm = SVGFitToViewBox::viewBoxToViewTransform(viewBoxRect, preserveAspectRatio(), viewWidth, viewHeight);
599ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
6006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (useCurrentView() && currentView()) {
6016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        AffineTransform transform;
602ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (currentView()->transform().concatenate(transform))
603ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            ctm *= transform;
6046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ctm;
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::inheritViewAttributes(SVGViewElement* viewElement)
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setUseCurrentView(true);
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (viewElement->hasAttribute(SVGNames::viewBoxAttr))
613e14391e94c850b8bd03680c23b38978db68687a8John Reck        currentView()->setViewBoxBaseValue(viewElement->viewBox());
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
615e14391e94c850b8bd03680c23b38978db68687a8John Reck        currentView()->setViewBoxBaseValue(viewBox());
616d0825bca7fe65beaee391d30da42e937db621564Steve Block
617d0825bca7fe65beaee391d30da42e937db621564Steve Block    SVGPreserveAspectRatio aspectRatio;
618d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (viewElement->hasAttribute(SVGNames::preserveAspectRatioAttr))
619d0825bca7fe65beaee391d30da42e937db621564Steve Block        aspectRatio = viewElement->preserveAspectRatioBaseValue();
620d0825bca7fe65beaee391d30da42e937db621564Steve Block    else
621d0825bca7fe65beaee391d30da42e937db621564Steve Block        aspectRatio = preserveAspectRatioBaseValue();
622d0825bca7fe65beaee391d30da42e937db621564Steve Block    currentView()->setPreserveAspectRatioBaseValue(aspectRatio);
623d0825bca7fe65beaee391d30da42e937db621564Steve Block
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (viewElement->hasAttribute(SVGNames::zoomAndPanAttr))
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        currentView()->setZoomAndPan(viewElement->zoomAndPan());
626967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
627967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (RenderObject* object = renderer())
628967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        RenderSVGResource::markForLayoutAndParentResourceInvalidation(object);
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::documentWillBecomeInactive()
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    pauseAnimations();
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGSVGElement::documentDidBecomeActive()
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unpauseAnimations();
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
641e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke// getElementById on SVGSVGElement is restricted to only the child subtree defined by the <svg> element.
642e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke// See http://www.w3.org/TR/SVG11/struct.html#InterfaceSVGSVGElement
643e458d70a0d18538346f41b503114c9ebe6b2ce12Leon ClarkeElement* SVGSVGElement::getElementById(const AtomicString& id) const
644e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
645e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    Element* element = document()->getElementById(id);
646e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (element && element->isDescendantOf(this))
647e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return element;
648e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
649e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    // Fall back to traversing our subtree. Duplicate ids are allowed, the first found will
650e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    // be returned.
651e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    for (Node* node = traverseNextNode(this); node; node = node->traverseNextNode(this)) {
652e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (!node->isElementNode())
653e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            continue;
654e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
655e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        Element* element = static_cast<Element*>(node);
656e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (element->hasID() && element->getIdAttribute() == id)
657e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            return element;
658e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    }
659e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    return 0;
660e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
661e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(SVG)
665