Bug 1374620 - Enabled the ESLint dot-notation rule across mozilla-central r=standard8
☠☠ backed out by 3fcd58db9fd7 ☠ ☠
authorRajesh Kathiriya <rajesh.kathiriya507@gmail.com>
Tue, 25 Jul 2017 23:45:41 +0530
changeset 423101 f5922a7ed25a9aa0683f57bb43e2a53709c385ee
parent 423100 c8e26d0c9d9ac687d8568fd345c623698ecdd4c4
child 423102 05829f3321beabf3c46d5ee70af757ad7b4fdd40
push id1517
push userjlorenzo@mozilla.com
push dateThu, 14 Sep 2017 16:50:54 +0000
treeherdermozilla-release@3b41fd564418 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersstandard8
bugs1374620
milestone56.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1374620 - Enabled the ESLint dot-notation rule across mozilla-central r=standard8 MozReview-Commit-ID: FadrI2li43G
accessible/tests/browser/.eslintrc.js
accessible/tests/mochitest/common.js
accessible/tests/mochitest/textattrs/test_general.html
accessible/tests/mochitest/treeupdate/test_ariaowns.html
browser/base/content/browser-gestureSupport.js
browser/base/content/test/general/browser_tabfocus.js
browser/base/content/utilityOverlay.js
browser/components/contextualidentity/test/browser/browser_forgetAPI_cookie_getCookiesWithOriginAttributes.js
browser/components/contextualidentity/test/browser/browser_forgetaboutsite.js
browser/components/contextualidentity/test/browser/browser_restore_getCookiesWithOriginAttributes.js
browser/components/customizableui/CustomizableUI.jsm
browser/components/customizableui/CustomizeMode.jsm
browser/components/distribution.js
browser/components/migration/.eslintrc.js
browser/components/nsBrowserGlue.js
browser/components/originattributes/test/browser/file_windowOpenerRestrictionTarget.html
browser/components/places/PlacesUIUtils.jsm
browser/components/places/content/controller.js
browser/components/places/content/places.js
browser/components/places/tests/browser/browser_0_library_left_pane_migration.js
browser/components/places/tests/browser/browser_bookmarkProperties_addLivemark.js
browser/components/places/tests/browser/browser_bookmarkProperties_readOnlyRoot.js
browser/components/places/tests/browser/browser_library_search.js
browser/components/preferences/cookies.js
browser/components/resistfingerprinting/test/browser/file_navigator.html
browser/components/resistfingerprinting/test/browser/file_navigatorWorker.js
browser/components/sessionstore/test/browser_339445_sample.html
browser/components/sessionstore/test/browser_467409-backslashplosion.js
browser/components/sessionstore/test/browser_485563.js
browser/components/sessionstore/test/browser_590268.js
browser/components/sessionstore/test/browser_607016.js
browser/components/sessionstore/test/browser_739805.js
browser/components/sessionstore/test/browser_sessionStorage_size.js
browser/components/shell/content/setDesktopBackground.js
browser/components/uitour/UITour.jsm
browser/experiments/test/xpcshell/test_cache.js
browser/extensions/formautofill/.eslintrc.js
browser/extensions/pocket/content/pktApi.jsm
browser/extensions/shield-recipe-client/test/browser/browser_PreferenceExperiments.js
browser/extensions/shield-recipe-client/test/browser/browser_RecipeRunner.js
browser/modules/ContentCrashHandlers.jsm
browser/modules/DirectoryLinksProvider.jsm
browser/modules/Social.jsm
browser/modules/SocialService.jsm
browser/modules/test/browser/head.js
browser/modules/test/unit/test_DirectoryLinksProvider.js
caps/tests/unit/test_origin.js
js/src/builtin/Intl.js
mobile/android/chrome/content/EmbedRT.js
mobile/android/chrome/content/PermissionsHelper.js
mobile/android/components/AboutRedirector.js
mobile/android/components/BrowserCLH.js
mobile/android/components/LoginManagerPrompter.js
mobile/android/modules/FxAccountsWebChannel.jsm
mobile/android/modules/Home.jsm
mobile/android/modules/JNI.jsm
mobile/android/modules/PageActions.jsm
mobile/android/modules/WebsiteMetadata.jsm
security/.eslintrc.js
services/common/hawkclient.js
services/common/tests/unit/test_storage_server.js
services/common/tokenserverclient.js
services/fxaccounts/FxAccountsProfileClient.jsm
services/fxaccounts/FxAccountsWebChannel.jsm
services/sync/modules/service.js
services/sync/modules/telemetry.js
services/sync/tests/unit/test_addons_engine.js
services/sync/tests/unit/test_declined.js
services/sync/tests/unit/test_engine.js
services/sync/tests/unit/test_errorhandler_2.js
services/sync/tests/unit/test_httpd_sync_server.js
services/sync/tests/unit/test_keys.js
services/sync/tests/unit/test_resource_async.js
services/sync/tests/unit/test_service_sync_updateEnabledEngines.js
services/sync/tests/unit/test_status.js
services/sync/tests/unit/test_syncengine_sync.js
services/sync/tests/unit/test_tab_store.js
services/sync/tps/extensions/tps/resource/auth/fxaccounts.jsm
services/sync/tps/extensions/tps/resource/tps.jsm
testing/marionette/evaluate.js
testing/marionette/event.js
testing/marionette/reftest.js
testing/talos/talos/startup_test/tspaint_test.html
testing/talos/talos/talos-powers/components/TalosPowersService.js
testing/talos/talos/tests/tart/addon/content/tart.js
testing/xpcshell/example/unit/test_import_module.js
toolkit/components/aboutmemory/content/aboutMemory.js
toolkit/components/captivedetect/captivedetect.js
toolkit/components/contentprefs/nsContentPrefService.js
toolkit/components/extensions/.eslintrc.js
toolkit/components/narrate/.eslintrc.js
toolkit/components/passwordmgr/storage-mozStorage.js
toolkit/components/passwordmgr/test/unit/test_context_menu.js
toolkit/components/payments/.eslintrc.js
toolkit/components/places/PlacesDBUtils.jsm
toolkit/components/places/nsPlacesExpiration.js
toolkit/components/places/tests/unit/test_preventive_maintenance.js
toolkit/components/reader/ReaderMode.jsm
toolkit/components/satchel/.eslintrc.js
toolkit/components/search/nsSearchService.js
toolkit/components/search/tests/xpcshell/test_async_migration.js
toolkit/components/search/tests/xpcshell/test_json_cache.js
toolkit/components/search/tests/xpcshell/test_migration_langpack.js
toolkit/components/search/tests/xpcshell/test_save_sorted_engines.js
toolkit/components/search/tests/xpcshell/test_searchReset.js
toolkit/components/search/tests/xpcshell/test_sync_migration.js
toolkit/components/startup/tests/browser/browser_crash_detection.js
toolkit/components/telemetry/TelemetrySession.jsm
toolkit/components/telemetry/tests/unit/test_ChildHistograms.js
toolkit/components/telemetry/tests/unit/test_PingAPI.js
toolkit/components/telemetry/tests/unit/test_TelemetryEnvironment.js
toolkit/components/telemetry/tests/unit/test_TelemetryEvents.js
toolkit/components/telemetry/tests/unit/test_TelemetryHistograms.js
toolkit/components/telemetry/tests/unit/test_TelemetryScalars.js
toolkit/components/telemetry/tests/unit/test_TelemetrySession.js
toolkit/content/aboutSupport.js
toolkit/content/aboutTelemetry.js
toolkit/content/tests/widgets/test_videocontrols_jsdisabled.html
toolkit/content/widgets/datetimebox.xml
toolkit/content/widgets/dialog.xml
toolkit/crashreporter/CrashSubmit.jsm
toolkit/modules/Memory.jsm
toolkit/modules/secondscreen/RokuApp.jsm
toolkit/mozapps/extensions/content/extensions.js
toolkit/mozapps/extensions/content/extensions.xml
toolkit/mozapps/extensions/internal/AddonUpdateChecker.jsm
toolkit/mozapps/extensions/internal/XPIProvider.jsm
toolkit/mozapps/extensions/test/xpcshell/head_addons.js
toolkit/mozapps/extensions/test/xpcshell/test_types.js
tools/leak-gauge/leak-gauge.html
tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js
--- a/accessible/tests/browser/.eslintrc.js
+++ b/accessible/tests/browser/.eslintrc.js
@@ -13,17 +13,17 @@ module.exports = {
     "block-scoped-var": "error",
     "camelcase": "error",
     "comma-dangle": ["error", "never"],
     "complexity": ["error", 20],
     "consistent-this": "off",
     "curly": ["error", "multi-line"],
     "default-case": "off",
     "dot-location": ["error", "property"],
-    "dot-notation": "error",
+    
     "eqeqeq": "off",
     "func-names": "off",
     "func-style": "off",
     "generator-star-spacing": "off",
     "handle-callback-err": ["error", "er"],
     "indent": ["error", 2, {"SwitchCase": 1}],
     "max-nested-callbacks": ["error", 4],
     "max-params": "off",
@@ -82,17 +82,16 @@ module.exports = {
     "space-in-parens": ["error", "never"],
     "space-unary-word-ops": "off",
     "strict": ["error", "global"],
     "valid-jsdoc": "off",
     "vars-on-top": "off",
     "wrap-iife": "off",
     "wrap-regex": "off",
     "yoda": "error",
-
     "guard-for-in": "off",
     "newline-after-var": "off",
     "no-alert": "off",
     "no-eq-null": "off",
     "no-func-assign": "off",
     "no-implied-eval": "off",
     "no-inner-declarations": "off",
     "no-invalid-regexp": "off",
--- a/accessible/tests/mochitest/common.js
+++ b/accessible/tests/mochitest/common.js
@@ -441,18 +441,18 @@ function testAccessibleTree(aAccOrElmOrI
     case "role":
       isRole(acc, accTree[prop], msg);
       break;
 
     case "states":
     case "extraStates":
     case "absentStates":
     case "absentExtraStates": {
-      testStates(acc, accTree["states"], accTree["extraStates"],
-                 accTree["absentStates"], accTree["absentExtraStates"]);
+      testStates(acc, accTree.states, accTree.extraStates,
+                 accTree.absentStates, accTree.absentExtraStates);
       break;
     }
 
     case "tagName":
       is(accTree[prop], acc.DOMNode.tagName, msg);
       break;
 
     case "textAttrs": {
@@ -478,17 +478,17 @@ function testAccessibleTree(aAccOrElmOrI
       if (prop.indexOf("todo_") == 0)
         todo(false, msg);
       else if (prop != "children")
         is(acc[prop], accTree[prop], msg);
     }
   }
 
   // Test children.
-  if ("children" in accTree && accTree["children"] instanceof Array) {
+  if ("children" in accTree && accTree.children instanceof Array) {
     var children = acc.children;
     var childCount = children.length;
 
     if (accTree.children.length != childCount) {
       for (var i = 0; i < Math.max(accTree.children.length, childCount); i++) {
         var accChild = null, testChild = null;
         try {
           testChild = accTree.children[i];
--- a/accessible/tests/mochitest/textattrs/test_general.html
+++ b/accessible/tests/mochitest/textattrs/test_general.html
@@ -200,17 +200,17 @@
 
       attrs = { "text-position": "sub" };
       testTextAttrs(ID, 128, attrs, defAttrs, 128, 142);
 
       //////////////////////////////////////////////////////////////////////////
       // area7
       ID = "area7";
       defAttrs = buildDefaultTextAttrs(ID, "12pt");
-      defAttrs["language"] = "en";
+      defAttrs.language = "en";
       testDefaultTextAttrs(ID, defAttrs);
 
       attrs = {"language": "ru"};
       testTextAttrs(ID, 0, attrs, defAttrs, 0, 6);
 
       attrs = {};
       testTextAttrs(ID, 6, attrs, defAttrs, 6, 7);
 
--- a/accessible/tests/mochitest/treeupdate/test_ariaowns.html
+++ b/accessible/tests/mochitest/treeupdate/test_ariaowns.html
@@ -462,17 +462,17 @@
       }
 
       this.finalCheck = function rearrangeARIAOwns_finalCheck()
       {
         var tree = { SECTION: [ ] };
         for (var role of aRoleList) {
           var ch = {};
           ch[role] = [];
-          tree["SECTION"].push(ch);
+          tree.SECTION.push(ch);
         }
         testAccessibleTree(aContainer, tree);
       }
 
       this.getID = function rearrangeARIAOwns_getID()
       {
         return `Rearrange @aria-owns attribute to '${aAttr}'`;
       }
--- a/browser/base/content/browser-gestureSupport.js
+++ b/browser/base/content/browser-gestureSupport.js
@@ -137,22 +137,22 @@ var gGestureSupport = {
     let isLatched = false;
 
     // Create the update function here to capture closure state
     this._doUpdate = function GS__doUpdate(updateEvent) {
       // Update the offset with new event data
       offset += updateEvent.delta;
 
       // Check if the cumulative deltas exceed the threshold
-      if (Math.abs(offset) > aPref["threshold"]) {
+      if (Math.abs(offset) > aPref.threshold) {
         // Trigger the action if we don't care about latching; otherwise, make
         // sure either we're not latched and going the same direction of the
         // initial motion; or we're latched and going the opposite way
         let sameDir = (latchDir ^ offset) >= 0;
-        if (!aPref["latched"] || (isLatched ^ sameDir)) {
+        if (!aPref.latched || (isLatched ^ sameDir)) {
           this._doAction(updateEvent, [aGesture, offset > 0 ? aInc : aDec]);
 
           // We must be getting latched or leaving it, so just toggle
           isLatched = !isLatched;
         }
 
         // Reset motion counter to prepare for more of the same gesture
         offset = 0;
--- a/browser/base/content/test/general/browser_tabfocus.js
+++ b/browser/base/content/test/general/browser_tabfocus.js
@@ -7,26 +7,26 @@
 var testPage1 = "<html id='html1'><body id='body1'><button id='button1'>Tab 1</button></body></html>";
 var testPage2 = "<html id='html2'><body id='body2'><button id='button2'>Tab 2</button></body></html>";
 var testPage3 = "<html id='html3'><body id='body3'><button id='button3'>Tab 3</button></body></html>";
 
 const fm = Services.focus;
 
 function EventStore() {
   this["main-window"] = [];
-  this["window1"] = [];
-  this["window2"] = [];
+  this.window1 = [];
+  this.window2 = [];
 }
 
 EventStore.prototype = {
   "push": function(event) {
     if (event.indexOf("1") > -1) {
-      this["window1"].push(event);
+      this.window1.push(event);
     } else if (event.indexOf("2") > -1) {
-      this["window2"].push(event);
+      this.window2.push(event);
     } else {
       this["main-window"].push(event);
     }
   }
 }
 
 var tab1 = null;
 var tab2 = null;
@@ -538,14 +538,14 @@ function expectFocusShift(callback, expe
     _lastfocuswindow = expectedWindow;
   }
 
   return new Promise((resolve, reject) => {
     currentPromiseResolver = resolve;
     callback();
 
     // No events are expected, so resolve the promise immediately.
-    if (expectedEvents["main-window"].length + expectedEvents["window1"].length + expectedEvents["window2"].length == 0) {
+    if (expectedEvents["main-window"].length + expectedEvents.window1.length + expectedEvents.window2.length == 0) {
       currentPromiseResolver();
       currentPromiseResolver = null;
     }
   });
 }
--- a/browser/base/content/utilityOverlay.js
+++ b/browser/base/content/utilityOverlay.js
@@ -727,38 +727,38 @@ function openAboutDialog() {
 function openPreferences(paneID, extraArgs) {
   let histogram = Services.telemetry.getHistogramById("FX_PREFERENCES_OPENED_VIA");
   if (extraArgs && extraArgs.origin) {
     histogram.add(extraArgs.origin);
   } else {
     histogram.add("other");
   }
   function switchToAdvancedSubPane(doc) {
-    if (extraArgs && extraArgs["advancedTab"]) {
+    if (extraArgs && extraArgs.advancedTab) {
       // After the Preferences reorg works in Bug 1335907, no more advancedPrefs element.
       // The old Preference is pref-off behind `browser.preferences.useOldOrganization` on Nightly.
       // During the transition between the old and new Preferences, should do checking before proceeding.
       let advancedPaneTabs = doc.getElementById("advancedPrefs");
       if (advancedPaneTabs) {
-        advancedPaneTabs.selectedTab = doc.getElementById(extraArgs["advancedTab"]);
+        advancedPaneTabs.selectedTab = doc.getElementById(extraArgs.advancedTab);
       }
     }
   }
 
   // This function is duplicated from preferences.js.
   function internalPrefCategoryNameToFriendlyName(aName) {
     return (aName || "").replace(/^pane./, function(toReplace) { return toReplace[4].toLowerCase(); });
   }
 
   let win = Services.wm.getMostRecentWindow("navigator:browser");
   let friendlyCategoryName = internalPrefCategoryNameToFriendlyName(paneID);
   let params;
-  if (extraArgs && extraArgs["urlParams"]) {
+  if (extraArgs && extraArgs.urlParams) {
     params = new URLSearchParams();
-    let urlParams = extraArgs["urlParams"];
+    let urlParams = extraArgs.urlParams;
     for (let name in urlParams) {
       if (urlParams[name] !== undefined) {
         params.set(name, urlParams[name]);
       }
     }
   }
   let preferencesURL = "about:preferences" + (params ? "?" + params : "") +
                        (friendlyCategoryName ? "#" + friendlyCategoryName : "");
--- a/browser/components/contextualidentity/test/browser/browser_forgetAPI_cookie_getCookiesWithOriginAttributes.js
+++ b/browser/components/contextualidentity/test/browser/browser_forgetAPI_cookie_getCookiesWithOriginAttributes.js
@@ -61,18 +61,18 @@ add_task(async function test_cookie_getC
   }
 
   // Check that cookies have been set properly.
   for (let userContextId of Object.keys(USER_CONTEXTS)) {
     let enumerator = getCookiesForOA(TEST_HOST, userContextId);
     ok(enumerator.hasMoreElements(), "Cookies available");
 
     let foundCookie = enumerator.getNext().QueryInterface(Ci.nsICookie2);
-    is(foundCookie["name"], cookieName, "Check cookie name");
-    is(foundCookie["value"], USER_CONTEXTS[userContextId], "Check cookie value");
+    is(foundCookie.name, cookieName, "Check cookie name");
+    is(foundCookie.value, USER_CONTEXTS[userContextId], "Check cookie value");
   }
 
   // Using getCookiesWithOriginAttributes() to get all cookies for a certain
   // domain by using the originAttributes pattern, and clear all these cookies.
   let enumerator = Services.cookies.getCookiesWithOriginAttributes(JSON.stringify({}), TEST_HOST);
   while (enumerator.hasMoreElements()) {
     let cookie = enumerator.getNext().QueryInterface(Ci.nsICookie);
     Services.cookies.remove(cookie.host, cookie.name, cookie.path, false, cookie.originAttributes);
--- a/browser/components/contextualidentity/test/browser/browser_forgetaboutsite.js
+++ b/browser/components/contextualidentity/test/browser/browser_forgetaboutsite.js
@@ -140,18 +140,18 @@ async function test_cookie_cleared() {
     await BrowserTestUtils.removeTab(tabs[userContextId].tab);
   }
   // Check that cookies have been set properly.
   for (let userContextId of Object.keys(USER_CONTEXTS)) {
     let enumerator = getCookiesForOA(TEST_HOST, userContextId);
     ok(enumerator.hasMoreElements(), "Cookies available");
 
     let foundCookie = enumerator.getNext().QueryInterface(Ci.nsICookie2);
-    Assert.equal(foundCookie["name"], COOKIE_NAME, "Check cookie name");
-    Assert.equal(foundCookie["value"], USER_CONTEXTS[userContextId], "Check cookie value");
+    Assert.equal(foundCookie.name, COOKIE_NAME, "Check cookie name");
+    Assert.equal(foundCookie.value, USER_CONTEXTS[userContextId], "Check cookie value");
   }
 
   // Forget the site.
   await ForgetAboutSite.removeDataFromDomain(TEST_HOST);
 
   // Check that whether cookies has been cleared or not.
   for (let userContextId of Object.keys(USER_CONTEXTS)) {
     let enumerator = getCookiesForOA(TEST_HOST, userContextId);
--- a/browser/components/contextualidentity/test/browser/browser_restore_getCookiesWithOriginAttributes.js
+++ b/browser/components/contextualidentity/test/browser/browser_restore_getCookiesWithOriginAttributes.js
@@ -52,18 +52,18 @@ function checkCookies(ignoreContext = nu
   for (let userContextId of Object.keys(USER_CONTEXTS)) {
     if (ignoreContext && userContextId === String(ignoreContext)) {
       continue;
     }
     let enumerator = getCookiesForOA(TEST_HOST, userContextId);
     ok(enumerator.hasMoreElements(), "Cookies available");
 
     let foundCookie = enumerator.getNext().QueryInterface(Ci.nsICookie2);
-    is(foundCookie["name"], COOKIE_NAME, "Check cookie name");
-    is(foundCookie["value"], USER_CONTEXTS[userContextId], "Check cookie value");
+    is(foundCookie.name, COOKIE_NAME, "Check cookie name");
+    is(foundCookie.value, USER_CONTEXTS[userContextId], "Check cookie value");
   }
 }
 
 function deleteCookies(onlyContext = null) {
   // Using getCookiesWithOriginAttributes() to get all cookies for a certain
   // domain by using the originAttributes pattern, and clear all these cookies.
   let enumerator = Services.cookies.getCookiesWithOriginAttributes(JSON.stringify({}), TEST_HOST);
   while (enumerator.hasMoreElements()) {
@@ -90,18 +90,18 @@ add_task(async function test_cookie_getC
   }
 
   // Check that cookies have been set properly.
   for (let userContextId of Object.keys(USER_CONTEXTS)) {
     let enumerator = getCookiesForOA(TEST_HOST, userContextId);
     ok(enumerator.hasMoreElements(), "Cookies available");
 
     let foundCookie = enumerator.getNext().QueryInterface(Ci.nsICookie2);
-    is(foundCookie["name"], COOKIE_NAME, "Check cookie name");
-    is(foundCookie["value"], USER_CONTEXTS[userContextId], "Check cookie value");
+    is(foundCookie.name, COOKIE_NAME, "Check cookie name");
+    is(foundCookie.value, USER_CONTEXTS[userContextId], "Check cookie value");
   }
   checkCookies();
 
   deleteCookies(DELETE_CONTEXT);
 
   checkCookies(DELETE_CONTEXT);
 
   deleteCookies();
--- a/browser/components/customizableui/CustomizableUI.jsm
+++ b/browser/components/customizableui/CustomizableUI.jsm
@@ -550,17 +550,17 @@ var CustomizableUIInternal = {
     }
     // Default to a toolbar:
     if (!props.has("type")) {
       props.set("type", CustomizableUI.TYPE_TOOLBAR);
     }
     if (props.get("type") == CustomizableUI.TYPE_TOOLBAR) {
       // Check aProperties instead of props because this check is only interested
       // in the passed arguments, not the state of a potentially pre-existing area.
-      if (!aInternalCaller && aProperties["defaultCollapsed"]) {
+      if (!aInternalCaller && aProperties.defaultCollapsed) {
         throw new Error("defaultCollapsed is only allowed for default toolbars.")
       }
       if (!props.has("defaultCollapsed")) {
         props.set("defaultCollapsed", true);
       }
     } else if (props.has("defaultCollapsed")) {
       throw new Error("defaultCollapsed only applies for TYPE_TOOLBAR areas.");
     }
--- a/browser/components/customizableui/CustomizeMode.jsm
+++ b/browser/components/customizableui/CustomizeMode.jsm
@@ -2547,17 +2547,17 @@ CustomizeMode.prototype = {
   },
 };
 
 function __dumpDragData(aEvent, caller) {
   if (!gDebug) {
     return;
   }
   let str = "Dumping drag data (" + (caller ? caller + " in " : "") + "CustomizeMode.jsm) {\n";
-  str += "  type: " + aEvent["type"] + "\n";
+  str += "  type: " + aEvent.type + "\n";
   for (let el of ["target", "currentTarget", "relatedTarget"]) {
     if (aEvent[el]) {
       str += "  " + el + ": " + aEvent[el] + "(localName=" + aEvent[el].localName + "; id=" + aEvent[el].id + ")\n";
     }
   }
   for (let prop in aEvent.dataTransfer) {
     if (typeof aEvent.dataTransfer[prop] != "function") {
       str += "  dataTransfer[" + prop + "]: " + aEvent.dataTransfer[prop] + "\n";
--- a/browser/components/distribution.js
+++ b/browser/components/distribution.js
@@ -112,17 +112,17 @@ DistributionCustomizer.prototype = {
         } else if (keys.indexOf(key + "." + this._language) >= 0) {
           key += "." + this._language;
         }
 
         if (!items[itemIndex])
           items[itemIndex] = {};
         items[itemIndex][iprop] = this._ini.getString(section, key);
 
-        if (iprop == "type" && items[itemIndex]["type"] == "default")
+        if (iprop == "type" && items[itemIndex].type == "default")
           defaultIndex = itemIndex;
 
         if (maxIndex < itemIndex)
           maxIndex = itemIndex;
       } else {
         dump(`Key did not match: ${key}\n`);
       }
     }
@@ -259,58 +259,58 @@ DistributionCustomizer.prototype = {
   async _doApplyBookmarks() {
     if (!this._ini)
       return;
 
     let sections = enumToObject(this._ini.getSections());
 
     // The global section, and several of its fields, is required
     // (we also check here to be consistent with applyPrefDefaults below)
-    if (!sections["Global"])
+    if (!sections.Global)
       return;
 
     let globalPrefs = enumToObject(this._ini.getKeys("Global"));
-    if (!(globalPrefs["id"] && globalPrefs["version"] && globalPrefs["about"]))
+    if (!(globalPrefs.id && globalPrefs.version && globalPrefs.about))
       return;
 
     let bmProcessedPref;
     try {
       bmProcessedPref = this._ini.getString("Global",
                                             "bookmarks.initialized.pref");
     } catch (e) {
       bmProcessedPref = "distribution." +
         this._ini.getString("Global", "id") + ".bookmarksProcessed";
     }
 
     let bmProcessed = this._prefs.getBoolPref(bmProcessedPref, false);
 
     if (!bmProcessed) {
-      if (sections["BookmarksMenu"])
+      if (sections.BookmarksMenu)
         await this._parseBookmarksSection(PlacesUtils.bookmarks.menuGuid,
                                           "BookmarksMenu");
-      if (sections["BookmarksToolbar"])
+      if (sections.BookmarksToolbar)
         await this._parseBookmarksSection(PlacesUtils.bookmarks.toolbarGuid,
                                           "BookmarksToolbar");
       this._prefs.setBoolPref(bmProcessedPref, true);
     }
   },
 
   _prefDefaultsApplied: false,
   applyPrefDefaults: function DIST_applyPrefDefaults() {
     this._prefDefaultsApplied = true;
     if (!this._ini)
       return this._checkCustomizationComplete();
 
     let sections = enumToObject(this._ini.getSections());
 
     // The global section, and several of its fields, is required
-    if (!sections["Global"])
+    if (!sections.Global)
       return this._checkCustomizationComplete();
     let globalPrefs = enumToObject(this._ini.getKeys("Global"));
-    if (!(globalPrefs["id"] && globalPrefs["version"] && globalPrefs["about"]))
+    if (!(globalPrefs.id && globalPrefs.version && globalPrefs.about))
       return this._checkCustomizationComplete();
 
     let defaults = new Preferences({defaultBranch: true});
 
     // Global really contains info we set as prefs.  They're only
     // separate because they are "special" (read: required)
 
     defaults.set("distribution.id", this._ini.getString("Global", "id"));
@@ -355,17 +355,17 @@ DistributionCustomizer.prototype = {
           if (value) {
             defaults.set(key, parseValue(value));
           }
           usedPreferences.push(key);
         } catch (e) { /* ignore bad prefs and move on */ }
       }
     }
 
-    if (sections["Preferences"]) {
+    if (sections.Preferences) {
       for (let key of enumerate(this._ini.getKeys("Preferences"))) {
         if (usedPreferences.indexOf(key) > -1) {
           continue;
         }
         try {
           let value = this._ini.getString("Preferences", key);
           if (value) {
             value = value.replace(/%LOCALE%/g, this._locale);
@@ -407,17 +407,17 @@ DistributionCustomizer.prototype = {
             localizedStr.data = "data:text/plain," + key + "=" + value;
             defaults._prefBranch.setComplexValue(key, Ci.nsIPrefLocalizedString, localizedStr);
           }
           usedLocalizablePreferences.push(key);
         } catch (e) { /* ignore bad prefs and move on */ }
       }
     }
 
-    if (sections["LocalizablePreferences"]) {
+    if (sections.LocalizablePreferences) {
       for (let key of enumerate(this._ini.getKeys("LocalizablePreferences"))) {
         if (usedLocalizablePreferences.indexOf(key) > -1) {
           continue;
         }
         try {
           let value = this._ini.getString("LocalizablePreferences", key);
           if (value) {
             value = parseValue(value);
--- a/browser/components/migration/.eslintrc.js
+++ b/browser/components/migration/.eslintrc.js
@@ -1,16 +1,15 @@
 "use strict";
 
 module.exports = {
   "rules": {
     "block-scoped-var": "error",
     "comma-dangle": "off",
     "complexity": ["error", {"max": 21}],
-    "dot-notation": "error",
     "indent": ["error", 2, {"SwitchCase": 1, "ArrayExpression": "first", "ObjectExpression": "first"}],
     "max-nested-callbacks": ["error", 3],
     "new-parens": "error",
     "no-extend-native": "error",
     "no-fallthrough": ["error", { "commentPattern": ".*[Ii]ntentional(?:ly)?\\s+fall(?:ing)?[\\s-]*through.*" }],
     "no-multi-str": "error",
     "no-return-assign": "error",
     "no-sequences": "error",
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -1894,17 +1894,17 @@ BrowserGlue.prototype = {
         if (defaultBehavior > 0) {
           prefValue = !!(defaultBehavior & Ci.mozIPlacesAutoComplete["BEHAVIOR_" + type.toUpperCase()]);
         }
         Services.prefs.setBoolPref("browser.urlbar.suggest." + type, prefValue);
       }
 
       // Typed behavior will be used only for results from history.
       if (defaultBehavior != -1 &&
-          !!(defaultBehavior & Ci.mozIPlacesAutoComplete["BEHAVIOR_TYPED"])) {
+          !!(defaultBehavior & Ci.mozIPlacesAutoComplete.BEHAVIOR_TYPED)) {
         Services.prefs.setBoolPref("browser.urlbar.suggest.history.onlyTyped", true);
       }
     }
 
     if (currentUIVersion < 27) {
       // Fix up document color use:
       const kOldColorPref = "browser.display.use_document_colors";
       if (Services.prefs.prefHasUserValue(kOldColorPref) &&
--- a/browser/components/originattributes/test/browser/file_windowOpenerRestrictionTarget.html
+++ b/browser/components/originattributes/test/browser/file_windowOpenerRestrictionTarget.html
@@ -11,17 +11,17 @@
     let openerRestriction = true;
     let cookieValue;
     if (window.location.search.length > 0) {
       cookieValue = window.location.search.substr(1);
       openerRestriction = false;
     }
 
     try {
-      let openerFrame = window.opener.frames["child"];
+      let openerFrame = window.opener.frames.child;
       let result = openerFrame.document.cookie === cookieValue;
       if (result && !openerRestriction) {
         document.title = "pass";
       }
     } catch (e) {
       if (openerRestriction) {
         document.title = "pass";
       }
--- a/browser/components/places/PlacesUIUtils.jsm
+++ b/browser/components/places/PlacesUIUtils.jsm
@@ -1355,17 +1355,17 @@ this.PlacesUIUtils = {
 
   /**
    * Get the folder id for the organizer left-pane folder.
    */
   get allBookmarksFolderId() {
     // ensure the left-pane root is initialized;
     this.leftPaneFolderId;
     delete this.allBookmarksFolderId;
-    return this.allBookmarksFolderId = this.leftPaneQueries["AllBookmarks"];
+    return this.allBookmarksFolderId = this.leftPaneQueries.AllBookmarks;
   },
 
   /**
    * If an item is a left-pane query, returns the name of the query
    * or an empty string if not.
    *
    * @param aItemId id of a container
    * @return the name of the query, or empty string if not a left-pane query
--- a/browser/components/places/content/controller.js
+++ b/browser/components/places/content/controller.js
@@ -422,47 +422,47 @@ PlacesController.prototype = {
       var node = nodes[i];
       var nodeType = node.type;
       var uri = null;
 
       // We don't use the nodeIs* methods here to avoid going through the type
       // property way too often
       switch (nodeType) {
         case Ci.nsINavHistoryResultNode.RESULT_TYPE_QUERY:
-          nodeData["query"] = true;
+          nodeData.query = true;
           if (node.parent) {
             switch (PlacesUtils.asQuery(node.parent).queryOptions.resultType) {
               case Ci.nsINavHistoryQueryOptions.RESULTS_AS_SITE_QUERY:
-                nodeData["host"] = true;
+                nodeData.host = true;
                 break;
               case Ci.nsINavHistoryQueryOptions.RESULTS_AS_DATE_SITE_QUERY:
               case Ci.nsINavHistoryQueryOptions.RESULTS_AS_DATE_QUERY:
-                nodeData["day"] = true;
+                nodeData.day = true;
                 break;
             }
           }
           break;
         case Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER:
         case Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT:
-          nodeData["folder"] = true;
+          nodeData.folder = true;
           break;
         case Ci.nsINavHistoryResultNode.RESULT_TYPE_SEPARATOR:
-          nodeData["separator"] = true;
+          nodeData.separator = true;
           break;
         case Ci.nsINavHistoryResultNode.RESULT_TYPE_URI:
-          nodeData["link"] = true;
+          nodeData.link = true;
           uri = NetUtil.newURI(node.uri);
           if (PlacesUtils.nodeIsBookmark(node)) {
-            nodeData["bookmark"] = true;
+            nodeData.bookmark = true;
             var parentNode = node.parent;
             if (parentNode) {
               if (PlacesUtils.nodeIsTagQuery(parentNode))
-                nodeData["tagChild"] = true;
+                nodeData.tagChild = true;
               else if (this.hasCachedLivemarkInfo(parentNode))
-                nodeData["livemarkChild"] = true;
+                nodeData.livemarkChild = true;
             }
           }
           break;
       }
 
       // annotations
       if (uri) {
         let names = PlacesUtils.annotations.getPageAnnotationNames(uri);
--- a/browser/components/places/content/places.js
+++ b/browser/components/places/content/places.js
@@ -278,19 +278,19 @@ var PlacesOrganizer = {
    * Sets the search scope based on aNode's properties.
    * @param   aNode
    *          the node to set up scope from
    */
   _setSearchScopeForNode: function PO__setScopeForNode(aNode) {
     let itemId = aNode.itemId;
 
     if (PlacesUtils.nodeIsHistoryContainer(aNode) ||
-        itemId == PlacesUIUtils.leftPaneQueries["History"]) {
+        itemId == PlacesUIUtils.leftPaneQueries.History) {
       PlacesQueryBuilder.setScope("history");
-    } else if (itemId == PlacesUIUtils.leftPaneQueries["Downloads"]) {
+    } else if (itemId == PlacesUIUtils.leftPaneQueries.Downloads) {
       PlacesQueryBuilder.setScope("downloads");
     } else {
       // Default to All Bookmarks for all other nodes, per bug 469437.
       PlacesQueryBuilder.setScope("bookmarks");
     }
   },
 
   /**
--- a/browser/components/places/tests/browser/browser_0_library_left_pane_migration.js
+++ b/browser/components/places/tests/browser/browser_0_library_left_pane_migration.js
@@ -78,13 +78,13 @@ add_task(async function() {
   version = PlacesUtils.annotations.getItemAnnotation(leftPaneRoot,
                                                       PlacesUIUtils.ORGANIZER_FOLDER_ANNO);
   is(version, PlacesUIUtils.ORGANIZER_LEFTPANE_VERSION,
      "Left pane version has been correctly upgraded");
 
   // Check left pane is populated.
   organizer.PlacesOrganizer.selectLeftPaneQuery("History");
   is(organizer.PlacesOrganizer._places.selectedNode.itemId,
-     PlacesUIUtils.leftPaneQueries["History"],
+     PlacesUIUtils.leftPaneQueries.History,
      "Library left pane is populated and working");
 
   await promiseLibraryClosed(organizer);
 });
--- a/browser/components/places/tests/browser/browser_bookmarkProperties_addLivemark.js
+++ b/browser/components/places/tests/browser/browser_bookmarkProperties_addLivemark.js
@@ -1,15 +1,15 @@
 "use strict"
 
 add_task(async function() {
   info("Add a live bookmark editing its data");
 
   await withSidebarTree("bookmarks", async function(tree) {
-    let itemId = PlacesUIUtils.leftPaneQueries["UnfiledBookmarks"];
+    let itemId = PlacesUIUtils.leftPaneQueries.UnfiledBookmarks;
     tree.selectItems([itemId]);
 
     await withBookmarksDialog(
       true,
       function openDialog() {
         PlacesCommandHook.addLiveBookmark("http://livemark.com/",
                                           "livemark", "description");
       },
--- a/browser/components/places/tests/browser/browser_bookmarkProperties_readOnlyRoot.js
+++ b/browser/components/places/tests/browser/browser_bookmarkProperties_readOnlyRoot.js
@@ -1,15 +1,15 @@
 "use strict"
 
 add_task(async function() {
   info("Bug 479348 - Properties on a root should be read-only.");
 
   await withSidebarTree("bookmarks", async function(tree) {
-    let itemId = PlacesUIUtils.leftPaneQueries["UnfiledBookmarks"];
+    let itemId = PlacesUIUtils.leftPaneQueries.UnfiledBookmarks;
     tree.selectItems([itemId]);
     ok(tree.controller.isCommandEnabled("placesCmd_show:info"),
        "'placesCmd_show:info' on current selected node is enabled");
 
     await withBookmarksDialog(
       true,
       function openDialog() {
         tree.controller.doCommand("placesCmd_show:info");
--- a/browser/components/places/tests/browser/browser_library_search.js
+++ b/browser/components/places/tests/browser/browser_library_search.js
@@ -32,38 +32,38 @@ var gLibrary;
 
 var testCases = [
   function allBookmarksScope() {
     let defScope = getDefaultScope(PlacesUIUtils.allBookmarksFolderId);
     search(PlacesUIUtils.allBookmarksFolderId, "dummy", defScope);
   },
 
   function historyScope() {
-    let defScope = getDefaultScope(PlacesUIUtils.leftPaneQueries["History"]);
-    search(PlacesUIUtils.leftPaneQueries["History"], "dummy", defScope);
+    let defScope = getDefaultScope(PlacesUIUtils.leftPaneQueries.History);
+    search(PlacesUIUtils.leftPaneQueries.History, "dummy", defScope);
   },
 
   function downloadsScope() {
-    let defScope = getDefaultScope(PlacesUIUtils.leftPaneQueries["Downloads"]);
-    search(PlacesUIUtils.leftPaneQueries["Downloads"], "dummy", defScope);
+    let defScope = getDefaultScope(PlacesUIUtils.leftPaneQueries.Downloads);
+    search(PlacesUIUtils.leftPaneQueries.Downloads, "dummy", defScope);
   },
 ];
 
 /**
  * Returns the default search scope for a given folder.
  *
  * @param  aFolderId
  *         the item ID of a node in the left pane's tree
  * @return the default scope when the folder is newly selected
  */
 function getDefaultScope(aFolderId) {
   switch (aFolderId) {
-    case PlacesUIUtils.leftPaneQueries["History"]:
+    case PlacesUIUtils.leftPaneQueries.History:
       return "scopeBarHistory"
-    case PlacesUIUtils.leftPaneQueries["Downloads"]:
+    case PlacesUIUtils.leftPaneQueries.Downloads:
       return "scopeBarDownloads";
     default:
       return "scopeBarAll";
   }
 }
 
 /**
  * Returns the single nsINavHistoryQuery represented by a given place URI.
@@ -111,18 +111,18 @@ function search(aFolderId, aSearchStr, a
   // content tree properly.
   if (aFolderId) {
     folderTree.selectItems([aFolderId]);
     isnot(folderTree.selectedNode, null,
        "Sanity check: left pane tree should have selection after selecting!");
 
     // getFolders() on a History query returns an empty array, so no use
     // comparing against aFolderId in that case.
-    if (aFolderId !== PlacesUIUtils.leftPaneQueries["History"] &&
-        aFolderId !== PlacesUIUtils.leftPaneQueries["Downloads"]) {
+    if (aFolderId !== PlacesUIUtils.leftPaneQueries.History &&
+        aFolderId !== PlacesUIUtils.leftPaneQueries.Downloads) {
       // contentTree.place should be equal to contentTree.result.root.uri,
       // but it's not until bug 476952 is fixed.
       let query = queryStringToQuery(contentTree.result.root.uri);
       is(query.getFolders()[0], aFolderId,
          "Content tree's folder should be what was selected in the left pane");
     }
   }
 
--- a/browser/components/preferences/cookies.js
+++ b/browser/components/preferences/cookies.js
@@ -209,18 +209,18 @@ var gCookiesWindow = {
         return this._filterSet[aIndex];
 
       var start = 0;
       var count = 0, hostIndex = 0;
 
       var cacheIndex = Math.min(this._cacheValid, aIndex);
       if (cacheIndex > 0) {
         var cacheItem = this._cacheItems[cacheIndex];
-        start = cacheItem["start"];
-        count = hostIndex = cacheItem["count"];
+        start = cacheItem.start;
+        count = hostIndex = cacheItem.count;
       }
 
       for (let i = start; i < gCookiesWindow._hostOrder.length; ++i) { // var host in gCookiesWindow._hosts) {
         let currHost = gCookiesWindow._hosts[gCookiesWindow._hostOrder[i]];// gCookiesWindow._hosts[host];
         if (!currHost) continue;
         if (count == aIndex)
           return currHost;
         hostIndex = count;
--- a/browser/components/resistfingerprinting/test/browser/file_navigator.html
+++ b/browser/components/resistfingerprinting/test/browser/file_navigator.html
@@ -3,30 +3,30 @@
 <title>Test page for navigator object</title>
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8"></meta>
 <script>
   // This page will collect information from the navigator object and store
   // the result at a paragraph in the page.
   function collect() {
     let result = {};
 
-    result["appCodeName"] = navigator.appCodeName;
-    result["appName"] = navigator.appName;
-    result["appVersion"] = navigator.appVersion;
-    result["platform"] = navigator.platform;
-    result["userAgent"] = navigator.userAgent;
-    result["product"] = navigator.product;
-    result["productSub"] = navigator.productSub;
-    result["vendor"] = navigator.vendor;
-    result["vendorSub"] = navigator.vendorSub;
-    result["mimeTypesLength"] = navigator.mimeTypes.length;
-    result["pluginsLength"] = navigator.plugins.length;
-    result["oscpu"] = navigator.oscpu;
-    result["buildID"] = navigator.buildID;
-    result["hardwareConcurrency"] = navigator.hardwareConcurrency;
+    result.appCodeName = navigator.appCodeName;
+    result.appName = navigator.appName;
+    result.appVersion = navigator.appVersion;
+    result.platform = navigator.platform;
+    result.userAgent = navigator.userAgent;
+    result.product = navigator.product;
+    result.productSub = navigator.productSub;
+    result.vendor = navigator.vendor;
+    result.vendorSub = navigator.vendorSub;
+    result.mimeTypesLength = navigator.mimeTypes.length;
+    result.pluginsLength = navigator.plugins.length;
+    result.oscpu = navigator.oscpu;
+    result.buildID = navigator.buildID;
+    result.hardwareConcurrency = navigator.hardwareConcurrency;
 
     // eslint-disable-next-line no-unsanitized/property
     document.getElementById("result").innerHTML = JSON.stringify(result);
   }
 </script>
 </head>
 <body onload="collect();">
 <p id="result"></p>
--- a/browser/components/resistfingerprinting/test/browser/file_navigatorWorker.js
+++ b/browser/components/resistfingerprinting/test/browser/file_navigatorWorker.js
@@ -1,19 +1,19 @@
 /* eslint-env worker */
 
 onconnect = function(e) {
   let port = e.ports[0];
 
   let navigatorObj = self.navigator;
   let result = {};
 
-  result["appCodeName"] = navigatorObj.appCodeName;
-  result["appName"] = navigatorObj.appName;
-  result["appVersion"] = navigatorObj.appVersion;
-  result["platform"] = navigatorObj.platform;
-  result["userAgent"] = navigatorObj.userAgent;
-  result["product"] = navigatorObj.product;
-  result["hardwareConcurrency"] = navigatorObj.hardwareConcurrency;
+  result.appCodeName = navigatorObj.appCodeName;
+  result.appName = navigatorObj.appName;
+  result.appVersion = navigatorObj.appVersion;
+  result.platform = navigatorObj.platform;
+  result.userAgent = navigatorObj.userAgent;
+  result.product = navigatorObj.product;
+  result.hardwareConcurrency = navigatorObj.hardwareConcurrency;
 
   port.postMessage(JSON.stringify(result));
   port.start();
 };
--- a/browser/components/sessionstore/test/browser_339445_sample.html
+++ b/browser/components/sessionstore/test/browser_339445_sample.html
@@ -8,11 +8,11 @@ storageTestItem = <span id="storageTestI
   storageTestItem's textContent will be one of the following:
   * FAIL    : sessionStorage wasn't available
   * PENDING : the test value has been initialized on first load
   * SUCCESS : the test value was correctly retrieved
 -->
 
 <script type="application/javascript">
   document.getElementById("storageTestItem").textContent =
-    sessionStorage["storageTestItem"] || "PENDING";
-  sessionStorage["storageTestItem"] = "SUCCESS";
+    sessionStorage.storageTestItem || "PENDING";
+  sessionStorage.storageTestItem = "SUCCESS";
 </script>
--- a/browser/components/sessionstore/test/browser_467409-backslashplosion.js
+++ b/browser/components/sessionstore/test/browser_467409-backslashplosion.js
@@ -52,23 +52,23 @@ add_task(async function test_nested_abou
   gBrowser.removeTab(tab);
 });
 
 async function checkState(prefix, tab) {
   // Flush and query tab state.
   await TabStateFlusher.flush(tab.linkedBrowser);
   let {formdata} = JSON.parse(ss.getTabState(tab));
 
-  ok(formdata.id["sessionData"], prefix + ": we have form data for about:sessionrestore");
+  ok(formdata.id.sessionData, prefix + ": we have form data for about:sessionrestore");
 
-  let sessionData_raw = JSON.stringify(formdata.id["sessionData"]);
+  let sessionData_raw = JSON.stringify(formdata.id.sessionData);
   ok(!/\\/.test(sessionData_raw), prefix + ": #sessionData contains no backslashes");
   info(sessionData_raw);
 
   let gotError = false;
   try {
-    JSON.parse(formdata.id["sessionData"]);
+    JSON.parse(formdata.id.sessionData);
   } catch (e) {
     info(prefix + ": got error: " + e);
     gotError = true;
   }
   ok(gotError, prefix + ": attempting to JSON.parse form data threw error");
 }
--- a/browser/components/sessionstore/test/browser_485563.js
+++ b/browser/components/sessionstore/test/browser_485563.js
@@ -8,17 +8,17 @@ function test() {
   waitForExplicitFinish();
 
   let uniqueValue = Math.random() + "\u2028Second line\u2029Second paragraph\u2027";
 
   let tab = BrowserTestUtils.addTab(gBrowser);
   promiseBrowserLoaded(tab.linkedBrowser).then(() => {
     ss.setTabValue(tab, "bug485563", uniqueValue);
     let tabState = JSON.parse(ss.getTabState(tab));
-    is(tabState.extData["bug485563"], uniqueValue,
+    is(tabState.extData.bug485563, uniqueValue,
        "unicode line separator wasn't over-encoded");
     ss.deleteTabValue(tab, "bug485563");
     ss.setTabState(tab, JSON.stringify(tabState));
     is(ss.getTabValue(tab, "bug485563"), uniqueValue,
        "unicode line separator was correctly preserved");
 
     gBrowser.removeTab(tab);
     finish();
--- a/browser/components/sessionstore/test/browser_590268.js
+++ b/browser/components/sessionstore/test/browser_590268.js
@@ -62,17 +62,17 @@ function test() {
 
   // This does the actual testing. SSTabRestoring should be firing on tabs from
   // left to right, so we're going to start with the rightmost tab.
   function onFirstSSTabRestoring() {
     info("onFirstSSTabRestoring...");
     for (let i = gBrowser.tabs.length - 1; i >= 0; i--) {
       let tab = gBrowser.tabs[i];
       let actualUniq = ss.getTabValue(tab, "uniq");
-      let expectedUniq = state.windows[0].tabs[i].extData["uniq"];
+      let expectedUniq = state.windows[0].tabs[i].extData.uniq;
 
       if (wasLoaded[actualUniq]) {
         info("tab " + i + ": already restored");
         continue;
       }
       is(actualUniq, expectedUniq, "tab " + i + ": extData was correct");
 
       // Now we're going to set a piece of data back on the tab so it can be read
--- a/browser/components/sessionstore/test/browser_607016.js
+++ b/browser/components/sessionstore/test/browser_607016.js
@@ -22,17 +22,17 @@ add_task(async function() {
   ], selected: 1 }] };
 
   async function progressCallback() {
     let curState = JSON.parse(ss.getBrowserState());
     for (let i = 0; i < curState.windows[0].tabs.length; i++) {
       let tabState = state.windows[0].tabs[i];
       let tabCurState = curState.windows[0].tabs[i];
       if (tabState.extData) {
-        is(tabCurState.extData["uniq"], tabState.extData["uniq"],
+        is(tabCurState.extData.uniq, tabState.extData.uniq,
            "sanity check that tab has correct extData");
       } else {
         // We aren't expecting there to be any data on extData, but panorama
         // may be setting something, so we need to make sure that if we do have
         // data, we just don't have anything for "uniq".
         ok(!("extData" in tabCurState) || !("uniq" in tabCurState.extData),
            "sanity check that tab doesn't have extData or extData doesn't have 'uniq'");
       }
--- a/browser/components/sessionstore/test/browser_739805.js
+++ b/browser/components/sessionstore/test/browser_739805.js
@@ -21,17 +21,17 @@ function test() {
 
   promiseBrowserLoaded(browser).then(() => {
     isnot(gBrowser.selectedTab, tab, "newly created tab is not selected");
 
     ss.setTabState(tab, JSON.stringify(tabState));
     is(browser.__SS_restoreState, TAB_STATE_NEEDS_RESTORE, "tab needs restoring");
 
     let {formdata} = JSON.parse(ss.getTabState(tab));
-    is(formdata && formdata.id["foo"], "bar", "tab state's formdata is valid");
+    is(formdata && formdata.id.foo, "bar", "tab state's formdata is valid");
 
     promiseTabRestored(tab).then(() => {
       ContentTask.spawn(browser, null, function() {
         let input = content.document.getElementById("foo");
         is(input.value, "bar", "formdata has been restored correctly");
       }).then(() => { finish(); });
     });
 
--- a/browser/components/sessionstore/test/browser_sessionStorage_size.js
+++ b/browser/components/sessionstore/test/browser_sessionStorage_size.js
@@ -8,19 +8,19 @@ const URL = "http://mochi.test:8888/brow
             "browser/components/sessionstore/test/browser_sessionStorage.html" +
             "?" + RAND;
 
 const OUTER_VALUE = "outer-value-" + RAND;
 
 function getEstimateChars() {
   let snap;
   if (gMultiProcessBrowser) {
-    snap = Services.telemetry.histogramSnapshots.content["FX_SESSION_RESTORE_DOM_STORAGE_SIZE_ESTIMATE_CHARS"];
+    snap = Services.telemetry.histogramSnapshots.content.FX_SESSION_RESTORE_DOM_STORAGE_SIZE_ESTIMATE_CHARS;
   } else {
-    snap = Services.telemetry.histogramSnapshots.parent["FX_SESSION_RESTORE_DOM_STORAGE_SIZE_ESTIMATE_CHARS"];
+    snap = Services.telemetry.histogramSnapshots.parent.FX_SESSION_RESTORE_DOM_STORAGE_SIZE_ESTIMATE_CHARS;
   }
   if (!snap) {
     return 0;
   }
   return snap.counts[4];
 }
 
 // Test that we record the size of messages.
--- a/browser/components/shell/content/setDesktopBackground.js
+++ b/browser/components/shell/content/setDesktopBackground.js
@@ -149,55 +149,55 @@ var gSetBackground = {
         ctx.drawImage(this._image, x, y, width, height);
         break;
       }
     }
   }
 };
 
 if (AppConstants.platform != "macosx") {
-  gSetBackground["_initColor"] = function() {
+  gSetBackground._initColor = function() {
     var color = this._shell.desktopBackgroundColor;
 
     const rMask = 4294901760;
     const gMask = 65280;
     const bMask = 255;
     var r = (color & rMask) >> 16;
     var g = (color & gMask) >> 8;
     var b = (color & bMask);
     this.updateColor(this._rgbToHex(r, g, b));
 
     var colorpicker = document.getElementById("desktopColor");
     colorpicker.color = this._backgroundColor;
   };
 
-  gSetBackground["updateColor"] = function(aColor) {
+  gSetBackground.updateColor = function(aColor) {
     this._backgroundColor = aColor;
     this._canvas.style.backgroundColor = aColor;
   };
 
   // Converts a color string in the format "#RRGGBB" to an integer.
-  gSetBackground["_hexStringToLong"] = function(aString) {
+  gSetBackground._hexStringToLong = function(aString) {
     return parseInt(aString.substring(1, 3), 16) << 16 |
            parseInt(aString.substring(3, 5), 16) << 8 |
            parseInt(aString.substring(5, 7), 16);
   };
 
-  gSetBackground["_rgbToHex"] = function(aR, aG, aB) {
+  gSetBackground._rgbToHex = function(aR, aG, aB) {
     return "#" + [aR, aG, aB].map(aInt => aInt.toString(16).replace(/^(.)$/, "0$1"))
                              .join("").toUpperCase();
   };
 } else {
-  gSetBackground["observe"] = function(aSubject, aTopic, aData) {
+  gSetBackground.observe = function(aSubject, aTopic, aData) {
     if (aTopic == "shell:desktop-background-changed") {
       document.getElementById("setDesktopBackground").hidden = true;
       document.getElementById("showDesktopPreferences").hidden = false;
 
       Components.classes["@mozilla.org/observer-service;1"]
                 .getService(Ci.nsIObserverService)
                 .removeObserver(this, "shell:desktop-background-changed");
     }
   };
 
-  gSetBackground["showDesktopPrefs"] = function() {
+  gSetBackground.showDesktopPrefs = function() {
     this._shell.openApplication(Ci.nsIMacShellService.APPLICATION_DESKTOP);
   };
 }
--- a/browser/components/uitour/UITour.jsm
+++ b/browser/components/uitour/UITour.jsm
@@ -1579,55 +1579,55 @@ this.UITour = {
       let appinfo = {};
       props.forEach(property => appinfo[property] = Services.appinfo[property]);
 
       // Identifier of the partner repack, as stored in preference "distribution.id"
       // and included in Firefox and other update pings. Note this is not the same as
       // Services.appinfo.distributionID (value of MOZ_DISTRIBUTION_ID is set at build time).
       let distribution =
           Services.prefs.getDefaultBranch("distribution.").getCharPref("id", "default");
-      appinfo["distribution"] = distribution;
+      appinfo.distribution = distribution;
 
       let isDefaultBrowser = null;
       try {
         let shell = aWindow.getShellService();
         if (shell) {
           isDefaultBrowser = shell.isDefaultBrowser(false);
         }
       } catch (e) {}
-      appinfo["defaultBrowser"] = isDefaultBrowser;
+      appinfo.defaultBrowser = isDefaultBrowser;
 
       let canSetDefaultBrowserInBackground = true;
       if (AppConstants.isPlatformAndVersionAtLeast("win", "6.2") ||
           AppConstants.isPlatformAndVersionAtLeast("macosx", "10.10")) {
         canSetDefaultBrowserInBackground = false;
       } else if (AppConstants.platform == "linux") {
         // The ShellService may not exist on some versions of Linux.
         try {
           aWindow.getShellService();
         } catch (e) {
           canSetDefaultBrowserInBackground = null;
         }
       }
 
-      appinfo["canSetDefaultBrowserInBackground"] =
+      appinfo.canSetDefaultBrowserInBackground =
         canSetDefaultBrowserInBackground;
 
       // Expose Profile creation and last reset dates in weeks.
       const ONE_WEEK = 7 * 24 * 60 * 60 * 1000;
       let profileAge = new ProfileAge(null, null);
       let createdDate = await profileAge.created;
       let resetDate = await profileAge.reset;
       let createdWeeksAgo = Math.floor((Date.now() - createdDate) / ONE_WEEK);
       let resetWeeksAgo = null;
       if (resetDate) {
         resetWeeksAgo = Math.floor((Date.now() - resetDate) / ONE_WEEK);
       }
-      appinfo["profileCreatedWeeksAgo"] = createdWeeksAgo;
-      appinfo["profileResetWeeksAgo"] = resetWeeksAgo;
+      appinfo.profileCreatedWeeksAgo = createdWeeksAgo;
+      appinfo.profileResetWeeksAgo = resetWeeksAgo;
 
       this.sendPageCallback(aMessageManager, aCallbackID, appinfo);
     })().catch(err => {
       log.error(err);
       this.sendPageCallback(aMessageManager, aCallbackID, {});
     })
   },
 
--- a/browser/experiments/test/xpcshell/test_cache.js
+++ b/browser/experiments/test/xpcshell/test_cache.js
@@ -383,17 +383,17 @@ add_task(async function test_expiration(
   // The first experiment should be expired and not in the cache, it ended more than
   // 180 days ago. We should see the one still running in the cache.
   history = await experiments.getExperiments();
   Assert.equal(history.length, 1, "Expired experiments must not be saved to cache.");
   checkExperimentListsEqual(experimentListData.slice(0, 1), history);
 
   // Test that experiments that are cached locally but never ran are removed from cache
   // when they are removed from the manifest (this is cached data, not really history).
-  gManifestObject["experiments"] = gManifestObject["experiments"].slice(1, 1);
+  gManifestObject.experiments = gManifestObject.experiments.slice(1, 1);
   await experiments.updateManifest();
   validateCache([...experiments._experiments.keys()], [EXPERIMENT2_ID]);
 
   // Cleanup.
   await experiments._toggleExperimentsEnabled(false);
   await promiseRestartManager();
   await removeCacheFile();
 });
--- a/browser/extensions/formautofill/.eslintrc.js
+++ b/browser/extensions/formautofill/.eslintrc.js
@@ -65,19 +65,16 @@ module.exports = {
     "comma-dangle": ["error", "always-multiline"],
 
     // Warn about cyclomatic complexity in functions.
     "complexity": ["error", {"max": 20}],
 
     // Enforce dots on the next line with property name.
     "dot-location": ["error", "property"],
 
-    // Encourage the use of dot notation whenever possible.
-    "dot-notation": "error",
-
     // Maximum length of a line.
     // This should be 100 but too many lines were longer than that so set a
     // conservative upper bound for now.
     "max-len": ["error", 140],
 
     // Maximum depth callbacks can be nested.
     "max-nested-callbacks": ["error", 4],
 
--- a/browser/extensions/pocket/content/pktApi.jsm
+++ b/browser/extensions/pocket/content/pktApi.jsm
@@ -169,42 +169,42 @@ var pktApi = (function() {
     /**
      * Returns access token or undefined if no logged in user was found
      * @return {string | undefined} Access token for logged in user user
      */
     function getAccessToken() {
         var pocketCookies = getCookiesFromPocket();
 
         // If no cookie was found just return undefined
-        if (typeof pocketCookies["ftv1"] === "undefined") {
+        if (typeof pocketCookies.ftv1 === "undefined") {
             return undefined;
         }
 
         // Check if a new user logged in in the meantime and clearUserData if so
-        var sessionId = pocketCookies["fsv1"];
+        var sessionId = pocketCookies.fsv1;
         var lastSessionId = getSetting("fsv1");
         if (sessionId !== lastSessionId) {
             clearUserData();
             setSetting("fsv1", sessionId);
         }
 
         // Return access token
-        return pocketCookies["ftv1"];
+        return pocketCookies.ftv1;
     }
 
     /**
      * Get the current premium status of the user
      * @return {number | undefined} Premium status of user
      */
     function getPremiumStatus() {
         var premiumStatus = getSetting("premium_status");
         if (typeof premiumStatus === "undefined") {
             // Premium status is not in settings try get it from cookie
             var pocketCookies = getCookiesFromPocket();
-            premiumStatus = pocketCookies["ps"];
+            premiumStatus = pocketCookies.ps;
         }
         return premiumStatus;
     }
 
     /**
      * Helper method to check if a user is premium or not
      * @return {Boolean} Boolean if user is premium or not
      */
--- a/browser/extensions/shield-recipe-client/test/browser/browser_PreferenceExperiments.js
+++ b/browser/extensions/shield-recipe-client/test/browser/browser_PreferenceExperiments.js
@@ -19,44 +19,44 @@ function experimentFactory(attrs) {
     preferenceType: "string",
     previousPreferenceValue: "oldfakevalue",
     preferenceBranchType: "default",
   }, attrs);
 }
 
 // clearAllExperimentStorage
 add_task(withMockExperiments(async function(experiments) {
-  experiments["test"] = experimentFactory({name: "test"});
+  experiments.test = experimentFactory({name: "test"});
   ok(await PreferenceExperiments.has("test"), "Mock experiment is detected.");
   await PreferenceExperiments.clearAllExperimentStorage();
   ok(
     !(await PreferenceExperiments.has("test")),
     "clearAllExperimentStorage removed all stored experiments",
   );
 }));
 
 // start should throw if an experiment with the given name already exists
 add_task(withMockExperiments(async function(experiments) {
-  experiments["test"] = experimentFactory({name: "test"});
+  experiments.test = experimentFactory({name: "test"});
   await Assert.rejects(
     PreferenceExperiments.start({
       name: "test",
       branch: "branch",
       preferenceName: "fake.preference",
       preferenceValue: "value",
       preferenceType: "string",
       preferenceBranchType: "default",
     }),
     "start threw an error due to a conflicting experiment name",
   );
 }));
 
 // start should throw if an experiment for the given preference is active
 add_task(withMockExperiments(async function(experiments) {
-  experiments["test"] = experimentFactory({name: "test", preferenceName: "fake.preference"});
+  experiments.test = experimentFactory({name: "test", preferenceName: "fake.preference"});
   await Assert.rejects(
     PreferenceExperiments.start({
       name: "different",
       branch: "branch",
       preferenceName: "fake.preference",
       preferenceValue: "value",
       preferenceType: "string",
       preferenceBranchType: "default",
@@ -303,116 +303,116 @@ add_task(withMockExperiments(async funct
     PreferenceExperiments.markLastSeen("neveractive"),
     "markLastSeen threw because there was not a matching experiment",
   );
 }));
 
 // markLastSeen should update the lastSeen date
 add_task(withMockExperiments(async function(experiments) {
   const oldDate = new Date(1988, 10, 1).toJSON();
-  experiments["test"] = experimentFactory({name: "test", lastSeen: oldDate});
+  experiments.test = experimentFactory({name: "test", lastSeen: oldDate});
   await PreferenceExperiments.markLastSeen("test");
   Assert.notEqual(
-    experiments["test"].lastSeen,
+    experiments.test.lastSeen,
     oldDate,
     "markLastSeen updated the experiment lastSeen date",
   );
 }));
 
 // stop should throw if an experiment with the given name doesn't exist
 add_task(withMockExperiments(async function() {
   await Assert.rejects(
     PreferenceExperiments.stop("test"),
     "stop threw an error because there are no experiments with the given name",
   );
 }));
 
 // stop should throw if the experiment is already expired
 add_task(withMockExperiments(async function(experiments) {
-  experiments["test"] = experimentFactory({name: "test", expired: true});
+  experiments.test = experimentFactory({name: "test", expired: true});
   await Assert.rejects(
     PreferenceExperiments.stop("test"),
     "stop threw an error because the experiment was already expired",
   );
 }));
 
 // stop should mark the experiment as expired, stop its observer, and revert the
 // preference value.
 add_task(withMockExperiments(withMockPreferences(async function(experiments, mockPreferences) {
   const stopObserver = sinon.spy(PreferenceExperiments, "stopObserver");
 
   mockPreferences.set("fake.preference", "experimentvalue", "default");
-  experiments["test"] = experimentFactory({
+  experiments.test = experimentFactory({
     name: "test",
     expired: false,
     preferenceName: "fake.preference",
     preferenceValue: "experimentvalue",
     preferenceType: "string",
     previousPreferenceValue: "oldvalue",
     preferenceBranchType: "default",
   });
   PreferenceExperiments.startObserver("test", "fake.preference", "experimentvalue");
 
   await PreferenceExperiments.stop("test");
   ok(stopObserver.calledWith("test"), "stop removed an observer");
-  is(experiments["test"].expired, true, "stop marked the experiment as expired");
+  is(experiments.test.expired, true, "stop marked the experiment as expired");
   is(
     DefaultPreferences.get("fake.preference"),
     "oldvalue",
     "stop reverted the preference to its previous value",
   );
 
   stopObserver.restore();
   PreferenceExperiments.stopAllObservers();
 })));
 
 // stop should also support user pref experiments
 add_task(withMockExperiments(withMockPreferences(async function(experiments, mockPreferences) {
   const stopObserver = sinon.stub(PreferenceExperiments, "stopObserver");
   mockPreferences.set("fake.preference", "experimentvalue", "user");
-  experiments["test"] = experimentFactory({
+  experiments.test = experimentFactory({
     name: "test",
     expired: false,
     preferenceName: "fake.preference",
     preferenceValue: "experimentvalue",
     preferenceType: "string",
     previousPreferenceValue: "oldvalue",
     preferenceBranchType: "user",
   });
   PreferenceExperiments.startObserver("test", "fake.preference", "experimentvalue");
 
   await PreferenceExperiments.stop("test");
   ok(stopObserver.calledWith("test"), "stop removed an observer");
-  is(experiments["test"].expired, true, "stop marked the experiment as expired");
+  is(experiments.test.expired, true, "stop marked the experiment as expired");
   is(
     Preferences.get("fake.preference"),
     "oldvalue",
     "stop reverted the preference to its previous value",
   );
 
   stopObserver.restore();
 })));
 
 // stop should not call stopObserver if there is no observer registered.
 add_task(withMockExperiments(withMockPreferences(async function(experiments) {
   const stopObserver = sinon.spy(PreferenceExperiments, "stopObserver");
-  experiments["test"] = experimentFactory({name: "test", expired: false});
+  experiments.test = experimentFactory({name: "test", expired: false});
 
   await PreferenceExperiments.stop("test");
   ok(!stopObserver.called, "stop did not bother to stop an observer that wasn't active");
 
   stopObserver.restore();
   PreferenceExperiments.stopAllObservers();
 })));
 
 // stop should remove a preference that had no value prior to an experiment for user prefs
 add_task(withMockExperiments(withMockPreferences(async function(experiments, mockPreferences) {
   const stopObserver = sinon.stub(PreferenceExperiments, "stopObserver");
   mockPreferences.set("fake.preference", "experimentvalue", "user");
-  experiments["test"] = experimentFactory({
+  experiments.test = experimentFactory({
     name: "test",
     expired: false,
     preferenceName: "fake.preference",
     preferenceValue: "experimentvalue",
     preferenceType: "string",
     previousPreferenceValue: undefined,
     preferenceBranchType: "user",
   });
@@ -425,17 +425,17 @@ add_task(withMockExperiments(withMockPre
 
   stopObserver.restore();
 })));
 
 // stop should not modify a preference if resetValue is false
 add_task(withMockExperiments(withMockPreferences(async function(experiments, mockPreferences) {
   const stopObserver = sinon.stub(PreferenceExperiments, "stopObserver");
   mockPreferences.set("fake.preference", "customvalue", "default");
-  experiments["test"] = experimentFactory({
+  experiments.test = experimentFactory({
     name: "test",
     expired: false,
     preferenceName: "fake.preference",
     preferenceValue: "experimentvalue",
     preferenceType: "string",
     previousPreferenceValue: "oldvalue",
     peferenceBranchType: "default",
   });
@@ -456,31 +456,31 @@ add_task(withMockExperiments(async funct
     PreferenceExperiments.get("neverexisted"),
     "get rejects if no experiment with the given name is found",
   );
 }));
 
 // get
 add_task(withMockExperiments(async function(experiments) {
   const experiment = experimentFactory({name: "test"});
-  experiments["test"] = experiment;
+  experiments.test = experiment;
 
   const fetchedExperiment = await PreferenceExperiments.get("test");
   Assert.deepEqual(fetchedExperiment, experiment, "get fetches the correct experiment");
 
   // Modifying the fetched experiment must not edit the data source.
   fetchedExperiment.name = "othername";
-  is(experiments["test"].name, "test", "get returns a copy of the experiment");
+  is(experiments.test.name, "test", "get returns a copy of the experiment");
 }));
 
 add_task(withMockExperiments(async function testGetAll(experiments) {
   const experiment1 = experimentFactory({name: "experiment1"});
   const experiment2 = experimentFactory({name: "experiment2", disabled: true});
-  experiments["experiment1"] = experiment1;
-  experiments["experiment2"] = experiment2;
+  experiments.experiment1 = experiment1;
+  experiments.experiment2 = experiment2;
 
   const fetchedExperiments = await PreferenceExperiments.getAll();
   is(fetchedExperiments.length, 2, "getAll returns a list of all stored experiments");
   Assert.deepEqual(
     fetchedExperiments.find(e => e.name === "experiment1"),
     experiment1,
     "getAll returns a list with the correct experiments",
   );
@@ -491,66 +491,66 @@ add_task(withMockExperiments(async funct
     "getAll returns a list with the correct experiments, including disabled ones",
   );
 
   fetchedExperiment2.name = "othername";
   is(experiment2.name, "experiment2", "getAll returns copies of the experiments");
 }));
 
 add_task(withMockExperiments(withMockPreferences(async function testGetAllActive(experiments) {
-  experiments["active"] = experimentFactory({
+  experiments.active = experimentFactory({
     name: "active",
     expired: false,
   });
-  experiments["inactive"] = experimentFactory({
+  experiments.inactive = experimentFactory({
     name: "inactive",
     expired: true,
   });
 
   const activeExperiments = await PreferenceExperiments.getAllActive();
   Assert.deepEqual(
     activeExperiments,
-    [experiments["active"]],
+    [experiments.active],
     "getAllActive only returns active experiments",
   );
 
   activeExperiments[0].name = "newfakename";
   Assert.notEqual(
-    experiments["active"].name,
+    experiments.active.name,
     "newfakename",
     "getAllActive returns copies of stored experiments",
   );
 })));
 
 // has
 add_task(withMockExperiments(async function(experiments) {
-  experiments["test"] = experimentFactory({name: "test"});
+  experiments.test = experimentFactory({name: "test"});
   ok(await PreferenceExperiments.has("test"), "has returned true for a stored experiment");
   ok(!(await PreferenceExperiments.has("missing")), "has returned false for a missing experiment");
 }));
 
 // init should set the default preference value for active, default experiments
 add_task(withMockExperiments(withMockPreferences(async function testInit(experiments, mockPreferences) {
-  experiments["user"] = experimentFactory({
+  experiments.user = experimentFactory({
     name: "user",
     preferenceName: "user",
     preferenceValue: true,
     preferenceType: "boolean",
     expired: false,
     preferenceBranchType: "user",
   });
-  experiments["default"] = experimentFactory({
+  experiments.default = experimentFactory({
     name: "default",
     preferenceName: "default",
     preferenceValue: true,
     preferenceType: "boolean",
     expired: false,
     preferenceBranchType: "default",
   });
-  experiments["expireddefault"] = experimentFactory({
+  experiments.expireddefault = experimentFactory({
     name: "expireddefault",
     preferenceName: "expireddefault",
     preferenceValue: true,
     preferenceType: "boolean",
     expired: true,
     preferenceBranchType: "default",
   });
 
@@ -574,17 +574,17 @@ add_task(withMockExperiments(withMockPre
 })));
 
 // init should register telemetry experiments
 add_task(withMockExperiments(withMockPreferences(async function testInit(experiments, mockPreferences) {
   const setActiveStub = sinon.stub(TelemetryEnvironment, "setExperimentActive");
   const startObserverStub = sinon.stub(PreferenceExperiments, "startObserver");
   mockPreferences.set("fake.pref", "experiment value");
 
-  experiments["test"] = experimentFactory({
+  experiments.test = experimentFactory({
     name: "test",
     branch: "branch",
     preferenceName: "fake.pref",
     preferenceValue: "experiment value",
     expired: false,
     preferenceBranchType: "default",
   });
 
@@ -614,44 +614,44 @@ add_task(withMockExperiments(async funct
 
   setActiveStub.restore();
   setInactiveStub.restore();
 }));
 
 // Experiments shouldn't be recorded by init() in telemetry if they are expired
 add_task(withMockExperiments(async function testInitTelemetryExpired(experiments) {
   const setActiveStub = sinon.stub(TelemetryEnvironment, "setExperimentActive");
-  experiments["experiment1"] = experimentFactory({name: "expired", branch: "branch", expired: true});
+  experiments.experiment1 = experimentFactory({name: "expired", branch: "branch", expired: true});
   await PreferenceExperiments.init();
   ok(!setActiveStub.called, "Expired experiment is not registered by init");
   setActiveStub.restore();
 }));
 
 // Experiments should end if the preference has been changed when init() is called
 add_task(withMockExperiments(withMockPreferences(async function testInitChanges(experiments, mockPreferences) {
   const stopStub = sinon.stub(PreferenceExperiments, "stop");
   mockPreferences.set("fake.preference", "experiment value", "default");
-  experiments["test"] = experimentFactory({
+  experiments.test = experimentFactory({
     name: "test",
     preferenceName: "fake.preference",
     preferenceValue: "experiment value",
   });
   mockPreferences.set("fake.preference", "changed value");
   await PreferenceExperiments.init();
   ok(stopStub.calledWith("test"), "Experiment is stopped because value changed");
   ok(Preferences.get("fake.preference"), "changed value", "Preference value was not changed");
   stopStub.restore();
 })));
 
 
 // init should register an observer for experiments
 add_task(withMockExperiments(withMockPreferences(async function testInitRegistersObserver(experiments, mockPreferences) {
   const startObserver = sinon.stub(PreferenceExperiments, "startObserver");
   mockPreferences.set("fake.preference", "experiment value", "default");
-  experiments["test"] = experimentFactory({
+  experiments.test = experimentFactory({
     name: "test",
     preferenceName: "fake.preference",
     preferenceValue: "experiment value",
   });
   await PreferenceExperiments.init();
 
   ok(
     startObserver.calledWith("test", "fake.preference", "experiment value"),
--- a/browser/extensions/shield-recipe-client/test/browser/browser_RecipeRunner.js
+++ b/browser/extensions/shield-recipe-client/test/browser/browser_RecipeRunner.js
@@ -118,18 +118,18 @@ add_task(withMockNormandyApi(async funct
   mockApi.actions = [matchAction, noMatchAction];
 
   const matchRecipe = {action: "matchAction", filter_expression: "true"};
   const noMatchRecipe = {action: "noMatchAction", filter_expression: "false"};
   const missingRecipe = {action: "missingAction", filter_expression: "true"};
   mockApi.recipes = [matchRecipe, noMatchRecipe, missingRecipe];
 
   await withMockActionSandboxManagers(mockApi.actions, async managers => {
-    const matchManager = managers["matchAction"];
-    const noMatchManager = managers["noMatchAction"];
+    const matchManager = managers.matchAction;
+    const noMatchManager = managers.noMatchAction;
 
     await RecipeRunner.run();
 
     // match should be called for preExecution, action, and postExecution
     sinon.assert.calledWith(matchManager.runAsyncCallback, "preExecution");
     sinon.assert.calledWith(matchManager.runAsyncCallback, "action", matchRecipe);
     sinon.assert.calledWith(matchManager.runAsyncCallback, "postExecution");
 
@@ -150,18 +150,18 @@ add_task(withMockNormandyApi(async funct
   const failAction = {name: "failAction"};
   mockApi.actions = [passAction, failAction];
 
   const passRecipe = {action: "passAction", filter_expression: "true"};
   const failRecipe = {action: "failAction", filter_expression: "true"};
   mockApi.recipes = [passRecipe, failRecipe];
 
   await withMockActionSandboxManagers(mockApi.actions, async managers => {
-    const passManager = managers["passAction"];
-    const failManager = managers["failAction"];
+    const passManager = managers.passAction;
+    const failManager = managers.failAction;
     failManager.runAsyncCallback.returns(Promise.reject(new Error("oh no")));
 
     await RecipeRunner.run();
 
     // pass should be called for preExecution, action, and postExecution
     sinon.assert.calledWith(passManager.runAsyncCallback, "preExecution");
     sinon.assert.calledWith(passManager.runAsyncCallback, "action", passRecipe);
     sinon.assert.calledWith(passManager.runAsyncCallback, "postExecution");
@@ -176,23 +176,23 @@ add_task(withMockNormandyApi(async funct
   });
 }));
 
 add_task(withMockNormandyApi(async function testLoadActionSandboxManagers(mockApi) {
   mockApi.actions = [
     {name: "normalAction"},
     {name: "missingImpl"},
   ];
-  mockApi.implementations["normalAction"] = "window.scriptRan = true";
+  mockApi.implementations.normalAction = "window.scriptRan = true";
 
   const managers = await RecipeRunner.loadActionSandboxManagers();
   ok("normalAction" in managers, "Actions with implementations have managers");
   ok(!("missingImpl" in managers), "Actions without implementations are skipped");
 
-  const normalManager = managers["normalAction"];
+  const normalManager = managers.normalAction;
   ok(
     await normalManager.evalInSandbox("window.scriptRan"),
     "Implementations are run in the sandbox",
   );
 }));
 
 add_task(async function testStartup() {
   const runStub = sinon.stub(RecipeRunner, "run");
--- a/browser/modules/ContentCrashHandlers.jsm
+++ b/browser/modules/ContentCrashHandlers.jsm
@@ -403,17 +403,17 @@ this.TabCrashHandler = {
         delete extraExtraKeyVals[key];
       }
     }
 
     // URL is special, since it's already been written to extra data by
     // default. In order to make sure we don't send it, we overwrite it
     // with the empty string.
     if (!includeURL) {
-      extraExtraKeyVals["URL"] = "";
+      extraExtraKeyVals.URL = "";
     }
 
     CrashSubmit.submit(dumpID, {
       recordSubmission: true,
       extraExtraKeyVals,
     }).catch(Cu.reportError);
 
     this.prefs.setBoolPref("sendReport", true);
--- a/browser/modules/DirectoryLinksProvider.jsm
+++ b/browser/modules/DirectoryLinksProvider.jsm
@@ -67,18 +67,18 @@ var DirectoryLinksProvider = {
       enhanced: PREF_NEWTAB_ENHANCED,
       linksURL: PREF_DIRECTORY_SOURCE,
     });
   },
 
   get _linksURL() {
     if (!this.__linksURL) {
       try {
-        this.__linksURL = Services.prefs.getCharPref(this._observedPrefs["linksURL"]);
-        this.__linksURLModified = Services.prefs.prefHasUserValue(this._observedPrefs["linksURL"]);
+        this.__linksURL = Services.prefs.getCharPref(this._observedPrefs.linksURL);
+        this.__linksURLModified = Services.prefs.prefHasUserValue(this._observedPrefs.linksURL);
       } catch (e) {
         Cu.reportError("Error fetching directory links url from prefs: " + e);
       }
     }
     return this.__linksURL;
   },
 
   /**
--- a/browser/modules/Social.jsm
+++ b/browser/modules/Social.jsm
@@ -249,17 +249,17 @@ this.OpenGraphBuilder = {
           let body = "";
           if (pageData.title)
             body += pageData.title + "\n\n";
           if (pageData.description)
             body += pageData.description + "\n\n";
           if (pageData.text)
             body += pageData.text + "\n\n";
           body += pageData.url;
-          query["body"] = body;
+          query.body = body;
         }
       });
       // if the url template doesn't have title and no text was provided, add the title as the text.
       if (!query.text && !query.title && pageData.title) {
         query.text = pageData.title;
       }
     }
     var str = [];
--- a/browser/modules/SocialService.jsm
+++ b/browser/modules/SocialService.jsm
@@ -480,34 +480,34 @@ this.SocialService = {
   },
 
   _manifestFromData(type, data, installOrigin) {
     let featureURLs = ["shareURL"];
     let resolveURLs = featureURLs.concat(["postActivationURL"]);
 
     if (type == "directory" || type == "internal") {
       // directory provided manifests must have origin in manifest, use that
-      if (!data["origin"]) {
+      if (!data.origin) {
         Cu.reportError("SocialService.manifestFromData directory service provided manifest without origin.");
         return null;
       }
       installOrigin = data.origin;
     }
     // force/fixup origin
     let URI = Services.io.newURI(installOrigin);
     let principal = Services.scriptSecurityManager.createCodebasePrincipal(URI, {});
     data.origin = principal.origin;
 
     // iconURL and name are required
     let providerHasFeatures = featureURLs.some(url => data[url]);
     if (!providerHasFeatures) {
       Cu.reportError("SocialService.manifestFromData manifest missing required urls.");
       return null;
     }
-    if (!data["name"] || !data["iconURL"]) {
+    if (!data.name || !data.iconURL) {
       Cu.reportError("SocialService.manifestFromData manifest missing name or iconURL.");
       return null;
     }
     for (let url of resolveURLs) {
       if (data[url]) {
         try {
           let resolved = Services.io.newURI(principal.URI.resolve(data[url]));
           if (!(resolved.schemeIs("http") || resolved.schemeIs("https"))) {
--- a/browser/modules/test/browser/head.js
+++ b/browser/modules/test/browser/head.js
@@ -94,18 +94,18 @@ function checkKeyedHistogram(h, key, exp
   Assert.equal(snapshot[key].sum, expectedValue, `The key ${key} must contain ${expectedValue}.`);
 }
 
 /**
  * Return the scalars from the parent-process.
  */
 function getParentProcessScalars(aChannel, aKeyed = false, aClear = false) {
   const scalars = aKeyed ?
-    Services.telemetry.snapshotKeyedScalars(aChannel, aClear)["parent"] :
-    Services.telemetry.snapshotScalars(aChannel, aClear)["parent"];
+    Services.telemetry.snapshotKeyedScalars(aChannel, aClear).parent :
+    Services.telemetry.snapshotScalars(aChannel, aClear).parent;
   return scalars || {};
 }
 
 function checkEvents(events, expectedEvents) {
   if (!Services.telemetry.canRecordExtended) {
     // Currently we only collect the tested events when extended Telemetry is enabled.
     return;
   }
--- a/browser/modules/test/unit/test_DirectoryLinksProvider.js
+++ b/browser/modules/test/unit/test_DirectoryLinksProvider.js
@@ -432,18 +432,18 @@ add_task(async function test_DirectoryLi
   ]};
   let dataURI = "data:application/json," + JSON.stringify(data);
   await promiseSetupDirectoryLinksProvider({linksURL: dataURI});
 
   let links = await fetchData();
   do_check_eq(links.length, 2);
 
   // The only remaining url should be http and https
-  do_check_eq(links[0].url, data["directory"][1].url);
-  do_check_eq(links[1].url, data["directory"][3].url);
+  do_check_eq(links[0].url, data.directory[1].url);
+  do_check_eq(links[1].url, data.directory[3].url);
 });
 
 add_task(async function test_DirectoryLinksProvider_getAllowedImages() {
   let data = {"directory": [
     {url: "http://example.com", imageURI: "ftp://example.com"},
     {url: "http://example.com", imageURI: "http://example.net"},
     {url: "http://example.com", imageURI: "javascript:5"},
     {url: "http://example.com", imageURI: "https://example.com"},
@@ -453,18 +453,18 @@ add_task(async function test_DirectoryLi
   ]};
   let dataURI = "data:application/json," + JSON.stringify(data);
   await promiseSetupDirectoryLinksProvider({linksURL: dataURI});
 
   let links = await fetchData();
   do_check_eq(links.length, 2);
 
   // The only remaining images should be https and data
-  do_check_eq(links[0].imageURI, data["directory"][3].imageURI);
-  do_check_eq(links[1].imageURI, data["directory"][5].imageURI);
+  do_check_eq(links[0].imageURI, data.directory[3].imageURI);
+  do_check_eq(links[1].imageURI, data.directory[5].imageURI);
 });
 
 add_task(async function test_DirectoryLinksProvider_getAllowedImages_base() {
   let data = {"directory": [
     {url: "http://example1.com", imageURI: "https://example.com"},
     {url: "http://example2.com", imageURI: "https://tiles.cdn.mozilla.net"},
     {url: "http://example3.com", imageURI: "https://tiles2.cdn.mozilla.net"},
     {url: "http://example4.com", enhancedImageURI: "https://mozilla.net"},
@@ -475,20 +475,20 @@ add_task(async function test_DirectoryLi
 
   // Pretend we're using the default pref to trigger base matching
   DirectoryLinksProvider.__linksURLModified = false;
 
   let links = await fetchData();
   do_check_eq(links.length, 4);
 
   // The only remaining images should be https with mozilla.net or data URI
-  do_check_eq(links[0].url, data["directory"][1].url);
-  do_check_eq(links[1].url, data["directory"][2].url);
-  do_check_eq(links[2].url, data["directory"][3].url);
-  do_check_eq(links[3].url, data["directory"][4].url);
+  do_check_eq(links[0].url, data.directory[1].url);
+  do_check_eq(links[1].url, data.directory[2].url);
+  do_check_eq(links[2].url, data.directory[3].url);
+  do_check_eq(links[3].url, data.directory[4].url);
 });
 
 add_task(async function test_DirectoryLinksProvider_getAllowedEnhancedImages() {
   let data = {"directory": [
     {url: "http://example.com", enhancedImageURI: "ftp://example.com"},
     {url: "http://example.com", enhancedImageURI: "http://example.net"},
     {url: "http://example.com", enhancedImageURI: "javascript:5"},
     {url: "http://example.com", enhancedImageURI: "https://example.com"},
@@ -498,18 +498,18 @@ add_task(async function test_DirectoryLi
   ]};
   let dataURI = "data:application/json," + JSON.stringify(data);
   await promiseSetupDirectoryLinksProvider({linksURL: dataURI});
 
   let links = await fetchData();
   do_check_eq(links.length, 2);
 
   // The only remaining enhancedImages should be http and https and data
-  do_check_eq(links[0].enhancedImageURI, data["directory"][3].enhancedImageURI);
-  do_check_eq(links[1].enhancedImageURI, data["directory"][5].enhancedImageURI);
+  do_check_eq(links[0].enhancedImageURI, data.directory[3].enhancedImageURI);
+  do_check_eq(links[1].enhancedImageURI, data.directory[5].enhancedImageURI);
 });
 
 add_task(function test_DirectoryLinksProvider_setDefaultEnhanced() {
   function checkDefault(expected) {
     Services.prefs.clearUserPref(kNewtabEnhancedPref);
     do_check_eq(Services.prefs.getBoolPref(kNewtabEnhancedPref), expected);
   }
 
--- a/caps/tests/unit/test_origin.js
+++ b/caps/tests/unit/test_origin.js
@@ -255,17 +255,17 @@ function run_test() {
     [ "^appId=5", {appId: 5}, {appId: 5}, "^appId=5" ],
     [ "^appId=5&userContextId=3", {appId: 5, userContextId: 3}, {appId: 5}, "^appId=5" ] ];
 
   // check that we can set the userContextId to default properly
   dflt_tests.forEach(t => {
     let orig = ChromeUtils.createOriginAttributesFromOrigin(uri + t[0]);
     checkValues(orig, t[1]);
     let mod = orig;
-    mod["userContextId"] = 0;
+    mod.userContextId = 0;
     checkValues(mod, t[2]);
     do_check_eq(ChromeUtils.originAttributesToSuffix(mod), t[3]);
   });
 
   // each row in the dflt2_tests array has these values:
   // [0] - the suffix used to create an origin attribute from
   // [1] - the expected result of creating an origin attributes from [0]
   // [2] - the expected result after setting firstPartyUri to the default
@@ -276,17 +276,17 @@ function run_test() {
     [ "^appId=5", {appId: 5}, {appId: 5}, "^appId=5" ],
     [ "^appId=5&firstPartyDomain=foo.com", {appId: 5, firstPartyDomain: "foo.com"}, {appId: 5}, "^appId=5" ] ];
 
   // check that we can set the userContextId to default properly
   dflt2_tests.forEach(t => {
     let orig = ChromeUtils.createOriginAttributesFromOrigin(uri + t[0]);
     checkValues(orig, t[1]);
     let mod = orig;
-    mod["firstPartyDomain"] = "";
+    mod.firstPartyDomain = "";
     checkValues(mod, t[2]);
     do_check_eq(ChromeUtils.originAttributesToSuffix(mod), t[3]);
   });
 
   var fileURI = makeURI("file:///foo/bar").QueryInterface(Ci.nsIFileURL);
   var fileTests = [
     [true, fileURI.spec],
     [false, "file://UNIVERSAL_FILE_URI_ORIGIN"],
--- a/js/src/builtin/Intl.js
+++ b/js/src/builtin/Intl.js
@@ -813,17 +813,17 @@ function addSpecialMissingLanguageTags(a
     for (var i = 0; i < oldStyleLocales.length; i++) {
         var oldStyleLocale = oldStyleLocales[i];
         if (availableLocales[oldStyleLanguageTagMappings[oldStyleLocale]])
             availableLocales[oldStyleLocale] = true;
     }
 
     // Also forcibly provide the last-ditch locale.
     var lastDitch = lastDitchLocale();
-    assert(lastDitch === "en-GB" && availableLocales["en"],
+    assert(lastDitch === "en-GB" && availableLocales.en,
            "shouldn't be a need to add every locale implied by the last-" +
            "ditch locale, merely just the last-ditch locale");
     availableLocales[lastDitch] = true;
 }
 
 
 /**
  * Canonicalizes a locale list.
--- a/mobile/android/chrome/content/EmbedRT.js
+++ b/mobile/android/chrome/content/EmbedRT.js
@@ -33,32 +33,32 @@ var EmbedRT = {
 
     let sandbox = new Cu.Sandbox(principal,
       {
         sandboxName: scriptURL,
         wantGlobalProperties: ["indexedDB"]
       }
     );
 
-    sandbox["console"] = new ConsoleAPI({ consoleID: "script/" + scriptURL });
+    sandbox.console = new ConsoleAPI({ consoleID: "script/" + scriptURL });
 
     // As we don't want our caller to control the JS version used for the
     // script file, we run loadSubScript within the context of the
     // sandbox with the latest JS version set explicitly.
     sandbox.__SCRIPT_URI_SPEC__ = scriptURL;
     Cu.evalInSandbox("Components.classes['@mozilla.org/moz/jssubscript-loader;1'].createInstance(Components.interfaces.mozIJSSubScriptLoader).loadSubScript(__SCRIPT_URI_SPEC__);", sandbox, "ECMAv5");
 
     this._scopes[scriptURL] = sandbox;
 
     if ("load" in sandbox) {
       let params = {
         window: window,
         resourceURI: scriptURL,
       };
 
       try {
-        sandbox["load"](params);
+        sandbox.load(params);
       } catch(e) {
         dump("Exception calling 'load' method in script: " + scriptURL + "\n" + e);
       }
     }
   }
 };
--- a/mobile/android/chrome/content/PermissionsHelper.js
+++ b/mobile/android/chrome/content/PermissionsHelper.js
@@ -78,17 +78,17 @@ var PermissionsHelper = {
             GlobalEventDispatcher.sendRequest({
               type: "Permissions:CheckResult",
               hasPermissions: true
             });
             return;
           }
           // Get the strings that correspond to the permission type
           let typeStrings = this._permissionStrings[type];
-          let label = Strings.browser.GetStringFromName(typeStrings["label"]);
+          let label = Strings.browser.GetStringFromName(typeStrings.label);
 
           // Get the key to look up the appropriate string entity
           let valueKey = value == Services.perms.ALLOW_ACTION ?
                          "allowed" : "denied";
           let valueString = Strings.browser.GetStringFromName(typeStrings[valueKey]);
 
           permissions.push({
             type: type,
@@ -117,17 +117,17 @@ var PermissionsHelper = {
       case "Permissions:Clear":
         // An array of the indices of the permissions we want to clear
         let permissionsToClear = data.permissions;
         let privacyContext = BrowserApp.selectedBrowser.docShell
                                .QueryInterface(Ci.nsILoadContext);
 
         for (let i = 0; i < permissionsToClear.length; i++) {
           let indexToClear = permissionsToClear[i];
-          let permissionType = this._currentPermissions[indexToClear]["type"];
+          let permissionType = this._currentPermissions[indexToClear].type;
           this.clearPermission(uri, permissionType, privacyContext);
         }
         break;
     }
   },
 
   /**
    * Gets the permission value stored for a specified permission type.
--- a/mobile/android/components/AboutRedirector.js
+++ b/mobile/android/components/AboutRedirector.js
@@ -74,17 +74,17 @@ var modules = {
   },
   accounts: {
     uri: "chrome://browser/content/aboutAccounts.xhtml",
     privileged: true
   },
 };
 
 if (AppConstants.MOZ_SERVICES_HEALTHREPORT) {
-  modules['healthreport'] = {
+  modules.healthreport = {
     uri: "chrome://browser/content/aboutHealthReport.xhtml",
     privileged: true
   };
 }
 
 function AboutRedirector() {}
 AboutRedirector.prototype = {
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIAboutModule]),
--- a/mobile/android/components/BrowserCLH.js
+++ b/mobile/android/components/BrowserCLH.js
@@ -13,17 +13,17 @@ function BrowserCLH() {}
 
 BrowserCLH.prototype = {
   /**
    * Register resource://android as the APK root.
    *
    * Consumers can access Android assets using resource://android/assets/FILENAME.
    */
   setResourceSubstitutions: function () {
-    let registry = Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci["nsIChromeRegistry"]);
+    let registry = Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci.nsIChromeRegistry);
     // Like jar:jar:file:///data/app/org.mozilla.fennec-2.apk!/assets/omni.ja!/chrome/chrome/content/aboutHome.xhtml
     let url = registry.convertChromeURL(Services.io.newURI("chrome://browser/content/aboutHome.xhtml")).spec;
     // Like jar:file:///data/app/org.mozilla.fennec-2.apk!/
     url = url.substring(4, url.indexOf("!/") + 2);
 
     let protocolHandler = Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
     protocolHandler.setSubstitution("android", Services.io.newURI(url));
   },
--- a/mobile/android/components/LoginManagerPrompter.js
+++ b/mobile/android/components/LoginManagerPrompter.js
@@ -200,18 +200,18 @@ LoginManagerPrompter.prototype = {
           promptHistogram.add(PROMPT_NEVER);
           pwmgr.setLoginSavingEnabled(aLogin.hostname, false);
         }
       },
       {
         label: this._getLocalizedString("rememberButton"),
         callback: function(checked, response) {
           if (response) {
-            aLogin.username = response["username"] || aLogin.username;
-            aLogin.password = response["password"] || aLogin.password;
+            aLogin.username = response.username || aLogin.username;
+            aLogin.password = response.password || aLogin.password;
           }
           pwmgr.addLogin(aLogin);
           promptHistogram.add(PROMPT_ADD);
         },
         positive: true
       }
     ];
 
@@ -260,17 +260,17 @@ LoginManagerPrompter.prototype = {
         callback:  function() {
           promptHistogram.add(PROMPT_NOTNOW);
           // do nothing
         }
       },
       {
         label: this._getLocalizedString("updateButton"),
         callback:  function(checked, response) {
-          let password = response ? response["password"] : aNewPassword;
+          let password = response ? response.password : aNewPassword;
           self._updateLogin(aOldLogin, password);
 
           promptHistogram.add(PROMPT_UPDATE);
         },
         positive: true
       }
     ];
 
--- a/mobile/android/modules/FxAccountsWebChannel.jsm
+++ b/mobile/android/modules/FxAccountsWebChannel.jsm
@@ -93,22 +93,22 @@ this.FxAccountsWebChannelHelpers.prototy
  *     @param {String} options.helpers
  *     Helpers functions. Should only be passed in for testing.
  * @constructor
  */
 this.FxAccountsWebChannel = function(options) {
   if (!options) {
     throw new Error("Missing configuration options");
   }
-  if (!options["content_uri"]) {
+  if (!options.content_uri) {
     throw new Error("Missing 'content_uri' option");
   }
   this._contentUri = options.content_uri;
 
-  if (!options["channel_id"]) {
+  if (!options.channel_id) {
     throw new Error("Missing 'channel_id' option");
   }
   this._webChannelId = options.channel_id;
 
   // options.helpers is only specified by tests.
   this._helpers = options.helpers || new FxAccountsWebChannelHelpers(options);
 
   this._setupChannel();
--- a/mobile/android/modules/Home.jsm
+++ b/mobile/android/modules/Home.jsm
@@ -20,17 +20,17 @@ const PREFS_PANEL_AUTH_PREFIX = "home_pa
 const DEFAULT_WEIGHT = 100;
 
 // See bug 915424
 function resolveGeckoURI(aURI) {
   if (!aURI)
     throw "Can't resolve an empty uri";
 
   if (aURI.startsWith("chrome://")) {
-    let registry = Cc['@mozilla.org/chrome/chrome-registry;1'].getService(Ci["nsIChromeRegistry"]);
+    let registry = Cc['@mozilla.org/chrome/chrome-registry;1'].getService(Ci.nsIChromeRegistry);
     return registry.convertChromeURL(Services.io.newURI(aURI)).spec;
   } else if (aURI.startsWith("resource://")) {
     let handler = Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
     return handler.resolveURI(Services.io.newURI(aURI));
   }
   return aURI;
 }
 
--- a/mobile/android/modules/JNI.jsm
+++ b/mobile/android/modules/JNI.jsm
@@ -1015,17 +1015,17 @@ function JNILoadClass(jenv, classSig, op
       rpp.getElements = function(start, len) {
         var i, r=[];
         for (i=0; i<len; i++) { r.push(this.get(start+i)); }
         return r;
       };
       rpp.setElements = function(start, vals) {
         vals.forEach((v, i) => { this.set(start+i, v); });
       };
-      r['new'] = function(length) {
+      r.new = function(length) {
         return wrap(jenvpp().NewObjectArray(jenv, length, elemClass, null),
                     classSig);
       };
     } else {
       var ty = sig2type(elemSig), ctype = sig2ctype(elemSig);
       var constructor = "New"+ty+"Array";
       var getter = "Get"+ty+"ArrayRegion";
       var setter = "Set"+ty+"ArrayRegion";
@@ -1037,17 +1037,17 @@ function JNILoadClass(jenv, classSig, op
         j[getter].call(j, jenv, unwrap(this), start, len, buf);
         return buf;
       };
       rpp.setElements = function(start, vals) {
         var j = jenvpp();
         j[setter].call(j, jenv, unwrap(this), start, vals.length,
                        ctype.array()(vals));
       };
-      r['new'] = function(length) {
+      r.new = function(length) {
         var j = jenvpp();
         return wrap(j[constructor].call(j, jenv, length), classSig);
       };
     }
   }
 
   (props.static_fields || []).forEach(function(fld) {
     var jfld = jenvpp().GetStaticFieldID(jenv, jcls, fld.name, fld.sig);
@@ -1088,17 +1088,17 @@ function JNILoadClass(jenv, classSig, op
     };
   });
   (props.constructors || []).forEach(function(mtd) {
     mtd.name = "<init>";
     var jmtd = jenvpp().GetMethodID(jenv, jcls, mtd.name, mtd.sig);
     var argctypes = mtd.sig.match(sigRegex()).map(s => sig2ctype(s));
     var returnSig = mtd.sig.substring(mtd.sig.indexOf(')')+1);
 
-    r['new'] = overloadFunc('new');
+    r.new = overloadFunc('new');
     r['new'+mtd.sig] = r['new('+(argctypes.length-1)+')'] = function() {
       var i, j = jenvpp();
       var args = [jenv, jcls, jmtd];
       for (i=0; i<arguments.length; i++) {
         args.push(unwrap(arguments[i], jenv, argctypes[i]));
       }
       return wrap(j.NewObject.apply(j, args), classSig);
     };
--- a/mobile/android/modules/PageActions.jsm
+++ b/mobile/android/modules/PageActions.jsm
@@ -17,17 +17,17 @@ this.EXPORTED_SYMBOLS = ["PageActions"];
 
 // Copied from browser.js
 // TODO: We should move this method to a common importable location
 function resolveGeckoURI(aURI) {
   if (!aURI)
     throw "Can't resolve an empty uri";
 
   if (aURI.startsWith("chrome://")) {
-    let registry = Cc['@mozilla.org/chrome/chrome-registry;1'].getService(Ci["nsIChromeRegistry"]);
+    let registry = Cc['@mozilla.org/chrome/chrome-registry;1'].getService(Ci.nsIChromeRegistry);
     return registry.convertChromeURL(Services.io.newURI(aURI)).spec;
   } else if (aURI.startsWith("resource://")) {
     let handler = Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
     return handler.resolveURI(Services.io.newURI(aURI));
   }
   return aURI;
 }
 
--- a/mobile/android/modules/WebsiteMetadata.jsm
+++ b/mobile/android/modules/WebsiteMetadata.jsm
@@ -16,19 +16,19 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 var WebsiteMetadata = {
   /**
    * Asynchronously parse the document extract metadata. A 'Website:Metadata' event with the metadata
    * will be sent.
    */
   parseAsynchronously: function(doc) {
     Task.spawn(function() {
       let metadata = getMetadata(doc, doc.location.href, {
-        image_url: metadataRules['image_url'],
-        provider: metadataRules['provider'],
-        description_length: metadataRules['description_length']
+        image_url: metadataRules.image_url,
+        provider: metadataRules.provider,
+        description_length: metadataRules.description_length
       });
 
       // No metadata was extracted, so don't bother sending it.
       if (Object.keys(metadata).length === 0) {
         return;
       }
 
       let msg = {
--- a/security/.eslintrc.js
+++ b/security/.eslintrc.js
@@ -12,19 +12,16 @@ module.exports = {
     "constructor-super": "error",
 
     // Require braces around blocks that start a new line
     "curly": ["error", "multi-line"],
 
     // Require default case in switch statements.
     "default-case": "error",
 
-    // Require `foo.bar` dot notation instead of `foo["bar"]` notation.
-    "dot-notation": "error",
-
     // Require function* name()
     "generator-star-spacing": ["error", {"before": false, "after": true}],
 
     // Always require parenthesis for new calls
     "new-parens": "error",
 
     // Disallow use of alert(), confirm(), and prompt().
     "no-alert": "error",
--- a/services/common/hawkclient.js
+++ b/services/common/hawkclient.js
@@ -239,17 +239,17 @@ this.HawkClient.prototype = {
 
       if (error) {
         // When things really blow up, reconstruct an error object that follows
         // the general format of the server on error responses.
         deferred.reject(self._constructError(restResponse, error));
         return;
       }
 
-      self._updateClockOffset(restResponse.headers["date"]);
+      self._updateClockOffset(restResponse.headers.date);
 
       if (status === 401 && retryOK && !("retry-after" in restResponse.headers)) {
         // Retry once if we were rejected due to a bad timestamp.
         // Clock offset is adjusted already in the top of this function.
         log.debug("Received 401 for " + path + ": retrying");
         deferred.resolve(self.request(path, method, credentials, payloadObj, extraHeaders, false));
         return;
       }
--- a/services/common/tests/unit/test_storage_server.js
+++ b/services/common/tests/unit/test_storage_server.js
@@ -552,17 +552,17 @@ add_test(function test_get_storage_405()
   let server = new StorageServer();
   server.registerUser("123", "password");
   server.startSynchronous();
 
   let request = localRequest(server, "/2.0/123/storage", "123", "password");
   let error = doGetRequest(request);
   do_check_eq(error, null);
   do_check_eq(request.response.status, 405);
-  do_check_eq(request.response.headers["allow"], "DELETE");
+  do_check_eq(request.response.headers.allow, "DELETE");
 
   server.stop(run_next_test);
 });
 
 add_test(function test_delete_storage() {
   _("Ensure that deleting all of storage works.");
 
   let server = new StorageServer();
--- a/services/common/tokenserverclient.js
+++ b/services/common/tokenserverclient.js
@@ -40,17 +40,17 @@ TokenServerClientError.prototype.constru
 TokenServerClientError.prototype._toStringFields = function() {
   return {message: this.message};
 }
 TokenServerClientError.prototype.toString = function() {
   return this.name + "(" + JSON.stringify(this._toStringFields()) + ")";
 }
 TokenServerClientError.prototype.toJSON = function() {
   let result = this._toStringFields();
-  result["name"] = this.name;
+  result.name = this.name;
   return result;
 }
 
 /**
  * Represents a TokenServerClient error that occurred in the network layer.
  *
  * @param error
  *        The underlying error thrown by the network layer.
--- a/services/fxaccounts/FxAccountsProfileClient.jsm
+++ b/services/fxaccounts/FxAccountsProfileClient.jsm
@@ -168,17 +168,17 @@ this.FxAccountsProfileClient.prototype =
           }));
           return;
         }
 
         // "response.success" means status code is 200
         if (request.response.success) {
           resolve({
             body,
-            etag: request.response.headers["etag"]
+            etag: request.response.headers.etag
           });
           return;
         }
         reject(new FxAccountsProfileClientError({
           error: body.error || ERROR_UNKNOWN,
           errno: body.errno || ERRNO_UNKNOWN_ERROR,
           code: request.response.status,
           message: body.message || body,
--- a/services/fxaccounts/FxAccountsWebChannel.jsm
+++ b/services/fxaccounts/FxAccountsWebChannel.jsm
@@ -77,22 +77,22 @@ function getErrorDetails(error) {
  *     @param {String} options.helpers
  *     Helpers functions. Should only be passed in for testing.
  * @constructor
  */
 this.FxAccountsWebChannel = function(options) {
   if (!options) {
     throw new Error("Missing configuration options");
   }
-  if (!options["content_uri"]) {
+  if (!options.content_uri) {
     throw new Error("Missing 'content_uri' option");
   }
   this._contentUri = options.content_uri;
 
-  if (!options["channel_id"]) {
+  if (!options.channel_id) {
     throw new Error("Missing 'channel_id' option");
   }
   this._webChannelId = options.channel_id;
 
   // options.helpers is only specified by tests.
   XPCOMUtils.defineLazyGetter(this, "_helpers", () => {
     return options.helpers || new FxAccountsWebChannelHelpers(options);
   });
--- a/services/sync/modules/service.js
+++ b/services/sync/modules/service.js
@@ -43,23 +43,23 @@ function getEngineModules() {
     Form: {module: "forms.js", symbol: "FormEngine"},
     History: {module: "history.js", symbol: "HistoryEngine"},
     Password: {module: "passwords.js", symbol: "PasswordEngine"},
     Prefs: {module: "prefs.js", symbol: "PrefsEngine"},
     Tab: {module: "tabs.js", symbol: "TabEngine"},
     ExtensionStorage: {module: "extension-storage.js", symbol: "ExtensionStorageEngine"},
   }
   if (Svc.Prefs.get("engine.addresses.available", false)) {
-    result["Addresses"] = {
+    result.Addresses = {
       module: "resource://formautofill/FormAutofillSync.jsm",
       symbol: "AddressesEngine",
     };
   }
   if (Svc.Prefs.get("engine.creditcards.available", false)) {
-    result["CreditCards"] = {
+    result.CreditCards = {
       module: "resource://formautofill/FormAutofillSync.jsm",
       symbol: "CreditCardsEngine",
     };
   }
   return result;
 }
 
 const STORAGE_INFO_TYPES = [INFO_COLLECTIONS,
--- a/services/sync/modules/telemetry.js
+++ b/services/sync/modules/telemetry.js
@@ -440,17 +440,17 @@ class SyncTelemetryImpl {
     this.lastDeviceID = undefined;
     let sessionStartDate = Services.startup.getStartupInfo().main;
     this.sessionStartDate = TelemetryUtils.toLocalTimeISOString(
       TelemetryUtils.truncateToHours(sessionStartDate));
   }
 
   getPingJSON(reason) {
     return {
-      os: TelemetryEnvironment.currentEnvironment["system"]["os"],
+      os: TelemetryEnvironment.currentEnvironment.system.os,
       why: reason,
       discarded: this.discarded || undefined,
       version: PING_FORMAT_VERSION,
       syncs: this.payloads.slice(),
       uid: this.lastUID,
       deviceID: this.lastDeviceID,
       sessionStartDate: this.sessionStartDate,
       events: this.events.length == 0 ? undefined : this.events,
--- a/services/sync/tests/unit/test_addons_engine.js
+++ b/services/sync/tests/unit/test_addons_engine.js
@@ -147,17 +147,17 @@ add_task(async function test_get_changed
     guid:           Utils.makeGUID(),
     enabled:        true,
     installed:      true,
     modified:       new Date(),
     type:           "UNSUPPORTED",
     scope:          0,
     foreignInstall: false
   };
-  reconciler.addons["DUMMY"] = record;
+  reconciler.addons.DUMMY = record;
   reconciler._addChange(record.modified, CHANGE_INSTALLED, record);
 
   changes = await engine.getChangedIDs();
   _(JSON.stringify(changes));
   do_check_eq(0, Object.keys(changes).length);
 
   await resetReconciler();
 });
--- a/services/sync/tests/unit/test_declined.js
+++ b/services/sync/tests/unit/test_declined.js
@@ -56,20 +56,20 @@ add_task(async function testOldMeta() {
   _("Record: " + JSON.stringify(meta));
 
   let manager = getEngineManager();
 
   // Update enabled from meta/global.
   let engineSync = new EngineSynchronizer(Service);
   await engineSync._updateEnabledFromMeta(meta, 3, manager);
 
-  Assert.ok(manager._engines["petrol"].enabled, "'petrol' locally enabled.");
-  Assert.ok(manager._engines["diesel"].enabled, "'diesel' locally enabled.");
+  Assert.ok(manager._engines.petrol.enabled, "'petrol' locally enabled.");
+  Assert.ok(manager._engines.diesel.enabled, "'diesel' locally enabled.");
   Assert.ok(!("nonlocal" in manager._engines), "We don't know anything about the 'nonlocal' engine.");
-  Assert.ok(!manager._engines["actual"].enabled, "'actual' not locally enabled.");
+  Assert.ok(!manager._engines.actual.enabled, "'actual' not locally enabled.");
   Assert.ok(!manager.isDeclined("actual"), "'actual' not declined, though.");
 
   let declinedEngines = new DeclinedEngines(Service);
 
   function onNotDeclined(subject, topic, data) {
     Observers.remove("weave:engines:notdeclined", onNotDeclined);
     Assert.ok(subject.undecided.has("actual"), "EngineManager observed that 'actual' was undecided.");
 
@@ -102,20 +102,20 @@ add_task(async function testDeclinedMeta
       },
       declined: ["nonexistent"],   // Declined and not supported.
     },
   };
 
   _("Record: " + JSON.stringify(meta));
 
   let manager = getEngineManager();
-  manager._engines["petrol"].enabled = true;
-  manager._engines["diesel"].enabled = true;
-  manager._engines["dummy"].enabled = true;
-  manager._engines["actual"].enabled = false;   // Disabled but not declined.
+  manager._engines.petrol.enabled = true;
+  manager._engines.diesel.enabled = true;
+  manager._engines.dummy.enabled = true;
+  manager._engines.actual.enabled = false;   // Disabled but not declined.
 
   manager.decline(["localdecline"]);            // Declined and not supported.
 
   let declinedEngines = new DeclinedEngines(Service);
 
   function onNotDeclined(subject, topic, data) {
     Observers.remove("weave:engines:notdeclined", onNotDeclined);
     Assert.ok(subject.undecided.has("actual"), "EngineManager observed that 'actual' was undecided.");
--- a/services/sync/tests/unit/test_engine.js
+++ b/services/sync/tests/unit/test_engine.js
@@ -205,15 +205,15 @@ add_task(async function test_disabled_no
   do_check_empty(tracker.changedIDs);
 
   engine.enabled = true;
   tracker.observe(null, "weave:engine:start-tracking", null);
   do_check_true(tracker._isTracking);
   do_check_empty(tracker.changedIDs);
 
   tracker.addChangedID("abcdefghijkl");
-  do_check_true(0 < tracker.changedIDs["abcdefghijkl"]);
+  do_check_true(0 < tracker.changedIDs.abcdefghijkl);
   Svc.Prefs.set("engine." + engine.prefName, false);
   do_check_false(tracker._isTracking);
   do_check_empty(tracker.changedIDs);
 
   await cleanup(engine);
 });
--- a/services/sync/tests/unit/test_errorhandler_2.js
+++ b/services/sync/tests/unit/test_errorhandler_2.js
@@ -819,17 +819,17 @@ add_task(async function test_sync_engine
   engine.enabled = true;
   engine.sync = async function sync() {
     Svc.Obs.notify("weave:engine:sync:error", ENGINE_UNKNOWN_FAIL, "catapult");
   };
 
   let log = Log.repository.getLogger("Sync.ErrorHandler");
   Svc.Prefs.set("log.appender.file.logOnError", true);
 
-  do_check_eq(Status.engines["catapult"], undefined);
+  do_check_eq(Status.engines.catapult, undefined);
 
   let promiseObserved = new Promise(res => {
     Svc.Obs.add("weave:engine:sync:finish", function onEngineFinish() {
       Svc.Obs.remove("weave:engine:sync:finish", onEngineFinish);
 
       log.info("Adding reset-file-log observer.");
       Svc.Obs.add("weave:service:reset-file-log", function onResetFileLog() {
         Svc.Obs.remove("weave:service:reset-file-log", onResetFileLog);
@@ -841,17 +841,17 @@ add_task(async function test_sync_engine
   do_check_true(await EHTestsCommon.setUp(server));
   let ping = await sync_and_validate_telem(true);
   deepEqual(ping.status.service, SYNC_FAILED_PARTIAL);
   deepEqual(ping.engines.find(e => e.status).status, ENGINE_UNKNOWN_FAIL);
 
   await promiseObserved;
 
   _("Status.engines: " + JSON.stringify(Status.engines));
-  do_check_eq(Status.engines["catapult"], ENGINE_UNKNOWN_FAIL);
+  do_check_eq(Status.engines.catapult, ENGINE_UNKNOWN_FAIL);
   do_check_eq(Status.service, SYNC_FAILED_PARTIAL);
 
   // Test Error log was written on SYNC_FAILED_PARTIAL.
   let entries = logsdir.directoryEntries;
   do_check_true(entries.hasMoreElements());
   let logfile = entries.getNext().QueryInterface(Ci.nsILocalFile);
   do_check_true(logfile.leafName.startsWith("error-sync-"), logfile.leafName);
 
@@ -930,22 +930,22 @@ add_task(async function test_engine_appl
   engine.sync = async function sync() {
     Svc.Obs.notify("weave:engine:sync:applied", {newFailed: 1}, "catapult");
   };
 
   Svc.Prefs.set("log.appender.file.logOnError", true);
 
   let promiseObserved = promiseOneObserver("weave:service:reset-file-log");
 
-  do_check_eq(Status.engines["catapult"], undefined);
+  do_check_eq(Status.engines.catapult, undefined);
   do_check_true(await EHTestsCommon.setUp(server));
   await Service.sync();
   await promiseObserved;
 
-  do_check_eq(Status.engines["catapult"], ENGINE_APPLY_FAIL);
+  do_check_eq(Status.engines.catapult, ENGINE_APPLY_FAIL);
   do_check_eq(Status.service, SYNC_FAILED_PARTIAL);
 
   // Test Error log was written on SYNC_FAILED_PARTIAL.
   let entries = logsdir.directoryEntries;
   do_check_true(entries.hasMoreElements());
   let logfile = entries.getNext().QueryInterface(Ci.nsILocalFile);
   do_check_true(logfile.leafName.startsWith("error-sync-"), logfile.leafName);
 
--- a/services/sync/tests/unit/test_httpd_sync_server.js
+++ b/services/sync/tests/unit/test_httpd_sync_server.js
@@ -220,26 +220,26 @@ add_test(function test_storage_request()
     let now = server.timestamp();
     _("Timestamp: " + now);
     let req = localRequest(server, storageURL);
     req.delete(function(err) {
       _("Body is " + this.response.body);
       _("Modified is " + this.response.newModified);
       let parsedBody = JSON.parse(this.response.body);
       do_check_true(parsedBody >= now);
-      do_check_empty(server.users["john"].collections);
+      do_check_empty(server.users.john.collections);
       Utils.nextTick(next);
     });
   }
   function getStorageFails(next) {
     _("Testing that GET on /storage fails.");
     let req = localRequest(server, storageURL);
     req.get(function(err) {
       do_check_eq(this.response.status, 405);
-      do_check_eq(this.response.headers["allow"], "DELETE");
+      do_check_eq(this.response.headers.allow, "DELETE");
       Utils.nextTick(next);
     });
   }
   function getMissingCollectionWBO(next) {
     _("Testing that fetching a WBO from an on-existent collection 404s.");
     let req = localRequest(server, storageURL + "/foobar/baz");
     req.get(function(err) {
       do_check_eq(this.response.status, 404);
--- a/services/sync/tests/unit/test_keys.js
+++ b/services/sync/tests/unit/test_keys.js
@@ -210,19 +210,19 @@ add_task(async function test_ensureLogge
   b2 = collectionKeys.keyForCollection(null);
   do_check_keypair_eq(b1.keyPair, b2.keyPair);
 
   /*
    * Checking for update times.
    */
   let info_collections = {};
   do_check_true(collectionKeys.updateNeeded(info_collections));
-  info_collections["crypto"] = 5000;
+  info_collections.crypto = 5000;
   do_check_false(collectionKeys.updateNeeded(info_collections));
-  info_collections["crypto"] = 1 + (Date.now() / 1000);              // Add one in case computers are fast!
+  info_collections.crypto = 1 + (Date.now() / 1000);              // Add one in case computers are fast!
   do_check_true(collectionKeys.updateNeeded(info_collections));
 
   collectionKeys.lastModified = null;
   do_check_true(collectionKeys.updateNeeded({}));
 
   /*
    * Check _compareKeyBundleCollections.
    */
--- a/services/sync/tests/unit/test_resource_async.js
+++ b/services/sync/tests/unit/test_resource_async.js
@@ -288,18 +288,18 @@ add_task(async function test_get() {
               "Parse fail: Response body starts: \"\"This path exists\"\".");
   resLogger.debug = dbg;
 });
 
 add_test(function test_basicauth() {
   _("Test that the BasicAuthenticator doesn't screw up header case.");
   let res1 = new AsyncResource(server.baseURI + "/foo");
   res1.setHeader("Authorization", "Basic foobar");
-  do_check_eq(res1._headers["authorization"], "Basic foobar");
-  do_check_eq(res1.headers["authorization"], "Basic foobar");
+  do_check_eq(res1._headers.authorization, "Basic foobar");
+  do_check_eq(res1.headers.authorization, "Basic foobar");
 
   run_next_test();
 });
 
 add_task(async function test_get_protected_fail() {
   _("GET a password protected resource (test that it'll fail w/o pass, no throw)");
   let res2 = new AsyncResource(server.baseURI + "/protected");
   let content = await res2.get()
--- a/services/sync/tests/unit/test_service_sync_updateEnabledEngines.js
+++ b/services/sync/tests/unit/test_service_sync_updateEnabledEngines.js
@@ -306,22 +306,22 @@ add_task(async function test_disabledRem
     engine.enabled = true;
     Service._ignorePrefObserver = false;
 
     _("Sync.");
     await Service.sync();
 
     _("Disable engine by deleting from meta/global.");
     let d = metaWBO.data;
-    delete d.engines["steam"];
+    delete d.engines.steam;
     metaWBO.payload = JSON.stringify(d);
     metaWBO.modified = Date.now() / 1000;
 
     _("Add a second client and verify that the local pref is changed.");
-    Service.clientsEngine._store._remoteClients["foobar"] = {name: "foobar", type: "desktop"};
+    Service.clientsEngine._store._remoteClients.foobar = {name: "foobar", type: "desktop"};
     await Service.sync();
 
     _("Engine is disabled.");
     do_check_false(engine.enabled);
 
   } finally {
     await Service.startOver();
     await promiseStopServer(server);
--- a/services/sync/tests/unit/test_status.js
+++ b/services/sync/tests/unit/test_status.js
@@ -46,28 +46,28 @@ function run_test() {
   do_check_eq(Status.sync, SYNC_SUCCEEDED);
   do_check_eq(Status.service, STATUS_OK);
 
   Status.resetSync();
 
 
   // Check engine status
   Status.engines = ["testEng1", ENGINE_SUCCEEDED];
-  do_check_eq(Status.engines["testEng1"], ENGINE_SUCCEEDED);
+  do_check_eq(Status.engines.testEng1, ENGINE_SUCCEEDED);
   do_check_eq(Status.service, STATUS_OK);
 
   Status.engines = ["testEng2", ENGINE_DOWNLOAD_FAIL];
-  do_check_eq(Status.engines["testEng1"], ENGINE_SUCCEEDED);
-  do_check_eq(Status.engines["testEng2"], ENGINE_DOWNLOAD_FAIL);
+  do_check_eq(Status.engines.testEng1, ENGINE_SUCCEEDED);
+  do_check_eq(Status.engines.testEng2, ENGINE_DOWNLOAD_FAIL);
   do_check_eq(Status.service, SYNC_FAILED_PARTIAL);
 
   Status.engines = ["testEng3", ENGINE_SUCCEEDED];
-  do_check_eq(Status.engines["testEng1"], ENGINE_SUCCEEDED);
-  do_check_eq(Status.engines["testEng2"], ENGINE_DOWNLOAD_FAIL);
-  do_check_eq(Status.engines["testEng3"], ENGINE_SUCCEEDED);
+  do_check_eq(Status.engines.testEng1, ENGINE_SUCCEEDED);
+  do_check_eq(Status.engines.testEng2, ENGINE_DOWNLOAD_FAIL);
+  do_check_eq(Status.engines.testEng3, ENGINE_SUCCEEDED);
   do_check_eq(Status.service, SYNC_FAILED_PARTIAL);
 
 
   // Check resetSync
   Status.sync = SYNC_FAILED;
   Status.resetSync();
 
   do_check_eq(Status.service, STATUS_OK);
--- a/services/sync/tests/unit/test_syncengine_sync.js
+++ b/services/sync/tests/unit/test_syncengine_sync.js
@@ -94,31 +94,31 @@ add_task(async function test_syncStartup
 
   await SyncTestingInfrastructure(server);
 
   let engine = makeRotaryEngine();
   engine._store.items = {rekolok: "Rekonstruktionslokomotive"};
   try {
 
     // Confirm initial environment
-    do_check_eq(engine._tracker.changedIDs["rekolok"], undefined);
+    do_check_eq(engine._tracker.changedIDs.rekolok, undefined);
     let metaGlobal = await Service.recordManager.get(engine.metaURL);
     do_check_eq(metaGlobal.payload.engines, undefined);
     do_check_true(!!collection.payload("flying"));
     do_check_true(!!collection.payload("scotsman"));
 
     engine.lastSync = Date.now() / 1000;
     engine.lastSyncLocal = Date.now();
 
     // Trying to prompt a wipe -- we no longer track CryptoMeta per engine,
     // so it has nothing to check.
     await engine._syncStartup();
 
     // The meta/global WBO has been filled with data about the engine
-    let engineData = metaGlobal.payload.engines["rotary"];
+    let engineData = metaGlobal.payload.engines.rotary;
     do_check_eq(engineData.version, engine.version);
     do_check_eq(engineData.syncID, engine.syncID);
 
     // Sync was reset and server data was wiped
     do_check_eq(engine.lastSync, 0);
     do_check_eq(collection.payload("flying"), undefined);
     do_check_eq(collection.payload("scotsman"), undefined);
 
@@ -169,17 +169,17 @@ add_task(async function test_syncStartup
                              {engines: {rotary: {version: engine.version,
                                                 syncID: "foobar"}}});
   server.registerPathHandler("/1.1/foo/storage/meta/global", global.handler());
 
   try {
 
     // Confirm initial environment
     do_check_eq(engine.syncID, "fake-guid-00");
-    do_check_eq(engine._tracker.changedIDs["rekolok"], undefined);
+    do_check_eq(engine._tracker.changedIDs.rekolok, undefined);
 
     engine.lastSync = Date.now() / 1000;
     engine.lastSyncLocal = Date.now();
     await engine._syncStartup();
 
     // The engine has assumed the server's syncID
     do_check_eq(engine.syncID, "foobar");
 
@@ -344,17 +344,17 @@ add_task(async function test_processInco
   try {
 
     // Confirm initial environment
     do_check_eq(engine._store.items.newrecord, undefined);
     do_check_eq(engine._store.items.newerserver, "New data, but not as new as server!");
     do_check_eq(engine._store.items.olderidentical, "Older but identical");
     do_check_eq(engine._store.items.updateclient, "Got data?");
     do_check_eq(engine._store.items.nukeme, "Nuke me!");
-    do_check_true(engine._tracker.changedIDs["olderidentical"] > 0);
+    do_check_true(engine._tracker.changedIDs.olderidentical > 0);
 
     await engine._syncStartup();
     await engine._processIncoming();
 
     // Timestamps of last sync and last server modification are set.
     do_check_true(engine.lastSync > 0);
     do_check_true(engine.lastModified > 0);
 
@@ -362,17 +362,17 @@ add_task(async function test_processInco
     do_check_eq(engine._store.items.newrecord, "New stuff...");
 
     // The 'newerserver' record is updated since the server data is newer.
     do_check_eq(engine._store.items.newerserver, "New data!");
 
     // The data for 'olderidentical' is identical on the server, so
     // it's no longer marked as changed anymore.
     do_check_eq(engine._store.items.olderidentical, "Older but identical");
-    do_check_eq(engine._tracker.changedIDs["olderidentical"], undefined);
+    do_check_eq(engine._tracker.changedIDs.olderidentical, undefined);
 
     // Updated with server data.
     do_check_eq(engine._store.items.updateclient, "Get this!");
 
     // The incoming ID is preferred.
     do_check_eq(engine._store.items.original, undefined);
     do_check_eq(engine._store.items.duplication, "Original Entry");
     do_check_neq(engine._delete.ids.indexOf("original"), -1);
@@ -1190,17 +1190,17 @@ add_task(async function test_uploadOutgo
     do_check_true(engine.lastSyncLocal > 0);
 
     // Ensure the marked record ('scotsman') has been uploaded and is
     // no longer marked.
     do_check_eq(collection.payload("flying"), undefined);
     do_check_true(!!collection.payload("scotsman"));
     do_check_eq(JSON.parse(collection.wbo("scotsman").data.ciphertext).id,
                 "scotsman");
-    do_check_eq(engine._tracker.changedIDs["scotsman"], undefined);
+    do_check_eq(engine._tracker.changedIDs.scotsman, undefined);
 
     // The 'flying' record wasn't marked so it wasn't uploaded
     do_check_eq(collection.payload("flying"), undefined);
 
   } finally {
     await cleanAndGo(engine, server);
   }
 });
@@ -1246,27 +1246,27 @@ async function test_uploadOutgoing_max_r
       do_throw("should not get here");
     }
 
     await engine.trackRemainingChanges();
 
     // Check we uploaded the other record to the server
     do_check_true(collection.payload("scotsman"));
     // And that we won't try to upload the huge record next time.
-    do_check_eq(engine._tracker.changedIDs["flying"], undefined);
+    do_check_eq(engine._tracker.changedIDs.flying, undefined);
 
   } catch (e) {
     if (allowSkippedRecord) {
       do_throw("should not get here");
     }
 
     await engine.trackRemainingChanges();
 
     // Check that we will try to upload the huge record next time
-    do_check_eq(engine._tracker.changedIDs["flying"], 1000);
+    do_check_eq(engine._tracker.changedIDs.flying, 1000);
   } finally {
     // Check we didn't upload the oversized record to the server
     do_check_eq(collection.payload("flying"), undefined);
     await cleanAndGo(engine, server);
   }
 }
 
 
@@ -1312,34 +1312,34 @@ add_task(async function test_uploadOutgo
   meta_global.payload.engines = {rotary: {version: engine.version,
                                          syncID: engine.syncID}};
 
   try {
 
     // Confirm initial environment
     do_check_eq(engine.lastSyncLocal, 0);
     do_check_eq(collection.payload("flying"), undefined);
-    do_check_eq(engine._tracker.changedIDs["flying"], FLYING_CHANGED);
-    do_check_eq(engine._tracker.changedIDs["scotsman"], SCOTSMAN_CHANGED);
-    do_check_eq(engine._tracker.changedIDs["peppercorn"], PEPPERCORN_CHANGED);
+    do_check_eq(engine._tracker.changedIDs.flying, FLYING_CHANGED);
+    do_check_eq(engine._tracker.changedIDs.scotsman, SCOTSMAN_CHANGED);
+    do_check_eq(engine._tracker.changedIDs.peppercorn, PEPPERCORN_CHANGED);
 
     engine.enabled = true;
     await sync_engine_and_validate_telem(engine, true);
 
     // Local timestamp has been set.
     do_check_true(engine.lastSyncLocal > 0);
 
     // Ensure the 'flying' record has been uploaded and is no longer marked.
     do_check_true(!!collection.payload("flying"));
-    do_check_eq(engine._tracker.changedIDs["flying"], undefined);
+    do_check_eq(engine._tracker.changedIDs.flying, undefined);
 
     // The 'scotsman' and 'peppercorn' records couldn't be uploaded so
     // they weren't cleared from the tracker.
-    do_check_eq(engine._tracker.changedIDs["scotsman"], SCOTSMAN_CHANGED);
-    do_check_eq(engine._tracker.changedIDs["peppercorn"], PEPPERCORN_CHANGED);
+    do_check_eq(engine._tracker.changedIDs.scotsman, SCOTSMAN_CHANGED);
+    do_check_eq(engine._tracker.changedIDs.peppercorn, PEPPERCORN_CHANGED);
 
   } finally {
     await promiseClean(engine, server);
   }
 });
 
 /* A couple of "functional" tests to ensure we split records into appropriate
    POST requests. More comprehensive unit-tests for this "batching" are in
@@ -1443,50 +1443,50 @@ async function createRecordFailTelemetry
   meta_global.payload.engines = {rotary: {version: engine.version,
                                          syncID: engine.syncID}};
 
   let ping;
   try {
     // Confirm initial environment
     do_check_eq(engine.lastSyncLocal, 0);
     do_check_eq(collection.payload("flying"), undefined);
-    do_check_eq(engine._tracker.changedIDs["flying"], FLYING_CHANGED);
-    do_check_eq(engine._tracker.changedIDs["scotsman"], SCOTSMAN_CHANGED);
+    do_check_eq(engine._tracker.changedIDs.flying, FLYING_CHANGED);
+    do_check_eq(engine._tracker.changedIDs.scotsman, SCOTSMAN_CHANGED);
 
     engine.enabled = true;
     ping = await sync_engine_and_validate_telem(engine, true, onErrorPing => {
       ping = onErrorPing;
     });
 
     if (!allowSkippedRecord) {
       do_throw("should not get here");
     }
 
     // Ensure the 'flying' record has been uploaded and is no longer marked.
     do_check_true(!!collection.payload("flying"));
-    do_check_eq(engine._tracker.changedIDs["flying"], undefined);
+    do_check_eq(engine._tracker.changedIDs.flying, undefined);
   } catch (err) {
     if (allowSkippedRecord) {
       do_throw("should not get here");
     }
 
     // Ensure the 'flying' record has not been uploaded and is still marked
     do_check_false(collection.payload("flying"));
-    do_check_true(engine._tracker.changedIDs["flying"]);
+    do_check_true(engine._tracker.changedIDs.flying);
   } finally {
     // Local timestamp has been set.
     do_check_true(engine.lastSyncLocal > 0);
 
     // We reported in telemetry that we failed a record
     do_check_eq(ping.engines[0].outgoing[0].failed, 1);
 
     // In any case, the 'scotsman' record couldn't be created so it wasn't
     // uploaded nor it was not cleared from the tracker.
     do_check_false(collection.payload("scotsman"));
-    do_check_eq(engine._tracker.changedIDs["scotsman"], SCOTSMAN_CHANGED);
+    do_check_eq(engine._tracker.changedIDs.scotsman, SCOTSMAN_CHANGED);
 
     engine._store.createRecord = oldCreateRecord;
     await promiseClean(engine, server);
   }
 }
 
 add_task(async function test_uploadOutgoing_createRecord_throws_reported_telemetry() {
   _("SyncEngine._uploadOutgoing reports a failed record to telemetry if createRecord throws");
--- a/services/sync/tests/unit/test_tab_store.js
+++ b/services/sync/tests/unit/test_tab_store.js
@@ -21,33 +21,33 @@ add_task(async function test_create() {
   let store = engine._store;
 
   _("Create a first record");
   let rec = {id: "id1",
              clientName: "clientName1",
              cleartext: { "foo": "bar" },
              modified: 1000};
   await store.applyIncoming(rec);
-  deepEqual(store._remoteClients["id1"], { lastModified: 1000, foo: "bar" });
+  deepEqual(store._remoteClients.id1, { lastModified: 1000, foo: "bar" });
 
   _("Create a second record");
   rec = {id: "id2",
          clientName: "clientName2",
          cleartext: { "foo2": "bar2" },
          modified: 2000};
   await store.applyIncoming(rec);
-  deepEqual(store._remoteClients["id2"], { lastModified: 2000, foo2: "bar2" });
+  deepEqual(store._remoteClients.id2, { lastModified: 2000, foo2: "bar2" });
 
   _("Create a third record");
   rec = {id: "id3",
          clientName: "clientName3",
          cleartext: { "foo3": "bar3" },
          modified: 3000};
   await store.applyIncoming(rec);
-  deepEqual(store._remoteClients["id3"], { lastModified: 3000, foo3: "bar3" });
+  deepEqual(store._remoteClients.id3, { lastModified: 3000, foo3: "bar3" });
 });
 
 add_task(async function test_getAllTabs() {
   let store = await getMockStore();
   let tabs;
 
   let threeUrls = ["http://foo.com", "http://fuubar.com", "http://barbar.com"];
 
--- a/services/sync/tps/extensions/tps/resource/auth/fxaccounts.jsm
+++ b/services/sync/tps/extensions/tps/resource/auth/fxaccounts.jsm
@@ -166,29 +166,29 @@ var Authentication = {
    * @param account.username
    *        The username for the account (utf8)
    * @param account.password
    *        The user's password
    */
   signIn: function signIn(account) {
     let cb = Async.makeSpinningCallback();
 
-    Logger.AssertTrue(account["username"], "Username has been found");
-    Logger.AssertTrue(account["password"], "Password has been found");
+    Logger.AssertTrue(account.username, "Username has been found");
+    Logger.AssertTrue(account.password, "Password has been found");
 
-    Logger.logInfo("Login user: " + account["username"]);
+    Logger.logInfo("Login user: " + account.username);
 
     // Required here since we don't go through the real login page
     Async.promiseSpinningly(FxAccountsConfig.ensureConfigured());
 
     let client = new FxAccountsClient();
-    client.signIn(account["username"], account["password"], true).then(credentials => {
+    client.signIn(account.username, account.password, true).then(credentials => {
       return fxAccounts.setSignedInUser(credentials);
     }).then(() => {
-      return this._completeVerification(account["username"])
+      return this._completeVerification(account.username)
     }).then(() => {
       cb(null, true);
     }, error => {
       cb(error, false);
     });
 
     try {
       cb.wait();
--- a/services/sync/tps/extensions/tps/resource/tps.jsm
+++ b/services/sync/tps/extensions/tps/resource/tps.jsm
@@ -502,20 +502,20 @@ var TPS = {
     this.shouldValidateBookmarks = true;
     try {
       let items = [];
       for (let folder in bookmarks) {
         let last_item_pos = -1;
         for (let bookmark of bookmarks[folder]) {
           Logger.clearPotentialError();
           let placesItem;
-          bookmark["location"] = folder;
+          bookmark.location = folder;
 
           if (last_item_pos != -1)
-            bookmark["last_item_pos"] = last_item_pos;
+            bookmark.last_item_pos = last_item_pos;
           let item_id = -1;
 
           if (action != ACTION_MODIFY && action != ACTION_DELETE)
             Logger.logInfo("executing action " + action.toUpperCase() +
                            " on bookmark " + JSON.stringify(bookmark));
 
           if ("uri" in bookmark)
             placesItem = new Bookmark(bookmark);
--- a/testing/marionette/evaluate.js
+++ b/testing/marionette/evaluate.js
@@ -275,17 +275,17 @@ evaluate.toJSON = function(obj, seenEls)
     return [...obj].map(el => evaluate.toJSON(el, seenEls));
 
   // HTMLElement
   } else if ("nodeType" in obj && obj.nodeType == obj.ELEMENT_NODE) {
     let uuid = seenEls.add(obj);
     return element.makeWebElement(uuid);
 
   // custom JSON representation
-  } else if (typeof obj["toJSON"] == "function") {
+  } else if (typeof obj.toJSON == "function") {
     let unsafeJSON = obj.toJSON();
     return evaluate.toJSON(unsafeJSON, seenEls);
   }
 
   // arbitrary objects + files
   let rv = {};
   for (let prop in obj) {
     try {
--- a/testing/marionette/event.js
+++ b/testing/marionette/event.js
@@ -1365,20 +1365,20 @@ event.sendKeysToElement = function(
 };
 
 event.sendEvent = function(eventType, el, modifiers = {}, opts = {}) {
   opts.canBubble = opts.canBubble || true;
 
   let doc = el.ownerDocument || el.document;
   let ev = doc.createEvent("Event");
 
-  ev.shiftKey = modifiers["shift"];
-  ev.metaKey = modifiers["meta"];
-  ev.altKey = modifiers["alt"];
-  ev.ctrlKey = modifiers["ctrl"];
+  ev.shiftKey = modifiers.shift;
+  ev.metaKey = modifiers.meta;
+  ev.altKey = modifiers.alt;
+  ev.ctrlKey = modifiers.ctrl;
 
   ev.initEvent(eventType, opts.canBubble, true);
   el.dispatchEvent(ev);
 };
 
 event.focus = function(el, opts = {}) {
   opts.canBubble = opts.canBubble || true;
   let doc = el.ownerDocument || el.document;
--- a/testing/marionette/reftest.js
+++ b/testing/marionette/reftest.js
@@ -68,17 +68,17 @@ reftest.Runner = class {
    *     greater than 1.
    * @param {string} screenshotMode
    *     String enum representing when screenshots should be taken
    */
   *setup(urlCount, screenshotMode) {
     this.parentWindow =  assert.window(this.driver.getCurrentWindow());
 
     this.screenshotMode = SCREENSHOT_MODE[screenshotMode] ||
-        SCREENSHOT_MODE["unexpected"];
+        SCREENSHOT_MODE.unexpected;
 
     this.urlCount = Object.keys(urlCount || {})
         .reduce((map, key) => map.set(key, urlCount[key]), new Map());
 
     yield this.ensureWindow();
   }
 
   *ensureWindow() {
--- a/testing/talos/talos/startup_test/tspaint_test.html
+++ b/testing/talos/talos/startup_test/tspaint_test.html
@@ -16,17 +16,17 @@ async function painted() {
   window.removeEventListener("MozAfterPaint", painted, true);
 
   await TalosContentProfiler.pause();
   await TalosContentProfiler.initFromURLQueryParams(location.search);
   await TalosContentProfiler.finishStartupProfiling();
 
   let startupInfo = await TalosPowersContent.getStartupInfo();
 
-  let startupTime = startupInfo["firstPaint"] - startupInfo["process"];
+  let startupTime = startupInfo.firstPaint - startupInfo.process;
 
   document.body.textContent = "Startup time = " + startupTime + " ms";
   if (window.dump) {
     dumpLog("__start_report" + startupTime + "__end_report\n\n");
   }
   dumpConsoleAndQuit();
 }
 
--- a/testing/talos/talos/talos-powers/components/TalosPowersService.js
+++ b/testing/talos/talos/talos-powers/components/TalosPowersService.js
@@ -239,17 +239,17 @@ TalosPowersService.prototype = {
       dump("Force Quit failed: " + e);
     }
   },
 
   receiveGetStartupInfo(message) {
     let mm = message.target.messageManager;
     let startupInfo = Services.startup.getStartupInfo();
 
-    if (!startupInfo["firstPaint"]) {
+    if (!startupInfo.firstPaint) {
       // It's possible that we were called early enough that
       // the firstPaint measurement hasn't been set yet. In
       // that case, we set up an observer for the next time
       // a window is painted and re-retrieve the startup info.
       let obs = function(subject, topic) {
         Services.obs.removeObserver(this, topic);
         startupInfo = Services.startup.getStartupInfo();
         mm.sendAsyncMessage("TalosPowersContent:GetStartupInfo:Result",
--- a/testing/talos/talos/tests/tart/addon/content/tart.js
+++ b/testing/talos/talos/tests/tart/addon/content/tart.js
@@ -664,21 +664,21 @@ Tart.prototype = {
       ]
     };
 
     // Construct the sequence array: config.repeat times config.subtests,
     // where each subtest implicitly starts with init.
     sequenceArray = [];
     for (var i in this._config.subtests) {
       for (var r = 0; r < this._config.repeat; r++) {
-        sequenceArray = sequenceArray.concat(subtests["init"]);
+        sequenceArray = sequenceArray.concat(subtests.init);
         sequenceArray = sequenceArray.concat(subtests[this._config.subtests[i]]);
       }
     }
-    sequenceArray = sequenceArray.concat(subtests["restore"]);
+    sequenceArray = sequenceArray.concat(subtests.restore);
 
     this._doSequence(sequenceArray, this._doneInternal);
   },
 
   startTest(doneCallback, config) {
     this._onTestComplete = function(results) {
       Profiler.mark("TART - end", true);
       doneCallback(results);
--- a/testing/xpcshell/example/unit/test_import_module.js
+++ b/testing/xpcshell/example/unit/test_import_module.js
@@ -8,18 +8,18 @@
 /* import-globals-from import_sub_module.jsm */
 
 /**
  * Ensures that tests can import a module in the same folder through:
  * Components.utils.import("resource://test/module.jsm");
  */
 
 function run_test() {
-  do_check_true(typeof(this["MODULE_IMPORTED"]) == "undefined");
-  do_check_true(typeof(this["MODULE_URI"]) == "undefined");
+  do_check_true(typeof(this.MODULE_IMPORTED) == "undefined");
+  do_check_true(typeof(this.MODULE_URI) == "undefined");
   let uri = "resource://test/import_module.jsm";
   Components.utils.import(uri);
   do_check_true(MODULE_URI == uri);
   do_check_true(MODULE_IMPORTED);
   do_check_true(SUBMODULE_IMPORTED);
   do_check_true(same_scope);
   do_check_true(SUBMODULE_IMPORTED_TO_SCOPE);
 }
--- a/toolkit/components/aboutmemory/content/aboutMemory.js
+++ b/toolkit/components/aboutmemory/content/aboutMemory.js
@@ -1024,18 +1024,18 @@ function appendAboutMemoryMain(aProcessR
       if (aProcessA == gUnnamedProcessStr) {
         return -1;
       }
       if (aProcessB == gUnnamedProcessStr) {
         return 1;
       }
 
       // Then sort by resident size.
-      let nodeA = pcollsByProcess[aProcessA]._degenerates["resident"];
-      let nodeB = pcollsByProcess[aProcessB]._degenerates["resident"];
+      let nodeA = pcollsByProcess[aProcessA]._degenerates.resident;
+      let nodeB = pcollsByProcess[aProcessB]._degenerates.resident;
       let residentA = nodeA ? nodeA._amount : -1;
       let residentB = nodeB ? nodeB._amount : -1;
 
       if (residentA > residentB) {
         return -1;
       }
       if (residentA < residentB) {
         return 1;
--- a/toolkit/components/captivedetect/captivedetect.js
+++ b/toolkit/components/captivedetect/captivedetect.js
@@ -255,18 +255,18 @@ CaptivePortalDetector.prototype = {
     // Prevent multiple requests on a single network interface
     if (this._interfaceNames[aInterfaceName]) {
       throw Components.Exception("Do not allow multiple request on one interface: " + aInterfaceName);
     }
 
     let request = {interfaceName: aInterfaceName};
     if (aCallback) {
       let callback = aCallback.QueryInterface(Ci.nsICaptivePortalCallback);
-      request["callback"] = callback;
-      request["retryCount"] = 0;
+      request.callback = callback;
+      request.retryCount = 0;
     }
     this._addRequest(request);
   },
 
   abort: function abort(aInterfaceName) {
     debug("abort for " + aInterfaceName);
     this._removeRequest(aInterfaceName);
   },
@@ -327,28 +327,28 @@ CaptivePortalDetector.prototype = {
       if (status >= 300 && status <= 399) {
         // The canonical website has been redirected to an unknown location
         self._startLogin();
       } else {
         mayRetry();
       }
     };
 
-    this._runningRequest["urlFetcher"] = urlFetcher;
+    this._runningRequest.urlFetcher = urlFetcher;
   },
 
   _startLogin: function _startLogin() {
     let id = this._allocateRequestId();
     let details = {
       type: kOpenCaptivePortalLoginEvent,
       id,
       url: this._canonicalSiteURL,
     };
     this._loginObserver.attach();
-    this._runningRequest["eventId"] = id;
+    this._runningRequest.eventId = id;
     this._sendEvent(kOpenCaptivePortalLoginEvent, details);
     gSysMsgr.broadcastMessage(kCaptivePortalSystemMessage, {});
   },
 
   _mayRetry: function _mayRetry() {
     if (this._runningRequest.retryCount++ < this._maxRetryCount) {
       debug("retry-Detection: " + this._runningRequest.retryCount + "/" + this._maxRetryCount);
       this._startDetection();
@@ -364,23 +364,23 @@ CaptivePortalDetector.prototype = {
         this._runningRequest.callback.complete(success);
       }
 
       // Only when the request has a event id and |success| is true
       // do we need to notify the login-success event.
       if (this._runningRequest.hasOwnProperty("eventId") && success) {
         let details = {
           type: kCaptivePortalLoginSuccessEvent,
-          id: this._runningRequest["eventId"],
+          id: this._runningRequest.eventId,
         };
         this._sendEvent(kCaptivePortalLoginSuccessEvent, details);
       }
 
       // Continue the following request
-      this._runningRequest["complete"] = true;
+      this._runningRequest.complete = true;
       this._removeRequest(this._runningRequest.interfaceName);
     }
   },
 
   _sendEvent: function _sendEvent(topic, details) {
     debug('sendEvent "' + JSON.stringify(details) + '"');
     Services.obs.notifyObservers(this,
                                  topic,
--- a/toolkit/components/contentprefs/nsContentPrefService.js
+++ b/toolkit/components/contentprefs/nsContentPrefService.js
@@ -386,18 +386,18 @@ ContentPrefService.prototype = {
     `);
 
     var groupNames = [];
     var groupIDs = [];
     try {
       selectGroupsStmt.params.setting = settingID;
 
       while (selectGroupsStmt.executeStep()) {
-        groupIDs.push(selectGroupsStmt.row["groupID"]);
-        groupNames.push(selectGroupsStmt.row["groupName"]);
+        groupIDs.push(selectGroupsStmt.row.groupID);
+        groupNames.push(selectGroupsStmt.row.groupName);
       }
     } finally {
       selectGroupsStmt.reset();
     }
 
     if (this.hasPref(null, aName)) {
       groupNames.push(null);
     }
@@ -597,17 +597,17 @@ ContentPrefService.prototype = {
       if (aCallback) {
         let cache = this._cache;
         new AsyncStatement(this._stmtSelectPref).execute({onResult(aResult) {
           cache.set(aGroup, aSetting, aResult);
           aCallback.onResult(aResult);
         }});
       } else {
         if (this._stmtSelectPref.executeStep()) {
-          value = this._stmtSelectPref.row["value"];
+          value = this._stmtSelectPref.row.value;
         }
         this._cache.set(aGroup, aSetting, value);
       }
     } finally {
       this._stmtSelectPref.reset();
     }
 
     return value;
@@ -644,17 +644,17 @@ ContentPrefService.prototype = {
       if (aCallback) {
         let cache = this._cache;
         new AsyncStatement(this._stmtSelectGlobalPref).execute({onResult(aResult) {
           cache.set(null, aName, aResult);
           aCallback.onResult(aResult);
         }});
       } else {
         if (this._stmtSelectGlobalPref.executeStep()) {
-          value = this._stmtSelectGlobalPref.row["value"];
+          value = this._stmtSelectGlobalPref.row.value;
         }
         this._cache.set(null, aName, value);
       }
     } finally {
       this._stmtSelectGlobalPref.reset();
     }
 
     return value;
@@ -674,17 +674,17 @@ ContentPrefService.prototype = {
 
   _selectGroupID: function ContentPrefService__selectGroupID(aName) {
     var id;
 
     try {
       this._stmtSelectGroupID.params.name = aName;
 
       if (this._stmtSelectGroupID.executeStep())
-        id = this._stmtSelectGroupID.row["id"];
+        id = this._stmtSelectGroupID.row.id;
     } finally {
       this._stmtSelectGroupID.reset();
     }
 
     return id;
   },
 
   __stmtInsertGroup: null,
@@ -715,17 +715,17 @@ ContentPrefService.prototype = {
 
   _selectSettingID: function ContentPrefService__selectSettingID(aName) {
     var id;
 
     try {
       this._stmtSelectSettingID.params.name = aName;
 
       if (this._stmtSelectSettingID.executeStep())
-        id = this._stmtSelectSettingID.row["id"];
+        id = this._stmtSelectSettingID.row.id;
     } finally {
       this._stmtSelectSettingID.reset();
     }
 
     return id;
   },
 
   __stmtInsertSetting: null,
@@ -757,17 +757,17 @@ ContentPrefService.prototype = {
   _selectPrefID: function ContentPrefService__selectPrefID(aGroupID, aSettingID) {
     var id;
 
     try {
       this._stmtSelectPrefID.params.groupID = aGroupID;
       this._stmtSelectPrefID.params.settingID = aSettingID;
 
       if (this._stmtSelectPrefID.executeStep())
-        id = this._stmtSelectPrefID.row["id"];
+        id = this._stmtSelectPrefID.row.id;
     } finally {
       this._stmtSelectPrefID.reset();
     }
 
     return id;
   },
 
   __stmtSelectGlobalPrefID: null,
@@ -782,17 +782,17 @@ ContentPrefService.prototype = {
 
   _selectGlobalPrefID: function ContentPrefService__selectGlobalPrefID(aSettingID) {
     var id;
 
     try {
       this._stmtSelectGlobalPrefID.params.settingID = aSettingID;
 
       if (this._stmtSelectGlobalPrefID.executeStep())
-        id = this._stmtSelectGlobalPrefID.row["id"];
+        id = this._stmtSelectGlobalPrefID.row.id;
     } finally {
       this._stmtSelectGlobalPrefID.reset();
     }
 
     return id;
   },
 
   __stmtInsertPref: null,
@@ -894,18 +894,18 @@ ContentPrefService.prototype = {
   _selectPrefs: function ContentPrefService__selectPrefs(aGroup) {
     var prefs = Cc["@mozilla.org/hash-property-bag;1"].
                 createInstance(Ci.nsIWritablePropertyBag);
 
     try {
       this._stmtSelectPrefs.params.group = aGroup;
 
       while (this._stmtSelectPrefs.executeStep())
-        prefs.setProperty(this._stmtSelectPrefs.row["name"],
-                          this._stmtSelectPrefs.row["value"]);
+        prefs.setProperty(this._stmtSelectPrefs.row.name,
+                          this._stmtSelectPrefs.row.value);
     } finally {
       this._stmtSelectPrefs.reset();
     }
 
     return prefs;
   },
 
   __stmtSelectGlobalPrefs: null,
@@ -922,18 +922,18 @@ ContentPrefService.prototype = {
   },
 
   _selectGlobalPrefs: function ContentPrefService__selectGlobalPrefs() {
     var prefs = Cc["@mozilla.org/hash-property-bag;1"].
                 createInstance(Ci.nsIWritablePropertyBag);
 
     try {
       while (this._stmtSelectGlobalPrefs.executeStep())
-        prefs.setProperty(this._stmtSelectGlobalPrefs.row["name"],
-                          this._stmtSelectGlobalPrefs.row["value"]);
+        prefs.setProperty(this._stmtSelectGlobalPrefs.row.name,
+                          this._stmtSelectGlobalPrefs.row.value);
     } finally {
       this._stmtSelectGlobalPrefs.reset();
     }
 
     return prefs;
   },
 
   __stmtSelectPrefsByName: null,
@@ -953,18 +953,18 @@ ContentPrefService.prototype = {
   _selectPrefsByName: function ContentPrefService__selectPrefsByName(aName) {
     var prefs = Cc["@mozilla.org/hash-property-bag;1"].
                 createInstance(Ci.nsIWritablePropertyBag);
 
     try {
       this._stmtSelectPrefsByName.params.setting = aName;
 
       while (this._stmtSelectPrefsByName.executeStep())
-        prefs.setProperty(this._stmtSelectPrefsByName.row["groupName"],
-                          this._stmtSelectPrefsByName.row["value"]);
+        prefs.setProperty(this._stmtSelectPrefsByName.row.groupName,
+                          this._stmtSelectPrefsByName.row.value);
     } finally {
       this._stmtSelectPrefsByName.reset();
     }
 
     var global = this._selectGlobalPref(aName);
     if (typeof global != "undefined") {
       prefs.setProperty(null, global);
     }
--- a/toolkit/components/extensions/.eslintrc.js
+++ b/toolkit/components/extensions/.eslintrc.js
@@ -115,19 +115,16 @@ module.exports = {
 
     // Don't require a default case in switch statements. Avoid being forced to
     // add a bogus default when you know all possible cases are handled.
     "default-case": "off",
 
     // Enforce dots on the next line with property name.
     "dot-location": ["error", "property"],
 
-    // Encourage the use of dot notation whenever possible.
-    "dot-notation": "error",
-
     // Allow using == instead of ===, in the interest of landing something since
     // the devtools codebase is split on convention here.
     "eqeqeq": "off",
 
     // Don't require function expressions to have a name.
     // This makes the code more verbose and hard to read. Our engine already
     // does a fantastic job assigning a name to the function, which includes
     // the enclosing function name, and worst case you have a line number that
--- a/toolkit/components/narrate/.eslintrc.js
+++ b/toolkit/components/narrate/.eslintrc.js
@@ -6,17 +6,16 @@ module.exports = {
     "mozilla/reject-importGlobalProperties": "warn",
     "mozilla/var-only-at-top-level": "warn",
     "block-scoped-var": "error",
     "camelcase": "warn",
     "comma-dangle": "off",
     "complexity": ["error", {"max": 20}],
     "curly": "error",
     "dot-location": ["warn", "property"],
-    "dot-notation": "error",
     "generator-star-spacing": ["warn", "after"],
     "indent": ["warn", 2, {"SwitchCase": 1}],
     "max-len": ["warn", 80, 2, {"ignoreUrls": true}],
     "max-nested-callbacks": ["error", 3],
     "new-cap": ["error", {"capIsNew": false}],
     "new-parens": "error",
     "no-extend-native": "error",
     "no-fallthrough": "error",
--- a/toolkit/components/passwordmgr/storage-mozStorage.js
+++ b/toolkit/components/passwordmgr/storage-mozStorage.js
@@ -706,31 +706,31 @@ LoginManagerStorage_mozStorage.prototype
    */
   _buildConditionsAndParams(hostname, formSubmitURL, httpRealm) {
     let conditions = [], params = {};
 
     if (hostname == null) {
       conditions.push("hostname isnull");
     } else if (hostname != "") {
       conditions.push("hostname = :hostname");
-      params["hostname"] = hostname;
+      params.hostname = hostname;
     }
 
     if (formSubmitURL == null) {
       conditions.push("formSubmitURL isnull");
     } else if (formSubmitURL != "") {
       conditions.push("formSubmitURL = :formSubmitURL OR formSubmitURL = ''");
-      params["formSubmitURL"] = formSubmitURL;
+      params.formSubmitURL = formSubmitURL;
     }
 
     if (httpRealm == null) {
       conditions.push("httpRealm isnull");
     } else if (httpRealm != "") {
       conditions.push("httpRealm = :httpRealm");
-      params["httpRealm"] = httpRealm;
+      params.httpRealm = httpRealm;
     }
 
     return [conditions, params];
   },
 
 
   /**
    * Checks to see if the specified GUID already exists.
--- a/toolkit/components/passwordmgr/test/unit/test_context_menu.js
+++ b/toolkit/components/passwordmgr/test/unit/test_context_menu.js
@@ -127,17 +127,17 @@ function checkLoginItems(logins, items) 
   }
   return true;
 }
 
 /**
  * Gets the list of expected logins for a hostname.
  */
 function getExpectedLogins(hostname) {
-  return Services.logins.getAllLogins().filter(entry => entry["hostname"] === hostname);
+  return Services.logins.getAllLogins().filter(entry => entry.hostname === hostname);
 }
 
 function loginList() {
   return [
       new LoginInfo("http://www.example.com", "http://www.example.com", null,
                     "username1", "password",
                     "form_field_username", "form_field_password"),
 
--- a/toolkit/components/payments/.eslintrc.js
+++ b/toolkit/components/payments/.eslintrc.js
@@ -9,17 +9,16 @@ module.exports = {
     "array-bracket-spacing": ["error", "never"],
     "block-scoped-var": "error",
     "comma-dangle": ["error", "always-multiline"],
     complexity: ["error", {
       max: 20,
     }],
     curly: ["error", "all"],
     "dot-location": ["error", "property"],
-    "dot-notation": "error",
     "generator-star-spacing": ["error", "after"],
     indent: ["error", 2, {
       SwitchCase: 1,
       CallExpression: {
         arguments: "first",
       },
       FunctionExpression: {
         parameters: "first",
--- a/toolkit/components/places/PlacesDBUtils.jsm
+++ b/toolkit/components/places/PlacesDBUtils.jsm
@@ -311,93 +311,93 @@ this.PlacesDBUtils = {
     // Bookmarks roots
     // C.1 fix missing Places root
     //     Bug 477739 shows a case where the root could be wrongly removed
     //     due to an endianness issue.  We try to fix broken roots here.
     let selectPlacesRoot = {
       query: "SELECT id FROM moz_bookmarks WHERE id = :places_root",
       params: {}
     };
-    selectPlacesRoot.params["places_root"] = PlacesUtils.placesRootId;
+    selectPlacesRoot.params.places_root = PlacesUtils.placesRootId;
     let db = await PlacesUtils.promiseDBConnection();
     let rows = await db.execute(selectPlacesRoot.query, selectPlacesRoot.params);
     if (rows.length === 0) {
       // We are missing the root, try to recreate it.
       let createPlacesRoot = {
         query:
         `INSERT INTO moz_bookmarks (id, type, fk, parent, position, title, guid)
            VALUES (:places_root, 2, NULL, 0, 0, :title, :guid)`,
         params: {}
       };
-      createPlacesRoot.params["places_root"] = PlacesUtils.placesRootId;
-      createPlacesRoot.params["title"] = "";
-      createPlacesRoot.params["guid"] = PlacesUtils.bookmarks.rootGuid;
+      createPlacesRoot.params.places_root = PlacesUtils.placesRootId;
+      createPlacesRoot.params.title = "";
+      createPlacesRoot.params.guid = PlacesUtils.bookmarks.rootGuid;
       cleanupStatements.push(createPlacesRoot);
 
       // Now ensure that other roots are children of Places root.
       let fixPlacesRootChildren = {
         query:
         `UPDATE moz_bookmarks SET parent = :places_root WHERE guid IN
              ( :menuGuid, :toolbarGuid, :unfiledGuid, :tagsGuid )`,
         params: {}
       };
-      fixPlacesRootChildren.params["places_root"] = PlacesUtils.placesRootId;
-      fixPlacesRootChildren.params["menuGuid"] = PlacesUtils.bookmarks.menuGuid;
-      fixPlacesRootChildren.params["toolbarGuid"] = PlacesUtils.bookmarks.toolbarGuid;
-      fixPlacesRootChildren.params["unfiledGuid"] = PlacesUtils.bookmarks.unfiledGuid;
-      fixPlacesRootChildren.params["tagsGuid"] = PlacesUtils.bookmarks.tagsGuid;
+      fixPlacesRootChildren.params.places_root = PlacesUtils.placesRootId;
+      fixPlacesRootChildren.params.menuGuid = PlacesUtils.bookmarks.menuGuid;
+      fixPlacesRootChildren.params.toolbarGuid = PlacesUtils.bookmarks.toolbarGuid;
+      fixPlacesRootChildren.params.unfiledGuid = PlacesUtils.bookmarks.unfiledGuid;
+      fixPlacesRootChildren.params.tagsGuid = PlacesUtils.bookmarks.tagsGuid;
       cleanupStatements.push(fixPlacesRootChildren);
     }
     // C.2 fix roots titles
     //     some alpha version has wrong roots title, and this also fixes them if
     //     locale has changed.
     let updateRootTitleSql = `UPDATE moz_bookmarks SET title = :title
                               WHERE id = :root_id AND title <> :title`;
     // root
     let fixPlacesRootTitle = {
       query: updateRootTitleSql,
       params: {}
     };
-    fixPlacesRootTitle.params["root_id"] = PlacesUtils.placesRootId;
-    fixPlacesRootTitle.params["title"] = "";
+    fixPlacesRootTitle.params.root_id = PlacesUtils.placesRootId;
+    fixPlacesRootTitle.params.title = "";
     cleanupStatements.push(fixPlacesRootTitle);
     // bookmarks menu
     let fixBookmarksMenuTitle = {
       query: updateRootTitleSql,
       params: {}
     };
-    fixBookmarksMenuTitle.params["root_id"] = PlacesUtils.bookmarksMenuFolderId;
-    fixBookmarksMenuTitle.params["title"] =
+    fixBookmarksMenuTitle.params.root_id = PlacesUtils.bookmarksMenuFolderId;
+    fixBookmarksMenuTitle.params.title =
       PlacesUtils.getString("BookmarksMenuFolderTitle");
     cleanupStatements.push(fixBookmarksMenuTitle);
     // bookmarks toolbar
     let fixBookmarksToolbarTitle = {
       query: updateRootTitleSql,
       params: {}
     };
-    fixBookmarksToolbarTitle.params["root_id"] = PlacesUtils.toolbarFolderId;
-    fixBookmarksToolbarTitle.params["title"] =
+    fixBookmarksToolbarTitle.params.root_id = PlacesUtils.toolbarFolderId;
+    fixBookmarksToolbarTitle.params.title =
       PlacesUtils.getString("BookmarksToolbarFolderTitle");
     cleanupStatements.push(fixBookmarksToolbarTitle);
     // unsorted bookmarks
     let fixUnsortedBookmarksTitle = {
       query: updateRootTitleSql,
       params: {}
     };
-    fixUnsortedBookmarksTitle.params["root_id"] = PlacesUtils.unfiledBookmarksFolderId;
-    fixUnsortedBookmarksTitle.params["title"] =
+    fixUnsortedBookmarksTitle.params.root_id = PlacesUtils.unfiledBookmarksFolderId;
+    fixUnsortedBookmarksTitle.params.title =
       PlacesUtils.getString("OtherBookmarksFolderTitle");
     cleanupStatements.push(fixUnsortedBookmarksTitle);
     // tags
     let fixTagsRootTitle = {
       query: updateRootTitleSql,
       params: {}
     };
-    fixTagsRootTitle.params["root_id"] = PlacesUtils.tagsFolderId;
-    fixTagsRootTitle.params["title"] =
+    fixTagsRootTitle.params.root_id = PlacesUtils.tagsFolderId;
+    fixTagsRootTitle.params.title =
       PlacesUtils.getString("TagsFolderTitle");
     cleanupStatements.push(fixTagsRootTitle);
 
     // MOZ_BOOKMARKS
     // D.1 remove items without a valid place
     // if fk IS NULL we fix them in D.7
     let deleteNoPlaceItems = {
       query:
@@ -405,86 +405,86 @@ this.PlacesDBUtils = {
          :rootGuid, :menuGuid, :toolbarGuid, :unfiledGuid, :tagsGuid  /* skip roots */
        ) AND id IN (
          SELECT b.id FROM moz_bookmarks b
          WHERE fk NOT NULL AND b.type = :bookmark_type
            AND NOT EXISTS (SELECT url FROM moz_places WHERE id = b.fk LIMIT 1)
        )`,
       params: {}
     };
-    deleteNoPlaceItems.params["bookmark_type"] = PlacesUtils.bookmarks.TYPE_BOOKMARK;
-    deleteNoPlaceItems.params["rootGuid"] = PlacesUtils.bookmarks.rootGuid;
-    deleteNoPlaceItems.params["menuGuid"] = PlacesUtils.bookmarks.menuGuid;
-    deleteNoPlaceItems.params["toolbarGuid"] = PlacesUtils.bookmarks.toolbarGuid;
-    deleteNoPlaceItems.params["unfiledGuid"] = PlacesUtils.bookmarks.unfiledGuid;
-    deleteNoPlaceItems.params["tagsGuid"] = PlacesUtils.bookmarks.tagsGuid;
+    deleteNoPlaceItems.params.bookmark_type = PlacesUtils.bookmarks.TYPE_BOOKMARK;
+    deleteNoPlaceItems.params.rootGuid = PlacesUtils.bookmarks.rootGuid;
+    deleteNoPlaceItems.params.menuGuid = PlacesUtils.bookmarks.menuGuid;
+    deleteNoPlaceItems.params.toolbarGuid = PlacesUtils.bookmarks.toolbarGuid;
+    deleteNoPlaceItems.params.unfiledGuid = PlacesUtils.bookmarks.unfiledGuid;
+    deleteNoPlaceItems.params.tagsGuid = PlacesUtils.bookmarks.tagsGuid;
     cleanupStatements.push(deleteNoPlaceItems);
 
     // D.2 remove items that are not uri bookmarks from tag containers
     let deleteBogusTagChildren = {
       query:
       `DELETE FROM moz_bookmarks WHERE guid NOT IN (
          :rootGuid, :menuGuid, :toolbarGuid, :unfiledGuid, :tagsGuid  /* skip roots */
        ) AND id IN (
          SELECT b.id FROM moz_bookmarks b
          WHERE b.parent IN
            (SELECT id FROM moz_bookmarks WHERE parent = :tags_folder)
            AND b.type <> :bookmark_type
        )`,
       params: {}
     };
-    deleteBogusTagChildren.params["tags_folder"] = PlacesUtils.tagsFolderId;
-    deleteBogusTagChildren.params["bookmark_type"] = PlacesUtils.bookmarks.TYPE_BOOKMARK;
-    deleteBogusTagChildren.params["rootGuid"] = PlacesUtils.bookmarks.rootGuid;
-    deleteBogusTagChildren.params["menuGuid"] = PlacesUtils.bookmarks.menuGuid;
-    deleteBogusTagChildren.params["toolbarGuid"] = PlacesUtils.bookmarks.toolbarGuid;
-    deleteBogusTagChildren.params["unfiledGuid"] = PlacesUtils.bookmarks.unfiledGuid;
-    deleteBogusTagChildren.params["tagsGuid"] = PlacesUtils.bookmarks.tagsGuid;
+    deleteBogusTagChildren.params.tags_folder = PlacesUtils.tagsFolderId;
+    deleteBogusTagChildren.params.bookmark_type = PlacesUtils.bookmarks.TYPE_BOOKMARK;
+    deleteBogusTagChildren.params.rootGuid = PlacesUtils.bookmarks.rootGuid;
+    deleteBogusTagChildren.params.menuGuid = PlacesUtils.bookmarks.menuGuid;
+    deleteBogusTagChildren.params.toolbarGuid = PlacesUtils.bookmarks.toolbarGuid;
+    deleteBogusTagChildren.params.unfiledGuid = PlacesUtils.bookmarks.unfiledGuid;
+    deleteBogusTagChildren.params.tagsGuid = PlacesUtils.bookmarks.tagsGuid;
     cleanupStatements.push(deleteBogusTagChildren);
 
     // D.3 remove empty tags
     let deleteEmptyTags = {
       query:
       `DELETE FROM moz_bookmarks WHERE guid NOT IN (
          :rootGuid, :menuGuid, :toolbarGuid, :unfiledGuid, :tagsGuid  /* skip roots */
        ) AND id IN (
          SELECT b.id FROM moz_bookmarks b
          WHERE b.id IN
            (SELECT id FROM moz_bookmarks WHERE parent = :tags_folder)
            AND NOT EXISTS
              (SELECT id from moz_bookmarks WHERE parent = b.id LIMIT 1)
        )`,
       params: {}
     };
-    deleteEmptyTags.params["tags_folder"] = PlacesUtils.tagsFolderId;
-    deleteEmptyTags.params["rootGuid"] = PlacesUtils.bookmarks.rootGuid;
-    deleteEmptyTags.params["menuGuid"] = PlacesUtils.bookmarks.menuGuid;
-    deleteEmptyTags.params["toolbarGuid"] = PlacesUtils.bookmarks.toolbarGuid;
-    deleteEmptyTags.params["unfiledGuid"] = PlacesUtils.bookmarks.unfiledGuid;
-    deleteEmptyTags.params["tagsGuid"] = PlacesUtils.bookmarks.tagsGuid;
+    deleteEmptyTags.params.tags_folder = PlacesUtils.tagsFolderId;
+    deleteEmptyTags.params.rootGuid = PlacesUtils.bookmarks.rootGuid;
+    deleteEmptyTags.params.menuGuid = PlacesUtils.bookmarks.menuGuid;
+    deleteEmptyTags.params.toolbarGuid = PlacesUtils.bookmarks.toolbarGuid;
+    deleteEmptyTags.params.unfiledGuid = PlacesUtils.bookmarks.unfiledGuid;
+    deleteEmptyTags.params.tagsGuid = PlacesUtils.bookmarks.tagsGuid;
     cleanupStatements.push(deleteEmptyTags);
 
     // D.4 move orphan items to unsorted folder
     let fixOrphanItems = {
       query:
       `UPDATE moz_bookmarks SET parent = :unsorted_folder WHERE guid NOT IN (
          :rootGuid, :menuGuid, :toolbarGuid, :unfiledGuid, :tagsGuid  /* skip roots */
        ) AND id IN (
          SELECT b.id FROM moz_bookmarks b
          WHERE NOT EXISTS
            (SELECT id FROM moz_bookmarks WHERE id = b.parent LIMIT 1)
        )`,
       params: {}
     };
-    fixOrphanItems.params["unsorted_folder"] = PlacesUtils.unfiledBookmarksFolderId;
-    fixOrphanItems.params["rootGuid"] = PlacesUtils.bookmarks.rootGuid;
-    fixOrphanItems.params["menuGuid"] = PlacesUtils.bookmarks.menuGuid;
-    fixOrphanItems.params["toolbarGuid"] = PlacesUtils.bookmarks.toolbarGuid;
-    fixOrphanItems.params["unfiledGuid"] = PlacesUtils.bookmarks.unfiledGuid;
-    fixOrphanItems.params["tagsGuid"] = PlacesUtils.bookmarks.tagsGuid;
+    fixOrphanItems.params.unsorted_folder = PlacesUtils.unfiledBookmarksFolderId;
+    fixOrphanItems.params.rootGuid = PlacesUtils.bookmarks.rootGuid;
+    fixOrphanItems.params.menuGuid = PlacesUtils.bookmarks.menuGuid;
+    fixOrphanItems.params.toolbarGuid = PlacesUtils.bookmarks.toolbarGuid;
+    fixOrphanItems.params.unfiledGuid = PlacesUtils.bookmarks.unfiledGuid;
+    fixOrphanItems.params.tagsGuid = PlacesUtils.bookmarks.tagsGuid;
     cleanupStatements.push(fixOrphanItems);
 
     // D.6 fix wrong item types
     //     Folders and separators should not have an fk.
     //     If they have a valid fk convert them to bookmarks. Later in D.9 we
     //     will move eventual children to unsorted bookmarks.
     let fixBookmarksAsFolders = {
       query:
@@ -492,47 +492,47 @@ this.PlacesDBUtils = {
          :rootGuid, :menuGuid, :toolbarGuid, :unfiledGuid, :tagsGuid  /* skip roots */
        ) AND id IN (
          SELECT id FROM moz_bookmarks b
          WHERE type IN (:folder_type, :separator_type)
            AND fk NOTNULL
        )`,
       params: {}
     };
-    fixBookmarksAsFolders.params["bookmark_type"] = PlacesUtils.bookmarks.TYPE_BOOKMARK;
-    fixBookmarksAsFolders.params["folder_type"] = PlacesUtils.bookmarks.TYPE_FOLDER;
-    fixBookmarksAsFolders.params["separator_type"] = PlacesUtils.bookmarks.TYPE_SEPARATOR;
-    fixBookmarksAsFolders.params["rootGuid"] = PlacesUtils.bookmarks.rootGuid;
-    fixBookmarksAsFolders.params["menuGuid"] = PlacesUtils.bookmarks.menuGuid;
-    fixBookmarksAsFolders.params["toolbarGuid"] = PlacesUtils.bookmarks.toolbarGuid;
-    fixBookmarksAsFolders.params["unfiledGuid"] = PlacesUtils.bookmarks.unfiledGuid;
-    fixBookmarksAsFolders.params["tagsGuid"] = PlacesUtils.bookmarks.tagsGuid;
+    fixBookmarksAsFolders.params.bookmark_type = PlacesUtils.bookmarks.TYPE_BOOKMARK;
+    fixBookmarksAsFolders.params.folder_type = PlacesUtils.bookmarks.TYPE_FOLDER;
+    fixBookmarksAsFolders.params.separator_type = PlacesUtils.bookmarks.TYPE_SEPARATOR;
+    fixBookmarksAsFolders.params.rootGuid = PlacesUtils.bookmarks.rootGuid;
+    fixBookmarksAsFolders.params.menuGuid = PlacesUtils.bookmarks.menuGuid;
+    fixBookmarksAsFolders.params.toolbarGuid = PlacesUtils.bookmarks.toolbarGuid;
+    fixBookmarksAsFolders.params.unfiledGuid = PlacesUtils.bookmarks.unfiledGuid;
+    fixBookmarksAsFolders.params.tagsGuid = PlacesUtils.bookmarks.tagsGuid;
     cleanupStatements.push(fixBookmarksAsFolders);
 
     // D.7 fix wrong item types
     //     Bookmarks should have an fk, if they don't have any, convert them to
     //     folders.
     let fixFoldersAsBookmarks = {
       query:
       `UPDATE moz_bookmarks SET type = :folder_type WHERE guid NOT IN (
          :rootGuid, :menuGuid, :toolbarGuid, :unfiledGuid, :tagsGuid  /* skip roots */
        ) AND id IN (
          SELECT id FROM moz_bookmarks b
          WHERE type = :bookmark_type
            AND fk IS NULL
        )`,
       params: {}
     };
-    fixFoldersAsBookmarks.params["bookmark_type"] = PlacesUtils.bookmarks.TYPE_BOOKMARK;
-    fixFoldersAsBookmarks.params["folder_type"] = PlacesUtils.bookmarks.TYPE_FOLDER;
-    fixFoldersAsBookmarks.params["rootGuid"] = PlacesUtils.bookmarks.rootGuid;
-    fixFoldersAsBookmarks.params["menuGuid"] = PlacesUtils.bookmarks.menuGuid;
-    fixFoldersAsBookmarks.params["toolbarGuid"] = PlacesUtils.bookmarks.toolbarGuid;
-    fixFoldersAsBookmarks.params["unfiledGuid"] = PlacesUtils.bookmarks.unfiledGuid;
-    fixFoldersAsBookmarks.params["tagsGuid"] = PlacesUtils.bookmarks.tagsGuid;
+    fixFoldersAsBookmarks.params.bookmark_type = PlacesUtils.bookmarks.TYPE_BOOKMARK;
+    fixFoldersAsBookmarks.params.folder_type = PlacesUtils.bookmarks.TYPE_FOLDER;
+    fixFoldersAsBookmarks.params.rootGuid = PlacesUtils.bookmarks.rootGuid;
+    fixFoldersAsBookmarks.params.menuGuid = PlacesUtils.bookmarks.menuGuid;
+    fixFoldersAsBookmarks.params.toolbarGuid = PlacesUtils.bookmarks.toolbarGuid;
+    fixFoldersAsBookmarks.params.unfiledGuid = PlacesUtils.bookmarks.unfiledGuid;
+    fixFoldersAsBookmarks.params.tagsGuid = PlacesUtils.bookmarks.tagsGuid;
     cleanupStatements.push(fixFoldersAsBookmarks);
 
     // D.9 fix wrong parents
     //     Items cannot have separators or other bookmarks
     //     as parent, if they have bad parent move them to unsorted bookmarks.
     let fixInvalidParents = {
       query:
       `UPDATE moz_bookmarks SET parent = :unsorted_folder WHERE guid NOT IN (
@@ -541,24 +541,24 @@ this.PlacesDBUtils = {
          SELECT id FROM moz_bookmarks b
          WHERE EXISTS
            (SELECT id FROM moz_bookmarks WHERE id = b.parent
              AND type IN (:bookmark_type, :separator_type)
              LIMIT 1)
        )`,
       params: {}
     };
-    fixInvalidParents.params["unsorted_folder"] = PlacesUtils.unfiledBookmarksFolderId;
-    fixInvalidParents.params["bookmark_type"] = PlacesUtils.bookmarks.TYPE_BOOKMARK;
-    fixInvalidParents.params["separator_type"] = PlacesUtils.bookmarks.TYPE_SEPARATOR;
-    fixInvalidParents.params["rootGuid"] = PlacesUtils.bookmarks.rootGuid;
-    fixInvalidParents.params["menuGuid"] = PlacesUtils.bookmarks.menuGuid;
-    fixInvalidParents.params["toolbarGuid"] = PlacesUtils.bookmarks.toolbarGuid;
-    fixInvalidParents.params["unfiledGuid"] = PlacesUtils.bookmarks.unfiledGuid;
-    fixInvalidParents.params["tagsGuid"] = PlacesUtils.bookmarks.tagsGuid;
+    fixInvalidParents.params.unsorted_folder = PlacesUtils.unfiledBookmarksFolderId;
+    fixInvalidParents.params.bookmark_type = PlacesUtils.bookmarks.TYPE_BOOKMARK;
+    fixInvalidParents.params.separator_type = PlacesUtils.bookmarks.TYPE_SEPARATOR;
+    fixInvalidParents.params.rootGuid = PlacesUtils.bookmarks.rootGuid;
+    fixInvalidParents.params.menuGuid = PlacesUtils.bookmarks.menuGuid;
+    fixInvalidParents.params.toolbarGuid = PlacesUtils.bookmarks.toolbarGuid;
+    fixInvalidParents.params.unfiledGuid = PlacesUtils.bookmarks.unfiledGuid;
+    fixInvalidParents.params.tagsGuid = PlacesUtils.bookmarks.tagsGuid;
     cleanupStatements.push(fixInvalidParents);
 
     // D.10 recalculate positions
     //      This requires multiple related statements.
     //      We can detect a folder with bad position values comparing the sum of
     //      all distinct position values (+1 since position is 0-based) with the
     //      triangular numbers obtained by the number of children (n).
     //      SUM(DISTINCT position + 1) == (n * (n + 1) / 2).
@@ -622,19 +622,19 @@ this.PlacesDBUtils = {
     //      replacing their title with "(notitle)".
     let fixEmptyNamedTags = {
       query:
       `UPDATE moz_bookmarks SET title = :empty_title
        WHERE length(title) = 0 AND type = :folder_type
          AND parent = :tags_folder`,
       params: {}
     };
-    fixEmptyNamedTags.params["empty_title"] = "(notitle)";
-    fixEmptyNamedTags.params["folder_type"] = PlacesUtils.bookmarks.TYPE_FOLDER;
-    fixEmptyNamedTags.params["tags_folder"] = PlacesUtils.tagsFolderId;
+    fixEmptyNamedTags.params.empty_title = "(notitle)";
+    fixEmptyNamedTags.params.folder_type = PlacesUtils.bookmarks.TYPE_FOLDER;
+    fixEmptyNamedTags.params.tags_folder = PlacesUtils.tagsFolderId;
     cleanupStatements.push(fixEmptyNamedTags);
 
     // MOZ_ICONS
     // E.1 remove orphan icon entries.
     let deleteOrphanIconPages = {
       query:
       `DELETE FROM moz_pages_w_icons WHERE page_url_hash NOT IN (
          SELECT url_hash FROM moz_places
--- a/toolkit/components/places/nsPlacesExpiration.js
+++ b/toolkit/components/places/nsPlacesExpiration.js
@@ -797,22 +797,22 @@ nsPlacesExpiration.prototype = {
   /**
    * Evaluates the real number of pages in the database and the value currently
    * used by the SQLite query planner.
    *
    * @param aCallback
    *        invoked on success, function (aPagesCount).
    */
   _getPagesStats: function PEX__getPagesStats(aCallback) {
-    if (!this._cachedStatements["LIMIT_COUNT"]) {
-      this._cachedStatements["LIMIT_COUNT"] = this._db.createAsyncStatement(
+    if (!this._cachedStatements.LIMIT_COUNT) {
+      this._cachedStatements.LIMIT_COUNT = this._db.createAsyncStatement(
         `SELECT COUNT(*) FROM moz_places`
       );
     }
-    this._cachedStatements["LIMIT_COUNT"].executeAsync({
+    this._cachedStatements.LIMIT_COUNT.executeAsync({
       _pagesCount: 0,
       handleResult(aResults) {
         let row = aResults.getNextRow();
         this._pagesCount = row.getResultByIndex(0);
       },
       handleCompletion(aReason) {
         if (aReason == Ci.mozIStorageStatementCallback.REASON_FINISHED) {
           aCallback(this._pagesCount);
--- a/toolkit/components/places/tests/unit/test_preventive_maintenance.js
+++ b/toolkit/components/places/tests/unit/test_preventive_maintenance.js
@@ -38,49 +38,49 @@ function cleanDatabase() {
   mDBConn.executeSimpleSQL("DELETE FROM moz_pages_w_icons");
   mDBConn.executeSimpleSQL("DELETE FROM moz_bookmarks WHERE id > " + defaultBookmarksMaxId);
 }
 
 function addPlace(aUrl, aFavicon) {
   let href = new URL(aUrl || "http://www.mozilla.org").href;
   let stmt = mDBConn.createStatement(
     "INSERT INTO moz_places (url, url_hash) VALUES (:url, hash(:url))");
-  stmt.params["url"] = href;
+  stmt.params.url = href;
   stmt.execute();
   stmt.finalize();
   let id = mDBConn.lastInsertRowID;
   if (aFavicon) {
     stmt = mDBConn.createStatement(
       "INSERT INTO moz_pages_w_icons (page_url, page_url_hash) VALUES (:url, hash(:url))");
-    stmt.params["url"] = href;
+    stmt.params.url = href;
     stmt.execute();
     stmt.finalize();
     stmt = mDBConn.createStatement(
       "INSERT INTO moz_icons_to_pages (page_id, icon_id) " +
       "VALUES ((SELECT id FROM moz_pages_w_icons WHERE page_url_hash = hash(:url)), :favicon)");
-    stmt.params["url"] = href;
-    stmt.params["favicon"] = aFavicon;
+    stmt.params.url = href;
+    stmt.params.favicon = aFavicon;
     stmt.execute();
     stmt.finalize();
   }
   return id;
 }
 
 function addBookmark(aPlaceId, aType, aParent, aKeywordId, aFolderType, aTitle) {
   let stmt = mDBConn.createStatement(
     `INSERT INTO moz_bookmarks (fk, type, parent, keyword_id, folder_type,
                                 title, guid)
      VALUES (:place_id, :type, :parent, :keyword_id, :folder_type, :title,
              GENERATE_GUID())`);
-  stmt.params["place_id"] = aPlaceId || null;
-  stmt.params["type"] = aType || bs.TYPE_BOOKMARK;
-  stmt.params["parent"] = aParent || bs.unfiledBookmarksFolder;
-  stmt.params["keyword_id"] = aKeywordId || null;
-  stmt.params["folder_type"] = aFolderType || null;
-  stmt.params["title"] = typeof(aTitle) == "string" ? aTitle : null;
+  stmt.params.place_id = aPlaceId || null;
+  stmt.params.type = aType || bs.TYPE_BOOKMARK;
+  stmt.params.parent = aParent || bs.unfiledBookmarksFolder;
+  stmt.params.keyword_id = aKeywordId || null;
+  stmt.params.folder_type = aFolderType || null;
+  stmt.params.title = typeof(aTitle) == "string" ? aTitle : null;
   stmt.execute();
   stmt.finalize();
   return mDBConn.lastInsertRowID;
 }
 
 // ------------------------------------------------------------------------------
 // Tests
 
@@ -97,37 +97,37 @@ tests.push({
 
   setup() {
     // Add a place to ensure place_id = 1 is valid.
     this._placeId = addPlace();
     // Add an obsolete attribute.
     let stmt = mDBConn.createStatement(
       "INSERT INTO moz_anno_attributes (name) VALUES (:anno)"
     );
-    stmt.params["anno"] = this._obsoleteWeaveAttribute;
+    stmt.params.anno = this._obsoleteWeaveAttribute;
     stmt.execute();
     stmt.finalize();
     stmt = mDBConn.createStatement(
       `INSERT INTO moz_annos (place_id, anno_attribute_id)
        VALUES (:place_id,
          (SELECT id FROM moz_anno_attributes WHERE name = :anno)
        )`
     );
-    stmt.params["place_id"] = this._placeId;
-    stmt.params["anno"] = this._obsoleteWeaveAttribute;
+    stmt.params.place_id = this._placeId;
+    stmt.params.anno = this._obsoleteWeaveAttribute;
     stmt.execute();
     stmt.finalize();
   },
 
   check() {
     // Check that the obsolete annotation has been removed.
     let stmt = mDBConn.createStatement(
       "SELECT id FROM moz_anno_attributes WHERE name = :anno"
     );
-    stmt.params["anno"] = this._obsoleteWeaveAttribute;
+    stmt.params.anno = this._obsoleteWeaveAttribute;
     do_check_false(stmt.executeStep());
     stmt.finalize();
   }
 });
 
 tests.push({
   name: "A.2",
   desc: "Remove obsolete annotations from moz_items_annos",
@@ -143,44 +143,44 @@ tests.push({
     this._placeId = addPlace();
     // Add a bookmark.
     this._bookmarkId = addBookmark(this._placeId);
     // Add an obsolete attribute.
     let stmt = mDBConn.createStatement(
       `INSERT INTO moz_anno_attributes (name)
        VALUES (:anno1), (:anno2), (:anno3)`
     );
-    stmt.params["anno1"] = this._obsoleteSyncAttribute;
-    stmt.params["anno2"] = this._obsoleteGuidAttribute;
-    stmt.params["anno3"] = this._obsoleteWeaveAttribute;
+    stmt.params.anno1 = this._obsoleteSyncAttribute;
+    stmt.params.anno2 = this._obsoleteGuidAttribute;
+    stmt.params.anno3 = this._obsoleteWeaveAttribute;
     stmt.execute();
     stmt.finalize();
     stmt = mDBConn.createStatement(
       `INSERT INTO moz_items_annos (item_id, anno_attribute_id)
        SELECT :item_id, id
        FROM moz_anno_attributes
        WHERE name IN (:anno1, :anno2, :anno3)`
     );
-    stmt.params["item_id"] = this._bookmarkId;
-    stmt.params["anno1"] = this._obsoleteSyncAttribute;
-    stmt.params["anno2"] = this._obsoleteGuidAttribute;
-    stmt.params["anno3"] = this._obsoleteWeaveAttribute;
+    stmt.params.item_id = this._bookmarkId;
+    stmt.params.anno1 = this._obsoleteSyncAttribute;
+    stmt.params.anno2 = this._obsoleteGuidAttribute;
+    stmt.params.anno3 = this._obsoleteWeaveAttribute;
     stmt.execute();
     stmt.finalize();
   },
 
   check() {
     // Check that the obsolete annotations have been removed.
     let stmt = mDBConn.createStatement(
       `SELECT id FROM moz_anno_attributes
        WHERE name IN (:anno1, :anno2, :anno3)`
     );
-    stmt.params["anno1"] = this._obsoleteSyncAttribute;
-    stmt.params["anno2"] = this._obsoleteGuidAttribute;
-    stmt.params["anno3"] = this._obsoleteWeaveAttribute;
+    stmt.params.anno1 = this._obsoleteSyncAttribute;
+    stmt.params.anno2 = this._obsoleteGuidAttribute;
+    stmt.params.anno3 = this._obsoleteWeaveAttribute;
     do_check_false(stmt.executeStep());
     stmt.finalize();
   }
 });
 
 tests.push({
   name: "A.3",
   desc: "Remove unused attributes",
@@ -193,49 +193,49 @@ tests.push({
 
   setup() {
     // Add a place to ensure place_id = 1 is valid
     this._placeId = addPlace();
     // add a bookmark
     this._bookmarkId = addBookmark(this._placeId);
     // Add a used attribute and an unused one.
     let stmt = mDBConn.createStatement("INSERT INTO moz_anno_attributes (name) VALUES (:anno)");
-    stmt.params["anno"] = this._usedPageAttribute;
+    stmt.params.anno = this._usedPageAttribute;
     stmt.execute();
     stmt.reset();
-    stmt.params["anno"] = this._usedItemAttribute;
+    stmt.params.anno = this._usedItemAttribute;
     stmt.execute();
     stmt.reset();
-    stmt.params["anno"] = this._unusedAttribute;
+    stmt.params.anno = this._unusedAttribute;
     stmt.execute();
     stmt.finalize();
 
     stmt = mDBConn.createStatement("INSERT INTO moz_annos (place_id, anno_attribute_id) VALUES(:place_id, (SELECT id FROM moz_anno_attributes WHERE name = :anno))");
-    stmt.params["place_id"] = this._placeId;
-    stmt.params["anno"] = this._usedPageAttribute;
+    stmt.params.place_id = this._placeId;
+    stmt.params.anno = this._usedPageAttribute;
     stmt.execute();
     stmt.finalize();
     stmt = mDBConn.createStatement("INSERT INTO moz_items_annos (item_id, anno_attribute_id) VALUES(:item_id, (SELECT id FROM moz_anno_attributes WHERE name = :anno))");
-    stmt.params["item_id"] = this._bookmarkId;
-    stmt.params["anno"] = this._usedItemAttribute;
+    stmt.params.item_id = this._bookmarkId;
+    stmt.params.anno = this._usedItemAttribute;
     stmt.execute();
     stmt.finalize();
   },
 
   check() {
     // Check that used attributes are still there
     let stmt = mDBConn.createStatement("SELECT id FROM moz_anno_attributes WHERE name = :anno");
-    stmt.params["anno"] = this._usedPageAttribute;
+    stmt.params.anno = this._usedPageAttribute;
     do_check_true(stmt.executeStep());
     stmt.reset();
-    stmt.params["anno"] = this._usedItemAttribute;
+    stmt.params.anno = this._usedItemAttribute;
     do_check_true(stmt.executeStep());
     stmt.reset();
     // Check that unused attribute has been removed
-    stmt.params["anno"] = this._unusedAttribute;
+    stmt.params.anno = this._unusedAttribute;
     do_check_false(stmt.executeStep());
     stmt.finalize();
   }
 });
 
 // ------------------------------------------------------------------------------
 
 tests.push({
@@ -245,40 +245,40 @@ tests.push({
   _usedPageAttribute: "usedPage",
   _placeId: null,
 
   setup() {
     // Add a place to ensure place_id = 1 is valid
     this._placeId = addPlace();
     // Add a used attribute.
     let stmt = mDBConn.createStatement("INSERT INTO moz_anno_attributes (name) VALUES (:anno)");
-    stmt.params["anno"] = this._usedPageAttribute;
+    stmt.params.anno = this._usedPageAttribute;
     stmt.execute();
     stmt.finalize();
     stmt = mDBConn.createStatement("INSERT INTO moz_annos (place_id, anno_attribute_id) VALUES(:place_id, (SELECT id FROM moz_anno_attributes WHERE name = :anno))");
-    stmt.params["place_id"] = this._placeId;
-    stmt.params["anno"] = this._usedPageAttribute;
+    stmt.params.place_id = this._placeId;
+    stmt.params.anno = this._usedPageAttribute;
     stmt.execute();
     stmt.finalize();
     // Add an annotation with a nonexistent attribute
     stmt = mDBConn.createStatement("INSERT INTO moz_annos (place_id, anno_attribute_id) VALUES(:place_id, 1337)");
-    stmt.params["place_id"] = this._placeId;
+    stmt.params.place_id = this._placeId;
     stmt.execute();
     stmt.finalize();
   },
 
   check() {
     // Check that used attribute is still there
     let stmt = mDBConn.createStatement("SELECT id FROM moz_anno_attributes WHERE name = :anno");
-    stmt.params["anno"] = this._usedPageAttribute;
+    stmt.params.anno = this._usedPageAttribute;
     do_check_true(stmt.executeStep());
     stmt.finalize();
     // check that annotation with valid attribute is still there
     stmt = mDBConn.createStatement("SELECT id FROM moz_annos WHERE anno_attribute_id = (SELECT id FROM moz_anno_attributes WHERE name = :anno)");
-    stmt.params["anno"] = this._usedPageAttribute;
+    stmt.params.anno = this._usedPageAttribute;
     do_check_true(stmt.executeStep());
     stmt.finalize();
     // Check that annotation with bogus attribute has been removed
     stmt = mDBConn.createStatement("SELECT id FROM moz_annos WHERE anno_attribute_id = 1337");
     do_check_false(stmt.executeStep());
     stmt.finalize();
   }
 });
@@ -292,40 +292,40 @@ tests.push({
   _usedPageAttribute: "usedPage",
   _placeId: null,
 
   setup() {
     // Add a place to ensure place_id = 1 is valid
     this._placeId = addPlace();
     // Add a used attribute.
     let stmt = mDBConn.createStatement("INSERT INTO moz_anno_attributes (name) VALUES (:anno)");
-    stmt.params["anno"] = this._usedPageAttribute;
+    stmt.params.anno = this._usedPageAttribute;
     stmt.execute();
     stmt.finalize();
     stmt = mDBConn.createStatement("INSERT INTO moz_annos (place_id, anno_attribute_id) VALUES(:place_id, (SELECT id FROM moz_anno_attributes WHERE name = :anno))");
-    stmt.params["place_id"] = this._placeId;
-    stmt.params["anno"] = this._usedPageAttribute;
+    stmt.params.place_id = this._placeId;
+    stmt.params.anno = this._usedPageAttribute;
     stmt.execute();
     stmt.reset();
     // Add an annotation to a nonexistent page
-    stmt.params["place_id"] = 1337;
-    stmt.params["anno"] = this._usedPageAttribute;
+    stmt.params.place_id = 1337;
+    stmt.params.anno = this._usedPageAttribute;
     stmt.execute();
     stmt.finalize();
   },
 
   check() {
     // Check that used attribute is still there
     let stmt = mDBConn.createStatement("SELECT id FROM moz_anno_attributes WHERE name = :anno");
-    stmt.params["anno"] = this._usedPageAttribute;
+    stmt.params.anno = this._usedPageAttribute;
     do_check_true(stmt.executeStep());
     stmt.finalize();
     // check that annotation with valid attribute is still there
     stmt = mDBConn.createStatement("SELECT id FROM moz_annos WHERE anno_attribute_id = (SELECT id FROM moz_anno_attributes WHERE name = :anno)");
-    stmt.params["anno"] = this._usedPageAttribute;
+    stmt.params.anno = this._usedPageAttribute;
     do_check_true(stmt.executeStep());
     stmt.finalize();
     // Check that an annotation to a nonexistent page has been removed
     stmt = mDBConn.createStatement("SELECT id FROM moz_annos WHERE place_id = 1337");
     do_check_false(stmt.executeStep());
     stmt.finalize();
   }
 });
@@ -406,21 +406,21 @@ tests.push({
     this._validItemId = addBookmark(this.placeId);
     // Insert a bookmark with an invalid place
     this._invalidItemId = addBookmark(1337);
   },
 
   check() {
     // Check that valid bookmark is still there
     let stmt = mDBConn.createStatement("SELECT id FROM moz_bookmarks WHERE id = :item_id");
-    stmt.params["item_id"] = this._validItemId;
+    stmt.params.item_id = this._validItemId;
     do_check_true(stmt.executeStep());
     stmt.reset();
     // Check that invalid bookmark has been removed
-    stmt.params["item_id"] = this._invalidItemId;
+    stmt.params.item_id = this._invalidItemId;
     do_check_false(stmt.executeStep());
     stmt.finalize();
   }
 });
 
 // ------------------------------------------------------------------------------
 
 tests.push({
@@ -444,28 +444,28 @@ tests.push({
     this._separatorId = addBookmark(null, bs.TYPE_SEPARATOR, this._tagId);
     // Insert a folder in the tag
     this._folderId = addBookmark(null, bs.TYPE_FOLDER, this._tagId);
   },
 
   check() {
     // Check that valid bookmark is still there
     let stmt = mDBConn.createStatement("SELECT id FROM moz_bookmarks WHERE type = :type AND parent = :parent");
-    stmt.params["type"] = bs.TYPE_BOOKMARK;
-    stmt.params["parent"] = this._tagId;
+    stmt.params.type = bs.TYPE_BOOKMARK;
+    stmt.params.parent = this._tagId;
     do_check_true(stmt.executeStep());
     stmt.reset();
     // Check that separator is no more there
-    stmt.params["type"] = bs.TYPE_SEPARATOR;
-    stmt.params["parent"] = this._tagId;
+    stmt.params.type = bs.TYPE_SEPARATOR;
+    stmt.params.parent = this._tagId;
     do_check_false(stmt.executeStep());
     stmt.reset();
     // Check that folder is no more there
-    stmt.params["type"] = bs.TYPE_FOLDER;
-    stmt.params["parent"] = this._tagId;
+    stmt.params.type = bs.TYPE_FOLDER;
+    stmt.params.parent = this._tagId;
     do_check_false(stmt.executeStep());
     stmt.finalize();
   }
 });
 
 // ------------------------------------------------------------------------------
 
 tests.push({
@@ -486,29 +486,29 @@ tests.push({
     this._bookmarkId = addBookmark(this._placeId, bs.TYPE_BOOKMARK, this._tagId);
     // Create another tag (empty)
     this._emptyTagId = addBookmark(null, bs.TYPE_FOLDER, bs.tagsFolder);
   },
 
   check() {
     // Check that valid bookmark is still there
     let stmt = mDBConn.createStatement("SELECT id FROM moz_bookmarks WHERE id = :id AND type = :type AND parent = :parent");
-    stmt.params["id"] = this._bookmarkId;
-    stmt.params["type"] = bs.TYPE_BOOKMARK;
-    stmt.params["parent"] = this._tagId;
+    stmt.params.id = this._bookmarkId;
+    stmt.params.type = bs.TYPE_BOOKMARK;
+    stmt.params.parent = this._tagId;
     do_check_true(stmt.executeStep());
     stmt.reset();
-    stmt.params["id"] = this._tagId;
-    stmt.params["type"] = bs.TYPE_FOLDER;
-    stmt.params["parent"] = bs.tagsFolder;
+    stmt.params.id = this._tagId;
+    stmt.params.type = bs.TYPE_FOLDER;
+    stmt.params.parent = bs.tagsFolder;
     do_check_true(stmt.executeStep());
     stmt.reset();
-    stmt.params["id"] = this._emptyTagId;
-    stmt.params["type"] = bs.TYPE_FOLDER;
-    stmt.params["parent"] = bs.tagsFolder;
+    stmt.params.id = this._emptyTagId;
+    stmt.params.type = bs.TYPE_FOLDER;
+    stmt.params.parent = bs.tagsFolder;
     do_check_false(stmt.executeStep());
     stmt.finalize();
   }
 });
 
 // ------------------------------------------------------------------------------
 
 tests.push({
@@ -532,30 +532,30 @@ tests.push({
     this._orphanFolderId = addBookmark(null, bs.TYPE_FOLDER, 8888);
     // Create a child of the last created folder
     this._bookmarkId = addBookmark(this._placeId, bs.TYPE_BOOKMARK, this._orphanFolderId);
   },
 
   check() {
     // Check that bookmarks are now children of a real folder (unsorted)
     let stmt = mDBConn.createStatement("SELECT id FROM moz_bookmarks WHERE id = :item_id AND parent = :parent");
-    stmt.params["item_id"] = this._orphanBookmarkId;
-    stmt.params["parent"] = bs.unfiledBookmarksFolder;
+    stmt.params.item_id = this._orphanBookmarkId;
+    stmt.params.parent = bs.unfiledBookmarksFolder;
     do_check_true(stmt.executeStep());
     stmt.reset();
-    stmt.params["item_id"] = this._orphanSeparatorId;
-    stmt.params["parent"] = bs.unfiledBookmarksFolder;
+    stmt.params.item_id = this._orphanSeparatorId;
+    stmt.params.parent = bs.unfiledBookmarksFolder;
     do_check_true(stmt.executeStep());
     stmt.reset();
-    stmt.params["item_id"] = this._orphanFolderId;
-    stmt.params["parent"] = bs.unfiledBookmarksFolder;
+    stmt.params.item_id = this._orphanFolderId;
+    stmt.params.parent = bs.unfiledBookmarksFolder;
     do_check_true(stmt.executeStep());
     stmt.reset();
-    stmt.params["item_id"] = this._bookmarkId;
-    stmt.params["parent"] = this._orphanFolderId;
+    stmt.params.item_id = this._bookmarkId;
+    stmt.params.parent = this._orphanFolderId;
     do_check_true(stmt.executeStep());
     stmt.finalize();
   }
 });
 
 // ------------------------------------------------------------------------------
 
 tests.push({
@@ -573,22 +573,22 @@ tests.push({
     this._separatorId = addBookmark(this._placeId, bs.TYPE_SEPARATOR);
     // Add a folder with a fk
     this._folderId = addBookmark(this._placeId, bs.TYPE_FOLDER);
   },
 
   check() {
     // Check that items with an fk have been converted to bookmarks
     let stmt = mDBConn.createStatement("SELECT id FROM moz_bookmarks WHERE id = :item_id AND type = :type");
-    stmt.params["item_id"] = this._separatorId;
-    stmt.params["type"] = bs.TYPE_BOOKMARK;
+    stmt.params.item_id = this._separatorId;
+    stmt.params.type = bs.TYPE_BOOKMARK;
     do_check_true(stmt.executeStep());
     stmt.reset();
-    stmt.params["item_id"] = this._folderId;
-    stmt.params["type"] = bs.TYPE_BOOKMARK;
+    stmt.params.item_id = this._folderId;
+    stmt.params.type = bs.TYPE_BOOKMARK;
     do_check_true(stmt.executeStep());
     stmt.finalize();
   }
 });
 
 // ------------------------------------------------------------------------------
 
 tests.push({
@@ -606,23 +606,23 @@ tests.push({
     this._validBookmarkId = addBookmark(this._placeId, bs.TYPE_BOOKMARK);
     // Add a bookmark with a null place id
     this._invalidBookmarkId = addBookmark(null, bs.TYPE_BOOKMARK);
   },
 
   check() {
     // Check valid bookmark
     let stmt = mDBConn.createStatement("SELECT id FROM moz_bookmarks WHERE id = :item_id AND type = :type");
-    stmt.params["item_id"] = this._validBookmarkId;
-    stmt.params["type"] = bs.TYPE_BOOKMARK;
+    stmt.params.item_id = this._validBookmarkId;
+    stmt.params.type = bs.TYPE_BOOKMARK;
     do_check_true(stmt.executeStep());
     stmt.reset();
     // Check invalid bookmark has been converted to a folder
-    stmt.params["item_id"] = this._invalidBookmarkId;
-    stmt.params["type"] = bs.TYPE_FOLDER;
+    stmt.params.item_id = this._invalidBookmarkId;
+    stmt.params.type = bs.TYPE_FOLDER;
     do_check_true(stmt.executeStep());
     stmt.finalize();
   }
 });
 
 // ------------------------------------------------------------------------------
 
 tests.push({
@@ -645,22 +645,22 @@ tests.push({
     // Create 3 children of these items
     this._bookmarkId1 = addBookmark(this._placeId, bs.TYPE_BOOKMARK, this._bookmarkId);
     this._bookmarkId2 = addBookmark(this._placeId, bs.TYPE_BOOKMARK, this._separatorId);
   },
 
   check() {
     // Check that bookmarks are now children of a real folder (unsorted)
     let stmt = mDBConn.createStatement("SELECT id FROM moz_bookmarks WHERE id = :item_id AND parent = :parent");
-    stmt.params["item_id"] = this._bookmarkId1;
-    stmt.params["parent"] = bs.unfiledBookmarksFolder;
+    stmt.params.item_id = this._bookmarkId1;
+    stmt.params.parent = bs.unfiledBookmarksFolder;
     do_check_true(stmt.executeStep());
     stmt.reset();
-    stmt.params["item_id"] = this._bookmarkId2;
-    stmt.params["parent"] = bs.unfiledBookmarksFolder;
+    stmt.params.item_id = this._bookmarkId2;
+    stmt.params.parent = bs.unfiledBookmarksFolder;
     do_check_true(stmt.executeStep());
     stmt.finalize();
   }
 });
 
 // ------------------------------------------------------------------------------
 
 tests.push({
@@ -692,30 +692,30 @@ tests.push({
       let stmt = mDBConn.createStatement(
         `UPDATE moz_bookmarks SET position = :rand
          WHERE id IN (
            SELECT id FROM moz_bookmarks WHERE parent = :parent
            ORDER BY RANDOM() LIMIT 1
          )`
       );
       for (let i = 0; i < (NUM_BOOKMARKS / 2); i++) {
-        stmt.params["parent"] = aParent;
-        stmt.params["rand"] = Math.round(Math.random() * (NUM_BOOKMARKS - 1));
+        stmt.params.parent = aParent;
+        stmt.params.rand = Math.round(Math.random() * (NUM_BOOKMARKS - 1));
         stmt.execute();
         stmt.reset();
       }
       stmt.finalize();
 
       // Build the expected ordered list of bookmarks.
       stmt = mDBConn.createStatement(
         `SELECT id, position
          FROM moz_bookmarks WHERE parent = :parent
          ORDER BY position ASC, ROWID ASC`
       );
-      stmt.params["parent"] = aParent;
+      stmt.params.parent = aParent;
       while (stmt.executeStep()) {
         aResultArray.push(stmt.row.id);
         print(stmt.row.id + "\t" + stmt.row.position + "\t" +
               (aResultArray.length - 1));
       }
       stmt.finalize();
     }
 
@@ -727,17 +727,17 @@ tests.push({
 
   check() {
     function check_order(aParent, aResultArray) {
       // Build the expected ordered list of bookmarks.
       let stmt = mDBConn.createStatement(
         `SELECT id, position FROM moz_bookmarks WHERE parent = :parent
          ORDER BY position ASC`
       );
-      stmt.params["parent"] = aParent;
+      stmt.params.parent = aParent;
       let pass = true;
       while (stmt.executeStep()) {
         print(stmt.row.id + "\t" + stmt.row.position);
         if (aResultArray.indexOf(stmt.row.id) != stmt.row.position) {
           pass = false;
         }
       }
       stmt.finalize();
@@ -775,29 +775,29 @@ tests.push({
     this._titledFolderId = addBookmark(null, bs.TYPE_FOLDER, bs.toolbarFolder, null, null, "titledFolder");
   },
 
   check() {
     // Check that valid bookmark is still there
     let stmt = mDBConn.createStatement(
       "SELECT title FROM moz_bookmarks WHERE id = :id"
     );
-    stmt.params["id"] = this._untitledTagId;
+    stmt.params.id = this._untitledTagId;
     do_check_true(stmt.executeStep());
     do_check_eq(stmt.row.title, "(notitle)");
     stmt.reset();
-    stmt.params["id"] = this._untitledFolderId;
+    stmt.params.id = this._untitledFolderId;
     do_check_true(stmt.executeStep());
     do_check_eq(stmt.row.title, "");
     stmt.reset();
-    stmt.params["id"] = this._titledTagId;
+    stmt.params.id = this._titledTagId;
     do_check_true(stmt.executeStep());
     do_check_eq(stmt.row.title, "titledTag");
     stmt.reset();
-    stmt.params["id"] = this._titledFolderId;
+    stmt.params.id = this._titledFolderId;
     do_check_true(stmt.executeStep());
     do_check_eq(stmt.row.title, "titledFolder");
     stmt.finalize();
   }
 });
 
 // ------------------------------------------------------------------------------
 
@@ -805,48 +805,48 @@ tests.push({
   name: "E.1",
   desc: "Remove orphan icon entries",
 
   _placeId: null,
 
   setup() {
     // Insert favicon entries
     let stmt = mDBConn.createStatement("INSERT INTO moz_icons (id, icon_url, fixed_icon_url_hash) VALUES(:favicon_id, :url, hash(fixup_url(:url)))");
-    stmt.params["favicon_id"] = 1;
-    stmt.params["url"] = "http://www1.mozilla.org/favicon.ico";
+    stmt.params.favicon_id = 1;
+    stmt.params.url = "http://www1.mozilla.org/favicon.ico";
     stmt.execute();
     stmt.reset();
-    stmt.params["favicon_id"] = 2;
-    stmt.params["url"] = "http://www2.mozilla.org/favicon.ico";
+    stmt.params.favicon_id = 2;
+    stmt.params.url = "http://www2.mozilla.org/favicon.ico";
     stmt.execute();
     stmt.finalize();
     // Insert orphan page.
     stmt = mDBConn.createStatement("INSERT INTO moz_pages_w_icons (id, page_url, page_url_hash) VALUES(:page_id, :url, hash(:url))");
-    stmt.params["page_id"] = 99;
-    stmt.params["url"] = "http://w99.mozilla.org/";
+    stmt.params.page_id = 99;
+    stmt.params.url = "http://w99.mozilla.org/";
     stmt.execute();
     stmt.finalize();
 
     // Insert a place using the existing favicon entry
     this._placeId = addPlace("http://www.mozilla.org", 1);
   },
 
   check() {
     // Check that used icon is still there
     let stmt = mDBConn.createStatement("SELECT id FROM moz_icons WHERE id = :favicon_id");
-    stmt.params["favicon_id"] = 1;
+    stmt.params.favicon_id = 1;
     do_check_true(stmt.executeStep());
     stmt.reset();
     // Check that unused icon has been removed
-    stmt.params["favicon_id"] = 2;
+    stmt.params.favicon_id = 2;
     do_check_false(stmt.executeStep());
     stmt.finalize();
     // Check that the orphan page is gone.
     stmt = mDBConn.createStatement("SELECT id FROM moz_pages_w_icons WHERE id = :page_id");
-    stmt.params["page_id"] = 99;
+    stmt.params.page_id = 99;
     do_check_false(stmt.executeStep());
     stmt.finalize();
   }
 });
 
 // ------------------------------------------------------------------------------
 
 tests.push({
@@ -856,32 +856,32 @@ tests.push({
   _placeId: null,
   _invalidPlaceId: 1337,
 
   setup() {
     // Add a place to ensure place_id = 1 is valid
     this._placeId = addPlace();
     // Add a valid visit and an invalid one
     let stmt = mDBConn.createStatement("INSERT INTO moz_historyvisits(place_id) VALUES (:place_id)");
-    stmt.params["place_id"] = this._placeId;
+    stmt.params.place_id = this._placeId;
     stmt.execute();
     stmt.reset();
-    stmt.params["place_id"] = this._invalidPlaceId;
+    stmt.params.place_id = this._invalidPlaceId;
     stmt.execute();
     stmt.finalize();
   },
 
   check() {
     // Check that valid visit is still there
     let stmt = mDBConn.createStatement("SELECT id FROM moz_historyvisits WHERE place_id = :place_id");
-    stmt.params["place_id"] = this._placeId;
+    stmt.params.place_id = this._placeId;
     do_check_true(stmt.executeStep());
     stmt.reset();
     // Check that invalid visit has been removed
-    stmt.params["place_id"] = this._invalidPlaceId;
+    stmt.params.place_id = this._invalidPlaceId;
     do_check_false(stmt.executeStep());
     stmt.finalize();
   }
 });
 
 // ------------------------------------------------------------------------------
 
 tests.push({
@@ -891,34 +891,34 @@ tests.push({
   _placeId: null,
   _invalidPlaceId: 1337,
 
   setup() {
     // Add a place to ensure place_id = 1 is valid
     this._placeId = addPlace();
     // Add input history entries
     let stmt = mDBConn.createStatement("INSERT INTO moz_inputhistory (place_id, input) VALUES (:place_id, :input)");
-    stmt.params["place_id"] = this._placeId;
-    stmt.params["input"] = "moz";
+    stmt.params.place_id = this._placeId;
+    stmt.params.input = "moz";
     stmt.execute();
     stmt.reset();
-    stmt.params["place_id"] = this._invalidPlaceId;
-    stmt.params["input"] = "moz";
+    stmt.params.place_id = this._invalidPlaceId;
+    stmt.params.input = "moz";
     stmt.execute();
     stmt.finalize();
   },
 
   check() {
     // Check that inputhistory on valid place is still there
     let stmt = mDBConn.createStatement("SELECT place_id FROM moz_inputhistory WHERE place_id = :place_id");
-    stmt.params["place_id"] = this._placeId;
+    stmt.params.place_id = this._placeId;
     do_check_true(stmt.executeStep());
     stmt.reset();
     // Check that inputhistory on invalid place has gone
-    stmt.params["place_id"] = this._invalidPlaceId;
+    stmt.params.place_id = this._invalidPlaceId;
     do_check_false(stmt.executeStep());
     stmt.finalize();
   }
 });
 
 // ------------------------------------------------------------------------------
 
 tests.push({
@@ -931,40 +931,40 @@ tests.push({
 
   setup() {
     // Add a place to ensure place_id = 1 is valid
     this._placeId = addPlace();
     // Insert a bookmark
     this._bookmarkId = addBookmark(this._placeId);
     // Add a used attribute.
     let stmt = mDBConn.createStatement("INSERT INTO moz_anno_attributes (name) VALUES (:anno)");
-    stmt.params["anno"] = this._usedItemAttribute;
+    stmt.params.anno = this._usedItemAttribute;
     stmt.execute();
     stmt.finalize();
     stmt = mDBConn.createStatement("INSERT INTO moz_items_annos (item_id, anno_attribute_id) VALUES(:item_id, (SELECT id FROM moz_anno_attributes WHERE name = :anno))");
-    stmt.params["item_id"] = this._bookmarkId;
-    stmt.params["anno"] = this._usedItemAttribute;
+    stmt.params.item_id = this._bookmarkId;
+    stmt.params.anno = this._usedItemAttribute;
     stmt.execute();
     stmt.finalize();
     // Add an annotation with a nonexistent attribute
     stmt = mDBConn.createStatement("INSERT INTO moz_items_annos (item_id, anno_attribute_id) VALUES(:item_id, 1337)");
-    stmt.params["item_id"] = this._bookmarkId;
+    stmt.params.item_id = this._bookmarkId;
     stmt.execute();
     stmt.finalize();
   },
 
   check() {
     // Check that used attribute is still there
     let stmt = mDBConn.createStatement("SELECT id FROM moz_anno_attributes WHERE name = :anno");
-    stmt.params["anno"] = this._usedItemAttribute;
+    stmt.params.anno = this._usedItemAttribute;
     do_check_true(stmt.executeStep());
     stmt.finalize();
     // check that annotation with valid attribute is still there
     stmt = mDBConn.createStatement("SELECT id FROM moz_items_annos WHERE anno_attribute_id = (SELECT id FROM moz_anno_attributes WHERE name = :anno)");
-    stmt.params["anno"] = this._usedItemAttribute;
+    stmt.params.anno = this._usedItemAttribute;
     do_check_true(stmt.executeStep());
     stmt.finalize();
     // Check that annotation with bogus attribute has been removed
     stmt = mDBConn.createStatement("SELECT id FROM moz_items_annos WHERE anno_attribute_id = 1337");
     do_check_false(stmt.executeStep());
     stmt.finalize();
   }
 });
@@ -982,40 +982,40 @@ tests.push({
 
   setup() {
     // Add a place to ensure place_id = 1 is valid
     this._placeId = addPlace();
     // Insert a bookmark
     this._bookmarkId = addBookmark(this._placeId);
     // Add a used attribute.
     let stmt = mDBConn.createStatement("INSERT INTO moz_anno_attributes (name) VALUES (:anno)");
-    stmt.params["anno"] = this._usedItemAttribute;
+    stmt.params.anno = this._usedItemAttribute;
     stmt.execute();
     stmt.finalize();
     stmt = mDBConn.createStatement("INSERT INTO moz_items_annos (item_id, anno_attribute_id) VALUES (:item_id, (SELECT id FROM moz_anno_attributes WHERE name = :anno))");
-    stmt.params["item_id"] = this._bookmarkId;
-    stmt.params["anno"] = this._usedItemAttribute;
+    stmt.params.item_id = this._bookmarkId;
+    stmt.params.anno = this._usedItemAttribute;
     stmt.execute();
     stmt.reset();
     // Add an annotation to a nonexistent item
-    stmt.params["item_id"] = this._invalidBookmarkId;
-    stmt.params["anno"] = this._usedItemAttribute;
+    stmt.params.item_id = this._invalidBookmarkId;
+    stmt.params.anno = this._usedItemAttribute;
     stmt.execute();
     stmt.finalize();
   },
 
   check() {
     // Check that used attribute is still there
     let stmt = mDBConn.createStatement("SELECT id FROM moz_anno_attributes WHERE name = :anno");
-    stmt.params["anno"] = this._usedItemAttribute;
+    stmt.params.anno = this._usedItemAttribute;
     do_check_true(stmt.executeStep());
     stmt.finalize();
     // check that annotation with valid attribute is still there
     stmt = mDBConn.createStatement("SELECT id FROM moz_items_annos WHERE anno_attribute_id = (SELECT id FROM moz_anno_attributes WHERE name = :anno)");
-    stmt.params["anno"] = this._usedItemAttribute;
+    stmt.params.anno = this._usedItemAttribute;
     do_check_true(stmt.executeStep());
     stmt.finalize();
     // Check that an annotation to a nonexistent page has been removed
     stmt = mDBConn.createStatement("SELECT id FROM moz_items_annos WHERE item_id = 8888");
     do_check_false(stmt.executeStep());
     stmt.finalize();
   }
 });
@@ -1028,28 +1028,28 @@ tests.push({
   desc: "Remove unused keywords",
 
   _bookmarkId: null,
   _placeId: null,
 
   setup() {
     // Insert 2 keywords
     let stmt = mDBConn.createStatement("INSERT INTO moz_keywords (id, keyword, place_id) VALUES(:id, :keyword, :place_id)");
-    stmt.params["id"] = 1;
-    stmt.params["keyword"] = "unused";
-    stmt.params["place_id"] = 100;
+    stmt.params.id = 1;
+    stmt.params.keyword = "unused";
+    stmt.params.place_id = 100;
     stmt.execute();
     stmt.finalize();
   },
 
   check() {
     // Check that "used" keyword is still there
     let stmt = mDBConn.createStatement("SELECT id FROM moz_keywords WHERE keyword = :keyword");
     // Check that "unused" keyword has gone
-    stmt.params["keyword"] = "unused";
+    stmt.params.keyword = "unused";
     do_check_false(stmt.executeStep());
     stmt.finalize();
   }
 });
 
 // ------------------------------------------------------------------------------
 
 tests.push({
--- a/toolkit/components/reader/ReaderMode.jsm
+++ b/toolkit/components/reader/ReaderMode.jsm
@@ -29,17 +29,17 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 XPCOMUtils.defineLazyModuleGetter(this, "ReaderWorker", "resource://gre/modules/reader/ReaderWorker.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "TelemetryStopwatch", "resource://gre/modules/TelemetryStopwatch.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "LanguageDetector", "resource:///modules/translation/LanguageDetector.jsm");
 
 XPCOMUtils.defineLazyGetter(this, "Readability", function() {
   let scope = {};
   scope.dump = this.dump;
   Services.scriptloader.loadSubScript("resource://gre/modules/reader/Readability.js", scope);
-  return scope["Readability"];
+  return scope.Readability;
 });
 
 const gIsFirefoxDesktop = Services.appinfo.ID == "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}";
 
 this.ReaderMode = {
   // Version of the cache schema.
   CACHE_VERSION: 1,
 
--- a/toolkit/components/satchel/.eslintrc.js
+++ b/toolkit/components/satchel/.eslintrc.js
@@ -9,17 +9,16 @@ module.exports = {
     "array-bracket-spacing": ["error", "never"],
     "block-scoped-var": "error",
     "comma-dangle": ["error", "always-multiline"],
     complexity: ["error", {
       max: 20,
     }],
     curly: ["error", "all"],
     "dot-location": ["error", "property"],
-    "dot-notation": "error",
     "generator-star-spacing": ["error", "after"],
     indent: ["error", 2, {
       SwitchCase: 1,
       CallExpression: {
         arguments: "first",
       },
       FunctionExpression: {
         parameters: "first",
--- a/toolkit/components/search/nsSearchService.js
+++ b/toolkit/components/search/nsSearchService.js
@@ -2191,17 +2191,17 @@ Engine.prototype = {
         // file as coming from the [app] folder.
         let appPath = Services.io.getProtocolHandler("resource")
                               .QueryInterface(Ci.nsIResProtocolHandler)
                               .getSubstitution("android");
         if (appPath) {
           appPath = appPath.spec;
           let spec = uri.spec;
           if (spec.includes(appPath)) {
-            let appURI = Services.io.newFileURI(getDir(knownDirs["app"]));
+            let appURI = Services.io.newFileURI(getDir(knownDirs.app));
             uri = Services.io.newURI(spec.replace(appPath, appURI.spec));
           }
         }
       }
 
       if (uri instanceof Ci.nsINestedURI) {
         prefix = "jar:";
         suffix = "!" + packageName + "/" + leafName;
@@ -3631,17 +3631,17 @@ SearchService.prototype = {
     if (visibleDefaultEngines) {
       let jarNames = new Set();
       for (let region in searchSettings) {
         // Artifact builds use the full list.json which parses
         // slightly differently
         if (!("visibleDefaultEngines" in searchSettings[region])) {
           continue;
         }
-        for (let engine of searchSettings[region]["visibleDefaultEngines"]) {
+        for (let engine of searchSettings[region].visibleDefaultEngines) {
           jarNames.add(engine);
         }
       }
 
       engineNames = visibleDefaultEngines.split(",");
       for (let engineName of engineNames) {
         // If all engineName values are part of jarNames,
         // then we can use the country specific list, otherwise ignore it.
@@ -3662,17 +3662,17 @@ SearchService.prototype = {
     if (!engineNames || !engineNames.length) {
       let region;
       if (Services.prefs.prefHasUserValue("browser.search.region")) {
         region = Services.prefs.getCharPref("browser.search.region");
       }
       if (!region || !(region in searchSettings)) {
         region = "default";
       }
-      engineNames = searchSettings[region]["visibleDefaultEngines"];
+      engineNames = searchSettings[region].visibleDefaultEngines;
     }
 
     // Remove any engine names that are supposed to be ignored.
     // This pref is only allows in a partner distribution.
     let branch = Services.prefs.getDefaultBranch(BROWSER_SEARCH_PREF);
     if (isPartnerBuild() &&
         branch.getPrefType("ignoredJAREngines") == branch.PREF_STRING) {
       let ignoredJAREngines = branch.getCharPref("ignoredJAREngines")
--- a/toolkit/components/search/tests/xpcshell/test_async_migration.js
+++ b/toolkit/components/search/tests/xpcshell/test_async_migration.js
@@ -13,14 +13,14 @@ function run_test() {
 }
 
 add_task(async function test_async_metadata_migration() {
   await asyncInit();
   await promiseAfterCache();
 
   // Check that the entries are placed as specified correctly
   let metadata = await promiseEngineMetadata();
-  do_check_eq(metadata["engine"].order, 1);
-  do_check_eq(metadata["engine"].alias, "foo");
+  do_check_eq(metadata.engine.order, 1);
+  do_check_eq(metadata.engine.alias, "foo");
 
   metadata = await promiseGlobalMetadata();
-  do_check_eq(metadata["searchDefaultExpir"], 1471013469846);
+  do_check_eq(metadata.searchDefaultExpir, 1471013469846);
 });
--- a/toolkit/components/search/tests/xpcshell/test_json_cache.js
+++ b/toolkit/components/search/tests/xpcshell/test_json_cache.js
@@ -57,17 +57,17 @@ function run_test() {
     loadUsingSystemPrincipal: true
   });
   let sis = Cc["@mozilla.org/scriptableinputstream;1"].
               createInstance(Ci.nsIScriptableInputStream);
   sis.init(chan.open2());
   let list = sis.read(sis.available());
   let searchSettings = JSON.parse(list);
 
-  cacheTemplate.visibleDefaultEngines = searchSettings["default"]["visibleDefaultEngines"];
+  cacheTemplate.visibleDefaultEngines = searchSettings.default.visibleDefaultEngines;
 
   run_next_test();
 }
 
 add_test(function prepare_test_data() {
   OS.File.writeAtomic(OS.Path.join(OS.Constants.Path.profileDir, CACHE_FILENAME),
                       new TextEncoder().encode(JSON.stringify(cacheTemplate)),
                       {compression: "lz4"})
--- a/toolkit/components/search/tests/xpcshell/test_migration_langpack.js
+++ b/toolkit/components/search/tests/xpcshell/test_migration_langpack.js
@@ -28,10 +28,10 @@ add_task(async function async_init() {
   await asyncInit();
 
   let engine = Services.search.getEngineByName("bug645970");
   do_check_neq(engine, null);
   do_check_eq(engine.wrappedJSObject._id, "[app]/bug645970.xml");
 
   await commitPromise;
   let metadata = await promiseEngineMetadata();
-  do_check_eq(metadata["bug645970"].alias, "lp");
+  do_check_eq(metadata.bug645970.alias, "lp");
 });
--- a/toolkit/components/search/tests/xpcshell/test_save_sorted_engines.js
+++ b/toolkit/components/search/tests/xpcshell/test_save_sorted_engines.js
@@ -56,11 +56,11 @@ add_task(async function test_save_sorted
 
   // Test adding a new engine
   search.addEngineWithDetails("foo", "", "foo", "", "GET",
                               "http://searchget/?search={searchTerms}");
   await promiseAfterCache();
   do_print("Commit complete after addEngineWithDetails");
 
   metadata = await promiseEngineMetadata();
-  do_check_eq(metadata["foo"].alias, "foo");
-  do_check_true(metadata["foo"].order > 0);
+  do_check_eq(metadata.foo.alias, "foo");
+  do_check_true(metadata.foo.order > 0);
 });
--- a/toolkit/components/search/tests/xpcshell/test_searchReset.js
+++ b/toolkit/components/search/tests/xpcshell/test_searchReset.js
@@ -25,17 +25,17 @@ function run_test() {
   run_next_test();
 }
 
 async function removeLoadPathHash() {
   // Remove the loadPathHash and re-initialize the search service.
   let cache = await promiseCacheData();
   for (let engine of cache.engines) {
     if (engine._shortName == kTestEngineShortName) {
-      delete engine._metaData["loadPathHash"];
+      delete engine._metaData.loadPathHash;
       break;
     }
   }
   await promiseSaveCacheData(cache);
   await asyncReInit();
 }
 
 add_task(async function test_no_prompt_when_valid_loadPathHash() {
--- a/toolkit/components/search/tests/xpcshell/test_sync_migration.js
+++ b/toolkit/components/search/tests/xpcshell/test_sync_migration.js
@@ -15,14 +15,14 @@ function run_test() {
 add_task(async function test_sync_metadata_migration() {
   do_check_false(Services.search.isInitialized);
   Services.search.getEngines();
   do_check_true(Services.search.isInitialized);
   await promiseAfterCache();
 
   // Check that the entries are placed as specified correctly
   let metadata = await promiseEngineMetadata();
-  do_check_eq(metadata["engine"].order, 1);
-  do_check_eq(metadata["engine"].alias, "foo");
+  do_check_eq(metadata.engine.order, 1);
+  do_check_eq(metadata.engine.alias, "foo");
 
   metadata = await promiseGlobalMetadata();
-  do_check_eq(metadata["searchDefaultExpir"], 1471013469846);
+  do_check_eq(metadata.searchDefaultExpir, 1471013469846);
 });
--- a/toolkit/components/startup/tests/browser/browser_crash_detection.js
+++ b/toolkit/components/startup/tests/browser/browser_crash_detection.js
@@ -1,17 +1,17 @@
 /* Any copyright is dedicated to the Public Domain.
  *    http://creativecommons.org/publicdomain/zero/1.0/
  */
 
 function test() {
   function checkLastSuccess() {
     let lastSuccess = Services.prefs.getIntPref("toolkit.startup.last_success");
     let si = Services.startup.getStartupInfo();
-    is(lastSuccess, parseInt(si["main"].getTime() / 1000, 10),
+    is(lastSuccess, parseInt(si.main.getTime() / 1000, 10),
        "Startup tracking pref should be set after a delay at the end of startup");
     finish();
   }
 
   if (Services.prefs.getPrefType("toolkit.startup.max_resumed_crashes") == Services.prefs.PREF_INVALID) {
     info("Skipping this test since startup crash detection is disabled");
     return;
   }
--- a/toolkit/components/telemetry/TelemetrySession.jsm
+++ b/toolkit/components/telemetry/TelemetrySession.jsm
@@ -1300,47 +1300,47 @@ var Impl = {
     let scalars = protect(() => this.getScalars(isSubsession, clearSubsession), {});
     let keyedScalars = protect(() => this.getScalars(isSubsession, clearSubsession, true), {});
     let events = protect(() => this.getEvents(isSubsession, clearSubsession))
 
     payloadObj.histograms = histograms.parent || {};
     payloadObj.keyedHistograms = keyedHistograms.parent || {};
     payloadObj.processes = {
       parent: {
-        scalars: scalars["parent"] || {},
-        keyedScalars: keyedScalars["parent"] || {},
-        events: events["parent"] || [],
+        scalars: scalars.parent || {},
+        keyedScalars: keyedScalars.parent || {},
+        events: events.parent || [],
       },
       content: {
-        scalars: scalars["content"],
-        keyedScalars: keyedScalars["content"],
-        histograms: histograms["content"],
-        keyedHistograms: keyedHistograms["content"],
-        events: events["content"] || [],
+        scalars: scalars.content,
+        keyedScalars: keyedScalars.content,
+        histograms: histograms.content,
+        keyedHistograms: keyedHistograms.content,
+        events: events.content || [],
       },
       extension: {
-        scalars: scalars["extension"],
-        keyedScalars: keyedScalars["extension"],
-        histograms: histograms["extension"],
-        keyedHistograms: keyedHistograms["extension"],
-        events: events["extension"] || [],
+        scalars: scalars.extension,
+        keyedScalars: keyedScalars.extension,
+        histograms: histograms.extension,
+        keyedHistograms: keyedHistograms.extension,
+        events: events.extension || [],
       },
     };
 
     // Only include the GPU process if we've accumulated data for it.
     if ("gpu" in histograms ||
         "gpu" in keyedHistograms ||
         "gpu" in scalars ||
         "gpu" in keyedScalars) {
       payloadObj.processes.gpu = {
-        scalars: scalars["gpu"],
-        keyedScalars: keyedScalars["gpu"],
-        histograms: histograms["gpu"],
-        keyedHistograms: keyedHistograms["gpu"],
-        events: events["gpu"] || [],
+        scalars: scalars.gpu,
+        keyedScalars: keyedScalars.gpu,
+        histograms: histograms.gpu,
+        keyedHistograms: keyedHistograms.gpu,
+        events: events.gpu || [],
       };
     }
 
     payloadObj.info = info;
 
     // Add extended set measurements for chrome process.
     if (Telemetry.canRecordExtended) {
       payloadObj.slowSQL = protect(() => Telemetry.slowSQL);
--- a/toolkit/components/telemetry/tests/unit/test_ChildHistograms.js
+++ b/toolkit/components/telemetry/tests/unit/test_ChildHistograms.js
@@ -54,33 +54,33 @@ function run_child_test() {
   allChildLinear.add(10);
 }
 
 function check_histogram_values(payload) {
   const hs = payload.histograms;
   Assert.ok("TELEMETRY_TEST_COUNT" in hs, "Should have count test histogram.");
   Assert.ok("TELEMETRY_TEST_FLAG" in hs, "Should have flag test histogram.");
   Assert.ok("TELEMETRY_TEST_CATEGORICAL" in hs, "Should have categorical test histogram.");
-  Assert.equal(hs["TELEMETRY_TEST_COUNT"].sum, 2,
+  Assert.equal(hs.TELEMETRY_TEST_COUNT.sum, 2,
                "Count test histogram should have the right value.");
-  Assert.equal(hs["TELEMETRY_TEST_FLAG"].sum, 1,
+  Assert.equal(hs.TELEMETRY_TEST_FLAG.sum, 1,
                "Flag test histogram should have the right value.");
-  Assert.equal(hs["TELEMETRY_TEST_CATEGORICAL"].sum, 3,
+  Assert.equal(hs.TELEMETRY_TEST_CATEGORICAL.sum, 3,
                "Categorical test histogram should have the right sum.");
 
   const kh = payload.keyedHistograms;
   Assert.ok("TELEMETRY_TEST_KEYED_COUNT" in kh, "Should have keyed count test histogram.");
   Assert.ok("TELEMETRY_TEST_KEYED_FLAG" in kh, "Should have keyed flag test histogram.");
-  Assert.equal(kh["TELEMETRY_TEST_KEYED_COUNT"]["a"].sum, 1,
+  Assert.equal(kh.TELEMETRY_TEST_KEYED_COUNT.a.sum, 1,
                "Keyed count test histogram should have the right value.");
-  Assert.equal(kh["TELEMETRY_TEST_KEYED_COUNT"]["b"].sum, 2,
+  Assert.equal(kh.TELEMETRY_TEST_KEYED_COUNT.b.sum, 2,
                "Keyed count test histogram should have the right value.");
-  Assert.equal(kh["TELEMETRY_TEST_KEYED_FLAG"]["a"].sum, 1,
+  Assert.equal(kh.TELEMETRY_TEST_KEYED_FLAG.a.sum, 1,
                "Keyed flag test histogram should have the right value.");
-  Assert.equal(kh["TELEMETRY_TEST_KEYED_FLAG"]["b"].sum, 1,
+  Assert.equal(kh.TELEMETRY_TEST_KEYED_FLAG.b.sum, 1,
                "Keyed flag test histogram should have the right value.");
 }
 
 add_task(async function() {
   if (!runningInParent) {
     TelemetryController.testSetupContent();
     run_child_test();
     dump("... done with child test\n");
--- a/toolkit/components/telemetry/tests/unit/test_PingAPI.js
+++ b/toolkit/components/telemetry/tests/unit/test_PingAPI.js
@@ -487,15 +487,15 @@ add_task(async function test_currentPing
     const expectedReason = subsession ? "gather-subsession-payload" : "gather-payload";
     Assert.equal(ping.payload.info.reason, expectedReason, "Ping should have the correct reason.");
 
     let id = "TELEMETRY_TEST_RELEASE_OPTOUT";
     Assert.ok(id in ping.payload.histograms, "Payload should have test count histogram.");
     Assert.equal(ping.payload.histograms[id].sum, 1, "Test count value should match.");
     id = "TELEMETRY_TEST_KEYED_RELEASE_OPTOUT";
     Assert.ok(id in ping.payload.keyedHistograms, "Payload should have keyed test histogram.");
-    Assert.equal(ping.payload.keyedHistograms[id]["a"].sum, 1, "Keyed test value should match.");
+    Assert.equal(ping.payload.keyedHistograms[id].a.sum, 1, "Keyed test value should match.");
   }
 });
 
 add_task(async function test_shutdown() {
   await TelemetryController.testShutdown();
 });
--- a/toolkit/components/telemetry/tests/unit/test_TelemetryEnvironment.js
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetryEnvironment.js
@@ -571,28 +571,28 @@ function checkSystemSection(data) {
 
   let osData = data.system.os;
   Assert.ok(checkNullOrString(osData.name));
   Assert.ok(checkNullOrString(osData.version));
   Assert.ok(checkNullOrString(osData.locale));
 
   // Service pack is only available on Windows.
   if (gIsWindows) {
-    Assert.ok(Number.isFinite(osData["servicePackMajor"]),
+    Assert.ok(Number.isFinite(osData.servicePackMajor),
               "ServicePackMajor must be a number.");
-    Assert.ok(Number.isFinite(osData["servicePackMinor"]),
+    Assert.ok(Number.isFinite(osData.servicePackMinor),
               "ServicePackMinor must be a number.");
     if ("windowsBuildNumber" in osData) {
       // This might not be available on all Windows platforms.
-      Assert.ok(Number.isFinite(osData["windowsBuildNumber"]),
+      Assert.ok(Number.isFinite(osData.windowsBuildNumber),
                 "windowsBuildNumber must be a number.");
     }
     if ("windowsUBR" in osData) {
       // This might not be available on all Windows platforms.
-      Assert.ok((osData["windowsUBR"] === null) || Number.isFinite(osData["windowsUBR"]),
+      Assert.ok((osData.windowsUBR === null) || Number.isFinite(osData.windowsUBR),
                 "windowsUBR must be null or a number.");
     }
   } else if (gIsAndroid) {
     Assert.ok(checkNullOrString(osData.kernelVersion));
   }
 
   let check = gIsWindows ? checkString : checkNullOrString;
   for (let disk of EXPECTED_HDD_FIELDS) {
@@ -1860,17 +1860,17 @@ add_task(async function test_experiments
             "The experiments must be reporting the truncated branch.");
 
   TelemetryEnvironment.unregisterChangeListener("test_experimentsAPI");
 
   // Check that an overly long type is truncated.
   const longType = "a0123456678901234567890123456789";
   TelemetryEnvironment.setExperimentActive("exp", "some-branch", {type: longType});
   data = TelemetryEnvironment.currentEnvironment;
-  Assert.equal(data.experiments["exp"].type, longType.substring(0, 20));
+  Assert.equal(data.experiments.exp.type, longType.substring(0, 20));
 });
 
 add_task(async function test_environmentShutdown() {
   // Define and reset the test preference.
   const PREF_TEST = "toolkit.telemetry.test.pref1";
   const PREFS_TO_WATCH = new Map([
     [PREF_TEST, {what: TelemetryEnvironment.RECORD_PREF_STATE}],
   ]);
--- a/toolkit/components/telemetry/tests/unit/test_TelemetryEvents.js
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetryEvents.js
@@ -294,10 +294,10 @@ add_task(async function test_unicodeValu
   Telemetry.recordEvent("telemetry.test", "test1", "object1", null, {"key1": value});
 
   // Check that the values were correctly recorded.
   let snapshot = Telemetry.snapshotBuiltinEvents(OPTIN, true);
   Assert.ok(("parent" in snapshot), "Should have entry for main process.");
   let events = snapshot.parent;
   Assert.equal(events.length, 2, "Should have recorded 2 events.");
   Assert.equal(events[0][4], value, "Should have recorded the right value.");
-  Assert.equal(events[1][5]["key1"], value, "Should have recorded the right extra value.");
+  Assert.equal(events[1][5].key1, value, "Should have recorded the right extra value.");
 });
--- a/toolkit/components/telemetry/tests/unit/test_TelemetryHistograms.js
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetryHistograms.js
@@ -439,17 +439,17 @@ add_task(async function test_expired_his
 
   dummy.add(1);
 
   for (let process of ["main", "content", "gpu", "extension"]) {
     if (!(process in Telemetry.histogramSnapshots)) {
       do_print("Nothing present for process " + process);
       continue;
     }
-    do_check_eq(Telemetry.histogramSnapshots[process]["__expired__"], undefined);
+    do_check_eq(Telemetry.histogramSnapshots[process].__expired__, undefined);
   }
   do_check_eq(Telemetry.histogramSnapshots.parent[test_expired_id], undefined);
   do_check_eq(rh[test_expired_id], undefined);
 });
 
 add_task(async function test_keyed_histogram() {
   // Check that invalid names get rejected.
 
--- a/toolkit/components/telemetry/tests/unit/test_TelemetryScalars.js
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetryScalars.js
@@ -4,18 +4,18 @@
 
 const UINT_SCALAR = "telemetry.test.unsigned_int_kind";
 const STRING_SCALAR = "telemetry.test.string_kind";
 const BOOLEAN_SCALAR = "telemetry.test.boolean_kind";
 const KEYED_UINT_SCALAR = "telemetry.test.keyed_unsigned_int";
 
 function getParentProcessScalars(aChannel, aKeyed = false, aClear = false) {
   const scalars = aKeyed ?
-    Telemetry.snapshotKeyedScalars(aChannel, aClear)["parent"] :
-    Telemetry.snapshotScalars(aChannel, aClear)["parent"];
+    Telemetry.snapshotKeyedScalars(aChannel, aClear).parent :
+    Telemetry.snapshotScalars(aChannel, aClear).parent;
   return scalars || {};
 }
 
 add_task(async function test_serializationFormat() {
   Telemetry.clearScalars();
 
   // Set the scalars to a known value.
   const expectedUint = 3785;
@@ -364,17 +364,17 @@ add_task(async function test_subsession(
     getParentProcessScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, true, true);
 
   Assert.equal(scalars[UINT_SCALAR], 3785,
                UINT_SCALAR + " must contain the expected value.");
   Assert.equal(scalars[STRING_SCALAR], "some value",
                STRING_SCALAR + " must contain the expected value.");
   Assert.equal(scalars[BOOLEAN_SCALAR], false,
                BOOLEAN_SCALAR + " must contain the expected value.");
-  Assert.equal(keyedScalars[KEYED_UINT_SCALAR]["some_random_key"], 12,
+  Assert.equal(keyedScalars[KEYED_UINT_SCALAR].some_random_key, 12,
                KEYED_UINT_SCALAR + " must contain the expected value.");
 
   // Get a new snapshot and reset the subsession again. Since no new value
   // was set, the scalars should not be reported.
   scalars =
     getParentProcessScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, false, true);
   keyedScalars =
     getParentProcessScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, true, true);
--- a/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js
@@ -520,17 +520,17 @@ add_task(async function asyncSetup() {
 
 // Ensures that expired histograms are not part of the payload.
 add_task(async function test_expiredHistogram() {
 
   let dummy = Telemetry.getHistogramById("TELEMETRY_TEST_EXPIRED");
 
   dummy.add(1);
 
-  do_check_eq(TelemetrySession.getPayload()["histograms"]["TELEMETRY_TEST_EXPIRED"], undefined);
+  do_check_eq(TelemetrySession.getPayload().histograms.TELEMETRY_TEST_EXPIRED, undefined);
 });
 
 // Sends a ping to a non existing server. If we remove this test, we won't get
 // all the histograms we need in the main ping.
 add_task(async function test_noServerPing() {
   await sendPing();
   // We need two pings in order to make sure STARTUP_MEMORY_STORAGE_SQLIE histograms
   // are initialised. See bug 1131585.
@@ -835,18 +835,18 @@ add_task(async function test_checkSubses
   classic = TelemetrySession.getPayload();
   subsession = TelemetrySession.getPayload("environment-change");
 
   Assert.ok(COUNT_ID in classic.histograms);
   Assert.ok(COUNT_ID in subsession.histograms);
   Assert.ok(KEYED_ID in classic.keyedHistograms);
   Assert.ok(KEYED_ID in subsession.keyedHistograms);
   Assert.equal(classic.histograms[COUNT_ID].sum, 1);
-  Assert.equal(classic.keyedHistograms[KEYED_ID]["a"].sum, 1);
-  Assert.equal(classic.keyedHistograms[KEYED_ID]["b"].sum, 1);
+  Assert.equal(classic.keyedHistograms[KEYED_ID].a.sum, 1);
+  Assert.equal(classic.keyedHistograms[KEYED_ID].b.sum, 1);
 
   checkHistograms(classic.histograms, subsession.histograms, "Added values should be picked up");
   checkKeyedHistograms(classic.keyedHistograms, subsession.keyedHistograms, "Added values should be picked up by keyed");
 
   // Values should still reset properly.
   count.clear();
   keyed.clear();
   classic = TelemetrySession.getPayload();
@@ -867,18 +867,18 @@ add_task(async function test_checkSubses
   classic = TelemetrySession.getPayload();
   subsession = TelemetrySession.getPayload("environment-change");
 
   Assert.ok(COUNT_ID in classic.histograms);
   Assert.ok(COUNT_ID in subsession.histograms);
   Assert.ok(KEYED_ID in classic.keyedHistograms);
   Assert.ok(KEYED_ID in subsession.keyedHistograms);
   Assert.equal(classic.histograms[COUNT_ID].sum, 1);
-  Assert.equal(classic.keyedHistograms[KEYED_ID]["a"].sum, 1);
-  Assert.equal(classic.keyedHistograms[KEYED_ID]["b"].sum, 1);
+  Assert.equal(classic.keyedHistograms[KEYED_ID].a.sum, 1);
+  Assert.equal(classic.keyedHistograms[KEYED_ID].b.sum, 1);
 
   checkHistograms(classic.histograms, subsession.histograms, "Adding values should be picked up again");
   checkKeyedHistograms(classic.keyedHistograms, subsession.keyedHistograms, "Adding values should be picked up by keyed again");
 
   // We should be able to reset only the subsession histograms.
   // First check that "snapshot and clear" still returns the old state...
   classic = TelemetrySession.getPayload();
   subsession = TelemetrySession.getPayload("environment-change", true);
@@ -896,37 +896,37 @@ add_task(async function test_checkSubses
   subsession = TelemetrySession.getPayload("environment-change");
 
   Assert.ok(COUNT_ID in classic.histograms);
   Assert.ok(!(COUNT_ID in subsession.histograms));
   Assert.equal(classic.histograms[COUNT_ID].sum, 1);
 
   Assert.ok(KEYED_ID in classic.keyedHistograms);
   Assert.ok(!(KEYED_ID in subsession.keyedHistograms));
-  Assert.equal(classic.keyedHistograms[KEYED_ID]["a"].sum, 1);
-  Assert.equal(classic.keyedHistograms[KEYED_ID]["b"].sum, 1);
+  Assert.equal(classic.keyedHistograms[KEYED_ID].a.sum, 1);
+  Assert.equal(classic.keyedHistograms[KEYED_ID].b.sum, 1);
 
   // Adding values should get picked up in both again.
   count.add(1);
   keyed.add("a", 1);
   keyed.add("b", 1);
   classic = TelemetrySession.getPayload();
   subsession = TelemetrySession.getPayload("environment-change");
 
   Assert.ok(COUNT_ID in classic.histograms);
   Assert.ok(COUNT_ID in subsession.histograms);
   Assert.equal(classic.histograms[COUNT_ID].sum, 2);
   Assert.equal(subsession.histograms[COUNT_ID].sum, 1);
 
   Assert.ok(KEYED_ID in classic.keyedHistograms);
   Assert.ok(KEYED_ID in subsession.keyedHistograms);
-  Assert.equal(classic.keyedHistograms[KEYED_ID]["a"].sum, 2);
-  Assert.equal(classic.keyedHistograms[KEYED_ID]["b"].sum, 2);
-  Assert.equal(subsession.keyedHistograms[KEYED_ID]["a"].sum, 1);
-  Assert.equal(subsession.keyedHistograms[KEYED_ID]["b"].sum, 1);
+  Assert.equal(classic.keyedHistograms[KEYED_ID].a.sum, 2);
+  Assert.equal(classic.keyedHistograms[KEYED_ID].b.sum, 2);
+  Assert.equal(subsession.keyedHistograms[KEYED_ID].a.sum, 1);
+  Assert.equal(subsession.keyedHistograms[KEYED_ID].b.sum, 1);
 
   await TelemetryController.testShutdown();
 });
 
 add_task(async function test_checkSubsessionData() {
   if (gIsAndroid) {
     // We don't support subsessions yet on Android.
     return;
@@ -1032,18 +1032,18 @@ add_task(async function test_dailyCollec
   Assert.ok(!!ping);
 
   Assert.equal(ping.type, PING_TYPE_MAIN);
   Assert.equal(ping.payload.info.reason, REASON_DAILY);
   let subsessionStartDate = new Date(ping.payload.info.subsessionStartDate);
   Assert.equal(subsessionStartDate.toISOString(), expectedDate.toISOString());
 
   Assert.equal(ping.payload.histograms[COUNT_ID].sum, 1);
-  Assert.equal(ping.payload.keyedHistograms[KEYED_ID]["a"].sum, 1);
-  Assert.equal(ping.payload.keyedHistograms[KEYED_ID]["b"].sum, 2);
+  Assert.equal(ping.payload.keyedHistograms[KEYED_ID].a.sum, 1);
+  Assert.equal(ping.payload.keyedHistograms[KEYED_ID].b.sum, 2);
 
   // The daily ping is rescheduled for "tomorrow".
   expectedDate = futureDate(expectedDate, MS_IN_ONE_DAY);
   now = futureDate(now, MS_IN_ONE_DAY);
   fakeNow(now);
 
   // Run a scheduler tick. Trigger and collect another ping. The histograms should be reset.
   await schedulerTickCallback();
@@ -1074,18 +1074,18 @@ add_task(async function test_dailyCollec
   Assert.ok(!!ping);
 
   Assert.equal(ping.type, PING_TYPE_MAIN);
   Assert.equal(ping.payload.info.reason, REASON_DAILY);
   subsessionStartDate = new Date(ping.payload.info.subsessionStartDate);
   Assert.equal(subsessionStartDate.toISOString(), expectedDate.toISOString());
 
   Assert.equal(ping.payload.histograms[COUNT_ID].sum, 1);
-  Assert.equal(ping.payload.keyedHistograms[KEYED_ID]["a"].sum, 1);
-  Assert.equal(ping.payload.keyedHistograms[KEYED_ID]["b"].sum, 1);
+  Assert.equal(ping.payload.keyedHistograms[KEYED_ID].a.sum, 1);
+  Assert.equal(ping.payload.keyedHistograms[KEYED_ID].b.sum, 1);
 
   // Shutdown to cleanup the aborted-session if it gets created.
   await TelemetryController.testShutdown();
 });
 
 add_task(async function test_dailyDuplication() {
   if (gIsAndroid) {
     // We don't do daily collections yet on Android.
@@ -1238,17 +1238,17 @@ add_task(async function test_environment
 
   Assert.equal(ping.type, PING_TYPE_MAIN);
   Assert.equal(ping.environment.settings.userPrefs[PREF_TEST], undefined);
   Assert.equal(ping.payload.info.reason, REASON_ENVIRONMENT_CHANGE);
   let subsessionStartDate = new Date(ping.payload.info.subsessionStartDate);
   Assert.equal(subsessionStartDate.toISOString(), startHour.toISOString());
 
   Assert.equal(ping.payload.histograms[COUNT_ID].sum, 1);
-  Assert.equal(ping.payload.keyedHistograms[KEYED_ID]["a"].sum, 1);
+  Assert.equal(ping.payload.keyedHistograms[KEYED_ID].a.sum, 1);
 
   // Trigger and collect another ping. The histograms should be reset.
   startHour = TelemetryUtils.truncateToHours(now);
   gMonotonicNow = fakeMonotonicNow(gMonotonicNow + 10 * MILLISECONDS_PER_MINUTE);
   now = fakeNow(futureDate(now, 10 * MILLISECONDS_PER_MINUTE));
 
   Preferences.set(PREF_TEST, 2);
   ping = await PingServer.promiseNextPing();
--- a/toolkit/content/aboutSupport.js
+++ b/toolkit/content/aboutSupport.js
@@ -751,17 +751,17 @@ var snapshotFormatters = {
     if (!AppConstants.MOZ_SANDBOX)
       return;
 
     let strings = stringBundle();
     let tbody = $("sandbox-tbody");
     for (let key in data) {
       // Simplify the display a little in the common case.
       if (key === "hasPrivilegedUserNamespaces" &&
-          data[key] === data["hasUserNamespaces"]) {
+          data[key] === data.hasUserNamespaces) {
         continue;
       }
       if (key === "syscallLog") {
         // Not in this table.
         continue;
       }
       tbody.appendChild($.new("tr", [
         $.new("th", strings.GetStringFromName(key), "column"),
--- a/toolkit/content/aboutTelemetry.js
+++ b/toolkit/content/aboutTelemetry.js
@@ -2184,17 +2184,17 @@ var SimpleMeasurements = {
    * section into temporal order.
    *
    * @param aSimpleMeasurements Telemetry ping's "Simple Measurements" data
    * @return Sorted measurements
    */
   sortStartupMilestones(aSimpleMeasurements) {
     const telemetryTimestamps = TelemetryTimestamps.get();
     let startupEvents = Services.startup.getStartupInfo();
-    delete startupEvents["process"];
+    delete startupEvents.process;
 
     function keyIsMilestone(k) {
       return (k in startupEvents) || (k in telemetryTimestamps);
     }
 
     let sortedKeys = Object.keys(aSimpleMeasurements);
 
     // Sort the measurements, with startup milestones at the front + ordered by time
--- a/toolkit/content/tests/widgets/test_videocontrols_jsdisabled.html
+++ b/toolkit/content/tests/widgets/test_videocontrols_jsdisabled.html
@@ -41,17 +41,17 @@ function runTest(event) {
 }
 
 SpecialPowers.pushPrefEnv({"set": [["javascript.enabled", false]]}, startTest);
 
 var testnum = 1;
 
 var video;
 function loadevent(event) {
-  is(win["testExpando"], undefined, "expando shouldn't exist because js is disabled");
+  is(win.testExpando, undefined, "expando shouldn't exist because js is disabled");
   video = win.document.querySelector("video");
   // Other events expected by the test.
   video.addEventListener("timeupdate", runTest);
   video.addEventListener("pause", runTest);
 }
 
 var win;
 function startTest() {
--- a/toolkit/content/widgets/datetimebox.xml
+++ b/toolkit/content/widgets/datetimebox.xml
@@ -620,17 +620,17 @@
             this.mMaxMinute, this.mMinSecPageUpDownInterval);
 
           if (this.mHour12) {
             this.mDayPeriodField = this.createEditField(
               this.mDayPeriodPlaceHolder, false);
           }
 
           if (this.shouldShowSecondField()) {
-            options["second"] = "numeric";
+            options.second = "numeric";
             this.mSecondField = this.createEditField(this.mSecondPlaceHolder,
               true, this.mMaxLength, this.mMaxLength, this.mMinSecond,
               this.mMaxSecond, this.mMinSecPageUpDownInterval);
 
             if (this.shouldShowMillisecField()) {
               this.mMillisecField = this.createEditField(
                 this.mMillisecPlaceHolder, true, this.mMillisecMaxLength,
                 this.mMillisecMaxLength, this.mMinMillisecond,
--- a/toolkit/content/widgets/dialog.xml
+++ b/toolkit/content/widgets/dialog.xml
@@ -305,17 +305,17 @@
             // hide/show the buttons we want
             for (dlgtype in buttons)
               buttons[dlgtype].hidden = !shown[dlgtype];
 
             // show the spacer on Windows only when the extra2 button is present
             if (/Win/.test(navigator.platform)) {
               var spacer = document.getAnonymousElementByAttribute(this, "anonid", "spacer");
               spacer.removeAttribute("hidden");
-              spacer.setAttribute("flex", shown["extra2"] ? "1" : "0");
+              spacer.setAttribute("flex", shown.extra2 ? "1" : "0");
             }
           }
         ]]>
         </body>
       </method>
 
       <method name="_setDefaultButton">
         <parameter name="aNewDefault"/>
--- a/toolkit/crashreporter/CrashSubmit.jsm
+++ b/toolkit/crashreporter/CrashSubmit.jsm
@@ -78,21 +78,21 @@ async function getL10nStrings() {
   path = OS.Path.join(dirSvc.get("XCurProcD", Ci.nsIFile).path,
                       "crashreporter-override.ini");
   pathExists = await OS.File.exists(path);
 
   if (pathExists) {
     crstrings = parseINIStrings(path);
 
     if ("CrashID" in crstrings) {
-      strings["crashid"] = crstrings.CrashID;
+      strings.crashid = crstrings.CrashID;
     }
 
     if ("CrashDetailsURL" in crstrings) {
-      strings["reporturl"] = crstrings.CrashDetailsURL;
+      strings.reporturl = crstrings.CrashDetailsURL;
     }
   }
 
   return strings;
 }
 
 function getDir(name) {
   let dirSvc = Cc["@mozilla.org/file/directory_service;1"].
--- a/toolkit/modules/Memory.jsm
+++ b/toolkit/modules/Memory.jsm
@@ -61,17 +61,17 @@ this.Memory = {
 
   finish() {
     // Code to gather the USS and RSS values for the parent process. This
     // functions the same way as in process-content.js.
     let memMgr = Cc["@mozilla.org/memory-reporter-manager;1"]
                    .getService(Ci.nsIMemoryReporterManager);
     let rss = memMgr.resident;
     let uss = memMgr.residentUnique;
-    this._summaries["Parent"] = { uss, rss };
+    this._summaries.Parent = { uss, rss };
     this._pendingResolve(this._summaries);
     this._pendingResolve = null;
     this._summaries = null;
     this._pendingPromise = null;
     clearTimeout(this._pendingTimeout);
     Services.ppmm.removeMessageListener("Memory:Summary", this);
   }
 };
--- a/toolkit/modules/secondscreen/RokuApp.jsm
+++ b/toolkit/modules/secondscreen/RokuApp.jsm
@@ -191,17 +191,17 @@ RemoteMedia.prototype = {
       this._listener.onRemoteMediaStop(this);
   },
 
   _sendMsg: function _sendMsg(data) {
     if (!data)
       return;
 
     // Add the protocol version
-    data["_v"] = PROTOCOL_VERSION;
+    data._v = PROTOCOL_VERSION;
 
     let raw = JSON.stringify(data);
     this._outputStream.write(raw, raw.length);
   },
 
   shutdown: function shutdown() {
     this._outputStream.close();
     this._inputStream.close();
--- a/toolkit/mozapps/extensions/content/extensions.js
+++ b/toolkit/mozapps/extensions/content/extensions.js
@@ -732,22 +732,22 @@ var gViewController = {
   initialViewSelected: false,
   lastHistoryIndex: -1,
 
   initialize() {
     this.viewPort = document.getElementById("view-port");
     this.headeredViews = document.getElementById("headered-views");
     this.headeredViewsDeck = document.getElementById("headered-views-content");
 
-    this.viewObjects["search"] = gSearchView;
-    this.viewObjects["discover"] = gDiscoverView;
-    this.viewObjects["list"] = gListView;
-    this.viewObjects["legacy"] = gLegacyView;
-    this.viewObjects["detail"] = gDetailView;
-    this.viewObjects["updates"] = gUpdatesView;
+    this.viewObjects.search = gSearchView;
+    this.viewObjects.discover = gDiscoverView;
+    this.viewObjects.list = gListView;
+    this.viewObjects.legacy = gLegacyView;
+    this.viewObjects.detail = gDetailView;
+    this.viewObjects.updates = gUpdatesView;
 
     for (let type in this.viewObjects) {
       let view = this.viewObjects[type];
       view.initialize();
     }
 
     window.controllers.appendController(this);
 
--- a/toolkit/mozapps/extensions/content/extensions.xml
+++ b/toolkit/mozapps/extensions/content/extensions.xml
@@ -1120,19 +1120,19 @@
       </field>
 
       <property name="userDisabled">
         <getter><![CDATA[
           return this.mAddon.userDisabled;
         ]]></getter>
         <setter><![CDATA[
           if (val === true) {
-            gViewController.commands["cmd_disableItem"].doCommand(this.mAddon);
+            gViewController.commands.cmd_disableItem.doCommand(this.mAddon);
           } else if (val === false) {
-            gViewController.commands["cmd_enableItem"].doCommand(this.mAddon);
+            gViewController.commands.cmd_enableItem.doCommand(this.mAddon);
           } else {
             this.mAddon.userDisabled = val;
           }
         ]]></setter>
       </property>
 
       <property name="includeUpdate">
         <getter><![CDATA[
@@ -1388,36 +1388,36 @@
             let hasActivatePermission =
               ["ask_to_activate", "enable", "disable"].some(perm => this.hasPermission(perm));
             this._stateMenulist.disabled = !hasActivatePermission;
             this._stateMenulist.hidden = false;
             this._stateMenulist.classList.add("no-auto-hide");
           } else {
             this._stateMenulist.hidden = true;
 
-            let enableTooltip = gViewController.commands["cmd_enableItem"]
+            let enableTooltip = gViewController.commands.cmd_enableItem
                                                .getTooltip(this.mAddon);
             this._enableBtn.setAttribute("tooltiptext", enableTooltip);
             if (this.hasPermission("enable")) {
               this._enableBtn.hidden = false;
             } else {
               this._enableBtn.hidden = true;
             }
 
-            let disableTooltip = gViewController.commands["cmd_disableItem"]
+            let disableTooltip = gViewController.commands.cmd_disableItem
                                                 .getTooltip(this.mAddon);
             this._disableBtn.setAttribute("tooltiptext", disableTooltip);
             if (this.hasPermission("disable")) {
               this._disableBtn.hidden = false;
             } else {
               this._disableBtn.hidden = true;
             }
           }
 
-          let uninstallTooltip = gViewController.commands["cmd_uninstallItem"]
+          let uninstallTooltip = gViewController.commands.cmd_uninstallItem
                                                 .getTooltip(this.mAddon);
           this._removeBtn.setAttribute("tooltiptext", uninstallTooltip);
           if (this.hasPermission("uninstall")) {
             this._removeBtn.hidden = false;
           } else {
             this._removeBtn.hidden = true;
           }
 
@@ -1576,23 +1576,23 @@
                       this.mAddon.releaseNotesURI;
             this._fetchReleaseNotes(uri);
           }
         ]]></body>
       </method>
 
       <method name="restart">
         <body><![CDATA[
-          gViewController.commands["cmd_restartApp"].doCommand();
+          gViewController.commands.cmd_restartApp.doCommand();
         ]]></body>
       </method>
 
       <method name="undo">
         <body><![CDATA[
-          gViewController.commands["cmd_cancelOperation"].doCommand(this.mAddon);
+          gViewController.commands.cmd_cancelOperation.doCommand(this.mAddon);
         ]]></body>
       </method>
 
       <method name="uninstall">
         <body><![CDATA[
           // If uninstalling does not require a restart and the type doesn't
           // support undoing of restartless uninstalls, then we fake it by
           // just disabling it it, and doing the real uninstall later.
--- a/toolkit/mozapps/extensions/internal/AddonUpdateChecker.jsm
+++ b/toolkit/mozapps/extensions/internal/AddonUpdateChecker.jsm
@@ -463,17 +463,17 @@ function parseJSONManifest(aId, aUpdateK
     let value = getProperty(aObj, aProperty, aType);
     if (value === undefined)
       throw Components.Exception(`Update manifest is missing a required ${aProperty} property.`);
     return value;
   }
 
   let manifest = aManifestData;
 
-  if (!TYPE_CHECK["object"](manifest))
+  if (!TYPE_CHECK.object(manifest))
     throw Components.Exception("Root element of update manifest must be a JSON object literal");
 
   // The set of add-ons this manifest has updates for
   let addons = getRequiredProperty(manifest, "addons", "object");
 
   // The entry for this particular add-on
   let addon = getProperty(addons, aId, "object");
 
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -4328,17 +4328,17 @@ this.XPIProvider = {
                                 aAddon.hasEmbeddedWebExtension || false);
         activeAddon = this.activeAddons.get(aAddon.id);
       }
 
       if (aMethod == "startup" || aMethod == "shutdown") {
         if (!aExtraParams) {
           aExtraParams = {};
         }
-        aExtraParams["instanceID"] = this.activeAddons.get(aAddon.id).instanceID;
+        aExtraParams.instanceID = this.activeAddons.get(aAddon.id).instanceID;
       }
 
       // Nothing to call for locales
       if (aAddon.type == "locale")
         return;
 
       let method = undefined;
       try {
@@ -5183,17 +5183,17 @@ AddonWrapper.prototype = {
     return isWebExtension(addonFor(this).type);
   },
 
   get temporarilyInstalled() {
     return addonFor(this)._installLocation == TemporaryInstallLocation;
   },
 
   get aboutURL() {
-    return this.isActive ? addonFor(this)["aboutURL"] : null;
+    return this.isActive ? addonFor(this).aboutURL : null;
   },
 
   get optionsURL() {
     if (!this.isActive) {
       return null;
     }
 
     let addon = addonFor(this);
--- a/toolkit/mozapps/extensions/test/xpcshell/head_addons.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/head_addons.js
@@ -797,17 +797,17 @@ function getExpectedEvent(aId) {
     return event;
   return [event, true];
 }
 
 function getExpectedInstall(aAddon) {
   if (gExpectedInstalls instanceof Array)
     return gExpectedInstalls.shift();
   if (!aAddon || !aAddon.id)
-    return gExpectedInstalls["NO_ID"].shift();
+    return gExpectedInstalls.NO_ID.shift();
   let id = aAddon.id;
   if (!(id in gExpectedInstalls) || !(gExpectedInstalls[id] instanceof Array))
     do_throw("Wasn't expecting events for " + id);
   if (gExpectedInstalls[id].length == 0)
     do_throw("Too many events for " + id);
   return gExpectedInstalls[id].shift();
 }
 
--- a/toolkit/mozapps/extensions/test/xpcshell/test_types.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_types.js
@@ -39,23 +39,23 @@ function run_test() {
     id: "t$e%st",
     name: "Test",
     uiPriority: 1
   }]);
 
   do_check_eq(expectedAdd, null);
 
   do_check_true("test" in types);
-  do_check_eq(types["test"].name, "Test");
+  do_check_eq(types.test.name, "Test");
   do_check_false("t$e%st" in types);
 
-  delete types["test"];
+  delete types.test;
   do_check_true("test" in types);
 
-  types["foo"] = "bar";
+  types.foo = "bar";
   do_check_false("foo" in types);
 
   expectedRemove = "test";
 
   AddonManagerPrivate.unregisterProvider(provider);
 
   do_check_eq(expectedRemove, null);
 
--- a/tools/leak-gauge/leak-gauge.html
+++ b/tools/leak-gauge/leak-gauge.html
@@ -94,17 +94,17 @@ function runContents(result, contents) {
                                verb == "StartDocumentLoad") {
                         var m = rest.match(/^ (.*)$/);
                         if (!m)
                             throw "URI expected";
                         var uri = m[1];
                         var doc_info = this.docs[addr];
                         doc_info[uri] = true;
                         if ("nim" in doc_info) {
-                            doc_info["nim"][uri] = true;
+                            doc_info.nim[uri] = true;
                         }
                     }
                 }
             },
             dump() {
                 for (var addr in this.docs) {
                     var doc = this.docs[addr];
                     result += "Leaked document at address " + addr + ".\n";
@@ -173,21 +173,21 @@ function runContents(result, contents) {
                         delete this.nims[addr];
                     } else if (verb == "Init") {
                         var m = rest.match(/^ document=(.*)$/);
                         if (!m)
                             throw "document pointer expected";
                         var nim_info = this.nims[addr];
                         var doc = m[1];
                         if (doc != "0") {
-                            var doc_info = handlers["DOCUMENT"].docs[doc];
+                            var doc_info = handlers.DOCUMENT.docs[doc];
                             for (var uri in doc_info) {
                                 nim_info[uri] = true;
                             }
-                            doc_info["nim"] = nim_info;
+                            doc_info.nim = nim_info;
                         }
                     }
                 }
             },
             dump() {
                 for (var addr in this.nims) {
                     var nim = this.nims[addr];
                     result += "Leaked content nodes associated with node info manager at address " + addr + ".\n";
--- a/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js
+++ b/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js
@@ -98,16 +98,18 @@ module.exports = {
     // Functions must always return something or nothing
     "consistent-return": "error",
 
     // Require braces around blocks that start a new line
     // Note that this rule is likely to be overridden on a per-directory basis
     // very frequently.
     // "curly": ["error", "multi-line"],
 
+    "dot-notation": "error",
+
     // Always require a trailing EOL
     "eol-last": "error",
 
     // No spaces between function name and parentheses
     "func-call-spacing": "error",
 
     // Require function* name()
     // "generator-star-spacing": ["error", {"before": false, "after": true}],