Bug 1374620 - Enabled the ESLint dot-notation rule across mozilla-central r=Standard8 draft
authorRajesh Kathiriya <rajesh.kathiriya507@gmail.com>
Tue, 25 Jul 2017 23:45:41 +0530
changeset 619720 c991c4d335da4d5cca0fac59d5ca21d998351d3a
parent 619719 32d12b58e7af284099ad9d2b5ca057f0e8532eb3
child 640488 a4d3d7aeb4c5536f51241225aa74c43f96f79c75
push id71779
push userbmo:standard8@mozilla.com
push dateWed, 02 Aug 2017 12:52:02 +0000
reviewersStandard8
bugs1374620
milestone56.0a1
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_TelemetrySend.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
@@ -569,17 +569,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
@@ -2545,17 +2545,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
@@ -113,17 +113,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`);
       }
     }
@@ -260,58 +260,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"));
@@ -356,17 +356,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);
@@ -408,17 +408,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
@@ -1891,17 +1891,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
@@ -444,47 +444,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
@@ -1578,55 +1578,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",
@@ -311,116 +311,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", "string", "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", "string", "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",
   });
@@ -433,17 +433,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",
   });
@@ -464,31 +464,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",
   );
@@ -499,66 +499,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",
   });
 
@@ -582,17 +582,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",
   });
 
@@ -622,44 +622,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", "string", "experiment value"),
--- a/browser/extensions/shield-recipe-client/test/browser/browser_RecipeRunner.js
+++ b/browser/extensions/shield-recipe-client/test/browser/browser_RecipeRunner.js
@@ -117,18 +117,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");
 
@@ -149,18 +149,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");
@@ -175,23 +175,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
@@ -802,17 +802,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);
@@ -824,17 +824,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 logFiles = getLogFiles();
   equal(logFiles.length, 1);
   do_check_true(logFiles[0].leafName.startsWith("error-sync-"), logFiles[0].leafName);
 
   await clean();
@@ -910,22 +910,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 logFiles = getLogFiles();
   equal(logFiles.length, 1);
   do_check_true(logFiles[0].leafName.startsWith("error-sync-"), logFiles[0].leafName);
 
   await clean();
--- 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
@@ -1299,47 +1299,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_TelemetrySend.js
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetrySend.js
@@ -350,17 +350,17 @@ add_task(async function test_discardBigP
   Assert.deepEqual(histSuccess.snapshot().counts, [0, 2, 0], "Should have recorded sending success.");
   Assert.equal(histogramValueCount(histSendTimeSuccess.snapshot()), 2, "Should have recorded send success time.");
   Assert.greater(histSendTimeSuccess.snapshot().sum, 0, "Should have recorded send success time.");
   Assert.equal(histogramValueCount(histSendTimeFail.snapshot()), 0, "Should not have recorded send failure time.");
 
   Assert.equal(ping.type, TelemetryHealthPing.HEALTH_PING_TYPE, "Should have received a health ping.");
   Assert.deepEqual(ping.payload[TelemetryHealthPing.FailureType.DISCARDED_FOR_SIZE],
     {[TEST_PING_TYPE]: 1}, "Should have recorded correct type of oversized ping.");
-  Assert.deepEqual(ping.payload["os"], TelemetryHealthPing.OsInfo, "Should have correct os info.")
+  Assert.deepEqual(ping.payload.os, TelemetryHealthPing.OsInfo, "Should have correct os info.")
 });
 
 add_task(async function test_evictedOnServerErrors() {
   const TEST_TYPE = "test-evicted";
 
   await TelemetrySend.reset();
 
   let histEvicted = Telemetry.getHistogramById("TELEMETRY_PING_EVICTED_FOR_SERVER_ERRORS");
--- 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,19 @@ 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"],
 
+    // Encourage the use of dot notation whenever possible.
+    "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}],