@internetarchive/bookreader 5.0.0-11 → 5.0.0-111

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 (381) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +649 -1225
  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 +1904 -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 +24 -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 +159 -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 +2 -1
  136. package/BookReader/plugins/plugin.url.js.LICENSE.txt +1 -0
  137. package/BookReader/plugins/plugin.url.js.map +1 -1
  138. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  139. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  140. package/BookReader/plugins/translator-worker.js +2 -0
  141. package/BookReader/plugins/translator-worker.js.map +1 -0
  142. package/BookReader/silence.mp3 +0 -0
  143. package/BookReader/translator-worker.js +475 -0
  144. package/BookReader/webcomponents-bundle.js +3 -0
  145. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  146. package/BookReader/webcomponents-bundle.js.map +1 -0
  147. package/README.md +14 -3
  148. package/jsconfig.json +19 -0
  149. package/package.json +93 -70
  150. package/src/BookReader/BookModel.js +92 -46
  151. package/src/BookReader/DragScrollable.js +233 -0
  152. package/src/BookReader/ImageCache.js +49 -16
  153. package/src/BookReader/Mode1Up.js +66 -365
  154. package/src/BookReader/Mode1UpLit.js +392 -0
  155. package/src/BookReader/Mode2Up.js +87 -1315
  156. package/src/BookReader/Mode2UpLit.js +786 -0
  157. package/src/BookReader/ModeAbstract.js +43 -0
  158. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  159. package/src/BookReader/ModeSmoothZoom.js +312 -0
  160. package/src/BookReader/ModeThumb.js +29 -15
  161. package/src/BookReader/Navbar/Navbar.js +201 -76
  162. package/src/BookReader/PageContainer.js +120 -23
  163. package/src/BookReader/ReduceSet.js +2 -2
  164. package/src/BookReader/Toolbar/Toolbar.js +18 -40
  165. package/src/BookReader/events.js +3 -3
  166. package/src/BookReader/options.js +94 -17
  167. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  168. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  169. package/src/BookReader/utils/SelectionObserver.js +53 -0
  170. package/src/BookReader/utils/classes.js +1 -1
  171. package/src/BookReader/utils.js +136 -12
  172. package/src/BookReader.js +695 -1228
  173. package/src/BookReaderPlugin.js +52 -0
  174. package/src/assets/icons/magnify-minus.svg +3 -7
  175. package/src/assets/icons/magnify-plus.svg +3 -7
  176. package/src/assets/icons/slider-toggle.svg +1 -0
  177. package/src/assets/icons/voice.svg +1 -0
  178. package/src/assets/images/hypothesis.ico +0 -0
  179. package/src/assets/images/icon_experiment.svg +1 -0
  180. package/src/assets/images/translate.svg +1 -0
  181. package/src/assets/images/unviewable_page.png +0 -0
  182. package/src/assets/silence.mp3 +0 -0
  183. package/src/css/BookReader.scss +1 -5
  184. package/src/css/_BRBookmarks.scss +1 -1
  185. package/src/css/_BRComponent.scss +1 -1
  186. package/src/css/_BRicon.scss +8 -2
  187. package/src/css/_BRmain.scss +16 -3
  188. package/src/css/_BRnav.scss +74 -70
  189. package/src/css/_BRpages.scss +171 -42
  190. package/src/css/_BRsearch.scss +69 -30
  191. package/src/css/_BRtoolbar.scss +5 -5
  192. package/src/css/_TextSelection.scss +188 -24
  193. package/src/css/_colorbox.scss +2 -2
  194. package/src/css/_controls.scss +24 -7
  195. package/src/css/_icons.scss +8 -1
  196. package/src/{BookNavigator/assets → css}/button-base.js +2 -2
  197. package/src/css/icon_checkmark.js +9 -0
  198. package/src/css/sharedStyles.js +15 -0
  199. package/src/ia-bookreader/downloads/downloads-provider.js +81 -0
  200. package/src/{BookNavigator → ia-bookreader}/downloads/downloads.js +25 -5
  201. package/src/ia-bookreader/ia-bookreader.js +666 -0
  202. package/src/ia-bookreader/sharing.js +27 -0
  203. package/src/ia-bookreader/viewable-files.js +98 -0
  204. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments-provider.js +17 -17
  205. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments.js +75 -67
  206. package/src/{BookNavigator → plugins}/bookmarks/bookmark-button.js +4 -3
  207. package/src/{BookNavigator/assets → plugins/bookmarks}/bookmark-colors.js +1 -1
  208. package/src/{BookNavigator → plugins}/bookmarks/bookmark-edit.js +43 -31
  209. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-list.js +48 -49
  210. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-loginCTA.js +3 -3
  211. package/src/plugins/bookmarks/bookmarks-provider.js +63 -0
  212. package/src/{BookNavigator → plugins/bookmarks}/delete-modal-actions.js +1 -1
  213. package/src/{BookNavigator → plugins}/bookmarks/ia-bookmarks.js +117 -68
  214. package/src/plugins/plugin.archive_analytics.js +84 -78
  215. package/src/plugins/plugin.autoplay.js +99 -104
  216. package/src/plugins/plugin.chapters.js +319 -205
  217. package/src/plugins/plugin.experiments.js +339 -0
  218. package/src/plugins/plugin.iframe.js +1 -1
  219. package/src/plugins/plugin.iiif.js +141 -0
  220. package/src/plugins/plugin.resume.js +54 -51
  221. package/src/plugins/plugin.text_selection.js +539 -219
  222. package/src/plugins/plugin.vendor-fullscreen.js +5 -5
  223. package/src/plugins/search/plugin.search.js +374 -392
  224. package/src/{BookNavigator → plugins}/search/search-provider.js +59 -27
  225. package/src/{BookNavigator → plugins}/search/search-results.js +105 -76
  226. package/src/plugins/search/utils.js +50 -0
  227. package/src/plugins/search/view.js +50 -68
  228. package/src/plugins/translate/TranslationManager.js +164 -0
  229. package/src/plugins/translate/plugin.translate.js +512 -0
  230. package/src/plugins/tts/AbstractTTSEngine.js +78 -49
  231. package/src/plugins/tts/FestivalTTSEngine.js +20 -30
  232. package/src/plugins/tts/PageChunk.js +33 -21
  233. package/src/plugins/tts/PageChunkIterator.js +11 -17
  234. package/src/plugins/tts/WebTTSEngine.js +131 -91
  235. package/src/plugins/tts/plugin.tts.js +345 -350
  236. package/src/plugins/tts/utils.js +77 -49
  237. package/src/plugins/url/UrlPlugin.js +211 -0
  238. package/src/plugins/{plugin.url.js → url/plugin.url.js} +105 -20
  239. package/src/util/TextSelectionManager.js +532 -0
  240. package/src/util/browserSniffing.js +33 -1
  241. package/src/util/cache.js +20 -0
  242. package/src/util/docCookies.js +21 -2
  243. package/src/util/lit.js +15 -0
  244. package/src/util/strings.js +1 -0
  245. package/.babelrc +0 -12
  246. package/.dependabot/config.yml +0 -6
  247. package/.eslintrc.js +0 -50
  248. package/.gitattributes +0 -2
  249. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  250. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  251. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  252. package/.github/workflows/node.js.yml +0 -37
  253. package/.github/workflows/npm-publish.yml +0 -47
  254. package/.testcaferc.json +0 -5
  255. package/BookReader/bookreader-component-bundle.js +0 -1450
  256. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  257. package/BookReader/bookreader-component-bundle.js.map +0 -1
  258. package/BookReader/jquery-1.10.1.js +0 -2
  259. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  260. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  261. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  262. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  263. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  264. package/BookReaderDemo/BookReaderDemo.css +0 -41
  265. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
  266. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  267. package/BookReaderDemo/BookReaderJSSimple.js +0 -55
  268. package/BookReaderDemo/IIIFBookReader.js +0 -207
  269. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  270. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  271. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  272. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  273. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  274. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  275. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  276. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  277. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  278. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  279. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  280. package/BookReaderDemo/demo-advanced.html +0 -33
  281. package/BookReaderDemo/demo-autoplay.html +0 -38
  282. package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
  283. package/BookReaderDemo/demo-embed.html +0 -26
  284. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
  285. package/BookReaderDemo/demo-fullscreen.html +0 -33
  286. package/BookReaderDemo/demo-iiif.html +0 -34
  287. package/BookReaderDemo/demo-iiif.js +0 -26
  288. package/BookReaderDemo/demo-internetarchive.html +0 -74
  289. package/BookReaderDemo/demo-multiple.html +0 -43
  290. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  291. package/BookReaderDemo/demo-preview-pages.html +0 -1092
  292. package/BookReaderDemo/demo-simple.html +0 -34
  293. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
  294. package/BookReaderDemo/immersion-1up.html +0 -64
  295. package/BookReaderDemo/immersion-mode.html +0 -35
  296. package/BookReaderDemo/toggle_controls.html +0 -53
  297. package/BookReaderDemo/view_mode.html +0 -39
  298. package/BookReaderDemo/viewmode-cycle.html +0 -41
  299. package/CHANGELOG.md +0 -495
  300. package/CONTRIBUTING.md +0 -7
  301. package/codecov.yml +0 -17
  302. package/index.html +0 -31
  303. package/karma.conf.js +0 -23
  304. package/screenshot.png +0 -0
  305. package/scripts/postversion.js +0 -10
  306. package/scripts/preversion.js +0 -14
  307. package/scripts/version.js +0 -26
  308. package/src/BookNavigator/BookModel.js +0 -14
  309. package/src/BookNavigator/BookNavigator.js +0 -446
  310. package/src/BookNavigator/assets/book-loader.js +0 -27
  311. package/src/BookNavigator/assets/icon_checkmark.js +0 -6
  312. package/src/BookNavigator/assets/icon_close.js +0 -3
  313. package/src/BookNavigator/bookmarks/bookmarks-provider.js +0 -53
  314. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  315. package/src/BookNavigator/downloads/downloads-provider.js +0 -66
  316. package/src/BookNavigator/search/a-search-result.js +0 -55
  317. package/src/BookReader/DebugConsole.js +0 -54
  318. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  319. package/src/ItemNavigator/ItemNavigator.js +0 -376
  320. package/src/ItemNavigator/providers/sharing.js +0 -29
  321. package/src/css/_MobileNav.scss +0 -194
  322. package/src/dragscrollable-br.js +0 -261
  323. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  324. package/src/plugins/plugin.mobile_nav.js +0 -287
  325. package/tests/BookReader/BookModel.test.js +0 -312
  326. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  327. package/tests/BookReader/DebugConsole.test.js +0 -25
  328. package/tests/BookReader/ImageCache.test.js +0 -150
  329. package/tests/BookReader/Mode1Up.test.js +0 -164
  330. package/tests/BookReader/Mode2Up.test.js +0 -247
  331. package/tests/BookReader/Navbar/Navbar.test.js +0 -169
  332. package/tests/BookReader/PageContainer.test.js +0 -115
  333. package/tests/BookReader/ReduceSet.test.js +0 -38
  334. package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
  335. package/tests/BookReader/utils/classes.test.js +0 -88
  336. package/tests/BookReader/utils.test.js +0 -109
  337. package/tests/BookReader.options.test.js +0 -39
  338. package/tests/BookReader.test.js +0 -301
  339. package/tests/e2e/README.md +0 -75
  340. package/tests/e2e/autoplay.test.js +0 -13
  341. package/tests/e2e/base.test.js +0 -35
  342. package/tests/e2e/helpers/base.js +0 -263
  343. package/tests/e2e/helpers/debug.js +0 -13
  344. package/tests/e2e/helpers/desktopSearch.js +0 -72
  345. package/tests/e2e/helpers/mobileSearch.js +0 -85
  346. package/tests/e2e/helpers/mockSearch.js +0 -93
  347. package/tests/e2e/helpers/rightToLeft.js +0 -29
  348. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  349. package/tests/e2e/models/BookReader.js +0 -11
  350. package/tests/e2e/models/Navigation.js +0 -56
  351. package/tests/e2e/rightToLeft.test.js +0 -20
  352. package/tests/e2e/viewmode.test.js +0 -37
  353. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  354. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
  355. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
  356. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  357. package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
  358. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  359. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  360. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  361. package/tests/plugins/plugin.autoplay.test.js +0 -52
  362. package/tests/plugins/plugin.chapters.test.js +0 -130
  363. package/tests/plugins/plugin.iframe.test.js +0 -42
  364. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  365. package/tests/plugins/plugin.resume.test.js +0 -98
  366. package/tests/plugins/plugin.text_selection.test.js +0 -203
  367. package/tests/plugins/plugin.url.test.js +0 -129
  368. package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
  369. package/tests/plugins/search/plugin.search.test.js +0 -173
  370. package/tests/plugins/search/plugin.search.view.test.js +0 -106
  371. package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
  372. package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
  373. package/tests/plugins/tts/PageChunk.test.js +0 -57
  374. package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
  375. package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
  376. package/tests/plugins/tts/utils.test.js +0 -133
  377. package/tests/util/browserSniffing.test.js +0 -56
  378. package/tests/util/docCookies.test.js +0 -15
  379. package/tests/util/strings.test.js +0 -63
  380. package/tests/utils.js +0 -42
  381. 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
- });