From 197ef971a6eea456397245675db4b36ac3ea9065 Mon Sep 17 00:00:00 2001 From: Reuben Morais Date: Thu, 18 Jul 2013 01:22:01 -0400 Subject: [PATCH] Bug 850430 - Optimize mozContact creation and validation code. r=gwagner --- dom/contacts/ContactManager.js | 83 +++++++++++++++++----------------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/dom/contacts/ContactManager.js b/dom/contacts/ContactManager.js index 68054a397e9..174a9157740 100644 --- a/dom/contacts/ContactManager.js +++ b/dom/contacts/ContactManager.js @@ -29,9 +29,9 @@ XPCOMUtils.defineLazyServiceGetter(this, "cpmm", const CONTACTS_SENDMORE_MINIMUM = 5; -function ContactAddress() { } +function ContactAddressImpl() { } -ContactAddress.prototype = { +ContactAddressImpl.prototype = { // This function is meant to be called via bindings code for type checking, // don't call it directly. Instead, create a content object and call initialize // on that. @@ -74,9 +74,9 @@ ContactAddress.prototype = { QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports]), }; -function ContactField() { } +function ContactFieldImpl() { } -ContactField.prototype = { +ContactFieldImpl.prototype = { // This function is meant to be called via bindings code for type checking, // don't call it directly. Instead, create a content object and call initialize // on that. @@ -107,9 +107,9 @@ ContactField.prototype = { QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports]), }; -function ContactTelField() { } +function ContactTelFieldImpl() { } -ContactTelField.prototype = { +ContactTelFieldImpl.prototype = { // This function is meant to be called via bindings code for type checking, // don't call it directly. Instead, create a content object and call initialize // on that. @@ -144,10 +144,6 @@ ContactTelField.prototype = { }; function validateArrayField(data, createCb) { - function isVanillaObj(aObj) { - return Object.prototype.toString.call(aObj) == "[object Object]"; - } - // We use an array-like Proxy to validate data set by content, since we don't // have WebIDL arrays yet. See bug 851726. @@ -184,9 +180,7 @@ function validateArrayField(data, createCb) { data = Array.isArray(data) ? data : [data]; let filtered = []; for (let obj of data) { - if (isVanillaObj(obj)) { - filtered.push(createCb(obj)); - } + filtered.push(createCb(obj)); } if (filtered.length === 0) { return undefined; @@ -214,64 +208,69 @@ Contact.prototype = { // we return these objects (e.g. from a find call), the values in the array // will be COW's, and content cannot see the properties. set email(aEmail) { - this._email = validateArrayField(aEmail, function(email) { - let obj = new this._window.ContactField(); - obj.initialize(email.type, email.value, email.pref); - return obj; - }.bind(this)); + this._email = aEmail; }, get email() { + this._email = validateArrayField(this._email, function(email) { + let obj = this._window.ContactField._create(this._window, new ContactFieldImpl()); + obj.initialize(email.type, email.value, email.pref); + return obj; + }.bind(this)); return this._email; }, set adr(aAdr) { - this._adr = validateArrayField(aAdr, function(adr) { - let obj = new this._window.ContactAddress(); + this._adr = aAdr; + }, + + get adr() { + this._adr = validateArrayField(this._adr, function(adr) { + let obj = this._window.ContactAddress._create(this._window, new ContactAddressImpl()); obj.initialize(adr.type, adr.streetAddress, adr.locality, adr.region, adr.postalCode, adr.countryName, adr.pref); return obj; }.bind(this)); - }, - - get adr() { return this._adr; }, set tel(aTel) { - this._tel = validateArrayField(aTel, function(tel) { - let obj = new this._window.ContactTelField(); - obj.initialize(tel.type, tel.value, tel.carrier, tel.pref); - return obj; - }.bind(this)); + this._tel = aTel; }, get tel() { + this._tel = validateArrayField(this._tel, function(tel) { + let obj = this._window.ContactTelField._create(this._window, new ContactTelFieldImpl()); + obj.initialize(tel.type, tel.value, tel.carrier, tel.pref); + return obj; + }.bind(this)); return this._tel; }, set impp(aImpp) { - this._impp = validateArrayField(aImpp, function(impp) { - let obj = new this._window.ContactField(); - obj.initialize(impp.type, impp.value, impp.pref); - return obj; - }.bind(this)); + this._impp = aImpp; }, get impp() { + this._impp = validateArrayField(this._impp, function(impp) { + let obj = this._window.ContactField._create(this._window, new ContactFieldImpl()); + obj.initialize(impp.type, impp.value, impp.pref); + return obj; + }.bind(this)); return this._impp; }, set url(aUrl) { - this._url = validateArrayField(aUrl, function(url) { - let obj = new this._window.ContactField(); - obj.initialize(url.type, url.value, url.pref); - return obj; - }.bind(this)); + this._url = aUrl; }, get url() { + this._url = validateArrayField(this._url, function(url) { + let obj = this._window.ContactField._create(this._window, new ContactFieldImpl()); + obj.initialize(url.type, url.value, url.pref); + return obj; + }.bind(this)); return this._url; }, @@ -617,7 +616,7 @@ ContactManager.prototype = { newContact.properties[prop] = []; for (let i of aContact[prop]) { if (i) { - let json = ContactAddress.prototype.toJSON.apply(i, [true]); + let json = ContactAddressImpl.prototype.toJSON.apply(i, [true]); newContact.properties[prop].push(json); } } @@ -629,7 +628,7 @@ ContactManager.prototype = { newContact.properties[prop] = []; for (let i of aContact[prop]) { if (i) { - let json = ContactField.prototype.toJSON.apply(i, [true]); + let json = ContactFieldImpl.prototype.toJSON.apply(i, [true]); newContact.properties[prop].push(json); } } @@ -641,7 +640,7 @@ ContactManager.prototype = { newContact.properties[prop] = []; for (let i of aContact[prop]) { if (i) { - let json = ContactTelField.prototype.toJSON.apply(i, [true]); + let json = ContactTelFieldImpl.prototype.toJSON.apply(i, [true]); newContact.properties[prop].push(json); } } @@ -822,5 +821,5 @@ ContactManager.prototype = { }; this.NSGetFactory = XPCOMUtils.generateNSGetFactory([ - Contact, ContactManager, ContactAddress, ContactField, ContactTelField + Contact, ContactManager, ContactFieldImpl, ContactAddressImpl, ContactTelFieldImpl ]);