diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 8e1f66ec0..402a3f3ed 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -70,7 +70,7 @@ class AtomApplication @autoUpdateManager = new AutoUpdateManager(@version) @applicationMenu = new ApplicationMenu(@version) - @atomProtocolHandler = new AtomProtocolHandler(@resourcePath) + @atomProtocolHandler = new AtomProtocolHandler(@resourcePath, @safeMode) @listenForArgumentsFromNewProcess() @setupJavaScriptArguments() diff --git a/src/browser/atom-protocol-handler.coffee b/src/browser/atom-protocol-handler.coffee index 6777a21ee..d6c1f567b 100644 --- a/src/browser/atom-protocol-handler.coffee +++ b/src/browser/atom-protocol-handler.coffee @@ -5,16 +5,26 @@ protocol = require 'protocol' # Handles requests with 'atom' protocol. # -# It's created by {AtomApplication} upon instantiation, and is used to create a -# custom resource loader by adding the 'atom' custom protocol. +# It's created by {AtomApplication} upon instantiation and is used to create a +# custom resource loader for 'atom://' URLs. +# +# The following directories are searched in order: +# * ~/.atom/assets +# * ~/.atom/dev/packages (unless in safe mode) +# * ~/.atom/packages +# * RESOURCE_PATH/node_modules +# module.exports = class AtomProtocolHandler - constructor: (@resourcePath) -> - @loadPaths = [ - path.join(app.getHomeDir(), '.atom', 'dev', 'packages') - path.join(app.getHomeDir(), '.atom', 'packages') - path.join(@resourcePath, 'node_modules') - ] + constructor: (resourcePath, safeMode) -> + @loadPaths = [] + @dotAtomDirectory = path.join(app.getHomeDir(), '.atom') + + unless safeMode + @loadPaths.push(path.join(@dotAtomDirectory, 'dev', 'packages')) + + @loadPaths.push(path.join(@dotAtomDirectory, 'packages')) + @loadPaths.push(path.join(resourcePath, 'node_modules')) @registerAtomProtocol() @@ -22,7 +32,14 @@ class AtomProtocolHandler registerAtomProtocol: -> protocol.registerProtocol 'atom', (request) => relativePath = path.normalize(request.url.substr(7)) - for loadPath in @loadPaths - filePath = path.join(loadPath, relativePath) - break if fs.statSyncNoException(filePath).isFile?() - return new protocol.RequestFileJob(filePath) + + if relativePath.indexOf('assets/') is 0 + assetsPath = path.join(@dotAtomDirectory, relativePath) + filePath = assetsPath if fs.statSyncNoException(assetsPath).isFile?() + + unless filePath + for loadPath in @loadPaths + filePath = path.join(loadPath, relativePath) + break if fs.statSyncNoException(filePath).isFile?() + + new protocol.RequestFileJob(filePath)