From 08b20403fa8f217068f13af74ab1fdf50f8d44bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20B=C3=B6hm?= <188768+fb55@users.noreply.github.com> Date: Tue, 24 Aug 2021 13:14:09 +0100 Subject: [PATCH] fix(tokenizer): Don't process data after error (#923) Also add a test for multi-byte entities, and change the Jest coverage provider to V8. --- package.json | 3 ++- src/Tokenizer.ts | 4 ++-- .../Events/43-multibyte-entity.json | 10 ++++++++++ src/__tests__/events.ts | 17 +++++++++++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 src/__fixtures__/Events/43-multibyte-entity.json diff --git a/package.json b/package.json index ec0203309..304162d37 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,8 @@ }, "jest": { "preset": "ts-jest", - "testEnvironment": "node" + "testEnvironment": "node", + "coverageProvider": "v8" }, "prettier": { "tabWidth": 4 diff --git a/src/Tokenizer.ts b/src/Tokenizer.ts index 46e2361ae..a606e3a45 100644 --- a/src/Tokenizer.ts +++ b/src/Tokenizer.ts @@ -315,14 +315,14 @@ export default class Tokenizer { } public write(chunk: string): void { - if (this.ended) this.cbs.onerror(Error(".write() after done!")); + if (this.ended) return this.cbs.onerror(Error(".write() after done!")); if (this.buffer.length) this.buffer += chunk; else this.buffer = chunk; this.parse(); } public end(chunk?: string): void { - if (this.ended) this.cbs.onerror(Error(".end() after done!")); + if (this.ended) return this.cbs.onerror(Error(".end() after done!")); if (chunk) this.write(chunk); this.ended = true; if (this.running) this.finish(); diff --git a/src/__fixtures__/Events/43-multibyte-entity.json b/src/__fixtures__/Events/43-multibyte-entity.json new file mode 100644 index 000000000..7f587175f --- /dev/null +++ b/src/__fixtures__/Events/43-multibyte-entity.json @@ -0,0 +1,10 @@ +{ + "name": "Multi-byte entity", + "html": "≧̸", + "expected": [ + { + "data": ["≧̸"], + "event": "text" + } + ] +} diff --git a/src/__tests__/events.ts b/src/__tests__/events.ts index 2abd5852b..be766b3f1 100644 --- a/src/__tests__/events.ts +++ b/src/__tests__/events.ts @@ -1,3 +1,4 @@ +import { Parser } from ".."; import * as helper from "../__fixtures__/test-helper"; helper.createSuite("Events", (test, cb) => @@ -7,3 +8,19 @@ helper.createSuite("Events", (test, cb) => test.html ) ); + +describe("Helper", () => { + it("should handle errors", () => { + const eventCb = jest.fn(); + const parser = new Parser(helper.getEventCollector(eventCb)); + + parser.end(); + parser.write("foo"); + + expect(eventCb).toHaveBeenCalledTimes(2); + expect(eventCb).toHaveBeenNthCalledWith(1, null, []); + expect(eventCb).toHaveBeenLastCalledWith( + new Error(".write() after done!") + ); + }); +});