1 /* 2 * Copyright (C) 2009 Google 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 are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "WebDocument.h" 33 #include "WebElement.h" 34 #include "bindings/v8/ExceptionState.h" 35 #include "core/dom/Element.h" 36 #include "core/dom/NamedNodeMap.h" 37 #include "core/dom/custom/CustomElementCallbackDispatcher.h" 38 #include "core/dom/shadow/ShadowRoot.h" 39 #include "core/rendering/RenderBoxModelObject.h" 40 #include "core/rendering/RenderObject.h" 41 #include "public/platform/WebRect.h" 42 #include "wtf/PassRefPtr.h" 43 44 45 using namespace WebCore; 46 47 namespace blink { 48 49 bool WebElement::isFormControlElement() const 50 { 51 return constUnwrap<Element>()->isFormControlElement(); 52 } 53 54 bool WebElement::isTextFormControlElement() const 55 { 56 return constUnwrap<Element>()->isTextFormControl(); 57 } 58 59 WebString WebElement::tagName() const 60 { 61 return constUnwrap<Element>()->tagName(); 62 } 63 64 bool WebElement::hasTagName(const WebString& tagName) const 65 { 66 return equalIgnoringCase(constUnwrap<Element>()->tagName(), 67 tagName.operator String()); 68 } 69 70 bool WebElement::hasHTMLTagName(const WebString& tagName) const 71 { 72 // How to create class nodeName localName 73 // createElement('input') HTMLInputElement INPUT input 74 // createElement('INPUT') HTMLInputElement INPUT input 75 // createElementNS(xhtmlNS, 'input') HTMLInputElement INPUT input 76 // createElementNS(xhtmlNS, 'INPUT') HTMLUnknownElement INPUT INPUT 77 const Element* element = constUnwrap<Element>(); 78 return HTMLNames::xhtmlNamespaceURI == element->namespaceURI() && element->localName() == String(tagName).lower(); 79 } 80 81 bool WebElement::hasAttribute(const WebString& attrName) const 82 { 83 return constUnwrap<Element>()->hasAttribute(attrName); 84 } 85 86 void WebElement::removeAttribute(const WebString& attrName) 87 { 88 // TODO: Custom element callbacks need to be called on WebKit API methods that 89 // mutate the DOM in any way. 90 CustomElementCallbackDispatcher::CallbackDeliveryScope deliverCustomElementCallbacks; 91 unwrap<Element>()->removeAttribute(attrName); 92 } 93 94 WebString WebElement::getAttribute(const WebString& attrName) const 95 { 96 return constUnwrap<Element>()->getAttribute(attrName); 97 } 98 99 bool WebElement::setAttribute(const WebString& attrName, const WebString& attrValue) 100 { 101 // TODO: Custom element callbacks need to be called on WebKit API methods that 102 // mutate the DOM in any way. 103 CustomElementCallbackDispatcher::CallbackDeliveryScope deliverCustomElementCallbacks; 104 TrackExceptionState exceptionState; 105 unwrap<Element>()->setAttribute(attrName, attrValue, exceptionState); 106 return !exceptionState.hadException(); 107 } 108 109 unsigned WebElement::attributeCount() const 110 { 111 if (!constUnwrap<Element>()->hasAttributes()) 112 return 0; 113 return constUnwrap<Element>()->attributeCount(); 114 } 115 116 WebNode WebElement::shadowRoot() const 117 { 118 ShadowRoot* shadowRoot = constUnwrap<Element>()->shadowRoot(); 119 if (!shadowRoot) 120 return WebNode(); 121 return WebNode(shadowRoot->toNode()); 122 } 123 124 WebString WebElement::attributeLocalName(unsigned index) const 125 { 126 if (index >= attributeCount()) 127 return WebString(); 128 return constUnwrap<Element>()->attributeItem(index)->localName(); 129 } 130 131 WebString WebElement::attributeValue(unsigned index) const 132 { 133 if (index >= attributeCount()) 134 return WebString(); 135 return constUnwrap<Element>()->attributeItem(index)->value(); 136 } 137 138 WebString WebElement::innerText() 139 { 140 return unwrap<Element>()->innerText(); 141 } 142 143 WebString WebElement::computeInheritedLanguage() const 144 { 145 return WebString(constUnwrap<Element>()->computeInheritedLanguage()); 146 } 147 148 void WebElement::requestFullScreen() 149 { 150 unwrap<Element>()->webkitRequestFullScreen(Element::ALLOW_KEYBOARD_INPUT); 151 } 152 153 WebRect WebElement::boundsInViewportSpace() 154 { 155 return unwrap<Element>()->boundsInRootViewSpace(); 156 } 157 158 WebImage WebElement::imageContents() 159 { 160 if (isNull()) 161 return WebImage(); 162 163 WebCore::Image* image = unwrap<Element>()->imageContents(); 164 if (!image) 165 return WebImage(); 166 167 RefPtr<NativeImageSkia> bitmap = image->nativeImageForCurrentFrame(); 168 if (!bitmap) 169 return WebImage(); 170 171 return bitmap->bitmap(); 172 } 173 174 WebElement::WebElement(const PassRefPtr<Element>& elem) 175 : WebNode(elem) 176 { 177 } 178 179 WebElement& WebElement::operator=(const PassRefPtr<Element>& elem) 180 { 181 m_private = elem; 182 return *this; 183 } 184 185 WebElement::operator PassRefPtr<Element>() const 186 { 187 return toElement(m_private.get()); 188 } 189 190 } // namespace blink 191