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