Bug 1366081 - Excise 'mobileGUIDFetchBatchSize' and other mobile sync-related constants. r?kitcambridge draft
authortiago <tiago.paez11@gmail.com>
Wed, 24 May 2017 03:28:22 -0300
changeset 583518 a69b91bde92fc3a389200997b81a2ff086f53bdd
parent 583335 96e18bec9fc8a5ce623c16167c12756bbe190d73
child 630086 27fd8e2f3c3141df0e3293002306ef155199a427
push id60423
push userbmo:tiago.paez11@gmail.com
push dateWed, 24 May 2017 06:28:40 +0000
reviewerskitcambridge
bugs1366081
milestone55.0a1
Bug 1366081 - Excise 'mobileGUIDFetchBatchSize' and other mobile sync-related constants. r?kitcambridge MozReview-Commit-ID: 6JTtpWFFyvD
services/sync/modules/constants.js
services/sync/modules/engines.js
services/sync/tests/unit/test_history_engine.js
services/sync/tests/unit/test_syncengine_sync.js
services/sync/tests/unit/xpcshell.ini
tools/lint/eslint/modules.json
--- a/services/sync/modules/constants.js
+++ b/services/sync/modules/constants.js
@@ -51,33 +51,29 @@ MAXIMUM_BACKOFF_INTERVAL:              8
 HMAC_EVENT_INTERVAL:                   600000,
 
 // How long to wait between sync attempts if the Master Password is locked.
 MASTER_PASSWORD_LOCKED_RETRY_INTERVAL: 15 * 60 * 1000,   // 15 minutes
 
 // The default for how long we "block" sync from running when doing a migration.
 DEFAULT_BLOCK_PERIOD:                  2 * 24 * 60 * 60 * 1000, // 2 days
 
-// Separate from the ID fetch batch size to allow tuning for mobile.
-MOBILE_BATCH_SIZE:                     50,
-
 // 50 is hardcoded here because of URL length restrictions.
 // (GUIDs can be up to 64 chars long.)
 // Individual engines can set different values for their limit if their
 // identifiers are shorter.
 DEFAULT_GUID_FETCH_BATCH_SIZE:         50,
-DEFAULT_MOBILE_GUID_FETCH_BATCH_SIZE:  50,
 
 // Default batch size for applying incoming records.
 DEFAULT_STORE_BATCH_SIZE:              1,
-HISTORY_STORE_BATCH_SIZE:              50,      // same as MOBILE_BATCH_SIZE
-FORMS_STORE_BATCH_SIZE:                50,      // same as MOBILE_BATCH_SIZE
-PASSWORDS_STORE_BATCH_SIZE:            50,      // same as MOBILE_BATCH_SIZE
+HISTORY_STORE_BATCH_SIZE:              50,
+FORMS_STORE_BATCH_SIZE:                50,
+PASSWORDS_STORE_BATCH_SIZE:            50,
 ADDONS_STORE_BATCH_SIZE:               1000000, // process all addons at once
-APPS_STORE_BATCH_SIZE:                 50,      // same as MOBILE_BATCH_SIZE
+APPS_STORE_BATCH_SIZE:                 50,
 
 // Default batch size for download batching
 // (how many records are fetched at a time from the server when batching is used).
 DEFAULT_DOWNLOAD_BATCH_SIZE:           1000,
 
 
 // Default maximum size for a record payload
 DEFAULT_MAX_RECORD_PAYLOAD_BYTES:      262144,  // 256KB
