@internetarchive/bookreader 5.0.0-6-multiple-files → 5.0.0-60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +17 -15
- package/.github/workflows/node.js.yml +77 -6
- package/.github/workflows/npm-publish.yml +6 -20
- package/.testcaferc.js +10 -0
- package/BookReader/BookReader.css +241 -377
- package/BookReader/BookReader.js +2 -21564
- package/BookReader/BookReader.js.LICENSE.txt +24 -20
- package/BookReader/BookReader.js.map +1 -1
- package/BookReader/ia-bookreader-bundle.js +1519 -0
- package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +17 -0
- package/BookReader/ia-bookreader-bundle.js.map +1 -0
- package/BookReader/icons/1up.svg +1 -12
- package/BookReader/icons/2up.svg +1 -15
- package/BookReader/icons/advance.svg +3 -26
- package/BookReader/icons/chevron-right.svg +1 -1
- package/BookReader/icons/close-circle-dark.svg +1 -0
- package/BookReader/icons/close-circle.svg +1 -1
- package/BookReader/icons/fullscreen.svg +1 -17
- package/BookReader/icons/fullscreen_exit.svg +1 -17
- package/BookReader/icons/hamburger.svg +1 -15
- package/BookReader/icons/left-arrow.svg +1 -12
- package/BookReader/icons/magnify-minus.svg +1 -16
- package/BookReader/icons/magnify-plus.svg +1 -17
- package/BookReader/icons/magnify.svg +1 -15
- package/BookReader/icons/pause.svg +1 -23
- package/BookReader/icons/play.svg +1 -22
- package/BookReader/icons/playback-speed.svg +1 -34
- package/BookReader/icons/read-aloud.svg +1 -22
- package/BookReader/icons/review.svg +3 -22
- package/BookReader/icons/thumbnails.svg +1 -17
- package/BookReader/icons/voice.svg +1 -0
- package/BookReader/icons/volume-full.svg +1 -22
- package/BookReader/images/BRicons.svg +5 -94
- package/BookReader/images/books_graphic.svg +1 -177
- package/BookReader/images/icon_book.svg +1 -12
- package/BookReader/images/icon_bookmark.svg +1 -12
- package/BookReader/images/icon_gear.svg +1 -14
- package/BookReader/images/icon_hamburger.svg +1 -20
- package/BookReader/images/icon_home.svg +1 -21
- package/BookReader/images/icon_info.svg +1 -11
- package/BookReader/images/icon_one_page.svg +1 -8
- package/BookReader/images/icon_pause.svg +1 -1
- package/BookReader/images/icon_play.svg +1 -1
- package/BookReader/images/icon_playback-rate.svg +1 -15
- package/BookReader/images/icon_search_button.svg +1 -8
- package/BookReader/images/icon_share.svg +1 -9
- package/BookReader/images/icon_skip-ahead.svg +1 -6
- package/BookReader/images/icon_skip-back.svg +2 -13
- package/BookReader/images/icon_speaker.svg +1 -18
- package/BookReader/images/icon_speaker_open.svg +1 -10
- package/BookReader/images/icon_thumbnails.svg +1 -12
- package/BookReader/images/icon_toc.svg +1 -5
- package/BookReader/images/icon_two_pages.svg +1 -9
- package/BookReader/images/marker_chap-off.svg +1 -11
- package/BookReader/images/marker_chap-on.svg +1 -11
- package/BookReader/images/marker_srch-on.svg +1 -11
- package/BookReader/jquery-3.js +2 -0
- package/BookReader/jquery-3.js.LICENSE.txt +24 -0
- package/BookReader/plugins/plugin.archive_analytics.js +1 -172
- package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
- package/BookReader/plugins/plugin.autoplay.js +1 -165
- package/BookReader/plugins/plugin.autoplay.js.map +1 -1
- package/BookReader/plugins/plugin.chapters.js +1 -304
- package/BookReader/plugins/plugin.chapters.js.map +1 -1
- package/BookReader/plugins/plugin.iframe.js +1 -74
- package/BookReader/plugins/plugin.iframe.js.map +1 -1
- package/BookReader/plugins/plugin.mobile_nav.js +1 -334
- package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
- package/BookReader/plugins/plugin.resume.js +1 -368
- package/BookReader/plugins/plugin.resume.js.map +1 -1
- package/BookReader/plugins/plugin.search.js +1 -1420
- package/BookReader/plugins/plugin.search.js.map +1 -1
- package/BookReader/plugins/plugin.text_selection.js +1 -1080
- package/BookReader/plugins/plugin.text_selection.js.map +1 -1
- package/BookReader/plugins/plugin.tts.js +2 -9193
- package/BookReader/plugins/plugin.tts.js.map +1 -1
- package/BookReader/plugins/plugin.url.js +1 -269
- package/BookReader/plugins/plugin.url.js.map +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
- package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
- package/BookReader/webcomponents-bundle.js +3 -0
- package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
- package/BookReader/webcomponents-bundle.js.map +1 -0
- package/BookReaderDemo/BookReaderDemo.css +14 -1
- package/BookReaderDemo/BookReaderJSAutoplay.js +4 -1
- package/BookReaderDemo/BookReaderJSSimple.js +1 -0
- package/BookReaderDemo/IADemoBr.js +147 -0
- package/BookReaderDemo/demo-advanced.html +2 -2
- package/BookReaderDemo/demo-autoplay.html +2 -1
- package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
- package/BookReaderDemo/demo-fullscreen-mobile.html +2 -1
- package/BookReaderDemo/demo-fullscreen.html +2 -1
- package/BookReaderDemo/demo-iiif.html +2 -1
- package/BookReaderDemo/demo-internetarchive.html +84 -17
- package/BookReaderDemo/demo-multiple.html +2 -1
- package/BookReaderDemo/demo-preview-pages.html +2 -1
- package/BookReaderDemo/demo-simple.html +2 -1
- package/BookReaderDemo/demo-vendor-fullscreen.html +2 -1
- package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
- package/BookReaderDemo/immersion-1up.html +2 -1
- package/BookReaderDemo/immersion-mode.html +2 -1
- package/BookReaderDemo/toggle_controls.html +2 -1
- package/BookReaderDemo/view_mode.html +2 -1
- package/BookReaderDemo/viewmode-cycle.html +2 -3
- package/CHANGELOG.md +246 -0
- package/README.md +14 -1
- package/babel.config.js +19 -0
- package/codecov.yml +6 -0
- package/index.html +3 -0
- package/jsconfig.json +19 -0
- package/netlify.toml +5 -0
- package/package.json +70 -59
- package/renovate.json +52 -0
- package/scripts/preversion.js +4 -1
- package/src/BookNavigator/assets/bookmark-colors.js +1 -1
- package/src/BookNavigator/assets/button-base.js +9 -2
- package/src/BookNavigator/assets/ia-logo.js +17 -0
- package/src/BookNavigator/assets/icon_checkmark.js +1 -1
- package/src/BookNavigator/assets/icon_close.js +1 -1
- package/src/BookNavigator/assets/icon_sort_asc.js +5 -0
- package/src/BookNavigator/assets/{icon_sort_ascending.js → icon_sort_desc.js} +2 -2
- package/src/BookNavigator/assets/icon_sort_neutral.js +5 -0
- package/src/BookNavigator/assets/icon_volumes.js +11 -0
- package/src/BookNavigator/book-navigator.js +585 -0
- package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
- package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
- package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
- package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +3 -8
- package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
- package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
- package/src/BookNavigator/delete-modal-actions.js +1 -1
- package/src/BookNavigator/downloads/downloads-provider.js +36 -21
- package/src/BookNavigator/downloads/downloads.js +41 -25
- package/src/BookNavigator/search/search-provider.js +80 -28
- package/src/BookNavigator/search/search-results.js +34 -25
- package/src/BookNavigator/sharing.js +27 -0
- package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -10
- package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
- package/src/BookNavigator/volumes/volumes-provider.js +88 -53
- package/src/BookNavigator/volumes/volumes.js +41 -14
- package/src/BookReader/BookModel.js +59 -30
- package/src/BookReader/DebugConsole.js +3 -3
- package/src/BookReader/DragScrollable.js +233 -0
- package/src/BookReader/Mode1Up.js +56 -351
- package/src/BookReader/Mode1UpLit.js +391 -0
- package/src/BookReader/Mode2Up.js +73 -1318
- package/src/BookReader/Mode2UpLit.js +781 -0
- package/src/BookReader/ModeCoordinateSpace.js +29 -0
- package/src/BookReader/ModeSmoothZoom.js +211 -0
- package/src/BookReader/ModeThumb.js +17 -11
- package/src/BookReader/Navbar/Navbar.js +10 -36
- package/src/BookReader/PageContainer.js +69 -6
- package/src/BookReader/ReduceSet.js +1 -1
- package/src/BookReader/Toolbar/Toolbar.js +10 -37
- package/src/BookReader/events.js +2 -0
- package/src/BookReader/options.js +24 -2
- package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
- package/src/BookReader/utils/ScrollClassAdder.js +31 -0
- package/src/BookReader/utils.js +108 -13
- package/src/BookReader.js +480 -825
- package/src/assets/icons/close-circle-dark.svg +1 -0
- package/src/assets/icons/magnify-minus.svg +3 -7
- package/src/assets/icons/magnify-plus.svg +3 -7
- package/src/assets/icons/voice.svg +1 -0
- package/src/css/BookReader.scss +0 -12
- package/src/css/_BRBookmarks.scss +1 -1
- package/src/css/_BRComponent.scss +1 -1
- package/src/css/_BRmain.scss +33 -24
- package/src/css/_BRnav.scss +4 -26
- package/src/css/_BRpages.scss +147 -40
- package/src/css/_BRsearch.scss +25 -216
- package/src/css/_TextSelection.scss +16 -17
- package/src/css/_colorbox.scss +2 -2
- package/src/css/_controls.scss +17 -5
- package/src/css/_icons.scss +7 -1
- package/src/ia-bookreader/ia-bookreader.js +224 -0
- package/src/plugins/plugin.archive_analytics.js +3 -3
- package/src/plugins/plugin.autoplay.js +4 -9
- package/src/plugins/plugin.chapters.js +28 -35
- package/src/plugins/plugin.mobile_nav.js +11 -10
- package/src/plugins/plugin.resume.js +3 -3
- package/src/plugins/plugin.text_selection.js +32 -41
- package/src/plugins/plugin.vendor-fullscreen.js +4 -4
- package/src/plugins/search/plugin.search.js +179 -116
- package/src/plugins/search/view.js +63 -179
- package/src/plugins/tts/AbstractTTSEngine.js +46 -37
- package/src/plugins/tts/FestivalTTSEngine.js +13 -14
- package/src/plugins/tts/PageChunk.js +15 -21
- package/src/plugins/tts/PageChunkIterator.js +8 -12
- package/src/plugins/tts/WebTTSEngine.js +87 -71
- package/src/plugins/tts/plugin.tts.js +94 -125
- package/src/plugins/tts/utils.js +0 -25
- package/src/plugins/url/UrlPlugin.js +193 -0
- package/src/plugins/{plugin.url.js → url/plugin.url.js} +45 -16
- package/src/util/docCookies.js +21 -2
- package/tests/e2e/README.md +37 -0
- package/tests/e2e/autoplay.test.js +2 -2
- package/tests/e2e/base.test.js +7 -7
- package/tests/e2e/helpers/base.js +28 -23
- package/tests/e2e/helpers/debug.js +1 -1
- package/tests/e2e/helpers/desktopSearch.js +14 -13
- package/tests/e2e/helpers/mobileSearch.js +3 -3
- package/tests/e2e/helpers/params.js +17 -0
- package/tests/e2e/helpers/rightToLeft.js +4 -10
- package/tests/e2e/models/Navigation.js +13 -4
- package/tests/e2e/rightToLeft.test.js +4 -5
- package/tests/e2e/viewmode.test.js +40 -33
- package/tests/jest/BookNavigator/book-navigator.test.js +658 -0
- package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
- package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
- package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
- package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
- package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
- package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
- package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
- package/tests/{karma/BookNavigator → jest/BookNavigator/search}/search-results.test.js +104 -60
- package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
- package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
- package/tests/jest/BookNavigator/volumes/volumes-provider.test.js +184 -0
- package/tests/jest/BookNavigator/volumes/volumes.test.js +97 -0
- package/tests/{BookReader → jest/BookReader}/BookModel.test.js +59 -14
- package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
- package/tests/{BookReader → jest/BookReader}/DebugConsole.test.js +1 -1
- package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
- package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
- package/tests/jest/BookReader/Mode2Up.test.js +98 -0
- package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
- package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
- package/tests/jest/BookReader/ModeSmoothZoom.test.js +175 -0
- package/tests/jest/BookReader/ModeThumb.test.js +71 -0
- package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +10 -10
- package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +88 -6
- package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
- package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
- package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
- package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
- package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
- package/tests/jest/BookReader/utils.test.js +217 -0
- package/tests/jest/BookReader.keyboard.test.js +190 -0
- package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
- package/tests/{BookReader.test.js → jest/BookReader.test.js} +26 -37
- package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
- package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +4 -4
- package/tests/{plugins → jest/plugins}/plugin.chapters.test.js +10 -11
- package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
- package/tests/{plugins → jest/plugins}/plugin.mobile_nav.test.js +5 -5
- package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
- package/tests/{plugins → jest/plugins}/plugin.text_selection.test.js +39 -47
- package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
- package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +63 -47
- package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +35 -6
- package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +9 -9
- package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
- package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
- package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
- package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
- package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
- package/tests/jest/plugins/url/UrlPlugin.test.js +190 -0
- package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +53 -14
- package/tests/jest/setup.js +3 -0
- package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
- package/tests/jest/util/docCookies.test.js +24 -0
- package/tests/{util → jest/util}/strings.test.js +1 -1
- package/tests/{utils.js → jest/utils.js} +38 -0
- package/webpack.config.js +11 -5
- package/.babelrc +0 -12
- package/.dependabot/config.yml +0 -6
- package/.testcaferc.json +0 -5
- package/BookReader/bookreader-component-bundle.js +0 -14312
- package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
- package/BookReader/bookreader-component-bundle.js.map +0 -1
- package/BookReader/icons/sort-ascending.svg +0 -1
- package/BookReader/icons/sort-descending.svg +0 -1
- package/BookReader/jquery-1.10.1.js +0 -108
- package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
- package/BookReader/plugins/plugin.menu_toggle.js +0 -369
- package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
- package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
- package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
- package/karma.conf.js +0 -23
- package/src/BookNavigator/BookModel.js +0 -14
- package/src/BookNavigator/BookNavigator.js +0 -452
- package/src/BookNavigator/assets/book-loader.js +0 -27
- package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
- package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
- package/src/BookNavigator/search/a-search-result.js +0 -55
- package/src/BookReaderComponent/BookReaderComponent.js +0 -112
- package/src/ItemNavigator/ItemNavigator.js +0 -372
- package/src/ItemNavigator/providers/sharing.js +0 -29
- package/src/assets/icons/sort-ascending.svg +0 -1
- package/src/assets/icons/sort-descending.svg +0 -1
- package/src/dragscrollable-br.js +0 -261
- package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
- package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
- package/tests/BookReader/Mode1Up.test.js +0 -164
- package/tests/BookReader/Mode2Up.test.js +0 -247
- package/tests/BookReader/utils.test.js +0 -109
- package/tests/e2e/ia-production/ia-prod-base.js +0 -17
- package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
- package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
- package/tests/karma/BookNavigator/volumes.test.js +0 -101
- package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
- package/tests/util/docCookies.test.js +0 -15
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import sinon from 'sinon';
|
|
2
|
+
import { afterEventLoop, eventTargetMixin } from '../utils.js';
|
|
3
|
+
import {
|
|
4
|
+
clamp,
|
|
5
|
+
cssPercentage,
|
|
6
|
+
debounce,
|
|
7
|
+
decodeURIComponentPlus,
|
|
8
|
+
encodeURIComponentPlus,
|
|
9
|
+
escapeHTML,
|
|
10
|
+
getActiveElement,
|
|
11
|
+
isInputActive,
|
|
12
|
+
poll,
|
|
13
|
+
polyfillCustomEvent,
|
|
14
|
+
PolyfilledCustomEvent,
|
|
15
|
+
promisifyEvent,
|
|
16
|
+
sleep,
|
|
17
|
+
} from '@/src/BookReader/utils.js';
|
|
18
|
+
|
|
19
|
+
test('clamp function returns Math.min(Math.max(value, min), max)', () => {
|
|
20
|
+
expect(clamp(2,1,3)).toEqual(2);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('calculate a percentage suitable for CSS', () => {
|
|
24
|
+
expect(cssPercentage(2,1)).toEqual('200%');
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test('escapeHTML function which replaces the string', () => {
|
|
28
|
+
expect(escapeHTML('Me & You')).toEqual('Me & You');
|
|
29
|
+
expect(escapeHTML('Me > You')).toEqual('Me > You');
|
|
30
|
+
expect(escapeHTML('Me < You')).toEqual('Me < You');
|
|
31
|
+
expect(escapeHTML('Me " You')).toEqual('Me " You');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('Decodes a URI component and converts + to emptyStr', () => {
|
|
35
|
+
expect(decodeURIComponentPlus("https%3A%2F%2Farchive.org%2Fskr+")).toEqual("https://archive.org/skr ");
|
|
36
|
+
expect(decodeURIComponentPlus("%3Fx%3D+test")).toEqual("?x= test");
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('Encodes a URI component and converts emptyStr to +', () => {
|
|
40
|
+
expect(encodeURIComponentPlus("?x=test ")).toEqual("%3Fx%3Dtest+");
|
|
41
|
+
expect(encodeURIComponentPlus("ABC abc 123")).toEqual("ABC+abc+123");
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
describe('getActiveElement', () => {
|
|
45
|
+
test('Can ignore shadow DOM', () => {
|
|
46
|
+
const doc = {activeElement: { shadowRoot: {activeElement: {}}}};
|
|
47
|
+
expect(getActiveElement(doc, false)).toBe(doc.activeElement);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test('Can traverse shadow DOM', () => {
|
|
51
|
+
const doc = {activeElement: { shadowRoot: {activeElement: {}}}};
|
|
52
|
+
expect(getActiveElement(doc, true)).toBe(doc.activeElement.shadowRoot.activeElement);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('Handles non-shadow elements', () => {
|
|
56
|
+
const doc = {activeElement: {}};
|
|
57
|
+
expect(getActiveElement(doc, true)).toBe(doc.activeElement);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test('Handles no active element', () => {
|
|
61
|
+
const doc = {activeElement: null};
|
|
62
|
+
expect(getActiveElement(doc, true)).toBe(null);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
describe('isInputActive', () => {
|
|
67
|
+
test('Handles no activeElement', () => {
|
|
68
|
+
expect(isInputActive({activeElement: null})).toBe(false);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test('Handles deep input activeElement', () => {
|
|
72
|
+
const doc = {activeElement: { shadowRoot: {activeElement: { tagName: 'INPUT' }}}};
|
|
73
|
+
expect(isInputActive(doc)).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test('Handles deep non-input activeElement', () => {
|
|
77
|
+
const doc = {activeElement: { shadowRoot: {activeElement: { tagName: 'A' }}}};
|
|
78
|
+
expect(isInputActive(doc)).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test('Handles textarea activeElement', () => {
|
|
82
|
+
const doc = {activeElement: { tagName: 'TEXTAREA' }};
|
|
83
|
+
expect(isInputActive(doc)).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
describe('debounce', () => {
|
|
88
|
+
/** @type {sinon.SinonFakeTimers} */
|
|
89
|
+
let clock;
|
|
90
|
+
beforeEach(() => clock = sinon.useFakeTimers());
|
|
91
|
+
afterEach(() => clock.restore());
|
|
92
|
+
|
|
93
|
+
test('testing debounce', () => {
|
|
94
|
+
const func = jest.fn();
|
|
95
|
+
const debouncedFunc = debounce(func, 1000);
|
|
96
|
+
// Call it immediately
|
|
97
|
+
debouncedFunc();
|
|
98
|
+
expect(func).toHaveBeenCalledTimes(0); // func not called
|
|
99
|
+
|
|
100
|
+
// Call it several times with 500ms between each call
|
|
101
|
+
for (let i = 0; i < 10; i++) {
|
|
102
|
+
clock.tick(500);
|
|
103
|
+
debouncedFunc();
|
|
104
|
+
}
|
|
105
|
+
expect(func).toHaveBeenCalledTimes(0); // func not called
|
|
106
|
+
|
|
107
|
+
// wait 1000ms
|
|
108
|
+
clock.tick(1000);
|
|
109
|
+
expect(func).toHaveBeenCalledTimes(1); // func called
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
describe('polyfillCustomEvent', () => {
|
|
115
|
+
test('Overrides when missing', () => {
|
|
116
|
+
const win = {};
|
|
117
|
+
polyfillCustomEvent(win);
|
|
118
|
+
expect(win).toHaveProperty('CustomEvent');
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
test('Overrides when not a function', () => {
|
|
122
|
+
const win = { CustomEvent: {} };
|
|
123
|
+
polyfillCustomEvent(win);
|
|
124
|
+
expect(typeof win.CustomEvent).toBe('function');
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
describe('PolyfilledCustomEvent', () => {
|
|
129
|
+
test('Can be called as a constructor', () => {
|
|
130
|
+
new PolyfilledCustomEvent('foo');
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test('Calls deprecated browser methods', () => {
|
|
134
|
+
const createEventSpy = sinon.spy(document, 'createEvent');
|
|
135
|
+
const initCustomEventSpy = sinon.spy(CustomEvent.prototype, 'initCustomEvent');
|
|
136
|
+
new PolyfilledCustomEvent('foo');
|
|
137
|
+
expect(createEventSpy.callCount).toBe(1);
|
|
138
|
+
expect(initCustomEventSpy.callCount).toBe(1);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
describe('poll', () => {
|
|
143
|
+
beforeEach(() => jest.useFakeTimers());
|
|
144
|
+
afterEach(() => jest.useRealTimers());
|
|
145
|
+
test('polls until condition is true', async () => {
|
|
146
|
+
const fakeSleep = sinon.spy((ms) => jest.advanceTimersByTime(ms));
|
|
147
|
+
|
|
148
|
+
const returns = [null, null, 'foo'];
|
|
149
|
+
const check = sinon.spy(() => returns.shift());
|
|
150
|
+
const result = await poll(check, {_sleep: fakeSleep});
|
|
151
|
+
expect(fakeSleep.callCount).toBe(2);
|
|
152
|
+
expect(result).toBe('foo');
|
|
153
|
+
expect(check.callCount).toBe(3);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test('times out eventually', async () => {
|
|
157
|
+
const fakeSleep = sinon.spy((ms) => jest.advanceTimersByTime(ms));
|
|
158
|
+
|
|
159
|
+
const check = sinon.stub().returns(null);
|
|
160
|
+
const result = await poll(check, {_sleep: fakeSleep});
|
|
161
|
+
expect(result).toBeUndefined();
|
|
162
|
+
expect(check.callCount).toBe(10);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe('sleep', () => {
|
|
167
|
+
test('Sleep 0 doest not called immediately', async () => {
|
|
168
|
+
const spy = sinon.spy();
|
|
169
|
+
sleep(0).then(spy);
|
|
170
|
+
expect(spy.callCount).toBe(0);
|
|
171
|
+
await afterEventLoop();
|
|
172
|
+
expect(spy.callCount).toBe(1);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
test('Waits the appropriate ms', async () => {
|
|
176
|
+
const clock = sinon.useFakeTimers();
|
|
177
|
+
const spy = sinon.spy();
|
|
178
|
+
sleep(10).then(spy);
|
|
179
|
+
expect(spy.callCount).toBe(0);
|
|
180
|
+
clock.tick(10);
|
|
181
|
+
expect(spy.callCount).toBe(0);
|
|
182
|
+
clock.restore();
|
|
183
|
+
|
|
184
|
+
await afterEventLoop();
|
|
185
|
+
expect(spy.callCount).toBe(1);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
describe('promisifyEvent', () => {
|
|
190
|
+
test('Resolves once event fires', async () => {
|
|
191
|
+
const fakeTarget = eventTargetMixin();
|
|
192
|
+
const resolveSpy = sinon.spy();
|
|
193
|
+
promisifyEvent(fakeTarget, 'pause').then(resolveSpy);
|
|
194
|
+
|
|
195
|
+
await afterEventLoop();
|
|
196
|
+
expect(resolveSpy.callCount).toBe(0);
|
|
197
|
+
fakeTarget.dispatchEvent('pause', {});
|
|
198
|
+
await afterEventLoop();
|
|
199
|
+
expect(resolveSpy.callCount).toBe(1);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
test('Only resolves once', async () => {
|
|
203
|
+
const fakeTarget = eventTargetMixin();
|
|
204
|
+
const resolveSpy = sinon.spy();
|
|
205
|
+
promisifyEvent(fakeTarget, 'pause').then(resolveSpy);
|
|
206
|
+
|
|
207
|
+
await afterEventLoop();
|
|
208
|
+
expect(resolveSpy.callCount).toBe(0);
|
|
209
|
+
fakeTarget.dispatchEvent('pause', {});
|
|
210
|
+
fakeTarget.dispatchEvent('pause', {});
|
|
211
|
+
fakeTarget.dispatchEvent('pause', {});
|
|
212
|
+
fakeTarget.dispatchEvent('pause', {});
|
|
213
|
+
|
|
214
|
+
await afterEventLoop();
|
|
215
|
+
expect(resolveSpy.callCount).toBe(1);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import BookReader from '@/src/BookReader.js';
|
|
2
|
+
import * as utils from '@/src/BookReader/utils.js';
|
|
3
|
+
|
|
4
|
+
let br;
|
|
5
|
+
beforeAll(() => {
|
|
6
|
+
document.body.innerHTML = '<div id="BookReader">';
|
|
7
|
+
br = new BookReader();
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
afterEach(() => {
|
|
11
|
+
jest.clearAllMocks();
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Only run init() once. Otherwise multiple EventListeners will be added.
|
|
16
|
+
*/
|
|
17
|
+
test('Initialzation enables IntersectionObserver and defaults', () => {
|
|
18
|
+
const observe = jest.fn();
|
|
19
|
+
window.IntersectionObserver = jest.fn(() => ({
|
|
20
|
+
observe
|
|
21
|
+
}));
|
|
22
|
+
br.init();
|
|
23
|
+
expect(br.hasKeyFocus).toBe(true);
|
|
24
|
+
expect(observe).toHaveBeenCalledTimes(1);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
describe('Keyboard shortcuts turned off', () => {
|
|
28
|
+
|
|
29
|
+
test('Focus flag disables', () => {
|
|
30
|
+
br.next = jest.fn();
|
|
31
|
+
br.hasKeyFocus = false;
|
|
32
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': 'ArrowDown'});
|
|
33
|
+
keyEvent.preventDefault = jest.fn();
|
|
34
|
+
document.dispatchEvent(keyEvent);
|
|
35
|
+
expect(br.next).toHaveBeenCalledTimes(0);
|
|
36
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(0);
|
|
37
|
+
// Must reset for following tests
|
|
38
|
+
br.hasKeyFocus = true;
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('Input active disables', () => {
|
|
42
|
+
// eslint-disable-next-line no-import-assign
|
|
43
|
+
utils.isInputActive = jest.fn(() => true);
|
|
44
|
+
br.next = jest.fn();
|
|
45
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': 'ArrowDown'});
|
|
46
|
+
keyEvent.preventDefault = jest.fn();
|
|
47
|
+
document.dispatchEvent(keyEvent);
|
|
48
|
+
expect(br.next).toHaveBeenCalledTimes(0);
|
|
49
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(0);
|
|
50
|
+
// Must reset for following tests
|
|
51
|
+
utils.isInputActive.mockReset();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
describe('Keyboard shortcuts', () => {
|
|
57
|
+
|
|
58
|
+
test('Home key', () => {
|
|
59
|
+
br.first = jest.fn();
|
|
60
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': 'Home'});
|
|
61
|
+
keyEvent.preventDefault = jest.fn();
|
|
62
|
+
document.dispatchEvent(keyEvent);
|
|
63
|
+
expect(br.first).toHaveBeenCalledTimes(1);
|
|
64
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('End key', () => {
|
|
68
|
+
br.last = jest.fn();
|
|
69
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': 'End'});
|
|
70
|
+
keyEvent.preventDefault = jest.fn();
|
|
71
|
+
document.dispatchEvent(keyEvent);
|
|
72
|
+
expect(br.last).toHaveBeenCalledTimes(1);
|
|
73
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test('ArrowDown key', () => {
|
|
77
|
+
br.mode = br.constMode2up;
|
|
78
|
+
br.next = jest.fn();
|
|
79
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': 'ArrowDown'});
|
|
80
|
+
keyEvent.preventDefault = jest.fn();
|
|
81
|
+
document.dispatchEvent(keyEvent);
|
|
82
|
+
expect(br.next).toHaveBeenCalledTimes(1);
|
|
83
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('PageDown key', () => {
|
|
87
|
+
br.mode = br.constMode2up;
|
|
88
|
+
br.next = jest.fn();
|
|
89
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': 'PageDown'});
|
|
90
|
+
keyEvent.preventDefault = jest.fn();
|
|
91
|
+
document.dispatchEvent(keyEvent);
|
|
92
|
+
expect(br.next).toHaveBeenCalledTimes(1);
|
|
93
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('ArrowUp key', () => {
|
|
97
|
+
br.mode = br.constMode2up;
|
|
98
|
+
br.prev = jest.fn();
|
|
99
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': 'ArrowUp'});
|
|
100
|
+
keyEvent.preventDefault = jest.fn();
|
|
101
|
+
document.dispatchEvent(keyEvent);
|
|
102
|
+
expect(br.prev).toHaveBeenCalledTimes(1);
|
|
103
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test('PageUp key', () => {
|
|
107
|
+
br.mode = br.constMode2up;
|
|
108
|
+
br.prev = jest.fn();
|
|
109
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': 'PageUp'});
|
|
110
|
+
keyEvent.preventDefault = jest.fn();
|
|
111
|
+
document.dispatchEvent(keyEvent);
|
|
112
|
+
expect(br.prev).toHaveBeenCalledTimes(1);
|
|
113
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test('ArrowLeft key', () => {
|
|
117
|
+
br.mode = br.constMode2up;
|
|
118
|
+
br.left = jest.fn();
|
|
119
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': 'ArrowLeft'});
|
|
120
|
+
keyEvent.preventDefault = jest.fn();
|
|
121
|
+
document.dispatchEvent(keyEvent);
|
|
122
|
+
expect(br.left).toHaveBeenCalledTimes(1);
|
|
123
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
test('ArrowRight key', () => {
|
|
127
|
+
br.mode = br.constMode2up;
|
|
128
|
+
br.right = jest.fn();
|
|
129
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': 'ArrowRight'});
|
|
130
|
+
keyEvent.preventDefault = jest.fn();
|
|
131
|
+
document.dispatchEvent(keyEvent);
|
|
132
|
+
expect(br.right).toHaveBeenCalledTimes(1);
|
|
133
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
test('Subtract key', () => {
|
|
137
|
+
br.zoom = jest.fn();
|
|
138
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': 'Subtract'});
|
|
139
|
+
keyEvent.preventDefault = jest.fn();
|
|
140
|
+
document.dispatchEvent(keyEvent);
|
|
141
|
+
expect(br.zoom).toHaveBeenCalledTimes(1);
|
|
142
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test('- key', () => {
|
|
146
|
+
br.zoom = jest.fn();
|
|
147
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': '-'});
|
|
148
|
+
keyEvent.preventDefault = jest.fn();
|
|
149
|
+
document.dispatchEvent(keyEvent);
|
|
150
|
+
expect(br.zoom).toHaveBeenCalledTimes(1);
|
|
151
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
test('Add key', () => {
|
|
155
|
+
br.zoom = jest.fn();
|
|
156
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': 'Add'});
|
|
157
|
+
keyEvent.preventDefault = jest.fn();
|
|
158
|
+
document.dispatchEvent(keyEvent);
|
|
159
|
+
expect(br.zoom).toHaveBeenCalledTimes(1);
|
|
160
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test('+ key', () => {
|
|
164
|
+
br.zoom = jest.fn();
|
|
165
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': '+'});
|
|
166
|
+
keyEvent.preventDefault = jest.fn();
|
|
167
|
+
document.dispatchEvent(keyEvent);
|
|
168
|
+
expect(br.zoom).toHaveBeenCalledTimes(1);
|
|
169
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test('= key', () => {
|
|
173
|
+
br.zoom = jest.fn();
|
|
174
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': '='});
|
|
175
|
+
keyEvent.preventDefault = jest.fn();
|
|
176
|
+
document.dispatchEvent(keyEvent);
|
|
177
|
+
expect(br.zoom).toHaveBeenCalledTimes(1);
|
|
178
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
test('F key', () => {
|
|
182
|
+
br.toggleFullscreen = jest.fn();
|
|
183
|
+
const keyEvent = new KeyboardEvent('keydown', {'key': 'F'});
|
|
184
|
+
keyEvent.preventDefault = jest.fn();
|
|
185
|
+
document.dispatchEvent(keyEvent);
|
|
186
|
+
expect(br.toggleFullscreen).toHaveBeenCalledTimes(1);
|
|
187
|
+
expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
import BookReader from '
|
|
2
|
+
import BookReader from '@/src/BookReader.js';
|
|
3
3
|
|
|
4
4
|
beforeAll(() => {
|
|
5
5
|
document.body.innerHTML = '<div id="BookReader">';
|
|
@@ -36,4 +36,12 @@ describe('BookReader options', () => {
|
|
|
36
36
|
expect(br.options.autoResize).toBe(true);
|
|
37
37
|
});
|
|
38
38
|
});
|
|
39
|
+
|
|
40
|
+
describe('`showNavbar`', () => {
|
|
41
|
+
it('is on by default', () => {
|
|
42
|
+
const br = new BookReader();
|
|
43
|
+
br.init();
|
|
44
|
+
expect(br.options.showNavbar).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
39
47
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
|
-
import BookReader from '
|
|
3
|
-
import '
|
|
4
|
-
import '
|
|
2
|
+
import BookReader, {_modeStringToNumber} from '@/src/BookReader.js';
|
|
3
|
+
import '@/src/plugins/plugin.resume.js';
|
|
4
|
+
import '@/src/plugins/url/plugin.url.js';
|
|
5
5
|
|
|
6
6
|
let br;
|
|
7
7
|
beforeAll(() => {
|
|
@@ -124,7 +124,7 @@ test('has suppressFragmentChange false when init with fragment', () => {
|
|
|
124
124
|
test('has suppressFragmentChange false when init with hash fragment', () => {
|
|
125
125
|
br.getResumeValue = jest.fn(() => null);
|
|
126
126
|
br.urlReadFragment = jest.fn(() => '');
|
|
127
|
-
br.urlReadHashFragment = jest.fn(() => 'mode/1up')
|
|
127
|
+
br.urlReadHashFragment = jest.fn(() => 'mode/1up');
|
|
128
128
|
br.switchMode = jest.fn();
|
|
129
129
|
br.options.urlMode = 'history',
|
|
130
130
|
|
|
@@ -157,39 +157,20 @@ test('does not add q= term to urlMode=hash query string', () => {
|
|
|
157
157
|
)).toBe('?name=value');
|
|
158
158
|
});
|
|
159
159
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
test('
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
test('_getPageURISrcset with 0 elements in srcset', () => {
|
|
175
|
-
br._models.book.getNumLeafs = jest.fn(() => 30);
|
|
176
|
-
br._models.book.getPageURI = jest.fn((index, scale, rotate) => "correctURL.png&scale=" + scale);
|
|
177
|
-
br.init();
|
|
178
|
-
expect(br._getPageURISrcset(5, 1, undefined)).toBe("");
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
test('_getPageURISrcset with 2 elements in srcset', () => {
|
|
182
|
-
br._models.book.getNumLeafs = jest.fn(() => 30);
|
|
183
|
-
br._models.book.getPageURI = jest.fn((index, scale, rotate) => "correctURL.png&scale=" + scale);
|
|
184
|
-
br.init();
|
|
185
|
-
expect(br._getPageURISrcset(5, 5, undefined)).toBe("correctURL.png&scale=2 2x, correctURL.png&scale=1 4x");
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
test('_getPageURISrcset with the most elements in srcset', () => {
|
|
189
|
-
br._models.book.getNumLeafs = jest.fn(() => 30);
|
|
190
|
-
br._models.book.getPageURI = jest.fn((index, scale, rotate) => "correctURL.png&scale=" + scale);
|
|
191
|
-
br.init();
|
|
192
|
-
expect(br._getPageURISrcset(5, 35, undefined)).toBe("correctURL.png&scale=16 2x, correctURL.png&scale=8 4x, correctURL.png&scale=4 8x, correctURL.png&scale=2 16x, correctURL.png&scale=1 32x");
|
|
160
|
+
describe('Navigation Bars', () => {
|
|
161
|
+
test('Standard navigation is being used by default', () => {
|
|
162
|
+
br.initNavbar = jest.fn();
|
|
163
|
+
br.options.ui = '';
|
|
164
|
+
br.init();
|
|
165
|
+
expect(br.initNavbar).toHaveBeenCalledTimes(1);
|
|
166
|
+
});
|
|
167
|
+
test('Standard navigation is being used by default - when bookreader is embedded', () => {
|
|
168
|
+
br.initNavbar = jest.fn();
|
|
169
|
+
br.options.ui = 'embed';
|
|
170
|
+
br.init();
|
|
171
|
+
expect(br.initNavbar).toHaveBeenCalledTimes(1);
|
|
172
|
+
expect(br.options.ui).toEqual('embed');
|
|
173
|
+
});
|
|
193
174
|
});
|
|
194
175
|
|
|
195
176
|
describe('quantizeReduce', () => {
|
|
@@ -299,3 +280,11 @@ describe('nextReduce', () => {
|
|
|
299
280
|
});
|
|
300
281
|
});
|
|
301
282
|
});
|
|
283
|
+
|
|
284
|
+
describe('_modeStringToNumber', () => {
|
|
285
|
+
test('Returns correct number', () => {
|
|
286
|
+
expect(_modeStringToNumber('mode/1up')).toBe(1);
|
|
287
|
+
expect(_modeStringToNumber('mode/2up')).toBe(2);
|
|
288
|
+
expect(_modeStringToNumber('mode/thumb')).toBe(3);
|
|
289
|
+
});
|
|
290
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import sinon from 'sinon';
|
|
2
|
-
import BookReader from '
|
|
3
|
-
import '
|
|
2
|
+
import BookReader from '@/src/BookReader.js';
|
|
3
|
+
import '@/src/plugins/plugin.archive_analytics.js';
|
|
4
4
|
|
|
5
5
|
describe('archiveAnalyticsSendEvent', () => {
|
|
6
6
|
const sendEvent = BookReader.prototype.archiveAnalyticsSendEvent;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
|
-
import BookReader from '
|
|
3
|
-
import '
|
|
2
|
+
import BookReader from '@/src/BookReader.js';
|
|
3
|
+
import '@/src/plugins/plugin.autoplay.js';
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
let br;
|
|
@@ -38,12 +38,12 @@ describe('Plugin: Menu Toggle', () => {
|
|
|
38
38
|
});
|
|
39
39
|
test('autoplay will run without `flipSpeed` parameters', () => {
|
|
40
40
|
const initialAutoTimer = br.autoTimer;
|
|
41
|
-
br.
|
|
41
|
+
br.next = jest.fn();
|
|
42
42
|
br.autoStop = jest.fn();
|
|
43
43
|
br.init();
|
|
44
44
|
br.autoToggle();
|
|
45
45
|
// internally referenced functions that fire
|
|
46
|
-
expect(br.
|
|
46
|
+
expect(br.next).toHaveBeenCalledTimes(1);
|
|
47
47
|
|
|
48
48
|
expect(initialAutoTimer).toBeFalsy();
|
|
49
49
|
// br.autoTimer changes when autoToggle turns on
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import sinon from 'sinon';
|
|
2
2
|
|
|
3
|
-
import BookReader from '
|
|
4
|
-
import '
|
|
5
|
-
import '
|
|
3
|
+
import BookReader from '@/src/BookReader.js';
|
|
4
|
+
import '@/src/plugins/plugin.mobile_nav.js';
|
|
5
|
+
import '@/src/plugins/plugin.chapters.js';
|
|
6
6
|
|
|
7
7
|
const SAMPLE_TOC = [{
|
|
8
8
|
"pagenum": "3",
|
|
@@ -53,8 +53,9 @@ const SAMPLE_TOC_UNDEF = [
|
|
|
53
53
|
"title": "THE COUNTRY AND THE MISSION 2",
|
|
54
54
|
"pageIndex": undefined,
|
|
55
55
|
}
|
|
56
|
-
]
|
|
56
|
+
];
|
|
57
57
|
|
|
58
|
+
/** @type {BookReader} */
|
|
58
59
|
let br;
|
|
59
60
|
beforeEach(() => {
|
|
60
61
|
$.ajax = jest.fn().mockImplementation((args) => {
|
|
@@ -97,9 +98,7 @@ describe('updateTOCState', () => {
|
|
|
97
98
|
|
|
98
99
|
beforeEach(() => {
|
|
99
100
|
window.HTMLElement.prototype.scrollIntoView = sinon.stub();
|
|
100
|
-
|
|
101
|
-
//which has a getter and setter
|
|
102
|
-
br.getPageIndex = (str) => parseFloat(str);
|
|
101
|
+
br.book.getPageIndex = (str) => parseFloat(str);
|
|
103
102
|
br.init();
|
|
104
103
|
});
|
|
105
104
|
|
|
@@ -111,20 +110,20 @@ describe('updateTOCState', () => {
|
|
|
111
110
|
test('Only one element has .current-chapter', () => {
|
|
112
111
|
br.updateTOCState(9, SAMPLE_TOC);
|
|
113
112
|
expect($('li.BRtable-contents-el.current-chapter').length).toBe(1);
|
|
114
|
-
})
|
|
113
|
+
});
|
|
115
114
|
|
|
116
115
|
test('No chapter has .current-chapter if current index is < than any chapter index', () => {
|
|
117
116
|
br.updateTOCState(1, SAMPLE_TOC);
|
|
118
117
|
expect($('li.BRtable-contents-el.current-chapter').length).toBe(0);
|
|
119
|
-
})
|
|
118
|
+
});
|
|
120
119
|
|
|
121
120
|
test('if current index == chapter index ', () => {
|
|
122
121
|
br.updateTOCState(17, SAMPLE_TOC);
|
|
123
122
|
expect($('li.BRtable-contents-el')[1].classList.contains('current-chapter'));
|
|
124
|
-
})
|
|
123
|
+
});
|
|
125
124
|
|
|
126
125
|
test('No chapter has .current-chapter if all chapter have undefined pageIndex ', () => {
|
|
127
126
|
br.updateTOCState(10, SAMPLE_TOC_UNDEF);
|
|
128
127
|
expect($('li.BRtable-contents-el.current-chapter').length).toBe(0);
|
|
129
|
-
})
|
|
128
|
+
});
|
|
130
129
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import sinon from 'sinon';
|
|
2
2
|
|
|
3
|
-
import BookReader from '
|
|
4
|
-
import { _attachEventListeners } from '
|
|
3
|
+
import BookReader from '@/src/BookReader.js';
|
|
4
|
+
import { _attachEventListeners } from '@/src/plugins/plugin.iframe.js';
|
|
5
5
|
|
|
6
6
|
afterEach(() => {
|
|
7
7
|
sinon.restore();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
|
-
import BookReader from '
|
|
3
|
-
import '
|
|
2
|
+
import BookReader from '@/src/BookReader.js';
|
|
3
|
+
import '@/src/plugins/plugin.mobile_nav.js';
|
|
4
4
|
|
|
5
5
|
/** @type {BookReader} */
|
|
6
6
|
let br;
|
|
@@ -37,7 +37,7 @@ describe('Plugin: Mobile Nav', () => {
|
|
|
37
37
|
return function() {
|
|
38
38
|
callCount++;
|
|
39
39
|
_super.apply(this, arguments);
|
|
40
|
-
}
|
|
40
|
+
};
|
|
41
41
|
}(BookReader.prototype.initToolbar);
|
|
42
42
|
const br = new BookReader();
|
|
43
43
|
br.init();
|
|
@@ -47,7 +47,7 @@ describe('Plugin: Mobile Nav', () => {
|
|
|
47
47
|
expect($(document.body).hasClass('BRbodyMobileNavEnabled')).toEqual(true);
|
|
48
48
|
});
|
|
49
49
|
test('loads the navbar on init', () => {
|
|
50
|
-
expect($('#BRmobileMenu')).toHaveLength(1)
|
|
50
|
+
expect($('#BRmobileMenu')).toHaveLength(1);
|
|
51
51
|
});
|
|
52
52
|
test('There is a Settings Section', () => {
|
|
53
53
|
expect($('.BRmobileMenu__settings')).toHaveLength(1);
|
|
@@ -60,7 +60,7 @@ describe('Plugin: Mobile Nav', () => {
|
|
|
60
60
|
});
|
|
61
61
|
test('clicking on hamburger opens menu', () => {
|
|
62
62
|
expect($('html').hasClass('mm-opened')).toEqual(false);
|
|
63
|
-
$('.BRmobileHamburger').click
|
|
63
|
+
$('.BRmobileHamburger').trigger("click");
|
|
64
64
|
expect($('html').hasClass('mm-opened')).toEqual(true);
|
|
65
65
|
});
|
|
66
66
|
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import BookReader from '
|
|
2
|
-
import '
|
|
1
|
+
import BookReader from '@/src/BookReader.js';
|
|
2
|
+
import '@/src/plugins/plugin.resume.js';
|
|
3
3
|
|
|
4
4
|
import sinon from 'sinon';
|
|
5
|
-
import * as docCookies from '
|
|
5
|
+
import * as docCookies from '@/src/util/docCookies.js';
|
|
6
6
|
|
|
7
7
|
let br;
|
|
8
8
|
beforeAll(() => {
|