diff --git a/src/lib/Preview.js b/src/lib/Preview.js index 8350c5b7e..e1d4d39ae 100644 --- a/src/lib/Preview.js +++ b/src/lib/Preview.js @@ -1747,7 +1747,7 @@ class Preview extends EventEmitter { } if (this.viewer && typeof this.viewer.onKeydown === 'function') { - consumed = !!this.viewer.onKeydown(key); + consumed = !!this.viewer.onKeydown(key, event); } if (!consumed) { diff --git a/src/lib/viewers/doc/DocBaseViewer.js b/src/lib/viewers/doc/DocBaseViewer.js index df84f9ec0..b9169e941 100644 --- a/src/lib/viewers/doc/DocBaseViewer.js +++ b/src/lib/viewers/doc/DocBaseViewer.js @@ -500,9 +500,10 @@ class DocBaseViewer extends BaseViewer { * Handles keyboard events for document viewer. * * @param {string} key - keydown key + * @param {Object} event - Key event * @return {boolean} consumed or not */ - onKeydown(key) { + onKeydown(key, event) { switch (key) { case 'ArrowLeft': this.previousPage(); @@ -517,6 +518,9 @@ class DocBaseViewer extends BaseViewer { this.nextPage(); break; default: + if (this.findBar) { + return this.findBar.onKeydown(event); + } return false; } diff --git a/src/lib/viewers/doc/DocFindBar.js b/src/lib/viewers/doc/DocFindBar.js index 48fb47736..dd3b6a168 100644 --- a/src/lib/viewers/doc/DocFindBar.js +++ b/src/lib/viewers/doc/DocFindBar.js @@ -35,7 +35,7 @@ class DocFindBar extends EventEmitter { } // Bind context for callbacks - this.displayFindBarHandler = this.displayFindBarHandler.bind(this); + this.onKeydown = this.onKeydown.bind(this); this.findFieldHandler = this.findFieldHandler.bind(this); this.barKeyDownHandler = this.barKeyDownHandler.bind(this); this.findNextHandler = this.findNextHandler.bind(this); @@ -213,9 +213,6 @@ class DocFindBar extends EventEmitter { this.findPreviousButtonEl.addEventListener('click', this.findPreviousHandler); this.findNextButtonEl.addEventListener('click', this.findNextHandler); this.findCloseButtonEl.addEventListener('click', this.close); - - // KeyDown handler to show/hide find bar - document.addEventListener('keydown', this.displayFindBarHandler); } /** @@ -230,9 +227,6 @@ class DocFindBar extends EventEmitter { this.findPreviousButtonEl.removeEventListener('click', this.findPreviousHandler); this.findNextButtonEl.removeEventListener('click', this.findNextHandler); this.findCloseButtonEl.removeEventListener('click', this.close); - - // Remove KeyDown handler to show/hide find bar - document.removeEventListener('keydown', this.displayFindBarHandler); } //-------------------------------------------------------------------------- @@ -245,7 +239,7 @@ class DocFindBar extends EventEmitter { * @param {Event} event - Key event * @return {void} */ - displayFindBarHandler(event) { + onKeydown(event) { // Lowercase keydown so we capture both lower and uppercase const key = decodeKeydown(event).toLowerCase(); switch (key) { @@ -260,8 +254,10 @@ class DocFindBar extends EventEmitter { event.preventDefault(); break; default: - break; + return false; } + + return true; } /** diff --git a/src/lib/viewers/doc/DocumentViewer.js b/src/lib/viewers/doc/DocumentViewer.js index a5d71e850..4957049cf 100644 --- a/src/lib/viewers/doc/DocumentViewer.js +++ b/src/lib/viewers/doc/DocumentViewer.js @@ -38,9 +38,10 @@ class DocumentViewer extends DocBaseViewer { * * @override * @param {string} key - Keydown key + * @param {Object} event - Key event * @return {boolean} Consumed or not */ - onKeydown(key) { + onKeydown(key, event) { if (key === 'Shift++') { this.zoomIn(); return true; @@ -55,7 +56,7 @@ class DocumentViewer extends DocBaseViewer { return true; } - return super.onKeydown(key); + return super.onKeydown(key, event); } //-------------------------------------------------------------------------- diff --git a/src/lib/viewers/doc/__tests__/DocBaseViewer-test.js b/src/lib/viewers/doc/__tests__/DocBaseViewer-test.js index df9d8d911..512a4b06e 100644 --- a/src/lib/viewers/doc/__tests__/DocBaseViewer-test.js +++ b/src/lib/viewers/doc/__tests__/DocBaseViewer-test.js @@ -761,7 +761,7 @@ describe('src/lib/viewers/doc/DocBaseViewer', () => { }); }); - describe('onKeyDown()', () => { + describe('onKeydown()', () => { beforeEach(() => { stubs.previousPage = sandbox.stub(docBase, 'previousPage'); stubs.nextPage = sandbox.stub(docBase, 'nextPage'); @@ -785,6 +785,18 @@ describe('src/lib/viewers/doc/DocBaseViewer', () => { expect(rightBracket).to.equal(true); }); + it('should call the findBar onKeydown if present', () => { + const keys = 'ctrl+f'; + const mockEvent = sandbox.stub(); + const onKeydownStub = sandbox.stub().withArgs(mockEvent); + docBase.findBar = { + onKeydown: onKeydownStub, + destroy: sandbox.stub() + }; + docBase.onKeydown(keys, mockEvent); + expect(onKeydownStub).to.have.been.calledOnce; + }); + it('should return false if there is no match', () => { const arrowLeft = docBase.onKeydown('ArrowUp'); expect(stubs.previousPage).to.not.be.called; diff --git a/src/lib/viewers/doc/__tests__/DocFindBar-test.js b/src/lib/viewers/doc/__tests__/DocFindBar-test.js index d268de003..11d50b9a9 100644 --- a/src/lib/viewers/doc/__tests__/DocFindBar-test.js +++ b/src/lib/viewers/doc/__tests__/DocFindBar-test.js @@ -265,7 +265,6 @@ describe('lib/viewers/doc/DocFindBar', () => { const findPrevStub = sandbox.stub(docFindBar.findPreviousButtonEl, 'removeEventListener'); const findNextStub = sandbox.stub(docFindBar.findNextButtonEl, 'removeEventListener'); const findCloseStub = sandbox.stub(docFindBar.findCloseButtonEl, 'removeEventListener'); - const documentStub = sandbox.stub(document, 'removeEventListener'); docFindBar.unbindDOMListeners(); expect(barStub).to.be.calledWith('keydown', docFindBar.barKeyDownHandler); @@ -273,11 +272,10 @@ describe('lib/viewers/doc/DocFindBar', () => { expect(findPrevStub).to.be.calledWith('click', docFindBar.findPreviousHandler); expect(findNextStub).to.be.calledWith('click', docFindBar.findNextHandler); expect(findCloseStub).to.be.calledWith('click', docFindBar.close); - expect(documentStub).to.be.calledWith('keydown', docFindBar.displayFindBarHandler); }); }); - describe('displayFindBarHandler()', () => { + describe('onKeydown()', () => { beforeEach(() => { stubs.decodeKeydown = sandbox.stub(util, 'decodeKeydown'); stubs.open = sandbox.stub(docFindBar, 'open'); @@ -292,7 +290,7 @@ describe('lib/viewers/doc/DocFindBar', () => { docFindBar.canDownload = false; stubs.decodeKeydown.returns('meta+f'); - docFindBar.displayFindBarHandler(stubs.event); + docFindBar.onKeydown(stubs.event); expect(stubs.open).to.not.be.called; expect(stubs.event.preventDefault).to.be.called; }); @@ -300,7 +298,7 @@ describe('lib/viewers/doc/DocFindBar', () => { it('should open and prevent default if meta+f is entered', () => { stubs.decodeKeydown.returns('meta+f'); - docFindBar.displayFindBarHandler(stubs.event); + docFindBar.onKeydown(stubs.event); expect(stubs.open).to.be.called; expect(stubs.event.preventDefault).to.be.called; }); @@ -308,7 +306,7 @@ describe('lib/viewers/doc/DocFindBar', () => { it('should open and prevent default if control+f is entered', () => { stubs.decodeKeydown.returns('control+f'); - docFindBar.displayFindBarHandler(stubs.event); + docFindBar.onKeydown(stubs.event); expect(stubs.open).to.be.called; expect(stubs.event.preventDefault).to.be.called; }); @@ -316,7 +314,7 @@ describe('lib/viewers/doc/DocFindBar', () => { it('should open and prevent default if meta+g is entered', () => { stubs.decodeKeydown.returns('meta+g'); - docFindBar.displayFindBarHandler(stubs.event); + docFindBar.onKeydown(stubs.event); expect(stubs.open).to.be.called; expect(stubs.event.preventDefault).to.be.called; }); @@ -324,7 +322,7 @@ describe('lib/viewers/doc/DocFindBar', () => { it('should open and prevent default if control+g is entered', () => { stubs.decodeKeydown.returns('control+g'); - docFindBar.displayFindBarHandler(stubs.event); + docFindBar.onKeydown(stubs.event); expect(stubs.open).to.be.called; expect(stubs.event.preventDefault).to.be.called; }); @@ -332,7 +330,7 @@ describe('lib/viewers/doc/DocFindBar', () => { it('should open and prevent default if f3 is entered', () => { stubs.decodeKeydown.returns('f3'); - docFindBar.displayFindBarHandler(stubs.event); + docFindBar.onKeydown(stubs.event); expect(stubs.open).to.be.called; expect(stubs.event.preventDefault).to.be.called; }); @@ -341,7 +339,7 @@ describe('lib/viewers/doc/DocFindBar', () => { stubs.decodeKeydown.returns('escape'); docFindBar.opened = false; - docFindBar.displayFindBarHandler(stubs.event); + docFindBar.onKeydown(stubs.event); expect(stubs.open).to.not.be.called; expect(stubs.close).to.not.be.called; expect(stubs.event.preventDefault).to.not.be.called; diff --git a/src/lib/viewers/doc/__tests__/DocumentViewer-test.js b/src/lib/viewers/doc/__tests__/DocumentViewer-test.js index beaaa4aad..8627c9d29 100644 --- a/src/lib/viewers/doc/__tests__/DocumentViewer-test.js +++ b/src/lib/viewers/doc/__tests__/DocumentViewer-test.js @@ -94,7 +94,7 @@ describe('lib/viewers/doc/DocumentViewer', () => { }); }); - describe('onKeyDown()', () => { + describe('onKeydown()', () => { beforeEach(() => { stubs.zoomIn = sandbox.stub(doc, 'zoomIn'); stubs.zoomOut = sandbox.stub(doc, 'zoomOut'); @@ -132,16 +132,22 @@ describe('lib/viewers/doc/DocumentViewer', () => { }); it('should fallback to doc base\'s onKeydown if no entry matches', () => { + const docbaseStub = sandbox.spy(DocBaseViewer.prototype, 'onKeydown'); + const eventStub = sandbox.stub(); stubs.fullscreen.returns(false); - const result = doc.onKeydown('ArrowDown'); + const key = 'ArrowDown'; + const result = doc.onKeydown(key, eventStub); + expect(docbaseStub).to.have.been.calledWithExactly(key, eventStub); expect(result).to.be.false; expect(stubs.nextPage).to.not.be.called; - stubs.fullscreen.returns(false); - const result2 = doc.onKeydown('ArrowRight'); - + const key2 = 'ArrowRight'; + const result2 = doc.onKeydown(key2, eventStub); + expect(docbaseStub).to.have.been.calledWithExactly(key2, eventStub); expect(result2).to.be.true; + + expect(docbaseStub).to.have.been.calledTwice; }); });