--- a/services/sync/modules/engines.js
+++ b/services/sync/modules/engines.js
@@ -809,17 +809,16 @@ SyncEngine.prototype = {
 
   // How many records to pull in a single sync. This is primarily to avoid very
   // long first syncs against profiles with many history records.
   downloadLimit: null,
 
   // How many records to pull at one time when specifying IDs. This is to avoid
   // URI length limitations.
   guidFetchBatchSize: DEFAULT_GUID_FETCH_BATCH_SIZE,
-  mobileGUIDFetchBatchSize: DEFAULT_MOBILE_GUID_FETCH_BATCH_SIZE,
 
   // How many records to process in a single batch.
   applyIncomingBatchSize: DEFAULT_STORE_BATCH_SIZE,
 
   get storageURL() {
     return this.service.storageURL;
   },
 
@@ -1051,29 +1050,25 @@ SyncEngine.prototype = {
    * In the most awful and untestable way possible.
    * This now accepts something that makes testing vaguely less impossible.
    */
   _processIncoming(newitems) {
     this._log.trace("Downloading & applying server changes");
 
     // Figure out how many total items to fetch this sync; do less on mobile.
     let batchSize = this.downloadLimit || Infinity;
-    let isMobile = (Svc.Prefs.get("client.type") == "mobile");
 
     if (!newitems) {
       newitems = this.itemSource();
     }
 
     if (this._defaultSort) {
       newitems.sort = this._defaultSort;
     }
 
-    if (isMobile) {
-      batchSize = MOBILE_BATCH_SIZE;
-    }
     newitems.newer = this.lastSync;
     newitems.full  = true;
     newitems.limit = batchSize;
 
     // applied    => number of items that should be applied.
     // failed     => number of items that failed in this sync.
     // newFailed  => number of items that failed for the first time in this sync.
     // reconciled => number of items that were reconciled.
@@ -1276,18 +1271,17 @@ SyncEngine.prototype = {
     // remaining items in toFetch.
     if (this.lastSync < this.lastModified) {
       this.lastSync = this.lastModified;
     }
 
     // Process any backlog of GUIDs.
     // At this point we impose an upper limit on the number of items to fetch
     // in a single request, even for desktop, to avoid hitting URI limits.
-    batchSize = isMobile ? this.mobileGUIDFetchBatchSize :
-                           this.guidFetchBatchSize;
+    batchSize = this.guidFetchBatchSize;
 
     while (fetchBatch.length && !aborting) {
       // Reuse the original query, but get rid of the restricting params
       // and batch remaining records.
       newitems.limit = 0;
       newitems.newer = 0;
       newitems.ids = fetchBatch.slice(0, batchSize);
 
deleted file mode 100644
--- a/services/sync/tests/unit/test_history_engine.js
+++ /dev/null
@@ -1,145 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-Cu.import("resource://services-sync/constants.js");
-Cu.import("resource://services-sync/engines/history.js");
-Cu.import("resource://services-sync/engines.js");
-Cu.import("resource://services-sync/record.js");
-Cu.import("resource://services-sync/service.js");
-Cu.import("resource://services-sync/util.js");
-Cu.import("resource://testing-common/services/sync/utils.js");
-
-Service.engineManager.clear();
-
-add_test(function test_setup() {
-  PlacesTestUtils.clearHistory().then(run_next_test);
-});
-
-add_task(async function test_processIncoming_mobile_history_batched() {
-  _("SyncEngine._processIncoming works on history engine.");
-
-  let FAKE_DOWNLOAD_LIMIT = 100;
-
-  Svc.Prefs.set("client.type", "mobile");
-  Service.engineManager.register(HistoryEngine);
-
-  // A collection that logs each GET
-  let collection = new ServerCollection();
-  collection.get_log = [];
-  collection._get = collection.get;
-  collection.get = function(options) {
-    this.get_log.push(options);
-    return this._get(options);
-  };
-
-  let server = sync_httpd_setup({
-    "/1.1/foo/storage/history": collection.handler()
-  });
-
-  await SyncTestingInfrastructure(server);
-
-  // Let's create some 234 server side history records. They're all at least
-  // 10 minutes old.
-  let visitType = Ci.nsINavHistoryService.TRANSITION_LINK;
-  for (var i = 0; i < 234; i++) {
-    let id = "record-no" + ("00" + i).slice(-3);
-    let modified = Date.now() / 1000 - 60 * (i + 10);
-    let payload = encryptPayload({
-      id,
-      histUri: "http://foo/bar?" + id,
-        title: id,
-        sortindex: i,
-        visits: [{date: (modified - 5) * 1000000, type: visitType}],
-        deleted: false});
-
-    let wbo = new ServerWBO(id, payload);
-    wbo.modified = modified;
-    collection.insertWBO(wbo);
-  }
-
-  let engine = Service.engineManager.get("history");
-  let meta_global = Service.recordManager.set(engine.metaURL,
-                                              new WBORecord(engine.metaURL));
-  meta_global.payload.engines = {history: {version: engine.version,
-                                           syncID: engine.syncID}};
-
-  try {
-
-    _("On a mobile client, we get new records from the server in batches of 50.");
-    engine._syncStartup();
-
-    // Fake a lower limit.
-    engine.downloadLimit = FAKE_DOWNLOAD_LIMIT;
-    _("Last modified: " + engine.lastModified);
-    _("Processing...");
-    engine._processIncoming();
-
-    _("Last modified: " + engine.lastModified);
-    engine._syncFinish();
-
-    // Back to the normal limit.
-    _("Running again. Should fetch none, because of lastModified");
-    engine.downloadLimit = MAX_HISTORY_DOWNLOAD;
-    _("Processing...");
-    engine._processIncoming();
-
-    _("Last modified: " + engine.lastModified);
-    _("Running again. Expecting to pull everything");
-
-    engine.lastModified = undefined;
-    engine.lastSync     = 0;
-    _("Processing...");
-    engine._processIncoming();
-
-    _("Last modified: " + engine.lastModified);
-
-    // Verify that the right number of GET requests with the right
-    // kind of parameters were made.
-    do_check_eq(collection.get_log.length,
-        // First try:
-        1 +    // First 50...
-        1 +    // 1 GUID fetch...
-               // 1 fetch...
-        Math.ceil((FAKE_DOWNLOAD_LIMIT - 50) / MOBILE_BATCH_SIZE) +
-        // Second try: none
-        // Third try:
-        1 +    // First 50...
-        1 +    // 1 GUID fetch...
-               // 4 fetch...
-        Math.ceil((234 - 50) / MOBILE_BATCH_SIZE));
-
-    // Check the structure of each HTTP request.
-    do_check_eq(collection.get_log[0].full, 1);
-    do_check_eq(collection.get_log[0].limit, MOBILE_BATCH_SIZE);
-    do_check_eq(collection.get_log[1].full, undefined);
-    do_check_eq(collection.get_log[1].sort, "index");
-    do_check_eq(collection.get_log[1].limit, FAKE_DOWNLOAD_LIMIT);
-    do_check_eq(collection.get_log[2].full, 1);
-    do_check_eq(collection.get_log[3].full, 1);
-    do_check_eq(collection.get_log[3].limit, MOBILE_BATCH_SIZE);
-    do_check_eq(collection.get_log[4].full, undefined);
-    do_check_eq(collection.get_log[4].sort, "index");
-    do_check_eq(collection.get_log[4].limit, MAX_HISTORY_DOWNLOAD);
-    for (i = 0; i <= Math.floor((234 - 50) / MOBILE_BATCH_SIZE); i++) {
-      let j = i + 5;
-      do_check_eq(collection.get_log[j].full, 1);
-      do_check_eq(collection.get_log[j].limit, undefined);
-      if (i < Math.floor((234 - 50) / MOBILE_BATCH_SIZE))
-        do_check_eq(collection.get_log[j].ids.length, MOBILE_BATCH_SIZE);
-      else
-        do_check_eq(collection.get_log[j].ids.length, 234 % MOBILE_BATCH_SIZE);
-    }
-
-  } finally {
-    await PlacesTestUtils.clearHistory();
-    await promiseStopServer(server);
-    Svc.Prefs.resetBranch("");
-    Service.recordManager.clearCache();
-  }
-});
-
-function run_test() {
-  generateNewKeys(Service.collectionKeys);
-
-  run_next_test();
-}
--- a/services/sync/tests/unit/test_syncengine_sync.js
+++ b/services/sync/tests/unit/test_syncengine_sync.js
@@ -588,149 +588,16 @@ add_task(async function test_processInco
   do_check_eq(1, collection.count());
   wbo = collection.wbo("DUPE_INCOMING");
   do_check_neq(undefined, wbo);
   let payload = JSON.parse(JSON.parse(wbo.payload).ciphertext);
   do_check_eq("incoming", payload.denomination);
   await cleanAndGo(engine, server);
 });
 
-add_task(async function test_processIncoming_mobile_batchSize() {
-  _("SyncEngine._processIncoming doesn't fetch everything at once on mobile clients");
-
-  Svc.Prefs.set("client.type", "mobile");
-
-  // A collection that logs each GET
-  let collection = new ServerCollection();
-  collection.get_log = [];
-  collection._get = collection.get;
-  collection.get = function(options) {
-    this.get_log.push(options);
-    return this._get(options);
-  };
-
-  // Let's create some 234 server side records. They're all at least
-  // 10 minutes old.
-  for (let i = 0; i < 234; i++) {
-    let id = "record-no-" + i;
-    let payload = encryptPayload({id, denomination: "Record No. " + i});
-    let wbo = new ServerWBO(id, payload);
-    wbo.modified = Date.now() / 1000 - 60 * (i + 10);
-    collection.insertWBO(wbo);
-  }
-
-  let server = sync_httpd_setup({
-      "/1.1/foo/storage/rotary": collection.handler()
-  });
-
-  await SyncTestingInfrastructure(server);
-
-  let engine = makeRotaryEngine();
-  let meta_global = Service.recordManager.set(engine.metaURL,
-                                              new WBORecord(engine.metaURL));
-  meta_global.payload.engines = {rotary: {version: engine.version,
-                                         syncID: engine.syncID}};
-
-  try {
-
-    _("On a mobile client, we get new records from the server in batches of 50.");
-    engine._syncStartup();
-    engine._processIncoming();
-    do_check_attribute_count(engine._store.items, 234);
-    do_check_true("record-no-0" in engine._store.items);
-    do_check_true("record-no-49" in engine._store.items);
-    do_check_true("record-no-50" in engine._store.items);
-    do_check_true("record-no-233" in engine._store.items);
-
-    // Verify that the right number of GET requests with the right
-    // kind of parameters were made.
-    do_check_eq(collection.get_log.length,
-                Math.ceil(234 / MOBILE_BATCH_SIZE) + 1);
-    do_check_eq(collection.get_log[0].full, 1);
-    do_check_eq(collection.get_log[0].limit, MOBILE_BATCH_SIZE);
-    do_check_eq(collection.get_log[1].full, undefined);
-    do_check_eq(collection.get_log[1].limit, undefined);
-    for (let i = 1; i <= Math.floor(234 / MOBILE_BATCH_SIZE); i++) {
-      do_check_eq(collection.get_log[i + 1].full, 1);
-      do_check_eq(collection.get_log[i + 1].limit, undefined);
-      if (i < Math.floor(234 / MOBILE_BATCH_SIZE))
-        do_check_eq(collection.get_log[i + 1].ids.length, MOBILE_BATCH_SIZE);
-      else
-        do_check_eq(collection.get_log[i + 1].ids.length, 234 % MOBILE_BATCH_SIZE);
-    }
-
-  } finally {
-    await cleanAndGo(engine, server);
-  }
-});
-
-
-add_task(async function test_processIncoming_store_toFetch() {
-  _("If processIncoming fails in the middle of a batch on mobile, state is saved in toFetch and lastSync.");
-  Svc.Prefs.set("client.type", "mobile");
-
-  // A collection that throws at the fourth get.
-  let collection = new ServerCollection();
-  collection._get_calls = 0;
-  collection._get = collection.get;
-  collection.get = function() {
-    this._get_calls += 1;
-    if (this._get_calls > 3) {
-      throw "Abort on fourth call!";
-    }
-    return this._get.apply(this, arguments);
-  };
-
-  // Let's create three batches worth of server side records.
-  for (var i = 0; i < MOBILE_BATCH_SIZE * 3; i++) {
-    let id = "record-no-" + i;
-    let payload = encryptPayload({id, denomination: "Record No. " + id});
-    let wbo = new ServerWBO(id, payload);
-    wbo.modified = Date.now() / 1000 + 60 * (i - MOBILE_BATCH_SIZE * 3);
-    collection.insertWBO(wbo);
-  }
-
-  let engine = makeRotaryEngine();
-  engine.enabled = true;
-
-  let server = sync_httpd_setup({
-      "/1.1/foo/storage/rotary": collection.handler()
-  });
-
-  await SyncTestingInfrastructure(server);
-
-  let meta_global = Service.recordManager.set(engine.metaURL,
-                                              new WBORecord(engine.metaURL));
-  meta_global.payload.engines = {rotary: {version: engine.version,
-                                         syncID: engine.syncID}};
-  try {
-
-    // Confirm initial environment
-    do_check_eq(engine.lastSync, 0);
-    do_check_empty(engine._store.items);
-
-    try {
-      await sync_engine_and_validate_telem(engine, true);
-    } catch (ex) {
-    }
-
-    // Only the first two batches have been applied.
-    do_check_eq(Object.keys(engine._store.items).length,
-                MOBILE_BATCH_SIZE * 2);
-
-    // The third batch is stuck in toFetch. lastSync has been moved forward to
-    // the last successful item's timestamp.
-    do_check_eq(engine.toFetch.length, MOBILE_BATCH_SIZE);
-    do_check_eq(engine.lastSync, collection.wbo("record-no-99").modified);
-
-  } finally {
-    await promiseClean(engine, server);
-  }
-});
-
 
 add_task(async function test_processIncoming_resume_toFetch() {
   _("toFetch and previousFailed items left over from previous syncs are fetched on the next sync, along with new items.");
 
   const LASTSYNC = Date.now() / 1000;
 
   // Server records that will be downloaded
   let collection = new ServerCollection();
@@ -1073,39 +940,40 @@ add_task(async function test_processInco
   }
 });
 
 
 add_task(async function test_processIncoming_failed_records() {
   _("Ensure that failed records from _reconcile and applyIncomingBatch are refetched.");
 
   // Let's create three and a bit batches worth of server side records.
+  let APPLY_BATCH_SIZE = 50;
   let collection = new ServerCollection();
-  const NUMBER_OF_RECORDS = MOBILE_BATCH_SIZE * 3 + 5;
+  const NUMBER_OF_RECORDS = APPLY_BATCH_SIZE * 3 + 5;
   for (let i = 0; i < NUMBER_OF_RECORDS; i++) {
     let id = "record-no-" + i;
     let payload = encryptPayload({id, denomination: "Record No. " + id});
     let wbo = new ServerWBO(id, payload);
-    wbo.modified = Date.now() / 1000 + 60 * (i - MOBILE_BATCH_SIZE * 3);
+    wbo.modified = Date.now() / 1000 + 60 * (i - APPLY_BATCH_SIZE * 3);
     collection.insertWBO(wbo);
   }
 
   // Engine that batches but likes to throw on a couple of records,
   // two in each batch: the even ones fail in reconcile, the odd ones
   // in applyIncoming.
   const BOGUS_RECORDS = ["record-no-" + 42,
                          "record-no-" + 23,
-                         "record-no-" + (42 + MOBILE_BATCH_SIZE),
-                         "record-no-" + (23 + MOBILE_BATCH_SIZE),
-                         "record-no-" + (42 + MOBILE_BATCH_SIZE * 2),
-                         "record-no-" + (23 + MOBILE_BATCH_SIZE * 2),
-                         "record-no-" + (2 + MOBILE_BATCH_SIZE * 3),
-                         "record-no-" + (1 + MOBILE_BATCH_SIZE * 3)];
+                         "record-no-" + (42 + APPLY_BATCH_SIZE),
+                         "record-no-" + (23 + APPLY_BATCH_SIZE),
+                         "record-no-" + (42 + APPLY_BATCH_SIZE * 2),
+                         "record-no-" + (23 + APPLY_BATCH_SIZE * 2),
+                         "record-no-" + (2 + APPLY_BATCH_SIZE * 3),
+                         "record-no-" + (1 + APPLY_BATCH_SIZE * 3)];
   let engine = makeRotaryEngine();
-  engine.applyIncomingBatchSize = MOBILE_BATCH_SIZE;
+  engine.applyIncomingBatchSize = APPLY_BATCH_SIZE;
 
   engine.__reconcile = engine._reconcile;
   engine._reconcile = function _reconcile(record) {
     if (BOGUS_RECORDS.indexOf(record.id) % 2 == 0) {
       throw "I don't like this record! Baaaaaah!";
     }
     return this.__reconcile.apply(this, arguments);
   };
@@ -1190,22 +1058,16 @@ add_task(async function test_processInco
     // There are 8 bad records, so this needs 3 fetches.
     _("Test batching with ID batch size 3, normal mobile batch size.");
     do_check_eq(batchDownload(3), 3);
 
     // Now see with a more realistic limit.
     _("Test batching with sufficient ID batch size.");
     do_check_eq(batchDownload(BOGUS_RECORDS.length), 1);
 
-    // If we're on mobile, that limit is used by default.
-    _("Test batching with tiny mobile batch size.");
-    Svc.Prefs.set("client.type", "mobile");
-    engine.mobileGUIDFetchBatchSize = 2;
-    do_check_eq(batchDownload(BOGUS_RECORDS.length), 4);
-
   } finally {
     await cleanAndGo(engine, server);
   }
 });
 
 
 add_task(async function test_processIncoming_decrypt_failed() {
   _("Ensure that records failing to decrypt are either replaced or refetched.");
--- a/services/sync/tests/unit/xpcshell.ini
+++ b/services/sync/tests/unit/xpcshell.ini
@@ -153,17 +153,16 @@ requesttimeoutfactor = 4
 [test_clients_escape.js]
 [test_doctor.js]
 [test_extension_storage_engine.js]
 [test_extension_storage_tracker.js]
 [test_forms_store.js]
 [test_forms_tracker.js]
 # Too many intermittent "ASSERTION: thread pool wasn't shutdown: '!mPool'" (bug 804479)
 skip-if = debug
-[test_history_engine.js]
 [test_history_store.js]
 [test_history_tracker.js]
 # Too many intermittent "ASSERTION: thread pool wasn't shutdown: '!mPool'" (bug 804479)
 skip-if = debug
 [test_places_guid_downgrade.js]
 [test_password_engine.js]
 [test_password_store.js]
 [test_password_validator.js]
--- a/tools/lint/eslint/modules.json
+++ b/tools/lint/eslint/modules.json
@@ -26,17 +26,17 @@
   "BootstrapMonitor.jsm": ["monitor"],
   "browser-loader.js": ["BrowserLoader"],
   "browserid_identity.js": ["BrowserIDManager", "AuthenticationError"],
   "CertUtils.jsm": ["BadCertHandler", "checkCert", "readCertPrefs", "validateCert"],
   "clients.js": ["ClientEngine", "ClientsRec"],
   "collection_repair.js": ["getRepairRequestor", "getAllRepairRequestors", "CollectionRepairRequestor", "getRepairResponder", "CollectionRepairResponder"],
   "collection_validator.js": ["CollectionValidator", "CollectionProblemData"],
   "Console.jsm": ["console", "ConsoleAPI"],
-  "constants.js": ["WEAVE_VERSION", "SYNC_API_VERSION", "USER_API_VERSION", "MISC_API_VERSION", "STORAGE_VERSION", "PREFS_BRANCH", "PWDMGR_HOST", "PWDMGR_PASSWORD_REALM", "PWDMGR_PASSPHRASE_REALM", "PWDMGR_KEYBUNDLE_REALM", "DEFAULT_KEYBUNDLE_NAME", "HMAC_INPUT", "SYNC_KEY_ENCODED_LENGTH", "SYNC_KEY_DECODED_LENGTH", "SYNC_KEY_HYPHENATED_LENGTH", "NO_SYNC_NODE_INTERVAL", "MAX_ERROR_COUNT_BEFORE_BACKOFF", "MAX_IGNORE_ERROR_COUNT", "MINIMUM_BACKOFF_INTERVAL", "MAXIMUM_BACKOFF_INTERVAL", "HMAC_EVENT_INTERVAL", "MASTER_PASSWORD_LOCKED_RETRY_INTERVAL", "DEFAULT_BLOCK_PERIOD", "MOBILE_BATCH_SIZE", "DEFAULT_GUID_FETCH_BATCH_SIZE", "DEFAULT_MOBILE_GUID_FETCH_BATCH_SIZE", "DEFAULT_STORE_BATCH_SIZE", "HISTORY_STORE_BATCH_SIZE", "FORMS_STORE_BATCH_SIZE", "PASSWORDS_STORE_BATCH_SIZE", "ADDONS_STORE_BATCH_SIZE", "APPS_STORE_BATCH_SIZE", "DEFAULT_DOWNLOAD_BATCH_SIZE", "DEFAULT_MAX_RECORD_PAYLOAD_BYTES", "SINGLE_USER_THRESHOLD", "MULTI_DEVICE_THRESHOLD", "SCORE_INCREMENT_SMALL", "SCORE_INCREMENT_MEDIUM", "SCORE_INCREMENT_XLARGE", "SCORE_UPDATE_DELAY", "IDLE_OBSERVER_BACK_DELAY", "MAX_UPLOAD_RECORDS", "MAX_UPLOAD_BYTES", "MAX_HISTORY_UPLOAD", "MAX_HISTORY_DOWNLOAD", "NOTIFY_TAB_SENT_TTL_SECS", "STATUS_OK", "SYNC_FAILED", "LOGIN_FAILED", "SYNC_FAILED_PARTIAL", "CLIENT_NOT_CONFIGURED", "STATUS_DISABLED", "MASTER_PASSWORD_LOCKED", "LOGIN_SUCCEEDED", "SYNC_SUCCEEDED", "ENGINE_SUCCEEDED", "LOGIN_FAILED_NO_USERNAME", "LOGIN_FAILED_NO_PASSWORD", "LOGIN_FAILED_NO_PASSPHRASE", "LOGIN_FAILED_NETWORK_ERROR", "LOGIN_FAILED_SERVER_ERROR", "LOGIN_FAILED_INVALID_PASSPHRASE", "LOGIN_FAILED_LOGIN_REJECTED", "METARECORD_DOWNLOAD_FAIL", "VERSION_OUT_OF_DATE", "DESKTOP_VERSION_OUT_OF_DATE", "SETUP_FAILED_NO_PASSPHRASE", "CREDENTIALS_CHANGED", "ABORT_SYNC_COMMAND", "NO_SYNC_NODE_FOUND", "OVER_QUOTA", "PROLONGED_SYNC_FAILURE", "SERVER_MAINTENANCE", "RESPONSE_OVER_QUOTA", "ENGINE_UPLOAD_FAIL", "ENGINE_DOWNLOAD_FAIL", "ENGINE_UNKNOWN_FAIL", "ENGINE_APPLY_FAIL", "ENGINE_METARECORD_DOWNLOAD_FAIL", "ENGINE_METARECORD_UPLOAD_FAIL", "ENGINE_BATCH_INTERRUPTED", "JPAKE_ERROR_CHANNEL", "JPAKE_ERROR_NETWORK", "JPAKE_ERROR_SERVER", "JPAKE_ERROR_TIMEOUT", "JPAKE_ERROR_INTERNAL", "JPAKE_ERROR_INVALID", "JPAKE_ERROR_NODATA", "JPAKE_ERROR_KEYMISMATCH", "JPAKE_ERROR_WRONGMESSAGE", "JPAKE_ERROR_USERABORT", "JPAKE_ERROR_DELAYUNSUPPORTED", "INFO_COLLECTIONS", "INFO_COLLECTION_USAGE", "INFO_COLLECTION_COUNTS", "INFO_QUOTA", "kSyncMasterPasswordLocked", "kSyncWeaveDisabled", "kSyncNetworkOffline", "kSyncBackoffNotMet", "kFirstSyncChoiceNotMade", "FIREFOX_ID", "FENNEC_ID", "SEAMONKEY_ID", "TEST_HARNESS_ID", "MIN_PP_LENGTH", "MIN_PASS_LENGTH", "DEVICE_TYPE_DESKTOP", "DEVICE_TYPE_MOBILE", "SQLITE_MAX_VARIABLE_NUMBER"],
+  "constants.js": ["WEAVE_VERSION", "SYNC_API_VERSION", "USER_API_VERSION", "MISC_API_VERSION", "STORAGE_VERSION", "PREFS_BRANCH", "PWDMGR_HOST", "PWDMGR_PASSWORD_REALM", "PWDMGR_PASSPHRASE_REALM", "PWDMGR_KEYBUNDLE_REALM", "DEFAULT_KEYBUNDLE_NAME", "HMAC_INPUT", "SYNC_KEY_ENCODED_LENGTH", "SYNC_KEY_DECODED_LENGTH", "SYNC_KEY_HYPHENATED_LENGTH", "NO_SYNC_NODE_INTERVAL", "MAX_ERROR_COUNT_BEFORE_BACKOFF", "MAX_IGNORE_ERROR_COUNT", "MINIMUM_BACKOFF_INTERVAL", "MAXIMUM_BACKOFF_INTERVAL", "HMAC_EVENT_INTERVAL", "MASTER_PASSWORD_LOCKED_RETRY_INTERVAL", "DEFAULT_BLOCK_PERIOD", "DEFAULT_GUID_FETCH_BATCH_SIZE", "DEFAULT_MOBILE_GUID_FETCH_BATCH_SIZE", "DEFAULT_STORE_BATCH_SIZE", "HISTORY_STORE_BATCH_SIZE", "FORMS_STORE_BATCH_SIZE", "PASSWORDS_STORE_BATCH_SIZE", "ADDONS_STORE_BATCH_SIZE", "APPS_STORE_BATCH_SIZE", "DEFAULT_DOWNLOAD_BATCH_SIZE", "DEFAULT_MAX_RECORD_PAYLOAD_BYTES", "SINGLE_USER_THRESHOLD", "MULTI_DEVICE_THRESHOLD", "SCORE_INCREMENT_SMALL", "SCORE_INCREMENT_MEDIUM", "SCORE_INCREMENT_XLARGE", "SCORE_UPDATE_DELAY", "IDLE_OBSERVER_BACK_DELAY", "MAX_UPLOAD_RECORDS", "MAX_UPLOAD_BYTES", "MAX_HISTORY_UPLOAD", "MAX_HISTORY_DOWNLOAD", "NOTIFY_TAB_SENT_TTL_SECS", "STATUS_OK", "SYNC_FAILED", "LOGIN_FAILED", "SYNC_FAILED_PARTIAL", "CLIENT_NOT_CONFIGURED", "STATUS_DISABLED", "MASTER_PASSWORD_LOCKED", "LOGIN_SUCCEEDED", "SYNC_SUCCEEDED", "ENGINE_SUCCEEDED", "LOGIN_FAILED_NO_USERNAME", "LOGIN_FAILED_NO_PASSWORD", "LOGIN_FAILED_NO_PASSPHRASE", "LOGIN_FAILED_NETWORK_ERROR", "LOGIN_FAILED_SERVER_ERROR", "LOGIN_FAILED_INVALID_PASSPHRASE", "LOGIN_FAILED_LOGIN_REJECTED", "METARECORD_DOWNLOAD_FAIL", "VERSION_OUT_OF_DATE", "DESKTOP_VERSION_OUT_OF_DATE", "SETUP_FAILED_NO_PASSPHRASE", "CREDENTIALS_CHANGED", "ABORT_SYNC_COMMAND", "NO_SYNC_NODE_FOUND", "OVER_QUOTA", "PROLONGED_SYNC_FAILURE", "SERVER_MAINTENANCE", "RESPONSE_OVER_QUOTA", "ENGINE_UPLOAD_FAIL", "ENGINE_DOWNLOAD_FAIL", "ENGINE_UNKNOWN_FAIL", "ENGINE_APPLY_FAIL", "ENGINE_METARECORD_DOWNLOAD_FAIL", "ENGINE_METARECORD_UPLOAD_FAIL", "ENGINE_BATCH_INTERRUPTED", "JPAKE_ERROR_CHANNEL", "JPAKE_ERROR_NETWORK", "JPAKE_ERROR_SERVER", "JPAKE_ERROR_TIMEOUT", "JPAKE_ERROR_INTERNAL", "JPAKE_ERROR_INVALID", "JPAKE_ERROR_NODATA", "JPAKE_ERROR_KEYMISMATCH", "JPAKE_ERROR_WRONGMESSAGE", "JPAKE_ERROR_USERABORT", "JPAKE_ERROR_DELAYUNSUPPORTED", "INFO_COLLECTIONS", "INFO_COLLECTION_USAGE", "INFO_COLLECTION_COUNTS", "INFO_QUOTA", "kSyncMasterPasswordLocked", "kSyncWeaveDisabled", "kSyncNetworkOffline", "kSyncBackoffNotMet", "kFirstSyncChoiceNotMade", "FIREFOX_ID", "FENNEC_ID", "SEAMONKEY_ID", "TEST_HARNESS_ID", "MIN_PP_LENGTH", "MIN_PASS_LENGTH", "DEVICE_TYPE_DESKTOP", "DEVICE_TYPE_MOBILE", "SQLITE_MAX_VARIABLE_NUMBER"],
   "Constants.jsm": ["Roles", "Events", "Relations", "Filters", "States", "Prefilters"],
   "ContactDB.jsm": ["ContactDB", "DB_NAME", "STORE_NAME", "SAVED_GETALL_STORE_NAME", "REVISION_STORE", "DB_VERSION"],
   "content-server.jsm": ["init"],
   "content.jsm": ["registerContentFrame"],
   "ContentCrashHandlers.jsm": ["TabCrashHandler", "PluginCrashReporter", "UnsubmittedCrashHandler"],
   "ContentObservers.js": [],
   "ContentPrefUtils.jsm": ["ContentPref", "cbHandleResult", "cbHandleError", "cbHandleCompletion", "safeCallback", "_methodsCallableFromChild"],
   "controller.js": ["MozMillController", "globalEventRegistry", "sleep", "windowMap"],