Changeset 20260 in webkit


Ignore:
Timestamp:
Mar 17, 2007 4:53:55 AM (17 years ago)
Author:
antti
Message:

LayoutTests:

Reviewed by Adele.


Test for http://bugs.webkit.org/show_bug.cgi?id=12595
REGRESSION: Can't add item to cart at lnt.com (JS type error)
<rdar://problem/4722863>


Expanded version of Darin's test case.

  • fast/forms/old-names-expected.txt: Added.
  • fast/forms/old-names.html: Added.

WebCore:

Reviewed by Adele.

Fix http://bugs.webkit.org/show_bug.cgi?id=12595
REGRESSION: Can't add item to cart at lnt.com (JS type error)
<rdar://problem/4722863>


Emulate Firefox behavior where form elements accessed by a name
can be accessed with that name later even if the name changes or
even if element is removed from the document.


This is loosely based on Darin's earlier patch for the same problem but
is much less expansive. It takes somewhat different approach to more closely
mimic Firefox behavior. Includes expanded test case.

  • bindings/js/JSHTMLFormElementCustom.cpp: (WebCore::JSHTMLFormElement::canGetItemsForName):

Use new the HTMLFormElement::getNamedElements() method

(WebCore::JSHTMLFormElement::nameGetter):

Use new the HTMLFormElement::getNamedElements() method

  • html/HTMLFormElement.cpp: (WebCore::HTMLFormElement::HTMLFormElement): (WebCore::HTMLFormElement::~HTMLFormElement): (WebCore::HTMLFormElement::elementForAlias): (WebCore::HTMLFormElement::addElementAlias):

Maintain a map of known element aliases

(WebCore::HTMLFormElement::getNamedElements):

Get a list of elements matching the name, based both their
current names and known aliases (earlier names).
Keep the alias list in sync.

  • html/HTMLFormElement.h:
Location:
trunk
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r20259 r20260  
     12007-03-17  Antti Koivisto  <antti@apple.com>
     2
     3        Reviewed by Adele.
     4       
     5        Test for http://bugs.webkit.org/show_bug.cgi?id=12595
     6        REGRESSION: Can't add item to cart at lnt.com (JS type error)
     7        <rdar://problem/4722863>
     8       
     9        Expanded version of Darin's test case.
     10
     11        * fast/forms/old-names-expected.txt: Added.
     12        * fast/forms/old-names.html: Added.
     13
    1142007-03-16  Adele Peterson  <adele@apple.com>
    215
  • trunk/WebCore/ChangeLog

    r20259 r20260  
     12007-03-17  Antti Koivisto  <antti@apple.com>
     2
     3        Reviewed by Adele.
     4
     5        Fix http://bugs.webkit.org/show_bug.cgi?id=12595
     6        REGRESSION: Can't add item to cart at lnt.com (JS type error)
     7        <rdar://problem/4722863>
     8       
     9        Emulate Firefox behavior where form elements accessed by a name
     10        can be accessed with that name later even if the name changes or
     11        even if element is removed from the document.
     12       
     13        This is loosely based on Darin's earlier patch for the same problem but
     14        is much less expansive. It takes somewhat different approach to more closely
     15        mimic Firefox behavior. Includes expanded test case.
     16
     17        * bindings/js/JSHTMLFormElementCustom.cpp:
     18        (WebCore::JSHTMLFormElement::canGetItemsForName):
     19            Use new the HTMLFormElement::getNamedElements() method
     20        (WebCore::JSHTMLFormElement::nameGetter):
     21            Use new the HTMLFormElement::getNamedElements() method
     22        * html/HTMLFormElement.cpp:
     23        (WebCore::HTMLFormElement::HTMLFormElement):
     24        (WebCore::HTMLFormElement::~HTMLFormElement):
     25        (WebCore::HTMLFormElement::elementForAlias):
     26        (WebCore::HTMLFormElement::addElementAlias):
     27            Maintain a map of known element aliases
     28        (WebCore::HTMLFormElement::getNamedElements):
     29            Get a list of elements matching the name, based both their
     30            current names and known aliases (earlier names).
     31            Keep the alias list in sync.
     32        * html/HTMLFormElement.h:
     33
    1342007-03-17  Adele Peterson  <adele@apple.com>
    235
  • trunk/WebCore/bindings/js/JSHTMLFormElementCustom.cpp

    r20214 r20260  
    3636bool JSHTMLFormElement::canGetItemsForName(ExecState* exec, HTMLFormElement* form, const AtomicString& propertyName)
    3737{
    38     // FIXME: ideally there should be a lighter-weight way of doing this
    39     JSValue* namedItems = JSHTMLCollection(exec, form->elements().get()).getNamedItems(exec, propertyName);
    40     return !namedItems->isUndefined();
     38    Vector<RefPtr<Node> > namedItems;
     39    form->getNamedElements(propertyName, namedItems);
     40    return namedItems.size();
    4141}
    4242
    4343JSValue* JSHTMLFormElement::nameGetter(ExecState* exec, JSObject*, const Identifier& propertyName, const PropertySlot& slot)
    4444{
    45     JSHTMLElement* thisObj = static_cast<JSHTMLElement*>(slot.slotBase());
    46     HTMLFormElement* form = static_cast<HTMLFormElement*>(thisObj->impl());
     45    HTMLFormElement* form = static_cast<HTMLFormElement*>(static_cast<JSHTMLElement*>(slot.slotBase())->impl());
    4746   
    48     return JSHTMLCollection(exec, form->elements().get()).getNamedItems(exec, propertyName);
     47    Vector<RefPtr<Node> > namedItems;
     48    form->getNamedElements(propertyName, namedItems);
     49   
     50    if (namedItems.size() == 1)
     51        return toJS(exec, namedItems[0].get());
     52    if (namedItems.size() > 1)
     53        return new DOMNamedNodesCollection(exec, namedItems);
     54    return jsUndefined();
    4955}
    5056
  • trunk/WebCore/html/HTMLFormElement.cpp

    r20214 r20260  
    5050HTMLFormElement::HTMLFormElement(Document* doc)
    5151    : HTMLElement(formTag, doc)
    52 {
    53     collectionInfo = 0;
    54     m_post = false;
    55     m_multipart = false;
    56     m_autocomplete = true;
    57     m_insubmit = false;
    58     m_doingsubmit = false;
    59     m_inreset = false;
    60     m_enctype = "application/x-www-form-urlencoded";
    61     m_malformed = false;
    62     m_preserveAcrossRemove = false;
     52    , m_elementAliases(0)
     53    , collectionInfo(0)
     54    , m_enctype("application/x-www-form-urlencoded")
     55    , m_post(false)
     56    , m_multipart(false)
     57    , m_autocomplete(true)
     58    , m_insubmit(false)
     59    , m_doingsubmit(false)
     60    , m_inreset(false)
     61    , m_malformed(false)
     62    , m_preserveAcrossRemove(false)
     63{
    6364}
    6465
    6566HTMLFormElement::~HTMLFormElement()
    6667{
     68    delete m_elementAliases;
    6769    delete collectionInfo;
    6870   
     
    639641    setAttribute(targetAttr, value);
    640642}
    641    
     643
     644PassRefPtr<HTMLGenericFormElement> HTMLFormElement::elementForAlias(const AtomicString& alias)
     645{
     646    if (alias.isEmpty() || !m_elementAliases)
     647        return 0;
     648    return m_elementAliases->get(alias.impl());
     649}
     650
     651void HTMLFormElement::addElementAlias(HTMLGenericFormElement* element, const AtomicString& alias)
     652{
     653    if (alias.isEmpty())
     654        return;
     655    if (!m_elementAliases)
     656        m_elementAliases = new AliasMap;
     657    m_elementAliases->set(alias.impl(), element);
     658}
     659
     660void HTMLFormElement::getNamedElements(const AtomicString& name, Vector<RefPtr<Node> >& namedItems)
     661{
     662    elements()->namedItems(name, namedItems);
     663
     664    // see if we have seen something with this name before
     665    RefPtr<HTMLGenericFormElement> aliasElem;
     666    if (aliasElem = elementForAlias(name)) {
     667        bool found = false;
     668        for (unsigned n = 0; n < namedItems.size(); n++) {
     669            if (namedItems[n] == aliasElem.get()) {
     670                found = true;
     671                break;
     672            }
     673        }
     674        if (!found)
     675            // we have seen it before but it is gone now. still, we need to return it.
     676            namedItems.append(aliasElem.get());
     677    }
     678    // name has been accessed, remember it
     679    if (namedItems.size() && aliasElem != namedItems.first())
     680        addElementAlias(static_cast<HTMLGenericFormElement*>(namedItems.first().get()), name);       
     681}
     682
    642683} // namespace
  • trunk/WebCore/html/HTMLFormElement.h

    r20214 r20260  
    5151     
    5252    PassRefPtr<HTMLCollection> elements();
     53    void getNamedElements(const AtomicString&, Vector<RefPtr<Node> >&);
     54   
    5355    unsigned length() const;
    5456    Node* item(unsigned index);
     
    99101    virtual String target() const;
    100102    void setTarget(const String&);
     103   
     104    PassRefPtr<HTMLGenericFormElement> elementForAlias(const AtomicString&);
     105    void addElementAlias(HTMLGenericFormElement*, const AtomicString& alias);
    101106
    102107    // FIXME: Change this to be private after getting rid of all the clients.
     
    110115    friend class HTMLFormCollection;
    111116
     117    typedef HashMap<RefPtr<AtomicStringImpl>, RefPtr<HTMLGenericFormElement> > AliasMap;
     118   
     119    AliasMap* m_elementAliases;
    112120    HTMLCollection::CollectionInfo* collectionInfo;
    113121
     
    116124    String m_target;
    117125    String m_enctype;
    118     String m_boundary;
    119126    String m_acceptcharset;
    120127    bool m_post : 1;
Note: See TracChangeset for help on using the changeset viewer.