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