1/* 2 * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 30#include "config.h" 31#include "JSElement.h" 32 33#include "CSSHelper.h" 34#include "Document.h" 35#include "ExceptionCode.h" 36#include "HTMLFrameElementBase.h" 37#include "HTMLNames.h" 38#include "JSAttr.h" 39#include "JSHTMLElementWrapperFactory.h" 40#include "JSNodeList.h" 41#include "NodeList.h" 42 43#if ENABLE(SVG) 44#include "JSSVGElementWrapperFactory.h" 45#include "SVGElement.h" 46#endif 47 48using namespace JSC; 49 50namespace WebCore { 51 52using namespace HTMLNames; 53 54void JSElement::markChildren(MarkStack& markStack) 55{ 56 Base::markChildren(markStack); 57 58 Element* element = impl(); 59 JSGlobalData& globalData = *Heap::heap(this)->globalData(); 60 61 markDOMObjectWrapper(markStack, globalData, element->attributeMap()); 62 if (element->isStyledElement()) 63 markDOMObjectWrapper(markStack, globalData, static_cast<StyledElement*>(element)->inlineStyleDecl()); 64} 65 66static inline bool allowSettingSrcToJavascriptURL(ExecState* exec, Element* element, const String& name, const String& value) 67{ 68 if ((element->hasTagName(iframeTag) || element->hasTagName(frameTag)) && equalIgnoringCase(name, "src") && protocolIsJavaScript(deprecatedParseURL(value))) { 69 Document* contentDocument = static_cast<HTMLFrameElementBase*>(element)->contentDocument(); 70 if (contentDocument && !checkNodeSecurity(exec, contentDocument)) 71 return false; 72 } 73 return true; 74} 75 76JSValue JSElement::setAttribute(ExecState* exec, const ArgList& args) 77{ 78 ExceptionCode ec = 0; 79 AtomicString name = args.at(0).toString(exec); 80 AtomicString value = args.at(1).toString(exec); 81 82 Element* imp = impl(); 83 if (!allowSettingSrcToJavascriptURL(exec, imp, name, value)) 84 return jsUndefined(); 85 86 imp->setAttribute(name, value, ec); 87 setDOMException(exec, ec); 88 return jsUndefined(); 89} 90 91JSValue JSElement::setAttributeNode(ExecState* exec, const ArgList& args) 92{ 93 ExceptionCode ec = 0; 94 Attr* newAttr = toAttr(args.at(0)); 95 if (!newAttr) { 96 setDOMException(exec, TYPE_MISMATCH_ERR); 97 return jsUndefined(); 98 } 99 100 Element* imp = impl(); 101 if (!allowSettingSrcToJavascriptURL(exec, imp, newAttr->name(), newAttr->value())) 102 return jsUndefined(); 103 104 JSValue result = toJS(exec, globalObject(), WTF::getPtr(imp->setAttributeNode(newAttr, ec))); 105 setDOMException(exec, ec); 106 return result; 107} 108 109JSValue JSElement::setAttributeNS(ExecState* exec, const ArgList& args) 110{ 111 ExceptionCode ec = 0; 112 AtomicString namespaceURI = valueToStringWithNullCheck(exec, args.at(0)); 113 AtomicString qualifiedName = args.at(1).toString(exec); 114 AtomicString value = args.at(2).toString(exec); 115 116 Element* imp = impl(); 117 if (!allowSettingSrcToJavascriptURL(exec, imp, qualifiedName, value)) 118 return jsUndefined(); 119 120 imp->setAttributeNS(namespaceURI, qualifiedName, value, ec); 121 setDOMException(exec, ec); 122 return jsUndefined(); 123} 124 125JSValue JSElement::setAttributeNodeNS(ExecState* exec, const ArgList& args) 126{ 127 ExceptionCode ec = 0; 128 Attr* newAttr = toAttr(args.at(0)); 129 if (!newAttr) { 130 setDOMException(exec, TYPE_MISMATCH_ERR); 131 return jsUndefined(); 132 } 133 134 Element* imp = impl(); 135 if (!allowSettingSrcToJavascriptURL(exec, imp, newAttr->name(), newAttr->value())) 136 return jsUndefined(); 137 138 JSValue result = toJS(exec, globalObject(), WTF::getPtr(imp->setAttributeNodeNS(newAttr, ec))); 139 setDOMException(exec, ec); 140 return result; 141} 142 143JSValue toJSNewlyCreated(ExecState* exec, JSDOMGlobalObject* globalObject, Element* element) 144{ 145 if (!element) 146 return jsNull(); 147 148 ASSERT(!getCachedDOMNodeWrapper(exec, element->document(), element)); 149 150 JSNode* wrapper; 151 if (element->isHTMLElement()) 152 wrapper = createJSHTMLWrapper(exec, globalObject, static_cast<HTMLElement*>(element)); 153#if ENABLE(SVG) 154 else if (element->isSVGElement()) 155 wrapper = createJSSVGWrapper(exec, globalObject, static_cast<SVGElement*>(element)); 156#endif 157 else 158 wrapper = CREATE_DOM_NODE_WRAPPER(exec, globalObject, Element, element); 159 160 return wrapper; 161} 162 163} // namespace WebCore 164