@internetarchive/bookreader 5.0.0-3 → 5.0.0-30-a

Sign up to get free protection for your applications and to get access to all the features.
Files changed (389) hide show
  1. package/.eslintrc.js +17 -5
  2. package/.github/dependabot.yml +8 -0
  3. package/.github/workflows/node.js.yml +10 -1
  4. package/.husky/_/husky.sh +30 -0
  5. package/.testcaferc.js +10 -0
  6. package/BookReader/BookReader.css +75 -323
  7. package/BookReader/BookReader.js +1 -1
  8. package/BookReader/BookReader.js.LICENSE.txt +45 -0
  9. package/BookReader/BookReader.js.map +1 -1
  10. package/BookReader/ia-bookreader-bundle.js +1458 -0
  11. package/BookReader/{bookreader-component-bundle.js.LICENSE.txt → ia-bookreader-bundle.js.LICENSE.txt} +10 -9
  12. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  13. package/BookReader/icons/close-circle-dark.svg +1 -0
  14. package/BookReader/icons/voice.svg +1 -0
  15. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  16. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  17. package/BookReader/plugins/plugin.autoplay.js +1 -1
  18. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  19. package/BookReader/plugins/plugin.chapters.js +1 -1
  20. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  21. package/BookReader/plugins/plugin.iframe.js +1 -1
  22. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  23. package/BookReader/plugins/plugin.mobile_nav.js +1 -1
  24. package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
  25. package/BookReader/plugins/plugin.resume.js +1 -1
  26. package/BookReader/plugins/plugin.resume.js.map +1 -1
  27. package/BookReader/plugins/plugin.search.js +1 -1
  28. package/BookReader/plugins/plugin.search.js.map +1 -1
  29. package/BookReader/plugins/plugin.text_selection.js +1 -1
  30. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  31. package/BookReader/plugins/plugin.tts.js +1 -1
  32. package/BookReader/plugins/plugin.tts.js.map +1 -1
  33. package/BookReader/plugins/plugin.url.js +1 -1
  34. package/BookReader/plugins/plugin.url.js.map +1 -1
  35. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  36. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  37. package/BookReader/webcomponents-bundle.js +3 -0
  38. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  39. package/BookReader/webcomponents-bundle.js.map +1 -0
  40. package/BookReaderDemo/BookReaderDemo.css +14 -1
  41. package/BookReaderDemo/IADemoBr.js +107 -0
  42. package/BookReaderDemo/demo-advanced.html +1 -1
  43. package/BookReaderDemo/demo-autoplay.html +1 -0
  44. package/BookReaderDemo/demo-embed-iframe-src.html +1 -0
  45. package/BookReaderDemo/demo-fullscreen-mobile.html +1 -0
  46. package/BookReaderDemo/demo-fullscreen.html +1 -0
  47. package/BookReaderDemo/demo-iiif.html +1 -0
  48. package/BookReaderDemo/demo-internetarchive.html +66 -18
  49. package/BookReaderDemo/demo-multiple.html +1 -0
  50. package/BookReaderDemo/demo-preview-pages.html +1 -0
  51. package/BookReaderDemo/demo-simple.html +1 -0
  52. package/BookReaderDemo/demo-vendor-fullscreen.html +1 -0
  53. package/BookReaderDemo/immersion-1up.html +1 -0
  54. package/BookReaderDemo/immersion-mode.html +1 -0
  55. package/BookReaderDemo/toggle_controls.html +1 -0
  56. package/BookReaderDemo/view_mode.html +1 -0
  57. package/BookReaderDemo/viewmode-cycle.html +1 -2
  58. package/CHANGELOG.md +114 -0
  59. package/babel.config.js +18 -0
  60. package/index.html +3 -0
  61. package/jsconfig.json +19 -0
  62. package/package.json +45 -27
  63. package/src/BookNavigator/assets/button-base.js +8 -1
  64. package/src/BookNavigator/assets/ia-logo.js +17 -0
  65. package/src/BookNavigator/assets/icon_sort_asc.js +5 -0
  66. package/src/BookNavigator/assets/icon_sort_desc.js +5 -0
  67. package/src/BookNavigator/assets/icon_sort_neutral.js +5 -0
  68. package/src/BookNavigator/assets/icon_volumes.js +11 -0
  69. package/src/BookNavigator/book-navigator.js +528 -0
  70. package/src/BookNavigator/bookmarks/bookmark-button.js +2 -1
  71. package/src/BookNavigator/bookmarks/bookmark-edit.js +2 -1
  72. package/src/BookNavigator/bookmarks/bookmarks-list.js +1 -0
  73. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +4 -9
  74. package/src/BookNavigator/bookmarks/bookmarks-provider.js +32 -11
  75. package/src/BookNavigator/bookmarks/ia-bookmarks.js +88 -43
  76. package/src/BookNavigator/downloads/downloads-provider.js +22 -16
  77. package/src/BookNavigator/downloads/downloads.js +16 -23
  78. package/src/BookNavigator/search/a-search-result.js +1 -0
  79. package/src/BookNavigator/search/search-provider.js +54 -20
  80. package/src/BookNavigator/search/search-results.js +7 -18
  81. package/src/BookNavigator/sharing.js +27 -0
  82. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +10 -12
  83. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +1 -0
  84. package/src/BookNavigator/volumes/volumes-provider.js +114 -0
  85. package/src/BookNavigator/volumes/volumes.js +189 -0
  86. package/src/BookReader/DebugConsole.js +3 -3
  87. package/src/BookReader/DragScrollable.js +233 -0
  88. package/src/BookReader/Mode1Up.js +50 -351
  89. package/src/BookReader/Mode1UpLit.js +434 -0
  90. package/src/BookReader/Mode2Up.js +94 -72
  91. package/src/BookReader/ModeSmoothZoom.js +177 -0
  92. package/src/BookReader/ModeThumb.js +16 -8
  93. package/src/BookReader/Navbar/Navbar.js +2 -31
  94. package/src/BookReader/PageContainer.js +47 -2
  95. package/src/BookReader/ReduceSet.js +1 -1
  96. package/src/BookReader/Toolbar/Toolbar.js +5 -5
  97. package/src/BookReader/options.js +10 -0
  98. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  99. package/src/BookReader/utils.js +68 -13
  100. package/src/BookReader.js +316 -232
  101. package/src/assets/icons/close-circle-dark.svg +1 -0
  102. package/src/assets/icons/voice.svg +1 -0
  103. package/src/css/BookReader.scss +0 -12
  104. package/src/css/_BRComponent.scss +1 -1
  105. package/src/css/_BRmain.scss +19 -24
  106. package/src/css/_BRnav.scss +4 -26
  107. package/src/css/_BRpages.scss +35 -0
  108. package/src/css/_BRsearch.scss +11 -215
  109. package/src/css/_TextSelection.scss +1 -17
  110. package/src/css/_controls.scss +16 -3
  111. package/src/css/_icons.scss +6 -0
  112. package/src/ia-bookreader/ia-bookreader.js +205 -0
  113. package/src/plugins/plugin.chapters.js +15 -18
  114. package/src/plugins/plugin.mobile_nav.js +11 -10
  115. package/src/plugins/plugin.resume.js +3 -3
  116. package/src/plugins/plugin.text_selection.js +17 -29
  117. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  118. package/src/plugins/search/plugin.search.js +113 -104
  119. package/src/plugins/search/view.js +48 -163
  120. package/src/plugins/tts/AbstractTTSEngine.js +7 -0
  121. package/src/plugins/tts/FestivalTTSEngine.js +2 -2
  122. package/src/plugins/tts/WebTTSEngine.js +5 -0
  123. package/src/plugins/tts/plugin.tts.js +67 -102
  124. package/src/plugins/url/UrlPlugin.js +184 -0
  125. package/src/plugins/url/plugin.url.js +220 -0
  126. package/{src → stat}/BookNavigator/BookModel.js +0 -0
  127. package/{src → stat}/BookNavigator/BookNavigator.js +151 -104
  128. package/stat/BookNavigator/assets/bookmark-colors.js +15 -0
  129. package/stat/BookNavigator/assets/button-base.js +61 -0
  130. package/stat/BookNavigator/assets/ia-logo.js +17 -0
  131. package/stat/BookNavigator/assets/icon_checkmark.js +6 -0
  132. package/stat/BookNavigator/assets/icon_close.js +3 -0
  133. package/stat/BookNavigator/assets/icon_sort_asc.js +5 -0
  134. package/stat/BookNavigator/assets/icon_sort_desc.js +5 -0
  135. package/stat/BookNavigator/assets/icon_sort_neutral.js +5 -0
  136. package/stat/BookNavigator/assets/icon_volumes.js +11 -0
  137. package/stat/BookNavigator/bookmarks/bookmark-button.js +64 -0
  138. package/stat/BookNavigator/bookmarks/bookmark-edit.js +215 -0
  139. package/stat/BookNavigator/bookmarks/bookmarks-list.js +285 -0
  140. package/stat/BookNavigator/bookmarks/bookmarks-loginCTA.js +28 -0
  141. package/stat/BookNavigator/bookmarks/bookmarks-provider.js +56 -0
  142. package/stat/BookNavigator/bookmarks/ia-bookmarks.js +523 -0
  143. package/{src → stat}/BookNavigator/br-fullscreen-mgr.js +1 -2
  144. package/stat/BookNavigator/delete-modal-actions.js +49 -0
  145. package/stat/BookNavigator/downloads/downloads-provider.js +72 -0
  146. package/stat/BookNavigator/downloads/downloads.js +139 -0
  147. package/stat/BookNavigator/provider-config.js +0 -0
  148. package/stat/BookNavigator/search/a-search-result.js +55 -0
  149. package/stat/BookNavigator/search/search-provider.js +180 -0
  150. package/stat/BookNavigator/search/search-results.js +360 -0
  151. package/stat/BookNavigator/sharing.js +31 -0
  152. package/stat/BookNavigator/visual-adjustments/visual-adjustments-provider.js +94 -0
  153. package/stat/BookNavigator/visual-adjustments/visual-adjustments.js +280 -0
  154. package/stat/BookNavigator/volumes/volumes-provider.js +83 -0
  155. package/stat/BookNavigator/volumes/volumes.js +178 -0
  156. package/stat/BookReader/BookModel.js +518 -0
  157. package/stat/BookReader/DebugConsole.js +54 -0
  158. package/stat/BookReader/DragScrollable.js +233 -0
  159. package/stat/BookReader/ImageCache.js +116 -0
  160. package/stat/BookReader/Mode1Up.js +102 -0
  161. package/stat/BookReader/Mode1UpLit.js +434 -0
  162. package/stat/BookReader/Mode2Up.js +1372 -0
  163. package/stat/BookReader/ModeSmoothZoom.js +177 -0
  164. package/stat/BookReader/ModeThumb.js +344 -0
  165. package/stat/BookReader/Navbar/Navbar.js +310 -0
  166. package/stat/BookReader/PageContainer.js +120 -0
  167. package/stat/BookReader/ReduceSet.js +26 -0
  168. package/stat/BookReader/Toolbar/Toolbar.js +384 -0
  169. package/stat/BookReader/events.js +20 -0
  170. package/stat/BookReader/options.js +324 -0
  171. package/stat/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  172. package/stat/BookReader/utils/classes.js +36 -0
  173. package/stat/BookReader/utils.js +240 -0
  174. package/stat/BookReader.js +2550 -0
  175. package/{src → stat}/BookReaderComponent/BookReaderComponent.js +16 -11
  176. package/stat/assets/icons/1up.svg +12 -0
  177. package/stat/assets/icons/2up.svg +15 -0
  178. package/stat/assets/icons/advance.svg +26 -0
  179. package/stat/assets/icons/chevron-right.svg +1 -0
  180. package/stat/assets/icons/close-circle-dark.svg +1 -0
  181. package/stat/assets/icons/close-circle.svg +1 -0
  182. package/stat/assets/icons/fullscreen.svg +17 -0
  183. package/stat/assets/icons/fullscreen_exit.svg +17 -0
  184. package/stat/assets/icons/hamburger.svg +15 -0
  185. package/stat/assets/icons/left-arrow.svg +12 -0
  186. package/stat/assets/icons/magnify-minus.svg +16 -0
  187. package/stat/assets/icons/magnify-plus.svg +17 -0
  188. package/stat/assets/icons/magnify.svg +15 -0
  189. package/stat/assets/icons/pause.svg +23 -0
  190. package/stat/assets/icons/play.svg +22 -0
  191. package/stat/assets/icons/playback-speed.svg +34 -0
  192. package/stat/assets/icons/read-aloud.svg +22 -0
  193. package/stat/assets/icons/review.svg +22 -0
  194. package/stat/assets/icons/thumbnails.svg +17 -0
  195. package/stat/assets/icons/voice.svg +1 -0
  196. package/stat/assets/icons/volume-full.svg +22 -0
  197. package/stat/assets/images/BRicons.png +0 -0
  198. package/stat/assets/images/BRicons.svg +94 -0
  199. package/stat/assets/images/BRicons_ia.png +0 -0
  200. package/stat/assets/images/back_pages.png +0 -0
  201. package/stat/assets/images/book_bottom_icon.png +0 -0
  202. package/stat/assets/images/book_down_icon.png +0 -0
  203. package/stat/assets/images/book_left_icon.png +0 -0
  204. package/stat/assets/images/book_leftmost_icon.png +0 -0
  205. package/stat/assets/images/book_right_icon.png +0 -0
  206. package/stat/assets/images/book_rightmost_icon.png +0 -0
  207. package/stat/assets/images/book_top_icon.png +0 -0
  208. package/stat/assets/images/book_up_icon.png +0 -0
  209. package/stat/assets/images/books_graphic.svg +177 -0
  210. package/stat/assets/images/booksplit.png +0 -0
  211. package/stat/assets/images/control_pause_icon.png +0 -0
  212. package/stat/assets/images/control_play_icon.png +0 -0
  213. package/stat/assets/images/embed_icon.png +0 -0
  214. package/stat/assets/images/icon-home-ia.png +0 -0
  215. package/stat/assets/images/icon_OL-logo-xs.png +0 -0
  216. package/stat/assets/images/icon_alert-xs.png +0 -0
  217. package/stat/assets/images/icon_book.svg +12 -0
  218. package/stat/assets/images/icon_bookmark.svg +12 -0
  219. package/stat/assets/images/icon_close-pop.png +0 -0
  220. package/stat/assets/images/icon_download.png +0 -0
  221. package/stat/assets/images/icon_gear.svg +14 -0
  222. package/stat/assets/images/icon_hamburger.svg +20 -0
  223. package/stat/assets/images/icon_home.png +0 -0
  224. package/stat/assets/images/icon_home.svg +21 -0
  225. package/stat/assets/images/icon_home_ia.png +0 -0
  226. package/stat/assets/images/icon_indicator.png +0 -0
  227. package/stat/assets/images/icon_info.svg +11 -0
  228. package/stat/assets/images/icon_one_page.svg +8 -0
  229. package/stat/assets/images/icon_pause.svg +1 -0
  230. package/stat/assets/images/icon_play.svg +1 -0
  231. package/stat/assets/images/icon_playback-rate.svg +15 -0
  232. package/stat/assets/images/icon_return.png +0 -0
  233. package/stat/assets/images/icon_search_button.svg +8 -0
  234. package/stat/assets/images/icon_share.svg +9 -0
  235. package/stat/assets/images/icon_skip-ahead.svg +6 -0
  236. package/stat/assets/images/icon_skip-back.svg +13 -0
  237. package/stat/assets/images/icon_speaker.svg +18 -0
  238. package/stat/assets/images/icon_speaker_open.svg +10 -0
  239. package/stat/assets/images/icon_thumbnails.svg +12 -0
  240. package/stat/assets/images/icon_toc.svg +5 -0
  241. package/stat/assets/images/icon_two_pages.svg +9 -0
  242. package/stat/assets/images/icon_zoomer.png +0 -0
  243. package/stat/assets/images/loading.gif +0 -0
  244. package/stat/assets/images/logo_icon.png +0 -0
  245. package/stat/assets/images/marker_chap-off.png +0 -0
  246. package/stat/assets/images/marker_chap-off.svg +11 -0
  247. package/stat/assets/images/marker_chap-off_ia.png +0 -0
  248. package/stat/assets/images/marker_chap-on.png +0 -0
  249. package/stat/assets/images/marker_chap-on.svg +11 -0
  250. package/stat/assets/images/marker_srch-on.svg +11 -0
  251. package/stat/assets/images/marker_srchchap-off.png +0 -0
  252. package/stat/assets/images/marker_srchchap-on.png +0 -0
  253. package/stat/assets/images/nav_control-dn.png +0 -0
  254. package/stat/assets/images/nav_control-dn_ia.png +0 -0
  255. package/stat/assets/images/nav_control-up.png +0 -0
  256. package/stat/assets/images/nav_control-up_ia.png +0 -0
  257. package/stat/assets/images/nav_control.png +0 -0
  258. package/stat/assets/images/one_page_mode_icon.png +0 -0
  259. package/stat/assets/images/paper-badge.png +0 -0
  260. package/stat/assets/images/print_icon.png +0 -0
  261. package/stat/assets/images/progressbar.gif +0 -0
  262. package/stat/assets/images/right_edges.png +0 -0
  263. package/stat/assets/images/slider.png +0 -0
  264. package/stat/assets/images/slider_ia.png +0 -0
  265. package/stat/assets/images/thumbnail_mode_icon.png +0 -0
  266. package/stat/assets/images/transparent.png +0 -0
  267. package/stat/assets/images/two_page_mode_icon.png +0 -0
  268. package/stat/assets/images/zoom_in_icon.png +0 -0
  269. package/stat/assets/images/zoom_out_icon.png +0 -0
  270. package/stat/css/BookReader.scss +89 -0
  271. package/stat/css/_BRBookmarks.scss +29 -0
  272. package/stat/css/_BRComponent.scss +13 -0
  273. package/stat/css/_BRfloat.scss +197 -0
  274. package/stat/css/_BRicon.scss +48 -0
  275. package/stat/css/_BRmain.scss +251 -0
  276. package/stat/css/_BRnav.scss +359 -0
  277. package/stat/css/_BRpages.scss +139 -0
  278. package/stat/css/_BRsearch.scss +226 -0
  279. package/stat/css/_BRtoolbar.scss +84 -0
  280. package/stat/css/_BRvendor.scss +5 -0
  281. package/stat/css/_MobileNav.scss +194 -0
  282. package/stat/css/_TextSelection.scss +32 -0
  283. package/stat/css/_colorbox.scss +52 -0
  284. package/stat/css/_controls.scss +253 -0
  285. package/stat/css/_icons.scss +121 -0
  286. package/stat/jquery-wrapper.js +4 -0
  287. package/stat/plugins/plugin.archive_analytics.js +86 -0
  288. package/stat/plugins/plugin.autoplay.js +129 -0
  289. package/stat/plugins/plugin.chapters.js +248 -0
  290. package/stat/plugins/plugin.iframe.js +48 -0
  291. package/stat/plugins/plugin.mobile_nav.js +288 -0
  292. package/stat/plugins/plugin.resume.js +68 -0
  293. package/stat/plugins/plugin.text_selection.js +291 -0
  294. package/{src → stat}/plugins/plugin.url.js +4 -4
  295. package/stat/plugins/plugin.vendor-fullscreen.js +247 -0
  296. package/stat/plugins/search/plugin.search.js +439 -0
  297. package/stat/plugins/search/view.js +439 -0
  298. package/stat/plugins/tts/AbstractTTSEngine.js +249 -0
  299. package/stat/plugins/tts/FestivalTTSEngine.js +169 -0
  300. package/stat/plugins/tts/PageChunk.js +107 -0
  301. package/stat/plugins/tts/PageChunkIterator.js +163 -0
  302. package/stat/plugins/tts/WebTTSEngine.js +357 -0
  303. package/stat/plugins/tts/plugin.tts.js +357 -0
  304. package/stat/plugins/tts/tooltip_dict.js +15 -0
  305. package/stat/plugins/tts/utils.js +91 -0
  306. package/stat/util/browserSniffing.js +30 -0
  307. package/stat/util/debouncer.js +26 -0
  308. package/stat/util/docCookies.js +67 -0
  309. package/stat/util/strings.js +34 -0
  310. package/tests/e2e/README.md +37 -0
  311. package/tests/e2e/autoplay.test.js +2 -2
  312. package/tests/e2e/base.test.js +5 -7
  313. package/tests/e2e/helpers/base.js +8 -3
  314. package/tests/e2e/helpers/debug.js +1 -1
  315. package/tests/e2e/helpers/desktopSearch.js +1 -1
  316. package/tests/e2e/helpers/mobileSearch.js +3 -3
  317. package/tests/e2e/helpers/params.js +17 -0
  318. package/tests/e2e/rightToLeft.test.js +4 -5
  319. package/tests/e2e/viewmode.test.js +30 -31
  320. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +3 -3
  321. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +176 -0
  322. package/tests/{BookReader → jest/BookReader}/DebugConsole.test.js +1 -1
  323. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  324. package/tests/jest/BookReader/Mode1UpLit.test.js +87 -0
  325. package/tests/{BookReader → jest/BookReader}/Mode2Up.test.js +5 -7
  326. package/tests/jest/BookReader/ModeSmoothZoom.test.js +149 -0
  327. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  328. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +7 -7
  329. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +74 -2
  330. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  331. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  332. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  333. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  334. package/tests/jest/BookReader/utils.test.js +136 -0
  335. package/tests/jest/BookReader.keyboard.test.js +190 -0
  336. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  337. package/tests/{BookReader.test.js → jest/BookReader.test.js} +20 -4
  338. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  339. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +2 -2
  340. package/tests/{plugins → jest/plugins}/plugin.chapters.test.js +8 -8
  341. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  342. package/tests/{plugins → jest/plugins}/plugin.mobile_nav.test.js +5 -5
  343. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  344. package/tests/{plugins → jest/plugins}/plugin.text_selection.test.js +14 -24
  345. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  346. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +12 -5
  347. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +6 -6
  348. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +3 -3
  349. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  350. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  351. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  352. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +1 -1
  353. package/tests/{plugins → jest/plugins}/tts/utils.test.js +3 -3
  354. package/tests/jest/plugins/url/UrlPlugin.test.js +175 -0
  355. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +33 -14
  356. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  357. package/tests/{util → jest/util}/docCookies.test.js +1 -1
  358. package/tests/{util → jest/util}/strings.test.js +1 -1
  359. package/tests/{utils.js → jest/utils.js} +38 -0
  360. package/tests/karma/BookNavigator/book-navigator.test.js +485 -0
  361. package/tests/karma/BookNavigator/bookmarks/bookmark-button.test.js +44 -0
  362. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +1 -3
  363. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +1 -2
  364. package/tests/karma/BookNavigator/downloads/downloads-provider.test.js +67 -0
  365. package/tests/karma/BookNavigator/downloads/downloads.test.js +54 -0
  366. package/tests/karma/BookNavigator/search/search-provider.test.js +123 -0
  367. package/tests/karma/BookNavigator/{search-results.test.js → search/search-results.test.js} +1 -4
  368. package/tests/karma/BookNavigator/sharing/sharing-provider.test.js +49 -0
  369. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -2
  370. package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +184 -0
  371. package/tests/karma/BookNavigator/volumes/volumes.test.js +98 -0
  372. package/webpack.config.js +10 -4
  373. package/.babelrc +0 -12
  374. package/.dependabot/config.yml +0 -6
  375. package/.testcaferc.json +0 -5
  376. package/BookReader/bookreader-component-bundle.js +0 -1450
  377. package/BookReader/bookreader-component-bundle.js.map +0 -1
  378. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  379. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  380. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  381. package/src/BookNavigator/assets/book-loader.js +0 -27
  382. package/src/ItemNavigator/ItemNavigator.js +0 -372
  383. package/src/ItemNavigator/providers/sharing.js +0 -29
  384. package/src/dragscrollable-br.js +0 -261
  385. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  386. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  387. package/tests/BookReader/Mode1Up.test.js +0 -164
  388. package/tests/BookReader/utils.test.js +0 -109
  389. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
