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

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

Issue 656723005: Use C++11 features in core/html (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: use nullptr Created 6 years, 1 month 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
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 * (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 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 } 163 }
164 HTMLElement::insertedInto(insertionPoint); 164 HTMLElement::insertedInto(insertionPoint);
165 if (insertionPoint->inDocument()) 165 if (insertionPoint->inDocument())
166 this->document().didAssociateFormControl(this); 166 this->document().didAssociateFormControl(this);
167 return InsertionDone; 167 return InsertionDone;
168 } 168 }
169 169
170 template<class T> 170 template<class T>
171 void notifyFormRemovedFromTree(const T& elements, Node& root) 171 void notifyFormRemovedFromTree(const T& elements, Node& root)
172 { 172 {
173 size_t size = elements.size(); 173 for (const auto& element : elements)
174 for (size_t i = 0; i < size; ++i) 174 element->formRemovedFromTree(root);
175 elements[i]->formRemovedFromTree(root);
176 ASSERT(elements.size() == size);
177 } 175 }
178 176
179 void HTMLFormElement::removedFrom(ContainerNode* insertionPoint) 177 void HTMLFormElement::removedFrom(ContainerNode* insertionPoint)
180 { 178 {
181 // We don't need to take care of form association by 'form' content 179 // We don't need to take care of form association by 'form' content
182 // attribute becuse IdTargetObserver handles it. 180 // attribute becuse IdTargetObserver handles it.
183 if (m_hasElementsAssociatedByParser) { 181 if (m_hasElementsAssociatedByParser) {
184 Node& root = NodeTraversal::highestAncestorOrSelf(*this); 182 Node& root = NodeTraversal::highestAncestorOrSelf(*this);
185 if (!m_associatedElementsAreDirty) { 183 if (!m_associatedElementsAreDirty) {
186 FormAssociatedElement::List elements(associatedElements()); 184 FormAssociatedElement::List elements(associatedElements());
187 notifyFormRemovedFromTree(elements, root); 185 notifyFormRemovedFromTree(elements, root);
188 } else { 186 } else {
189 FormAssociatedElement::List elements; 187 FormAssociatedElement::List elements;
190 collectAssociatedElements(NodeTraversal::highestAncestorOrSelf(*inse rtionPoint), elements); 188 collectAssociatedElements(NodeTraversal::highestAncestorOrSelf(*inse rtionPoint), elements);
191 notifyFormRemovedFromTree(elements, root); 189 notifyFormRemovedFromTree(elements, root);
192 collectAssociatedElements(root, elements); 190 collectAssociatedElements(root, elements);
193 notifyFormRemovedFromTree(elements, root); 191 notifyFormRemovedFromTree(elements, root);
194 } 192 }
195 193
196 if (!m_imageElementsAreDirty) { 194 if (!m_imageElementsAreDirty) {
197 WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement> > images(image Elements()); 195 WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement>> images(imageE lements());
198 notifyFormRemovedFromTree(images, root); 196 notifyFormRemovedFromTree(images, root);
199 } else { 197 } else {
200 WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement> > images; 198 WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement>> images;
201 collectImageElements(NodeTraversal::highestAncestorOrSelf(*insertion Point), images); 199 collectImageElements(NodeTraversal::highestAncestorOrSelf(*insertion Point), images);
202 notifyFormRemovedFromTree(images, root); 200 notifyFormRemovedFromTree(images, root);
203 collectImageElements(root, images); 201 collectImageElements(root, images);
204 notifyFormRemovedFromTree(images, root); 202 notifyFormRemovedFromTree(images, root);
205 } 203 }
206 } 204 }
207 #if ENABLE(OILPAN) 205 #if ENABLE(OILPAN)
208 document().formController().willDeleteForm(this); 206 document().formController().willDeleteForm(this);
209 #endif 207 #endif
210 HTMLElement::removedFrom(insertionPoint); 208 HTMLElement::removedFrom(insertionPoint);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 } 273 }
276 274
277 bool HTMLFormElement::validateInteractively() 275 bool HTMLFormElement::validateInteractively()
278 { 276 {
279 const FormAssociatedElement::List& elements = associatedElements(); 277 const FormAssociatedElement::List& elements = associatedElements();
280 for (unsigned i = 0; i < elements.size(); ++i) { 278 for (unsigned i = 0; i < elements.size(); ++i) {
281 if (elements[i]->isFormControlElement()) 279 if (elements[i]->isFormControlElement())
282 toHTMLFormControlElement(elements[i])->hideVisibleValidationMessage( ); 280 toHTMLFormControlElement(elements[i])->hideVisibleValidationMessage( );
283 } 281 }
284 282
285 WillBeHeapVector<RefPtrWillBeMember<HTMLFormControlElement> > unhandledInval idControls; 283 WillBeHeapVector<RefPtrWillBeMember<HTMLFormControlElement>> unhandledInvali dControls;
286 if (!checkInvalidControlsAndCollectUnhandled(&unhandledInvalidControls, Chec kValidityDispatchInvalidEvent)) 284 if (!checkInvalidControlsAndCollectUnhandled(&unhandledInvalidControls, Chec kValidityDispatchInvalidEvent))
287 return true; 285 return true;
288 // Because the form has invalid controls, we abort the form submission and 286 // Because the form has invalid controls, we abort the form submission and
289 // show a validation message on a focusable form control. 287 // show a validation message on a focusable form control.
290 288
291 // Needs to update layout now because we'd like to call isFocusable(), which 289 // Needs to update layout now because we'd like to call isFocusable(), which
292 // has !renderer()->needsLayout() assertion. 290 // has !renderer()->needsLayout() assertion.
293 document().updateLayoutIgnorePendingStylesheets(); 291 document().updateLayoutIgnorePendingStylesheets();
294 292
295 RefPtrWillBeRawPtr<HTMLFormElement> protector(this); 293 RefPtrWillBeRawPtr<HTMLFormElement> protector(this);
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 if (m_hasElementsAssociatedByParser) 638 if (m_hasElementsAssociatedByParser)
641 scope = &NodeTraversal::highestAncestorOrSelf(*mutableThis); 639 scope = &NodeTraversal::highestAncestorOrSelf(*mutableThis);
642 if (inDocument() && treeScope().idTargetObserverRegistry().hasObservers(fast GetAttribute(idAttr))) 640 if (inDocument() && treeScope().idTargetObserverRegistry().hasObservers(fast GetAttribute(idAttr)))
643 scope = &treeScope().rootNode(); 641 scope = &treeScope().rootNode();
644 ASSERT(scope); 642 ASSERT(scope);
645 collectAssociatedElements(*scope, mutableThis->m_associatedElements); 643 collectAssociatedElements(*scope, mutableThis->m_associatedElements);
646 mutableThis->m_associatedElementsAreDirty = false; 644 mutableThis->m_associatedElementsAreDirty = false;
647 return m_associatedElements; 645 return m_associatedElements;
648 } 646 }
649 647
650 void HTMLFormElement::collectImageElements(Node& root, WillBeHeapVector<RawPtrWi llBeMember<HTMLImageElement> >& elements) 648 void HTMLFormElement::collectImageElements(Node& root, WillBeHeapVector<RawPtrWi llBeMember<HTMLImageElement>>& elements)
651 { 649 {
652 elements.clear(); 650 elements.clear();
653 for (HTMLImageElement& image : Traversal<HTMLImageElement>::startsAfter(root )) { 651 for (HTMLImageElement& image : Traversal<HTMLImageElement>::startsAfter(root )) {
654 if (image.formOwner() == this) 652 if (image.formOwner() == this)
655 elements.append(&image); 653 elements.append(&image);
656 } 654 }
657 } 655 }
658 656
659 const WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement> >& HTMLFormElement:: imageElements() 657 const WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement>>& HTMLFormElement::i mageElements()
660 { 658 {
661 if (!m_imageElementsAreDirty) 659 if (!m_imageElementsAreDirty)
662 return m_imageElements; 660 return m_imageElements;
663 collectImageElements(m_hasElementsAssociatedByParser ? NodeTraversal::highes tAncestorOrSelf(*this) : *this, m_imageElements); 661 collectImageElements(m_hasElementsAssociatedByParser ? NodeTraversal::highes tAncestorOrSelf(*this) : *this, m_imageElements);
664 m_imageElementsAreDirty = false; 662 m_imageElementsAreDirty = false;
665 return m_imageElements; 663 return m_imageElements;
666 } 664 }
667 665
668 String HTMLFormElement::name() const 666 String HTMLFormElement::name() const
669 { 667 {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
724 // recalculate style only if it changed. 722 // recalculate style only if it changed.
725 pseudoStateChanged(CSSSelector::PseudoValid); 723 pseudoStateChanged(CSSSelector::PseudoValid);
726 pseudoStateChanged(CSSSelector::PseudoInvalid); 724 pseudoStateChanged(CSSSelector::PseudoInvalid);
727 } 725 }
728 726
729 bool HTMLFormElement::checkValidity() 727 bool HTMLFormElement::checkValidity()
730 { 728 {
731 return !checkInvalidControlsAndCollectUnhandled(0, CheckValidityDispatchInva lidEvent); 729 return !checkInvalidControlsAndCollectUnhandled(0, CheckValidityDispatchInva lidEvent);
732 } 730 }
733 731
734 bool HTMLFormElement::checkInvalidControlsAndCollectUnhandled(WillBeHeapVector<R efPtrWillBeMember<HTMLFormControlElement> >* unhandledInvalidControls, CheckVali dityEventBehavior eventBehavior) 732 bool HTMLFormElement::checkInvalidControlsAndCollectUnhandled(WillBeHeapVector<R efPtrWillBeMember<HTMLFormControlElement>>* unhandledInvalidControls, CheckValid ityEventBehavior eventBehavior)
735 { 733 {
736 RefPtrWillBeRawPtr<HTMLFormElement> protector(this); 734 RefPtrWillBeRawPtr<HTMLFormElement> protector(this);
737 // Copy associatedElements because event handlers called from 735 // Copy associatedElements because event handlers called from
738 // HTMLFormControlElement::checkValidity() might change associatedElements. 736 // HTMLFormControlElement::checkValidity() might change associatedElements.
739 const FormAssociatedElement::List& associatedElements = this->associatedElem ents(); 737 const FormAssociatedElement::List& associatedElements = this->associatedElem ents();
740 WillBeHeapVector<RefPtrWillBeMember<FormAssociatedElement> > elements; 738 WillBeHeapVector<RefPtrWillBeMember<FormAssociatedElement>> elements;
741 elements.reserveCapacity(associatedElements.size()); 739 elements.reserveCapacity(associatedElements.size());
742 for (unsigned i = 0; i < associatedElements.size(); ++i) 740 for (unsigned i = 0; i < associatedElements.size(); ++i)
743 elements.append(associatedElements[i]); 741 elements.append(associatedElements[i]);
744 bool hasInvalidControls = false; 742 bool hasInvalidControls = false;
745 for (unsigned i = 0; i < elements.size(); ++i) { 743 for (unsigned i = 0; i < elements.size(); ++i) {
746 if (elements[i]->form() == this && elements[i]->isFormControlElement()) { 744 if (elements[i]->form() == this && elements[i]->isFormControlElement()) {
747 HTMLFormControlElement* control = toHTMLFormControlElement(elements[ i].get()); 745 HTMLFormControlElement* control = toHTMLFormControlElement(elements[ i].get());
748 if (!control->checkValidity(unhandledInvalidControls, eventBehavior) && control->formOwner() == this) 746 if (!control->checkValidity(unhandledInvalidControls, eventBehavior) && control->formOwner() == this)
749 hasInvalidControls = true; 747 hasInvalidControls = true;
750 } 748 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 return; 781 return;
784 if (!m_pastNamesMap) 782 if (!m_pastNamesMap)
785 m_pastNamesMap = adoptPtrWillBeNoop(new PastNamesMap); 783 m_pastNamesMap = adoptPtrWillBeNoop(new PastNamesMap);
786 m_pastNamesMap->set(pastName, element); 784 m_pastNamesMap->set(pastName, element);
787 } 785 }
788 786
789 void HTMLFormElement::removeFromPastNamesMap(HTMLElement& element) 787 void HTMLFormElement::removeFromPastNamesMap(HTMLElement& element)
790 { 788 {
791 if (!m_pastNamesMap) 789 if (!m_pastNamesMap)
792 return; 790 return;
793 PastNamesMap::iterator end = m_pastNamesMap->end(); 791 for (auto& it : *m_pastNamesMap) {
794 for (PastNamesMap::iterator it = m_pastNamesMap->begin(); it != end; ++it) { 792 if (it.value == &element) {
795 if (it->value == &element) { 793 it.value = nullptr;
796 it->value = nullptr;
797 // Keep looping. Single element can have multiple names. 794 // Keep looping. Single element can have multiple names.
798 } 795 }
799 } 796 }
800 } 797 }
801 798
802 void HTMLFormElement::getNamedElements(const AtomicString& name, WillBeHeapVecto r<RefPtrWillBeMember<Element> >& namedItems) 799 void HTMLFormElement::getNamedElements(const AtomicString& name, WillBeHeapVecto r<RefPtrWillBeMember<Element>>& namedItems)
803 { 800 {
804 // http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#do m-form-nameditem 801 // http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#do m-form-nameditem
805 elements()->namedItems(name, namedItems); 802 elements()->namedItems(name, namedItems);
806 803
807 Element* elementFromPast = elementFromPastNamesMap(name); 804 Element* elementFromPast = elementFromPastNamesMap(name);
808 if (namedItems.size() && namedItems.first() != elementFromPast) { 805 if (namedItems.size() && namedItems.first() != elementFromPast) {
809 addToPastNamesMap(namedItems.first().get(), name); 806 addToPastNamesMap(namedItems.first().get(), name);
810 } else if (elementFromPast && namedItems.isEmpty()) { 807 } else if (elementFromPast && namedItems.isEmpty()) {
811 namedItems.append(elementFromPast); 808 namedItems.append(elementFromPast);
812 UseCounter::count(document(), UseCounter::FormNameAccessForPastNamesMap) ; 809 UseCounter::count(document(), UseCounter::FormNameAccessForPastNamesMap) ;
(...skipping 17 matching lines...) Expand all
830 m_wasDemoted = static_cast<const HTMLFormElement&>(source).m_wasDemoted; 827 m_wasDemoted = static_cast<const HTMLFormElement&>(source).m_wasDemoted;
831 HTMLElement::copyNonAttributePropertiesFromElement(source); 828 HTMLElement::copyNonAttributePropertiesFromElement(source);
832 } 829 }
833 830
834 void HTMLFormElement::anonymousNamedGetter(const AtomicString& name, RadioNodeLi stOrElement& returnValue) 831 void HTMLFormElement::anonymousNamedGetter(const AtomicString& name, RadioNodeLi stOrElement& returnValue)
835 { 832 {
836 // Call getNamedElements twice, first time check if it has a value 833 // Call getNamedElements twice, first time check if it has a value
837 // and let HTMLFormElement update its cache. 834 // and let HTMLFormElement update its cache.
838 // See issue: 867404 835 // See issue: 867404
839 { 836 {
840 WillBeHeapVector<RefPtrWillBeMember<Element> > elements; 837 WillBeHeapVector<RefPtrWillBeMember<Element>> elements;
841 getNamedElements(name, elements); 838 getNamedElements(name, elements);
842 if (elements.isEmpty()) 839 if (elements.isEmpty())
843 return; 840 return;
844 } 841 }
845 842
846 // Second call may return different results from the first call, 843 // Second call may return different results from the first call,
847 // but if the first the size cannot be zero. 844 // but if the first the size cannot be zero.
848 WillBeHeapVector<RefPtrWillBeMember<Element> > elements; 845 WillBeHeapVector<RefPtrWillBeMember<Element>> elements;
849 getNamedElements(name, elements); 846 getNamedElements(name, elements);
850 ASSERT(!elements.isEmpty()); 847 ASSERT(!elements.isEmpty());
851 848
852 if (elements.size() == 1) { 849 if (elements.size() == 1) {
853 returnValue.setElement(elements.at(0)); 850 returnValue.setElement(elements.at(0));
854 return; 851 return;
855 } 852 }
856 853
857 bool onlyMatchImg = !elements.isEmpty() && isHTMLImageElement(*elements.firs t()); 854 bool onlyMatchImg = !elements.isEmpty() && isHTMLImageElement(*elements.firs t());
858 returnValue.setRadioNodeList(radioNodeList(name, onlyMatchImg)); 855 returnValue.setRadioNodeList(radioNodeList(name, onlyMatchImg));
859 } 856 }
860 857
861 void HTMLFormElement::setDemoted(bool demoted) 858 void HTMLFormElement::setDemoted(bool demoted)
862 { 859 {
863 if (demoted) 860 if (demoted)
864 UseCounter::count(document(), UseCounter::DemotedFormElement); 861 UseCounter::count(document(), UseCounter::DemotedFormElement);
865 m_wasDemoted = demoted; 862 m_wasDemoted = demoted;
866 } 863 }
867 864
868 } // namespace 865 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698