summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/bindings/js/JSHTMLAllCollectionCustom.cpp
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-05-06 11:45:16 +0100
committerSteve Block <steveblock@google.com>2011-05-12 13:44:10 +0100
commitcad810f21b803229eb11403f9209855525a25d57 (patch)
tree29a6fd0279be608e0fe9ffe9841f722f0f4e4269 /Source/WebCore/bindings/js/JSHTMLAllCollectionCustom.cpp
parent121b0cf4517156d0ac5111caf9830c51b69bae8f (diff)
downloadexternal_webkit-cad810f21b803229eb11403f9209855525a25d57.zip
external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.gz
external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.bz2
Merge WebKit at r75315: Initial merge by git.
Change-Id: I570314b346ce101c935ed22a626b48c2af266b84
Diffstat (limited to 'Source/WebCore/bindings/js/JSHTMLAllCollectionCustom.cpp')
-rw-r--r--Source/WebCore/bindings/js/JSHTMLAllCollectionCustom.cpp136
1 files changed, 136 insertions, 0 deletions
diff --git a/Source/WebCore/bindings/js/JSHTMLAllCollectionCustom.cpp b/Source/WebCore/bindings/js/JSHTMLAllCollectionCustom.cpp
new file mode 100644
index 0000000..64615b9
--- /dev/null
+++ b/Source/WebCore/bindings/js/JSHTMLAllCollectionCustom.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "JSHTMLAllCollection.h"
+
+#include "HTMLAllCollection.h"
+#include "JSDOMBinding.h"
+#include "JSHTMLAllCollection.h"
+#include "JSNode.h"
+#include "JSNodeList.h"
+#include "Node.h"
+#include "StaticNodeList.h"
+#include <runtime/JSValue.h>
+#include <wtf/Vector.h>
+#include <wtf/text/AtomicString.h>
+
+using namespace JSC;
+
+namespace WebCore {
+
+static JSValue getNamedItems(ExecState* exec, JSHTMLAllCollection* collection, const Identifier& propertyName)
+{
+ Vector<RefPtr<Node> > namedItems;
+ collection->impl()->namedItems(identifierToAtomicString(propertyName), namedItems);
+
+ if (namedItems.isEmpty())
+ return jsUndefined();
+ if (namedItems.size() == 1)
+ return toJS(exec, collection->globalObject(), namedItems[0].get());
+
+ // FIXME: HTML5 specifies that this should be a DynamicNodeList.
+ // FIXME: HTML5 specifies that non-HTMLOptionsCollection collections should return
+ // the first matching item instead of a NodeList.
+ return toJS(exec, collection->globalObject(), StaticNodeList::adopt(namedItems).get());
+}
+
+// HTMLCollections are strange objects, they support both get and call,
+// so that document.forms.item(0) and document.forms(0) both work.
+static EncodedJSValue JSC_HOST_CALL callHTMLAllCollection(ExecState* exec)
+{
+ if (exec->argumentCount() < 1)
+ return JSValue::encode(jsUndefined());
+
+ // Do not use thisObj here. It can be the JSHTMLDocument, in the document.forms(i) case.
+ JSHTMLAllCollection* jsCollection = static_cast<JSHTMLAllCollection*>(exec->callee());
+ HTMLAllCollection* collection = static_cast<HTMLAllCollection*>(jsCollection->impl());
+
+ // Also, do we need the TypeError test here ?
+
+ if (exec->argumentCount() == 1) {
+ // Support for document.all(<index>) etc.
+ bool ok;
+ UString string = exec->argument(0).toString(exec);
+ unsigned index = Identifier::toUInt32(string, ok);
+ if (ok)
+ return JSValue::encode(toJS(exec, jsCollection->globalObject(), collection->item(index)));
+
+ // Support for document.images('<name>') etc.
+ return JSValue::encode(getNamedItems(exec, jsCollection, Identifier(exec, string)));
+ }
+
+ // The second arg, if set, is the index of the item we want
+ bool ok;
+ UString string = exec->argument(0).toString(exec);
+ unsigned index = Identifier::toUInt32(exec->argument(1).toString(exec), ok);
+ if (ok) {
+ String pstr = ustringToString(string);
+ Node* node = collection->namedItem(pstr);
+ while (node) {
+ if (!index)
+ return JSValue::encode(toJS(exec, jsCollection->globalObject(), node));
+ node = collection->nextNamedItem(pstr);
+ --index;
+ }
+ }
+
+ return JSValue::encode(jsUndefined());
+}
+
+CallType JSHTMLAllCollection::getCallData(CallData& callData)
+{
+ callData.native.function = callHTMLAllCollection;
+ return CallTypeHost;
+}
+
+bool JSHTMLAllCollection::canGetItemsForName(ExecState*, HTMLAllCollection* collection, const Identifier& propertyName)
+{
+ Vector<RefPtr<Node> > namedItems;
+ collection->namedItems(identifierToAtomicString(propertyName), namedItems);
+ return !namedItems.isEmpty();
+}
+
+JSValue JSHTMLAllCollection::nameGetter(ExecState* exec, JSValue slotBase, const Identifier& propertyName)
+{
+ JSHTMLAllCollection* thisObj = static_cast<JSHTMLAllCollection*>(asObject(slotBase));
+ return getNamedItems(exec, thisObj, propertyName);
+}
+
+JSValue JSHTMLAllCollection::item(ExecState* exec)
+{
+ bool ok;
+ uint32_t index = Identifier::toUInt32(exec->argument(0).toString(exec), ok);
+ if (ok)
+ return toJS(exec, globalObject(), impl()->item(index));
+ return getNamedItems(exec, this, Identifier(exec, exec->argument(0).toString(exec)));
+}
+
+JSValue JSHTMLAllCollection::namedItem(ExecState* exec)
+{
+ return getNamedItems(exec, this, Identifier(exec, exec->argument(0).toString(exec)));
+}
+
+} // namespace WebCore