Changeset 20260 in webkit
- Timestamp:
- Mar 17, 2007 4:53:55 AM (17 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r20259 r20260 1 2007-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 1 14 2007-03-16 Adele Peterson <adele@apple.com> 2 15 -
trunk/WebCore/ChangeLog
r20259 r20260 1 2007-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 1 34 2007-03-17 Adele Peterson <adele@apple.com> 2 35 -
trunk/WebCore/bindings/js/JSHTMLFormElementCustom.cpp
r20214 r20260 36 36 bool JSHTMLFormElement::canGetItemsForName(ExecState* exec, HTMLFormElement* form, const AtomicString& propertyName) 37 37 { 38 // FIXME: ideally there should be a lighter-weight way of doing this39 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(); 41 41 } 42 42 43 43 JSValue* JSHTMLFormElement::nameGetter(ExecState* exec, JSObject*, const Identifier& propertyName, const PropertySlot& slot) 44 44 { 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()); 47 46 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(); 49 55 } 50 56 -
trunk/WebCore/html/HTMLFormElement.cpp
r20214 r20260 50 50 HTMLFormElement::HTMLFormElement(Document* doc) 51 51 : 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 { 63 64 } 64 65 65 66 HTMLFormElement::~HTMLFormElement() 66 67 { 68 delete m_elementAliases; 67 69 delete collectionInfo; 68 70 … … 639 641 setAttribute(targetAttr, value); 640 642 } 641 643 644 PassRefPtr<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 651 void 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 660 void 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 642 683 } // namespace -
trunk/WebCore/html/HTMLFormElement.h
r20214 r20260 51 51 52 52 PassRefPtr<HTMLCollection> elements(); 53 void getNamedElements(const AtomicString&, Vector<RefPtr<Node> >&); 54 53 55 unsigned length() const; 54 56 Node* item(unsigned index); … … 99 101 virtual String target() const; 100 102 void setTarget(const String&); 103 104 PassRefPtr<HTMLGenericFormElement> elementForAlias(const AtomicString&); 105 void addElementAlias(HTMLGenericFormElement*, const AtomicString& alias); 101 106 102 107 // FIXME: Change this to be private after getting rid of all the clients. … … 110 115 friend class HTMLFormCollection; 111 116 117 typedef HashMap<RefPtr<AtomicStringImpl>, RefPtr<HTMLGenericFormElement> > AliasMap; 118 119 AliasMap* m_elementAliases; 112 120 HTMLCollection::CollectionInfo* collectionInfo; 113 121 … … 116 124 String m_target; 117 125 String m_enctype; 118 String m_boundary;119 126 String m_acceptcharset; 120 127 bool m_post : 1;
Note: See TracChangeset
for help on using the changeset viewer.