Bug 1374237 - Part 3: Declare all top-level functions in browser API files files via const., r?mixedpuppy draft
authorBob Silverberg <bsilverberg@mozilla.com>
Wed, 21 Jun 2017 16:13:00 -0400
changeset 601375 a9d0f603ee4118c45fd4f18c51e6c9e72f5fc506
parent 601374 d10bae50b39c805ed3d98896894a5fe632852365
child 601376 eb9fb6430c667708a40f3e6f9874153068c1eab1
push id66031
push userbmo:bob.silverberg@gmail.com
push dateWed, 28 Jun 2017 17:51:39 +0000
reviewersmixedpuppy
bugs1374237
milestone56.0a1
Bug 1374237 - Part 3: Declare all top-level functions in browser API files files via const., r?mixedpuppy Also changed some function names to attempt to guarantee uniqueness across API files. MozReview-Commit-ID: FU5JU1lRHzn
browser/components/extensions/ext-browser.js
browser/components/extensions/ext-browserAction.js
browser/components/extensions/ext-browsingData.js
browser/components/extensions/ext-chrome-settings-overrides.js
browser/components/extensions/ext-geckoProfiler.js
browser/components/extensions/ext-history.js
browser/components/extensions/ext-menus.js
browser/components/extensions/ext-sessions.js
browser/components/extensions/ext-windows.js
--- a/browser/components/extensions/ext-browser.js
+++ b/browser/components/extensions/ext-browser.js
@@ -3,17 +3,17 @@
 // The ext-* files are imported into the same scopes.
 /* import-globals-from ext-utils.js */
 
 XPCOMUtils.defineLazyModuleGetter(global, "EventEmitter",
                                   "resource://gre/modules/EventEmitter.jsm");
 
 // This function is pretty tightly tied to Extension.jsm.
 // Its job is to fill in the |tab| property of the sender.
