Fix memory access error on autocomplete-html specs

This commit is contained in:
Andrew Dupont 2024-01-07 12:56:10 -08:00
parent 206a15a7b1
commit 413eeeaa5b
5 changed files with 52 additions and 26 deletions

View File

@ -1,7 +1,8 @@
module.exports = {
env: { jasmine: true },
globals: {
"waitsForPromise": true
"waitsForPromise": true,
"advanceClock": true
},
rules: {
"node/no-unpublished-require": "off",

View File

@ -32,19 +32,21 @@ describe('HTML autocompletions', () => {
return -1;
}
beforeEach(() => {
waitsForPromise(() => atom.packages.activatePackage('autocomplete-html'))
waitsForPromise(() => atom.packages.activatePackage('language-html'))
waitsForPromise(() => atom.workspace.open('test.html'))
waitsForPromise(() => {
let editor = atom.workspace.getActiveTextEditor()
let languageMode = editor.getBuffer().getLanguageMode()
return languageMode.ready
})
beforeEach(async () => {
await atom.packages.activatePackage('autocomplete-html')
await atom.packages.activatePackage('language-html')
await atom.workspace.open('test.html')
editor = atom.workspace.getActiveTextEditor()
languageMode = editor.getBuffer().getLanguageMode()
languageMode.useAsyncParsing = false
languageMode.useAsyncIndent = false
await languageMode.ready
runs(() => provider = atom.packages.getActivePackage('autocomplete-html').mainModule.getProvider())
runs(() => editor = atom.workspace.getActiveTextEditor())
runs(() => languageMode = editor.getBuffer().getLanguageMode())
provider = atom.packages.getActivePackage('autocomplete-html').mainModule.getProvider()
})
afterEach(async () => {
await languageMode.atTransactionEnd()
})
it('returns no completions when not at the start of a tag', async () => {
@ -591,13 +593,8 @@ describe('HTML autocompletions', () => {
return languageMode.atTransactionEnd()
})
waitsForPromise(() => {
return atom.packages.activatePackage('language-javascript')
})
runs(() => {
editor.setCursorBufferPosition([0, editor.getText().indexOf('""') + 1])
expect(() => getCompletions()).not.toThrow()
})
await atom.packages.activatePackage('language-javascript')
editor.setCursorBufferPosition([0, editor.getText().indexOf('""') + 1])
expect(() => getCompletions()).not.toThrow()
})
})

View File

@ -0,0 +1,10 @@
module.exports = {
env: { jasmine: true },
rules: {
"semi": ["error", "never"],
"node/no-unpublished-require": "off",
"node/no-extraneous-require": "off",
"no-unused-vars": "off",
"no-empty": "off"
}
}

View File

@ -16,7 +16,7 @@ async function languageModeReady (editor) {
}
}
fdescribe('TextEditor', () => {
describe('TextEditor', () => {
let buffer, editor, lineLengths, languageMode;
beforeEach(async () => {

View File

@ -4043,20 +4043,38 @@ class LanguageLayer {
class NodeRangeSet {
constructor(previous, nodes, injectionPoint) {
this.previous = previous;
this.nodes = nodes;
this.newlinesBetween = injectionPoint.newlinesBetween;
this.includeAdjacentWhitespace = injectionPoint.includeAdjacentWhitespace;
this.includeChildren = injectionPoint.includeChildren;
// We shouldn't retain references to nodes here because the tree might get
// disposed of layer. Let's compile the information we need now while we're
// sure the tree is fresh.
this.nodeSpecs = [];
for (let node of nodes) {
this.nodeSpecs.push(this.getNodeSpec(node, true));
}
}
getNodeSpec (node, getChildren) {
let { startIndex, endIndex, startPosition, endPosition, id } = node;
let result = { startIndex, endIndex, startPosition, endPosition, id };
if (node.children && getChildren) {
result.children = [];
for (let child of node.children) {
result.children.push(this.getNodeSpec(child, false));
}
}
return result;
}
getRanges(buffer) {
const previousRanges = this.previous && this.previous.getRanges(buffer);
let result = [];
for (const node of this.nodes) {
for (const node of this.nodeSpecs) {
let position = node.startPosition, index = node.startIndex;
if (!this.includeChildren) {
if (node.children && !this.includeChildren) {
// If `includeChildren` is `false`, we're effectively collecting all
// the disjoint text nodes that are direct descendants of this node.
for (const child of node.children) {