@internetarchive/bookreader 5.0.0-11 → 5.0.0-110

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 (380) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +604 -1239
  4. package/BookReader/BookReader.js +1 -1
  5. package/BookReader/BookReader.js.LICENSE.txt +20 -20
  6. package/BookReader/BookReader.js.map +1 -1
  7. package/BookReader/bergamot-translator-worker.js +2966 -0
  8. package/BookReader/bergamot-translator-worker.wasm +0 -0
  9. package/BookReader/hypothesis/LICENSE +50 -0
  10. package/BookReader/hypothesis/README.md +55 -0
  11. package/BookReader/hypothesis/build/boot.js +1 -0
  12. package/BookReader/hypothesis/build/manifest.json +20 -0
  13. package/BookReader/hypothesis/build/scripts/annotator.bundle.js +184 -0
  14. package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
  15. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +798 -0
  16. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
  17. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +711 -0
  18. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
  19. package/BookReader/hypothesis/build/styles/annotator.css +2235 -0
  20. package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
  21. package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  22. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  23. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  24. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  25. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  26. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
  27. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  28. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
  29. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
  30. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  31. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
  32. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  33. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  34. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  35. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
  36. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  37. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  38. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  39. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  40. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  41. package/BookReader/hypothesis/build/styles/highlights.css +2 -0
  42. package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
  43. package/BookReader/hypothesis/build/styles/katex.min.css +2 -0
  44. package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
  45. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +2 -0
  46. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
  47. package/BookReader/hypothesis/build/styles/sidebar.css +2731 -0
  48. package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
  49. package/BookReader/hypothesis/build/styles/ui-playground.css +2659 -0
  50. package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
  51. package/BookReader/hypothesis/package.json +126 -0
  52. package/BookReader/ia-bookreader-bundle.js +1907 -0
  53. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +19 -0
  54. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  55. package/BookReader/icons/1up.svg +1 -1
  56. package/BookReader/icons/2up.svg +1 -1
  57. package/BookReader/icons/advance.svg +1 -1
  58. package/BookReader/icons/chevron-right.svg +1 -1
  59. package/BookReader/icons/close-circle-dark.svg +1 -1
  60. package/BookReader/icons/close-circle.svg +1 -1
  61. package/BookReader/icons/fullscreen.svg +1 -1
  62. package/BookReader/icons/fullscreen_exit.svg +1 -1
  63. package/BookReader/icons/hamburger.svg +1 -1
  64. package/BookReader/icons/left-arrow.svg +1 -1
  65. package/BookReader/icons/magnify-minus.svg +1 -1
  66. package/BookReader/icons/magnify-plus.svg +1 -1
  67. package/BookReader/icons/magnify.svg +1 -1
  68. package/BookReader/icons/pause.svg +1 -1
  69. package/BookReader/icons/play.svg +1 -1
  70. package/BookReader/icons/playback-speed.svg +1 -1
  71. package/BookReader/icons/read-aloud.svg +1 -1
  72. package/BookReader/icons/review.svg +1 -1
  73. package/BookReader/icons/slider-toggle.svg +1 -0
  74. package/BookReader/icons/thumbnails.svg +1 -1
  75. package/BookReader/icons/voice.svg +1 -0
  76. package/BookReader/icons/volume-full.svg +1 -1
  77. package/BookReader/images/BRicons.svg +3 -3
  78. package/BookReader/images/books_graphic.svg +1 -1
  79. package/BookReader/images/hypothesis.ico +0 -0
  80. package/BookReader/images/icon_book.svg +1 -1
  81. package/BookReader/images/icon_bookmark.svg +1 -1
  82. package/BookReader/images/icon_experiment.svg +1 -0
  83. package/BookReader/images/icon_gear.svg +1 -1
  84. package/BookReader/images/icon_hamburger.svg +1 -1
  85. package/BookReader/images/icon_home.svg +1 -1
  86. package/BookReader/images/icon_info.svg +1 -1
  87. package/BookReader/images/icon_one_page.svg +1 -1
  88. package/BookReader/images/icon_pause.svg +1 -1
  89. package/BookReader/images/icon_play.svg +1 -1
  90. package/BookReader/images/icon_playback-rate.svg +1 -1
  91. package/BookReader/images/icon_search_button.svg +1 -1
  92. package/BookReader/images/icon_share.svg +1 -1
  93. package/BookReader/images/icon_skip-ahead.svg +1 -1
  94. package/BookReader/images/icon_skip-back.svg +1 -1
  95. package/BookReader/images/icon_speaker.svg +1 -1
  96. package/BookReader/images/icon_speaker_open.svg +1 -1
  97. package/BookReader/images/icon_thumbnails.svg +1 -1
  98. package/BookReader/images/icon_toc.svg +1 -1
  99. package/BookReader/images/icon_two_pages.svg +1 -1
  100. package/BookReader/images/marker_chap-off.svg +1 -1
  101. package/BookReader/images/marker_chap-on.svg +1 -1
  102. package/BookReader/images/marker_srch-on.svg +1 -1
  103. package/BookReader/images/translate.svg +1 -0
  104. package/BookReader/images/unviewable_page.png +0 -0
  105. package/BookReader/jquery-3.js +2 -0
  106. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  107. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  108. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  109. package/BookReader/plugins/plugin.autoplay.js +1 -1
  110. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  111. package/BookReader/plugins/plugin.chapters.js +22 -1
  112. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  113. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  114. package/BookReader/plugins/plugin.experiments.js +3 -0
  115. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  116. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  117. package/BookReader/plugins/plugin.iframe.js +1 -1
  118. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  119. package/BookReader/plugins/plugin.iiif.js +2 -0
  120. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  121. package/BookReader/plugins/plugin.resume.js +1 -1
  122. package/BookReader/plugins/plugin.resume.js.map +1 -1
  123. package/BookReader/plugins/plugin.search.js +2 -1
  124. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  125. package/BookReader/plugins/plugin.search.js.map +1 -1
  126. package/BookReader/plugins/plugin.text_selection.js +2 -1
  127. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  128. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  129. package/BookReader/plugins/plugin.translate.js +137 -0
  130. package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
  131. package/BookReader/plugins/plugin.translate.js.map +1 -0
  132. package/BookReader/plugins/plugin.tts.js +1 -1
  133. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  134. package/BookReader/plugins/plugin.tts.js.map +1 -1
  135. package/BookReader/plugins/plugin.url.js +1 -1
  136. package/BookReader/plugins/plugin.url.js.map +1 -1
  137. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  138. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  139. package/BookReader/plugins/translator-worker.js +2 -0
  140. package/BookReader/plugins/translator-worker.js.map +1 -0
  141. package/BookReader/silence.mp3 +0 -0
  142. package/BookReader/translator-worker.js +475 -0
  143. package/BookReader/webcomponents-bundle.js +3 -0
  144. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  145. package/BookReader/webcomponents-bundle.js.map +1 -0
  146. package/README.md +14 -3
  147. package/jsconfig.json +19 -0
  148. package/package.json +92 -70
  149. package/src/BookReader/BookModel.js +92 -46
  150. package/src/BookReader/DragScrollable.js +233 -0
  151. package/src/BookReader/ImageCache.js +49 -16
  152. package/src/BookReader/Mode1Up.js +66 -365
  153. package/src/BookReader/Mode1UpLit.js +392 -0
  154. package/src/BookReader/Mode2Up.js +87 -1315
  155. package/src/BookReader/Mode2UpLit.js +788 -0
  156. package/src/BookReader/ModeAbstract.js +43 -0
  157. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  158. package/src/BookReader/ModeSmoothZoom.js +312 -0
  159. package/src/BookReader/ModeThumb.js +29 -15
  160. package/src/BookReader/Navbar/Navbar.js +201 -76
  161. package/src/BookReader/PageContainer.js +120 -23
  162. package/src/BookReader/ReduceSet.js +2 -2
  163. package/src/BookReader/Toolbar/Toolbar.js +18 -40
  164. package/src/BookReader/events.js +3 -3
  165. package/src/BookReader/options.js +94 -17
  166. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  167. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  168. package/src/BookReader/utils/SelectionObserver.js +45 -0
  169. package/src/BookReader/utils/classes.js +1 -1
  170. package/src/BookReader/utils.js +136 -12
  171. package/src/BookReader.js +678 -1226
  172. package/src/BookReaderPlugin.js +52 -0
  173. package/src/assets/icons/magnify-minus.svg +3 -7
  174. package/src/assets/icons/magnify-plus.svg +3 -7
  175. package/src/assets/icons/slider-toggle.svg +1 -0
  176. package/src/assets/icons/voice.svg +1 -0
  177. package/src/assets/images/hypothesis.ico +0 -0
  178. package/src/assets/images/icon_experiment.svg +1 -0
  179. package/src/assets/images/translate.svg +1 -0
  180. package/src/assets/images/unviewable_page.png +0 -0
  181. package/src/assets/silence.mp3 +0 -0
  182. package/src/css/BookReader.scss +1 -5
  183. package/src/css/_BRBookmarks.scss +1 -1
  184. package/src/css/_BRComponent.scss +1 -1
  185. package/src/css/_BRicon.scss +8 -2
  186. package/src/css/_BRmain.scss +16 -3
  187. package/src/css/_BRnav.scss +74 -70
  188. package/src/css/_BRpages.scss +171 -42
  189. package/src/css/_BRsearch.scss +69 -30
  190. package/src/css/_BRtoolbar.scss +5 -5
  191. package/src/css/_TextSelection.scss +129 -24
  192. package/src/css/_colorbox.scss +2 -2
  193. package/src/css/_controls.scss +24 -7
  194. package/src/css/_icons.scss +8 -1
  195. package/src/{BookNavigator/assets → css}/button-base.js +2 -2
  196. package/src/css/icon_checkmark.js +9 -0
  197. package/src/css/sharedStyles.js +15 -0
  198. package/src/ia-bookreader/downloads/downloads-provider.js +81 -0
  199. package/src/{BookNavigator → ia-bookreader}/downloads/downloads.js +25 -5
  200. package/src/ia-bookreader/ia-bookreader.js +666 -0
  201. package/src/ia-bookreader/sharing.js +27 -0
  202. package/src/ia-bookreader/viewable-files.js +98 -0
  203. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments-provider.js +17 -17
  204. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments.js +75 -67
  205. package/src/{BookNavigator → plugins}/bookmarks/bookmark-button.js +4 -3
  206. package/src/{BookNavigator/assets → plugins/bookmarks}/bookmark-colors.js +1 -1
  207. package/src/{BookNavigator → plugins}/bookmarks/bookmark-edit.js +43 -31
  208. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-list.js +48 -49
  209. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-loginCTA.js +3 -3
  210. package/src/plugins/bookmarks/bookmarks-provider.js +63 -0
  211. package/src/{BookNavigator → plugins/bookmarks}/delete-modal-actions.js +1 -1
  212. package/src/{BookNavigator → plugins}/bookmarks/ia-bookmarks.js +117 -68
  213. package/src/plugins/plugin.archive_analytics.js +84 -78
  214. package/src/plugins/plugin.autoplay.js +99 -104
  215. package/src/plugins/plugin.chapters.js +314 -205
  216. package/src/plugins/plugin.experiments.js +321 -0
  217. package/src/plugins/plugin.iframe.js +1 -1
  218. package/src/plugins/plugin.iiif.js +141 -0
  219. package/src/plugins/plugin.resume.js +54 -51
  220. package/src/plugins/plugin.text_selection.js +522 -219
  221. package/src/plugins/plugin.vendor-fullscreen.js +5 -5
  222. package/src/plugins/search/plugin.search.js +374 -392
  223. package/src/{BookNavigator → plugins}/search/search-provider.js +59 -27
  224. package/src/{BookNavigator → plugins}/search/search-results.js +105 -76
  225. package/src/plugins/search/utils.js +50 -0
  226. package/src/plugins/search/view.js +50 -68
  227. package/src/plugins/translate/TranslationManager.js +164 -0
  228. package/src/plugins/translate/plugin.translate.js +512 -0
  229. package/src/plugins/tts/AbstractTTSEngine.js +78 -49
  230. package/src/plugins/tts/FestivalTTSEngine.js +20 -30
  231. package/src/plugins/tts/PageChunk.js +33 -21
  232. package/src/plugins/tts/PageChunkIterator.js +11 -17
  233. package/src/plugins/tts/WebTTSEngine.js +131 -91
  234. package/src/plugins/tts/plugin.tts.js +345 -350
  235. package/src/plugins/tts/utils.js +77 -49
  236. package/src/plugins/url/UrlPlugin.js +191 -0
  237. package/src/plugins/{plugin.url.js → url/plugin.url.js} +44 -15
  238. package/src/util/TextSelectionManager.js +282 -0
  239. package/src/util/browserSniffing.js +33 -1
  240. package/src/util/cache.js +20 -0
  241. package/src/util/docCookies.js +21 -2
  242. package/src/util/lit.js +15 -0
  243. package/src/util/strings.js +1 -0
  244. package/.babelrc +0 -12
  245. package/.dependabot/config.yml +0 -6
  246. package/.eslintrc.js +0 -50
  247. package/.gitattributes +0 -2
  248. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  249. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  250. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  251. package/.github/workflows/node.js.yml +0 -37
  252. package/.github/workflows/npm-publish.yml +0 -47
  253. package/.testcaferc.json +0 -5
  254. package/BookReader/bookreader-component-bundle.js +0 -1450
  255. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  256. package/BookReader/bookreader-component-bundle.js.map +0 -1
  257. package/BookReader/jquery-1.10.1.js +0 -2
  258. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  259. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  260. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  261. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  262. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  263. package/BookReaderDemo/BookReaderDemo.css +0 -41
  264. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
  265. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  266. package/BookReaderDemo/BookReaderJSSimple.js +0 -55
  267. package/BookReaderDemo/IIIFBookReader.js +0 -207
  268. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  269. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  270. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  271. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  272. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  273. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  274. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  275. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  276. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  277. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  278. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  279. package/BookReaderDemo/demo-advanced.html +0 -33
  280. package/BookReaderDemo/demo-autoplay.html +0 -38
  281. package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
  282. package/BookReaderDemo/demo-embed.html +0 -26
  283. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
  284. package/BookReaderDemo/demo-fullscreen.html +0 -33
  285. package/BookReaderDemo/demo-iiif.html +0 -34
  286. package/BookReaderDemo/demo-iiif.js +0 -26
  287. package/BookReaderDemo/demo-internetarchive.html +0 -74
  288. package/BookReaderDemo/demo-multiple.html +0 -43
  289. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  290. package/BookReaderDemo/demo-preview-pages.html +0 -1092
  291. package/BookReaderDemo/demo-simple.html +0 -34
  292. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
  293. package/BookReaderDemo/immersion-1up.html +0 -64
  294. package/BookReaderDemo/immersion-mode.html +0 -35
  295. package/BookReaderDemo/toggle_controls.html +0 -53
  296. package/BookReaderDemo/view_mode.html +0 -39
  297. package/BookReaderDemo/viewmode-cycle.html +0 -41
  298. package/CHANGELOG.md +0 -495
  299. package/CONTRIBUTING.md +0 -7
  300. package/codecov.yml +0 -17
  301. package/index.html +0 -31
  302. package/karma.conf.js +0 -23
  303. package/screenshot.png +0 -0
  304. package/scripts/postversion.js +0 -10
  305. package/scripts/preversion.js +0 -14
  306. package/scripts/version.js +0 -26
  307. package/src/BookNavigator/BookModel.js +0 -14
  308. package/src/BookNavigator/BookNavigator.js +0 -446
  309. package/src/BookNavigator/assets/book-loader.js +0 -27
  310. package/src/BookNavigator/assets/icon_checkmark.js +0 -6
  311. package/src/BookNavigator/assets/icon_close.js +0 -3
  312. package/src/BookNavigator/bookmarks/bookmarks-provider.js +0 -53
  313. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  314. package/src/BookNavigator/downloads/downloads-provider.js +0 -66
  315. package/src/BookNavigator/search/a-search-result.js +0 -55
  316. package/src/BookReader/DebugConsole.js +0 -54
  317. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  318. package/src/ItemNavigator/ItemNavigator.js +0 -376
  319. package/src/ItemNavigator/providers/sharing.js +0 -29
  320. package/src/css/_MobileNav.scss +0 -194
  321. package/src/dragscrollable-br.js +0 -261
  322. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  323. package/src/plugins/plugin.mobile_nav.js +0 -287
  324. package/tests/BookReader/BookModel.test.js +0 -312
  325. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  326. package/tests/BookReader/DebugConsole.test.js +0 -25
  327. package/tests/BookReader/ImageCache.test.js +0 -150
  328. package/tests/BookReader/Mode1Up.test.js +0 -164
  329. package/tests/BookReader/Mode2Up.test.js +0 -247
  330. package/tests/BookReader/Navbar/Navbar.test.js +0 -169
  331. package/tests/BookReader/PageContainer.test.js +0 -115
  332. package/tests/BookReader/ReduceSet.test.js +0 -38
  333. package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
  334. package/tests/BookReader/utils/classes.test.js +0 -88
  335. package/tests/BookReader/utils.test.js +0 -109
  336. package/tests/BookReader.options.test.js +0 -39
  337. package/tests/BookReader.test.js +0 -301
  338. package/tests/e2e/README.md +0 -75
  339. package/tests/e2e/autoplay.test.js +0 -13
  340. package/tests/e2e/base.test.js +0 -35
  341. package/tests/e2e/helpers/base.js +0 -263
  342. package/tests/e2e/helpers/debug.js +0 -13
  343. package/tests/e2e/helpers/desktopSearch.js +0 -72
  344. package/tests/e2e/helpers/mobileSearch.js +0 -85
  345. package/tests/e2e/helpers/mockSearch.js +0 -93
  346. package/tests/e2e/helpers/rightToLeft.js +0 -29
  347. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  348. package/tests/e2e/models/BookReader.js +0 -11
  349. package/tests/e2e/models/Navigation.js +0 -56
  350. package/tests/e2e/rightToLeft.test.js +0 -20
  351. package/tests/e2e/viewmode.test.js +0 -37
  352. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  353. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
  354. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
  355. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  356. package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
  357. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  358. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  359. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  360. package/tests/plugins/plugin.autoplay.test.js +0 -52
  361. package/tests/plugins/plugin.chapters.test.js +0 -130
  362. package/tests/plugins/plugin.iframe.test.js +0 -42
  363. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  364. package/tests/plugins/plugin.resume.test.js +0 -98
  365. package/tests/plugins/plugin.text_selection.test.js +0 -203
  366. package/tests/plugins/plugin.url.test.js +0 -129
  367. package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
  368. package/tests/plugins/search/plugin.search.test.js +0 -173
  369. package/tests/plugins/search/plugin.search.view.test.js +0 -106
  370. package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
  371. package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
  372. package/tests/plugins/tts/PageChunk.test.js +0 -57
  373. package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
  374. package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
  375. package/tests/plugins/tts/utils.test.js +0 -133
  376. package/tests/util/browserSniffing.test.js +0 -56
  377. package/tests/util/docCookies.test.js +0 -15
  378. package/tests/util/strings.test.js +0 -63
  379. package/tests/utils.js +0 -42
  380. package/webpack.config.js +0 -86
