1/*
2 * Copyright (C) 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
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#include "config.h"
21
22#if ENABLE(SVG)
23#include "JSSVGPathSegList.h"
24
25#include "Document.h"
26#include "Frame.h"
27#include "JSSVGContextCache.h"
28#include "JSSVGPathSeg.h"
29#include "SVGDocumentExtensions.h"
30#include "SVGElement.h"
31#include "SVGPathSegList.h"
32
33#include <wtf/Assertions.h>
34
35using namespace JSC;
36
37namespace WebCore {
38
39JSValue JSSVGPathSegList::clear(ExecState* exec, const ArgList&)
40{
41    ExceptionCode ec = 0;
42
43    SVGPathSegList* list = impl();
44    list->clear(ec);
45
46    setDOMException(exec, ec);
47
48    JSSVGContextCache::propagateSVGDOMChange(this, list->associatedAttributeName());
49    return jsUndefined();
50}
51
52JSValue JSSVGPathSegList::initialize(ExecState* exec, const ArgList& args)
53{
54    ExceptionCode ec = 0;
55    SVGPathSeg* newItem = toSVGPathSeg(args.at(0));
56
57    SVGPathSegList* list = impl();
58
59    SVGPathSeg* obj = WTF::getPtr(list->initialize(newItem, ec));
60    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
61
62    JSValue result = toJS(exec, globalObject(), obj, context);
63    setDOMException(exec, ec);
64
65    JSSVGContextCache::propagateSVGDOMChange(this, list->associatedAttributeName());
66    return result;
67}
68
69JSValue JSSVGPathSegList::getItem(ExecState* exec, const ArgList& args)
70{
71    ExceptionCode ec = 0;
72
73    bool indexOk;
74    unsigned index = args.at(0).toInt32(exec, indexOk);
75    if (!indexOk) {
76        setDOMException(exec, TYPE_MISMATCH_ERR);
77        return jsUndefined();
78    }
79
80    SVGPathSegList* list = impl();
81    SVGPathSeg* obj = WTF::getPtr(list->getItem(index, ec));
82    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
83
84    JSValue result = toJS(exec, globalObject(), obj, context);
85    setDOMException(exec, ec);
86    return result;
87}
88
89JSValue JSSVGPathSegList::insertItemBefore(ExecState* exec, const ArgList& args)
90{
91    ExceptionCode ec = 0;
92    SVGPathSeg* newItem = toSVGPathSeg(args.at(0));
93
94    bool indexOk;
95    unsigned index = args.at(1).toInt32(exec, indexOk);
96    if (!indexOk) {
97        setDOMException(exec, TYPE_MISMATCH_ERR);
98        return jsUndefined();
99    }
100
101    SVGPathSegList* list = impl();
102    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
103
104    JSValue result = toJS(exec, globalObject(), WTF::getPtr(list->insertItemBefore(newItem, index, ec)), context);
105    setDOMException(exec, ec);
106
107    JSSVGContextCache::propagateSVGDOMChange(this, list->associatedAttributeName());
108    return result;
109}
110
111JSValue JSSVGPathSegList::replaceItem(ExecState* exec, const ArgList& args)
112{
113    ExceptionCode ec = 0;
114    SVGPathSeg* newItem = toSVGPathSeg(args.at(0));
115
116    bool indexOk;
117    unsigned index = args.at(1).toInt32(exec, indexOk);
118    if (!indexOk) {
119        setDOMException(exec, TYPE_MISMATCH_ERR);
120        return jsUndefined();
121    }
122
123    SVGPathSegList* list = impl();
124    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
125
126    JSValue result = toJS(exec, globalObject(), WTF::getPtr(list->replaceItem(newItem, index, ec)), context);
127    setDOMException(exec, ec);
128
129    JSSVGContextCache::propagateSVGDOMChange(this, list->associatedAttributeName());
130    return result;
131}
132
133JSValue JSSVGPathSegList::removeItem(ExecState* exec, const ArgList& args)
134{
135    ExceptionCode ec = 0;
136
137    bool indexOk;
138    unsigned index = args.at(0).toInt32(exec, indexOk);
139    if (!indexOk) {
140        setDOMException(exec, TYPE_MISMATCH_ERR);
141        return jsUndefined();
142    }
143
144    SVGPathSegList* list = impl();
145
146    RefPtr<SVGPathSeg> obj(list->removeItem(index, ec));
147    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
148
149    JSValue result = toJS(exec, globalObject(), obj.get(), context);
150    setDOMException(exec, ec);
151
152    JSSVGContextCache::propagateSVGDOMChange(this, list->associatedAttributeName());
153    return result;
154}
155
156JSValue JSSVGPathSegList::appendItem(ExecState* exec, const ArgList& args)
157{
158    ExceptionCode ec = 0;
159    SVGPathSeg* newItem = toSVGPathSeg(args.at(0));
160
161    SVGPathSegList* list = impl();
162    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
163
164    JSValue result = toJS(exec, globalObject(), WTF::getPtr(list->appendItem(newItem, ec)), context);
165    setDOMException(exec, ec);
166
167    JSSVGContextCache::propagateSVGDOMChange(this, list->associatedAttributeName());
168    return result;
169}
170
171}
172
173#endif // ENABLE(SVG)
174