This document includes material copied from the W3C Editor's Draft of the Contacts Manager API from 04 April 2014. Copyright © 2015 W3C® (MIT, ERCIM, Keio, Beihang), All Rights Reserved. W3C liability, trademark and permissive document license rules apply.
This specification defines a System Level API which offers a simple interface to manage user's contacts stored in the system's address book. A typical use case of the Contacts API is the implementation of an application to manage said address book.
This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.
This document defines a System Level API to manage the user's contacts that are stored in the system's address book.
If you find any issue with this specification, please file a bug on Github.
This document was produced by the System Applications Working Group. Members of this Working Group have agreed not to progress the Contacts Manager API specification further as a Recommendation track document, electing instead to publish it as an informative Working Group Note under a permissive license with a view to enabling it to form the basis of further work by others, e.g. in a W3C Community Group.
This document was published by the System Applications Working Group as a Working Group Note. If you wish to make comments regarding this document, please send them to public-sysapps@w3.org (subscribe, archives). All comments are welcome.
W3C makes this document available under the terms of the W3C Software and Document License pursuant to W3C's policy for Relicensing Unfinished W3C Specifications. Publication as a Working Group Note does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
This document was produced by a group operating under the 5 February 2004 W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.
This document is governed by the 1 August 2014 W3C Process Document.
Navigator
InterfaceContactsManager
InterfaceContactFindOptions
DictionaryContactField
InterfaceContactTelField
InterfaceContactAddress
InterfaceContactGender
enumContactName
InterfaceContact
InterfaceContactsChangeEvent
InterfaceThis section is non-normative.
The Contacts API allows to manage (create, edit, remove, etc) user's contacts stored in the system's address book, and thus provides the functionality needed to implement an application to manage said address book.
An example of use is provided below:
var contactName = new ContactName({ givenNames: ['John'], familyNames: ['Doe'] }); var mobilePhone = new ContactTelField({ types: ['home'], preferred: true, value: '+34698765432' }); var contact = new Contact({ name: contactName, phoneNumbers: [mobilePhone] }); navigator.contacts.save(contact).then( function(contact) { window.console.log('Contact ' + contact.name.givenNames[0] + ' ' + contact.name.familyNames[0] + ' saved!'); }, function(error) { window.console.error('Error: ' + error); } )
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
The key word MUST is to be interpreted as described in [RFC2119].
This specification defines conformance criteria that apply to a single product: the user agent that implements the interfaces that it contains.
Implementations that use ECMAScript to implement the APIs defined in this specification MUST implement them in a manner consistent with the ECMAScript Bindings defined in the Web IDL specification [WEBIDL], as this specification uses that specification and terminology.
The
EventHandler
interface represents a callback used for event
handlers as defined in [HTML5].
The concepts queue a task and fire a simple event are defined in [HTML5].
The terms event handler and event handler event types are defined in [HTML5].
The Promise interface, the concepts of a resolver, a resolver's fulfill algorithm and a resolver's reject algorithm are defined in ECMAScript 6 (ECMA-262).
This API must be only exposed to trusted content
ContactsManager
InterfaceThe ContactsManager
interface exposes the contacts management
functionality.
interface ContactsManager : EventTarget {
Promise find (optional ContactFindOptions
options);
Promise clear ();
Promise save (Contact
contact);
Promise remove (DOMString contactId);
attribute EventHandler oncontactschange;
};
oncontactschange
of type EventHandler, clear
Promise
that will allow the caller to
be notified about the result of the operation.
Promise
find
options
parameter.
It returns a Promise
that will allow the caller to
be notified about the result of the operation.
Parameter | Type | Nullable | Optional | Description |
---|---|---|---|---|
options |
| ✘ | ✔ |
Set of criteria that a contact needs to match to be included in
the outcomes of the find
operation.
|
Promise
remove
Promise
that will allow the caller to
be notified about the result of the operation.
Parameter | Type | Nullable | Optional | Description |
---|---|---|---|---|
contactId | DOMString | ✘ | ✘ |
The identifier of the Contact object that is
requested to be removed from the address book.
|
Promise
save
id
, already exists in the address book, it
will be updated.
It returns a Promise
that will allow the caller to
be notified about the result of the operation.
Parameter | Type | Nullable | Optional | Description |
---|---|---|---|---|
contact |
| ✘ | ✘ |
The Contact object that is requested to be saved in
the address book.
|
Promise
The find
method when invoked MUST run the
following steps:
Promise
object
and resolver its associated resolver.
options
parameter.
Contact
objects providing the results of the
find operation.
value
argument.
The clear
method when invoked MUST run the
following steps:
Promise
object
and resolver its associated resolver.
The save
method when invoked MUST run the
following steps:
Promise
object
and resolver its associated resolver.
Contact
object passed as parameter.
Contact
object
as returned by the system, and which therefore has its
id
and lastUpdated
parameters set, whereas
they could be null in the original Contact
object passed as parameter, for instance if it is a brand new
Contact
object not yet stored in the address
book.
value
argument.
The remove
method when invoked MUST run the
following steps:
Promise
object
and resolver its associated resolver.
Contact
object identified by the
contactId
passed as parameter from the address book.
Upon a change in a contact or set thereof is performed (i.e.
contact(s) added / modified / removed) the system MUST fire a simple
event named
that implements the
contactschange
ContactsChangeEvent
interface at the
ContactsManager
object
The following are the event handlers (and their corresponding
event handler event types) that MUST be supported as attributes
by the ContactsManager
object:
event handler | event handler event type |
---|---|
oncontactschange |
contactschange |
The event named
MUST implement the
contactschange
ContactsChangeEvent
interface.
ContactFindOptions
DictionaryThe ContactFindOptions
dictionary represents the criteria used
to select the contacts to be returned by a find
operation.
dictionary ContactFindOptions {
DOMString value;
FilterOperator
operator;
sequence<DOMString> fields;
sequence<DOMString> sortBy;
SortOrder
sortOrder;
unsigned long resultsLimit;
};
ContactFindOptions
Membersfields
of type sequence<DOMString>, operator
of type FilterOperator
, resultsLimit
of type unsigned long, sortBy
of type sequence<DOMString>, sortOrder
of type SortOrder
, value
of type DOMString, There are 2 possible filter operations:
enum FilterOperator {
"contains",
"is"
};
Enumeration description | |
---|---|
contains | With this operation, a contact will be returned if its filtered field contains the given value. |
is | With this operation, a contact will be returned if its filtered field matches exactly the given value. |
The returned contacts can be sorted in one of the following orders:
enum SortOrder {
"ascending",
"descending"
};
Enumeration description | |
---|---|
ascending | The contacts will be sorted in ascending order. |
descending | The contacts will be sorted in descending order. |
It is for further study whether the level of flexibility of the filters needs to be increased and/or additional mechanisms need to be put in place so that applications can keep a local copy of the address book and perform the filtering locally (e.g. startTrackingChanges() and getNewChanges() methods)
ContactField
InterfaceThe ContactField
interface represents a user's attribute and the
types associated to it.
[Constructor(optional ContactFieldInit initDict)]
interface ContactField {
attribute DOMString[] types;
attribute boolean preferred;
attribute DOMString value;
};
preferred
of type boolean, types
of type array of DOMString, value
of type DOMString, ContactFieldInit
Dictionarydictionary ContactFieldInit {
sequence<DOMString> types;
boolean preferred;
DOMString value;
};
ContactFieldInit
Memberspreferred
of type boolean, types
of type sequence<DOMString>, value
of type DOMString, ContactTelField
InterfaceThe ContactTelField
interface represents a telephone number as
well as metadata associated to it, namely the types (e.g. "voice", "text")
and the carrier providing service to the telephony subscription associated
to that number.
[Constructor(optional ContactTelFieldInit initDict)]
interface ContactTelField : ContactField
{
attribute DOMString? carrier;
};
carrier
of type DOMString, , nullableContactTelFieldInit
Dictionarydictionary ContactTelFieldInit : ContactFieldInit
{
DOMString carrier;
};
ContactTelFieldInit
Memberscarrier
of type DOMString, ContactAddress
InterfaceThe ContactAddress
interface represents a user's physical
address and the types associated to it. This interface is based on vCard 4.0 ADR attribute.
[Constructor(optional ContactAddressInit initDict)]
interface ContactAddress {
attribute DOMString[] types;
attribute boolean preferred;
attribute DOMString streetAddress;
attribute DOMString locality;
attribute DOMString region;
attribute DOMString postalCode;
attribute DOMString countryName;
};
countryName
of type DOMString, locality
of type DOMString, postalCode
of type DOMString, preferred
of type boolean, region
of type DOMString, streetAddress
of type DOMString, types
of type array of DOMString, ContactAddressInit
Dictionarydictionary ContactAddressInit {
sequence<DOMString> types;
boolean preferred;
DOMString streetAddress;
DOMString locality;
DOMString region;
DOMString postalCode;
DOMString countryName;
};
ContactAddressInit
MemberscountryName
of type DOMString, locality
of type DOMString, postalCode
of type DOMString, preferred
of type boolean, region
of type DOMString, streetAddress
of type DOMString, types
of type sequence<DOMString>, ContactGender
enumenum ContactGender {
"male",
"female",
"other",
"none",
"unknown"
};
Enumeration description | |
---|---|
male | contact is a male. |
female | contact is a female. |
other | contact has another gender. |
none | contact does not have a gender (not applicable). |
unknown | contact's gender is unknown. |
ContactName
InterfaceThe ContactName
interface represents a user's naming attributes.
[Constructor(optional ContactNameInit initDict)]
interface ContactName {
attribute DOMString displayName;
attribute DOMString[] honorificPrefixes;
attribute DOMString[] givenNames;
attribute DOMString[] additionalNames;
attribute DOMString[] familyNames;
attribute DOMString[] honorificSuffixes;
attribute DOMString[] nicknames;
};
additionalNames
of type array of DOMString, displayName
of type DOMString, familyNames
of type array of DOMString, givenNames
of type array of DOMString, honorificPrefixes
of type array of DOMString, honorificSuffixes
of type array of DOMString, nicknames
of type array of DOMString, ContactNameInit
Dictionarydictionary ContactNameInit {
DOMString displayName;
sequence<DOMString> honorificPrefixes;
sequence<DOMString> givenNames;
sequence<DOMString> additionalNames;
sequence<DOMString> familyNames;
sequence<DOMString> honorificSuffixes;
sequence<DOMString> nicknames;
};
ContactNameInit
MembersadditionalNames
of type sequence<DOMString>, displayName
of type DOMString, familyNames
of type sequence<DOMString>, givenNames
of type sequence<DOMString>, honorificPrefixes
of type sequence<DOMString>, honorificSuffixes
of type sequence<DOMString>, nicknames
of type sequence<DOMString>, Contact
InterfaceThe Contact
interface represents a contact stored in the address
book. As a principle the attributes are based on vCard 4.0 and reuse the
literal used in that standard. Any naming deviation is mentioned in the
description of the corresponding attribute. Whereas this correspondence
facilitates the import/export from/to vCard format it should be noted that
a vCard import/export API is out of scope of this specification as parsing
and serializing can be efficiently done in JavaScript, and libraries are
readily available.
[Constructor(optional ContactInit contactInitDict)]
interface Contact {
readonly attribute DOMString? id;
readonly attribute Date? lastUpdated;
attribute ContactName
name;
attribute ContactField
[] emails;
attribute DOMString[] photos;
attribute ContactField
[] urls;
attribute DOMString[] categories;
attribute ContactAddress
[] addresses;
attribute ContactTelField
[] phoneNumbers;
attribute DOMString[] organizations;
attribute DOMString[] jobTitles;
attribute Date? birthday;
attribute DOMString[] notes;
attribute ContactField
[] impp;
attribute Date? anniversary;
attribute ContactGender
gender;
};
addresses
of type array of ContactAddress
, ContactAddress
element or set thereof containing the
user's physical address(es). It maps to vCard's ADR attributeanniversary
of type Date, , nullableDate
element representing the contact's anniversary.
It maps to vCard's ANNIVERSARY attributebirthday
of type Date, , nullableDate
element representing the contact's birth date.
It maps to vCard's BDAY attribute
categories
of type array of DOMString, emails
of type array of ContactField
, ContactField
element or set thereof containing the
contact's email address(es). It maps to vCard's EMAIL attribute.gender
of type ContactGender
, id
of type DOMString, readonly , nullableimpp
of type array of ContactField
, ContactField
element or set thereof containing the
user's instant messaging address(es). It maps to vCard's IMPP
attributejobTitles
of type array of DOMString, lastUpdated
of type Date, readonly , nullableDate
element representing the date when the contact
was last updated.
name
of type ContactName
, notes
of type array of DOMString, organizations
of type array of DOMString, phoneNumbers
of type array of ContactTelField
, ContactTelField
element or set thereof containing the
user's telephone numbers. It maps to vCard's TEL attributephotos
of type array of DOMString, urls
of type array of ContactField
, ContactField
element or set thereof containing the
user's urls (e.g. personal blog). It maps to vCard's URL attribute. The Contact
interface's contructor when invoked MUST run the
following steps:
Contact
object.
id
attribute of contact to the
generated contact identifier.
lastUpdated
attribute of contact to
the Date at which the constructor was invoked.
contactInitDict
dictionary, if
present.
ContactInit
Dictionarydictionary ContactInit {
ContactName
name;
sequence<ContactField
> emails;
sequence<DOMString> photos;
sequence<ContactField
> urls;
sequence<DOMString> categories;
sequence<ContactAddress
> addresses;
sequence<ContactTelField
> phoneNumbers;
sequence<DOMString> organizations;
sequence<DOMString> jobTitles;
Date birthday;
sequence<DOMString> notes;
sequence<ContactField
> impp;
Date anniversary;
ContactGender
gender;
};
ContactInit
Membersaddresses
of type sequence<ContactAddress
>, anniversary
of type Date, birthday
of type Date, categories
of type sequence<DOMString>, emails
of type sequence<ContactField
>, gender
of type ContactGender
, impp
of type sequence<ContactField
>, jobTitles
of type sequence<DOMString>, name
of type ContactName
, notes
of type sequence<DOMString>, organizations
of type sequence<DOMString>, phoneNumbers
of type sequence<ContactTelField
>, photos
of type sequence<DOMString>, urls
of type sequence<ContactField
>, ContactsChangeEvent
InterfaceThe ContactsChangeEvent
interface represents events related to
the set of contacts that have been simultaneously added, removed and/or
modified. Changes that are applied to the address book in batches cause a
ContactsChangeEvent
with multiple contact references to be fired,
whereas changes applied sequentially cause a ContactsChangeEvent
with a single contact reference to be fired
[Constructor(DOMString type, optional ContactsChangeEventInit
eventInitDict)]
interface ContactsChangeEvent : Event {
readonly attribute DOMString[] added;
readonly attribute DOMString[] modified;
readonly attribute DOMString[] removed;
};
added
of type array of DOMString, readonly Contact
object(s)
that have been added.modified
of type array of DOMString, readonly Contact
object(s)
that have been modified.removed
of type array of DOMString, readonly Contact
object(s)
that have been removed.ContactsChangeEventInit
Dictionarydictionary ContactsChangeEventInit : EventInit {
sequence<DOMString> added;
sequence<DOMString> modified;
sequence<DOMString> removed;
};
ContactsChangeEventInit
Membersadded
of type sequence<DOMString>, modified
of type sequence<DOMString>, removed
of type sequence<DOMString>, The editors would like to express their gratitude to the Mozilla B2G Team for their technical guidance, implementation work and support, and specially to Tantek Çelik and Gregor Wagner, the original authors of B2G Contact API.