@@ -1,312 +0,0 @@
1
- import sinon from 'sinon';
2
- import { deepCopy } from '../utils.js';
3
- import { BookModel } from '../../src/BookReader/BookModel.js';
4
- /** @typedef {import('../../src/BookReader/options.js').BookReaderOptions} BookReaderOptions */
5
-
6
- afterEach(() => {
7
- sinon.restore();
8
- });
9
-
10
- /** @type {BookReaderOptions['data']} */
11
- const SAMPLE_DATA = [
12
- [
13
- { width: 123, height: 123, uri: 'https://archive.org/image0.jpg', pageNum: '1' },
14
- ],
15
- [
16
- { width: 123, height: 123, uri: 'https://archive.org/image1.jpg', pageNum: '2' },
17
- { width: 123, height: 123, uri: 'https://archive.org/image2.jpg', pageNum: '3' },
18
- ],
19
- [
20
- { width: 123, height: 123, uri: 'https://archive.org/image3.jpg', pageNum: '4' },
21
- ],
22
- ];
23
-
24
- describe('getMedianPageSize', () => {
25
- test('handles single page data', () => {
26
- const bm = new BookModel({ data: SAMPLE_DATA.slice(0, 1) });
27
- expect(bm.getMedianPageSize()).toEqual({ width: 123, height: 123 });
28
- });
29
-
30
- test('handles odd pages data', () => {
31
- const sizes = [
32
- {width: 300, height: 2200},
33
- {width: 200, height: 2100},
34
- {width: 100, height: 2300},
35
- ];
36
- const data = deepCopy(SAMPLE_DATA);
37
- delete data[2];
38
- Object.assign(data[0][0], sizes[0]);
39
- Object.assign(data[1][0], sizes[1]);
40
- Object.assign(data[1][1], sizes[2]);
41
- const bm = new BookModel({ data });
42
- expect(bm.getMedianPageSize()).toEqual({ width: 200, height: 2200 });
43
- });
44
-
45
-
46
- test('handles even pages data', () => {
47
- const sizes = [
48
- {width: 300, height: 2200},
49
- {width: 200, height: 2100},
50
- {width: 100, height: 2300},
51
- {width: 400, height: 2400},
52
- ];
53
- const data = deepCopy(SAMPLE_DATA);
54
- Object.assign(data[0][0], sizes[0]);
55
- Object.assign(data[1][0], sizes[1]);
56
- Object.assign(data[1][1], sizes[2]);
57
- Object.assign(data[2][0], sizes[3]);
58
- const bm = new BookModel({ data });
59
- expect(bm.getMedianPageSize()).toEqual({ width: 300, height: 2300 });
60
- });
61
-
62
- test('caches result', () => {
63
- const bm = new BookModel({ data: SAMPLE_DATA });
64
- const firstResult = bm.getMedianPageSize();
65
- expect(bm.getMedianPageSize()).toBe(firstResult);
66
- expect(bm.getMedianPageSize()).toBe(firstResult);
67
- expect(bm.getMedianPageSize()).toBe(firstResult);
68
- });
69
- });
70
-
71
- describe('getPageIndices', () => {
72
- test('handles unique indices', () => {
73
- const bm = new BookModel({ data: SAMPLE_DATA });
74
- expect(bm.getPageIndices('1')).toEqual([0]);
75
- });
76
-
77
- test('handles invalid indices', () => {
78
- const bm = new BookModel({ data: SAMPLE_DATA });
79
- expect(bm.getPageIndices('foo')).toEqual([]);
80
- expect(bm.getPageIndices('123')).toEqual([]);
81
- });
82
-
83
- test('handles non-unique indices', () => {
84
- const data = deepCopy(SAMPLE_DATA);
85
- data[0][0].pageNum = '2';
86
- const bm = new BookModel({ data });
87
- expect(bm.getPageIndices('2')).toEqual([0, 1]);
88
- });
89
-
90
- test('handles n-prefixed pages', () => {
91
- const data = deepCopy(SAMPLE_DATA);
92
- data[0][0].pageNum = 'n0';
93
- const bm = new BookModel({ data });
94
- expect(bm.getPageIndices('n0')).toEqual([0]);
95
- });
96
- });
97
-
98
- test('getPageName', () => {
99
- const bm = new BookModel({ data: SAMPLE_DATA });
100
- expect(bm.getPageName(0)).toEqual('Page 1');
101
- expect(bm.getPageName(1)).toEqual('Page 2');
102
- });
103
-
104
- describe('numLeafs', () => {
105
- test('reads from data', () => {
106
- const bm = new BookModel({ data: SAMPLE_DATA });
107
- expect(bm.getNumLeafs()).toBe(4);
108
- });
109
-
110
- test('numLeafs can be overriden', () => {
111
- const bm = new BookModel({ data: SAMPLE_DATA, numLeafs: 12 });
112
- expect(bm.getNumLeafs()).toBe(12);
113
- });
114
- });
115
-
116
- test('getPageNum', () => {
117
- const bm = new BookModel({ data: SAMPLE_DATA });
118
- expect(bm.getPageNum(0)).toBe('1');
119
- });
120
-
121
- test('getPageProp gets values from correct document', () => {
122
- const bm = new BookModel({ data: SAMPLE_DATA });
123
- expect(bm.getPageProp(1, 'uri')).toBe(SAMPLE_DATA[1][0].uri);
124
- });
125
-
126
- describe('getSpreadIndices', () => {
127
- test('Works for left to right text', () => {
128
- const bm = new BookModel({ data: SAMPLE_DATA, pageProgression: 'lr' });
129
- expect(bm.getSpreadIndices(1)).toEqual([1, 2]);
130
- expect(bm.getSpreadIndices(2)).toEqual([1, 2]);
131
- });
132
- });
133
-
134
- describe('leafNumToIndex', () => {
135
- test('returns input if no leafNum in data', () => {
136
- const bm = new BookModel({ data: SAMPLE_DATA });
137
- expect(bm.leafNumToIndex(1)).toBe(1);
138
- expect(bm.leafNumToIndex(2)).toBe(2);
139
- expect(bm.leafNumToIndex(3)).toBe(3);
140
- });
141
-
142
- test('returns true index when leafNum does not point to index', () => {
143
- const data = deepCopy(SAMPLE_DATA);
144
- for (const spread of data) {
145
- for (const page of spread) {
146
- page.leafNum = parseFloat(page.pageNum) + 2;
147
- }
148
- }
149
-
150
- const bm = new BookModel({ data });
151
- expect(bm.leafNumToIndex(3)).toBe(0);
152
- });
153
- });
154
-
155
- describe('parsePageString', () => {
156
- test('handles leaf-prefixed PageString', () => {
157
- const data = deepCopy(SAMPLE_DATA);
158
- for (const spread of data) {
159
- for (const page of spread) {
160
- page.leafNum = parseFloat(page.pageNum) + 2;
161
- }
162
- }
163
-
164
- const bm = new BookModel({ data });
165
- expect(bm.parsePageString('leaf3')).toBe(0);
166
- });
167
- });
168
-
169
- describe('pagesIterator', () => {
170
- test('Goes through all pages', () => {
171
- const bm = new BookModel({ data: SAMPLE_DATA });
172
- let i = 0;
173
- for (const page of bm.pagesIterator()) {
174
- expect(page.index).toBe(i++);
175
- }
176
- });
177
-
178
- test('Can combine unviewables', () => {
179
- const data = deepCopy(SAMPLE_DATA);
180
- // add some more pages
181
- data.splice(2, 0, deepCopy(data[0]));
182
- data[1].forEach(page => page.viewable = false);
183
- const bm = new BookModel({ data });
184
- for (const page of bm.pagesIterator({combineConsecutiveUnviewables: true})) {
185
- expect(page.isConsecutiveUnviewable).toBe(false);
186
- }
187
- });
188
- });
189
-
190
- describe('_getDataFlattened', () => {
191
- test('Assigns correct page sides', () => {
192
- const bm = new BookModel({ data: SAMPLE_DATA });
193
- expect(bm._getDataFlattened().map(page => page.pageSide)).toEqual(['R', 'L', 'R', 'L']);
194
- });
195
-
196
- test('Memoized based on data length', () => {
197
- const data = deepCopy(SAMPLE_DATA);
198
- const bm = new BookModel({ data });
199
- const firstResult = bm._getDataFlattened();
200
- expect(bm._getDataFlattened()).toBe(firstResult);
201
- expect(bm._getDataFlattened()).toBe(firstResult);
202
- bm.br.data = data.slice(0, 1);
203
- expect(bm._getDataFlattened()).not.toBe(firstResult);
204
- });
205
-
206
- test('Assigns unviewablesStart', () => {
207
- const data = deepCopy(SAMPLE_DATA);
208
- data.slice(1, -1)
209
- .forEach(spread => spread.forEach(page => {
210
- page.viewable = false;
211
- }));
212
- const bm = new BookModel({ data });
213
- const pages = bm._getDataFlattened();
214
- expect(pages[0].unviewablesStart).toBeUndefined();
215
- expect(pages[1].unviewablesStart).toBe(1);
216
- expect(pages[2].unviewablesStart).toBe(1);
217
- expect(pages[3].unviewablesStart).toBeUndefined();
218
- });
219
- });
220
-
221
- describe('getPage', () => {
222
- test('loops around by default', () => {
223
- const bm = new BookModel({ data: SAMPLE_DATA });
224
- expect(bm.getPage(-1).index).toBe(3);
225
- expect(bm.getPage(-2).index).toBe(2);
226
- expect(bm.getPage(-3).index).toBe(1);
227
- expect(bm.getPage(4).index).toBe(0);
228
- expect(bm.getPage(5).index).toBe(1);
229
- });
230
-
231
- test('does not loop if loop=false', () => {
232
- const bm = new BookModel({ data: SAMPLE_DATA });
233
- expect(bm.getPage(-1, false)).toBeUndefined();
234
- expect(bm.getPage(-2, false)).toBeUndefined();
235
- expect(bm.getPage(4, false)).toBeUndefined();
236
- expect(bm.getPage(5, false)).toBeUndefined();
237
- });
238
- });
239
-
240
- describe('PageModel', () => {
241
- test('constructor copies fields from book model', () => {
242
- const bm = new BookModel({ data: SAMPLE_DATA });
243
- const spy = sinon.spy(bm, 'getPageWidth');
244
- const page = bm.getPage(0);
245
- expect(spy.callCount).toBe(1);
246
- expect(page.width).toBe(SAMPLE_DATA[0][0].width);
247
- });
248
-
249
- test('prev at start of book returns null', () => {
250
- const bm = new BookModel({ data: SAMPLE_DATA });
251
- expect(bm.getPage(0).prev).toBeUndefined();
252
- });
253
-
254
- test('prev to return previous', () => {
255
- const bm = new BookModel({ data: SAMPLE_DATA });
256
- expect(bm.getPage(1).prev.index).toBe(0);
257
- expect(bm.getPage(3).prev.prev.index).toBe(1);
258
- });
259
-
260
- test('next at end of book returns null', () => {
261
- const bm = new BookModel({ data: SAMPLE_DATA });
262
- expect(bm.getPage(-1).next).toBeUndefined();
263
- });
264
-
265
- test('next to return next page', () => {
266
- const bm = new BookModel({ data: SAMPLE_DATA });
267
- expect(bm.getPage(0).next.index).toBe(1);
268
- expect(bm.getPage(1).next.next.index).toBe(3);
269
- });
270
-
271
- describe('findNext combineConsecutiveUnviewables=true', () => {
272
- const data = deepCopy(SAMPLE_DATA);
273
- // add some more pages
274
- data.splice(2, 0, deepCopy(data[0]));
275
- data[1].forEach(page => page.viewable = false);
276
-
277
- const bm = new BookModel({ data });
278
-
279
- test('does not skip the first unviewable page', () => {
280
- expect(bm.getPage(0).findNext({ combineConsecutiveUnviewables: true }).index).toBe(1);
281
- });
282
-
283
- test('skips consecutive unviewables', () => {
284
- expect(bm.getPage(1).findNext({ combineConsecutiveUnviewables: true }).index).toBe(3);
285
- });
286
-
287
- test('at end is undefined', () => {
288
- expect(bm.getPage(-1).findNext({ combineConsecutiveUnviewables: true })).toBeUndefined();
289
- });
290
- });
291
-
292
- describe('findPrev', () => {
293
- const data = deepCopy(SAMPLE_DATA);
294
- // add some more pages
295
- data.splice(2, 0, deepCopy(data[0]));
296
- data[1].forEach(page => page.viewable = false);
297
-
298
- const bm = new BookModel({ data });
299
-
300
- test('works if called on first unviewable', () => {
301
- expect(bm.getPage(1).findPrev({ combineConsecutiveUnviewables: true }).index).toBe(0);
302
- });
303
-
304
- test('works if called within unviewable chunk', () => {
305
- expect(bm.getPage(2).findPrev({ combineConsecutiveUnviewables: true }).index).toBe(1);
306
- });
307
-
308
- test('at start is undefined', () => {
309
- expect(bm.getPage(0).findPrev({ combineConsecutiveUnviewables: true })).toBeUndefined();
310
- });
311
- });
312
- });
@@ -1,171 +0,0 @@
1
- import BookReader from '../../src/BookReader';
2
-
3
- beforeAll(() => {
4
- global.alert = jest.fn();
5
- });
6
- afterEach(() => {
7
- jest.restoreAllMocks();
8
- });
9
-
10
- describe('BookReader.prototype.toggleFullscreen', () => {
11
- test('uses `isFullscreen` to check fullscreen state', () => {
12
- const isFSmock = jest.fn();
13
- isFSmock.mockReturnValueOnce(false);
14
- const br = new BookReader();
15
- br.mode = br.constMode1up;
16
- br.enterFullscreen = jest.fn();
17
- br.isFullscreen = isFSmock;
18
-
19
- br.toggleFullscreen();
20
- expect(br.isFullscreen).toHaveBeenCalled();
21
- expect(br.isFullscreen).toHaveBeenCalled();
22
- });
23
-
24
- test('will always emit an event', () => {
25
- const br = new BookReader();
26
- br.mode = br.constMode1up;
27
- br.enterFullscreen = jest.fn();
28
- br.trigger = jest.fn();
29
- br.refs.$brContainer = {
30
- css: jest.fn(),
31
- animate: jest.fn()
32
- };
33
-
34
- br.toggleFullscreen();
35
- expect(br.enterFullscreen).toHaveBeenCalled();
36
- });
37
-
38
- test('will start with opening fullscreen', () => {
39
- const br = new BookReader();
40
- br.mode = br.constMode1up;
41
- br.enterFullscreen = jest.fn();
42
-
43
- br.toggleFullscreen();
44
- expect(br.enterFullscreen).toHaveBeenCalled();
45
- });
46
-
47
- test('will close fullscreen if BookReader is in fullscreen', () => {
48
- const br = new BookReader();
49
- br.mode = br.constMode1up;
50
- br.exitFullScreen = jest.fn();
51
- br.isFullscreenActive = true;
52
-
53
- br.toggleFullscreen();
54
- expect(br.exitFullScreen).toHaveBeenCalled();
55
- });
56
- });
57
-
58
- describe('BookReader.prototype.enterFullscreen', () => {
59
- test('will bind `_fullscreenCloseHandler` by default', () => {
60
- const br = new BookReader();
61
- br.mode = br.constMode1up;
62
- br.switchMode = jest.fn();
63
- br.updateBrClasses = jest.fn();
64
- br.refs.$brContainer = {
65
- css: jest.fn(),
66
- animate: jest.fn(),
67
- };
68
- expect(br._fullscreenCloseHandler).toBeUndefined();
69
-
70
- br.enterFullscreen();
71
- expect(br._fullscreenCloseHandler).toBeDefined();
72
- });
73
-
74
- test('fires certain events when called', () => {
75
- const br = new BookReader();
76
- br.mode = br.constMode1up;
77
- br.switchMode = jest.fn();
78
- br.updateBrClasses = jest.fn();
79
- br.trigger = jest.fn();
80
- br.resize = jest.fn();
81
- br.jumpToIndex = jest.fn();
82
- const animateMock = (options, speed, style, callback) => {
83
- callback();
84
- };
85
- br.refs.$brContainer = {
86
- css: jest.fn(),
87
- animate: animateMock,
88
- };
89
-
90
- br.enterFullscreen();
91
- expect(br.switchMode).toHaveBeenCalledTimes(1);
92
- expect(br.updateBrClasses).toHaveBeenCalledTimes(0); // book nav's fullscreen manager will set these classes
93
- expect(br.trigger).toHaveBeenCalledTimes(1);
94
- expect(br.resize).toHaveBeenCalledTimes(1);
95
- expect(br.jumpToIndex).toHaveBeenCalledTimes(1);
96
- });
97
- });
98
-
99
- describe('BookReader.prototype.exitFullScreen', () => {
100
- test('fires certain events when called', () => {
101
- const br = new BookReader();
102
- br.mode = br.constMode1up;
103
- br.switchMode = jest.fn();
104
- br.updateBrClasses = jest.fn();
105
- br.trigger = jest.fn();
106
- br.resize = jest.fn();
107
- const animateMock = (options, speed, style, callback) => {
108
- callback();
109
- };
110
- br.refs.$brContainer = {
111
- css: jest.fn(),
112
- animate: animateMock,
113
- };
114
- br.exitFullScreen();
115
- expect(br.switchMode).toHaveBeenCalledTimes(1);
116
- expect(br.updateBrClasses).toHaveBeenCalledTimes(1);
117
- expect(br.trigger).toHaveBeenCalledTimes(1);
118
- expect(br.resize).toHaveBeenCalledTimes(1);
119
- });
120
- });
121
-
122
- describe('BookReader.prototype.trigger', () => {
123
- test('fires custom event', () => {
124
- const br = new BookReader();
125
- global.br = br;
126
- global.dispatchEvent = jest.fn();
127
-
128
- const props = {bar: 1};
129
- br.trigger('foo', props);
130
- expect(global.dispatchEvent.mock.calls.length).toBe(1);
131
- });
132
- });
133
-
134
- describe('`BookReader.prototype.prev`', () => {
135
- const br = new BookReader();
136
- global.br = br;
137
- br.trigger = jest.fn();
138
- br.flipBackToIndex = jest.fn();
139
- br.jumpToIndex = jest.fn();
140
-
141
- test('does not take action if user is on front page', () => {
142
- br.firstIndex = 0;
143
- br.prev();
144
- expect(br.trigger.mock.calls.length).toBe(0);
145
- expect(br.flipBackToIndex.mock.calls.length).toBe(0);
146
- expect(br.jumpToIndex.mock.calls.length).toBe(0);
147
- });
148
-
149
- describe('2up mode', () => {
150
- test('fires event and turns the page', () => {
151
- br.firstIndex = 10;
152
- br.mode = br.constMode2up;
153
- br.prev();
154
- expect(br.jumpToIndex.mock.calls.length).toBe(0); // <-- does not get called
155
- expect(br.trigger.mock.calls.length).toBe(1);
156
- expect(br.flipBackToIndex.mock.calls.length).toBe(1);
157
- });
158
- });
159
-
160
- describe('non 2up mode', () => {
161
- test('jumps to provided index', () => {
162
- br.firstIndex = 100;
163
- br.mode = br.constMode1up;
164
- br.prev();
165
- expect(br.jumpToIndex.mock.calls.length).toBe(1); // <-- gets called
166
- expect(br.trigger.mock.calls.length).toBe(1); // <-- gets called by `jumpToIndex` internally
167
- expect(br.flipBackToIndex.mock.calls.length).toBe(1); // <-- gets called by `jumpToIndex` internally
168
- });
169
- });
170
- });
171
-
@@ -1,25 +0,0 @@
1
- import sinon from 'sinon';
2
- import { DebugConsole } from '../../src/BookReader/DebugConsole.js';
3
-
4
- beforeEach(() => {
5
- sinon.stub(console, 'log');
6
- });
7
- afterEach(() => {
8
- sinon.restore();
9
- });
10
-
11
- test('hijacks console.log', () => {
12
- const _realLog = console.log;
13
- expect(_realLog).toBe(console.log);
14
- new DebugConsole().init();
15
- expect(_realLog).not.toBe(console.log);
16
- });
17
-
18
- test('logging the same thing twice does not create more entries', () => {
19
- const dc = new DebugConsole();
20
- dc.init();
21
- dc.logToScreen(['hello']);
22
- dc.logToScreen(['hello']);
23
- expect(dc.$log.children('.log-entry')).toHaveLength(1);
24
- expect(dc.$log.find('.count').text()).toBe('(2)');
25
- });
@@ -1,150 +0,0 @@
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 */
6
-
7
- afterEach(() => {
8
- jest.restoreAllMocks();
9
- sinon.restore();
10
- });
11
-
12
- const CACHE_MOCK = { 1: [{ reduce: 3, loaded: true }] };
13
- const FIRST_PAGE_MOCK = { width: 123, height: 123, uri: 'https://archive.org/image0.jpg', pageNum: '1' };
14
- /** @type {BookReaderOptions['data']} */
15
- const SAMPLE_DATA = [
16
- [ FIRST_PAGE_MOCK ],
17
- [
18
- { width: 123, height: 123, uri: 'https://archive.org/image1.jpg', pageNum: '2' },
19
- { width: 123, height: 123, uri: 'https://archive.org/image2.jpg', pageNum: '3' },
20
- ],
21
- [
22
- { width: 123, height: 123, uri: 'https://archive.org/image3.jpg', pageNum: '4' },
23
- { width: 123, height: 123, uri: 'https://archive.org/image4.jpg', pageNum: '5' },
24
- ],
25
- [
26
- { width: 123, height: 123, uri: 'https://archive.org/image5.jpg', pageNum: '6' },
27
- ],
28
- ];
29
-
30
- describe('Image Cache', () => {
31
- describe('`image` call', () => {
32
- test('calling `image` will create an image if none is cached', () => {
33
- const reduceSet = Pow2ReduceSet;
34
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
35
- ic.cache = {};
36
- ic.image(1, 5);
37
- expect(Object.keys(ic.cache).length).toBe(1);
38
- expect(ic.cache['1'].length).toBe(1);
39
- });
40
- test('will pull from cache if image of a good quality has been stored', () => {
41
- const reduceSet = Pow2ReduceSet;
42
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
43
- const serveImgElSpy = sinon.spy(ic, '_serveImageElement');
44
- ic.cache = CACHE_MOCK;
45
- ic.image(1, 5);
46
- expect(serveImgElSpy.callCount).toBe(1);
47
- });
48
- });
49
-
50
- describe('`imageLoaded` call', () => {
51
- test('returns true if image in cache', () => {
52
- const reduceSet = Pow2ReduceSet;
53
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
54
- ic.cache = CACHE_MOCK;
55
- const isImgLoaded = ic.imageLoaded(1, 3);
56
- expect(isImgLoaded).toBe(true);
57
- });
58
- test('returns true if image reducer in cache is good enough', () => {
59
- const reduceSet = Pow2ReduceSet;
60
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
61
- ic.cache = CACHE_MOCK;
62
- const isImgLoaded = ic.imageLoaded(1, 5);
63
- expect(isImgLoaded).toBe(true);
64
- });
65
- test('returns false if no image in cache', () => {
66
- const reduceSet = Pow2ReduceSet;
67
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
68
- ic.cache = CACHE_MOCK;
69
- const isImgLoaded = ic.imageLoaded(2, 3);
70
- expect(isImgLoaded).toBe(false);
71
- });
72
- test('returns false if reducer to check is better than cache', () => {
73
- const reduceSet = Pow2ReduceSet;
74
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
75
- ic.cache = CACHE_MOCK;
76
- const isImgLoaded = ic.imageLoaded(1, 2);
77
- expect(isImgLoaded).toBe(false);
78
- });
79
- test('returns false if image has not loaded', () => {
80
- const reduceSet = Pow2ReduceSet;
81
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
82
- ic.cache = { 1: [{ reduce: 4, loaded: false }] };
83
- const isImgLoaded = ic.imageLoaded(1, 2);
84
- expect(isImgLoaded).toBe(false);
85
- });
86
- });
87
-
88
- describe('`getBestLoadedReduce` call', () => {
89
- test('handles empty cache', () => {
90
- const reduceSet = Pow2ReduceSet;
91
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
92
- ic.cache = {};
93
- expect(ic.getBestLoadedReduce(0)).toBeNull();
94
- });
95
-
96
- test('handles empty page-level cache', () => {
97
- const reduceSet = Pow2ReduceSet;
98
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
99
- ic.cache = { 0: [] };
100
- expect(ic.getBestLoadedReduce(0)).toBeNull();
101
- ic.cache = { 0: [{ reduce: 10, loaded: false }] };
102
- expect(ic.getBestLoadedReduce(0)).toBeNull();
103
- });
104
-
105
- test('chooses highest quality sufficient image', () => {
106
- const reduceSet = Pow2ReduceSet;
107
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
108
- ic.cache = { 0: [{ reduce: 1, loaded: true }, { reduce: 4, loaded: true }, { reduce: 10, loaded: true }] };
109
- expect(ic.getBestLoadedReduce(0, 5)).toBe(10);
110
- });
111
-
112
- test('chooses closest image if no lower images', () => {
113
- const reduceSet = Pow2ReduceSet;
114
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
115
- ic.cache = { 0: [{ reduce: 1, loaded: true }, { reduce: 4, loaded: true }] };
116
- expect(ic.getBestLoadedReduce(0, 5)).toBe(4);
117
- });
118
- });
119
-
120
- describe('`_serveImageElement` call', () => {
121
- test('returns jQuery image element', () => {
122
- const reduceSet = Pow2ReduceSet;
123
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
124
- const img = ic._serveImageElement(0);
125
- expect($(img).length).toBe(1);
126
- expect($(img)[0].classList.contains('BRpageimage')).toBe(true);
127
- expect($(img).attr('src')).toBe(FIRST_PAGE_MOCK.uri);
128
- });
129
-
130
- test('does not set srcset when useSrcSet=false', () => {
131
- const reduceSet = Pow2ReduceSet;
132
- const ic = new ImageCache(
133
- new BookModel({ data: SAMPLE_DATA, reduceSet }),
134
- { useSrcSet: false, reduceSet },
135
- );
136
- const $img = ic._serveImageElement(0);
137
- expect($img[0].hasAttribute('srcset')).toBe(false);
138
- });
139
-
140
- test('sets srcset when useSrcSet=true', () => {
141
- const reduceSet = Pow2ReduceSet;
142
- const ic = new ImageCache(
143
- new BookModel({ data: SAMPLE_DATA, reduceSet }),
144
- { useSrcSet: true, reduceSet },
145
- );
146
- const $img = ic._serveImageElement(0, 9);
147
- expect($img.attr('srcset')).toBeTruthy();
148
- });
149
- });
150
- });