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 "DOMUtilitiesPrivate.h" 33 34 #include "Element.h" 35 #include "HTMLInputElement.h" 36 #include "HTMLLinkElement.h" 37 #include "HTMLMetaElement.h" 38 #include "HTMLNames.h" 39 #include "HTMLOptionElement.h" 40 #include "Node.h" 41 42 using namespace WebCore; 43 44 namespace { 45 46 template <class HTMLNodeType> 47 HTMLNodeType* toHTMLElement(Node* node, const QualifiedName& name) 48 { 49 if (node->isHTMLElement() 50 && static_cast<HTMLElement*>(node)->hasTagName(name)) { 51 return static_cast<HTMLNodeType*>(node); 52 } 53 return 0; 54 } 55 56 } // namespace 57 58 namespace WebKit { 59 60 HTMLInputElement* toHTMLInputElement(Node* node) 61 { 62 return toHTMLElement<HTMLInputElement>(node, HTMLNames::inputTag); 63 } 64 65 HTMLLinkElement* toHTMLLinkElement(Node* node) 66 { 67 return toHTMLElement<HTMLLinkElement>(node, HTMLNames::linkTag); 68 } 69 70 HTMLMetaElement* toHTMLMetaElement(Node* node) 71 { 72 return toHTMLElement<HTMLMetaElement>(node, HTMLNames::metaTag); 73 } 74 75 HTMLOptionElement* toHTMLOptionElement(Node* node) 76 { 77 return toHTMLElement<HTMLOptionElement>(node, HTMLNames::optionTag); 78 } 79 80 bool elementHasLegalLinkAttribute(const Element* element, 81 const QualifiedName& attrName) 82 { 83 if (attrName == HTMLNames::srcAttr) { 84 // Check src attribute. 85 if (element->hasTagName(HTMLNames::imgTag) 86 || element->hasTagName(HTMLNames::scriptTag) 87 || element->hasTagName(HTMLNames::iframeTag) 88 || element->hasTagName(HTMLNames::frameTag)) 89 return true; 90 if (element->hasTagName(HTMLNames::inputTag)) { 91 const HTMLInputElement* input = 92 static_cast<const HTMLInputElement*>(element); 93 if (input->isImageButton()) 94 return true; 95 } 96 } else if (attrName == HTMLNames::hrefAttr) { 97 // Check href attribute. 98 if (element->hasTagName(HTMLNames::linkTag) 99 || element->hasTagName(HTMLNames::aTag) 100 || element->hasTagName(HTMLNames::areaTag)) 101 return true; 102 } else if (attrName == HTMLNames::actionAttr) { 103 if (element->hasTagName(HTMLNames::formTag)) 104 return true; 105 } else if (attrName == HTMLNames::backgroundAttr) { 106 if (element->hasTagName(HTMLNames::bodyTag) 107 || element->hasTagName(HTMLNames::tableTag) 108 || element->hasTagName(HTMLNames::trTag) 109 || element->hasTagName(HTMLNames::tdTag)) 110 return true; 111 } else if (attrName == HTMLNames::citeAttr) { 112 if (element->hasTagName(HTMLNames::blockquoteTag) 113 || element->hasTagName(HTMLNames::qTag) 114 || element->hasTagName(HTMLNames::delTag) 115 || element->hasTagName(HTMLNames::insTag)) 116 return true; 117 } else if (attrName == HTMLNames::classidAttr 118 || attrName == HTMLNames::dataAttr) { 119 if (element->hasTagName(HTMLNames::objectTag)) 120 return true; 121 } else if (attrName == HTMLNames::codebaseAttr) { 122 if (element->hasTagName(HTMLNames::objectTag) 123 || element->hasTagName(HTMLNames::appletTag)) 124 return true; 125 } 126 return false; 127 } 128 129 } // namespace WebKit 130