mirror of
https://github.com/atom/atom.git
synced 2026-04-28 03:01:47 -04:00
Merge branch 'master' into tj-upgrade-electron
This commit is contained in:
@@ -46,8 +46,6 @@ deploy: off
|
||||
artifacts:
|
||||
- path: out\AtomSetup.exe
|
||||
name: AtomSetup.exe
|
||||
- path: out\AtomSetup.msi
|
||||
name: AtomSetup.msi
|
||||
- path: out\atom-windows.zip
|
||||
name: atom-windows.zip
|
||||
- path: out\RELEASES
|
||||
|
||||
13
package.json
13
package.json
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "atom",
|
||||
"productName": "Atom",
|
||||
"version": "1.18.0-dev",
|
||||
"version": "1.19.0-dev",
|
||||
"description": "A hackable text editor for the 21st Century.",
|
||||
"main": "./src/main-process/main.js",
|
||||
"repository": {
|
||||
@@ -39,7 +39,6 @@
|
||||
"grim": "1.5.0",
|
||||
"jasmine-json": "~0.0",
|
||||
"jasmine-tagged": "^1.1.4",
|
||||
"jquery": "2.1.4",
|
||||
"key-path-helpers": "^0.4.0",
|
||||
"less-cache": "1.1.0",
|
||||
"line-top-index": "0.3.1",
|
||||
@@ -88,8 +87,8 @@
|
||||
"about": "1.7.6",
|
||||
"archive-view": "0.63.2",
|
||||
"autocomplete-atom-api": "0.10.1",
|
||||
"autocomplete-css": "0.16.1",
|
||||
"autocomplete-html": "0.7.3",
|
||||
"autocomplete-css": "0.16.2",
|
||||
"autocomplete-html": "0.8.0",
|
||||
"autocomplete-plus": "2.35.4",
|
||||
"autocomplete-snippets": "1.11.0",
|
||||
"autoflow": "0.29.0",
|
||||
@@ -105,7 +104,7 @@
|
||||
"exception-reporting": "0.41.4",
|
||||
"find-and-replace": "0.208.1",
|
||||
"fuzzy-finder": "1.5.7",
|
||||
"github": "0.0.6",
|
||||
"github": "0.0.9",
|
||||
"git-diff": "1.3.6",
|
||||
"go-to-line": "0.32.1",
|
||||
"grammar-selector": "0.49.4",
|
||||
@@ -119,13 +118,13 @@
|
||||
"notifications": "0.67.1",
|
||||
"open-on-github": "1.2.1",
|
||||
"package-generator": "1.1.1",
|
||||
"settings-view": "0.249.5",
|
||||
"settings-view": "0.250.0",
|
||||
"snippets": "1.1.4",
|
||||
"spell-check": "0.71.4",
|
||||
"status-bar": "1.8.8",
|
||||
"styleguide": "0.49.6",
|
||||
"symbols-view": "0.116.0",
|
||||
"tabs": "0.105.5",
|
||||
"tabs": "0.106.0",
|
||||
"timecop": "0.36.0",
|
||||
"tree-view": "0.217.0-8",
|
||||
"update-package-dependencies": "0.11.0",
|
||||
|
||||
@@ -18,6 +18,7 @@ module.exports = (packagedAppPath, codeSign) => {
|
||||
iconUrl: `https://raw.githubusercontent.com/atom/atom/master/resources/app-icons/${CONFIG.channel}/atom.ico`,
|
||||
loadingGif: path.join(CONFIG.repositoryRootPath, 'resources', 'win', 'loading.gif'),
|
||||
outputDirectory: CONFIG.buildOutputPath,
|
||||
noMsi: true,
|
||||
remoteReleases: `https://atom.io/api/updates${archSuffix}?version=${CONFIG.appMetadata.version}`,
|
||||
setupIcon: path.join(CONFIG.repositoryRootPath, 'resources', 'app-icons', CONFIG.channel, 'atom.ico')
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"electron-link": "0.0.24",
|
||||
"electron-mksnapshot": "~1.6",
|
||||
"electron-packager": "7.3.0",
|
||||
"electron-winstaller": "2.5.1",
|
||||
"electron-winstaller": "2.5.2",
|
||||
"fs-extra": "0.30.0",
|
||||
"glob": "7.0.3",
|
||||
"joanna": "0.0.8",
|
||||
|
||||
@@ -110,6 +110,7 @@ for (let packageName in CONFIG.appMetadata.packageDependencies) {
|
||||
const cp = childProcess.spawn(executablePath, testArguments)
|
||||
let stderrOutput = ''
|
||||
cp.stderr.on('data', data => stderrOutput += data)
|
||||
cp.stdout.on('data', data => stderrOutput += data)
|
||||
cp.on('error', error => {
|
||||
finalize()
|
||||
callback(error)
|
||||
|
||||
@@ -17,7 +17,7 @@ describe('Dock', () => {
|
||||
})
|
||||
|
||||
describe('when a dock is hidden', () => {
|
||||
it('transfers focus back to the active center pane', () => {
|
||||
it('transfers focus back to the active center pane if the dock had focus', () => {
|
||||
jasmine.attachToDOM(atom.workspace.getElement())
|
||||
const dock = atom.workspace.getLeftDock()
|
||||
dock.activate()
|
||||
@@ -31,6 +31,19 @@ describe('Dock', () => {
|
||||
|
||||
dock.toggle()
|
||||
expect(document.activeElement).toBe(atom.workspace.getCenter().getActivePane().getElement())
|
||||
|
||||
// Don't change focus if the dock was not focused in the first place
|
||||
const modalElement = document.createElement('div')
|
||||
modalElement.setAttribute('tabindex', -1)
|
||||
atom.workspace.addModalPanel({item: modalElement})
|
||||
modalElement.focus()
|
||||
expect(document.activeElement).toBe(modalElement)
|
||||
|
||||
dock.show()
|
||||
expect(document.activeElement).toBe(modalElement)
|
||||
|
||||
dock.hide()
|
||||
expect(document.activeElement).toBe(modalElement)
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -328,10 +328,15 @@ describe "PackageManager", ->
|
||||
it "requires the main module, loads the config schema and activates keymaps, menus and settings without reactivating them during package activation", ->
|
||||
availablePackage = atom.packages.getAvailablePackages().find (p) -> p.name is 'spell-check'
|
||||
availablePackage.isBundled = true
|
||||
metadata = atom.packages.loadPackageMetadata(availablePackage)
|
||||
expect(atom.packages.preloadedPackages[availablePackage.name]).toBeUndefined()
|
||||
expect(atom.packages.isPackageLoaded(availablePackage.name)).toBe(false)
|
||||
|
||||
metadata = atom.packages.loadPackageMetadata(availablePackage)
|
||||
atom.packages.packagesCache = {}
|
||||
atom.packages.packagesCache[availablePackage.name] = {
|
||||
main: path.join(availablePackage.path, metadata.main),
|
||||
grammarPaths: []
|
||||
}
|
||||
preloadedPackage = atom.packages.preloadPackage(
|
||||
availablePackage.name,
|
||||
{
|
||||
@@ -345,14 +350,15 @@ describe "PackageManager", ->
|
||||
expect(preloadedPackage.mainModule).toBeTruthy()
|
||||
expect(preloadedPackage.configSchemaRegisteredOnLoad).toBeTruthy()
|
||||
|
||||
atom.packages.loadAvailablePackage(availablePackage)
|
||||
|
||||
spyOn(atom.keymaps, 'add')
|
||||
spyOn(atom.menu, 'add')
|
||||
spyOn(atom.contextMenu, 'add')
|
||||
spyOn(atom.config, 'setSchema')
|
||||
atom.packages.activatePackage(availablePackage.name)
|
||||
|
||||
atom.packages.loadAvailablePackage(availablePackage)
|
||||
expect(preloadedPackage.getMainModulePath()).toBe(path.join(availablePackage.path, metadata.main))
|
||||
|
||||
atom.packages.activatePackage(availablePackage.name)
|
||||
expect(atom.keymaps.add).not.toHaveBeenCalled()
|
||||
expect(atom.menu.add).not.toHaveBeenCalled()
|
||||
expect(atom.contextMenu.add).not.toHaveBeenCalled()
|
||||
@@ -366,10 +372,15 @@ describe "PackageManager", ->
|
||||
it "deactivates disabled keymaps during package activation", ->
|
||||
availablePackage = atom.packages.getAvailablePackages().find (p) -> p.name is 'spell-check'
|
||||
availablePackage.isBundled = true
|
||||
metadata = atom.packages.loadPackageMetadata(availablePackage)
|
||||
expect(atom.packages.preloadedPackages[availablePackage.name]).toBeUndefined()
|
||||
expect(atom.packages.isPackageLoaded(availablePackage.name)).toBe(false)
|
||||
|
||||
metadata = atom.packages.loadPackageMetadata(availablePackage)
|
||||
atom.packages.packagesCache = {}
|
||||
atom.packages.packagesCache[availablePackage.name] = {
|
||||
main: path.join(availablePackage.path, metadata.main),
|
||||
grammarPaths: []
|
||||
}
|
||||
preloadedPackage = atom.packages.preloadPackage(
|
||||
availablePackage.name,
|
||||
{
|
||||
|
||||
@@ -2720,6 +2720,22 @@ describe "TextEditor", ->
|
||||
expect(editor.isFoldedAtBufferRow(6)).toBeFalsy()
|
||||
expect(editor.lineTextForBufferRow(6)).toBe " if (items.length <= 1) return items;"
|
||||
|
||||
describe "when the last line of selection does not end with a valid line ending", ->
|
||||
it "appends line ending to last line and moves the lines spanned by the selection to the preceeding row", ->
|
||||
expect(editor.lineTextForBufferRow(9)).toBe " };"
|
||||
expect(editor.lineTextForBufferRow(10)).toBe ""
|
||||
expect(editor.lineTextForBufferRow(11)).toBe " return sort(Array.apply(this, arguments));"
|
||||
expect(editor.lineTextForBufferRow(12)).toBe "};"
|
||||
|
||||
editor.setSelectedBufferRange([[10, 0], [12, 2]])
|
||||
editor.moveLineUp()
|
||||
|
||||
expect(editor.getSelectedBufferRange()).toEqual [[9, 0], [11, 2]]
|
||||
expect(editor.lineTextForBufferRow(9)).toBe ""
|
||||
expect(editor.lineTextForBufferRow(10)).toBe " return sort(Array.apply(this, arguments));"
|
||||
expect(editor.lineTextForBufferRow(11)).toBe "};"
|
||||
expect(editor.lineTextForBufferRow(12)).toBe " };"
|
||||
|
||||
describe "when there are multiple selections", ->
|
||||
describe "when all the selections span different lines", ->
|
||||
describe "when there is no folds", ->
|
||||
|
||||
@@ -2486,7 +2486,7 @@ i = /test/; #FIXME\
|
||||
waitsForPromise(() => atom.workspace.open())
|
||||
})
|
||||
|
||||
it('closes the active pane item, or the active pane if it is empty, or the current window if there is only the empty root pane', async () => {
|
||||
it('closes the active center pane item, or the active center pane if it is empty, or the current window if there is only the empty root pane in the center', async () => {
|
||||
atom.config.set('core.destroyEmptyPanes', false)
|
||||
|
||||
const pane1 = atom.workspace.getActivePane()
|
||||
@@ -2509,6 +2509,7 @@ i = /test/; #FIXME\
|
||||
expect(pane1.getItems().length).toBe(0)
|
||||
expect(atom.workspace.getCenter().getPanes().length).toBe(1)
|
||||
|
||||
// The dock items should not be closed
|
||||
await atom.workspace.open({
|
||||
getTitle: () => 'Permanent Dock Item',
|
||||
element: document.createElement('div'),
|
||||
@@ -2523,13 +2524,6 @@ i = /test/; #FIXME\
|
||||
|
||||
expect(atom.workspace.getLeftDock().getPaneItems().length).toBe(2)
|
||||
atom.workspace.closeActivePaneItemOrEmptyPaneOrWindow()
|
||||
expect(atom.workspace.getLeftDock().getPaneItems().length).toBe(1)
|
||||
atom.workspace.closeActivePaneItemOrEmptyPaneOrWindow()
|
||||
expect(atom.workspace.getLeftDock().getPaneItems().length).toBe(1)
|
||||
expect(atom.close).not.toHaveBeenCalled()
|
||||
|
||||
atom.workspace.getCenter().activate()
|
||||
atom.workspace.closeActivePaneItemOrEmptyPaneOrWindow()
|
||||
expect(atom.close).toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
|
||||
@@ -34,6 +34,16 @@ const configSchema = {
|
||||
|
||||
description: 'List of names of installed packages which are not loaded at startup.'
|
||||
},
|
||||
versionPinnedPackages: {
|
||||
type: 'array',
|
||||
default: [],
|
||||
|
||||
items: {
|
||||
type: 'string'
|
||||
},
|
||||
|
||||
description: 'List of names of installed packages which are not automatically updated.'
|
||||
},
|
||||
customFileTypes: {
|
||||
type: 'object',
|
||||
default: {},
|
||||
|
||||
@@ -151,7 +151,7 @@ module.exports = class Dock {
|
||||
|
||||
this.state = nextState
|
||||
this.render(this.state)
|
||||
if (didHide) this.didHide()
|
||||
if (didHide) this.didHide(this)
|
||||
}
|
||||
|
||||
render (state) {
|
||||
|
||||
@@ -73,6 +73,8 @@ class PackageManager
|
||||
@loadedPackages = {}
|
||||
@preloadedPackages = {}
|
||||
@packageStates = {}
|
||||
@packagesCache = packageJSON._atomPackages ? {}
|
||||
@packageDependencies = packageJSON.packageDependencies ? {}
|
||||
@triggeredActivationHooks.clear()
|
||||
|
||||
###
|
||||
|
||||
@@ -67,7 +67,7 @@ class PaneElement extends HTMLElement
|
||||
|
||||
activated: ->
|
||||
@isActivating = true
|
||||
@focus()
|
||||
@focus() unless @hasFocus() # Don't steal focus from children.
|
||||
@isActivating = false
|
||||
|
||||
activeStatusChanged: (active) ->
|
||||
|
||||
@@ -1208,7 +1208,7 @@ class TextEditor extends Model
|
||||
|
||||
# Delete lines spanned by selection and insert them on the preceding buffer row
|
||||
lines = @buffer.getTextInRange(linesRange)
|
||||
lines += @buffer.lineEndingForRow(linesRange.end.row - 1) unless lines[lines.length - 1] is '\n'
|
||||
lines += @buffer.lineEndingForRow(linesRange.end.row - 2) unless lines[lines.length - 1] is '\n'
|
||||
@buffer.delete(linesRange)
|
||||
@buffer.insert([precedingRow, 0], lines)
|
||||
|
||||
|
||||
@@ -470,8 +470,12 @@ module.exports = class Workspace extends Model {
|
||||
}
|
||||
}
|
||||
|
||||
didHideDock () {
|
||||
this.getCenter().activate()
|
||||
didHideDock (dock) {
|
||||
const {activeElement} = document
|
||||
const dockElement = dock.getElement()
|
||||
if (dockElement === activeElement || dockElement.contains(activeElement)) {
|
||||
this.getCenter().activate()
|
||||
}
|
||||
}
|
||||
|
||||
setDraggingItem (draggingItem) {
|
||||
@@ -1307,7 +1311,7 @@ module.exports = class Workspace extends Model {
|
||||
// {::saveActivePaneItemAs} # will be called instead. This method does nothing
|
||||
// if the active item does not implement a `.save` method.
|
||||
saveActivePaneItem () {
|
||||
this.getActivePane().saveActiveItem()
|
||||
this.getCenter().getActivePane().saveActiveItem()
|
||||
}
|
||||
|
||||
// Prompt the user for a path and save the active pane item to it.
|
||||
@@ -1316,7 +1320,7 @@ module.exports = class Workspace extends Model {
|
||||
// `.saveAs` on the item with the selected path. This method does nothing if
|
||||
// the active item does not implement a `.saveAs` method.
|
||||
saveActivePaneItemAs () {
|
||||
this.getActivePane().saveActiveItemAs()
|
||||
this.getCenter().getActivePane().saveActiveItemAs()
|
||||
}
|
||||
|
||||
// Destroy (close) the active pane item.
|
||||
@@ -1419,13 +1423,13 @@ module.exports = class Workspace extends Model {
|
||||
}
|
||||
}
|
||||
|
||||
// Close the active pane item, or the active pane if it is empty,
|
||||
// or the current window if there is only the empty root pane.
|
||||
// Close the active center pane item, or the active center pane if it is
|
||||
// empty, or the current window if there is only the empty root pane.
|
||||
closeActivePaneItemOrEmptyPaneOrWindow () {
|
||||
if (this.getActivePaneItem() != null) {
|
||||
this.destroyActivePaneItem()
|
||||
if (this.getCenter().getActivePaneItem() != null) {
|
||||
this.getCenter().getActivePane().destroyActiveItem()
|
||||
} else if (this.getCenter().getPanes().length > 1) {
|
||||
this.destroyActivePane()
|
||||
this.getCenter().destroyActivePane()
|
||||
} else if (this.config.get('core.closeEmptyWindows')) {
|
||||
atom.close()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user