| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2011, 2012 Apple Inc. All r
ights reserved. | 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2011, 2012 Apple Inc. All r
ights reserved. |
| 5 * Copyright (C) 2014 Samsung Electronics. All rights reserved. | 5 * Copyright (C) 2014 Samsung Electronics. All rights reserved. |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 break; | 157 break; |
| 158 } | 158 } |
| 159 ASSERT_NOT_REACHED(); | 159 ASSERT_NOT_REACHED(); |
| 160 return DoNotInvalidateOnAttributeChanges; | 160 return DoNotInvalidateOnAttributeChanges; |
| 161 } | 161 } |
| 162 | 162 |
| 163 HTMLCollection::HTMLCollection(ContainerNode* ownerNode, CollectionType type, It
emAfterOverrideType itemAfterOverrideType) | 163 HTMLCollection::HTMLCollection(ContainerNode* ownerNode, CollectionType type, It
emAfterOverrideType itemAfterOverrideType) |
| 164 : LiveNodeListBase(ownerNode, rootTypeFromCollectionType(type), invalidation
TypeExcludingIdAndNameAttributes(type), type) | 164 : LiveNodeListBase(ownerNode, rootTypeFromCollectionType(type), invalidation
TypeExcludingIdAndNameAttributes(type), type) |
| 165 , m_overridesItemAfter(itemAfterOverrideType == OverridesItemAfter) | 165 , m_overridesItemAfter(itemAfterOverrideType == OverridesItemAfter) |
| 166 , m_shouldOnlyIncludeDirectChildren(shouldTypeOnlyIncludeDirectChildren(type
)) | 166 , m_shouldOnlyIncludeDirectChildren(shouldTypeOnlyIncludeDirectChildren(type
)) |
| 167 , m_isNameCacheValid(false) | 167 , m_hasValidIdNameCache(false) |
| 168 { | 168 { |
| 169 ScriptWrappable::init(this); | 169 ScriptWrappable::init(this); |
| 170 } | 170 } |
| 171 | 171 |
| 172 PassRefPtr<HTMLCollection> HTMLCollection::create(ContainerNode* base, Collectio
nType type) | 172 PassRefPtr<HTMLCollection> HTMLCollection::create(ContainerNode* base, Collectio
nType type) |
| 173 { | 173 { |
| 174 return adoptRef(new HTMLCollection(base, type, DoesNotOverrideItemAfter)); | 174 return adoptRef(new HTMLCollection(base, type, DoesNotOverrideItemAfter)); |
| 175 } | 175 } |
| 176 | 176 |
| 177 HTMLCollection::~HTMLCollection() | 177 HTMLCollection::~HTMLCollection() |
| 178 { | 178 { |
| 179 if (hasValidIdNameCache()) |
| 180 unregisterIdNameCacheFromDocument(document()); |
| 179 // HTMLNameCollection, ClassCollection and TagCollection remove cache by the
mselves. | 181 // HTMLNameCollection, ClassCollection and TagCollection remove cache by the
mselves. |
| 180 if (type() != WindowNamedItems && type() != DocumentNamedItems && type() !=
ClassCollectionType | 182 if (type() != WindowNamedItems && type() != DocumentNamedItems && type() !=
ClassCollectionType |
| 181 && type() != HTMLTagCollectionType && type() != TagCollectionType) { | 183 && type() != HTMLTagCollectionType && type() != TagCollectionType) { |
| 182 ownerNode()->nodeLists()->removeCache(this, type()); | 184 ownerNode()->nodeLists()->removeCache(this, type()); |
| 183 } | 185 } |
| 184 } | 186 } |
| 185 | 187 |
| 186 void HTMLCollection::invalidateCache() const | 188 void HTMLCollection::invalidateCache(Document* oldDocument) const |
| 187 { | 189 { |
| 188 m_collectionIndexCache.invalidate(); | 190 m_collectionIndexCache.invalidate(); |
| 189 invalidateIdNameCacheMaps(); | 191 invalidateIdNameCacheMaps(oldDocument); |
| 190 } | 192 } |
| 191 | 193 |
| 192 template <class NodeListType> | 194 template <class NodeListType> |
| 193 inline bool isMatchingElement(const NodeListType&, const Element&); | 195 inline bool isMatchingElement(const NodeListType&, const Element&); |
| 194 | 196 |
| 195 template <> inline bool isMatchingElement(const HTMLCollection& htmlCollection,
const Element& element) | 197 template <> inline bool isMatchingElement(const HTMLCollection& htmlCollection,
const Element& element) |
| 196 { | 198 { |
| 197 CollectionType type = htmlCollection.type(); | 199 CollectionType type = htmlCollection.type(); |
| 198 | 200 |
| 199 // These collections apply to any kind of Elements, not just HTMLElements. | 201 // These collections apply to any kind of Elements, not just HTMLElements. |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 } | 471 } |
| 470 } | 472 } |
| 471 | 473 |
| 472 Element* HTMLCollection::namedItem(const AtomicString& name) const | 474 Element* HTMLCollection::namedItem(const AtomicString& name) const |
| 473 { | 475 { |
| 474 // http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/namedit
em.asp | 476 // http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/namedit
em.asp |
| 475 // This method first searches for an object with a matching id | 477 // This method first searches for an object with a matching id |
| 476 // attribute. If a match is not found, the method then searches for an | 478 // attribute. If a match is not found, the method then searches for an |
| 477 // object with a matching name attribute, but only on those elements | 479 // object with a matching name attribute, but only on those elements |
| 478 // that are allowed a name attribute. | 480 // that are allowed a name attribute. |
| 479 updateNameCache(); | 481 updateIdNameCache(); |
| 480 | 482 |
| 481 Vector<Element*>* idResults = idCache(name); | 483 Vector<Element*>* idResults = idCache(name); |
| 482 if (idResults && !idResults->isEmpty()) | 484 if (idResults && !idResults->isEmpty()) |
| 483 return idResults->first(); | 485 return idResults->first(); |
| 484 | 486 |
| 485 Vector<Element*>* nameResults = nameCache(name); | 487 Vector<Element*>* nameResults = nameCache(name); |
| 486 if (nameResults && !nameResults->isEmpty()) | 488 if (nameResults && !nameResults->isEmpty()) |
| 487 return nameResults->first(); | 489 return nameResults->first(); |
| 488 | 490 |
| 489 return 0; | 491 return 0; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 names.append(idAttribute); | 524 names.append(idAttribute); |
| 523 } | 525 } |
| 524 } | 526 } |
| 525 } | 527 } |
| 526 | 528 |
| 527 void HTMLCollection::namedPropertyEnumerator(Vector<String>& names, ExceptionSta
te&) | 529 void HTMLCollection::namedPropertyEnumerator(Vector<String>& names, ExceptionSta
te&) |
| 528 { | 530 { |
| 529 supportedPropertyNames(names); | 531 supportedPropertyNames(names); |
| 530 } | 532 } |
| 531 | 533 |
| 532 void HTMLCollection::updateNameCache() const | 534 void HTMLCollection::updateIdNameCache() const |
| 533 { | 535 { |
| 534 if (hasNameCache()) | 536 if (hasValidIdNameCache()) |
| 535 return; | 537 return; |
| 536 | 538 |
| 537 ContainerNode& root = rootNode(); | 539 ContainerNode& root = rootNode(); |
| 538 for (Element* element = traverseToFirstElement(root); element; element = tra
verseNextElement(*element, root)) { | 540 for (Element* element = traverseToFirstElement(root); element; element = tra
verseNextElement(*element, root)) { |
| 539 const AtomicString& idAttrVal = element->getIdAttribute(); | 541 const AtomicString& idAttrVal = element->getIdAttribute(); |
| 540 if (!idAttrVal.isEmpty()) | 542 if (!idAttrVal.isEmpty()) |
| 541 appendIdCache(idAttrVal, element); | 543 appendIdCache(idAttrVal, element); |
| 542 if (!element->isHTMLElement()) | 544 if (!element->isHTMLElement()) |
| 543 continue; | 545 continue; |
| 544 const AtomicString& nameAttrVal = element->getNameAttribute(); | 546 const AtomicString& nameAttrVal = element->getNameAttribute(); |
| 545 if (!nameAttrVal.isEmpty() && idAttrVal != nameAttrVal && (type() != Doc
All || nameShouldBeVisibleInDocumentAll(toHTMLElement(*element)))) | 547 if (!nameAttrVal.isEmpty() && idAttrVal != nameAttrVal && (type() != Doc
All || nameShouldBeVisibleInDocumentAll(toHTMLElement(*element)))) |
| 546 appendNameCache(nameAttrVal, element); | 548 appendNameCache(nameAttrVal, element); |
| 547 } | 549 } |
| 548 | 550 |
| 549 setHasNameCache(); | 551 setHasValidIdNameCache(); |
| 550 } | 552 } |
| 551 | 553 |
| 552 void HTMLCollection::namedItems(const AtomicString& name, Vector<RefPtr<Element>
>& result) const | 554 void HTMLCollection::namedItems(const AtomicString& name, Vector<RefPtr<Element>
>& result) const |
| 553 { | 555 { |
| 554 ASSERT(result.isEmpty()); | 556 ASSERT(result.isEmpty()); |
| 555 if (name.isEmpty()) | 557 if (name.isEmpty()) |
| 556 return; | 558 return; |
| 557 | 559 |
| 558 updateNameCache(); | 560 updateIdNameCache(); |
| 559 | 561 |
| 560 Vector<Element*>* idResults = idCache(name); | 562 Vector<Element*>* idResults = idCache(name); |
| 561 Vector<Element*>* nameResults = nameCache(name); | 563 Vector<Element*>* nameResults = nameCache(name); |
| 562 | 564 |
| 563 for (unsigned i = 0; idResults && i < idResults->size(); ++i) | 565 for (unsigned i = 0; idResults && i < idResults->size(); ++i) |
| 564 result.append(idResults->at(i)); | 566 result.append(idResults->at(i)); |
| 565 | 567 |
| 566 for (unsigned i = 0; nameResults && i < nameResults->size(); ++i) | 568 for (unsigned i = 0; nameResults && i < nameResults->size(); ++i) |
| 567 result.append(nameResults->at(i)); | 569 result.append(nameResults->at(i)); |
| 568 } | 570 } |
| 569 | 571 |
| 570 void HTMLCollection::append(NodeCacheMap& map, const AtomicString& key, Element*
element) | 572 void HTMLCollection::append(NodeCacheMap& map, const AtomicString& key, Element*
element) |
| 571 { | 573 { |
| 572 OwnPtr<Vector<Element*> >& vector = map.add(key.impl(), nullptr).iterator->v
alue; | 574 OwnPtr<Vector<Element*> >& vector = map.add(key.impl(), nullptr).iterator->v
alue; |
| 573 if (!vector) | 575 if (!vector) |
| 574 vector = adoptPtr(new Vector<Element*>); | 576 vector = adoptPtr(new Vector<Element*>); |
| 575 vector->append(element); | 577 vector->append(element); |
| 576 } | 578 } |
| 577 | 579 |
| 578 } // namespace WebCore | 580 } // namespace WebCore |
| OLD | NEW |