Commit 94e553dd authored by tkent@chromium.org's avatar tkent@chromium.org

Oilpan: Prepare to move FormAssociatedElement to Oilpan heap, part 2.

Replace FormAssociatedElement raw pointers with Member<>.

- Make FormAttributeTargetObserver GarbageCollectedFinalized in order to make
  FormAttributeTargetObserver::m_element traceable.
- Define a typedef for
  WillBeHeapVector<RawPtrWillBeMember<FormAssociatedElement>>. The raw name is
  long and the type is used in many places.

BUG=357163

Review URL: https://codereview.chromium.org/270823004

git-svn-id: svn://svn.chromium.org/blink/trunk@173723 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 1d40fe81
......@@ -36,16 +36,18 @@ namespace WebCore {
using namespace HTMLNames;
class FormAttributeTargetObserver : public IdTargetObserver {
WTF_MAKE_FAST_ALLOCATED;
// FIXME: Oilpan: IdTargetObserver should be on-heap.
class FormAttributeTargetObserver : public NoBaseWillBeGarbageCollectedFinalized<FormAttributeTargetObserver>, public IdTargetObserver {
WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
public:
static PassOwnPtr<FormAttributeTargetObserver> create(const AtomicString& id, FormAssociatedElement*);
static PassOwnPtrWillBeRawPtr<FormAttributeTargetObserver> create(const AtomicString& id, FormAssociatedElement*);
void trace(Visitor* visitor) { visitor->trace(m_element); }
virtual void idTargetChanged() OVERRIDE;
private:
FormAttributeTargetObserver(const AtomicString& id, FormAssociatedElement*);
FormAssociatedElement* m_element;
RawPtrWillBeMember<FormAssociatedElement> m_element;
};
FormAssociatedElement::FormAssociatedElement()
......@@ -60,6 +62,7 @@ FormAssociatedElement::~FormAssociatedElement()
void FormAssociatedElement::trace(Visitor* visitor)
{
visitor->trace(m_formAttributeTargetObserver);
visitor->trace(m_form);
visitor->trace(m_validityState);
}
......@@ -267,7 +270,7 @@ void FormAssociatedElement::setCustomValidity(const String& error)
m_customValidationMessage = error;
}
void FormAssociatedElement::setFormAttributeTargetObserver(PassOwnPtr<FormAttributeTargetObserver> newObserver)
void FormAssociatedElement::setFormAttributeTargetObserver(PassOwnPtrWillBeRawPtr<FormAttributeTargetObserver> newObserver)
{
if (m_formAttributeTargetObserver)
m_formAttributeTargetObserver->unregister();
......@@ -324,9 +327,9 @@ HTMLElement& toHTMLElement(FormAssociatedElement& associatedElement)
return const_cast<HTMLElement&>(toHTMLElement(static_cast<const FormAssociatedElement&>(associatedElement)));
}
PassOwnPtr<FormAttributeTargetObserver> FormAttributeTargetObserver::create(const AtomicString& id, FormAssociatedElement* element)
PassOwnPtrWillBeRawPtr<FormAttributeTargetObserver> FormAttributeTargetObserver::create(const AtomicString& id, FormAssociatedElement* element)
{
return adoptPtr(new FormAttributeTargetObserver(id, element));
return adoptPtrWillBeNoop(new FormAttributeTargetObserver(id, element));
}
FormAttributeTargetObserver::FormAttributeTargetObserver(const AtomicString& id, FormAssociatedElement* element)
......
......@@ -90,6 +90,8 @@ public:
void formAttributeTargetChanged();
typedef WillBeHeapVector<RawPtrWillBeMember<FormAssociatedElement> > List;
protected:
FormAssociatedElement();
......@@ -118,10 +120,10 @@ private:
virtual void derefFormAssociatedElement() = 0;
#endif
void setFormAttributeTargetObserver(PassOwnPtr<FormAttributeTargetObserver>);
void setFormAttributeTargetObserver(PassOwnPtrWillBeRawPtr<FormAttributeTargetObserver>);
void resetFormAttributeTargetObserver();
OwnPtr<FormAttributeTargetObserver> m_formAttributeTargetObserver;
OwnPtrWillBeMember<FormAttributeTargetObserver> m_formAttributeTargetObserver;
#if ENABLE(OILPAN)
Member<HTMLFormElement> m_form;
#else
......
......@@ -49,6 +49,14 @@ PassRefPtrWillBeRawPtr<HTMLFieldSetElement> HTMLFieldSetElement::create(Document
return adoptRefWillBeRefCountedGarbageCollected(new HTMLFieldSetElement(document, form));
}
void HTMLFieldSetElement::trace(Visitor* visitor)
{
#if ENABLE(OILPAN)
visitor->trace(m_associatedElements);
#endif
HTMLFormControlElement::trace(visitor);
}
void HTMLFieldSetElement::invalidateDisabledStateUnder(Element& base)
{
for (Element* element = ElementTraversal::firstWithin(base); element; element = ElementTraversal::next(*element, &base)) {
......@@ -120,7 +128,7 @@ void HTMLFieldSetElement::refreshElementsIfNeeded() const
}
}
const Vector<FormAssociatedElement*>& HTMLFieldSetElement::associatedElements() const
const FormAssociatedElement::List& HTMLFieldSetElement::associatedElements() const
{
refreshElementsIfNeeded();
return m_associatedElements;
......
......@@ -34,11 +34,12 @@ class HTMLCollection;
class HTMLFieldSetElement FINAL : public HTMLFormControlElement {
public:
static PassRefPtrWillBeRawPtr<HTMLFieldSetElement> create(Document&, HTMLFormElement*);
virtual void trace(Visitor*) OVERRIDE;
HTMLLegendElement* legend() const;
PassRefPtr<HTMLCollection> elements();
const Vector<FormAssociatedElement*>& associatedElements() const;
const FormAssociatedElement::List& associatedElements() const;
protected:
virtual void disabledAttributeChanged() OVERRIDE;
......@@ -57,7 +58,7 @@ private:
static void invalidateDisabledStateUnder(Element&);
void refreshElementsIfNeeded() const;
mutable Vector<FormAssociatedElement*> m_associatedElements;
mutable FormAssociatedElement::List m_associatedElements;
// When dom tree is modified, we have to refresh the m_associatedElements array.
mutable uint64_t m_documentVersion;
};
......
......@@ -56,7 +56,7 @@ HTMLFormControlsCollection::~HTMLFormControlsCollection()
{
}
const Vector<FormAssociatedElement*>& HTMLFormControlsCollection::formControlElements() const
const FormAssociatedElement::List& HTMLFormControlsCollection::formControlElements() const
{
ASSERT(isHTMLFormElement(ownerNode()) || isHTMLFieldSetElement(ownerNode()));
if (isHTMLFormElement(ownerNode()))
......@@ -69,7 +69,7 @@ const Vector<HTMLImageElement*>& HTMLFormControlsCollection::formImageElements()
return toHTMLFormElement(ownerNode()).imageElements();
}
static unsigned findFormAssociatedElement(const Vector<FormAssociatedElement*>& associatedElements, Element* element)
static unsigned findFormAssociatedElement(const FormAssociatedElement::List& associatedElements, Element* element)
{
unsigned i = 0;
for (; i < associatedElements.size(); ++i) {
......@@ -82,7 +82,7 @@ static unsigned findFormAssociatedElement(const Vector<FormAssociatedElement*>&
Element* HTMLFormControlsCollection::virtualItemAfter(Element* previous) const
{
const Vector<FormAssociatedElement*>& associatedElements = formControlElements();
const FormAssociatedElement::List& associatedElements = formControlElements();
unsigned offset;
if (!previous)
offset = 0;
......@@ -109,7 +109,7 @@ void HTMLFormControlsCollection::invalidateCache(Document* oldDocument) const
m_cachedElementOffsetInArray = 0;
}
static HTMLElement* firstNamedItem(const Vector<FormAssociatedElement*>& elementsArray,
static HTMLElement* firstNamedItem(const FormAssociatedElement::List& elementsArray,
const Vector<HTMLImageElement*>* imageElementsArray, const QualifiedName& attrName, const String& name)
{
ASSERT(attrName == idAttr || attrName == nameAttr);
......@@ -156,7 +156,7 @@ void HTMLFormControlsCollection::updateIdNameCache() const
OwnPtr<NamedItemCache> cache = NamedItemCache::create();
HashSet<StringImpl*> foundInputElements;
const Vector<FormAssociatedElement*>& elementsArray = formControlElements();
const FormAssociatedElement::List& elementsArray = formControlElements();
for (unsigned i = 0; i < elementsArray.size(); ++i) {
FormAssociatedElement* associatedElement = elementsArray[i];
......
......@@ -24,12 +24,12 @@
#ifndef HTMLFormControlsCollection_h
#define HTMLFormControlsCollection_h
#include "core/html/FormAssociatedElement.h"
#include "core/html/HTMLCollection.h"
#include "core/html/RadioNodeList.h"
namespace WebCore {
class FormAssociatedElement;
class HTMLElement;
class HTMLImageElement;
class QualifiedName;
......@@ -52,7 +52,7 @@ private:
virtual void updateIdNameCache() const OVERRIDE;
virtual void supportedPropertyNames(Vector<String>& names) OVERRIDE;
const Vector<FormAssociatedElement*>& formControlElements() const;
const FormAssociatedElement::List& formControlElements() const;
const Vector<HTMLImageElement*>& formImageElements() const;
virtual Element* virtualItemAfter(Element*) const OVERRIDE;
virtual void invalidateCache(Document* oldDocument = 0) const OVERRIDE;
......
......@@ -91,6 +91,14 @@ HTMLFormElement::~HTMLFormElement()
#endif
}
void HTMLFormElement::trace(Visitor* visitor)
{
#if ENABLE(OILPAN)
visitor->trace(m_associatedElements);
#endif
HTMLElement::trace(visitor);
}
bool HTMLFormElement::rendererIsNeeded(const RenderStyle& style)
{
if (!m_wasDemoted)
......@@ -129,7 +137,7 @@ Node::InsertionNotificationRequest HTMLFormElement::insertedInto(ContainerNode*
}
template<class T>
void notifyFormRemovedFromTree(const Vector<T*>& elements, Node& root)
void notifyFormRemovedFromTree(const T& elements, Node& root)
{
size_t size = elements.size();
for (size_t i = 0; i < size; ++i)
......@@ -144,10 +152,10 @@ void HTMLFormElement::removedFrom(ContainerNode* insertionPoint)
if (m_hasElementsAssociatedByParser) {
Node& root = highestAncestorOrSelf();
if (!m_associatedElementsAreDirty) {
Vector<FormAssociatedElement*> elements(associatedElements());
FormAssociatedElement::List elements(associatedElements());
notifyFormRemovedFromTree(elements, root);
} else {
Vector<FormAssociatedElement*> elements;
FormAssociatedElement::List elements;
collectAssociatedElements(insertionPoint->highestAncestorOrSelf(), elements);
notifyFormRemovedFromTree(elements, root);
collectAssociatedElements(root, elements);
......@@ -183,7 +191,7 @@ void HTMLFormElement::handleLocalEvents(Event* event)
unsigned HTMLFormElement::length() const
{
const Vector<FormAssociatedElement*>& elements = associatedElements();
const FormAssociatedElement::List& elements = associatedElements();
unsigned len = 0;
for (unsigned i = 0; i < elements.size(); ++i) {
if (elements[i]->isEnumeratable())
......@@ -201,7 +209,7 @@ void HTMLFormElement::submitImplicitly(Event* event, bool fromImplicitSubmission
{
int submissionTriggerCount = 0;
bool seenDefaultButton = false;
const Vector<FormAssociatedElement*>& elements = associatedElements();
const FormAssociatedElement::List& elements = associatedElements();
for (unsigned i = 0; i < elements.size(); ++i) {
FormAssociatedElement* formAssociatedElement = elements[i];
if (!formAssociatedElement->isFormControlElement())
......@@ -245,7 +253,7 @@ bool HTMLFormElement::validateInteractively(Event* event)
if (submitElement && submitElement->formNoValidate())
return true;
const Vector<FormAssociatedElement*>& elements = associatedElements();
const FormAssociatedElement::List& elements = associatedElements();
for (unsigned i = 0; i < elements.size(); ++i) {
if (elements[i]->isFormControlElement())
toHTMLFormControlElement(elements[i])->hideVisibleValidationMessage();
......@@ -338,7 +346,7 @@ void HTMLFormElement::submit(Event* event, bool activateSubmitButton, bool proce
RefPtrWillBeRawPtr<HTMLFormControlElement> firstSuccessfulSubmitButton = nullptr;
bool needButtonActivation = activateSubmitButton; // do we need to activate a submit button?
const Vector<FormAssociatedElement*>& elements = associatedElements();
const FormAssociatedElement::List& elements = associatedElements();
for (unsigned i = 0; i < elements.size(); ++i) {
FormAssociatedElement* associatedElement = elements[i];
if (!associatedElement->isFormControlElement())
......@@ -416,7 +424,7 @@ void HTMLFormElement::reset()
return;
}
const Vector<FormAssociatedElement*>& elements = associatedElements();
const FormAssociatedElement::List& elements = associatedElements();
for (unsigned i = 0; i < elements.size(); ++i) {
if (elements[i]->isFormControlElement())
toHTMLFormControlElement(elements[i])->reset();
......@@ -536,7 +544,7 @@ PassRefPtr<HTMLCollection> HTMLFormElement::elements()
return ensureCachedHTMLCollection(FormControls);
}
void HTMLFormElement::collectAssociatedElements(Node& root, Vector<FormAssociatedElement*>& elements) const
void HTMLFormElement::collectAssociatedElements(Node& root, FormAssociatedElement::List& elements) const
{
elements.clear();
for (HTMLElement* element = Traversal<HTMLElement>::firstWithin(root); element; element = Traversal<HTMLElement>::next(*element)) {
......@@ -554,7 +562,7 @@ void HTMLFormElement::collectAssociatedElements(Node& root, Vector<FormAssociate
// This function should be const conceptually. However we update some fields
// because of lazy evaluation.
const Vector<FormAssociatedElement*>& HTMLFormElement::associatedElements() const
const FormAssociatedElement::List& HTMLFormElement::associatedElements() const
{
if (!m_associatedElementsAreDirty)
return m_associatedElements;
......@@ -628,7 +636,7 @@ bool HTMLFormElement::wasUserSubmitted() const
HTMLFormControlElement* HTMLFormElement::defaultButton() const
{
const Vector<FormAssociatedElement*>& elements = associatedElements();
const FormAssociatedElement::List& elements = associatedElements();
for (unsigned i = 0; i < elements.size(); ++i) {
if (!elements[i]->isFormControlElement())
continue;
......@@ -650,7 +658,7 @@ bool HTMLFormElement::checkInvalidControlsAndCollectUnhandled(WillBeHeapVector<R
RefPtr<HTMLFormElement> protector(this);
// Copy associatedElements because event handlers called from
// HTMLFormControlElement::checkValidity() might change associatedElements.
const Vector<FormAssociatedElement*>& associatedElements = this->associatedElements();
const FormAssociatedElement::List& associatedElements = this->associatedElements();
WillBeHeapVector<RefPtrWillBeMember<FormAssociatedElement> > elements;
elements.reserveCapacity(associatedElements.size());
for (unsigned i = 0; i < associatedElements.size(); ++i)
......
......@@ -49,6 +49,7 @@ class HTMLFormElement FINAL : public HTMLElement {
public:
static PassRefPtrWillBeRawPtr<HTMLFormElement> create(Document&);
virtual ~HTMLFormElement();
virtual void trace(Visitor*) OVERRIDE;
PassRefPtr<HTMLCollection> elements();
void getNamedElements(const AtomicString&, Vector<RefPtr<Element> >&);
......@@ -110,7 +111,7 @@ public:
RadioButtonGroupScope& radioButtonGroupScope() { return m_radioButtonGroupScope; }
const Vector<FormAssociatedElement*>& associatedElements() const;
const FormAssociatedElement::List& associatedElements() const;
const Vector<HTMLImageElement*>& imageElements();
void anonymousNamedGetter(const AtomicString& name, bool&, RefPtr<RadioNodeList>&, bool&, RefPtr<Element>&);
......@@ -138,7 +139,7 @@ private:
void scheduleFormSubmission(PassRefPtr<FormSubmission>);
void collectAssociatedElements(Node& root, Vector<FormAssociatedElement*>&) const;
void collectAssociatedElements(Node& root, FormAssociatedElement::List&) const;
void collectImageElements(Node& root, Vector<HTMLImageElement*>&);
// Returns true if the submission should proceed.
......@@ -161,8 +162,7 @@ private:
RadioButtonGroupScope m_radioButtonGroupScope;
// Do not access m_associatedElements directly. Use associatedElements() instead.
// FIXME: Oilpan: m_associatedElements should be HeapVector<Member<>>.
Vector<FormAssociatedElement*> m_associatedElements;
FormAssociatedElement::List m_associatedElements;
// Do not access m_imageElements directly. Use imageElements() instead.
Vector<HTMLImageElement*> m_imageElements;
WeakPtrFactory<HTMLFormElement> m_weakPtrFactory;
......
......@@ -310,7 +310,7 @@ static inline void recordFormStructure(const HTMLFormElement& form, StringBuilde
{
// 2 is enough to distinguish forms in webkit.org/b/91209#c0
const size_t namedControlsToBeRecorded = 2;
const Vector<FormAssociatedElement*>& controls = form.associatedElements();
const FormAssociatedElement::List& controls = form.associatedElements();
builder.append(" [");
for (size_t i = 0, namedControls = 0; i < controls.size() && namedControls < namedControlsToBeRecorded; ++i) {
if (!controls[i]->isFormControlElementWithState())
......@@ -521,7 +521,7 @@ void FormController::restoreControlStateFor(HTMLFormControlElementWithState& con
void FormController::restoreControlStateIn(HTMLFormElement& form)
{
const Vector<FormAssociatedElement*>& elements = form.associatedElements();
const FormAssociatedElement::List& elements = form.associatedElements();
for (size_t i = 0; i < elements.size(); ++i) {
if (!elements[i]->isFormControlElementWithState())
continue;
......
......@@ -98,8 +98,8 @@ void WebFormElement::getFormControlElements(WebVector<WebFormControlElement>& re
const HTMLFormElement* form = constUnwrap<HTMLFormElement>();
Vector<WebFormControlElement> formControlElements;
const Vector<FormAssociatedElement*>& associatedElements = form->associatedElements();
for (Vector<FormAssociatedElement*>::const_iterator it = associatedElements.begin(); it != associatedElements.end(); ++it) {
const FormAssociatedElement::List& associatedElements = form->associatedElements();
for (FormAssociatedElement::List::const_iterator it = associatedElements.begin(); it != associatedElements.end(); ++it) {
if ((*it)->isFormControlElement())
formControlElements.append(toHTMLFormControlElement(*it));
}
......
......@@ -80,8 +80,8 @@ bool IsHTTPFormSubmit(const HTMLFormElement* form)
HTMLFormControlElement* GetButtonToActivate(HTMLFormElement* form)
{
HTMLFormControlElement* firstSubmitButton = 0;
const Vector<FormAssociatedElement*>& element = form->associatedElements();
for (Vector<FormAssociatedElement*>::const_iterator i(element.begin()); i != element.end(); ++i) {
const FormAssociatedElement::List& element = form->associatedElements();
for (FormAssociatedElement::List::const_iterator i(element.begin()); i != element.end(); ++i) {
if (!(*i)->isFormControlElement())
continue;
HTMLFormControlElement* control = toHTMLFormControlElement(*i);
......@@ -155,8 +155,8 @@ bool IsInDefaultState(HTMLFormControlElement* formElement)
HTMLInputElement* findSuitableSearchInputElement(const HTMLFormElement* form)
{
HTMLInputElement* textElement = 0;
const Vector<FormAssociatedElement*>& element = form->associatedElements();
for (Vector<FormAssociatedElement*>::const_iterator i(element.begin()); i != element.end(); ++i) {
const FormAssociatedElement::List& element = form->associatedElements();
for (FormAssociatedElement::List::const_iterator i(element.begin()); i != element.end(); ++i) {
if (!(*i)->isFormControlElement())
continue;
......@@ -198,8 +198,8 @@ bool buildSearchString(const HTMLFormElement* form, Vector<char>* encodedString,
{
bool isElementFound = false;
Vector<FormAssociatedElement*> elements = form->associatedElements();
for (Vector<FormAssociatedElement*>::const_iterator i(elements.begin()); i != elements.end(); ++i) {
const FormAssociatedElement::List& elements = form->associatedElements();
for (FormAssociatedElement::List::const_iterator i(elements.begin()); i != elements.end(); ++i) {
if (!(*i)->isFormControlElement())
continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment