18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSElement.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSHelper.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ExceptionCode.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLFrameElementBase.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSAttr.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSHTMLElementWrapperFactory.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSNodeList.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NodeList.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSSVGElementWrapperFactory.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGElement.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace JSC;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames;
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid JSElement::markChildren(MarkStack& markStack)
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Base::markChildren(markStack);
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Element* element = impl();
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    JSGlobalData& globalData = *Heap::heap(this)->globalData();
60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
61231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    markDOMObjectWrapper(markStack, globalData, element->attributeMap());
62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (element->isStyledElement())
63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        markDOMObjectWrapper(markStack, globalData, static_cast<StyledElement*>(element)->inlineStyleDecl());
64231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
65231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline bool allowSettingSrcToJavascriptURL(ExecState* exec, Element* element, const String& name, const String& value)
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ((element->hasTagName(iframeTag) || element->hasTagName(frameTag)) && equalIgnoringCase(name, "src") && protocolIsJavaScript(deprecatedParseURL(value))) {
69231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        Document* contentDocument = static_cast<HTMLFrameElementBase*>(element)->contentDocument();
70231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (contentDocument && !checkNodeSecurity(exec, contentDocument))
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
74231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
765f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSElement::setAttribute(ExecState* exec, const ArgList& args)
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ExceptionCode ec = 0;
795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    AtomicString name = args.at(0).toString(exec);
805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    AtomicString value = args.at(1).toString(exec);
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Element* imp = impl();
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allowSettingSrcToJavascriptURL(exec, imp, name, value))
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    imp->setAttribute(name, value, ec);
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setDOMException(exec, ec);
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jsUndefined();
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
915f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSElement::setAttributeNode(ExecState* exec, const ArgList& args)
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ExceptionCode ec = 0;
945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    Attr* newAttr = toAttr(args.at(0));
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!newAttr) {
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setDOMException(exec, TYPE_MISMATCH_ERR);
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Element* imp = impl();
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allowSettingSrcToJavascriptURL(exec, imp, newAttr->name(), newAttr->value()))
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue result = toJS(exec, globalObject(), WTF::getPtr(imp->setAttributeNode(newAttr, ec)));
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setDOMException(exec, ec);
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1095f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSElement::setAttributeNS(ExecState* exec, const ArgList& args)
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ExceptionCode ec = 0;
1125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    AtomicString namespaceURI = valueToStringWithNullCheck(exec, args.at(0));
1135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    AtomicString qualifiedName = args.at(1).toString(exec);
1145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    AtomicString value = args.at(2).toString(exec);
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Element* imp = impl();
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allowSettingSrcToJavascriptURL(exec, imp, qualifiedName, value))
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    imp->setAttributeNS(namespaceURI, qualifiedName, value, ec);
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setDOMException(exec, ec);
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jsUndefined();
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1255f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSElement::setAttributeNodeNS(ExecState* exec, const ArgList& args)
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ExceptionCode ec = 0;
1285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    Attr* newAttr = toAttr(args.at(0));
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!newAttr) {
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setDOMException(exec, TYPE_MISMATCH_ERR);
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Element* imp = impl();
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allowSettingSrcToJavascriptURL(exec, imp, newAttr->name(), newAttr->value()))
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue result = toJS(exec, globalObject(), WTF::getPtr(imp->setAttributeNodeNS(newAttr, ec)));
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setDOMException(exec, ec);
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochJSValue toJSNewlyCreated(ExecState* exec, JSDOMGlobalObject* globalObject, Element* element)
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!element)
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsNull();
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(!getCachedDOMNodeWrapper(exec, element->document(), element));
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSNode* wrapper;
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (element->isHTMLElement())
1520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        wrapper = createJSHTMLWrapper(exec, globalObject, static_cast<HTMLElement*>(element));
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (element->isSVGElement())
1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        wrapper = createJSSVGWrapper(exec, globalObject, static_cast<SVGElement*>(element));
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        wrapper = CREATE_DOM_NODE_WRAPPER(exec, globalObject, Element, element);
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return wrapper;
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
164