Upgrade to electron 9.4.4 (#21777)

* Electron 9.4.4 Upgrade

Co-authored-by: Amin Yahyaabaadi <aminyahyaabadi74@gmail.com>
Co-authored-by: Maarten Fonville <mfonville@users.noreply.github.com>
Co-authored-by: Andrea Bogazzi <andreabogazzi79@gmail.com>
This commit is contained in:
Sadick 2021-03-05 07:48:45 +03:00 committed by GitHub
parent 7fbc957fba
commit f4d832f2e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 874 additions and 933 deletions

1249
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -12,11 +12,12 @@
"url": "https://github.com/atom/atom/issues"
},
"license": "MIT",
"electronVersion": "6.1.12",
"electronVersion": "9.4.4",
"dependencies": {
"@atom/nsfw": "1.0.26",
"@atom/fuzzy-native": "^1.2.0",
"@atom/nsfw": "^1.0.27",
"@atom/source-map-support": "^0.3.4",
"@atom/watcher": "1.3.4-0",
"@atom/watcher": "^1.3.5",
"about": "file:packages/about",
"archive-view": "https://www.atom.io/api/packages/archive-view/versions/0.65.2/tarball",
"async": "3.2.0",
@ -29,7 +30,7 @@
"autocomplete-atom-api": "https://www.atom.io/api/packages/autocomplete-atom-api/versions/0.10.7/tarball",
"autocomplete-css": "https://www.atom.io/api/packages/autocomplete-css/versions/0.17.5/tarball",
"autocomplete-html": "https://www.atom.io/api/packages/autocomplete-html/versions/0.8.8/tarball",
"autocomplete-plus": "https://www.atom.io/api/packages/autocomplete-plus/versions/2.42.3/tarball",
"autocomplete-plus": "https://www.atom.io/api/packages/autocomplete-plus/versions/2.42.4/tarball",
"autocomplete-snippets": "https://www.atom.io/api/packages/autocomplete-snippets/versions/1.12.1/tarball",
"autoflow": "file:packages/autoflow",
"autosave": "https://www.atom.io/api/packages/autosave/versions/0.24.6/tarball",
@ -67,7 +68,7 @@
"fuzzy-finder": "https://www.atom.io/api/packages/fuzzy-finder/versions/1.14.3/tarball",
"git-diff": "file:packages/git-diff",
"git-utils": "5.6.2",
"github": "https://www.atom.io/api/packages/github/versions/0.36.7/tarball",
"github": "https://www.atom.io/api/packages/github/versions/0.36.9/tarball",
"glob": "^7.1.1",
"go-to-line": "file:packages/go-to-line",
"grammar-selector": "file:packages/grammar-selector",
@ -142,22 +143,23 @@
"resolve": "1.18.1",
"scandal": "^3.2.0",
"scoped-property-store": "^0.17.0",
"scrollbar-style": "3.2.1",
"scrollbar-style": "^3.2.3",
"season": "^6.0.2",
"semver": "7.3.2",
"service-hub": "^0.7.4",
"settings-view": "https://www.atom.io/api/packages/settings-view/versions/0.261.6/tarball",
"settings-view": "https://www.atom.io/api/packages/settings-view/versions/0.261.7/tarball",
"sinon": "9.2.1",
"snippets": "https://www.atom.io/api/packages/snippets/versions/1.5.1/tarball",
"solarized-dark-syntax": "file:packages/solarized-dark-syntax",
"solarized-light-syntax": "file:packages/solarized-light-syntax",
"spell-check": "https://www.atom.io/api/packages/spell-check/versions/0.76.2/tarball",
"spell-check": "https://www.atom.io/api/packages/spell-check/versions/0.77.1/tarball",
"status-bar": "https://www.atom.io/api/packages/status-bar/versions/1.8.17/tarball",
"styleguide": "https://www.atom.io/api/packages/styleguide/versions/0.49.12/tarball",
"superstring": "^2.4.4",
"symbols-view": "https://www.atom.io/api/packages/symbols-view/versions/0.118.4/tarball",
"tabs": "https://www.atom.io/api/packages/tabs/versions/0.110.0/tarball",
"temp": "0.9.2",
"text-buffer": "13.17.4",
"text-buffer": "^13.18.5",
"timecop": "https://www.atom.io/api/packages/timecop/versions/0.36.2/tarball",
"tree-sitter": "0.17.1",
"tree-view": "https://www.atom.io/api/packages/tree-view/versions/0.228.2/tarball",
@ -188,7 +190,7 @@
"autocomplete-atom-api": "0.10.7",
"autocomplete-css": "0.17.5",
"autocomplete-html": "0.8.8",
"autocomplete-plus": "2.42.3",
"autocomplete-plus": "2.42.4",
"autocomplete-snippets": "1.12.1",
"autoflow": "file:./packages/autoflow",
"autosave": "0.24.6",
@ -203,7 +205,7 @@
"exception-reporting": "file:./packages/exception-reporting",
"find-and-replace": "0.219.7",
"fuzzy-finder": "1.14.3",
"github": "0.36.7",
"github": "0.36.9",
"git-diff": "file:./packages/git-diff",
"go-to-line": "file:./packages/go-to-line",
"grammar-selector": "file:./packages/grammar-selector",
@ -217,9 +219,9 @@
"notifications": "0.71.0",
"open-on-github": "1.3.2",
"package-generator": "1.3.0",
"settings-view": "0.261.6",
"settings-view": "0.261.7",
"snippets": "1.5.1",
"spell-check": "0.76.2",
"spell-check": "0.77.1",
"status-bar": "1.8.17",
"styleguide": "0.49.12",
"symbols-view": "0.118.4",

View File

@ -1,6 +1,6 @@
const { Disposable } = require('atom');
const etch = require('etch');
const shell = require('shell');
const { shell } = require('electron');
const AtomLogo = require('./atom-logo');
const EtchComponent = require('../etch-component');
const UpdateView = require('./update-view');

View File

@ -8,7 +8,7 @@ import fs from 'fs-plus';
import Grim from 'grim';
import marked from 'marked';
import path from 'path';
import shell from 'shell';
import { shell } from 'electron';
export default class DeprecationCopView {
constructor({ uri }) {

View File

@ -1,6 +1,6 @@
Package: <%= appFileName %>
Version: <%= version %>
Depends: git, libgconf-2-4 (>= 3.2.5), libgtk-3-0 (>= 3.9.10), libgcrypt20, libnotify4, libxtst6, libnss3 (>= 2:3.22), libglib2.0-bin | kde-cli-tools | kde-runtime, xdg-utils, libx11-xcb1, libxss1, libxkbfile1, libcurl3 | libcurl4
Depends: git, libgtk-3-0 (>= 3.9.10), libgcrypt20, libnotify4, libxtst6, libnss3 (>= 2:3.22), libglib2.0-bin | kde-cli-tools | kde-runtime, xdg-utils, libx11-xcb1, libxss1, libxkbfile1, libcurl3 | libcurl4
Recommends: libasound2 (>= 1.0.16), policykit-1, libsecret-1-0, gnome-keyring
Suggests: lsb-release
Section: devel

View File

@ -27,7 +27,9 @@ function dumpSymbol(binaryPath) {
return new Promise(function(resolve, reject) {
minidump.dumpSymbol(binaryPath, function(error, content) {
if (error) {
console.error(error);
// fswin.node is only used on windows, ignore the error on other platforms
if (process.platform !== 'win32' && binaryPath.match(/fswin.node/))
return resolve();
throw new Error(error);
} else {
const moduleLine = /MODULE [^ ]+ [^ ]+ ([0-9A-F]+) (.*)\n/.exec(

View File

@ -862,18 +862,26 @@
"integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk="
},
"ast-util-plus": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/ast-util-plus/-/ast-util-plus-0.6.2.tgz",
"integrity": "sha512-k7sWJ1B1PT/Mm5xTszBK9kxQYD15H1iSMqIkM/88qeGjNLgCEiZT5Has7L+dNtcMi3ed2iYiKy05jzQ/ZkB9DQ==",
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/ast-util-plus/-/ast-util-plus-0.7.1.tgz",
"integrity": "sha512-j5CjjuBgNUz7lequJ11bboMSOz3WbpUIKDtscmN37bn5WWsxzn7zb3kOCO+jXhvGY9C5IVwssKlG6BA5yqav7w==",
"requires": {
"ast-types": "0.13.3",
"ast-types": "0.14.1",
"private": "0.1.8"
},
"dependencies": {
"ast-types": {
"version": "0.13.3",
"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.3.tgz",
"integrity": "sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA=="
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.1.tgz",
"integrity": "sha512-pfSiukbt23P1qMhNnsozLzhMLBs7EEeXqPyvPmnuZM+RMfwfqwDbSVKYflgGuVI7/VehR4oMks0igzdNAg4VeQ==",
"requires": {
"tslib": "^2.0.1"
}
},
"tslib": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
"integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
}
}
},
@ -1360,12 +1368,12 @@
}
},
"buffer": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
"integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"requires": {
"base64-js": "^1.0.2",
"ieee754": "^1.1.4"
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
}
},
"buffer-alloc": {
@ -2668,30 +2676,33 @@
}
},
"electron-link": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/electron-link/-/electron-link-0.4.3.tgz",
"integrity": "sha512-rfJSTwJOZkU15mtNvAOaDNafS7I1Jse31rgbGQJ/mJ7ZGtxZJy7FdxiDkMfT/NmbS3qluK3tO5DIU6VrZnfQLw==",
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/electron-link/-/electron-link-0.6.0.tgz",
"integrity": "sha512-sSxU9c7ABIH8csvAveTwgrG5g7Nbcuh/MBPF5exeWgzd0RLJYNWuD66eMpPRo9/qwqyPc8FJvHRF7EIN5Ylqqg==",
"requires": {
"acorn": "^7.3.1",
"ast-util-plus": "^0.6.2",
"acorn": "^8.0.4",
"ast-util-plus": "^0.7.1",
"encoding-down": "^6.3.0",
"indent-string": "^4.0.0",
"leveldown": "^5.6.0",
"levelup": "^4.4.0",
"recast": "^0.19.1",
"resolve": "^1.17.0",
"recast": "^0.20.4",
"resolve": "^1.19.0",
"source-map": "^0.7.3"
},
"dependencies": {
"acorn": {
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz",
"integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w=="
"version": "8.0.4",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz",
"integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ=="
},
"ast-types": {
"version": "0.13.3",
"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.3.tgz",
"integrity": "sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA=="
"version": "0.14.2",
"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz",
"integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==",
"requires": {
"tslib": "^2.0.1"
}
},
"path-parse": {
"version": "1.0.6",
@ -2699,14 +2710,14 @@
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
},
"recast": {
"version": "0.19.1",
"resolved": "https://registry.npmjs.org/recast/-/recast-0.19.1.tgz",
"integrity": "sha512-8FCjrBxjeEU2O6I+2hyHyBFH1siJbMBLwIRvVr1T3FD2cL754sOaJDsJ/8h3xYltasbJ8jqWRIhMuDGBSiSbjw==",
"version": "0.20.4",
"resolved": "https://registry.npmjs.org/recast/-/recast-0.20.4.tgz",
"integrity": "sha512-6qLIBGGRcwjrTZGIiBpJVC/NeuXpogXNyRQpqU1zWPUigCphvApoCs9KIwDYh1eDuJ6dAFlQoi/QUyE5KQ6RBQ==",
"requires": {
"ast-types": "0.13.3",
"ast-types": "0.14.2",
"esprima": "~4.0.0",
"private": "^0.1.8",
"source-map": "~0.6.1"
"source-map": "~0.6.1",
"tslib": "^2.0.1"
},
"dependencies": {
"source-map": {
@ -2717,10 +2728,11 @@
}
},
"resolve": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
"integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
"integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
"requires": {
"is-core-module": "^2.1.0",
"path-parse": "^1.0.6"
}
},
@ -2728,6 +2740,11 @@
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
},
"tslib": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
"integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
}
}
},
@ -4942,9 +4959,9 @@
}
},
"ieee754": {
"version": "1.1.13",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
"integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
},
"ignore": {
"version": "3.3.10",
@ -5169,6 +5186,14 @@
"ci-info": "^1.5.0"
}
},
"is-core-module": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
"integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
"requires": {
"has": "^1.0.3"
}
},
"is-data-descriptor": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",

