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

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

Issue 280123002: Oilpan: move LiveNodeList collections to the heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Pre-emptively GC a long runnning test Created 6 years, 7 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
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 522 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 } 533 }
534 534
535 void HTMLFormElement::didAssociateByParser() 535 void HTMLFormElement::didAssociateByParser()
536 { 536 {
537 if (!m_didFinishParsingChildren) 537 if (!m_didFinishParsingChildren)
538 return; 538 return;
539 m_hasElementsAssociatedByParser = true; 539 m_hasElementsAssociatedByParser = true;
540 UseCounter::count(document(), UseCounter::FormAssociationByParser); 540 UseCounter::count(document(), UseCounter::FormAssociationByParser);
541 } 541 }
542 542
543 PassRefPtr<HTMLCollection> HTMLFormElement::elements() 543 PassRefPtrWillBeRawPtr<HTMLCollection> HTMLFormElement::elements()
544 { 544 {
545 return ensureCachedHTMLCollection(FormControls); 545 return ensureCachedHTMLCollection(FormControls);
546 } 546 }
547 547
548 void HTMLFormElement::collectAssociatedElements(Node& root, FormAssociatedElemen t::List& elements) const 548 void HTMLFormElement::collectAssociatedElements(Node& root, FormAssociatedElemen t::List& elements) const
549 { 549 {
550 elements.clear(); 550 elements.clear();
551 for (HTMLElement* element = Traversal<HTMLElement>::firstWithin(root); eleme nt; element = Traversal<HTMLElement>::next(*element)) { 551 for (HTMLElement* element = Traversal<HTMLElement>::firstWithin(root); eleme nt; element = Traversal<HTMLElement>::next(*element)) {
552 FormAssociatedElement* associatedElement = 0; 552 FormAssociatedElement* associatedElement = 0;
553 if (element->isFormControlElement()) 553 if (element->isFormControlElement())
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 return; 710 return;
711 PastNamesMap::iterator end = m_pastNamesMap->end(); 711 PastNamesMap::iterator end = m_pastNamesMap->end();
712 for (PastNamesMap::iterator it = m_pastNamesMap->begin(); it != end; ++it) { 712 for (PastNamesMap::iterator it = m_pastNamesMap->begin(); it != end; ++it) {
713 if (it->value.get() == &element) { 713 if (it->value.get() == &element) {
714 it->value = nullptr; 714 it->value = nullptr;
715 // Keep looping. Single element can have multiple names. 715 // Keep looping. Single element can have multiple names.
716 } 716 }
717 } 717 }
718 } 718 }
719 719
720 void HTMLFormElement::getNamedElements(const AtomicString& name, Vector<RefPtr<E lement> >& namedItems) 720 void HTMLFormElement::getNamedElements(const AtomicString& name, WillBeHeapVecto r<RefPtrWillBeMember<Element> >& namedItems)
721 { 721 {
722 // http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#do m-form-nameditem 722 // http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#do m-form-nameditem
723 elements()->namedItems(name, namedItems); 723 elements()->namedItems(name, namedItems);
724 724
725 Element* elementFromPast = elementFromPastNamesMap(name); 725 Element* elementFromPast = elementFromPastNamesMap(name);
726 if (namedItems.size() && namedItems.first() != elementFromPast) { 726 if (namedItems.size() && namedItems.first() != elementFromPast) {
727 addToPastNamesMap(namedItems.first().get(), name); 727 addToPastNamesMap(namedItems.first().get(), name);
728 } else if (elementFromPast && namedItems.isEmpty()) { 728 } else if (elementFromPast && namedItems.isEmpty()) {
729 namedItems.append(elementFromPast); 729 namedItems.append(elementFromPast);
730 UseCounter::count(document(), UseCounter::FormNameAccessForPastNamesMap) ; 730 UseCounter::count(document(), UseCounter::FormNameAccessForPastNamesMap) ;
(...skipping 11 matching lines...) Expand all
742 document().formController().restoreControlStateIn(*this); 742 document().formController().restoreControlStateIn(*this);
743 m_didFinishParsingChildren = true; 743 m_didFinishParsingChildren = true;
744 } 744 }
745 745
746 void HTMLFormElement::copyNonAttributePropertiesFromElement(const Element& sourc e) 746 void HTMLFormElement::copyNonAttributePropertiesFromElement(const Element& sourc e)
747 { 747 {
748 m_wasDemoted = static_cast<const HTMLFormElement&>(source).m_wasDemoted; 748 m_wasDemoted = static_cast<const HTMLFormElement&>(source).m_wasDemoted;
749 HTMLElement::copyNonAttributePropertiesFromElement(source); 749 HTMLElement::copyNonAttributePropertiesFromElement(source);
750 } 750 }
751 751
752 void HTMLFormElement::anonymousNamedGetter(const AtomicString& name, bool& retur nValue0Enabled, RefPtr<RadioNodeList>& returnValue0, bool& returnValue1Enabled, RefPtr<Element>& returnValue1) 752 void HTMLFormElement::anonymousNamedGetter(const AtomicString& name, bool& retur nValue0Enabled, RefPtrWillBeRawPtr<RadioNodeList>& returnValue0, bool& returnVal ue1Enabled, RefPtr<Element>& returnValue1)
753 { 753 {
754 // Call getNamedElements twice, first time check if it has a value 754 // Call getNamedElements twice, first time check if it has a value
755 // and let HTMLFormElement update its cache. 755 // and let HTMLFormElement update its cache.
756 // See issue: 867404 756 // See issue: 867404
757 { 757 {
758 Vector<RefPtr<Element> > elements; 758 WillBeHeapVector<RefPtrWillBeMember<Element> > elements;
759 getNamedElements(name, elements); 759 getNamedElements(name, elements);
760 if (elements.isEmpty()) 760 if (elements.isEmpty())
761 return; 761 return;
762 } 762 }
763 763
764 // Second call may return different results from the first call, 764 // Second call may return different results from the first call,
765 // but if the first the size cannot be zero. 765 // but if the first the size cannot be zero.
766 Vector<RefPtr<Element> > elements; 766 WillBeHeapVector<RefPtrWillBeMember<Element> > elements;
767 getNamedElements(name, elements); 767 getNamedElements(name, elements);
768 ASSERT(!elements.isEmpty()); 768 ASSERT(!elements.isEmpty());
769 769
770 if (elements.size() == 1) { 770 if (elements.size() == 1) {
771 returnValue1Enabled = true; 771 returnValue1Enabled = true;
772 #if ENABLE(OILPAN)
773 // FIXME: Oilpan: remove once Element becomes [GarbageCollected].
774 returnValue1 = PassRefPtr<Element>(elements.at(0).get());
775 #else
772 returnValue1 = elements.at(0); 776 returnValue1 = elements.at(0);
777 #endif
773 return; 778 return;
774 } 779 }
775 780
776 bool onlyMatchImg = !elements.isEmpty() && isHTMLImageElement(*elements.firs t()); 781 bool onlyMatchImg = !elements.isEmpty() && isHTMLImageElement(*elements.firs t());
777 returnValue0Enabled = true; 782 returnValue0Enabled = true;
778 returnValue0 = radioNodeList(name, onlyMatchImg); 783 returnValue0 = radioNodeList(name, onlyMatchImg);
779 } 784 }
780 785
781 void HTMLFormElement::setDemoted(bool demoted) 786 void HTMLFormElement::setDemoted(bool demoted)
782 { 787 {
783 if (demoted) 788 if (demoted)
784 UseCounter::count(document(), UseCounter::DemotedFormElement); 789 UseCounter::count(document(), UseCounter::DemotedFormElement);
785 m_wasDemoted = demoted; 790 m_wasDemoted = demoted;
786 } 791 }
787 792
788 } // namespace 793 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698