From d913c2fd97a16e4bd672f8e3ee39ecaea9d1b842 Mon Sep 17 00:00:00 2001 From: Anton Khodakivskiy Date: Sat, 20 Jul 2013 23:44:21 +0300 Subject: [PATCH] Reorganized code, removed memory leaks --- Makefile | 1 - extension/bootstrap.coffee | 48 ++++++-------- extension/packages/button.coffee | 10 +-- extension/packages/commands.coffee | 3 +- .../{includes => packages}/console.coffee | 2 + extension/packages/events.coffee | 2 + extension/packages/help.coffee | 1 + extension/packages/l10n.coffee | 63 ++++++++++--------- .../{includes => packages}/unload.coffee | 2 + extension/packages/utils.coffee | 12 ++++ extension/packages/vim.coffee | 2 +- extension/packages/window-utils.coffee | 1 + 12 files changed, 82 insertions(+), 65 deletions(-) rename extension/{includes => packages}/console.coffee (97%) rename extension/{includes => packages}/unload.coffee (97%) diff --git a/Makefile b/Makefile index 4ce0615..e18262d 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,6 @@ plugin_archive := VimFx.xpi coffee_files = extension/bootstrap.coffee coffee_files += $(wildcard extension/packages/*.coffee) -coffee_files += $(wildcard extension/includes/*.coffee) js_files = $(coffee_files:.coffee=.js) diff --git a/extension/bootstrap.coffee b/extension/bootstrap.coffee index 78df580..95ec0c6 100644 --- a/extension/bootstrap.coffee +++ b/extension/bootstrap.coffee @@ -7,15 +7,13 @@ Cu.import('resource://gre/modules/AddonManager.jsm') # Populate the global namespace with console, require, and include do (global = this) -> - baseURI = Services.io.newURI(__SCRIPT_URI_SPEC__, null, null) - getResourceURI = (path) -> Services.io.newURI(path, null, baseURI) - loader = Cc['@mozilla.org/moz/jssubscript-loader;1'].getService(Ci.mozIJSSubScriptLoader) + baseURI = Services.io.newURI(__SCRIPT_URI_SPEC__, null, null) - include = (src, scope = {}) -> + include = (src, scope) -> try - uri = getResourceURI(src) - loader.loadSubScript(uri.spec, scope) + path = Services.io.newURI(src, null, baseURI).spec + loader.loadSubScript(path, scope) catch error dump("Failed to load #{ src }: #{ error }\n") @@ -29,37 +27,28 @@ do (global = this) -> else scope = require: require - include: include exports: {} include("packages/#{ src }.js", scope) return modules[src] = scope.exports - global.include = include - global.require = require - global.getResourceURI = getResourceURI - global.regexpEscape = (s) -> s and s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') - - # Include into global scope - include("includes/#{ name }.js", global) for name in [ - 'console' - 'unload' - ] - - # Init localization `underscore` method - global._ = require('l10n').l10n('vimfx.properties') - - # Requires for startup/install - { loadCss } = require 'utils' - { addEventListeners } = require 'events' - { getPref } = require 'prefs' - { setButtonInstallPosition - , addToolbarButton } = require 'button' - { watchWindows } = require 'window-utils' + release = -> + for path, scope in modules + for name, value in scope + scope[name] = null + modules = {} # Firefox will call this method on startup/enabling global.startup = (data, reason) -> + # Requires for startup/install + { loadCss } = require 'utils' + { addEventListeners } = require 'events' + { getPref } = require 'prefs' + { setButtonInstallPosition + , addToolbarButton } = require 'button' + { watchWindows } = require 'window-utils' + { unload } = require 'unload' if reason == ADDON_INSTALL # Position the toolbar button right before the default Bookmarks button @@ -71,10 +60,13 @@ do (global = this) -> watchWindows(addEventListeners, 'navigator:browser') watchWindows(addToolbarButton, 'navigator:browser') + unload(release) + # Firefox will call this method on shutdown/disabling global.shutdown = (data, reason) -> # Don't bother to clean up if the browser is shutting down if reason != APP_SHUTDOWN + { unload } = require 'unload' unload() global.install = (data, reason) -> diff --git a/extension/packages/button.coffee b/extension/packages/button.coffee index ee25e8a..ae7f31b 100644 --- a/extension/packages/button.coffee +++ b/extension/packages/button.coffee @@ -3,6 +3,8 @@ { injectHelp } = require 'help' { commandsHelp } = require 'commands' utils = require 'utils' +{ unload } = require 'unload' +{ _ } = require 'l10n' KEYSET_ID = 'vimfx-keyset' BUTTON_ID = 'vimfx-toolbar-button' @@ -61,10 +63,10 @@ restorePosition = (doc, button) -> iconUrl = do -> kinds = - normal: getResourceURI('resources/icon16.png').spec - grey: getResourceURI('resources/icon16-grey.png').spec - red: getResourceURI('resources/icon16-red.png').spec - blacklist: getResourceURI('resources/icon16-blacklist.png').spec + normal: utils.getResourceURI('resources/icon16.png').spec + grey: utils.getResourceURI('resources/icon16-grey.png').spec + red: utils.getResourceURI('resources/icon16-red.png').spec + blacklist: utils.getResourceURI('resources/icon16-blacklist.png').spec return (kind) -> "url(#{ kinds[kind] })" diff --git a/extension/packages/commands.coffee b/extension/packages/commands.coffee index f67102c..dbd3bd2 100644 --- a/extension/packages/commands.coffee +++ b/extension/packages/commands.coffee @@ -3,6 +3,7 @@ hints = require 'hints' help = require 'help' find = require 'find' +{ _ } = require 'l10n' { getPref , setPref , getFirefoxPref } = require 'prefs' @@ -358,7 +359,7 @@ commandsHelp = do (commandGroups) -> hintCharHandler = (vim, keyStr, charCode) -> if keyStr and charCode > 0 # Get char and escape it to avoid problems with String.search - key = regexpEscape(keyStr) + key = utils.regexpEscape(keyStr) # First do a pre match - count how many markers will match with the new character entered if vim.markers.reduce(((v, marker) -> v or marker.willMatch(key)), false) diff --git a/extension/includes/console.coffee b/extension/packages/console.coffee similarity index 97% rename from extension/includes/console.coffee rename to extension/packages/console.coffee index d6d5b49..a4f191b 100644 --- a/extension/includes/console.coffee +++ b/extension/packages/console.coffee @@ -43,3 +43,5 @@ console = do -> expand: -> message('expand', Array.map(arguments, expand)) stacktrace: -> message('stacktrace', stacktrace()) } + +exports.console = console diff --git a/extension/packages/events.coffee b/extension/packages/events.coffee index 2707d51..42ec48d 100644 --- a/extension/packages/events.coffee +++ b/extension/packages/events.coffee @@ -4,6 +4,8 @@ keyUtils = require 'key-utils' { Vim } = require 'vim' { getPref } = require 'prefs' { setWindowBlacklisted } = require 'button' +{ unload } = require 'unload' +{ console } = require 'console' { interfaces: Ci } = Components diff --git a/extension/packages/help.coffee b/extension/packages/help.coffee index 2c04ab8..e62c1f5 100644 --- a/extension/packages/help.coffee +++ b/extension/packages/help.coffee @@ -1,5 +1,6 @@ utils = require 'utils' prefs = require 'prefs' +{ _ } = require 'l10n' CONTAINER_ID = 'VimFxHelpDialogContainer' diff --git a/extension/packages/l10n.coffee b/extension/packages/l10n.coffee index bca76f3..646965f 100644 --- a/extension/packages/l10n.coffee +++ b/extension/packages/l10n.coffee @@ -1,5 +1,10 @@ { classes: Cc, interfaces: Ci } = Components +PROPERTIES_FILE = 'vimfx.properties' +DEFAULT_LOCALE = 'en-US' + +utils = require 'utils' +{ unload } = require 'unload' { getFirefoxPref } = require 'prefs' # Generates the underscore function @@ -12,44 +17,42 @@ l10n = do -> getStr = (aStrBundle, aKey) -> try return aStrBundle.GetStringFromName(aKey) - return (filename, defaultLocale = 'en-US') -> - - filePath = (locale) -> - getResourceURI("locale/#{ locale }/#{ filename }").spec + filePath = (locale) -> + utils.getResourceURI("locale/#{ locale }/#{ PROPERTIES_FILE }").spec - # Folder in the format `en-US`, e.g. locale/en-US/vimfx.properties - defaultBundle = Services.strings.createBundle(filePath(locale)) + # Folder in the format `en-US`, e.g. locale/en-US/vimfx.properties + defaultBundle = Services.strings.createBundle(filePath(locale)) - if locale_base = locale.match(splitter) - # Folder in the basic format: `en`, e.g. locale/en/vimfx.properties - defaultBasicBundle = Services.strings.createBundle(filePath(locale_base[1])) + if locale_base = locale.match(splitter) + # Folder in the basic format: `en`, e.g. locale/en/vimfx.properties + defaultBasicBundle = Services.strings.createBundle(filePath(locale_base[1])) - # Folder named after `defaultLocale` - addonsDefaultBundle = Services.strings.createBundle(filePath(defaultLocale)) + # Folder named after extension default locale + addonsDefaultBundle = Services.strings.createBundle(filePath(DEFAULT_LOCALE)) - # The underscore function - l10n_underscore = (aKey, aLocale) -> - localeBundle = null - localeBasicBundle = null + # The underscore function + l10n_underscore = (aKey, aLocale) -> + localeBundle = null + localeBasicBundle = null - # Yet another way to specify a folder: both `en` or `en-US` are possible here - if aLocale - localeBundle = Services.strings.createBundle(filePath(aLocale)) + # Yet another way to specify a folder: both `en` or `en-US` are possible here + if aLocale + localeBundle = Services.strings.createBundle(filePath(aLocale)) - # And locale version without the region, e.g. `en` - if locale_base = aLocale.match(splitter) - localeBasicBundle = Services.strings.createBundle(filePath(locale_base[1])) + # And locale version without the region, e.g. `en` + if locale_base = aLocale.match(splitter) + localeBasicBundle = Services.strings.createBundle(filePath(locale_base[1])) - aVal = getStr(localeBundle, aKey) \ - or getStr(localeBasicBundle, aKey) \ - or (defaultBundle && (getStr(defaultBundle, aKey) or (defaultBundle = null))) \ - or (defaultBasicBundle && (getStr(defaultBasicBundle, aKey) or (defaultBasicBundle = null))) \ - or getStr(addonsDefaultBundle, aKey) + aVal = getStr(localeBundle, aKey) \ + or getStr(localeBasicBundle, aKey) \ + or (defaultBundle && (getStr(defaultBundle, aKey) or (defaultBundle = null))) \ + or (defaultBasicBundle && (getStr(defaultBasicBundle, aKey) or (defaultBasicBundle = null))) \ + or getStr(addonsDefaultBundle, aKey) - return aVal + return aVal - unload(Services.strings.flushBundles) + unload(Services.strings.flushBundles) - return l10n_underscore + return l10n_underscore -exports.l10n = l10n +exports._ = l10n diff --git a/extension/includes/unload.coffee b/extension/packages/unload.coffee similarity index 97% rename from extension/includes/unload.coffee rename to extension/packages/unload.coffee index 4a76950..f06db3a 100644 --- a/extension/includes/unload.coffee +++ b/extension/packages/unload.coffee @@ -31,3 +31,5 @@ unload = do -> unloaders.splice(index, 1) return removeUnloader + +exports.unload = unload diff --git a/extension/packages/utils.coffee b/extension/packages/utils.coffee index 519d0bc..55e429e 100644 --- a/extension/packages/utils.coffee +++ b/extension/packages/utils.coffee @@ -1,3 +1,5 @@ +{ unload } = require 'unload' +{ console } = require 'console' { getPref , getDefaultPref } = require 'prefs' @@ -253,6 +255,14 @@ getHintChars = do -> return hintChars +# Return URI to some file in the extension packaged as resource +getResourceURI = do -> + baseURI = Services.io.newURI(__SCRIPT_URI_SPEC__, null, null) + return (path) -> Services.io.newURI(path, null, baseURI) + +# Escape string to render it usable in regular expressions +regexpEscape = (s) -> s and s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + exports.Bucket = Bucket exports.getCurrentTabWindow = getCurrentTabWindow exports.getEventWindow = getEventWindow @@ -278,3 +288,5 @@ exports.parseHTML = parseHTML exports.isURL = isURL exports.browserSearchSubmission = browserSearchSubmission exports.getHintChars = getHintChars +exports.getResourceURI = getResourceURI +exports.regexpEscape = regexpEscape diff --git a/extension/packages/vim.coffee b/extension/packages/vim.coffee index dbca2b4..9853ef7 100644 --- a/extension/packages/vim.coffee +++ b/extension/packages/vim.coffee @@ -35,7 +35,7 @@ class Vim result = maybeCommand(@keys.concat([keyStr])) else if !keyboardEvent.ctrlKey and !keyboardEvent.metaKey if @mode == MODE_HINTS - result = utils.getHintChars().search(regexpEscape(keyStr)) > -1 + result = utils.getHintChars().search(utils.regexpEscape(keyStr)) > -1 if result @lastKeyStr = keyStr diff --git a/extension/packages/window-utils.coffee b/extension/packages/window-utils.coffee index 66422fb..45ba325 100644 --- a/extension/packages/window-utils.coffee +++ b/extension/packages/window-utils.coffee @@ -1,3 +1,4 @@ +{ unload } = require 'unload' # # Waits for a browser window to finish loading before running the callback # -- 2.39.3