15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008 Rob Buis <buis@kde.org> 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGTextContentElement.h" 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "bindings/v8/ExceptionMessages.h" 25df95704c49daea886ddad70775bda23618d6274dBen Murdoch#include "bindings/v8/ExceptionState.h" 26df95704c49daea886ddad70775bda23618d6274dBen Murdoch#include "bindings/v8/ExceptionStatePlaceholder.h" 275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSPropertyNames.h" 285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSValueKeywords.h" 295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/SVGNames.h" 305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/XMLNames.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FrameSelection.h" 32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderObject.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/RenderSVGResource.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/SVGTextQuery.h" 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 3802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)template<> const SVGEnumerationStringEntries& getStaticStringEntries<SVGLengthAdjustType>() 40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) DEFINE_STATIC_LOCAL(SVGEnumerationStringEntries, entries, ()); 42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (entries.isEmpty()) { 43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) entries.append(std::make_pair(SVGLengthAdjustSpacing, "spacing")); 44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) entries.append(std::make_pair(SVGLengthAdjustSpacingAndGlyphs, "spacingAndGlyphs")); 45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return entries; 47d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// SVGTextContentElement's 'textLength' attribute needs special handling. 5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// It should return getComputedTextLength() when textLength is not specified manually. 5109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class SVGAnimatedTextLength FINAL : public SVGAnimatedLength { 5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)public: 5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) static PassRefPtr<SVGAnimatedTextLength> create(SVGTextContentElement* contextElement) 5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return adoptRef(new SVGAnimatedTextLength(contextElement)); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual SVGLengthTearOff* baseVal() OVERRIDE 5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) SVGTextContentElement* textContentElement = toSVGTextContentElement(contextElement()); 6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!textContentElement->textLengthIsSpecifiedByUser()) 6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) baseValue()->newValueSpecifiedUnits(LengthTypeNumber, textContentElement->getComputedTextLength()); 6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 6409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return SVGAnimatedLength::baseVal(); 6509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)private: 6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) SVGAnimatedTextLength(SVGTextContentElement* contextElement) 6907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch : SVGAnimatedLength(contextElement, SVGNames::textLengthAttr, SVGLength::create(LengthModeOther), ForbidNegativeLengths) 7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}; 7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)SVGTextContentElement::SVGTextContentElement(const QualifiedName& tagName, Document& document) 76591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch : SVGGraphicsElement(tagName, document) 7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_textLength(SVGAnimatedTextLength::create(this)) 7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_textLengthIsSpecifiedByUser(false) 79d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_lengthAdjust(SVGAnimatedEnumeration<SVGLengthAdjustType>::create(this, SVGNames::lengthAdjustAttr, SVGLengthAdjustSpacing)) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) addToPropertyMap(m_textLength); 82d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) addToPropertyMap(m_lengthAdjust); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned SVGTextContentElement::getNumberOfChars() 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 878abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateLayoutIgnorePendingStylesheets(); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGTextQuery(renderer()).numberOfCharacters(); 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float SVGTextContentElement::getComputedTextLength() 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateLayoutIgnorePendingStylesheets(); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGTextQuery(renderer()).textLength(); 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)float SVGTextContentElement::getSubStringLength(unsigned charnum, unsigned nchars, ExceptionState& exceptionState) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateLayoutIgnorePendingStylesheets(); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned numberOfChars = getNumberOfChars(); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (charnum >= numberOfChars) { 10309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::indexExceedsMaximumBound("charnum", charnum, getNumberOfChars())); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0.0f; 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 107e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (nchars > numberOfChars - charnum) 108e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) nchars = numberOfChars - charnum; 109e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGTextQuery(renderer()).subStringLength(charnum, nchars); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PassRefPtr<SVGPointTearOff> SVGTextContentElement::getStartPositionOfChar(unsigned charnum, ExceptionState& exceptionState) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateLayoutIgnorePendingStylesheets(); 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (charnum > getNumberOfChars()) { 11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::indexExceedsMaximumBound("charnum", charnum, getNumberOfChars())); 119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) FloatPoint point = SVGTextQuery(renderer()).startPositionOfCharacter(charnum); 12309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return SVGPointTearOff::create(SVGPoint::create(point), 0, PropertyIsNotAnimVal); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PassRefPtr<SVGPointTearOff> SVGTextContentElement::getEndPositionOfChar(unsigned charnum, ExceptionState& exceptionState) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1288abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateLayoutIgnorePendingStylesheets(); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (charnum > getNumberOfChars()) { 13109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::indexExceedsMaximumBound("charnum", charnum, getNumberOfChars())); 132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) FloatPoint point = SVGTextQuery(renderer()).endPositionOfCharacter(charnum); 13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return SVGPointTearOff::create(SVGPoint::create(point), 0, PropertyIsNotAnimVal); 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PassRefPtr<SVGRectTearOff> SVGTextContentElement::getExtentOfChar(unsigned charnum, ExceptionState& exceptionState) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateLayoutIgnorePendingStylesheets(); 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (charnum > getNumberOfChars()) { 14409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::indexExceedsMaximumBound("charnum", charnum, getNumberOfChars())); 145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) FloatRect rect = SVGTextQuery(renderer()).extentOfCharacter(charnum); 14909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return SVGRectTearOff::create(SVGRect::create(rect), 0, PropertyIsNotAnimVal); 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)float SVGTextContentElement::getRotationOfChar(unsigned charnum, ExceptionState& exceptionState) 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateLayoutIgnorePendingStylesheets(); 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (charnum > getNumberOfChars()) { 15709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::indexExceedsMaximumBound("charnum", charnum, getNumberOfChars())); 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0.0f; 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SVGTextQuery(renderer()).rotationOfCharacter(charnum); 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)int SVGTextContentElement::getCharNumAtPosition(PassRefPtr<SVGPointTearOff> point, ExceptionState& exceptionState) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateLayoutIgnorePendingStylesheets(); 16709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return SVGTextQuery(renderer()).characterNumberAtPosition(point->target()->value()); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void SVGTextContentElement::selectSubString(unsigned charnum, unsigned nchars, ExceptionState& exceptionState) 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned numberOfChars = getNumberOfChars(); 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (charnum >= numberOfChars) { 17409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::indexExceedsMaximumBound("charnum", charnum, getNumberOfChars())); 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (nchars > numberOfChars - charnum) 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nchars = numberOfChars - charnum; 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) ASSERT(document().frame()); 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Find selection start 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) VisiblePosition start(firstPositionInNode(const_cast<SVGTextContentElement*>(this))); 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < charnum; ++i) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) start = start.next(); 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Find selection end 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) VisiblePosition end(start); 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < nchars; ++i) 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) end = end.next(); 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().frame()->selection().setSelection(VisibleSelection(start, end)); 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SVGTextContentElement::isSupportedAttribute(const QualifiedName& attrName) 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(HashSet<QualifiedName>, supportedAttributes, ()); 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (supportedAttributes.isEmpty()) { 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) supportedAttributes.add(SVGNames::lengthAdjustAttr); 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) supportedAttributes.add(SVGNames::textLengthAttr); 20209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) supportedAttributes.add(XMLNames::spaceAttr); 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 204591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return supportedAttributes.contains<SVGAttributeHashTranslator>(attrName); 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SVGTextContentElement::isPresentationAttribute(const QualifiedName& name) const 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (name.matches(XMLNames::spaceAttr)) 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 211591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return SVGGraphicsElement::isPresentationAttribute(name); 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void SVGTextContentElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style) 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!isSupportedAttribute(name)) 217591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch SVGGraphicsElement::collectStyleForPresentationAttribute(name, value, style); 218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (name.matches(XMLNames::spaceAttr)) { 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(const AtomicString, preserveString, ("preserve", AtomicString::ConstructFromLiteral)); 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (value == preserveString) 222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) addPropertyToPresentationAttributeStyle(style, CSSPropertyWhiteSpace, CSSValuePre); 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) addPropertyToPresentationAttributeStyle(style, CSSPropertyWhiteSpace, CSSValueNowrap); 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void SVGTextContentElement::parseAttribute(const QualifiedName& name, const AtomicString& value) 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGParsingError parseError = NoError; 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!isSupportedAttribute(name)) 233591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch SVGGraphicsElement::parseAttribute(name, value); 234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (name == SVGNames::lengthAdjustAttr) { 235d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_lengthAdjust->setBaseValueAsString(value, parseError); 236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else if (name == SVGNames::textLengthAttr) { 23707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch m_textLength->setBaseValueAsString(value, parseError); 23809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else if (name.matches(XMLNames::spaceAttr)) { 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) reportAttributeParsingError(parseError, name, value); 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGTextContentElement::svgAttributeChanged(const QualifiedName& attrName) 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!isSupportedAttribute(attrName)) { 248591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch SVGGraphicsElement::svgAttributeChanged(attrName); 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (attrName == SVGNames::textLengthAttr) 25309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_textLengthIsSpecifiedByUser = true; 25409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 255323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) SVGElement::InvalidationGuard invalidationGuard(this); 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (RenderObject* renderer = this->renderer()) 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer); 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SVGTextContentElement::selfHasRelativeLengths() const 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Any element of the <text> subtree is advertized as using relative lengths. 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // On any window size change, we have to relayout the text subtree, as the 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // effective 'on-screen' font size may change. 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGTextContentElement* SVGTextContentElement::elementFromRenderer(RenderObject* renderer) 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!renderer) 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!renderer->isSVGText() && !renderer->isSVGInline()) 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 277591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch SVGElement* element = toSVGElement(renderer->node()); 278591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch ASSERT(element); 279d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return isSVGTextContentElement(*element) ? toSVGTextContentElement(element) : 0; 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 283