/* * Copyright (C) 2004-2016 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. */ #import "DOMElementInternal.h" #import "DOMAttrInternal.h" #import "DOMCSSStyleDeclarationInternal.h" #import "DOMHTMLCollectionInternal.h" #import "DOMNodeInternal.h" #import "DOMNodeListInternal.h" #import "DOMTokenListInternal.h" #import "ExceptionHandlers.h" #import <WebCore/Attr.h> #import <WebCore/CSSStyleDeclaration.h> #import <WebCore/Element.h> #import <WebCore/HTMLCollection.h> #import <WebCore/HTMLNames.h> #import <WebCore/JSExecState.h> #import <WebCore/NameNodeList.h> #import <WebCore/NodeList.h> #import <WebCore/ScrollIntoViewOptions.h> #import <WebCore/StyleProperties.h> #import <WebCore/StyledElement.h> #import <WebCore/ThreadCheck.h> #import <WebCore/WebScriptObjectPrivate.h> static inline WebCore::Element& unwrap(DOMElement& wrapper) { ASSERT(wrapper._internal); return downcast<WebCore::Element>(reinterpret_cast<WebCore::Node&>(*wrapper._internal)); } WebCore::Element* core(DOMElement *wrapper) { return wrapper ? &unwrap(*wrapper) : nullptr; } DOMElement *kit(WebCore::Element* value) { WebCoreThreadViolationCheckRoundOne(); return static_cast<DOMElement*>(kit(static_cast<WebCore::Node*>(value))); } @implementation DOMElement - (NSString *)tagName { WebCore::JSMainThreadNullState state; return unwrap(*self).tagName(); } - (DOMCSSStyleDeclaration *)style { WebCore::JSMainThreadNullState state; auto& element = unwrap(*self); return is<WebCore::StyledElement>(element) ? kit(&downcast<WebCore::StyledElement>(element).cssomStyle()) : nullptr; } - (int)offsetLeft { WebCore::JSMainThreadNullState state; return unwrap(*self).offsetLeftForBindings(); } - (int)offsetTop { WebCore::JSMainThreadNullState state; return unwrap(*self).offsetTopForBindings(); } - (int)offsetWidth { WebCore::JSMainThreadNullState state; return unwrap(*self).offsetWidth(); } - (int)offsetHeight { WebCore::JSMainThreadNullState state; return unwrap(*self).offsetHeight(); } - (int)clientLeft { WebCore::JSMainThreadNullState state; return unwrap(*self).clientLeft(); } - (int)clientTop { WebCore::JSMainThreadNullState state; return unwrap(*self).clientTop(); } - (int)clientWidth { WebCore::JSMainThreadNullState state; return unwrap(*self).clientWidth(); } - (int)clientHeight { WebCore::JSMainThreadNullState state; return unwrap(*self).clientHeight(); } - (int)scrollLeft { WebCore::JSMainThreadNullState state; return unwrap(*self).scrollLeft(); } - (void)setScrollLeft:(int)newScrollLeft { WebCore::JSMainThreadNullState state; unwrap(*self).setScrollLeft(newScrollLeft); } - (int)scrollTop { WebCore::JSMainThreadNullState state; return unwrap(*self).scrollTop(); } - (void)setScrollTop:(int)newScrollTop { WebCore::JSMainThreadNullState state; unwrap(*self).setScrollTop(newScrollTop); } - (int)scrollWidth { WebCore::JSMainThreadNullState state; return unwrap(*self).scrollWidth(); } - (int)scrollHeight { WebCore::JSMainThreadNullState state; return unwrap(*self).scrollHeight(); } - (DOMElement *)offsetParent { WebCore::JSMainThreadNullState state; return kit(unwrap(*self).offsetParentForBindings()); } - (NSString *)innerHTML { WebCore::JSMainThreadNullState state; return unwrap(*self).innerHTML(); } - (void)setInnerHTML:(NSString *)newInnerHTML { WebCore::JSMainThreadNullState state; raiseOnDOMError(unwrap(*self).setInnerHTML(newInnerHTML)); } - (NSString *)outerHTML { WebCore::JSMainThreadNullState state; return unwrap(*self).outerHTML(); } - (void)setOuterHTML:(NSString *)newOuterHTML { WebCore::JSMainThreadNullState state; raiseOnDOMError(unwrap(*self).setOuterHTML(newOuterHTML)); } - (NSString *)className { WebCore::JSMainThreadNullState state; return unwrap(*self).getAttribute(WebCore::HTMLNames::classAttr); } - (void)setClassName:(NSString *)newClassName { WebCore::JSMainThreadNullState state; unwrap(*self).setAttributeWithoutSynchronization(WebCore::HTMLNames::classAttr, newClassName); } - (DOMTokenList *)classList { WebCore::JSMainThreadNullState state; return kit(&unwrap(*self).classList()); } - (NSString *)innerText { WebCore::JSMainThreadNullState state; return unwrap(*self).innerText(); } - (NSString *)uiactions { WebCore::JSMainThreadNullState state; return unwrap(*self).getAttribute(WebCore::HTMLNames::uiactionsAttr); } - (void)setUiactions:(NSString *)newUiactions { WebCore::JSMainThreadNullState state; unwrap(*self).setAttributeWithoutSynchronization(WebCore::HTMLNames::uiactionsAttr, newUiactions); } - (DOMElement *)previousElementSibling { WebCore::JSMainThreadNullState state; return kit(unwrap(*self).previousElementSibling()); } - (DOMElement *)nextElementSibling { WebCore::JSMainThreadNullState state; return kit(unwrap(*self).nextElementSibling()); } - (DOMHTMLCollection *)children { WebCore::JSMainThreadNullState state; return kit(unwrap(*self).children().ptr()); } - (DOMElement *)firstElementChild { WebCore::JSMainThreadNullState state; return kit(unwrap(*self).firstElementChild()); } - (DOMElement *)lastElementChild { WebCore::JSMainThreadNullState state; return kit(unwrap(*self).lastElementChild()); } - (unsigned)childElementCount { WebCore::JSMainThreadNullState state; return unwrap(*self).childElementCount(); } #if PLATFORM(IOS_FAMILY) - (CGRect)boundsInRootViewSpace { WebCore::JSMainThreadNullState state; auto bounds = unwrap(*self).boundsInRootViewSpace(); return CGRectMake(bounds.x(), bounds.y(), bounds.width(), bounds.height()); } #endif - (NSString *)getAttribute:(NSString *)name { WebCore::JSMainThreadNullState state; return unwrap(*self).getAttribute(name); } - (void)setAttribute:(NSString *)name value:(NSString *)value { WebCore::JSMainThreadNullState state; raiseOnDOMError(unwrap(*self).setAttribute(name, value)); } - (void)removeAttribute:(NSString *)name { WebCore::JSMainThreadNullState state; unwrap(*self).removeAttribute(name); } - (DOMAttr *)getAttributeNode:(NSString *)name { WebCore::JSMainThreadNullState state; return kit(unwrap(*self).getAttributeNode(name).get()); } - (DOMAttr *)setAttributeNode:(DOMAttr *)newAttr { WebCore::JSMainThreadNullState state; if (!newAttr) raiseTypeErrorException(); return kit(raiseOnDOMError(unwrap(*self).setAttributeNode(*core(newAttr))).get()); } - (DOMAttr *)removeAttributeNode:(DOMAttr *)oldAttr { WebCore::JSMainThreadNullState state; if (!oldAttr) raiseTypeErrorException(); return kit(raiseOnDOMError(unwrap(*self).removeAttributeNode(*core(oldAttr))).ptr()); } - (DOMNodeList *)getElementsByTagName:(NSString *)name { if (!name) return nullptr; WebCore::JSMainThreadNullState state; Ref<WebCore::NodeList> result = unwrap(*self).getElementsByTagName(name); return kit(result.ptr()); } - (NSString *)getAttributeNS:(NSString *)namespaceURI localName:(NSString *)localName { WebCore::JSMainThreadNullState state; return unwrap(*self).getAttributeNS(namespaceURI, localName); } - (void)setAttributeNS:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName value:(NSString *)value { WebCore::JSMainThreadNullState state; raiseOnDOMError(unwrap(*self).setAttributeNS(namespaceURI, qualifiedName, value)); } - (void)removeAttributeNS:(NSString *)namespaceURI localName:(NSString *)localName { WebCore::JSMainThreadNullState state; unwrap(*self).removeAttributeNS(namespaceURI, localName); } - (DOMNodeList *)getElementsByTagNameNS:(NSString *)namespaceURI localName:(NSString *)localName { if (!localName) return nullptr; WebCore::JSMainThreadNullState state; Ref<WebCore::NodeList> result = unwrap(*self).getElementsByTagNameNS(namespaceURI, localName); return kit(result.ptr()); } - (DOMAttr *)getAttributeNodeNS:(NSString *)namespaceURI localName:(NSString *)localName { WebCore::JSMainThreadNullState state; return kit(unwrap(*self).getAttributeNodeNS(namespaceURI, localName).get()); } - (DOMAttr *)setAttributeNodeNS:(DOMAttr *)newAttr { WebCore::JSMainThreadNullState state; if (!newAttr) raiseTypeErrorException(); return kit(raiseOnDOMError(unwrap(*self).setAttributeNodeNS(*core(newAttr))).get()); } - (BOOL)hasAttribute:(NSString *)name { WebCore::JSMainThreadNullState state; return unwrap(*self).hasAttribute(name); } - (BOOL)hasAttributeNS:(NSString *)namespaceURI localName:(NSString *)localName { WebCore::JSMainThreadNullState state; return unwrap(*self).hasAttributeNS(namespaceURI, localName); } - (void)focus { WebCore::JSMainThreadNullState state; unwrap(*self).focus(); } - (void)blur { WebCore::JSMainThreadNullState state; unwrap(*self).blur(); } - (void)scrollIntoView:(BOOL)alignWithTop { WebCore::JSMainThreadNullState state; unwrap(*self).scrollIntoView(alignWithTop); } - (void)scrollIntoViewIfNeeded:(BOOL)centerIfNeeded { WebCore::JSMainThreadNullState state; unwrap(*self).scrollIntoViewIfNeeded(centerIfNeeded); } - (void)scrollByLines:(int)lines { WebCore::JSMainThreadNullState state; unwrap(*self).scrollByLines(lines); } - (void)scrollByPages:(int)pages { WebCore::JSMainThreadNullState state; unwrap(*self).scrollByPages(pages); } - (DOMNodeList *)getElementsByClassName:(NSString *)name { WebCore::JSMainThreadNullState state; Ref<WebCore::NodeList> result = unwrap(*self).getElementsByClassName(name); return kit(result.ptr()); } - (BOOL)matches:(NSString *)selectors { WebCore::JSMainThreadNullState state; return raiseOnDOMError(unwrap(*self).matches(selectors)); } - (DOMElement *)closest:(NSString *)selectors { WebCore::JSMainThreadNullState state; return kit(raiseOnDOMError(unwrap(*self).closest(selectors))); } - (BOOL)webkitMatchesSelector:(NSString *)selectors { WebCore::JSMainThreadNullState state; return raiseOnDOMError(unwrap(*self).matches(selectors)); } #if ENABLE(FULLSCREEN_API) - (void)webkitRequestFullScreen:(unsigned short)flags { WebCore::JSMainThreadNullState state; unwrap(*self).webkitRequestFullscreen(); } - (void)webkitRequestFullscreen { WebCore::JSMainThreadNullState state; unwrap(*self).webkitRequestFullscreen(); } #endif - (void)remove { WebCore::JSMainThreadNullState state; raiseOnDOMError(unwrap(*self).remove()); } - (DOMElement *)querySelector:(NSString *)selectors { WebCore::JSMainThreadNullState state; return kit(raiseOnDOMError(unwrap(*self).querySelector(selectors))); } - (DOMNodeList *)querySelectorAll:(NSString *)selectors { WebCore::JSMainThreadNullState state; return kit(raiseOnDOMError(unwrap(*self).querySelectorAll(selectors)).ptr()); } @end @implementation DOMElement (DOMElementDeprecated) - (void)setAttribute:(NSString *)name :(NSString *)value { [self setAttribute:name value:value]; } - (NSString *)getAttributeNS:(NSString *)namespaceURI :(NSString *)localName { return [self getAttributeNS:namespaceURI localName:localName]; } - (void)setAttributeNS:(NSString *)namespaceURI :(NSString *)qualifiedName :(NSString *)value { [self setAttributeNS:namespaceURI qualifiedName:qualifiedName value:value]; } - (void)removeAttributeNS:(NSString *)namespaceURI :(NSString *)localName { [self removeAttributeNS:namespaceURI localName:localName]; } - (DOMNodeList *)getElementsByTagNameNS:(NSString *)namespaceURI :(NSString *)localName { return [self getElementsByTagNameNS:namespaceURI localName:localName]; } - (DOMAttr *)getAttributeNodeNS:(NSString *)namespaceURI :(NSString *)localName { return [self getAttributeNodeNS:namespaceURI localName:localName]; } - (BOOL)hasAttributeNS:(NSString *)namespaceURI :(NSString *)localName { return [self hasAttributeNS:namespaceURI localName:localName]; } @end