1/* 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 4 * Copyright (C) 2006, 2007, 2010 Apple Inc. All rights reserved. 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Library General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Library General Public License for more details. 15 * 16 * You should have received a copy of the GNU Library General Public License 17 * along with this library; see the file COPYING.LIB. If not, write to 18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 19 * Boston, MA 02110-1301, USA. 20 * 21 */ 22 23#include "config.h" 24#include "core/html/HTMLLIElement.h" 25 26#include "core/CSSPropertyNames.h" 27#include "core/CSSValueKeywords.h" 28#include "core/HTMLNames.h" 29#include "core/dom/NodeRenderingTraversal.h" 30#include "core/rendering/RenderListItem.h" 31 32namespace blink { 33 34using namespace HTMLNames; 35 36inline HTMLLIElement::HTMLLIElement(Document& document) 37 : HTMLElement(liTag, document) 38{ 39} 40 41DEFINE_NODE_FACTORY(HTMLLIElement) 42 43bool HTMLLIElement::isPresentationAttribute(const QualifiedName& name) const 44{ 45 if (name == typeAttr) 46 return true; 47 return HTMLElement::isPresentationAttribute(name); 48} 49 50void HTMLLIElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style) 51{ 52 if (name == typeAttr) { 53 if (value == "a") 54 addPropertyToPresentationAttributeStyle(style, CSSPropertyListStyleType, CSSValueLowerAlpha); 55 else if (value == "A") 56 addPropertyToPresentationAttributeStyle(style, CSSPropertyListStyleType, CSSValueUpperAlpha); 57 else if (value == "i") 58 addPropertyToPresentationAttributeStyle(style, CSSPropertyListStyleType, CSSValueLowerRoman); 59 else if (value == "I") 60 addPropertyToPresentationAttributeStyle(style, CSSPropertyListStyleType, CSSValueUpperRoman); 61 else if (value == "1") 62 addPropertyToPresentationAttributeStyle(style, CSSPropertyListStyleType, CSSValueDecimal); 63 else 64 addPropertyToPresentationAttributeStyle(style, CSSPropertyListStyleType, value); 65 } else 66 HTMLElement::collectStyleForPresentationAttribute(name, value, style); 67} 68 69void HTMLLIElement::parseAttribute(const QualifiedName& name, const AtomicString& value) 70{ 71 if (name == valueAttr) { 72 if (renderer() && renderer()->isListItem()) 73 parseValue(value); 74 } else 75 HTMLElement::parseAttribute(name, value); 76} 77 78void HTMLLIElement::attach(const AttachContext& context) 79{ 80 HTMLElement::attach(context); 81 82 if (renderer() && renderer()->isListItem()) { 83 RenderListItem* listItemRenderer = toRenderListItem(renderer()); 84 85 ASSERT(!document().childNeedsDistributionRecalc()); 86 87 // Find the enclosing list node. 88 Element* listNode = 0; 89 Element* current = this; 90 while (!listNode) { 91 current = NodeRenderingTraversal::parentElement(current); 92 if (!current) 93 break; 94 if (isHTMLUListElement(*current) || isHTMLOListElement(*current)) 95 listNode = current; 96 } 97 98 // If we are not in a list, tell the renderer so it can position us inside. 99 // We don't want to change our style to say "inside" since that would affect nested nodes. 100 if (!listNode) 101 listItemRenderer->setNotInList(true); 102 103 parseValue(fastGetAttribute(valueAttr)); 104 } 105} 106 107inline void HTMLLIElement::parseValue(const AtomicString& value) 108{ 109 ASSERT(renderer() && renderer()->isListItem()); 110 111 bool valueOK; 112 int requestedValue = value.toInt(&valueOK); 113 if (valueOK) 114 toRenderListItem(renderer())->setExplicitValue(requestedValue); 115 else 116 toRenderListItem(renderer())->clearExplicitValue(); 117} 118 119} 120