@internetarchive/bookreader 5.0.0-4 → 5.0.0-40-a1
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 +75 -4
- package/.github/workflows/npm-publish.yml +2 -16
- package/.testcaferc.js +10 -0
- package/BookReader/BookReader.css +83 -323
- package/BookReader/BookReader.js +1 -1
- package/BookReader/BookReader.js.LICENSE.txt +24 -0
- package/BookReader/BookReader.js.map +1 -1
- package/BookReader/ia-bookreader-bundle.js +1623 -0
- package/BookReader/{bookreader-component-bundle.js.LICENSE.txt → ia-bookreader-bundle.js.LICENSE.txt} +14 -10
- package/BookReader/ia-bookreader-bundle.js.map +1 -0
- package/BookReader/icons/close-circle-dark.svg +1 -0
- package/BookReader/icons/magnify-minus.svg +1 -1
- package/BookReader/icons/magnify-plus.svg +1 -1
- package/BookReader/icons/voice.svg +1 -0
- package/BookReader/plugins/plugin.archive_analytics.js +1 -1
- package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
- package/BookReader/plugins/plugin.autoplay.js +1 -1
- package/BookReader/plugins/plugin.autoplay.js.map +1 -1
- package/BookReader/plugins/plugin.chapters.js +1 -1
- package/BookReader/plugins/plugin.chapters.js.map +1 -1
- package/BookReader/plugins/plugin.iframe.js +1 -1
- package/BookReader/plugins/plugin.iframe.js.map +1 -1
- package/BookReader/plugins/plugin.mobile_nav.js +1 -1
- package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
- package/BookReader/plugins/plugin.resume.js +1 -1
- package/BookReader/plugins/plugin.resume.js.map +1 -1
- package/BookReader/plugins/plugin.search.js +1 -1
- package/BookReader/plugins/plugin.search.js.map +1 -1
- package/BookReader/plugins/plugin.text_selection.js +1 -1
- package/BookReader/plugins/plugin.text_selection.js.map +1 -1
- package/BookReader/plugins/plugin.tts.js +1 -1
- package/BookReader/plugins/plugin.tts.js.map +1 -1
- package/BookReader/plugins/plugin.url.js +1 -1
- package/BookReader/plugins/plugin.url.js.map +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
- 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/IADemoBr.js +120 -0
- package/BookReaderDemo/demo-advanced.html +1 -1
- package/BookReaderDemo/demo-autoplay.html +1 -0
- package/BookReaderDemo/demo-embed-iframe-src.html +1 -0
- package/BookReaderDemo/demo-fullscreen-mobile.html +1 -0
- package/BookReaderDemo/demo-fullscreen.html +1 -0
- package/BookReaderDemo/demo-iiif.html +1 -0
- package/BookReaderDemo/demo-internetarchive.html +74 -17
- package/BookReaderDemo/demo-multiple.html +1 -0
- package/BookReaderDemo/demo-preview-pages.html +1 -0
- package/BookReaderDemo/demo-simple.html +1 -0
- package/BookReaderDemo/demo-vendor-fullscreen.html +1 -0
- package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
- package/BookReaderDemo/immersion-1up.html +1 -0
- package/BookReaderDemo/immersion-mode.html +1 -0
- package/BookReaderDemo/toggle_controls.html +1 -0
- package/BookReaderDemo/view_mode.html +1 -0
- package/BookReaderDemo/viewmode-cycle.html +1 -2
- package/CHANGELOG.md +166 -0
- package/README.md +14 -1
- package/babel.config.js +18 -0
- package/codecov.yml +6 -0
- package/index.html +3 -0
- package/jsconfig.json +19 -0
- package/package.json +62 -47
- package/renovate.json +43 -0
- 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_desc.js +5 -0
- 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 +556 -0
- package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
- package/src/BookNavigator/bookmarks/bookmark-edit.js +4 -4
- package/src/BookNavigator/bookmarks/bookmarks-list.js +3 -3
- package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +3 -8
- package/src/BookNavigator/bookmarks/bookmarks-provider.js +23 -12
- package/src/BookNavigator/bookmarks/ia-bookmarks.js +98 -62
- package/src/BookNavigator/delete-modal-actions.js +1 -1
- package/src/BookNavigator/downloads/downloads-provider.js +23 -17
- package/src/BookNavigator/downloads/downloads.js +17 -25
- package/src/BookNavigator/search/a-search-result.js +3 -3
- package/src/BookNavigator/search/search-provider.js +57 -24
- package/src/BookNavigator/search/search-results.js +8 -20
- package/src/BookNavigator/sharing.js +27 -0
- package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -13
- package/src/BookNavigator/visual-adjustments/visual-adjustments.js +4 -3
- package/src/BookNavigator/volumes/volumes-provider.js +114 -0
- package/src/BookNavigator/volumes/volumes.js +188 -0
- package/src/BookReader/DebugConsole.js +3 -3
- package/src/BookReader/DragScrollable.js +233 -0
- package/src/BookReader/Mode1Up.js +51 -351
- package/src/BookReader/Mode1UpLit.js +441 -0
- package/src/BookReader/Mode2Up.js +104 -71
- package/src/BookReader/ModeSmoothZoom.js +179 -0
- package/src/BookReader/ModeThumb.js +16 -8
- package/src/BookReader/Navbar/Navbar.js +2 -31
- package/src/BookReader/PageContainer.js +57 -6
- package/src/BookReader/ReduceSet.js +1 -1
- package/src/BookReader/Toolbar/Toolbar.js +7 -7
- package/src/BookReader/options.js +10 -0
- package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
- package/src/BookReader/utils/ScrollClassAdder.js +31 -0
- package/src/BookReader/utils.js +68 -13
- package/src/BookReader.js +375 -289
- 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/_BRComponent.scss +1 -1
- package/src/css/_BRmain.scss +19 -24
- package/src/css/_BRnav.scss +4 -26
- package/src/css/_BRpages.scss +35 -0
- package/src/css/_BRsearch.scss +11 -215
- package/src/css/_TextSelection.scss +14 -17
- package/src/css/_colorbox.scss +2 -2
- package/src/css/_controls.scss +16 -3
- package/src/css/_icons.scss +6 -0
- package/src/ia-bookreader/ia-bookreader.js +224 -0
- package/src/plugins/plugin.chapters.js +26 -33
- package/src/plugins/plugin.mobile_nav.js +11 -10
- package/src/plugins/plugin.resume.js +3 -3
- package/src/plugins/plugin.text_selection.js +26 -39
- package/src/plugins/plugin.vendor-fullscreen.js +4 -4
- package/src/plugins/search/plugin.search.js +106 -107
- package/src/plugins/search/view.js +50 -163
- package/src/plugins/tts/AbstractTTSEngine.js +46 -37
- package/src/plugins/tts/FestivalTTSEngine.js +12 -13
- package/src/plugins/tts/PageChunk.js +15 -21
- package/src/plugins/tts/PageChunkIterator.js +8 -12
- package/src/plugins/tts/WebTTSEngine.js +64 -68
- package/src/plugins/tts/plugin.tts.js +79 -108
- package/src/plugins/url/UrlPlugin.js +184 -0
- package/src/plugins/{plugin.url.js → url/plugin.url.js} +28 -6
- 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 +8 -3
- 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/models/Navigation.js +12 -3
- package/tests/e2e/rightToLeft.test.js +4 -5
- package/tests/e2e/viewmode.test.js +38 -33
- package/tests/{BookReader → jest/BookReader}/BookModel.test.js +3 -3
- package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +176 -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 +88 -0
- package/tests/{BookReader → jest/BookReader}/Mode2Up.test.js +5 -7
- package/tests/jest/BookReader/ModeSmoothZoom.test.js +149 -0
- package/tests/jest/BookReader/ModeThumb.test.js +71 -0
- package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +7 -7
- package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +79 -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 +136 -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} +20 -4
- package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
- package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +2 -2
- package/tests/{plugins → jest/plugins}/plugin.chapters.test.js +8 -8
- 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 +24 -25
- package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +6 -6
- package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +6 -6
- 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 +1 -1
- package/tests/{plugins → jest/plugins}/tts/utils.test.js +3 -3
- package/tests/jest/plugins/url/UrlPlugin.test.js +190 -0
- package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +33 -14
- package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
- package/tests/{util → jest/util}/docCookies.test.js +1 -1
- package/tests/{util → jest/util}/strings.test.js +1 -1
- package/tests/{utils.js → jest/utils.js} +38 -0
- package/tests/karma/BookNavigator/book-navigator.test.js +501 -0
- package/tests/karma/BookNavigator/bookmarks/bookmark-button.test.js +44 -0
- package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +1 -3
- package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +3 -4
- package/tests/karma/BookNavigator/bookmarks/ia-bookmarks.test.js +57 -0
- package/tests/karma/BookNavigator/downloads/downloads-provider.test.js +67 -0
- package/tests/karma/BookNavigator/downloads/downloads.test.js +54 -0
- package/tests/karma/BookNavigator/search/search-provider.test.js +123 -0
- package/tests/karma/BookNavigator/{search-results.test.js → search/search-results.test.js} +1 -4
- package/tests/karma/BookNavigator/sharing/sharing-provider.test.js +49 -0
- package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -2
- package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +184 -0
- package/tests/karma/BookNavigator/volumes/volumes.test.js +98 -0
- package/webpack.config.js +10 -4
- package/.babelrc +0 -12
- package/.dependabot/config.yml +0 -6
- package/.testcaferc.json +0 -5
- package/BookReader/bookreader-component-bundle.js +0 -1450
- package/BookReader/bookreader-component-bundle.js.map +0 -1
- package/BookReader/plugins/plugin.menu_toggle.js +0 -2
- 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/src/BookNavigator/BookModel.js +0 -14
- package/src/BookNavigator/BookNavigator.js +0 -435
- package/src/BookNavigator/assets/book-loader.js +0 -27
- package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
- package/src/BookReaderComponent/BookReaderComponent.js +0 -112
- package/src/ItemNavigator/ItemNavigator.js +0 -372
- package/src/ItemNavigator/providers/sharing.js +0 -29
- 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/utils.test.js +0 -109
- package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
@@ -19,14 +19,15 @@ export function runDesktopSearchTests(br) {
|
|
19
19
|
const nav = br.nav;
|
20
20
|
|
21
21
|
//assuring that the search bar is enabled
|
22
|
-
await t.expect(nav.desktop.
|
22
|
+
await t.expect(nav.desktop.searchIcon.visible).ok();
|
23
|
+
await t.click(nav.desktop.searchIcon);
|
23
24
|
|
24
25
|
//testing search for a word found in the book
|
25
|
-
await t
|
26
|
-
|
27
|
-
|
28
|
-
await t.
|
29
|
-
|
26
|
+
await t.selectText(nav.desktop.searchBox).pressKey('delete');
|
27
|
+
// FIXME: Why is it only typing every other letter?!?!
|
28
|
+
await t.typeText(nav.desktop.searchBox, TEST_TEXT_FOUND.split('').join('_'));
|
29
|
+
await t.pressKey('enter');
|
30
|
+
|
30
31
|
await t.expect(nav.desktop.searchPin.exists).ok();
|
31
32
|
await t.expect(nav.desktop.searchPin.child('.BRquery').child('div').exists).ok();
|
32
33
|
await t.expect(nav.desktop.searchPin.child('.BRquery').child('div').innerText).contains(TEST_TEXT_FOUND);
|
@@ -43,7 +44,7 @@ export function runDesktopSearchTests(br) {
|
|
43
44
|
await t.expect(getPageUrl()).contains(PAGE_FIRST_RESULT);
|
44
45
|
|
45
46
|
//checks highlight on result page is visible
|
46
|
-
const highlight = br.shell.find(".
|
47
|
+
const highlight = br.shell.find(".searchHiliteLayer rect");
|
47
48
|
await t.expect(highlight.visible).ok();
|
48
49
|
|
49
50
|
});
|
@@ -54,14 +55,14 @@ export function runDesktopSearchTests(br) {
|
|
54
55
|
const nav = br.nav;
|
55
56
|
|
56
57
|
//assuring that the search bar is enabled
|
57
|
-
await t.expect(nav.desktop.
|
58
|
+
await t.expect(nav.desktop.searchIcon.visible).ok();
|
59
|
+
await t.click(nav.desktop.searchIcon);
|
58
60
|
|
59
61
|
//testing search for a word not found in the book
|
60
|
-
await t
|
61
|
-
|
62
|
-
|
63
|
-
await t.
|
64
|
-
await t.click((nav.desktop.searchBox).child('.BRsearchSubmit'));
|
62
|
+
await t.selectText(nav.desktop.searchBox).pressKey('delete');
|
63
|
+
// FIXME: Why is it only typing every other letter?!?!
|
64
|
+
await t.typeText(nav.desktop.searchBox, TEST_TEXT_NOT_FOUND.split('').join('_'));
|
65
|
+
await t.pressKey('enter');
|
65
66
|
await t.expect(nav.desktop.searchPin.child('.BRquery').child('div').withText(TEST_TEXT_NOT_FOUND).exists).notOk();
|
66
67
|
|
67
68
|
const getPageUrl = ClientFunction(() => window.location.href.toString());
|
@@ -15,7 +15,7 @@ export function runMobileSearchTests(br) {
|
|
15
15
|
|
16
16
|
test
|
17
17
|
.requestHooks(mockFound)('Mobile search - successful search', async t => {
|
18
|
-
await t.resizeWindowToFitDevice('Sony Xperia Z', {portraitOrientation: true})
|
18
|
+
await t.resizeWindowToFitDevice('Sony Xperia Z', {portraitOrientation: true});
|
19
19
|
const nav = br.nav.mobile;
|
20
20
|
|
21
21
|
//opening side menu and search
|
@@ -47,7 +47,7 @@ export function runMobileSearchTests(br) {
|
|
47
47
|
await t.expect(getPageUrl()).contains(PAGE_FIRST_RESULT);
|
48
48
|
|
49
49
|
//checks highlight on result page is visible
|
50
|
-
const highlight = br.shell.find(".
|
50
|
+
const highlight = br.shell.find(".searchHiliteLayer rect");
|
51
51
|
await t.expect(highlight.visible).ok();
|
52
52
|
|
53
53
|
await t.maximizeWindow();
|
@@ -55,7 +55,7 @@ export function runMobileSearchTests(br) {
|
|
55
55
|
|
56
56
|
test
|
57
57
|
.requestHooks(mockNotFound)('Mobile search - unsuccessful search', async t => {
|
58
|
-
await t.resizeWindowToFitDevice('Sony Xperia Z', {portraitOrientation: true})
|
58
|
+
await t.resizeWindowToFitDevice('Sony Xperia Z', {portraitOrientation: true});
|
59
59
|
const nav = br.nav.mobile;
|
60
60
|
|
61
61
|
//opening side menu and search
|
@@ -0,0 +1,17 @@
|
|
1
|
+
// @ts-check
|
2
|
+
class TestParams {
|
3
|
+
baseUrl = process.env.BASE_URL?.replace(/\/+$/, '') ?? 'http://127.0.0.1:8000'
|
4
|
+
ocaids = process.env.OCAIDS?.split(',') ?? null;
|
5
|
+
/** Whether the url we're testing is a prod (or near prod) IA url, or a demos url */
|
6
|
+
isIA = new URL(this.baseUrl).hostname.endsWith('archive.org');
|
7
|
+
|
8
|
+
/** @param {string} ocaid */
|
9
|
+
getArchiveUrl(ocaid) {
|
10
|
+
return this.isIA ? `${this.baseUrl}/details/${ocaid}`
|
11
|
+
// Otherwise it's a demo page
|
12
|
+
: `${this.baseUrl}/BookReaderDemo/demo-internetarchive.html?ocaid=${ocaid}`;
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
const params = new TestParams();
|
17
|
+
export default params;
|
@@ -6,7 +6,8 @@ export default class Navigation {
|
|
6
6
|
this.topNavShell = new Selector('.BRtoolbar');
|
7
7
|
this.bottomNavShell = new Selector('.BRfooter');
|
8
8
|
this.mobileMenu = new Selector('.BRmobileMenu');
|
9
|
-
this.
|
9
|
+
this.itemNav = Selector('ia-bookreader').shadowRoot().find('ia-item-navigator').shadowRoot();
|
10
|
+
this.desktop = new DesktopNav(this.bottomNavShell, this.itemNav);
|
10
11
|
this.mobile = new MobileNav(this.mobileMenu, this.topNavShell);
|
11
12
|
}
|
12
13
|
}
|
@@ -17,7 +18,11 @@ export default class Navigation {
|
|
17
18
|
* @classdesc defines DesktopNav base elements
|
18
19
|
*/
|
19
20
|
class DesktopNav {
|
20
|
-
|
21
|
+
/**
|
22
|
+
* @param {Selector} bottomToolbar
|
23
|
+
* @param {Selector} itemNav
|
24
|
+
*/
|
25
|
+
constructor(bottomToolbar, itemNav) {
|
21
26
|
// flipping
|
22
27
|
this.goLeft = bottomToolbar.find('.BRicon.book_left');
|
23
28
|
this.goRight = bottomToolbar.find('.BRicon.book_right');
|
@@ -35,7 +40,11 @@ class DesktopNav {
|
|
35
40
|
this.zoomOut = bottomToolbar.find('.BRicon.zoom_out');
|
36
41
|
|
37
42
|
// search
|
38
|
-
this.
|
43
|
+
this.searchIcon = itemNav.find('button.shortcut.search');
|
44
|
+
this.searchBox = itemNav
|
45
|
+
.find('ia-menu-slider').shadowRoot()
|
46
|
+
.find('ia-book-search-results').shadowRoot()
|
47
|
+
.find('input[name=query]');
|
39
48
|
this.searchPin = bottomToolbar.find('.BRsearch');
|
40
49
|
this.searchNavigation = bottomToolbar.find('.BRsearch-navigation');
|
41
50
|
|
@@ -1,16 +1,15 @@
|
|
1
1
|
import { runBaseTests } from './helpers/base';
|
2
2
|
import { runRightToLeftTests } from './helpers/rightToLeft';
|
3
|
+
import params from './helpers/params';
|
3
4
|
|
4
5
|
import BookReader from './models/BookReader';
|
5
6
|
|
6
|
-
const
|
7
|
-
const DEMO_PATH = 'demo-internetarchive.html?ocaid=';
|
8
|
-
const OCAIDS = [
|
7
|
+
const ocaids = params.ocaids || [
|
9
8
|
'gendaitankashu00meijuoft', // Right to Left book
|
10
9
|
];
|
11
10
|
|
12
|
-
|
13
|
-
const url = `${
|
11
|
+
ocaids.forEach(ocaid => {
|
12
|
+
const url = `${params.getArchiveUrl(ocaid)}`;
|
14
13
|
|
15
14
|
fixture `Base Tests for right to left book: ${ocaid}`.page `${url}`;
|
16
15
|
runBaseTests(new BookReader({ pageProgression: 'rl' }));
|
@@ -1,37 +1,42 @@
|
|
1
1
|
import { Selector } from 'testcafe';
|
2
2
|
import BookReader from './models/BookReader';
|
3
|
+
import params from './helpers/params';
|
3
4
|
|
4
|
-
const
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
5
|
+
const ocaids = params.ocaids || ['goody'];
|
6
|
+
|
7
|
+
ocaids.forEach(ocaid => {
|
8
|
+
const url = params.getArchiveUrl(ocaid);
|
9
|
+
|
10
|
+
fixture `Viewmode carousel`.page `${url}`;
|
11
|
+
|
12
|
+
test('Clicking `view mode` cycles through view modes', async t => {
|
13
|
+
const { nav } = (new BookReader());
|
14
|
+
|
15
|
+
// viewmode button only appear on mobile devices
|
16
|
+
await t.resizeWindow(400, 800);
|
17
|
+
// Flip forward one
|
18
|
+
await t.pressKey('right');
|
19
|
+
|
20
|
+
// 2up to thumb
|
21
|
+
await t.click(nav.desktop.viewmode);
|
22
|
+
const thumbnailContainer = Selector('.BRmodeThumb');
|
23
|
+
await t.expect(thumbnailContainer.visible).ok();
|
24
|
+
const thumbImages = thumbnailContainer.find('.BRpageview img');
|
25
|
+
await t.expect(thumbImages.count).gt(0);
|
26
|
+
|
27
|
+
// thumb to 1up
|
28
|
+
await t.click(nav.desktop.viewmode);
|
29
|
+
const onePageViewContainer = Selector('br-mode-1up');
|
30
|
+
await t.expect(onePageViewContainer.visible).ok();
|
31
|
+
const onePageImages = onePageViewContainer.find('.BRmode1up .BRpagecontainer');
|
32
|
+
// we usually pre-fetch the page in question & 1 before/after it
|
33
|
+
await t.expect(onePageImages.count).gte(3);
|
34
|
+
|
35
|
+
// 1up to 2up
|
36
|
+
await t.click(nav.desktop.viewmode);
|
37
|
+
const twoPageContainer = Selector('.BRtwopageview');
|
38
|
+
await t.expect(twoPageContainer.visible).ok();
|
39
|
+
const twoPageImages = twoPageContainer.find('img.BRpageimage');
|
40
|
+
await t.expect(twoPageImages.count).gte(2);
|
41
|
+
});
|
37
42
|
});
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import sinon from 'sinon';
|
2
2
|
import { deepCopy } from '../utils.js';
|
3
|
-
import { BookModel } from '
|
4
|
-
/** @typedef {import('
|
3
|
+
import { BookModel } from '@/src/BookReader/BookModel.js';
|
4
|
+
/** @typedef {import('@/src/BookReader/options.js').BookReaderOptions} BookReaderOptions */
|
5
5
|
|
6
6
|
afterEach(() => {
|
7
7
|
sinon.restore();
|
@@ -190,7 +190,7 @@ describe('pagesIterator', () => {
|
|
190
190
|
describe('_getDataFlattened', () => {
|
191
191
|
test('Assigns correct page sides', () => {
|
192
192
|
const bm = new BookModel({ data: SAMPLE_DATA });
|
193
|
-
expect(bm._getDataFlattened().map(page => page.pageSide)).toEqual(['R', 'L', 'R', 'L'])
|
193
|
+
expect(bm._getDataFlattened().map(page => page.pageSide)).toEqual(['R', 'L', 'R', 'L']);
|
194
194
|
});
|
195
195
|
|
196
196
|
test('Memoized based on data length', () => {
|
@@ -0,0 +1,176 @@
|
|
1
|
+
import BookReader from '@/src/BookReader';
|
2
|
+
import { sleep } from '@/src/plugins/tts/utils';
|
3
|
+
import sinon from 'sinon';
|
4
|
+
|
5
|
+
beforeAll(() => {
|
6
|
+
global.alert = sinon.fake();
|
7
|
+
});
|
8
|
+
afterEach(() => {
|
9
|
+
sinon.restore();
|
10
|
+
});
|
11
|
+
|
12
|
+
describe('BookReader.prototype.toggleFullscreen', () => {
|
13
|
+
test('uses `isFullscreen` to check fullscreen state', () => {
|
14
|
+
const isFSmock = sinon.fake();
|
15
|
+
// isFSmock.mockReturnValueOnce(false);
|
16
|
+
const br = new BookReader();
|
17
|
+
br.mode = br.constMode1up;
|
18
|
+
br.enterFullscreen = sinon.fake();
|
19
|
+
br.isFullscreen = isFSmock;
|
20
|
+
|
21
|
+
br.toggleFullscreen();
|
22
|
+
expect(br.isFullscreen.callCount).toEqual(1);
|
23
|
+
});
|
24
|
+
|
25
|
+
test('will always emit an event', async () => {
|
26
|
+
const br = new BookReader();
|
27
|
+
br.mode = br.constMode2up;
|
28
|
+
br.trigger = sinon.fake();
|
29
|
+
br.switchMode = sinon.fake();
|
30
|
+
br.updateBrClasses = sinon.fake();
|
31
|
+
br.refs.$brContainer = {
|
32
|
+
css: sinon.fake(),
|
33
|
+
animate: (options, speed, style, callback) => callback()
|
34
|
+
};
|
35
|
+
br.refs.$br = {
|
36
|
+
updateBrClasses: sinon.fake(),
|
37
|
+
removeClass: sinon.fake(),
|
38
|
+
addClass: sinon.fake(),
|
39
|
+
css: sinon.fake(),
|
40
|
+
animate: (options, speed, style, callback) => callback()
|
41
|
+
};
|
42
|
+
|
43
|
+
await br.toggleFullscreen();
|
44
|
+
expect(br.trigger.callCount).toBeGreaterThan(0);
|
45
|
+
});
|
46
|
+
|
47
|
+
test('will start with opening fullscreen', () => {
|
48
|
+
const br = new BookReader();
|
49
|
+
br.mode = br.constMode2up;
|
50
|
+
br.enterFullscreen = sinon.fake();
|
51
|
+
|
52
|
+
br.toggleFullscreen();
|
53
|
+
expect(br.enterFullscreen.callCount).toEqual(1);
|
54
|
+
});
|
55
|
+
|
56
|
+
test('will close fullscreen if BookReader is in fullscreen', () => {
|
57
|
+
const br = new BookReader();
|
58
|
+
br.mode = br.constMode1up;
|
59
|
+
br.exitFullScreen = sinon.fake();
|
60
|
+
br.isFullscreenActive = true;
|
61
|
+
|
62
|
+
br.toggleFullscreen();
|
63
|
+
expect(br.exitFullScreen.callCount).toEqual(1);
|
64
|
+
});
|
65
|
+
});
|
66
|
+
|
67
|
+
describe('BookReader.prototype.enterFullscreen', () => {
|
68
|
+
test('will bind `_fullscreenCloseHandler` by default', () => {
|
69
|
+
const br = new BookReader();
|
70
|
+
br.mode = br.constMode1up;
|
71
|
+
br.switchMode = sinon.fake();
|
72
|
+
br.updateBrClasses = sinon.fake();
|
73
|
+
br.refs.$brContainer = {
|
74
|
+
css: sinon.fake(),
|
75
|
+
animate: sinon.fake(),
|
76
|
+
};
|
77
|
+
expect(br._fullscreenCloseHandler).toBeUndefined();
|
78
|
+
|
79
|
+
br.enterFullscreen();
|
80
|
+
expect(br._fullscreenCloseHandler).toBeDefined();
|
81
|
+
});
|
82
|
+
|
83
|
+
test('fires certain events when called', async () => {
|
84
|
+
const br = new BookReader();
|
85
|
+
br.mode = br.constMode2up;
|
86
|
+
br.switchMode = sinon.fake();
|
87
|
+
br.updateBrClasses = sinon.fake();
|
88
|
+
br.trigger = sinon.fake();
|
89
|
+
br.resize = sinon.fake();
|
90
|
+
br.jumpToIndex = sinon.fake();
|
91
|
+
br.refs.$brContainer = {
|
92
|
+
css: sinon.fake(),
|
93
|
+
animate: (options, speed, style, callback) => callback()
|
94
|
+
};
|
95
|
+
|
96
|
+
await br.enterFullscreen();
|
97
|
+
expect(br.switchMode.callCount).toEqual(1);
|
98
|
+
expect(br.updateBrClasses.callCount).toEqual(1);
|
99
|
+
expect(br.trigger.callCount).toEqual(2); // fragmentChange, fullscreenToggled
|
100
|
+
expect(br.jumpToIndex.callCount).toEqual(1);
|
101
|
+
|
102
|
+
await sleep(0);
|
103
|
+
expect(br.resize.callCount).toEqual(1);
|
104
|
+
});
|
105
|
+
});
|
106
|
+
|
107
|
+
describe('BookReader.prototype.exitFullScreen', () => {
|
108
|
+
test('fires certain events when called', async () => {
|
109
|
+
const br = new BookReader();
|
110
|
+
br.mode = br.constMode2up;
|
111
|
+
br.switchMode = sinon.fake();
|
112
|
+
br.updateBrClasses = sinon.fake();
|
113
|
+
br.trigger = sinon.fake();
|
114
|
+
br.resize = sinon.fake();
|
115
|
+
br.refs.$brContainer = {
|
116
|
+
css: sinon.fake(),
|
117
|
+
animate: (options, speed, style, callback) => callback()
|
118
|
+
};
|
119
|
+
await br.exitFullScreen();
|
120
|
+
expect(br.switchMode.callCount).toEqual(1);
|
121
|
+
expect(br.updateBrClasses.callCount).toEqual(1);
|
122
|
+
expect(br.trigger.callCount).toEqual(2); // fragmentChange, fullscreenToggled
|
123
|
+
expect(br.resize.callCount).toEqual(1);
|
124
|
+
});
|
125
|
+
});
|
126
|
+
|
127
|
+
describe('BookReader.prototype.trigger', () => {
|
128
|
+
test('fires custom event', () => {
|
129
|
+
const br = new BookReader();
|
130
|
+
global.br = br;
|
131
|
+
global.dispatchEvent = sinon.fake();
|
132
|
+
|
133
|
+
const props = {bar: 1};
|
134
|
+
br.trigger('foo', props);
|
135
|
+
expect(global.dispatchEvent.callCount).toBe(1);
|
136
|
+
});
|
137
|
+
});
|
138
|
+
|
139
|
+
describe('`BookReader.prototype.prev`', () => {
|
140
|
+
const br = new BookReader();
|
141
|
+
global.br = br;
|
142
|
+
br.trigger = sinon.fake();
|
143
|
+
br.flipBackToIndex = sinon.fake();
|
144
|
+
br.jumpToIndex = sinon.fake();
|
145
|
+
|
146
|
+
test('does not take action if user is on front page', () => {
|
147
|
+
br.firstIndex = 0;
|
148
|
+
br.prev();
|
149
|
+
expect(br.trigger.callCount).toBe(0);
|
150
|
+
expect(br.flipBackToIndex.callCount).toBe(0);
|
151
|
+
expect(br.jumpToIndex.callCount).toBe(0);
|
152
|
+
});
|
153
|
+
|
154
|
+
describe('2up mode', () => {
|
155
|
+
test('fires event and turns the page', () => {
|
156
|
+
br.firstIndex = 10;
|
157
|
+
br.mode = br.constMode2up;
|
158
|
+
br.prev();
|
159
|
+
expect(br.jumpToIndex.callCount).toBe(0); // <-- does not get called
|
160
|
+
expect(br.trigger.callCount).toBe(1);
|
161
|
+
expect(br.flipBackToIndex.callCount).toBe(1);
|
162
|
+
});
|
163
|
+
});
|
164
|
+
|
165
|
+
describe('non 2up mode', () => {
|
166
|
+
test('jumps to provided index', () => {
|
167
|
+
br.firstIndex = 100;
|
168
|
+
br.mode = br.constMode1up;
|
169
|
+
br.prev();
|
170
|
+
expect(br.jumpToIndex.callCount).toBe(1); // <-- gets called
|
171
|
+
expect(br.trigger.callCount).toBe(1); // <-- gets called by `jumpToIndex` internally
|
172
|
+
expect(br.flipBackToIndex.callCount).toBe(1); // <-- gets called by `jumpToIndex` internally
|
173
|
+
});
|
174
|
+
});
|
175
|
+
});
|
176
|
+
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import sinon from 'sinon';
|
2
|
-
import { BookModel } from '
|
3
|
-
import { ImageCache } from '
|
4
|
-
import { Pow2ReduceSet } from '
|
5
|
-
/** @typedef {import('
|
2
|
+
import { BookModel } from '@/src/BookReader/BookModel.js';
|
3
|
+
import { ImageCache } from '@/src/BookReader/ImageCache.js';
|
4
|
+
import { Pow2ReduceSet } from '@/src/BookReader/ReduceSet.js';
|
5
|
+
/** @typedef {import('@/src/BookReader/options.js').BookReaderOptions} BookReaderOptions */
|
6
6
|
|
7
7
|
afterEach(() => {
|
8
8
|
jest.restoreAllMocks();
|
@@ -0,0 +1,88 @@
|
|
1
|
+
import { BookModel } from '@/src/BookReader/BookModel.js';
|
2
|
+
import { Mode1UpLit } from '@/src/BookReader/Mode1UpLit.js';
|
3
|
+
|
4
|
+
/** @type {import('@/src/BookReader/options.js').BookReaderOptions['data']} */
|
5
|
+
const SAMPLE_DATA = [
|
6
|
+
[
|
7
|
+
{ width: 123, height: 123, uri: 'https://archive.org/image0.jpg', pageNum: '1' },
|
8
|
+
],
|
9
|
+
[
|
10
|
+
{ width: 123, height: 123, uri: 'https://archive.org/image1.jpg', pageNum: '2' },
|
11
|
+
{ width: 123, height: 123, uri: 'https://archive.org/image2.jpg', pageNum: '3' },
|
12
|
+
],
|
13
|
+
[
|
14
|
+
{ width: 123, height: 123, uri: 'https://archive.org/image3.jpg', pageNum: '4' },
|
15
|
+
{ width: 123, height: 123, uri: 'https://archive.org/image4.jpg', pageNum: '5' },
|
16
|
+
],
|
17
|
+
[
|
18
|
+
{ width: 123, height: 123, uri: 'https://archive.org/image5.jpg', pageNum: '6' },
|
19
|
+
],
|
20
|
+
];
|
21
|
+
|
22
|
+
function make_dummy_br(overrides = {}) {
|
23
|
+
return Object.assign({
|
24
|
+
updateFirstIndex() {},
|
25
|
+
updateNavIndexThrottled() {},
|
26
|
+
data: []
|
27
|
+
}, overrides);
|
28
|
+
}
|
29
|
+
|
30
|
+
describe('pageTops', () => {
|
31
|
+
afterEach(() => document.body.innerHTML = '');
|
32
|
+
|
33
|
+
test('Works with empty book', async () => {
|
34
|
+
const br = make_dummy_br({ data: [] });
|
35
|
+
const book = new BookModel(br);
|
36
|
+
const mode = new Mode1UpLit(book, br);
|
37
|
+
document.body.appendChild(mode);
|
38
|
+
mode.requestUpdate();
|
39
|
+
await mode.updateComplete;
|
40
|
+
expect(mode.pageTops).toEqual({});
|
41
|
+
});
|
42
|
+
|
43
|
+
test('Iterates all pages', async () => {
|
44
|
+
const br = make_dummy_br({ data: SAMPLE_DATA });
|
45
|
+
const book = new BookModel(br);
|
46
|
+
const mode = new Mode1UpLit(book, br);
|
47
|
+
document.body.appendChild(mode);
|
48
|
+
await mode.requestUpdate();
|
49
|
+
expect(Object.values(mode.pageTops)).toHaveLength(6);
|
50
|
+
});
|
51
|
+
|
52
|
+
test('Computes tops', async () => {
|
53
|
+
const br = make_dummy_br({ data: SAMPLE_DATA });
|
54
|
+
const book = new BookModel(br);
|
55
|
+
const mode = new Mode1UpLit(book, br);
|
56
|
+
document.body.appendChild(mode);
|
57
|
+
await mode.requestUpdate();
|
58
|
+
const tops = Object.entries(mode.pageTops);
|
59
|
+
expect(tops.map(([index, top]) => [index, top.toFixed(1)])).toEqual([
|
60
|
+
// Recall these are in inches
|
61
|
+
['0', '0.2'],
|
62
|
+
['1', '0.6'],
|
63
|
+
['2', '1.1'],
|
64
|
+
['3', '1.5'],
|
65
|
+
['4', '2.0'],
|
66
|
+
['5', '2.4'],
|
67
|
+
]);
|
68
|
+
});
|
69
|
+
});
|
70
|
+
|
71
|
+
describe('worldUnitsToRenderedPixels', () => {
|
72
|
+
test('0 case', () => {
|
73
|
+
const mode = new Mode1UpLit(null, null);
|
74
|
+
expect(mode.worldUnitsToRenderedPixels(0)).toBe(0);
|
75
|
+
});
|
76
|
+
test('Misc cases', () => {
|
77
|
+
const mode = new Mode1UpLit(null, null);
|
78
|
+
mode.screenDPI = 100;
|
79
|
+
mode.realWorldReduce = 1;
|
80
|
+
expect(mode.worldUnitsToRenderedPixels(1)).toBe(100);
|
81
|
+
mode.screenDPI = 100;
|
82
|
+
mode.realWorldReduce = 2;
|
83
|
+
expect(mode.worldUnitsToRenderedPixels(1)).toBe(50);
|
84
|
+
mode.screenDPI = 78;
|
85
|
+
mode.realWorldReduce = 1;
|
86
|
+
expect(mode.worldUnitsToRenderedPixels(1)).toBe(78);
|
87
|
+
});
|
88
|
+
});
|
@@ -1,12 +1,12 @@
|
|
1
1
|
|
2
2
|
import sinon from 'sinon';
|
3
3
|
import { deepCopy } from '../utils.js';
|
4
|
-
import BookReader from '
|
5
|
-
/** @typedef {import('
|
4
|
+
import BookReader from '@/src/BookReader.js';
|
5
|
+
/** @typedef {import('@/src/BookReader/options.js').BookReaderOptions} BookReaderOptions */
|
6
6
|
|
7
7
|
beforeAll(() => {
|
8
8
|
global.alert = jest.fn();
|
9
|
-
})
|
9
|
+
});
|
10
10
|
afterEach(() => {
|
11
11
|
jest.restoreAllMocks();
|
12
12
|
sinon.restore();
|
@@ -83,7 +83,7 @@ describe('draw 2up leaves', () => {
|
|
83
83
|
|
84
84
|
br.init();
|
85
85
|
expect(drawLeafs.callCount).toBe(1);
|
86
|
-
})
|
86
|
+
});
|
87
87
|
|
88
88
|
test('sets `this.displayedIndices`', () => {
|
89
89
|
const extremelyWrongValueForDisplayedIndices = null;
|
@@ -98,7 +98,7 @@ describe('draw 2up leaves', () => {
|
|
98
98
|
expect(br.displayedIndices).not.toBe(extremelyWrongValueForDisplayedIndices);
|
99
99
|
expect(br.displayedIndices.length).toBe(2); // is array
|
100
100
|
expect(br.displayedIndices).toEqual([-1, 0]); // default to starting index on right, placeholder for left
|
101
|
-
})
|
101
|
+
});
|
102
102
|
});
|
103
103
|
|
104
104
|
describe('resizeSpread', () => {
|
@@ -220,7 +220,6 @@ describe('prepareTwoPageView', () => {
|
|
220
220
|
const calculateSpreadSize = sinon.spy(mode2Up, 'calculateSpreadSize');
|
221
221
|
const prunePageContainers = sinon.spy(mode2Up, 'prunePageContainers');
|
222
222
|
const prefetch = sinon.spy(mode2Up, 'prefetch');
|
223
|
-
const bindGestures = sinon.spy(br, 'bindGestures');
|
224
223
|
const centerView = sinon.spy(mode2Up, 'centerView');
|
225
224
|
const preparePopUp = sinon.spy(mode2Up, 'preparePopUp');
|
226
225
|
const updateBrClasses = sinon.spy(br, 'updateBrClasses');
|
@@ -232,7 +231,6 @@ describe('prepareTwoPageView', () => {
|
|
232
231
|
expect(drawLeafs.callCount).toBe(1);
|
233
232
|
expect(calculateSpreadSize.callCount).toBe(1);
|
234
233
|
expect(prunePageContainers.callCount).toBe(1);
|
235
|
-
expect(bindGestures.callCount).toBe(1);
|
236
234
|
expect(centerView.callCount).toBe(1);
|
237
235
|
expect(preparePopUp.callCount).toBe(1);
|
238
236
|
expect(updateBrClasses.callCount).toBe(1);
|