-function getSender(extension, target, sender) {
+const getSender = (extension, target, sender) => {
   let tabId;
   if ("tabId" in sender) {
     // The message came from a privileged extension page running in a tab. In
     // that case, it should include a tabId property (which is filled in by the
     // page-open listener below).
     tabId = sender.tabId;
     delete sender.tabId;
   } else if (target instanceof Ci.nsIDOMXULElement) {
@@ -21,17 +21,17 @@ function getSender(extension, target, se
   }
 
   if (tabId) {
     let tab = extension.tabManager.get(tabId, null);
     if (tab) {
       sender.tab = tab.convert();
     }
   }
-}
+};
 
 // Used by Extension.jsm
 global.tabGetSender = getSender;
 
 /* eslint-disable mozilla/balanced-listeners */
 extensions.on("uninstall", (msg, extension) => {
   if (extension.uninstallURL) {
     let browser = windowTracker.topWindow.gBrowser;
--- a/browser/components/extensions/ext-browserAction.js
+++ b/browser/components/extensions/ext-browserAction.js
@@ -38,24 +38,24 @@ var {
 } = ExtensionParent;
 
 const POPUP_PRELOAD_TIMEOUT_MS = 200;
 const POPUP_OPEN_MS_HISTOGRAM = "WEBEXT_BROWSERACTION_POPUP_OPEN_MS";
 const POPUP_RESULT_HISTOGRAM = "WEBEXT_BROWSERACTION_POPUP_PRELOAD_RESULT_COUNT";
 
 var XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
 
-function isAncestorOrSelf(target, node) {
+const isAncestorOrSelf = (target, node) => {
   for (; node; node = node.parentNode) {
     if (node === target) {
       return true;
     }
   }
   return false;
-}
+};
 
 // WeakMap[Extension -> BrowserAction]
 const browserActionMap = new WeakMap();
 
 XPCOMUtils.defineLazyGetter(this, "browserAreas", () => {
   return {
     "navbar": CustomizableUI.AREA_NAVBAR,
     "menupanel": gPhotonStructure ? CustomizableUI.AREA_FIXED_OVERFLOW_PANEL : CustomizableUI.AREA_PANEL,
--- a/browser/components/extensions/ext-browsingData.js
+++ b/browser/components/extensions/ext-browsingData.js
@@ -27,28 +27,28 @@ const YIELD_PERIOD = 10;
 const PREF_DOMAIN = "privacy.cpd.";
 
 XPCOMUtils.defineLazyGetter(this, "sanitizer", () => {
   let sanitizer = new Sanitizer();
   sanitizer.prefDomain = PREF_DOMAIN;
   return sanitizer;
 });
 
-function makeRange(options) {
+const makeRange = options => {
   return (options.since == null) ?
     null :
     [PlacesUtils.toPRTime(options.since), PlacesUtils.toPRTime(Date.now())];
-}
+};
 
-function clearCache() {
+const clearCache = () => {
   // Clearing the cache does not support timestamps.
   return sanitizer.items.cache.clear();
-}
+};
 
-let clearCookies = async function(options) {
+const clearCookies = async function(options) {
   let cookieMgr = Services.cookies;
   // This code has been borrowed from sanitize.js.
   let yieldCounter = 0;
 
   if (options.since) {
     // Iterate through the cookies and delete any created after our cutoff.
     let cookiesEnum = cookieMgr.enumerator;
     while (cookiesEnum.hasMoreElements()) {
@@ -65,29 +65,29 @@ let clearCookies = async function(option
       }
     }
   } else {
     // Remove everything.
     cookieMgr.removeAll();
   }
 };
 
-function clearDownloads(options) {
+const clearDownloads = options => {
   return sanitizer.items.downloads.clear(makeRange(options));
-}
+};
 
-function clearFormData(options) {
+const clearFormData = options => {
   return sanitizer.items.formdata.clear(makeRange(options));
-}
+};
 
-function clearHistory(options) {
+const clearHistory = options => {
   return sanitizer.items.history.clear(makeRange(options));
-}
+};
 
-let clearPasswords = async function(options) {
+const clearPasswords = async function(options) {
   let loginManager = Services.logins;
   let yieldCounter = 0;
 
   if (options.since) {
     // Iterate through the logins and delete any updated after our cutoff.
     let logins = loginManager.getAllLogins();
     for (let login of logins) {
       login.QueryInterface(Ci.nsILoginMetaInfo);
@@ -99,37 +99,37 @@ let clearPasswords = async function(opti
       }
     }
   } else {
     // Remove everything.
     loginManager.removeAllLogins();
   }
 };
 
-function clearPluginData(options) {
+const clearPluginData = options => {
   return sanitizer.items.pluginData.clear(makeRange(options));
-}
+};
 
-let clearServiceWorkers = async function() {
+const clearServiceWorkers = async function() {
   // Clearing service workers does not support timestamps.
   let yieldCounter = 0;
 
   // Iterate through the service workers and remove them.
   let serviceWorkers = serviceWorkerManager.getAllRegistrations();
   for (let i = 0; i < serviceWorkers.length; i++) {
     let sw = serviceWorkers.queryElementAt(i, Ci.nsIServiceWorkerRegistrationInfo);
     let host = sw.principal.URI.host;
     serviceWorkerManager.removeAndPropagate(host);
     if (++yieldCounter % YIELD_PERIOD == 0) {
       await new Promise(resolve => setTimeout(resolve, 0)); // Don't block the main thread too long.
     }
   }
 };
 
-function doRemoval(options, dataToRemove, extension) {
+const doRemoval = (options, dataToRemove, extension) => {
   if (options.originTypes &&
       (options.originTypes.protectedWeb || options.originTypes.extension)) {
     return Promise.reject(
       {message: "Firefox does not support protectedWeb or extension as originTypes."});
   }
 
   let removalPromises = [];
   let invalidDataTypes = [];
@@ -165,17 +165,17 @@ function doRemoval(options, dataToRemove
       }
     }
   }
   if (extension && invalidDataTypes.length) {
     extension.logger.warn(
       `Firefox does not support dataTypes: ${invalidDataTypes.toString()}.`);
   }
   return Promise.all(removalPromises);
-}
+};
 
 this.browsingData = class extends ExtensionAPI {
   getAPI(context) {
     let {extension} = context;
     return {
       browsingData: {
         settings() {
           const PREF_DOMAIN = "privacy.cpd.";
--- a/browser/components/extensions/ext-chrome-settings-overrides.js
+++ b/browser/components/extensions/ext-chrome-settings-overrides.js
@@ -2,32 +2,32 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 XPCOMUtils.defineLazyModuleGetter(this, "ExtensionPreferencesManager",
                                   "resource://gre/modules/ExtensionPreferencesManager.jsm");
 
-function searchInitialized() {
+const searchInitialized = () => {
   return new Promise(resolve => {
     if (Services.search.isInitialized) {
       resolve();
     }
     const SEARCH_SERVICE_TOPIC = "browser-search-service";
     Services.obs.addObserver(function observer(subject, topic, data) {
       if (data != "init-complete") {
         return;
       }
 
       Services.obs.removeObserver(observer, SEARCH_SERVICE_TOPIC);
       resolve();
     }, SEARCH_SERVICE_TOPIC);
   });
-}
+};
 
 this.chrome_settings_overrides = class extends ExtensionAPI {
   async onManifestEntry(entryName) {
     let {extension} = this;
     let {manifest} = extension;
 
     if (manifest.chrome_settings_overrides.homepage) {
       ExtensionPreferencesManager.setSetting(extension, "homepage_override",
--- a/browser/components/extensions/ext-geckoProfiler.js
+++ b/browser/components/extensions/ext-geckoProfiler.js
@@ -17,30 +17,30 @@ const PREF_SYMBOLS_URL = "extensions.gec
 const PREF_GET_SYMBOL_RULES = "extensions.geckoProfiler.getSymbolRules";
 
 const ASYNC_STACKS_ENABLED = Services.prefs.getBoolPref(PREF_ASYNC_STACK, false);
 
 var {
   ExtensionError,
 } = ExtensionUtils;
 
-function parseSym(data) {
+const parseSym = data => {
   const worker = new ChromeWorker("resource://app/modules/ParseSymbols-worker.js");
   const promise = new Promise((resolve, reject) => {
     worker.onmessage = (e) => {
       if (e.data.error) {
         reject(e.data.error);
       } else {
         resolve(e.data.result);
       }
     };
   });
   worker.postMessage(data);
   return promise;
-}
+};
 
 class NMParser {
   constructor() {
     this._addrToSymMap = new Map();
     this._approximateLength = 0;
   }
 
   consume(data) {
@@ -115,40 +115,40 @@ class CppFiltParser {
     return this._results;
   }
 
   _processLine(line) {
     this._results[this._index++] = line.trimRight();
   }
 }
 
-async function readAllData(pipe, processData) {
+const readAllData = async function(pipe, processData) {
   let data;
   while ((data = await pipe.readString())) {
     processData(data);
   }
-}
+};
 
-async function spawnProcess(name, cmdArgs, processData, stdin = null) {
+const spawnProcess = async function(name, cmdArgs, processData, stdin = null) {
   const opts = {
     command: await Subprocess.pathSearch(name),
     arguments: cmdArgs,
   };
   const proc = await Subprocess.call(opts);
 
   if (stdin) {
     const encoder = new TextEncoder("utf-8");
     proc.stdin.write(encoder.encode(stdin));
     proc.stdin.close();
   }
 
   await readAllData(proc.stdout, processData);
-}
+};
 
-async function getSymbolsFromNM(path, arch) {
+const getSymbolsFromNM = async function(path, arch) {
   const parser = new NMParser();
 
   const args = [path];
   if (Services.appinfo.OS === "Darwin") {
     args.unshift("-arch", arch);
   } else {
     // Mac's `nm` doesn't support the demangle option, so we have to
     // post-process the symbols with c++filt.
@@ -168,65 +168,65 @@ async function getSymbolsFromNM(path, ar
     approximateLength = 0;
     for (let [i, symbol] of newSymbols.entries()) {
       approximateLength += symbol.length;
       syms.set(keys[i], symbol);
     }
   }
 
   return ParseSymbols.convertSymsMapToExpectedSymFormat(syms, approximateLength);
-}
+};
 
-function pathComponentsForSymbolFile(debugName, breakpadId) {
+const pathComponentsForSymbolFile = (debugName, breakpadId) => {
   const symName = debugName.replace(/(\.pdb)?$/, ".sym");
   return [debugName, breakpadId, symName];
-}
+};
 
-function urlForSymFile(debugName, breakpadId) {
+const urlForSymFile = (debugName, breakpadId) => {
   const profilerSymbolsURL = Services.prefs.getCharPref(PREF_SYMBOLS_URL,
                                                         "http://symbols.mozilla.org/");
   return profilerSymbolsURL + pathComponentsForSymbolFile(debugName, breakpadId).join("/");
-}
+};
 
-function getContainingObjdirDist(path) {
+const getContainingObjdirDist = path => {
   let curPath = path;
   let curPathBasename = OS.Path.basename(curPath);
   while (curPathBasename) {
     if (curPathBasename === "dist") {
       return curPath;
     }
     const parentDirPath = OS.Path.dirname(curPath);
     if (curPathBasename === "bin") {
       return parentDirPath;
     }
     curPath = parentDirPath;
     curPathBasename = OS.Path.basename(curPath);
   }
   return null;
-}
+};
 
-function filePathForSymFileInObjDir(binaryPath, debugName, breakpadId) {
+const filePathForSymFileInObjDir = (binaryPath, debugName, breakpadId) => {
   // `mach buildsymbols` generates symbol files located
   // at /path/to/objdir/dist/crashreporter-symbols/.
   const objDirDist = getContainingObjdirDist(binaryPath);
   if (!objDirDist) {
     return null;
   }
   return OS.Path.join(objDirDist,
                       "crashreporter-symbols",
                       ...pathComponentsForSymbolFile(debugName, breakpadId));
-}
+};
 
 const symbolCache = new Map();
 
-function primeSymbolStore(libs) {
+const primeSymbolStore = libs => {
   for (const {debugName, breakpadId, path, arch} of libs) {
     symbolCache.set(urlForSymFile(debugName, breakpadId), {path, arch});
   }
-}
+};
 
 const isRunningObserver = {
   _observers: new Set(),
 
   observe(subject, topic, data) {
     switch (topic) {
       case "profiler-started":
       case "profiler-stopped":
--- a/browser/components/extensions/ext-history.js
+++ b/browser/components/extensions/ext-history.js
@@ -23,79 +23,79 @@ const TRANSITION_TO_TRANSITION_TYPES_MAP
   ["manual_subframe", nsINavHistoryService.TRANSITION_FRAMED_LINK],
 ]);
 
 let TRANSITION_TYPE_TO_TRANSITIONS_MAP = new Map();
 for (let [transition, transitionType] of TRANSITION_TO_TRANSITION_TYPES_MAP) {
   TRANSITION_TYPE_TO_TRANSITIONS_MAP.set(transitionType, transition);
 }
 
-function getTransitionType(transition) {
+const getTransitionType = transition => {
   // cannot set a default value for the transition argument as the framework sets it to null
   transition = transition || "link";
   let transitionType = TRANSITION_TO_TRANSITION_TYPES_MAP.get(transition);
   if (!transitionType) {
     throw new Error(`|${transition}| is not a supported transition for history`);
   }
   return transitionType;
-}
+};
 
-function getTransition(transitionType) {
+const getTransition = transitionType => {
   return TRANSITION_TYPE_TO_TRANSITIONS_MAP.get(transitionType) || "link";
-}
+};
 
 /*
  * Converts a nsINavHistoryResultNode into a HistoryItem
  *
  * https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsINavHistoryResultNode
  */
-function convertNodeToHistoryItem(node) {
+const convertNodeToHistoryItem = node => {
   return {
     id: node.pageGuid,
     url: node.uri,
     title: node.title,
     lastVisitTime: PlacesUtils.toDate(node.time).getTime(),
     visitCount: node.accessCount,
   };
-}
+};
 
 /*
  * Converts a nsINavHistoryResultNode into a VisitItem
  *
  * https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsINavHistoryResultNode
  */
-function convertNodeToVisitItem(node) {
+const convertNodeToVisitItem = node => {
   return {
     id: node.pageGuid,
     visitId: node.visitId,
     visitTime: PlacesUtils.toDate(node.time).getTime(),
     referringVisitId: node.fromVisitId,
     transition: getTransition(node.visitType),
   };
-}
+};
 
 /*
  * Converts a nsINavHistoryContainerResultNode into an array of objects
  *
  * https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsINavHistoryContainerResultNode
  */
-function convertNavHistoryContainerResultNode(container, converter) {
+const convertNavHistoryContainerResultNode = (container, converter) => {
   let results = [];
   container.containerOpen = true;
   for (let i = 0; i < container.childCount; i++) {
     let node = container.getChild(i);
     results.push(converter(node));
   }
   container.containerOpen = false;
   return results;
-}
+};
 
 var _observer;
 
-function getObserver() {
+const getHistoryObserver = () => {
   if (!_observer) {
     _observer = {
       onDeleteURI: function(uri, guid, reason) {
         this.emit("visitRemoved", {allHistory: false, urls: [uri.spec]});
       },
       onVisit: function(uri, visitId, time, sessionId, referringId, transitionType, guid, hidden, visitCount, typed) {
         let data = {
           id: guid,
@@ -121,17 +121,17 @@ function getObserver() {
       onDeleteVisits: function(uri, time, guid, reason) {
         this.emit("visitRemoved", {allHistory: false, urls: [uri.spec]});
       },
     };
     EventEmitter.decorate(_observer);
     PlacesUtils.history.addObserver(_observer);
   }
   return _observer;
-}
+};
 
 this.history = class extends ExtensionAPI {
   getAPI(context) {
     return {
       history: {
         addUrl: function(details) {
           let transition, date;
           try {
@@ -219,39 +219,39 @@ this.history = class extends ExtensionAP
           return Promise.resolve(results);
         },
 
         onVisited: new SingletonEventManager(context, "history.onVisited", fire => {
           let listener = (event, data) => {
             fire.sync(data);
           };
 
-          getObserver().on("visited", listener);
+          getHistoryObserver().on("visited", listener);
           return () => {
-            getObserver().off("visited", listener);
+            getHistoryObserver().off("visited", listener);
           };
         }).api(),
 
         onVisitRemoved: new SingletonEventManager(context, "history.onVisitRemoved", fire => {
           let listener = (event, data) => {
             fire.sync(data);
           };
 
-          getObserver().on("visitRemoved", listener);
+          getHistoryObserver().on("visitRemoved", listener);
           return () => {
-            getObserver().off("visitRemoved", listener);
+            getHistoryObserver().off("visitRemoved", listener);
           };
         }).api(),
 
         onTitleChanged: new SingletonEventManager(context, "history.onTitleChanged", fire => {
           let listener = (event, data) => {
             fire.sync(data);
           };
 
-          getObserver().on("titleChanged", listener);
+          getHistoryObserver().on("titleChanged", listener);
           return () => {
-            getObserver().off("titleChanged", listener);
+            getHistoryObserver().off("titleChanged", listener);
           };
         }).api(),
       },
     };
   }
 };
--- a/browser/components/extensions/ext-menus.js
+++ b/browser/components/extensions/ext-menus.js
@@ -293,17 +293,17 @@ var gMenuBuilder = {
   itemsToCleanUp: new Set(),
 };
 
 // Called from pageAction or browserAction popup.
 global.actionContextMenu = function(contextData) {
   gMenuBuilder.buildActionContextMenu(contextData);
 };
 
-function getContexts(contextData) {
+const getMenuContexts = contextData => {
   let contexts = new Set();
 
   if (contextData.inFrame) {
     contexts.add("frame");
   }
 
   if (contextData.isTextSelected) {
     contexts.add("selection");
@@ -350,17 +350,17 @@ function getContexts(contextData) {
   }
 
   // New non-content contexts supported in Firefox are not part of "all".
   if (!contextData.onTab) {
     contexts.add("all");
   }
 
   return contexts;
-}
+};
 
 function MenuItem(extension, createProperties, isRoot = false) {
   this.extension = extension;
   this.children = [];
   this.parent = null;
   this.tabManager = extension.tabManager;
 
   this.setDefaults();
@@ -540,17 +540,17 @@ MenuItem.prototype = {
       info.checked = this.checked;
       info.wasChecked = wasChecked;
     }
 
     return info;
   },
 
   enabledForContext(contextData) {
-    let contexts = getContexts(contextData);
+    let contexts = getMenuContexts(contextData);
     if (!this.contexts.some(n => contexts.has(n))) {
       return false;
     }
 
     let docPattern = this.documentUrlMatchPattern;
     let pageURI = Services.io.newURI(contextData[contextData.inFrame ? "frameUrl" : "pageUrl"]);
     if (docPattern && !docPattern.matches(pageURI)) {
       return false;
--- a/browser/components/extensions/ext-sessions.js
+++ b/browser/components/extensions/ext-sessions.js
@@ -10,17 +10,17 @@ var {
   promiseObserved,
 } = ExtensionUtils;
 
 XPCOMUtils.defineLazyModuleGetter(this, "SessionStore",
                                   "resource:///modules/sessionstore/SessionStore.jsm");
 
 const SS_ON_CLOSED_OBJECTS_CHANGED = "sessionstore-closed-objects-changed";
 
-function getRecentlyClosed(maxResults, extension) {
+const getRecentlyClosed = (maxResults, extension) => {
   let recentlyClosed = [];
 
   // Get closed windows
   let closedWindowData = SessionStore.getClosedWindowData(false);
   for (let window of closedWindowData) {
     recentlyClosed.push({
       lastModified: window.closedAt,
       window: Window.convertFromSessionStoreClosedData(extension, window)});
@@ -34,31 +34,31 @@ function getRecentlyClosed(maxResults, e
         lastModified: tab.closedAt,
         tab: Tab.convertFromSessionStoreClosedData(extension, tab, window)});
     }
   }
 
   // Sort windows and tabs
   recentlyClosed.sort((a, b) => b.lastModified - a.lastModified);
   return recentlyClosed.slice(0, maxResults);
-}
+};
 
-async function createSession(restored, extension, sessionId) {
+const createSession = async function createSession(restored, extension, sessionId) {
   if (!restored) {
     throw new ExtensionError(`Could not restore object using sessionId ${sessionId}.`);
   }
   let sessionObj = {lastModified: Date.now()};
   if (restored instanceof Ci.nsIDOMChromeWindow) {
     await promiseObserved("sessionstore-single-window-restored", subject => subject == restored);
     sessionObj.window = extension.windowManager.convert(restored, {populate: true});
     return sessionObj;
   }
   sessionObj.tab = extension.tabManager.convert(restored);
   return sessionObj;
-}
+};
 
 this.sessions = class extends ExtensionAPI {
   getAPI(context) {
     let {extension} = context;
     return {
       sessions: {
         async getRecentlyClosed(filter) {
           await SessionStore.promiseInitialized;
--- a/browser/components/extensions/ext-windows.js
+++ b/browser/components/extensions/ext-windows.js
@@ -12,19 +12,19 @@ XPCOMUtils.defineLazyModuleGetter(this, 
                                   "resource://gre/modules/AppConstants.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
                                   "resource://gre/modules/PrivateBrowsingUtils.jsm");
 
 var {
   promiseObserved,
 } = ExtensionUtils;
 
-function onXULFrameLoaderCreated({target}) {
+const onXULFrameLoaderCreated = ({target}) => {
   target.messageManager.sendAsyncMessage("AllowScriptsToClose", {});
-}
+};
 
 this.windows = class extends ExtensionAPI {
   getAPI(context) {
     let {extension} = context;
 
     const {windowManager} = extension;
 
     return {