Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: Source/core/html/HTMLFormControlsCollection.cpp

Issue 113653006: Remove complexity related to m_cachedElementsArrayOffset from LiveNodeListBase (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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, 2010, 2011, 2012 Apple Inc. All r ights reserved. 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2010, 2011, 2012 Apple Inc. All r ights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 19 matching lines...) Expand all
30 30
31 namespace WebCore { 31 namespace WebCore {
32 32
33 using namespace HTMLNames; 33 using namespace HTMLNames;
34 34
35 // Since the collections are to be "live", we have to do the 35 // Since the collections are to be "live", we have to do the
36 // calculation every time if anything has changed. 36 // calculation every time if anything has changed.
37 37
38 HTMLFormControlsCollection::HTMLFormControlsCollection(Node* ownerNode) 38 HTMLFormControlsCollection::HTMLFormControlsCollection(Node* ownerNode)
39 : HTMLCollection(ownerNode, FormControls, OverridesItemAfter) 39 : HTMLCollection(ownerNode, FormControls, OverridesItemAfter)
40 , m_cachedElement(0)
41 , m_cachedElementOffsetInArray(0)
40 { 42 {
41 ASSERT(ownerNode->hasTagName(formTag) || ownerNode->hasTagName(fieldsetTag)) ; 43 ASSERT(ownerNode->hasTagName(formTag) || ownerNode->hasTagName(fieldsetTag)) ;
42 ScriptWrappable::init(this); 44 ScriptWrappable::init(this);
43 } 45 }
44 46
45 PassRefPtr<HTMLFormControlsCollection> HTMLFormControlsCollection::create(Node* ownerNode, CollectionType) 47 PassRefPtr<HTMLFormControlsCollection> HTMLFormControlsCollection::create(Node* ownerNode, CollectionType)
46 { 48 {
47 return adoptRef(new HTMLFormControlsCollection(ownerNode)); 49 return adoptRef(new HTMLFormControlsCollection(ownerNode));
48 } 50 }
49 51
50 HTMLFormControlsCollection::~HTMLFormControlsCollection() 52 HTMLFormControlsCollection::~HTMLFormControlsCollection()
51 { 53 {
52 } 54 }
53 55
54 const Vector<FormAssociatedElement*>& HTMLFormControlsCollection::formControlEle ments() const 56 const Vector<FormAssociatedElement*>& HTMLFormControlsCollection::formControlEle ments() const
55 { 57 {
56 ASSERT(ownerNode()); 58 ASSERT(ownerNode());
57 ASSERT(ownerNode()->hasTagName(formTag) || ownerNode()->hasTagName(fieldsetT ag)); 59 ASSERT(ownerNode()->hasTagName(formTag) || ownerNode()->hasTagName(fieldsetT ag));
58 if (ownerNode()->hasTagName(formTag)) 60 if (ownerNode()->hasTagName(formTag))
59 return toHTMLFormElement(ownerNode())->associatedElements(); 61 return toHTMLFormElement(ownerNode())->associatedElements();
60 return toHTMLFieldSetElement(ownerNode())->associatedElements(); 62 return toHTMLFieldSetElement(ownerNode())->associatedElements();
61 } 63 }
62 64
63 const Vector<HTMLImageElement*>& HTMLFormControlsCollection::formImageElements() const 65 const Vector<HTMLImageElement*>& HTMLFormControlsCollection::formImageElements() const
64 { 66 {
65 ASSERT(ownerNode()); 67 ASSERT(ownerNode());
66 return toHTMLFormElement(ownerNode())->imageElements(); 68 return toHTMLFormElement(ownerNode())->imageElements();
67 } 69 }
68 70
69 Element* HTMLFormControlsCollection::virtualItemAfter(unsigned& offset, Element* previousItem) const 71 static unsigned findFormAssociatedElement(const Vector<FormAssociatedElement*>& associatedElements, Element* element)
70 { 72 {
71 const Vector<FormAssociatedElement*>& elementsArray = formControlElements(); 73 unsigned i = 0;
72 if (previousItem) 74 for (; i < associatedElements.size(); ++i) {
73 offset++; 75 FormAssociatedElement* associatedElement = associatedElements[i];
74 while (offset < elementsArray.size()) { 76 if (associatedElement->isEnumeratable() && toHTMLElement(associatedEleme nt) == element)
75 FormAssociatedElement* element = elementsArray[offset]; 77 break;
76 if (element->isEnumeratable()) 78 }
77 return toHTMLElement(element); 79 return i;
78 offset++; 80 }
81
82 Element* HTMLFormControlsCollection::virtualItemAfter(Element* previous) const
83 {
84 const Vector<FormAssociatedElement*>& associatedElements = formControlElemen ts();
85 unsigned offset;
86 if (!previous)
87 offset = 0;
88 else if (m_cachedElement == previous)
89 offset = m_cachedElementOffsetInArray + 1;
90 else
91 offset = findFormAssociatedElement(associatedElements, previous) + 1;
92
93 for (unsigned i = offset; i < associatedElements.size(); ++i) {
94 FormAssociatedElement* associatedElement = associatedElements[i];
95 if (associatedElement->isEnumeratable()) {
96 m_cachedElement = toHTMLElement(associatedElement);
97 m_cachedElementOffsetInArray = i;
98 return m_cachedElement;
99 }
79 } 100 }
80 return 0; 101 return 0;
81 } 102 }
82 103
104 void HTMLFormControlsCollection::invalidateCache() const
105 {
106 HTMLCollection::invalidateCache();
107 m_cachedElement = 0;
108 m_cachedElementOffsetInArray = 0;
109 }
110
83 static HTMLElement* firstNamedItem(const Vector<FormAssociatedElement*>& element sArray, 111 static HTMLElement* firstNamedItem(const Vector<FormAssociatedElement*>& element sArray,
84 const Vector<HTMLImageElement*>* imageElementsArray, const QualifiedName& at trName, const String& name) 112 const Vector<HTMLImageElement*>* imageElementsArray, const QualifiedName& at trName, const String& name)
85 { 113 {
86 ASSERT(attrName == idAttr || attrName == nameAttr); 114 ASSERT(attrName == idAttr || attrName == nameAttr);
87 115
88 for (unsigned i = 0; i < elementsArray.size(); ++i) { 116 for (unsigned i = 0; i < elementsArray.size(); ++i) {
89 HTMLElement* element = toHTMLElement(elementsArray[i]); 117 HTMLElement* element = toHTMLElement(elementsArray[i]);
90 if (elementsArray[i]->isEnumeratable() && element->fastGetAttribute(attr Name) == name) 118 if (elementsArray[i]->isEnumeratable() && element->fastGetAttribute(attr Name) == name)
91 return element; 119 return element;
92 } 120 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 returnValue1Enabled = true; 199 returnValue1Enabled = true;
172 returnValue1 = namedItems.at(0); 200 returnValue1 = namedItems.at(0);
173 return; 201 return;
174 } 202 }
175 203
176 returnValue0Enabled = true; 204 returnValue0Enabled = true;
177 returnValue0 = this->ownerNode()->radioNodeList(name); 205 returnValue0 = this->ownerNode()->radioNodeList(name);
178 } 206 }
179 207
180 } 208 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698