15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved.
302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
1702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "V8HTMLOptionsCollection.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "V8HTMLOptionElement.h"
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "V8Node.h"
36926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "V8NodeList.h"
377757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "bindings/v8/ExceptionState.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/V8Binding.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/custom/V8HTMLSelectElementCustom.h"
407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/dom/ExceptionCode.h"
417757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/dom/NamedNodesCollection.h"
427757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/html/HTMLOptionElement.h"
437757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/html/HTMLOptionsCollection.h"
44591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/html/HTMLSelectElement.h"
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochtemplate<typename CallbackInfo>
49e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochstatic void getNamedItems(HTMLOptionsCollection* collection, const AtomicString& name, const CallbackInfo& callbackInfo)
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Vector<RefPtr<Node> > namedItems;
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    collection->namedItems(name, namedItems);
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!namedItems.size()) {
55e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        v8SetReturnValueNull(callbackInfo);
565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return;
575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (namedItems.size() == 1) {
60e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        v8SetReturnValue(callbackInfo, toV8Fast(namedItems.at(0).release(), callbackInfo, collection));
615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return;
625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
64e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    v8SetReturnValue(callbackInfo, toV8Fast(NamedNodesCollection::create(namedItems), callbackInfo, collection));
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void V8HTMLOptionsCollection::namedItemMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& args)
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HTMLOptionsCollection* imp = V8HTMLOptionsCollection::toNative(args.Holder());
705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    getNamedItems(imp, toWebCoreString(args[0]), args);
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void V8HTMLOptionsCollection::removeMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& args)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLOptionsCollection* imp = V8HTMLOptionsCollection::toNative(args.Holder());
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HTMLSelectElement* base = toHTMLSelectElement(imp->ownerNode());
775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    removeElement(base, args);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void V8HTMLOptionsCollection::addMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& args)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!V8HTMLOptionElement::HasInstance(args[0], args.GetIsolate(), worldType(args.GetIsolate()))) {
83e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        setDOMException(TypeMismatchError, args.GetIsolate());
845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return;
855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLOptionsCollection* imp = V8HTMLOptionsCollection::toNative(args.Holder());
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLOptionElement* option = V8HTMLOptionElement::toNative(v8::Handle<v8::Object>(v8::Handle<v8::Object>::Cast(args[0])));
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
897757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ExceptionState es(args.GetIsolate());
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (args.Length() < 2)
917757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        imp->add(option, es);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else {
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool ok;
945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        V8TRYCATCH_VOID(int, index, toInt32(args[1], ok));
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!ok)
967757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            es.throwDOMException(TypeMismatchError);
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
987757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            imp->add(option, index, es);
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1017757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    es.throwIfNeeded();
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void V8HTMLOptionsCollection::lengthAttrSetterCustom(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<void>& info)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLOptionsCollection* imp = V8HTMLOptionsCollection::toNative(info.Holder());
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double v = value->NumberValue();
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned newLength = 0;
1097757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ExceptionState es(info.GetIsolate());
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!std::isnan(v) && !std::isinf(v)) {
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (v < 0.0)
1127757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            es.throwDOMException(IndexSizeError);
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else if (v > static_cast<double>(UINT_MAX))
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            newLength = UINT_MAX;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            newLength = static_cast<unsigned>(v);
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1197757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (es.throwIfNeeded())
1207757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        return;
1217757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
1227757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    imp->setLength(newLength, es);
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
126