1/* 2 * Copyright (c) 2012 Motorola Mobility, Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without modification, 5 * are permitted provided that the following conditions are met: 6 * 7 * Redistributions of source code must retain the above copyright notice, 8 * this list of conditions and the following disclaimer. 9 * 10 * Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation and/or 12 * other materials provided with the distribution. 13 * 14 * Neither the name of Motorola Mobility, Inc. nor the names of its contributors may 15 * be used to endorse or promote products derived from this software without 16 * 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 LIMITED TO, 20 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 26 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31#include "config.h" 32 33#if ENABLE(MICRODATA) 34#include "PropertyNodeList.h" 35 36#include "DOMSettableTokenList.h" 37#include "DOMStringList.h" 38#include "HTMLElement.h" 39#include "HTMLNames.h" 40#include "NodeRareData.h" 41 42namespace WebCore { 43 44using namespace HTMLNames; 45 46PropertyNodeList::PropertyNodeList(Node* rootNode, const String& name) 47 : LiveNodeList(rootNode, PropertyNodeListType, InvalidateOnItemAttrChange, NodeListIsRootedAtDocumentIfOwnerHasItemrefAttr) 48 , m_name(name) 49{ 50} 51 52PropertyNodeList::~PropertyNodeList() 53{ 54 ownerNode()->nodeLists()->removeCacheWithName(this, PropertyNodeListType, m_name); 55} 56 57bool PropertyNodeList::elementIsPropertyOfRefElement(const Node* testElement, const Node *refElement) const 58{ 59 for (const ContainerNode* node = testElement->parentNode(); node; node = node->parentNode()) { 60 if (node->isHTMLElement() && toHTMLElement(node)->fastHasAttribute(itemscopeAttr) && node != ownerNode()) 61 return false; 62 63 if (node == refElement) 64 return true; 65 } 66 return false; 67} 68 69void PropertyNodeList::updateRefElements() const 70{ 71 if (isItemRefElementsCacheValid()) 72 return; 73 74 m_itemRefElementsCache.clear(); 75 setItemRefElementsCacheValid(); 76 toHTMLElement(ownerNode())->getItemRefElements(m_itemRefElementsCache); 77} 78 79bool PropertyNodeList::nodeMatches(Element* testElement) const 80{ 81 if (!testElement->isHTMLElement() || !testElement->fastHasAttribute(itempropAttr) || testElement == ownerNode()) 82 return false; 83 84 for (unsigned i = 0; i < m_itemRefElementsCache.size(); ++i) { 85 if (testElement == m_itemRefElementsCache[i] || elementIsPropertyOfRefElement(testElement, m_itemRefElementsCache[i])) { 86 if (testElement->itemProp()->tokens().contains(m_name)) 87 return true; 88 } 89 } 90 91 return false; 92} 93 94PropertyValueArray PropertyNodeList::getValues() const 95{ 96 PropertyValueArray propertyValue; 97 98 for (unsigned offset = 0; Node* node = item(offset); ++offset) 99 propertyValue.append(toHTMLElement(node)->itemValue()); 100 101 return propertyValue; 102} 103 104} // namespace WebCore 105 106#endif // ENABLE(MICRODATA) 107