diff --git a/packages/app/obojobo-document-engine/__tests__/Viewer/components/inline-nav-button.test.js b/packages/app/obojobo-document-engine/__tests__/Viewer/components/inline-nav-button.test.js index 046e74d828..636133279e 100644 --- a/packages/app/obojobo-document-engine/__tests__/Viewer/components/inline-nav-button.test.js +++ b/packages/app/obojobo-document-engine/__tests__/Viewer/components/inline-nav-button.test.js @@ -6,8 +6,7 @@ import NavButton from 'src/scripts/viewer/components/inline-nav-button' jest.mock('src/scripts/viewer/util/nav-util', () => ({ goNext: jest.fn(), - goPrev: jest.fn(), - clearSelection: jest.fn() + goPrev: jest.fn() })) const getProps = (type, disabled = false, onClick = null) => ({ diff --git a/packages/app/obojobo-document-engine/__tests__/Viewer/components/viewer-app.test.js b/packages/app/obojobo-document-engine/__tests__/Viewer/components/viewer-app.test.js index 5e2bef1b86..31cbf19318 100644 --- a/packages/app/obojobo-document-engine/__tests__/Viewer/components/viewer-app.test.js +++ b/packages/app/obojobo-document-engine/__tests__/Viewer/components/viewer-app.test.js @@ -596,6 +596,62 @@ describe('ViewerApp', () => { }) }) + test('clearSelectionIfNavTargetChanging clears current selection', done => { + expect.assertions(2) + mocksForMount() + + const mockRemoveAllRanges = jest.fn() + const mockEmpty = jest.fn() + const component = mount() + + // Need to make sure removeAllRanges gets called by default + // while empty gets called if removeAllRanges isn't available + const windowSpy = jest + .spyOn(window, 'getSelection') + .mockReturnValueOnce({ + removeAllRanges: mockRemoveAllRanges, + empty: null + }) + .mockReturnValueOnce({ + removeAllRanges: null, + empty: mockEmpty + }) + .mockReturnValueOnce({ + removeAllRanges: null, + empty: null + }) + + setTimeout(() => { + component.update() + + const isNavTargetChangingSpy = jest + .spyOn(component.instance(), 'isNavTargetChanging') + .mockReturnValueOnce(false) + .mockReturnValue(true) + + // window.getSelection() shouldn't be called + component.instance().clearSelectionIfNavTargetChanging({}) + + // window.getSelection().removeAllRanges() should be called + component.instance().clearSelectionIfNavTargetChanging({}) + + // window.getSelection().empty() should be called + component.instance().clearSelectionIfNavTargetChanging({}) + + // window.getSelection() doesn't have removeAllRanges or empty, + // no function should be called + component.instance().clearSelectionIfNavTargetChanging({}) + + expect(mockRemoveAllRanges).toHaveBeenCalledTimes(1) + expect(mockEmpty).toHaveBeenCalledTimes(1) + + isNavTargetChangingSpy.mockRestore() + windowSpy.mockRestore() + + done() + }) + }) + test('onMouseDown calls clearFadeEffect', done => { expect.assertions(2) mocksForMount() diff --git a/packages/app/obojobo-document-engine/__tests__/Viewer/util/nav-util.test.js b/packages/app/obojobo-document-engine/__tests__/Viewer/util/nav-util.test.js index d4847cebfc..11b3811a8c 100644 --- a/packages/app/obojobo-document-engine/__tests__/Viewer/util/nav-util.test.js +++ b/packages/app/obojobo-document-engine/__tests__/Viewer/util/nav-util.test.js @@ -517,33 +517,4 @@ describe('NavUtil', () => { NavUtil.resetContext() expect(Common.flux.Dispatcher.trigger).toHaveBeenCalledWith('nav:resetContext') }) - - test('clearSelection clears the current selection', () => { - const mockRemoveAllRanges = jest.fn() - const mockEmpty = jest.fn() - - // Need to make sure removeAllRanges gets called by default - // while empty gets called if removeAllRanges isn't available - window.getSelection = jest - .fn() - .mockReturnValueOnce({ - removeAllRanges: mockRemoveAllRanges, - empty: null - }) - .mockReturnValueOnce({ - removeAllRanges: null, - empty: mockEmpty - }) - .mockReturnValueOnce({ - removeAllRanges: null, - empty: null - }) - - NavUtil.clearSelection() - NavUtil.clearSelection() - NavUtil.clearSelection() - - expect(mockRemoveAllRanges).toHaveBeenCalledTimes(1) - expect(mockEmpty).toHaveBeenCalledTimes(1) - }) }) diff --git a/packages/app/obojobo-document-engine/src/scripts/viewer/components/inline-nav-button.js b/packages/app/obojobo-document-engine/src/scripts/viewer/components/inline-nav-button.js index 9b17dac39d..9a93ab12d1 100644 --- a/packages/app/obojobo-document-engine/src/scripts/viewer/components/inline-nav-button.js +++ b/packages/app/obojobo-document-engine/src/scripts/viewer/components/inline-nav-button.js @@ -11,10 +11,6 @@ export default class InlineNavButton extends React.Component { } onClick(event) { - // Make sure any highlighted text gets reset - // when navigating to different pages - NavUtil.clearSelection() - if (this.props.onClick) { this.props.onClick() return diff --git a/packages/app/obojobo-document-engine/src/scripts/viewer/components/viewer-app.js b/packages/app/obojobo-document-engine/src/scripts/viewer/components/viewer-app.js index 3109521471..07e09d8909 100644 --- a/packages/app/obojobo-document-engine/src/scripts/viewer/components/viewer-app.js +++ b/packages/app/obojobo-document-engine/src/scripts/viewer/components/viewer-app.js @@ -84,6 +84,7 @@ export default class ViewerApp extends React.Component { this.unlockNavigation = this.unlockNavigation.bind(this) this.clearPreviewScores = this.clearPreviewScores.bind(this) this.onDelayResize = this.onDelayResize.bind(this) + this.clearSelectionIfNavTargetChanging = this.clearSelectionIfNavTargetChanging.bind(this) } componentDidMount() { @@ -214,6 +215,20 @@ export default class ViewerApp extends React.Component { } } + clearSelectionIfNavTargetChanging(prevState) { + if (!this.isNavTargetChanging(prevState)) { + return + } + + const selection = window.getSelection() + + if (selection.removeAllRanges) { + selection.removeAllRanges() + } else if (selection.empty) { + selection.empty() + } + } + focusOnContentIfNavTargetChanging(prevState) { const focussedItem = FocusUtil.getFocussedItem(this.state.focusState) @@ -241,6 +256,7 @@ export default class ViewerApp extends React.Component { this.focusOnContentIfNavTargetChanging(prevState) this.scrollToTopIfNavTargetChanging(prevState) + this.clearSelectionIfNavTargetChanging(prevState) // use Focus Store values to update DOM Focus this.updateDOMFocus() diff --git a/packages/app/obojobo-document-engine/src/scripts/viewer/util/nav-util.js b/packages/app/obojobo-document-engine/src/scripts/viewer/util/nav-util.js index 3371c9a8b0..bebbfdbb8e 100644 --- a/packages/app/obojobo-document-engine/src/scripts/viewer/util/nav-util.js +++ b/packages/app/obojobo-document-engine/src/scripts/viewer/util/nav-util.js @@ -251,16 +251,6 @@ const NavUtil = { isNavOpen(state) { return state.open - }, - - clearSelection() { - const selection = window.getSelection() - - if (selection.removeAllRanges) { - selection.removeAllRanges() - } else if (selection.empty) { - selection.empty() - } } } diff --git a/packages/app/obojobo-repository/shared/components/layouts/__snapshots__/footer.test.js.snap b/packages/app/obojobo-repository/shared/components/layouts/__snapshots__/footer.test.js.snap index 8e54940857..c06ff115b5 100644 --- a/packages/app/obojobo-repository/shared/components/layouts/__snapshots__/footer.test.js.snap +++ b/packages/app/obojobo-repository/shared/components/layouts/__snapshots__/footer.test.js.snap @@ -53,7 +53,7 @@ exports[`Footer renders 1`] = ` - 2020 + 2021 - 2020 + 2021 - 2020 + 2021 - 2020 + 2021