From 54fa0477714a7911f76cf4ce171530866fb11b56 Mon Sep 17 00:00:00 2001 From: Tony Jin Date: Thu, 21 Sep 2017 17:24:20 -0700 Subject: [PATCH] Fix: Document print in Chrome (#406) Revoke object URL during viewer cleanup. --- src/lib/viewers/doc/DocBaseViewer.js | 10 ++++++---- src/lib/viewers/doc/__tests__/DocBaseViewer-test.js | 10 +++++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/lib/viewers/doc/DocBaseViewer.js b/src/lib/viewers/doc/DocBaseViewer.js index a2b96fe1a..a6ea59c57 100644 --- a/src/lib/viewers/doc/DocBaseViewer.js +++ b/src/lib/viewers/doc/DocBaseViewer.js @@ -111,6 +111,7 @@ class DocBaseViewer extends BaseViewer { // Clean up print blob this.printBlob = null; + URL.revokeObjectURL(this.printURL); if (this.pageControls) { this.pageControls.removeListener('pagechange', this.setPage); @@ -692,8 +693,11 @@ class DocBaseViewer extends BaseViewer { // For other browsers, open and print in a new tab } else { - const printURL = URL.createObjectURL(this.printBlob); - const printResult = window.open(printURL); + if (!this.printURL) { + this.printURL = URL.createObjectURL(this.printBlob); + } + + const printResult = window.open(this.printURL); // Open print popup if possible if (printResult && typeof printResult.print === 'function') { @@ -721,8 +725,6 @@ class DocBaseViewer extends BaseViewer { } else { this.emit('printsuccess'); } - - URL.revokeObjectURL(printURL); } } diff --git a/src/lib/viewers/doc/__tests__/DocBaseViewer-test.js b/src/lib/viewers/doc/__tests__/DocBaseViewer-test.js index 68f6a82d6..f7c19033c 100644 --- a/src/lib/viewers/doc/__tests__/DocBaseViewer-test.js +++ b/src/lib/viewers/doc/__tests__/DocBaseViewer-test.js @@ -101,10 +101,12 @@ describe('src/lib/viewers/doc/DocBaseViewer', () => { describe('destroy()', () => { it('should unbind listeners and clear the print blob', () => { const unbindDOMListenersStub = sandbox.stub(docBase, 'unbindDOMListeners'); + sandbox.stub(URL, 'revokeObjectURL'); docBase.destroy(); expect(unbindDOMListenersStub).to.be.called; expect(docBase.printBlob).to.equal(null); + expect(URL.revokeObjectURL).to.be.calledWith(docBase.printUrl); }); it('should destroy the controls', () => { @@ -387,10 +389,9 @@ describe('src/lib/viewers/doc/DocBaseViewer', () => { describe('browserPrint()', () => { beforeEach(() => { stubs.emit = sandbox.stub(docBase, 'emit'); - stubs.createObject = sandbox.stub(URL, 'createObjectURL'); + stubs.createObject = sandbox.stub(URL, 'createObjectURL').returns('test'); stubs.open = sandbox.stub(window, 'open').returns(false); stubs.browser = sandbox.stub(Browser, 'getName').returns('Chrome'); - stubs.revokeObjectURL = sandbox.stub(URL, 'revokeObjectURL'); stubs.printResult = { print: sandbox.stub(), addEventListener: sandbox.stub() }; docBase.printBlob = true; window.navigator.msSaveOrOpenBlob = sandbox.stub().returns(true); @@ -421,7 +422,7 @@ describe('src/lib/viewers/doc/DocBaseViewer', () => { docBase.browserPrint(); expect(stubs.createObject).to.be.calledWith(docBase.printBlob); - expect(stubs.open).to.be.called.with; + expect(stubs.open).to.be.calledWith(docBase.printURL); expect(stubs.emit).to.be.called; }); @@ -431,10 +432,9 @@ describe('src/lib/viewers/doc/DocBaseViewer', () => { docBase.browserPrint(); expect(stubs.createObject).to.be.calledWith(docBase.printBlob); - expect(stubs.open).to.be.called.with; + expect(stubs.open).to.be.calledWith(docBase.printURL); expect(stubs.browser).to.be.called; expect(stubs.emit).to.be.called; - expect(stubs.revokeObjectURL).to.be.called; }); it('should use a timeout in safari', () => {