[webkit-dev] What data structure is used to store multiple input controls sharing the same name?

Marco Wise marco.wise at stanford.edu
Mon Mar 27 12:13:39 PST 2006

Hi Darin,

Thanks for your reply, I filed a bug report (http:// 
bugzilla.opendarwin.org/show_bug.cgi?id=7967) and included a test case.
I'm trying to track down an issue with the CPAN module  
CGI::FormBuilder. It creates client side javascript validation code  
that unfortunately does not work with Safari/Konqueror/OmniWeb, etc.


- marco

On Mar 27, 2006, at 12:02 PM, Darin Adler wrote:

> On Mar 20, 2006, at 10:13 AM, Marco Wise wrote:
>> What kind of data structure/object is used internally by Safari /  
>> Konqueror to store multiple inputs with the same name? Is it a  
>> NodeList as in IE/Firefox, or something different? Can properties  
>> be assigned to this object using Javascript?
>> Using the code below it looks like Firefox, IE and Safari create  
>> an HTMLInputElement the first time a control named _submit is  
>> encountered.
>> The second time a control named _submit is encountered, it seems  
>> that a data structure is created to hold the HTMLInputElements and  
>> these can then be accessed using array notation.
>> Firefox/IE report that this new structure is a Nodelist, but  
>> Safari only reports that it's an "object". When I try using  
>> toString() to get more information but then Safari reports an  
>> error that it's not an object.
>> Finally,
>> In Firefox/IE you can assign new properties to this new Nodelist  
>> as in _submit.foo = "bar" and you can retrieve their value.
>> In Safari (I'm using 2.0.3) doing so will fail silently and  
>> retrieving them will return "undefined".
>> The code I'm using to try to sort this out:
>> <html>
>> <form name="test_form" onsubmit="test(this);">	
>> 	<input type="submit" name="_submit" value="One">
>> 	<script>
>> 	  alert("_submit is a " + document.forms[0]._submit);
>> 	  alert("_submit's value is " + document.forms[0]._submit.value);
>> 	</script>
>> 	<input type="submit" name="_submit" value="Two">
>> 	<script>
>> 	  alert("_submit is now a " + document.forms[0]._submit);
>> 	  alert("_submit's value is now " + document.forms 
>> [0]._submit.value);
>> 	  alert("Assigning a value to _submit...");
>> 	  document.forms[0]._submit.value = "New Value";
>> 	  alert("_submit's value is now " + document.forms 
>> [0]._submit.value);
>> 	  alert("The original _submit's value can still be reached as an  
>> item: " + document.forms[0]._submit[0].value);
>> 	</script>
>> </form>
>> </html>
>> I've looked at the webkit source code but I'm not an expert at C++  
>> so I am not quite sure where to find this information. I've also  
>> tried calling functions that should work on Nodelists and arrays  
>> on this object and they fail. The only property that seems to work  
>> is "length".
>> To recap, my question is: how does Safari store multiple input  
>> controls that share the same name? Can this object have its own  
>> properties (besides "length")?
>> Thanks in advance for any help you can provide,
> Here are some implementation details. I don't know if they will  
> help you solve whatever problem you're working on.
> document.forms is an HTMLCollection.
> The function used to get an item by name in an HTML collection  
> exists only in the JavaScript binding in Safari. It's  
> JSHTMLCollection::getNamedItems, in kjs_html.cpp.
> The class used when there is more than one item with the same name  
> is DOMNamedNodesCollection, defined in kjs_dom.h/cpp. Looking at  
> DOMNamedNodesCollection::getOwnPropertySlot, it looks like it  
> supports length, indexing by number, and indexing by ID.
> Would you consider filing a bug report about the problem you're  
> encountering?
>     -- Darin

More information about the webkit-dev mailing list