@@ -2,10 +2,9 @@ import { runBaseTests } from './helpers/base';
2
2
  import BookReader from './models/BookReader';
3
3
  import { runDesktopSearchTests } from './helpers/desktopSearch';
4
4
  // import { runMobileSearchTests } from './helpers/mobileSearch';
5
+ import params from './helpers/params';
5
6
 
6
-
7
- const { BASE_URL } = process.env;
8
- const OCAIDS = [
7
+ const ocaids = params.ocaids || [
9
8
  'theworksofplato01platiala',
10
9
  // Removed because failing test 'Canonical URL with cookie shows paramters'
11
10
  // in tests/e2e/helpers/base.js
@@ -15,16 +14,15 @@ const OCAIDS = [
15
14
  // /BookReaderDemo/demo-ia-olivertwist.html/page/n13/mode/2up
16
15
  // 'demo-ia-olivertwist.html',
17
16
  ];
18
- const DEMO_PATH = 'demo-internetarchive.html?ocaid='
19
17
 
20
- OCAIDS.forEach(ocaid => {
21
- const url = `${BASE_URL}${DEMO_PATH }${ocaid}`;
18
+ ocaids.forEach(ocaid => {
19
+ const url = params.getArchiveUrl(ocaid);
22
20
 
23
21
  fixture `Base Tests for: ${ocaid}`.page `${url}`;
24
22
  runBaseTests(new BookReader());
25
23
 
26
24
  fixture `Desktop Search Tests for: ${ocaid}`
27
- .page `${url}`
25
+ .page `${url}`;
28
26
  runDesktopSearchTests(new BookReader());
29
27
 
30
28
  // fixture `Mobile Search Tests for: ${ocaid}`
@@ -96,7 +96,7 @@ export function runBaseTests (br) {
96
96
 
97
97
  if (await usesResume()) {
98
98
  await t.expect(isPageInUrl()).eql(true, initialUrl);
99
- await t.expect(isModeInUrl('2up')).eql(true, initialUrl)
99
+ await t.expect(isModeInUrl('2up')).eql(true, initialUrl);
100
100
  } else {
101
101
  // No plugin, no br-resume cookie
102
102
  await t.expect(getUrl()).notContains('#page/');
@@ -138,7 +138,7 @@ export function runBaseTests (br) {
138
138
 
139
139
  // we aren't showing the same image in the new pages
140
140
  await t.expect(prevImg1Src).notEql(prevImg2Src);
141
- })
141
+ });
142
142
 
143
143
  test('2up mode - Clicking `Next page` changes the page', async t => {
144
144
  // Note: this will fail on a R to L book if at front cover
@@ -168,7 +168,7 @@ export function runBaseTests (br) {
168
168
 
169
169
  // we aren't showing the same image in the new pages
170
170
  await t.expect(nextImg1Src).notEql(nextImg2Src);
171
- })
171
+ });
172
172
 
173
173
  test('Clicking `page flip buttons` updates location', async t => {
174
174
  const { nav } = br;
@@ -191,6 +191,11 @@ export function runBaseTests (br) {
191
191
  test('Clicking `1 page view` brings up 1 at a time', async t => {
192
192
  const { nav } = br;
193
193
  await t.click(nav.desktop.mode1Up);
194
+
195
+ // Flip away from cover
196
+ await t.click(nav.desktop.goNext);
197
+ await t.wait(PAGE_FLIP_WAIT_TIME);
198
+
194
199
  // we usually pre-fetch the page in question & the 2 after it
195
200
  await t.expect(Selector('.BRpagecontainer').count).gte(3);
196
201
  });
@@ -10,4 +10,4 @@
10
10
  */
11
11
  export default async (t) => {
12
12
  await t.debug().setNativeDialogHandler(() => true);
13
- }
13
+ };
@@ -43,7 +43,7 @@ export function runDesktopSearchTests(br) {
43
43
  await t.expect(getPageUrl()).contains(PAGE_FIRST_RESULT);
44
44
 
45
45
  //checks highlight on result page is visible
46
- const highlight = br.shell.find(".BookReaderSearchHilite");
46
+ const highlight = br.shell.find(".searchHiliteLayer rect");
47
47
  await t.expect(highlight.visible).ok();
48
48
 
49
49
  });
@@ -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(',') ?? [];
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;
@@ -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.baseUrl}/BookReaderDemo/demo-internetarchive.html?ocaid=${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,36 @@
1
- import { Selector } from 'testcafe';
2
- import BookReader from './models/BookReader';
1
+ // import { Selector } from 'testcafe';
2
+ // import BookReader from './models/BookReader';
3
+ // import params from './helpers/params';
3
4
 
4
- const { BASE_URL } = process.env;
5
+ // fixture `Viewmode carousel`.page `${params.baseUrl}/BookReaderDemo/viewmode-cycle.html`;
5
6
 
6
- fixture `Viewmode carousel`.page `${BASE_URL}viewmode-cycle.html`;
7
+ // test('Clicking `view mode` cycles through view modes', async t => {
8
+ // const { nav } = (new BookReader());
7
9
 
8
- test('Clicking `view mode` cycles through view modes', async t => {
9
- const { nav } = (new BookReader());
10
+ // // viewmode button only appear on mobile devices
11
+ // await t.resizeWindow(400, 800);
12
+ // // Flip forward one
13
+ // await t.pressKey('right');
10
14
 
11
- // viewmode button only appear on mobile devices
12
- await t.resizeWindow(400, 800);
13
- // Flip forward one
14
- await t.pressKey('right');
15
+ // // 2up to thumb
16
+ // await t.click(nav.desktop.viewmode);
17
+ // const thumbnailContainer = Selector('.BRmodeThumb');
18
+ // await t.expect(thumbnailContainer.visible).ok();
19
+ // const thumbImages = thumbnailContainer.find('.BRpageview img');
20
+ // await t.expect(thumbImages.count).gt(0);
15
21
 
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
+ // // thumb to 1up
23
+ // await t.click(nav.desktop.viewmode);
24
+ // const onePageViewContainer = Selector('br-mode-1up');
25
+ // await t.expect(onePageViewContainer.visible).ok();
26
+ // const onePageImages = onePageViewContainer.find('.BRmode1up .BRpagecontainer');
27
+ // // we usually pre-fetch the page in question & 1 before/after it
28
+ // await t.expect(onePageImages.count).gte(3);
22
29
 
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);
37
- });
30
+ // // 1up to 2up
31
+ // await t.click(nav.desktop.viewmode);
32
+ // const twoPageContainer = Selector('.BRtwopageview');
33
+ // await t.expect(twoPageContainer.visible).ok();
34
+ // const twoPageImages = twoPageContainer.find('img.BRpageimage');
35
+ // await t.expect(twoPageImages.count).gte(2);
36
+ // });
@@ -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,87 @@
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
+ await mode.requestUpdate();
39
+ expect(mode.pageTops).toEqual({});
40
+ });
41
+
42
+ test('Iterates all pages', async () => {
43
+ const br = make_dummy_br({ data: SAMPLE_DATA });
44
+ const book = new BookModel(br);
45
+ const mode = new Mode1UpLit(book, br);
46
+ document.body.appendChild(mode);
47
+ await mode.requestUpdate();
48
+ expect(Object.values(mode.pageTops)).toHaveLength(6);
49
+ });
50
+
51
+ test('Computes tops', async () => {
52
+ const br = make_dummy_br({ data: SAMPLE_DATA });
53
+ const book = new BookModel(br);
54
+ const mode = new Mode1UpLit(book, br);
55
+ document.body.appendChild(mode);
56
+ await mode.requestUpdate();
57
+ const tops = Object.entries(mode.pageTops);
58
+ expect(tops.map(([index, top]) => [index, top.toFixed(1)])).toEqual([
59
+ // Recall these are in inches
60
+ ['0', '0.2'],
61
+ ['1', '0.6'],
62
+ ['2', '1.1'],
63
+ ['3', '1.5'],
64
+ ['4', '2.0'],
65
+ ['5', '2.4'],
66
+ ]);
67
+ });
68
+ });
69
+
70
+ describe('worldUnitsToRenderedPixels', () => {
71
+ test('0 case', () => {
72
+ const mode = new Mode1UpLit(null, null);
73
+ expect(mode.worldUnitsToRenderedPixels(0)).toBe(0);
74
+ });
75
+ test('Misc cases', () => {
76
+ const mode = new Mode1UpLit(null, null);
77
+ mode.screenDPI = 100;
78
+ mode.realWorldReduce = 1;
79
+ expect(mode.worldUnitsToRenderedPixels(1)).toBe(100);
80
+ mode.screenDPI = 100;
81
+ mode.realWorldReduce = 2;
82
+ expect(mode.worldUnitsToRenderedPixels(1)).toBe(50);
83
+ mode.screenDPI = 78;
84
+ mode.realWorldReduce = 1;
85
+ expect(mode.worldUnitsToRenderedPixels(1)).toBe(78);
86
+ });
87
+ });
@@ -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);