1/*
2 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB.  If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20#ifndef SVGTransformListPropertyTearOff_h
21#define SVGTransformListPropertyTearOff_h
22
23#include "SVGListPropertyTearOff.h"
24#include "SVGTransformList.h"
25
26namespace WebCore {
27
28// SVGTransformList contains two additional methods, that can be exposed to the bindings.
29class SVGTransformListPropertyTearOff : public SVGListPropertyTearOff<SVGTransformList> {
30public:
31    typedef SVGAnimatedListPropertyTearOff<SVGTransformList> AnimatedListPropertyTearOff;
32    typedef SVGAnimatedListPropertyTearOff<SVGTransformList>::ListWrapperCache ListWrapperCache;
33
34    static PassRefPtr<SVGListPropertyTearOff<SVGTransformList>> create(AnimatedListPropertyTearOff* animatedProperty, SVGPropertyRole role, SVGTransformList& values, ListWrapperCache& wrappers)
35    {
36        ASSERT(animatedProperty);
37        return adoptRef(new SVGTransformListPropertyTearOff(animatedProperty, role, values, wrappers));
38    }
39
40    PassRefPtr<SVGPropertyTearOff<SVGTransform>> createSVGTransformFromMatrix(SVGPropertyTearOff<SVGMatrix>* matrix, ExceptionCode& ec)
41    {
42        ASSERT(m_values);
43        if (!matrix) {
44            ec = TYPE_MISMATCH_ERR;
45            return 0;
46        }
47        return SVGPropertyTearOff<SVGTransform>::create(m_values->createSVGTransformFromMatrix(matrix->propertyReference()));
48    }
49
50    PassRefPtr<SVGPropertyTearOff<SVGTransform>> consolidate(ExceptionCode& ec)
51    {
52        ASSERT(m_values);
53        ASSERT(m_wrappers);
54        if (!canAlterList(ec))
55            return 0;
56
57        ASSERT(m_values->size() == m_wrappers->size());
58
59        // Spec: If the list was empty, then a value of null is returned.
60        if (m_values->isEmpty())
61            return 0;
62
63        detachListWrappers(0);
64        RefPtr<SVGPropertyTearOff<SVGTransform>> wrapper = SVGPropertyTearOff<SVGTransform>::create(m_values->consolidate());
65        m_wrappers->append(wrapper);
66
67        ASSERT(m_values->size() == m_wrappers->size());
68        return wrapper.release();
69    }
70
71private:
72    SVGTransformListPropertyTearOff(AnimatedListPropertyTearOff* animatedProperty, SVGPropertyRole role, SVGTransformList& values, ListWrapperCache& wrappers)
73        : SVGListPropertyTearOff<SVGTransformList>(animatedProperty, role, values, wrappers)
74    {
75    }
76};
77
78}
79
80#endif // SVGListPropertyTearOff_h
81