From 4576aa36e9a9671459299c7963ac95aa94beaea9 Mon Sep 17 00:00:00 2001 From: "Shimeng (Simon) Wang" Date: Tue, 7 Dec 2010 17:22:45 -0800 Subject: Merge WebKit at r73109: Initial merge by git. Change-Id: I61f1a66d9642e3d8405d3ac6ccab2a53421c75d8 --- .../svg/properties/SVGPathSegListPropertyTearOff.h | 160 +++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 WebCore/svg/properties/SVGPathSegListPropertyTearOff.h (limited to 'WebCore/svg/properties/SVGPathSegListPropertyTearOff.h') diff --git a/WebCore/svg/properties/SVGPathSegListPropertyTearOff.h b/WebCore/svg/properties/SVGPathSegListPropertyTearOff.h new file mode 100644 index 0000000..94acda1 --- /dev/null +++ b/WebCore/svg/properties/SVGPathSegListPropertyTearOff.h @@ -0,0 +1,160 @@ +/* + * Copyright (C) Research In Motion Limited 2010. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef SVGPathSegListPropertyTearOff_h +#define SVGPathSegListPropertyTearOff_h + +#if ENABLE(SVG) +#include "SVGAnimatedListPropertyTearOff.h" +#include "SVGPathSegList.h" + +namespace WebCore { + +class SVGPathElement; + +class SVGPathSegListPropertyTearOff : public SVGListProperty { +public: + typedef SVGListProperty Base; + typedef SVGAnimatedListPropertyTearOff AnimatedListPropertyTearOff; + typedef SVGPropertyTraits::ListItemType ListItemType; + typedef PassRefPtr PassListItemType; + + static PassRefPtr create(AnimatedListPropertyTearOff* animatedProperty, SVGPropertyRole role, SVGPathSegRole pathSegRole) + { + ASSERT(animatedProperty); + return adoptRef(new SVGPathSegListPropertyTearOff(animatedProperty, role, pathSegRole)); + } + + int removeItemFromList(const ListItemType& removeItem, bool shouldSynchronizeWrappers) + { + SVGPathSegList& values = m_animatedProperty->values(); + + unsigned size = values.size(); + for (unsigned i = 0; i < size; ++i) { + ListItemType& item = values.at(i); + if (item != removeItem) + continue; + + values.remove(i); + + if (shouldSynchronizeWrappers) + commitChange(); + + return i; + } + + return -1; + } + + // SVGList API + void clear(ExceptionCode&); + + unsigned numberOfItems() const + { + SVGPathSegList& values = m_animatedProperty->values(); + return Base::numberOfItemsValues(values); + } + + PassListItemType initialize(PassListItemType passNewItem, ExceptionCode& ec) + { + // Not specified, but FF/Opera do it this way, and it's just sane. + if (!passNewItem) { + ec = SVGException::SVG_WRONG_TYPE_ERR; + return 0; + } + + ListItemType newItem = passNewItem; + SVGPathSegList& values = m_animatedProperty->values(); + return Base::initializeValues(values, newItem, ec); + } + + PassListItemType getItem(unsigned index, ExceptionCode&); + + PassListItemType insertItemBefore(PassListItemType passNewItem, unsigned index, ExceptionCode& ec) + { + // Not specified, but FF/Opera do it this way, and it's just sane. + if (!passNewItem) { + ec = SVGException::SVG_WRONG_TYPE_ERR; + return 0; + } + + ListItemType newItem = passNewItem; + SVGPathSegList& values = m_animatedProperty->values(); + return Base::insertItemBeforeValues(values, newItem, index, ec); + } + + PassListItemType replaceItem(PassListItemType passNewItem, unsigned index, ExceptionCode& ec) + { + // Not specified, but FF/Opera do it this way, and it's just sane. + if (!passNewItem) { + ec = SVGException::SVG_WRONG_TYPE_ERR; + return 0; + } + + ListItemType newItem = passNewItem; + SVGPathSegList& values = m_animatedProperty->values(); + return Base::replaceItemValues(values, newItem, index, ec); + } + + PassListItemType removeItem(unsigned index, ExceptionCode&); + + PassListItemType appendItem(PassListItemType passNewItem, ExceptionCode& ec) + { + // Not specified, but FF/Opera do it this way, and it's just sane. + if (!passNewItem) { + ec = SVGException::SVG_WRONG_TYPE_ERR; + return 0; + } + + ListItemType newItem = passNewItem; + SVGPathSegList& values = m_animatedProperty->values(); + return Base::appendItemValues(values, newItem, ec); + } + +private: + SVGPathSegListPropertyTearOff(AnimatedListPropertyTearOff* animatedProperty, SVGPropertyRole role, SVGPathSegRole pathSegRole) + : SVGListProperty(role) + , m_animatedProperty(animatedProperty) + , m_pathSegRole(pathSegRole) + { + } + + SVGPathElement* contextElement() const; + + virtual void commitChange() + { + SVGPathSegList& values = m_animatedProperty->values(); + values.commitChange(m_animatedProperty->contextElement()); + } + + virtual void processIncomingListItemValue(const ListItemType& newItem, unsigned* indexToModify); + virtual void processIncomingListItemWrapper(RefPtr&, unsigned*) + { + ASSERT_NOT_REACHED(); + } + +private: + RefPtr m_animatedProperty; + SVGPathSegRole m_pathSegRole; +}; + +} + +#endif // ENABLE(SVG) +#endif // SVGListPropertyTearOff_h -- cgit v1.1