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 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. | 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. |
6 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 6 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 | 116 |
117 Node::InsertionNotificationRequest HTMLFormElement::insertedInto(ContainerNode*
insertionPoint) | 117 Node::InsertionNotificationRequest HTMLFormElement::insertedInto(ContainerNode*
insertionPoint) |
118 { | 118 { |
119 HTMLElement::insertedInto(insertionPoint); | 119 HTMLElement::insertedInto(insertionPoint); |
120 if (insertionPoint->inDocument()) | 120 if (insertionPoint->inDocument()) |
121 this->document().didAssociateFormControl(this); | 121 this->document().didAssociateFormControl(this); |
122 return InsertionDone; | 122 return InsertionDone; |
123 } | 123 } |
124 | 124 |
125 template<class T> | 125 template<class T> |
126 void notifyFormRemovedFromTree(const Vector<T*>& elements, Node* root) | 126 void notifyFormRemovedFromTree(const Vector<T*>& elements, Node& root) |
127 { | 127 { |
128 size_t size = elements.size(); | 128 size_t size = elements.size(); |
129 for (size_t i = 0; i < size; ++i) | 129 for (size_t i = 0; i < size; ++i) |
130 elements[i]->formRemovedFromTree(root); | 130 elements[i]->formRemovedFromTree(root); |
131 ASSERT(elements.size() == size); | 131 ASSERT(elements.size() == size); |
132 } | 132 } |
133 | 133 |
134 void HTMLFormElement::removedFrom(ContainerNode* insertionPoint) | 134 void HTMLFormElement::removedFrom(ContainerNode* insertionPoint) |
135 { | 135 { |
136 // We don't need to take care of form association by 'form' content | 136 // We don't need to take care of form association by 'form' content |
137 // attribute becuse IdTargetObserver handles it. | 137 // attribute becuse IdTargetObserver handles it. |
138 if (m_hasElementsAssociatedByParser) { | 138 if (m_hasElementsAssociatedByParser) { |
139 Node* root = highestAncestor(); | 139 Node& root = highestAncestor(); |
140 if (!m_associatedElementsAreDirty) { | 140 if (!m_associatedElementsAreDirty) { |
141 Vector<FormAssociatedElement*> elements(associatedElements()); | 141 Vector<FormAssociatedElement*> elements(associatedElements()); |
142 notifyFormRemovedFromTree(elements, root); | 142 notifyFormRemovedFromTree(elements, root); |
143 } else { | 143 } else { |
144 Vector<FormAssociatedElement*> elements; | 144 Vector<FormAssociatedElement*> elements; |
145 collectAssociatedElements(insertionPoint->highestAncestor(), element
s); | 145 collectAssociatedElements(insertionPoint->highestAncestor(), element
s); |
146 notifyFormRemovedFromTree(elements, root); | 146 notifyFormRemovedFromTree(elements, root); |
147 collectAssociatedElements(root, elements); | 147 collectAssociatedElements(root, elements); |
148 notifyFormRemovedFromTree(elements, root); | 148 notifyFormRemovedFromTree(elements, root); |
149 } | 149 } |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
567 return; | 567 return; |
568 m_hasElementsAssociatedByParser = true; | 568 m_hasElementsAssociatedByParser = true; |
569 UseCounter::count(document(), UseCounter::FormAssociationByParser); | 569 UseCounter::count(document(), UseCounter::FormAssociationByParser); |
570 } | 570 } |
571 | 571 |
572 PassRefPtr<HTMLCollection> HTMLFormElement::elements() | 572 PassRefPtr<HTMLCollection> HTMLFormElement::elements() |
573 { | 573 { |
574 return ensureCachedHTMLCollection(FormControls); | 574 return ensureCachedHTMLCollection(FormControls); |
575 } | 575 } |
576 | 576 |
577 void HTMLFormElement::collectAssociatedElements(Node* root, Vector<FormAssociate
dElement*>& elements) const | 577 void HTMLFormElement::collectAssociatedElements(Node& root, Vector<FormAssociate
dElement*>& elements) const |
578 { | 578 { |
579 elements.clear(); | 579 elements.clear(); |
580 for (Node* node = root; node; node = NodeTraversal::next(*node)) { | 580 for (Node* node = &root; node; node = NodeTraversal::next(*node)) { |
581 if (!node->isHTMLElement()) | 581 if (!node->isHTMLElement()) |
582 continue; | 582 continue; |
583 FormAssociatedElement* element = 0; | 583 FormAssociatedElement* element = 0; |
584 if (toElement(node)->isFormControlElement()) | 584 if (toElement(node)->isFormControlElement()) |
585 element = toHTMLFormControlElement(node); | 585 element = toHTMLFormControlElement(node); |
586 else if (node->hasTagName(objectTag)) | 586 else if (node->hasTagName(objectTag)) |
587 element = toHTMLObjectElement(node); | 587 element = toHTMLObjectElement(node); |
588 else | 588 else |
589 continue; | 589 continue; |
590 if (element->form()== this) | 590 if (element->form()== this) |
591 elements.append(element); | 591 elements.append(element); |
592 } | 592 } |
593 } | 593 } |
594 | 594 |
595 // This function should be const conceptually. However we update some fields | 595 // This function should be const conceptually. However we update some fields |
596 // because of lazy evaluation. | 596 // because of lazy evaluation. |
597 const Vector<FormAssociatedElement*>& HTMLFormElement::associatedElements() cons
t | 597 const Vector<FormAssociatedElement*>& HTMLFormElement::associatedElements() cons
t |
598 { | 598 { |
599 if (!m_associatedElementsAreDirty) | 599 if (!m_associatedElementsAreDirty) |
600 return m_associatedElements; | 600 return m_associatedElements; |
601 HTMLFormElement* mutableThis = const_cast<HTMLFormElement*>(this); | 601 HTMLFormElement* mutableThis = const_cast<HTMLFormElement*>(this); |
602 Node* scope = mutableThis; | 602 Node* scope = mutableThis; |
603 if (m_hasElementsAssociatedByParser) | 603 if (m_hasElementsAssociatedByParser) |
604 scope = highestAncestor(); | 604 scope = &highestAncestor(); |
605 if (inDocument() && treeScope().idTargetObserverRegistry().hasObservers(fast
GetAttribute(idAttr))) | 605 if (inDocument() && treeScope().idTargetObserverRegistry().hasObservers(fast
GetAttribute(idAttr))) |
606 scope = &treeScope().rootNode(); | 606 scope = &treeScope().rootNode(); |
607 collectAssociatedElements(scope, mutableThis->m_associatedElements); | 607 ASSERT(scope); |
| 608 collectAssociatedElements(*scope, mutableThis->m_associatedElements); |
608 mutableThis->m_associatedElementsAreDirty = false; | 609 mutableThis->m_associatedElementsAreDirty = false; |
609 return m_associatedElements; | 610 return m_associatedElements; |
610 } | 611 } |
611 | 612 |
612 void HTMLFormElement::collectImageElements(Node* root, Vector<HTMLImageElement*>
& elements) | 613 void HTMLFormElement::collectImageElements(Node& root, Vector<HTMLImageElement*>
& elements) |
613 { | 614 { |
614 elements.clear(); | 615 elements.clear(); |
615 for (Node* node = root; node; node = NodeTraversal::next(*node)) { | 616 for (Node* node = &root; node; node = NodeTraversal::next(*node)) { |
616 if (node->isHTMLElement() && node->hasTagName(imgTag) && toHTMLElement(n
ode)->formOwner() == this) | 617 if (node->isHTMLElement() && node->hasTagName(imgTag) && toHTMLElement(n
ode)->formOwner() == this) |
617 elements.append(toHTMLImageElement(node)); | 618 elements.append(toHTMLImageElement(node)); |
618 } | 619 } |
619 } | 620 } |
620 | 621 |
621 const Vector<HTMLImageElement*>& HTMLFormElement::imageElements() | 622 const Vector<HTMLImageElement*>& HTMLFormElement::imageElements() |
622 { | 623 { |
623 if (!m_imageElementsAreDirty) | 624 if (!m_imageElementsAreDirty) |
624 return m_imageElements; | 625 return m_imageElements; |
625 collectImageElements(m_hasElementsAssociatedByParser ? highestAncestor() : t
his, m_imageElements); | 626 collectImageElements(m_hasElementsAssociatedByParser ? highestAncestor() : *
this, m_imageElements); |
626 m_imageElementsAreDirty = false; | 627 m_imageElementsAreDirty = false; |
627 return m_imageElements; | 628 return m_imageElements; |
628 } | 629 } |
629 | 630 |
630 String HTMLFormElement::name() const | 631 String HTMLFormElement::name() const |
631 { | 632 { |
632 return getNameAttribute(); | 633 return getNameAttribute(); |
633 } | 634 } |
634 | 635 |
635 bool HTMLFormElement::noValidate() const | 636 bool HTMLFormElement::noValidate() const |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
815 } | 816 } |
816 | 817 |
817 void HTMLFormElement::setDemoted(bool demoted) | 818 void HTMLFormElement::setDemoted(bool demoted) |
818 { | 819 { |
819 if (demoted) | 820 if (demoted) |
820 UseCounter::count(document(), UseCounter::DemotedFormElement); | 821 UseCounter::count(document(), UseCounter::DemotedFormElement); |
821 m_wasDemoted = demoted; | 822 m_wasDemoted = demoted; |
822 } | 823 } |
823 | 824 |
824 } // namespace | 825 } // namespace |
OLD | NEW |