@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.
Files changed (228) hide show
  1. package/.eslintrc.js +17 -15
  2. package/.github/workflows/node.js.yml +75 -4
  3. package/.github/workflows/npm-publish.yml +2 -16
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +83 -323
  6. package/BookReader/BookReader.js +1 -1
  7. package/BookReader/BookReader.js.LICENSE.txt +24 -0
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +1623 -0
  10. package/BookReader/{bookreader-component-bundle.js.LICENSE.txt → ia-bookreader-bundle.js.LICENSE.txt} +14 -10
  11. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  12. package/BookReader/icons/close-circle-dark.svg +1 -0
  13. package/BookReader/icons/magnify-minus.svg +1 -1
  14. package/BookReader/icons/magnify-plus.svg +1 -1
  15. package/BookReader/icons/voice.svg +1 -0
  16. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  17. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  18. package/BookReader/plugins/plugin.autoplay.js +1 -1
  19. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  20. package/BookReader/plugins/plugin.chapters.js +1 -1
  21. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  22. package/BookReader/plugins/plugin.iframe.js +1 -1
  23. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  24. package/BookReader/plugins/plugin.mobile_nav.js +1 -1
  25. package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
  26. package/BookReader/plugins/plugin.resume.js +1 -1
  27. package/BookReader/plugins/plugin.resume.js.map +1 -1
  28. package/BookReader/plugins/plugin.search.js +1 -1
  29. package/BookReader/plugins/plugin.search.js.map +1 -1
  30. package/BookReader/plugins/plugin.text_selection.js +1 -1
  31. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  32. package/BookReader/plugins/plugin.tts.js +1 -1
  33. package/BookReader/plugins/plugin.tts.js.map +1 -1
  34. package/BookReader/plugins/plugin.url.js +1 -1
  35. package/BookReader/plugins/plugin.url.js.map +1 -1
  36. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  37. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  38. package/BookReader/webcomponents-bundle.js +3 -0
  39. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  40. package/BookReader/webcomponents-bundle.js.map +1 -0
  41. package/BookReaderDemo/BookReaderDemo.css +14 -1
  42. package/BookReaderDemo/IADemoBr.js +120 -0
  43. package/BookReaderDemo/demo-advanced.html +1 -1
  44. package/BookReaderDemo/demo-autoplay.html +1 -0
  45. package/BookReaderDemo/demo-embed-iframe-src.html +1 -0
  46. package/BookReaderDemo/demo-fullscreen-mobile.html +1 -0
  47. package/BookReaderDemo/demo-fullscreen.html +1 -0
  48. package/BookReaderDemo/demo-iiif.html +1 -0
  49. package/BookReaderDemo/demo-internetarchive.html +74 -17
  50. package/BookReaderDemo/demo-multiple.html +1 -0
  51. package/BookReaderDemo/demo-preview-pages.html +1 -0
  52. package/BookReaderDemo/demo-simple.html +1 -0
  53. package/BookReaderDemo/demo-vendor-fullscreen.html +1 -0
  54. package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
  55. package/BookReaderDemo/immersion-1up.html +1 -0
  56. package/BookReaderDemo/immersion-mode.html +1 -0
  57. package/BookReaderDemo/toggle_controls.html +1 -0
  58. package/BookReaderDemo/view_mode.html +1 -0
  59. package/BookReaderDemo/viewmode-cycle.html +1 -2
  60. package/CHANGELOG.md +166 -0
  61. package/README.md +14 -1
  62. package/babel.config.js +18 -0
  63. package/codecov.yml +6 -0
  64. package/index.html +3 -0
  65. package/jsconfig.json +19 -0
  66. package/package.json +62 -47
  67. package/renovate.json +43 -0
  68. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  69. package/src/BookNavigator/assets/button-base.js +9 -2
  70. package/src/BookNavigator/assets/ia-logo.js +17 -0
  71. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  72. package/src/BookNavigator/assets/icon_close.js +1 -1
  73. package/src/BookNavigator/assets/icon_sort_asc.js +5 -0
  74. package/src/BookNavigator/assets/icon_sort_desc.js +5 -0
  75. package/src/BookNavigator/assets/icon_sort_neutral.js +5 -0
  76. package/src/BookNavigator/assets/icon_volumes.js +11 -0
  77. package/src/BookNavigator/book-navigator.js +556 -0
  78. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  79. package/src/BookNavigator/bookmarks/bookmark-edit.js +4 -4
  80. package/src/BookNavigator/bookmarks/bookmarks-list.js +3 -3
  81. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +3 -8
  82. package/src/BookNavigator/bookmarks/bookmarks-provider.js +23 -12
  83. package/src/BookNavigator/bookmarks/ia-bookmarks.js +98 -62
  84. package/src/BookNavigator/delete-modal-actions.js +1 -1
  85. package/src/BookNavigator/downloads/downloads-provider.js +23 -17
  86. package/src/BookNavigator/downloads/downloads.js +17 -25
  87. package/src/BookNavigator/search/a-search-result.js +3 -3
  88. package/src/BookNavigator/search/search-provider.js +57 -24
  89. package/src/BookNavigator/search/search-results.js +8 -20
  90. package/src/BookNavigator/sharing.js +27 -0
  91. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -13
  92. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +4 -3
  93. package/src/BookNavigator/volumes/volumes-provider.js +114 -0
  94. package/src/BookNavigator/volumes/volumes.js +188 -0
  95. package/src/BookReader/DebugConsole.js +3 -3
  96. package/src/BookReader/DragScrollable.js +233 -0
  97. package/src/BookReader/Mode1Up.js +51 -351
  98. package/src/BookReader/Mode1UpLit.js +441 -0
  99. package/src/BookReader/Mode2Up.js +104 -71
  100. package/src/BookReader/ModeSmoothZoom.js +179 -0
  101. package/src/BookReader/ModeThumb.js +16 -8
  102. package/src/BookReader/Navbar/Navbar.js +2 -31
  103. package/src/BookReader/PageContainer.js +57 -6
  104. package/src/BookReader/ReduceSet.js +1 -1
  105. package/src/BookReader/Toolbar/Toolbar.js +7 -7
  106. package/src/BookReader/options.js +10 -0
  107. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  108. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  109. package/src/BookReader/utils.js +68 -13
  110. package/src/BookReader.js +375 -289
  111. package/src/assets/icons/close-circle-dark.svg +1 -0
  112. package/src/assets/icons/magnify-minus.svg +3 -7
  113. package/src/assets/icons/magnify-plus.svg +3 -7
  114. package/src/assets/icons/voice.svg +1 -0
  115. package/src/css/BookReader.scss +0 -12
  116. package/src/css/_BRComponent.scss +1 -1
  117. package/src/css/_BRmain.scss +19 -24
  118. package/src/css/_BRnav.scss +4 -26
  119. package/src/css/_BRpages.scss +35 -0
  120. package/src/css/_BRsearch.scss +11 -215
  121. package/src/css/_TextSelection.scss +14 -17
  122. package/src/css/_colorbox.scss +2 -2
  123. package/src/css/_controls.scss +16 -3
  124. package/src/css/_icons.scss +6 -0
  125. package/src/ia-bookreader/ia-bookreader.js +224 -0
  126. package/src/plugins/plugin.chapters.js +26 -33
  127. package/src/plugins/plugin.mobile_nav.js +11 -10
  128. package/src/plugins/plugin.resume.js +3 -3
  129. package/src/plugins/plugin.text_selection.js +26 -39
  130. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  131. package/src/plugins/search/plugin.search.js +106 -107
  132. package/src/plugins/search/view.js +50 -163
  133. package/src/plugins/tts/AbstractTTSEngine.js +46 -37
  134. package/src/plugins/tts/FestivalTTSEngine.js +12 -13
  135. package/src/plugins/tts/PageChunk.js +15 -21
  136. package/src/plugins/tts/PageChunkIterator.js +8 -12
  137. package/src/plugins/tts/WebTTSEngine.js +64 -68
  138. package/src/plugins/tts/plugin.tts.js +79 -108
  139. package/src/plugins/url/UrlPlugin.js +184 -0
  140. package/src/plugins/{plugin.url.js → url/plugin.url.js} +28 -6
  141. package/tests/e2e/README.md +37 -0
  142. package/tests/e2e/autoplay.test.js +2 -2
  143. package/tests/e2e/base.test.js +7 -7
  144. package/tests/e2e/helpers/base.js +8 -3
  145. package/tests/e2e/helpers/debug.js +1 -1
  146. package/tests/e2e/helpers/desktopSearch.js +14 -13
  147. package/tests/e2e/helpers/mobileSearch.js +3 -3
  148. package/tests/e2e/helpers/params.js +17 -0
  149. package/tests/e2e/models/Navigation.js +12 -3
  150. package/tests/e2e/rightToLeft.test.js +4 -5
  151. package/tests/e2e/viewmode.test.js +38 -33
  152. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +3 -3
  153. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +176 -0
  154. package/tests/{BookReader → jest/BookReader}/DebugConsole.test.js +1 -1
  155. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  156. package/tests/jest/BookReader/Mode1UpLit.test.js +88 -0
  157. package/tests/{BookReader → jest/BookReader}/Mode2Up.test.js +5 -7
  158. package/tests/jest/BookReader/ModeSmoothZoom.test.js +149 -0
  159. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  160. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +7 -7
  161. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +79 -6
  162. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  163. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  164. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  165. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  166. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  167. package/tests/jest/BookReader/utils.test.js +136 -0
  168. package/tests/jest/BookReader.keyboard.test.js +190 -0
  169. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  170. package/tests/{BookReader.test.js → jest/BookReader.test.js} +20 -4
  171. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  172. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +2 -2
  173. package/tests/{plugins → jest/plugins}/plugin.chapters.test.js +8 -8
  174. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  175. package/tests/{plugins → jest/plugins}/plugin.mobile_nav.test.js +5 -5
  176. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  177. package/tests/{plugins → jest/plugins}/plugin.text_selection.test.js +39 -47
  178. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  179. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +24 -25
  180. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +6 -6
  181. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +6 -6
  182. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  183. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  184. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  185. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +1 -1
  186. package/tests/{plugins → jest/plugins}/tts/utils.test.js +3 -3
  187. package/tests/jest/plugins/url/UrlPlugin.test.js +190 -0
  188. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +33 -14
  189. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  190. package/tests/{util → jest/util}/docCookies.test.js +1 -1
  191. package/tests/{util → jest/util}/strings.test.js +1 -1
  192. package/tests/{utils.js → jest/utils.js} +38 -0
  193. package/tests/karma/BookNavigator/book-navigator.test.js +501 -0
  194. package/tests/karma/BookNavigator/bookmarks/bookmark-button.test.js +44 -0
  195. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +1 -3
  196. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +3 -4
  197. package/tests/karma/BookNavigator/bookmarks/ia-bookmarks.test.js +57 -0
  198. package/tests/karma/BookNavigator/downloads/downloads-provider.test.js +67 -0
  199. package/tests/karma/BookNavigator/downloads/downloads.test.js +54 -0
  200. package/tests/karma/BookNavigator/search/search-provider.test.js +123 -0
  201. package/tests/karma/BookNavigator/{search-results.test.js → search/search-results.test.js} +1 -4
  202. package/tests/karma/BookNavigator/sharing/sharing-provider.test.js +49 -0
  203. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -2
  204. package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +184 -0
  205. package/tests/karma/BookNavigator/volumes/volumes.test.js +98 -0
  206. package/webpack.config.js +10 -4
  207. package/.babelrc +0 -12
  208. package/.dependabot/config.yml +0 -6
  209. package/.testcaferc.json +0 -5
  210. package/BookReader/bookreader-component-bundle.js +0 -1450
  211. package/BookReader/bookreader-component-bundle.js.map +0 -1
  212. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  213. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  214. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  215. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  216. package/src/BookNavigator/BookModel.js +0 -14
  217. package/src/BookNavigator/BookNavigator.js +0 -435
  218. package/src/BookNavigator/assets/book-loader.js +0 -27
  219. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  220. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  221. package/src/ItemNavigator/ItemNavigator.js +0 -372
  222. package/src/ItemNavigator/providers/sharing.js +0 -29
  223. package/src/dragscrollable-br.js +0 -261
  224. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  225. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  226. package/tests/BookReader/Mode1Up.test.js +0 -164
  227. package/tests/BookReader/utils.test.js +0 -109
  228. 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.searchBox.visible).ok();
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
- .selectText(nav.desktop.searchBox.child('.BRsearchInput'))
27
- .pressKey('delete');
28
- await t.typeText(nav.desktop.searchBox.child('.BRsearchInput'), TEST_TEXT_FOUND);
29
- await t.click((nav.desktop.searchBox).child('.BRsearchSubmit'));
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(".BookReaderSearchHilite");
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.searchBox.visible).ok();
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
- .selectText(nav.desktop.searchBox.child('.BRsearchInput'))
62
- .pressKey('delete');
63
- await t.typeText(nav.desktop.searchBox.child('.BRsearchInput'), TEST_TEXT_NOT_FOUND);
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(".BookReaderSearchHilite");
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.desktop = new DesktopNav(this.bottomNavShell, this.topNavShell);
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
- constructor(bottomToolbar, topToolbar) {
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.searchBox = topToolbar.find('.BRbooksearch.desktop');
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 { BASE_URL } = process.env;
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
- OCAIDS.forEach(ocaid => {
13
- const url = `${BASE_URL}${DEMO_PATH}${ocaid}`;
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 { BASE_URL } = process.env;
5
-
6
- fixture `Viewmode carousel`.page `${BASE_URL}viewmode-cycle.html`;
7
-
8
- test('Clicking `view mode` cycles through view modes', async t => {
9
- const { nav } = (new BookReader());
10
-
11
- // viewmode button only appear on mobile devices
12
- await t.resizeWindow(400, 800);
13
- // Flip forward one
14
- await t.pressKey('right');
15
-
16
- // 2up to thumb
17
- await t.click(nav.desktop.viewmode);
18
- const thumbnailContainer = Selector('.BRmodeThumb');
19
- await t.expect(thumbnailContainer.visible).ok();
20
- const thumbImages = thumbnailContainer.find('.BRpageview img');
21
- await t.expect(thumbImages.count).gt(0);
22
-
23
- // thumb to 1up
24
- await t.click(nav.desktop.viewmode);
25
- const onePageViewContainer = Selector('.BRpageview');
26
- await t.expect(onePageViewContainer.visible).ok();
27
- const onePageImages = onePageViewContainer.find('.BRmode1up .BRpagecontainer');
28
- // we usually pre-fetch the page in question & 1 before/after it
29
- await t.expect(onePageImages.count).gte(3);
30
-
31
- // 1up to 2up
32
- await t.click(nav.desktop.viewmode);
33
- const twoPageContainer = Selector('.BRtwopageview');
34
- await t.expect(twoPageContainer.visible).ok();
35
- const twoPageImages = twoPageContainer.find('img.BRpageimage');
36
- await t.expect(twoPageImages.count).gte(2);
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 '../../src/BookReader/BookModel.js';
4
- /** @typedef {import('../../src/BookReader/options.js').BookReaderOptions} BookReaderOptions */
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,5 +1,5 @@
1
1
  import sinon from 'sinon';
2
- import { DebugConsole } from '../../src/BookReader/DebugConsole.js';
2
+ import { DebugConsole } from '@/src/BookReader/DebugConsole.js';
3
3
 
4
4
  beforeEach(() => {
5
5
  sinon.stub(console, 'log');
@@ -1,8 +1,8 @@
1
1
  import sinon from 'sinon';
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 */
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 '../../src/BookReader.js';
5
- /** @typedef {import('../../src/BookReader/options.js').BookReaderOptions} BookReaderOptions */
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);