]> git.proxmox.com Git - mirror_xterm.js.git/commitdiff
Fix exception when resizing both dimensions
authorDaniel Imms <daimms@microsoft.com>
Tue, 8 Aug 2017 19:59:02 +0000 (12:59 -0700)
committerDaniel Imms <daimms@microsoft.com>
Tue, 8 Aug 2017 19:59:02 +0000 (12:59 -0700)
This happened because buffers now resize themselves but they were
relying on Terminal to give them a blank line. The blank line was
coming back with the old columns value, causing an NPE.

Fixes #860

src/Buffer.test.ts
src/Buffer.ts
src/Interfaces.ts
src/utils/TestUtils.ts
src/xterm.js

index 5883a8b5dd161d5f360a3d17096be56e7be852fc..e73ae280d1b8f8525a1ee1aa51a26b01365a4ba4 100644 (file)
@@ -143,5 +143,16 @@ describe('Buffer', () => {
         });
       });
     });
+
+    describe('row and column increased', () => {
+      it('should resize properly', () => {
+        buffer.fillViewportRows();
+        buffer.resize(INIT_COLS + 5, INIT_ROWS + 5);
+        assert.equal(buffer.lines.length, INIT_ROWS + 5);
+        for (let i = 0; i < INIT_ROWS + 5; i++) {
+          assert.equal(buffer.lines.get(i).length, INIT_COLS + 5);
+        }
+      });
+    });
   });
 });
index ba47d0c704c07bac0f77a54fd8ea50e6d5bccf9e..d64a92bb193ebd448104dbde0a6a906da61f5dc3 100644 (file)
@@ -85,8 +85,10 @@ export class Buffer implements IBuffer {
     if (this._terminal.cols < newCols) {
       const ch: [number, string, number] = [this._terminal.defAttr, ' ', 1]; // does xterm use the default attr?
       for (let i = 0; i < this._lines.length; i++) {
+        // TODO: This should be removed, with tests setup for the case that was
+        // causing the underlying bug, see https://github.com/sourcelair/xterm.js/issues/824
         if (this._lines.get(i) === undefined) {
-          this._lines.set(i, this._terminal.blankLine());
+          this._lines.set(i, this._terminal.blankLine(undefined, undefined, newCols));
         }
         while (this._lines.get(i).length < newCols) {
           this._lines.get(i).push(ch);
@@ -111,7 +113,7 @@ export class Buffer implements IBuffer {
           } else {
             // Add a blank line if there is no buffer left at the top to scroll to, or if there
             // are blank lines after the cursor
-            this._lines.push(this._terminal.blankLine());
+            this._lines.push(this._terminal.blankLine(undefined, undefined, newCols));
           }
         }
       }
index 70a46d419ac3585e2f6cbc2ebb8afc1caf35a300..f55719a0a15d4718bc99e5d6ec89e59d6d0be2fa 100644 (file)
@@ -48,7 +48,7 @@ export interface ITerminal {
   emit(event: string, data: any);
   reset(): void;
   showCursor(): void;
-  blankLine(cur?: boolean, isWrapped?: boolean);
+  blankLine(cur?: boolean, isWrapped?: boolean, cols?: number);
 }
 
 export interface IBuffer {
index fbb172616e84b72664767dfac51bfe628d5f08ba..eae34cc0c24adf8ded662ef733f9b1eb50478fbd 100644 (file)
@@ -43,9 +43,10 @@ export class MockTerminal implements ITerminal {
   showCursor(): void {
     throw new Error('Method not implemented.');
   }
-  blankLine(cur?: boolean, isWrapped?: boolean) {
+  blankLine(cur?: boolean, isWrapped?: boolean, cols?: number) {
     const line = [];
-    for (let i = 0; i < this.cols; i++) {
+    cols = cols || this.cols;
+    for (let i = 0; i < cols; i++) {
       line.push([0, ' ', 1]);
     }
     return line;
index e9e3465e6b83b98255f67ef1b64dc30036cae1a3..38e7b9c6eb25e547f7276246653f9a18d0357cd5 100644 (file)
@@ -2091,7 +2091,7 @@ Terminal.prototype.eraseLine = function(y) {
  * @param {number} cur First bunch of data for each "blank" character.
  * @param {boolean} isWrapped Whether the new line is wrapped from the previous line.
  */
-Terminal.prototype.blankLine = function(cur, isWrapped) {
+Terminal.prototype.blankLine = function(cur, isWrapped, cols) {
   var attr = cur
   ? this.eraseAttr()
   : this.defAttr;
@@ -2106,7 +2106,8 @@ Terminal.prototype.blankLine = function(cur, isWrapped) {
     line.isWrapped = isWrapped;
   }
 
-  for (; i < this.cols; i++) {
+  cols = cols || this.cols;
+  for (; i < cols; i++) {
     line[i] = ch;
   }