- From: Wojciech Masłowski <wmaslowski@opera.com>
- Date: Tue, 10 Aug 2010 14:40:31 +0200
- To: public-device-apis@w3.org
For many use cases of Contacts API the desired functionality is reading and processing the data of a specific contact(or set of contacts) selected by the user. Example of such a use case would be a news site with a "send this article to a friend" functionality. This functionality can be achieved using only javascript APIs, but as use cases appear to be potentially very strong, it might be reasonable to provide standard markup element to handle it. The use case described above can be met by extending HTML input element by a new type. The idea is to reuse forms functionality especially <input type="file"> and apply it to contacts. The advantages of such approach * Having standard UI element vs custom solution for each site. * Integration with forms * Possible to use even with javascript disabled Cons * Duplicates functionality of javascript API * Problematic forms upload format Example markup which could be used in example above: <input type="contact" name="friend" fields="emails, ims" multiple /> Supported Attributes: * required - The required attribute is a boolean attribute. When specified, the element is required. -> standard html5 meaning * multiple - The multiple attribute is a boolean attribute that indicates whether the user is to be allowed to specify more than one value. -> standard html5 meaning * fields - - The fields attribute is a string attribute which indicates which contact fields are passed to the form. The user agent MUST present clear visual information about which field access is requested by the form. The user agent MAY provide a way for user to further limit the fields which are made available by the user. -> A new field. It's meaning is the same as search qualifier parameter to contacts.find method of Contact API - it narrows down the scope of data which is passed from the user. DOM interface: interface HTMLContactInputElement : HTMLInputElement { attribute Contact[] contacts; }; Contact input element would expose one new IDL attribute - contacts. * contacts - Returns a FileList object listing the selected files of the form control. This attribute is set to a list of contact objects representing contacts selected by the user. The field set of the contacts MUST be narrowed down to the field set specified in 'fields' attribute or if the user agent allows user to specify the field set to the user specified fields. -> analogous to files attribute on file upload input field. * value: On getting, it must return id of the first selected contact, if any, or the empty string if no contact is selected. On setting, if the new value is the empty string, it must empty the list of selected contacts; otherwise, it must throw an INVALID_STATE_ERR exception. -> The behaviour is analogous to the behaviour of value field on file upload input field. Apart from that, the change events (change and formchange) MUST be triggered whenever user modifies the selected contacts(as described in HTML5 spec). Security & privacy considerations The privacy considerations are mostly the same as for javascript contacts API. The only difference is that form based approach has user explicit consent baked in - user has to explicitly interact with page to select contacts he wants to share. The biggest problem is for ui to successfully communicate to user what he is sharing. It is easy to imagine situation in which site adds an email field in the form which requests all fields of the contact, the user clicks it selects a contact and thinks he only shared his email address, but actually he shared full contact info. To counter that the user agent MUST clearly express to the user to which fields the access was requested. The same considerations apply of course to contact picker triggered by contacts.find method. UI: The visual representation of a contact input element is implementation specific, but in general it should be similar to File Upload - a button to trigger contact picker and a field to present chosen contact(s). The Clicking the button should trigger contact picker ui. Such an ui MUST clearly present to the user which fields of the contact are exposed to the site. It MAY allow user to further reduce the set of contact fields that are exposed. For example it may present a list of checkboxes for fields. Additionally click() method called on such an alement should not trigger contact picker ui. -> The key point is that UI must give a clear message to the user that what he is sharing are contact containing a set of attributes and not just their name or email(which is what he will probably see in contact chooser), the same as when he is using file upload he is sharing content of the file and not just it's name. The other viable way of implementing it is a edit box which would give you list of hints for contacts after typing in few letters - similar to browsers addressbar. If such an approach is used it is important that * the user MUST be informed which fields are being requested * only change events are triggered and not input events and the value attribute should always return only the list of selected contacts and not the letters typed in by the user. Format of data sent on form submit: The problem with contacts is that as opposed to other form inputs it is a set of fields rather than one value. The encodings for sending the data to the server assume that an input fields contain only on value. This problem can be solved in 2 ways: A) Serialize the contact in some way(for example in JSON) and send it as a single value. The server then has to deserialize it. Example: For : <input type="contact" name="friend" fields="name.givenName" > with selected contact object with id = "some_id" and name.givenName="Bob" url encoded request looks like this: http://cool.contacts.site.com/process_contact?friend={%20%22id%22%20:%20%22some_id%22,%20%22name%22%20:{%20%22givenName%22%20:%20%22Bob%22%20} B) treat as if contact fields were separate inputs and send them separately. For data from previous example this will be encoded like this: http://cool.contacts.site.com/process_contact?friend.id=some_id&friend.name.givenName=Bob The second approach has a disadvantage because it behaves a bit differently to other form input fields which may be somewhat confusing, but it has the advantage that you can easily maintain a version of the the page for old browsers using simple form approach by sending normal form based version - for example @code for new browsers - <input type="contact" name="friend" fields="name.givenName, name.familyName" /> @code for old browsers - <input type="text" name="friend[0][name][givenName]" /> <input type="text" name="friend[0][name][familyName]" /> the solution for old browsers will require user to manually type all contact data and thus will have poorer user experience, but it will have the same funcrtionality and can be handled by the same server code. -- Wojciech Masłowski Engeneering CORE Wrocław Opera Software ASA http://www.opera.com
Received on Tuesday, 10 August 2010 12:41:10 UTC