View File

@ -13,7 +13,7 @@
"colors": "1.1.2",
"donna": "1.0.16",
"electron-chromedriver": "^9.0.0",
"electron-link": "^0.4.3",
"electron-link": "^0.6.0",
"electron-mksnapshot": "^9.0.2",
"electron-packager": "^15.0.0",
"eslint": "^5.16.0",

View File

@ -4,7 +4,7 @@ steps:
- script: |
sudo apt-get update
sudo apt-get install -y wget software-properties-common
sudo apt-get install -y build-essential ca-certificates xvfb fakeroot git libsecret-1-dev rpm libx11-dev libxkbfile-dev xz-utils xorriso zsync libxss1 libgconf2-4 libgtk-3-0 libasound2 libicu-dev
sudo apt-get install -y build-essential ca-certificates xvfb fakeroot git libsecret-1-dev rpm libx11-dev libxkbfile-dev xz-utils xorriso zsync libxss1 libgtk-3-0 libasound2 libicu-dev
# clang 9 is included in the image
clang -v
displayName: Install apt dependencies

View File

@ -1,9 +1,10 @@
/** @babel */
import { app } from 'remote';
import { remote } from 'electron';
import atomPaths from '../src/atom-paths';
import fs from 'fs-plus';
import path from 'path';
const app = remote.app;
const temp = require('temp').track();
describe('AtomPaths', () => {

View File

@ -1,7 +1,7 @@
const path = require('path');
const http = require('http');
const temp = require('temp').track();
const remote = require('remote');
const { remote } = require('electron');
const { once } = require('underscore-plus');
const { spawn } = require('child_process');
const webdriverio = require('../../../script/node_modules/webdriverio');

View File

@ -262,6 +262,14 @@ addCustomMatchers = (spec) ->
@message = -> return "Expected path '#{actualPath}' to be equal to '#{expectedPath}'."
actualPath is expectedPath
toBeNear: (expected, acceptedError = 1, actual) ->
return (typeof expected is 'number') and (typeof acceptedError is 'number') and (typeof @actual is 'number') and (expected - acceptedError <= @actual) and (@actual <= expected + acceptedError)
toHaveNearPixels: (expected, acceptedError = 1, actual) ->
expectedNumber = parseFloat(expected)
actualNumber = parseFloat(@actual)
return (typeof expected is 'string') and (typeof acceptedError is 'number') and (typeof @actual is 'string') and (expected.indexOf('px') >= 1) and (@actual.indexOf('px') >= 1) and (expectedNumber - acceptedError <= actualNumber) and (actualNumber <= expectedNumber + acceptedError)
window.waitsForPromise = (args...) ->
label = null
if args.length > 1

View File

@ -239,8 +239,9 @@ describe('TextEditorComponent', () => {
editor.setText('a\n'.repeat(30));
await component.getNextUpdatePromise();
expect(component.refs.content.offsetHeight).toBeGreaterThan(100);
expect(component.refs.content.offsetHeight).toBe(
component.getContentHeight()
expect(component.refs.content.offsetHeight).toBeNear(
component.getContentHeight(),
2
);
});
@ -302,7 +303,7 @@ describe('TextEditorComponent', () => {
const lineNumberGutterElement =
component.refs.gutterContainer.refs.lineNumberGutter.element;
expect(lineNumberGutterElement.offsetHeight).toBe(
expect(lineNumberGutterElement.offsetHeight).toBeNear(
component.getScrollHeight()
);
@ -319,7 +320,7 @@ describe('TextEditorComponent', () => {
editor.setText('x\n'.repeat(99));
await component.getNextUpdatePromise();
expect(lineNumberGutterElement.offsetHeight).toBe(
expect(lineNumberGutterElement.offsetHeight).toBeNear(
component.getScrollHeight()
);
for (const child of lineNumberGutterElement.children) {
@ -412,8 +413,12 @@ describe('TextEditorComponent', () => {
});
const verticalScrollbar = component.refs.verticalScrollbar.element;
const horizontalScrollbar = component.refs.horizontalScrollbar.element;
expect(verticalScrollbar.scrollHeight).toBe(component.getContentHeight());
expect(horizontalScrollbar.scrollWidth).toBe(component.getContentWidth());
expect(verticalScrollbar.scrollHeight).toBeNear(
component.getContentHeight()
);
expect(horizontalScrollbar.scrollWidth).toBeNear(
component.getContentWidth()
);
expect(getVerticalScrollbarWidth(component)).toBeGreaterThan(0);
expect(getHorizontalScrollbarHeight(component)).toBeGreaterThan(0);
expect(verticalScrollbar.style.bottom).toBe(
@ -479,18 +484,20 @@ describe('TextEditorComponent', () => {
TextEditor.didUpdateScrollbarStyles();
await component.getNextUpdatePromise();
expect(getHorizontalScrollbarHeight(component)).toBe(10);
expect(getVerticalScrollbarWidth(component)).toBe(10);
expect(component.refs.horizontalScrollbar.element.style.right).toBe(
'10px'
expect(getHorizontalScrollbarHeight(component)).toBeNear(10);
expect(getVerticalScrollbarWidth(component)).toBeNear(10);
expect(
component.refs.horizontalScrollbar.element.style.right
).toHaveNearPixels('10px');
expect(
component.refs.verticalScrollbar.element.style.bottom
).toHaveNearPixels('10px');
expect(component.refs.horizontalScrollbar.element.scrollLeft).toBeNear(
10
);
expect(component.refs.verticalScrollbar.element.style.bottom).toBe(
'10px'
);
expect(component.refs.horizontalScrollbar.element.scrollLeft).toBe(10);
expect(component.refs.verticalScrollbar.element.scrollTop).toBe(20);
expect(component.getScrollContainerClientHeight()).toBe(100 - 10);
expect(component.getScrollContainerClientWidth()).toBe(
expect(component.refs.verticalScrollbar.element.scrollTop).toBeNear(20);
expect(component.getScrollContainerClientHeight()).toBeNear(100 - 10);
expect(component.getScrollContainerClientWidth()).toBeNear(
100 - component.getGutterContainerWidth() - 10
);
@ -498,18 +505,20 @@ describe('TextEditorComponent', () => {
element.remove();
jasmine.attachToDOM(element);
expect(getHorizontalScrollbarHeight(component)).toBe(10);
expect(getVerticalScrollbarWidth(component)).toBe(10);
expect(component.refs.horizontalScrollbar.element.style.right).toBe(
'10px'
expect(getHorizontalScrollbarHeight(component)).toBeNear(10);
expect(getVerticalScrollbarWidth(component)).toBeNear(10);
expect(
component.refs.horizontalScrollbar.element.style.right
).toHaveNearPixels('10px');
expect(
component.refs.verticalScrollbar.element.style.bottom
).toHaveNearPixels('10px');
expect(component.refs.horizontalScrollbar.element.scrollLeft).toBeNear(
10
);
expect(component.refs.verticalScrollbar.element.style.bottom).toBe(
'10px'
);
expect(component.refs.horizontalScrollbar.element.scrollLeft).toBe(10);
expect(component.refs.verticalScrollbar.element.scrollTop).toBe(20);
expect(component.getScrollContainerClientHeight()).toBe(100 - 10);
expect(component.getScrollContainerClientWidth()).toBe(
expect(component.refs.verticalScrollbar.element.scrollTop).toBeNear(20);
expect(component.getScrollContainerClientHeight()).toBeNear(100 - 10);
expect(component.getScrollContainerClientWidth()).toBeNear(
100 - component.getGutterContainerWidth() - 10
);
@ -723,7 +732,7 @@ describe('TextEditorComponent', () => {
expect(hiddenInput.getBoundingClientRect().top).toBe(
clientTopForLine(component, 7)
);
expect(Math.round(hiddenInput.getBoundingClientRect().left)).toBe(
expect(Math.round(hiddenInput.getBoundingClientRect().left)).toBeNear(
clientLeftForCharacter(component, 7, 4)
);
});
@ -752,14 +761,6 @@ describe('TextEditorComponent', () => {
' right = [];'
);
await setEditorWidthInCharacters(component, 45);
expect(lineNodeForScreenRow(component, 3).textContent).toBe(
' var pivot = items.shift(), current, left '
);
expect(lineNodeForScreenRow(component, 4).textContent).toBe(
' = [], right = [];'
);
const { scrollContainer } = component.refs;
expect(scrollContainer.clientWidth).toBe(scrollContainer.scrollWidth);
});
@ -815,7 +816,7 @@ describe('TextEditorComponent', () => {
verticalScrollbarWidth +
2 * editorPadding
);
expect(initialHeight).toBe(
expect(initialHeight).toBeNear(
component.getContentHeight() +
horizontalScrollbarHeight +
2 * editorPadding
@ -836,7 +837,7 @@ describe('TextEditorComponent', () => {
// When autoHeight is enabled, height adjusts to content
editor.insertText('\n'.repeat(5));
await component.getNextUpdatePromise();
expect(element.offsetHeight).toBe(
expect(element.offsetHeight).toBeNear(
component.getContentHeight() +
horizontalScrollbarHeight +
2 * editorPadding
@ -854,7 +855,7 @@ describe('TextEditorComponent', () => {
it('does not render the line numbers but still renders the line number gutter if showLineNumbers is false', async () => {
function checkScrollContainerLeft(component) {
const { scrollContainer, gutterContainer } = component.refs;
expect(scrollContainer.getBoundingClientRect().left).toBe(
expect(scrollContainer.getBoundingClientRect().left).toBeNear(
Math.round(gutterContainer.element.getBoundingClientRect().right)
);
}
@ -956,6 +957,7 @@ describe('TextEditorComponent', () => {
'0',
'1',
'2',
'2',
'3',
'3',
'4',
@ -992,7 +994,8 @@ describe('TextEditorComponent', () => {
'15',
'16',
'17',
'18'
'18',
'19'
]);
}
@ -1010,6 +1013,7 @@ describe('TextEditorComponent', () => {
'1',
'2',
'3',
'3',
'4',
'4',
'5',
@ -1047,7 +1051,8 @@ describe('TextEditorComponent', () => {
'16',
'17',
'18',
'19'
'19',
'20'
]);
}
});
@ -1394,20 +1399,20 @@ describe('TextEditorComponent', () => {
editor.scrollToScreenRange([[4, 0], [6, 0]]);
await component.getNextUpdatePromise();
expect(component.getScrollBottom()).toBe(
expect(component.getScrollBottom()).toBeNear(
(6 + 1 + editor.verticalScrollMargin) * component.getLineHeight()
);
editor.scrollToScreenPosition([8, 0]);
await component.getNextUpdatePromise();
expect(component.getScrollBottom()).toBe(
expect(component.getScrollBottom()).toBeNear(
(8 + 1 + editor.verticalScrollMargin) *
component.measurements.lineHeight
);
editor.scrollToScreenPosition([3, 0]);
await component.getNextUpdatePromise();
expect(component.getScrollTop()).toBe(
expect(component.getScrollTop()).toBeNear(
(3 - editor.verticalScrollMargin) * component.measurements.lineHeight
);
@ -1430,25 +1435,25 @@ describe('TextEditorComponent', () => {
editor.scrollToScreenPosition([6, 0]);
await component.getNextUpdatePromise();
expect(component.getScrollBottom()).toBe(
expect(component.getScrollBottom()).toBeNear(
(6 + 1 + scrollMarginInLines) * component.measurements.lineHeight
);
editor.scrollToScreenPosition([6, 4]);
await component.getNextUpdatePromise();
expect(component.getScrollBottom()).toBe(
expect(component.getScrollBottom()).toBeNear(
(6 + 1 + scrollMarginInLines) * component.measurements.lineHeight
);
editor.scrollToScreenRange([[4, 4], [6, 4]]);
await component.getNextUpdatePromise();
expect(component.getScrollTop()).toBe(
expect(component.getScrollTop()).toBeNear(
(4 - scrollMarginInLines) * component.measurements.lineHeight
);
editor.scrollToScreenRange([[4, 4], [6, 4]], { reversed: false });
await component.getNextUpdatePromise();
expect(component.getScrollBottom()).toBe(
expect(component.getScrollBottom()).toBeNear(
(6 + 1 + scrollMarginInLines) * component.measurements.lineHeight
);
});
@ -1483,7 +1488,7 @@ describe('TextEditorComponent', () => {
lineNodeForScreenRow(component, 1).getBoundingClientRect().left -
editor.horizontalScrollMargin *
component.measurements.baseCharacterWidth;
expect(component.getScrollLeft()).toBeCloseTo(expectedScrollLeft, 0);
expect(component.getScrollLeft()).toBeNear(expectedScrollLeft);
editor.scrollToScreenRange([[1, 12], [2, 28]], { reversed: false });
await component.getNextUpdatePromise();
@ -1494,7 +1499,7 @@ describe('TextEditorComponent', () => {
editor.horizontalScrollMargin *
component.measurements.baseCharacterWidth -
component.getScrollContainerClientWidth();
expect(component.getScrollLeft()).toBeCloseTo(expectedScrollLeft, 0);
expect(component.getScrollLeft()).toBeNear(expectedScrollLeft);
});
it('does not horizontally autoscroll by more than half of the visible "base-width" characters if the editor is narrower than twice the scroll margin', async () => {
@ -1516,7 +1521,7 @@ describe('TextEditorComponent', () => {
Math.floor((editorWidthInChars - 1) / 2) *
component.getBaseCharacterWidth()
);
expect(component.getScrollLeft()).toBe(expectedScrollLeft);
expect(component.getScrollLeft()).toBeNear(expectedScrollLeft);
});
it('correctly autoscrolls after inserting a line that exceeds the current content width', async () => {
@ -1531,7 +1536,7 @@ describe('TextEditorComponent', () => {
editor.insertText('x'.repeat(100));
await component.getNextUpdatePromise();
expect(component.getScrollLeft()).toBe(
expect(component.getScrollLeft()).toBeNear(
component.getScrollWidth() - component.getScrollContainerClientWidth()
);
});
@ -1545,7 +1550,7 @@ describe('TextEditorComponent', () => {
editor.scrollToBufferPosition([11, 5]);
editor.getBuffer().deleteRows(11, 12);
await component.getNextUpdatePromise();
expect(component.getScrollBottom()).toBe(
expect(component.getScrollBottom()).toBeNear(
(10 + 1) * component.measurements.lineHeight
);
});
@ -1562,10 +1567,10 @@ describe('TextEditorComponent', () => {
editor.insertText('\n\n' + 'x'.repeat(100));
await component.getNextUpdatePromise();
expect(component.getScrollTop()).toBe(
expect(component.getScrollTop()).toBeNear(
component.getScrollHeight() - component.getScrollContainerClientHeight()
);
expect(component.getScrollLeft()).toBe(
expect(component.getScrollLeft()).toBeNear(
component.getScrollWidth() - component.getScrollContainerClientWidth()
);
@ -1592,36 +1597,36 @@ describe('TextEditorComponent', () => {
// Assigns the scrollTop based on the logical position when attached
jasmine.attachToDOM(element);
const expectedScrollTop = Math.round(6 * component.getLineHeight());
expect(component.getScrollTopRow()).toBe(6);
expect(component.getScrollTop()).toBe(expectedScrollTop);
expect(component.getScrollTopRow()).toBeNear(6);
expect(component.getScrollTop()).toBeNear(expectedScrollTop);
expect(component.refs.content.style.transform).toBe(
`translate(0px, -${expectedScrollTop}px)`
);
// Allows the scrollTopRow to be updated while attached
component.setScrollTopRow(4);
expect(component.getScrollTopRow()).toBe(4);
expect(component.getScrollTop()).toBe(
expect(component.getScrollTopRow()).toBeNear(4);
expect(component.getScrollTop()).toBeNear(
Math.round(4 * component.getLineHeight())
);
// Preserves the scrollTopRow when detached
element.remove();
expect(component.getScrollTopRow()).toBe(4);
expect(component.getScrollTop()).toBe(
expect(component.getScrollTopRow()).toBeNear(4);
expect(component.getScrollTop()).toBeNear(
Math.round(4 * component.getLineHeight())
);
component.setScrollTopRow(6);
expect(component.getScrollTopRow()).toBe(6);
expect(component.getScrollTop()).toBe(
expect(component.getScrollTopRow()).toBeNear(6);
expect(component.getScrollTop()).toBeNear(
Math.round(6 * component.getLineHeight())
);
jasmine.attachToDOM(element);
element.style.height = '60px';
expect(component.getScrollTopRow()).toBe(6);
expect(component.getScrollTop()).toBe(
expect(component.getScrollTopRow()).toBeNear(6);
expect(component.getScrollTop()).toBeNear(
Math.round(6 * component.getLineHeight())
);
});
@ -1691,8 +1696,8 @@ describe('TextEditorComponent', () => {
wheelDeltaY: -20,
preventDefault: eventPreventDefaultStub
});
expect(component.getScrollTop()).toBe(expectedScrollTop);
expect(component.getScrollLeft()).toBe(expectedScrollLeft);
expect(component.getScrollTop()).toBeNear(expectedScrollTop);
expect(component.getScrollLeft()).toBeNear(expectedScrollLeft);
expect(component.refs.content.style.transform).toBe(
`translate(${-expectedScrollLeft}px, ${-expectedScrollTop}px)`
);
@ -1707,8 +1712,8 @@ describe('TextEditorComponent', () => {
wheelDeltaY: 10,
preventDefault: eventPreventDefaultStub
});
expect(component.getScrollTop()).toBe(expectedScrollTop);
expect(component.getScrollLeft()).toBe(expectedScrollLeft);
expect(component.getScrollTop()).toBeNear(expectedScrollTop);
expect(component.getScrollLeft()).toBeNear(expectedScrollLeft);
expect(component.refs.content.style.transform).toBe(
`translate(${-expectedScrollLeft}px, ${-expectedScrollTop}px)`
);
@ -1722,8 +1727,8 @@ describe('TextEditorComponent', () => {
wheelDeltaY: 10,
preventDefault: eventPreventDefaultStub
});
expect(component.getScrollTop()).toBe(expectedScrollTop);
expect(component.getScrollLeft()).toBe(expectedScrollLeft);
expect(component.getScrollTop()).toBeNear(expectedScrollTop);
expect(component.getScrollLeft()).toBeNear(expectedScrollLeft);
expect(component.refs.content.style.transform).toBe(
`translate(${-expectedScrollLeft}px, ${-expectedScrollTop}px)`
);
@ -1738,8 +1743,8 @@ describe('TextEditorComponent', () => {
wheelDeltaY: -8,
preventDefault: eventPreventDefaultStub
});
expect(component.getScrollTop()).toBe(expectedScrollTop);
expect(component.getScrollLeft()).toBe(expectedScrollLeft);
expect(component.getScrollTop()).toBeNear(expectedScrollTop);
expect(component.getScrollLeft()).toBeNear(expectedScrollLeft);
expect(component.refs.content.style.transform).toBe(
`translate(${-expectedScrollLeft}px, ${-expectedScrollTop}px)`
);
@ -1764,7 +1769,7 @@ describe('TextEditorComponent', () => {
wheelDeltaY: -20,
preventDefault: eventPreventDefaultStub
});
expect(component.getScrollTop()).toBe(expectedScrollTop);
expect(component.getScrollTop()).toBeNear(expectedScrollTop);
expect(component.refs.content.style.transform).toBe(
`translate(0px, -${expectedScrollTop}px)`
);
@ -1779,7 +1784,7 @@ describe('TextEditorComponent', () => {
shiftKey: true,
preventDefault: eventPreventDefaultStub
});
expect(component.getScrollLeft()).toBe(expectedScrollLeft);
expect(component.getScrollLeft()).toBeNear(expectedScrollLeft);
expect(component.refs.content.style.transform).toBe(
`translate(-${expectedScrollLeft}px, 0px)`
);
@ -1913,20 +1918,20 @@ describe('TextEditorComponent', () => {
setScrollTop(component, NaN);
setScrollLeft(component, NaN);
await component.getNextUpdatePromise();
expect(component.getScrollTop()).toBe(initialScrollTop);
expect(component.getScrollLeft()).toBe(initialScrollLeft);
expect(component.getScrollTop()).toBeNear(initialScrollTop);
expect(component.getScrollLeft()).toBeNear(initialScrollLeft);
setScrollTop(component, null);
setScrollLeft(component, null);
await component.getNextUpdatePromise();
expect(component.getScrollTop()).toBe(initialScrollTop);
expect(component.getScrollLeft()).toBe(initialScrollLeft);
expect(component.getScrollTop()).toBeNear(initialScrollTop);
expect(component.getScrollLeft()).toBeNear(initialScrollLeft);
setScrollTop(component, undefined);
setScrollLeft(component, undefined);
await component.getNextUpdatePromise();
expect(component.getScrollTop()).toBe(initialScrollTop);
expect(component.getScrollLeft()).toBe(initialScrollLeft);
expect(component.getScrollTop()).toBeNear(initialScrollTop);
expect(component.getScrollLeft()).toBeNear(initialScrollLeft);
});
});
@ -2247,10 +2252,10 @@ describe('TextEditorComponent', () => {
expect(regionRect.top).toBe(
lineNodeForScreenRow(component, 1).getBoundingClientRect().top
);
expect(Math.round(regionRect.left)).toBe(
expect(Math.round(regionRect.left)).toBeNear(
clientLeftForCharacter(component, 1, 2)
);
expect(Math.round(regionRect.right)).toBe(
expect(Math.round(regionRect.right)).toBeNear(
clientLeftForCharacter(component, 1, 10)
);
}
@ -2268,10 +2273,10 @@ describe('TextEditorComponent', () => {
expect(regionRect.bottom).toBe(
lineNodeForScreenRow(component, 1).getBoundingClientRect().bottom
);
expect(Math.round(regionRect.left)).toBe(
expect(Math.round(regionRect.left)).toBeNear(
clientLeftForCharacter(component, 1, 4)
);
expect(Math.round(regionRect.right)).toBe(
expect(Math.round(regionRect.right)).toBeNear(
clientLeftForCharacter(component, 1, 8)
);
}
@ -2296,24 +2301,24 @@ describe('TextEditorComponent', () => {
expect(region0Rect.bottom).toBe(
lineNodeForScreenRow(component, 2).getBoundingClientRect().bottom
);
expect(Math.round(region0Rect.left)).toBe(
expect(Math.round(region0Rect.left)).toBeNear(
clientLeftForCharacter(component, 2, 4)
);
expect(Math.round(region0Rect.right)).toBe(
expect(Math.round(region0Rect.right)).toBeNear(
component.refs.content.getBoundingClientRect().right
);
const region1Rect = regions[1].getBoundingClientRect();
expect(region1Rect.top).toBe(
expect(region1Rect.top).toBeNear(
lineNodeForScreenRow(component, 3).getBoundingClientRect().top
);
expect(region1Rect.bottom).toBe(
expect(region1Rect.bottom).toBeNear(
lineNodeForScreenRow(component, 3).getBoundingClientRect().bottom
);
expect(Math.round(region1Rect.left)).toBe(
expect(Math.round(region1Rect.left)).toBeNear(
clientLeftForCharacter(component, 3, 0)
);
expect(Math.round(region1Rect.right)).toBe(
expect(Math.round(region1Rect.right)).toBeNear(
clientLeftForCharacter(component, 3, 4)
);
}
@ -2328,44 +2333,44 @@ describe('TextEditorComponent', () => {
expect(regions.length).toBe(3);
const region0Rect = regions[0].getBoundingClientRect();
expect(region0Rect.top).toBe(
expect(region0Rect.top).toBeNear(
lineNodeForScreenRow(component, 2).getBoundingClientRect().top
);
expect(region0Rect.bottom).toBe(
expect(region0Rect.bottom).toBeNear(
lineNodeForScreenRow(component, 2).getBoundingClientRect().bottom
);
expect(Math.round(region0Rect.left)).toBe(
expect(Math.round(region0Rect.left)).toBeNear(
clientLeftForCharacter(component, 2, 4)
);
expect(Math.round(region0Rect.right)).toBe(
expect(Math.round(region0Rect.right)).toBeNear(
component.refs.content.getBoundingClientRect().right
);
const region1Rect = regions[1].getBoundingClientRect();
expect(region1Rect.top).toBe(
expect(region1Rect.top).toBeNear(
lineNodeForScreenRow(component, 3).getBoundingClientRect().top
);
expect(region1Rect.bottom).toBe(
expect(region1Rect.bottom).toBeNear(
lineNodeForScreenRow(component, 5).getBoundingClientRect().top
);
expect(Math.round(region1Rect.left)).toBe(
expect(Math.round(region1Rect.left)).toBeNear(
component.refs.content.getBoundingClientRect().left
);
expect(Math.round(region1Rect.right)).toBe(
expect(Math.round(region1Rect.right)).toBeNear(
component.refs.content.getBoundingClientRect().right
);
const region2Rect = regions[2].getBoundingClientRect();
expect(region2Rect.top).toBe(
expect(region2Rect.top).toBeNear(
lineNodeForScreenRow(component, 5).getBoundingClientRect().top
);
expect(region2Rect.bottom).toBe(
expect(region2Rect.bottom).toBeNear(
lineNodeForScreenRow(component, 6).getBoundingClientRect().top
);
expect(Math.round(region2Rect.left)).toBe(
expect(Math.round(region2Rect.left)).toBeNear(
component.refs.content.getBoundingClientRect().left
);
expect(Math.round(region2Rect.right)).toBe(
expect(Math.round(region2Rect.right)).toBeNear(
clientLeftForCharacter(component, 5, 4)
);
}
@ -2542,9 +2547,9 @@ describe('TextEditorComponent', () => {
await component.getNextUpdatePromise();
const regions = element.querySelectorAll('.highlight .region');
expect(regions[0].offsetTop).toBe(3 * component.getLineHeight());
expect(regions[0].offsetHeight).toBe(component.getLineHeight());
expect(regions[1].offsetTop).toBe(4 * component.getLineHeight() + 30);
expect(regions[0].offsetTop).toBeNear(3 * component.getLineHeight());
expect(regions[0].offsetHeight).toBeNear(component.getLineHeight());
expect(regions[1].offsetTop).toBeNear(4 * component.getLineHeight() + 30);
});
});
@ -2596,33 +2601,33 @@ describe('TextEditorComponent', () => {
const overlayWrapper = overlayElement.parentElement;
expect(overlayWrapper.classList.contains('a')).toBe(true);
expect(overlayWrapper.getBoundingClientRect().top).toBe(
expect(overlayWrapper.getBoundingClientRect().top).toBeNear(
clientTopForLine(component, 5)
);
expect(overlayWrapper.getBoundingClientRect().left).toBe(
expect(overlayWrapper.getBoundingClientRect().left).toBeNear(
clientLeftForCharacter(component, 4, 25)
);
// Updates the horizontal position on scroll
await setScrollLeft(component, 150);
expect(overlayWrapper.getBoundingClientRect().left).toBe(
expect(overlayWrapper.getBoundingClientRect().left).toBeNear(
clientLeftForCharacter(component, 4, 25)
);
// Shifts the overlay horizontally to ensure the overlay element does not
// overflow the window
await setScrollLeft(component, 30);
expect(overlayElement.getBoundingClientRect().right).toBe(
expect(overlayElement.getBoundingClientRect().right).toBeNear(
fakeWindow.getBoundingClientRect().right
);
await setScrollLeft(component, 280);
expect(overlayElement.getBoundingClientRect().left).toBe(
expect(overlayElement.getBoundingClientRect().left).toBeNear(
fakeWindow.getBoundingClientRect().left
);
// Updates the vertical position on scroll
await setScrollTop(component, 60);
expect(overlayWrapper.getBoundingClientRect().top).toBe(
expect(overlayWrapper.getBoundingClientRect().top).toBeNear(
clientTopForLine(component, 5)
);
@ -2630,25 +2635,25 @@ describe('TextEditorComponent', () => {
// overflow the bottom of the window
setScrollLeft(component, 100);
await setScrollTop(component, 0);
expect(overlayWrapper.getBoundingClientRect().bottom).toBe(
expect(overlayWrapper.getBoundingClientRect().bottom).toBeNear(
clientTopForLine(component, 4)
);
// Flips the overlay vertically on overlay resize if necessary
await setScrollTop(component, 20);
expect(overlayWrapper.getBoundingClientRect().top).toBe(
expect(overlayWrapper.getBoundingClientRect().top).toBeNear(
clientTopForLine(component, 5)
);
overlayElement.style.height = 60 + 'px';
await overlayComponent.getNextUpdatePromise();
expect(overlayWrapper.getBoundingClientRect().bottom).toBe(
expect(overlayWrapper.getBoundingClientRect().bottom).toBeNear(
clientTopForLine(component, 4)
);
// Does not flip the overlay vertically if it would overflow the top of the window
overlayElement.style.height = 80 + 'px';
await overlayComponent.getNextUpdatePromise();
expect(overlayWrapper.getBoundingClientRect().top).toBe(
expect(overlayWrapper.getBoundingClientRect().top).toBeNear(
clientTopForLine(component, 5)
);
@ -2721,7 +2726,7 @@ describe('TextEditorComponent', () => {
const { scrollContainer, gutterContainer } = component.refs;
function checkScrollContainerLeft() {
expect(scrollContainer.getBoundingClientRect().left).toBe(
expect(scrollContainer.getBoundingClientRect().left).toBeNear(
Math.round(gutterContainer.element.getBoundingClientRect().right)
);
}
@ -2829,19 +2834,19 @@ describe('TextEditorComponent', () => {
const [decorationNode3] = gutterB.getElement().firstChild.children;
expect(decorationNode1.className).toBe('decoration a');
expect(decorationNode1.getBoundingClientRect().top).toBe(
expect(decorationNode1.getBoundingClientRect().top).toBeNear(
clientTopForLine(component, 2)
);
expect(decorationNode1.getBoundingClientRect().bottom).toBe(
expect(decorationNode1.getBoundingClientRect().bottom).toBeNear(
clientTopForLine(component, 5)
);
expect(decorationNode1.firstChild).toBeNull();
expect(decorationNode2.className).toBe('decoration b');
expect(decorationNode2.getBoundingClientRect().top).toBe(
expect(decorationNode2.getBoundingClientRect().top).toBeNear(
clientTopForLine(component, 6)
);
expect(decorationNode2.getBoundingClientRect().bottom).toBe(
expect(decorationNode2.getBoundingClientRect().bottom).toBeNear(
clientTopForLine(component, 8)
);
expect(decorationNode2.firstChild).toBe(decorationElement1);
@ -2851,10 +2856,10 @@ describe('TextEditorComponent', () => {
expect(decorationElement1.offsetWidth).toBe(decorationNode2.offsetWidth);
expect(decorationNode3.className).toBe('decoration');
expect(decorationNode3.getBoundingClientRect().top).toBe(
expect(decorationNode3.getBoundingClientRect().top).toBeNear(
clientTopForLine(component, 9)
);
expect(decorationNode3.getBoundingClientRect().bottom).toBe(
expect(decorationNode3.getBoundingClientRect().bottom).toBeNear(
clientTopForLine(component, 12) + component.getLineHeight()
);
expect(decorationNode3.firstChild).toBe(decorationElement2);
@ -2992,7 +2997,7 @@ describe('TextEditorComponent', () => {
await component.getNextUpdatePromise();
expect(component.getRenderedStartRow()).toBe(0);
expect(component.getRenderedEndRow()).toBe(9);
expect(component.getScrollHeight()).toBe(
expect(component.getScrollHeight()).toBeNear(
editor.getScreenLineCount() * component.getLineHeight() +
getElementHeight(item1) +
getElementHeight(item2)
@ -3039,7 +3044,7 @@ describe('TextEditorComponent', () => {
await component.getNextUpdatePromise();
expect(component.getRenderedStartRow()).toBe(0);
expect(component.getRenderedEndRow()).toBe(9);
expect(component.getScrollHeight()).toBe(
expect(component.getScrollHeight()).toBeNear(
editor.getScreenLineCount() * component.getLineHeight() +
getElementHeight(item1) +
getElementHeight(item2) +
@ -3078,7 +3083,7 @@ describe('TextEditorComponent', () => {
await component.getNextUpdatePromise();
expect(component.getRenderedStartRow()).toBe(0);
expect(component.getRenderedEndRow()).toBe(9);
expect(component.getScrollHeight()).toBe(
expect(component.getScrollHeight()).toBeNear(
editor.getScreenLineCount() * component.getLineHeight() +
getElementHeight(item2) +
getElementHeight(item3) +
@ -3113,7 +3118,7 @@ describe('TextEditorComponent', () => {
await component.getNextUpdatePromise();
expect(component.getRenderedStartRow()).toBe(0);
expect(component.getRenderedEndRow()).toBe(9);
expect(component.getScrollHeight()).toBe(
expect(component.getScrollHeight()).toBeNear(
editor.getScreenLineCount() * component.getLineHeight() +
getElementHeight(item2) +
getElementHeight(item3) +
@ -3147,7 +3152,7 @@ describe('TextEditorComponent', () => {
await component.getNextUpdatePromise();
expect(component.getRenderedStartRow()).toBe(0);
expect(component.getRenderedEndRow()).toBe(9);
expect(component.getScrollHeight()).toBe(
expect(component.getScrollHeight()).toBeNear(
editor.getScreenLineCount() * component.getLineHeight() +
getElementHeight(item2) +
getElementHeight(item3) +
@ -3183,7 +3188,7 @@ describe('TextEditorComponent', () => {
);
expect(component.getRenderedStartRow()).toBe(3);
expect(component.getRenderedEndRow()).toBe(12);
expect(component.getScrollHeight()).toBe(
expect(component.getScrollHeight()).toBeNear(
editor.getScreenLineCount() * component.getLineHeight() +
getElementHeight(item2) +
getElementHeight(item3) +
@ -3214,7 +3219,7 @@ describe('TextEditorComponent', () => {
await component.getNextUpdatePromise();
expect(component.getRenderedStartRow()).toBe(0);
expect(component.getRenderedEndRow()).toBe(9);
expect(component.getScrollHeight()).toBe(
expect(component.getScrollHeight()).toBeNear(
editor.getScreenLineCount() * component.getLineHeight() +
getElementHeight(item2) +
getElementHeight(item3) +
@ -3253,7 +3258,7 @@ describe('TextEditorComponent', () => {
await component.getNextUpdatePromise();
expect(component.getRenderedStartRow()).toBe(0);
expect(component.getRenderedEndRow()).toBe(9);
expect(component.getScrollHeight()).toBe(
expect(component.getScrollHeight()).toBeNear(
editor.getScreenLineCount() * component.getLineHeight() +
getElementHeight(item2) +
getElementHeight(item3) +
@ -3303,7 +3308,7 @@ describe('TextEditorComponent', () => {
await component.getNextUpdatePromise();
expect(component.getRenderedStartRow()).toBe(0);
expect(component.getRenderedEndRow()).toBe(9);
expect(component.getScrollHeight()).toBe(
expect(component.getScrollHeight()).toBeNear(
editor.getScreenLineCount() * component.getLineHeight() +
getElementHeight(item2) +
getElementHeight(item3) +
@ -3341,7 +3346,7 @@ describe('TextEditorComponent', () => {
component.getRenderedStartRow() === 0 &&
component.getRenderedEndRow() === 13
);
expect(component.getScrollHeight()).toBe(
expect(component.getScrollHeight()).toBeNear(
editor.getScreenLineCount() * component.getLineHeight() +
getElementHeight(item2) +
getElementHeight(item3) +
@ -3832,16 +3837,16 @@ describe('TextEditorComponent', () => {
tile.tileStartRow
).parentElement;
const linesTileBoundingRect = linesTileElement.getBoundingClientRect();
expect(linesTileBoundingRect.height).toBe(tile.height);
expect(linesTileBoundingRect.top).toBe(top);
expect(linesTileBoundingRect.height).toBeNear(tile.height);
expect(linesTileBoundingRect.top).toBeNear(top);
const lineNumbersTileElement = lineNumberNodeForScreenRow(
component,
tile.tileStartRow
).parentElement;
const lineNumbersTileBoundingRect = lineNumbersTileElement.getBoundingClientRect();
expect(lineNumbersTileBoundingRect.height).toBe(tile.height);
expect(lineNumbersTileBoundingRect.top).toBe(top);
expect(lineNumbersTileBoundingRect.height).toBeNear(tile.height);
expect(lineNumbersTileBoundingRect.top).toBeNear(top);
top += tile.height;
}
@ -3853,7 +3858,7 @@ describe('TextEditorComponent', () => {
for (let row = startRow; row < endRow; row++) {
const lineNode = lineNodeForScreenRow(component, row);
const lineNumberNode = lineNumberNodeForScreenRow(component, row);
expect(lineNumberNode.getBoundingClientRect().top).toBe(
expect(lineNumberNode.getBoundingClientRect().top).toBeNear(
lineNode.getBoundingClientRect().top
);
}
@ -3986,8 +3991,8 @@ describe('TextEditorComponent', () => {
element.style.height = 4 * component.getLineHeight() + 'px';
await component.getNextUpdatePromise();
await setScrollTop(component, 4 * component.getLineHeight());
expect(component.getRenderedStartRow()).toBe(4);
expect(component.getRenderedEndRow()).toBe(9);
expect(component.getRenderedStartRow()).toBeNear(4);
expect(component.getRenderedEndRow()).toBeNear(9);
const markerLayer = editor.addMarkerLayer();
const marker1 = markerLayer.markBufferRange([[0, 0], [4, 5]]);
@ -4781,8 +4786,8 @@ describe('TextEditorComponent', () => {
didDrag({ clientX: 199, clientY: 199 });
didDrag({ clientX: 199, clientY: 199 });
didDrag({ clientX: 199, clientY: 199 });
expect(component.getScrollTop()).toBe(maxScrollTop);
expect(component.getScrollLeft()).toBe(maxScrollLeft);
expect(component.getScrollTop()).toBeNear(maxScrollTop);
expect(component.getScrollLeft()).toBeNear(maxScrollLeft);
});
});
@ -5151,8 +5156,8 @@ describe('TextEditorComponent', () => {
didDrag({ clientX: 199, clientY: 199 });
didDrag({ clientX: 199, clientY: 199 });
didDrag({ clientX: 199, clientY: 199 });
expect(component.getScrollTop()).toBe(maxScrollTop);
expect(component.getScrollLeft()).toBe(maxScrollLeft);
expect(component.getScrollTop()).toBeNear(maxScrollTop);
expect(component.getScrollLeft()).toBeNear(maxScrollLeft);
});
});
@ -5761,7 +5766,7 @@ describe('TextEditorComponent', () => {
expect(top).toBe(
clientTopForLine(referenceComponent, 0) - referenceContentRect.top
);
expect(left).toBe(
expect(left).toBeNear(
clientLeftForCharacter(referenceComponent, 0, 5) -
referenceContentRect.left
);
@ -5772,10 +5777,10 @@ describe('TextEditorComponent', () => {
row: 12,
column: 1
});
expect(top).toBe(
expect(top).toBeNear(
clientTopForLine(referenceComponent, 12) - referenceContentRect.top
);
expect(left).toBe(
expect(left).toBeNear(
clientLeftForCharacter(referenceComponent, 12, 1) -
referenceContentRect.left
);
@ -5789,10 +5794,10 @@ describe('TextEditorComponent', () => {
row: 3,
column: 5
});
expect(top).toBe(
expect(top).toBeNear(
clientTopForLine(referenceComponent, 3) - referenceContentRect.top
);
expect(left).toBe(
expect(left).toBeNear(
clientLeftForCharacter(referenceComponent, 3, 5) -
referenceContentRect.left
);
@ -5970,7 +5975,9 @@ describe('TextEditorComponent', () => {
'px';
await component.getNextUpdatePromise();
expect(component.getMaxScrollTop() / component.getLineHeight()).toBe(9);
expect(component.getMaxScrollTop() / component.getLineHeight()).toBeNear(
9
);
expect(component.refs.verticalScrollbar.element.scrollTop).toBe(
0 * component.getLineHeight()
);
@ -5978,21 +5985,21 @@ describe('TextEditorComponent', () => {
editor.setFirstVisibleScreenRow(1);
expect(component.getFirstVisibleRow()).toBe(1);
await component.getNextUpdatePromise();
expect(component.refs.verticalScrollbar.element.scrollTop).toBe(
expect(component.refs.verticalScrollbar.element.scrollTop).toBeNear(
1 * component.getLineHeight()
);
editor.setFirstVisibleScreenRow(5);
expect(component.getFirstVisibleRow()).toBe(5);
await component.getNextUpdatePromise();
expect(component.refs.verticalScrollbar.element.scrollTop).toBe(
expect(component.refs.verticalScrollbar.element.scrollTop).toBeNear(
5 * component.getLineHeight()
);
editor.setFirstVisibleScreenRow(11);
expect(component.getFirstVisibleRow()).toBe(9);
await component.getNextUpdatePromise();
expect(component.refs.verticalScrollbar.element.scrollTop).toBe(
expect(component.refs.verticalScrollbar.element.scrollTop).toBeNear(
9 * component.getLineHeight()
);
});
@ -6198,7 +6205,7 @@ async function setEditorWidthInCharacters(component, widthInCharacters) {
function verifyCursorPosition(component, cursorNode, row, column) {
const rect = cursorNode.getBoundingClientRect();
expect(Math.round(rect.top)).toBe(clientTopForLine(component, row));
expect(Math.round(rect.top)).toBeNear(clientTopForLine(component, row));
expect(Math.round(rect.left)).toBe(
Math.round(clientLeftForCharacter(component, row, column))
);

View File

@ -438,12 +438,15 @@ describe('TextEditorElement', () => {
const bottom = 13 * editor.getLineHeightInPixels();
const left = Math.round(3 * editor.getDefaultCharWidth());
const right = Math.round(11 * editor.getDefaultCharWidth());
expect(element.pixelRectForScreenRange([[2, 3], [13, 11]])).toEqual({
top,
left,
height: bottom + editor.getLineHeightInPixels() - top,
width: right - left
});
const pixelRect = element.pixelRectForScreenRange([[2, 3], [13, 11]]);
expect(pixelRect.top).toEqual(top);
expect(pixelRect.left).toEqual(left);
expect(pixelRect.height).toEqual(
bottom + editor.getLineHeightInPixels() - top
);
expect(pixelRect.width).toBeNear(right - left);
});
});

View File

@ -46,7 +46,7 @@ module.exports = class ApplicationDelegate {
async getTemporaryWindowState() {
const stateJSON = await ipcHelpers.call('get-temporary-window-state');
return JSON.parse(stateJSON);
return stateJSON && JSON.parse(stateJSON);
}
setTemporaryWindowState(state) {

View File

@ -802,11 +802,10 @@ module.exports = class AtomApplication extends EventEmitter {
);
this.disposable.add(
ipcHelpers.on(ipcMain, 'resolve-proxy', (event, requestId, url) => {
event.sender.session.resolveProxy(url, proxy => {
if (!event.sender.isDestroyed())
event.sender.send('did-resolve-proxy', requestId, proxy);
});
ipcHelpers.on(ipcMain, 'resolve-proxy', async (event, requestId, url) => {
const proxy = await event.sender.session.resolveProxy(url);
if (!event.sender.isDestroyed())
event.sender.send('did-resolve-proxy', requestId, proxy);
})
);
@ -2015,7 +2014,13 @@ module.exports = class AtomApplication extends EventEmitter {
// File dialog defaults to project directory of currently active editor
if (path) openOptions.defaultPath = path;
dialog.showOpenDialog(parentWindow, openOptions, callback);
dialog
.showOpenDialog(parentWindow, openOptions)
.then(({ filePaths, bookmarks }) => {
if (typeof callback === 'function') {
callback(filePaths, bookmarks);
}
});
}
async promptForRestart() {

View File

@ -1,4 +1,10 @@
const { BrowserWindow, app, dialog, ipcMain } = require('electron');
const {
BrowserWindow,
app,
dialog,
ipcMain,
nativeImage
} = require('electron');
const getAppName = require('../get-app-name');
const path = require('path');
const url = require('url');
@ -51,6 +57,8 @@ module.exports = class AtomWindow extends EventEmitter {
nodeIntegration: true,
webviewTag: true,
// TodoElectronIssue: remote module is deprecated https://www.electronjs.org/docs/breaking-changes#default-changed-enableremotemodule-defaults-to-false
enableRemoteModule: true,
// node support in threads
nodeIntegrationInWorker: true
},
@ -59,7 +67,8 @@ module.exports = class AtomWindow extends EventEmitter {
// Don't set icon on Windows so the exe's ico will be used as window and
// taskbar's icon. See https://github.com/atom/atom/issues/4811 for more.
if (process.platform === 'linux') options.icon = ICON_PATH;
if (process.platform === 'linux')
options.icon = nativeImage.createFromPath(ICON_PATH);
if (this.shouldAddCustomTitleBar()) options.titleBarStyle = 'hidden';
if (this.shouldAddCustomInsetTitleBar())
options.titleBarStyle = 'hiddenInset';
@ -320,7 +329,19 @@ module.exports = class AtomWindow extends EventEmitter {
}
replaceEnvironment(env) {
this.browserWindow.webContents.send('environment', env);
const {
NODE_ENV,
NODE_PATH,
ATOM_HOME,
ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT
} = env;
this.browserWindow.webContents.send('environment', {
NODE_ENV,
NODE_PATH,
ATOM_HOME,
ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT
});
}
sendMessage(message, detail) {

View File

@ -40,6 +40,9 @@ module.exports = function start(resourcePath, devResourcePath, startTime) {
const previousConsoleLog = console.log;
console.log = nslog;
// TodoElectronIssue this should be set to true before Electron 12 - https://github.com/electron/electron/issues/18397
app.allowRendererProcessReuse = false;
app.commandLine.appendSwitch('enable-experimental-web-platform-features');
const args = parseCommandLine(process.argv.slice(1));

View File

@ -281,25 +281,6 @@ function registerBuiltins(devMode) {
if (cache.builtins.atom == null) {
cache.builtins.atom = path.join(cache.resourcePath, 'exports', 'atom.js');
}
const electronAsarRoot = path.join(process.resourcesPath, 'electron.asar');
const commonRoot = path.join(electronAsarRoot, 'common', 'api');
const commonBuiltins = ['clipboard', 'shell'];
for (const builtin of commonBuiltins) {
cache.builtins[builtin] = path.join(commonRoot, `${builtin}.js`);
}
const rendererRoot = path.join(electronAsarRoot, 'renderer', 'api');
const rendererBuiltins = [
'crash-reporter',
'ipc-renderer',
'remote'
// 'screen' Deprecated https://www.electronjs.org/docs/breaking-changes#api-changed-electronscreen-in-the-renderer-process-should-be-accessed-via-remote
];
for (const builtin of rendererBuiltins) {
cache.builtins[builtin] = path.join(rendererRoot, `${builtin}.js`);
}
}
exports.create = function(modulePath) {

View File

@ -68,7 +68,7 @@ module.exports = class ReopenProjectMenuManager {
async applyWindowsJumpListRemovals() {
if (process.platform !== 'win32') return;
if (this.app === undefined) {
this.app = require('remote').app;
this.app = require('electron').remote.app;
}
const removed = this.app
@ -89,7 +89,7 @@ module.exports = class ReopenProjectMenuManager {
updateWindowsJumpList() {
if (process.platform !== 'win32') return;
if (this.app === undefined) {
this.app = require('remote').app;
this.app = require('electron').remote.app;
}
this.app.setJumpList([