diff --git a/.gitignore b/.gitignore index 1257ab371..dee2ac3e9 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ npm-debug.log debug.log /tags /atom-shell/ +/electron/ docs/output docs/includes spec/fixtures/evil-files/ diff --git a/.travis.yml b/.travis.yml index b1fe95f83..c9157d207 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,8 @@ env: - ATOM_ACCESS_TOKEN=da809a6077bb1b0aa7c5623f7b2d5f1fec2faae4 - NODE_VERSION=0.12 +compiler: clang + matrix: include: - os: linux diff --git a/build/Gruntfile.coffee b/build/Gruntfile.coffee index d21e8fa4a..3a7df725b 100644 --- a/build/Gruntfile.coffee +++ b/build/Gruntfile.coffee @@ -23,7 +23,7 @@ module.exports = (grunt) -> grunt.loadNpmTasks('grunt-contrib-coffee') grunt.loadNpmTasks('grunt-contrib-less') grunt.loadNpmTasks('grunt-shell') - grunt.loadNpmTasks('grunt-download-atom-shell') + grunt.loadNpmTasks('grunt-download-electron') grunt.loadNpmTasks('grunt-electron-installer') grunt.loadNpmTasks('grunt-peg') grunt.loadTasks('tasks') @@ -31,10 +31,6 @@ module.exports = (grunt) -> # This allows all subsequent paths to the relative to the root of the repo grunt.file.setBase(path.resolve('..')) - if not grunt.option('verbose') - grunt.log.writeln = (args...) -> grunt.log - grunt.log.write = (args...) -> grunt.log - [major, minor, patch] = packageJson.version.split('.') tmpDir = os.tmpdir() appName = if process.platform is 'darwin' then 'Atom.app' else 'Atom' @@ -43,7 +39,7 @@ module.exports = (grunt) -> installDir = grunt.option('install-dir') home = if process.platform is 'win32' then process.env.USERPROFILE else process.env.HOME - atomShellDownloadDir = path.join(home, '.atom', 'atom-shell') + electronDownloadDir = path.join(home, '.atom', 'electron') symbolsDir = path.join(buildDir, 'Atom.breakpad.syms') shellAppDir = path.join(buildDir, appName) @@ -225,11 +221,11 @@ module.exports = (grunt) -> 'static/**/*.less' ] - 'download-atom-shell': - version: packageJson.atomShellVersion - outputDir: 'atom-shell' - downloadDir: atomShellDownloadDir - rebuild: true # rebuild native modules after atom-shell is updated + 'download-electron': + version: packageJson.electronVersion + outputDir: 'electron' + downloadDir: electronDownloadDir + rebuild: true # rebuild native modules after electron is updated token: process.env.ATOM_ACCESS_TOKEN 'create-windows-installer': @@ -254,7 +250,7 @@ module.exports = (grunt) -> grunt.registerTask('lint', ['standard', 'coffeelint', 'csslint', 'lesslint']) grunt.registerTask('test', ['shell:kill-atom', 'run-specs']) - ciTasks = ['output-disk-space', 'download-atom-shell', 'download-atom-shell-chromedriver', 'build'] + ciTasks = ['output-disk-space', 'download-electron', 'download-electron-chromedriver', 'build'] ciTasks.push('dump-symbols') if process.platform isnt 'win32' ciTasks.push('set-version', 'check-licenses', 'lint', 'generate-asar') ciTasks.push('mkdeb') if process.platform is 'linux' @@ -266,6 +262,7 @@ module.exports = (grunt) -> ciTasks.push('publish-build') unless process.env.TRAVIS grunt.registerTask('ci', ciTasks) - defaultTasks = ['download-atom-shell', 'download-atom-shell-chromedriver', 'build', 'set-version', 'generate-asar'] - defaultTasks.push 'install' unless process.platform is 'linux' + defaultTasks = ['download-electron', 'download-electron-chromedriver', 'build', 'set-version', 'generate-asar'] + unless process.platform is 'linux' or grunt.option('no-install') + defaultTasks.push 'install' grunt.registerTask('default', defaultTasks) diff --git a/build/package.json b/build/package.json index 3298b4a63..a909f8cd4 100644 --- a/build/package.json +++ b/build/package.json @@ -6,7 +6,7 @@ "url": "https://github.com/atom/atom.git" }, "dependencies": { - "asar": "^0.5.0", + "asar": "^0.7.1", "async": "~0.2.9", "donna": "1.0.10", "formidable": "~1.0.14", @@ -20,8 +20,8 @@ "grunt-contrib-coffee": "~0.12.0", "grunt-contrib-csslint": "~0.2.0", "grunt-contrib-less": "~0.8.0", - "grunt-cson": "0.14.0", - "grunt-download-atom-shell": "~0.15.1", + "grunt-cson": "0.15.0", + "grunt-download-electron": "^2.1.1", "grunt-electron-installer": "1.0.0", "grunt-lesslint": "0.17.0", "grunt-peg": "~1.1.0", diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee index 6c2c4f309..803249c1c 100644 --- a/build/tasks/build-task.coffee +++ b/build/tasks/build-task.coffee @@ -15,9 +15,17 @@ module.exports = (grunt) -> mkdir path.dirname(buildDir) if process.platform is 'darwin' - cp 'atom-shell/Atom.app', shellAppDir, filter: /default_app/ + cp 'electron/Electron.app', shellAppDir, filter: /default_app/ + fs.renameSync path.join(shellAppDir, 'Contents', 'MacOS', 'Electron'), path.join(shellAppDir, 'Contents', 'MacOS', 'Atom') + fs.renameSync path.join(shellAppDir, 'Contents', 'Frameworks', 'Electron Helper.app'), path.join(shellAppDir, 'Contents', 'Frameworks', 'Atom Helper.app') + fs.renameSync path.join(shellAppDir, 'Contents', 'Frameworks', 'Atom Helper.app', 'Contents', 'MacOS', 'Electron Helper'), path.join(shellAppDir, 'Contents', 'Frameworks', 'Atom Helper.app', 'Contents', 'MacOS', 'Atom Helper') else - cp 'atom-shell', shellAppDir, filter: /default_app/ + cp 'electron', shellAppDir, filter: /default_app/ + + if process.platform is 'win32' + fs.renameSync path.join(shellAppDir, 'electron.exe'), path.join(shellAppDir, 'atom.exe') + else + fs.renameSync path.join(shellAppDir, 'electron'), path.join(shellAppDir, 'atom') mkdir appDir diff --git a/build/tasks/clean-task.coffee b/build/tasks/clean-task.coffee index 97f0a9105..498bf9b4c 100644 --- a/build/tasks/clean-task.coffee +++ b/build/tasks/clean-task.coffee @@ -12,6 +12,7 @@ module.exports = (grunt) -> rm require('../src/less-compile-cache').cacheDir rm path.join(tmpdir, 'atom-cached-atom-shells') rm 'atom-shell' + rm 'electron' grunt.registerTask 'clean', 'Delete all the build files', -> homeDir = process.env[if process.platform is 'win32' then 'USERPROFILE' else 'HOME'] diff --git a/package.json b/package.json index f121bd4c8..fa3e6e273 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "url": "https://github.com/atom/atom/issues" }, "license": "MIT", - "atomShellVersion": "0.22.3", + "electronVersion": "0.30.6", "dependencies": { "async": "0.2.6", "atom-keymap": "^5.1.10", @@ -39,7 +39,7 @@ "mixto": "^1", "normalize-package-data": "^2.0.0", "nslog": "^2.0.0", - "oniguruma": "^4.1", + "oniguruma": "^4.2.2", "pathwatcher": "^4.4.3", "property-accessors": "^1.1.3", "q": "^1.1.2", diff --git a/script/cibuild b/script/cibuild index 08ff65c6e..d366af79a 100755 --- a/script/cibuild +++ b/script/cibuild @@ -22,11 +22,16 @@ function loadEnvironmentVariables(filePath) { } function readEnvironmentVariables() { - if (process.platform === 'win32') + if (process.platform === 'win32') { loadEnvironmentVariables(path.resolve('/jenkins/config/atomcredentials')); - else if (process.platform === 'darwin') { + } else if (process.platform === 'darwin') { loadEnvironmentVariables('/var/lib/jenkins/config/atomcredentials'); loadEnvironmentVariables('/var/lib/jenkins/config/xcodekeychain'); + } else if (process.platform === 'linux') { + // Use Clang for building native code, the GCC on Precise is too old. + process.env.CC = 'clang'; + process.env.CXX = 'clang++'; + process.env.npm_config_clang = '1'; } } diff --git a/script/clean b/script/clean index d9c6c1a72..6a7824756 100755 --- a/script/clean +++ b/script/clean @@ -26,6 +26,7 @@ var commands = [ [home, '.atom', '.npm'], [home, '.atom', 'compile-cache'], [home, '.atom', 'atom-shell'], + [home, '.atom', 'electron'], [tmpdir, 'atom-build'], [tmpdir, 'atom-cached-atom-shells'], ]; diff --git a/src/browser/main.coffee b/src/browser/main.coffee index 33a58289c..8e5444921 100644 --- a/src/browser/main.coffee +++ b/src/browser/main.coffee @@ -13,6 +13,9 @@ start = -> setupCompileCache() return if handleStartupEventWithSquirrel() + # NB: This prevents Win10 from showing dupe items in the taskbar + app.setAppUserModelId('com.squirrel.atom.atom') + args = parseCommandLine() addPathToOpen = (event, pathToOpen) -> diff --git a/src/command-registry.coffee b/src/command-registry.coffee index e41a637ef..0ad8a7fe2 100644 --- a/src/command-registry.coffee +++ b/src/command-registry.coffee @@ -175,12 +175,8 @@ class CommandRegistry # * `commandName` {String} indicating the name of the command to dispatch. dispatch: (target, commandName, detail) -> event = new CustomEvent(commandName, {bubbles: true, detail}) - eventWithTarget = Object.create event, - target: value: target - preventDefault: value: -> - stopPropagation: value: -> - stopImmediatePropagation: value: -> - @handleCommandEvent(eventWithTarget) + Object.defineProperty(event, 'target', value: target) + @handleCommandEvent(event) # Public: Invoke the given callback before dispatching a command event. # @@ -208,34 +204,36 @@ class CommandRegistry @selectorBasedListenersByCommandName[commandName] = listeners.slice() return - handleCommandEvent: (originalEvent) => + handleCommandEvent: (event) => propagationStopped = false immediatePropagationStopped = false matched = false - currentTarget = originalEvent.target + currentTarget = event.target + {preventDefault, stopPropagation, stopImmediatePropagation, abortKeyBinding} = event - syntheticEvent = Object.create originalEvent, - eventPhase: value: Event.BUBBLING_PHASE - currentTarget: get: -> currentTarget - preventDefault: value: -> - originalEvent.preventDefault() - stopPropagation: value: -> - originalEvent.stopPropagation() - propagationStopped = true - stopImmediatePropagation: value: -> - originalEvent.stopImmediatePropagation() - propagationStopped = true - immediatePropagationStopped = true - abortKeyBinding: value: -> - originalEvent.abortKeyBinding?() + dispatchedEvent = new CustomEvent(event.type, {bubbles: true, detail: event.detail}) + Object.defineProperty dispatchedEvent, 'eventPhase', value: Event.BUBBLING_PHASE + Object.defineProperty dispatchedEvent, 'currentTarget', get: -> currentTarget + Object.defineProperty dispatchedEvent, 'target', value: currentTarget + Object.defineProperty dispatchedEvent, 'preventDefault', value: -> + event.preventDefault() + Object.defineProperty dispatchedEvent, 'stopPropagation', value: -> + event.stopPropagation() + propagationStopped = true + Object.defineProperty dispatchedEvent, 'stopImmediatePropagation', value: -> + event.stopImmediatePropagation() + propagationStopped = true + immediatePropagationStopped = true + Object.defineProperty dispatchedEvent, 'abortKeyBinding', value: -> + event.abortKeyBinding?() - @emitter.emit 'will-dispatch', syntheticEvent + @emitter.emit 'will-dispatch', dispatchedEvent loop - listeners = @inlineListenersByCommandName[originalEvent.type]?.get(currentTarget) ? [] + listeners = @inlineListenersByCommandName[event.type]?.get(currentTarget) ? [] if currentTarget.webkitMatchesSelector? selectorBasedListeners = - (@selectorBasedListenersByCommandName[originalEvent.type] ? []) + (@selectorBasedListenersByCommandName[event.type] ? []) .filter (listener) -> currentTarget.webkitMatchesSelector(listener.selector) .sort (a, b) -> a.compare(b) listeners = listeners.concat(selectorBasedListeners) @@ -244,13 +242,13 @@ class CommandRegistry for listener in listeners break if immediatePropagationStopped - listener.callback.call(currentTarget, syntheticEvent) + listener.callback.call(currentTarget, dispatchedEvent) break if currentTarget is window break if propagationStopped currentTarget = currentTarget.parentNode ? window - @emitter.emit 'did-dispatch', syntheticEvent + @emitter.emit 'did-dispatch', dispatchedEvent matched