@internetarchive/bookreader 5.0.0-11-multiple-files → 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 (389) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +616 -1467
  4. package/BookReader/BookReader.js +2 -21564
  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 -12
  56. package/BookReader/icons/2up.svg +1 -15
  57. package/BookReader/icons/advance.svg +3 -26
  58. package/BookReader/icons/chevron-right.svg +1 -1
  59. package/BookReader/icons/close-circle-dark.svg +1 -0
  60. package/BookReader/icons/close-circle.svg +1 -1
  61. package/BookReader/icons/fullscreen.svg +1 -17
  62. package/BookReader/icons/fullscreen_exit.svg +1 -17
  63. package/BookReader/icons/hamburger.svg +1 -15
  64. package/BookReader/icons/left-arrow.svg +1 -12
  65. package/BookReader/icons/magnify-minus.svg +1 -16
  66. package/BookReader/icons/magnify-plus.svg +1 -17
  67. package/BookReader/icons/magnify.svg +1 -15
  68. package/BookReader/icons/pause.svg +1 -23
  69. package/BookReader/icons/play.svg +1 -22
  70. package/BookReader/icons/playback-speed.svg +1 -34
  71. package/BookReader/icons/read-aloud.svg +1 -22
  72. package/BookReader/icons/review.svg +3 -22
  73. package/BookReader/icons/slider-toggle.svg +1 -0
  74. package/BookReader/icons/thumbnails.svg +1 -17
  75. package/BookReader/icons/voice.svg +1 -0
  76. package/BookReader/icons/volume-full.svg +1 -22
  77. package/BookReader/images/BRicons.svg +5 -94
  78. package/BookReader/images/books_graphic.svg +1 -177
  79. package/BookReader/images/hypothesis.ico +0 -0
  80. package/BookReader/images/icon_book.svg +1 -12
  81. package/BookReader/images/icon_bookmark.svg +1 -12
  82. package/BookReader/images/icon_experiment.svg +1 -0
  83. package/BookReader/images/icon_gear.svg +1 -14
  84. package/BookReader/images/icon_hamburger.svg +1 -20
  85. package/BookReader/images/icon_home.svg +1 -21
  86. package/BookReader/images/icon_info.svg +1 -11
  87. package/BookReader/images/icon_one_page.svg +1 -8
  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 -15
  91. package/BookReader/images/icon_search_button.svg +1 -8
  92. package/BookReader/images/icon_share.svg +1 -9
  93. package/BookReader/images/icon_skip-ahead.svg +1 -6
  94. package/BookReader/images/icon_skip-back.svg +2 -13
  95. package/BookReader/images/icon_speaker.svg +1 -18
  96. package/BookReader/images/icon_speaker_open.svg +1 -10
  97. package/BookReader/images/icon_thumbnails.svg +1 -12
  98. package/BookReader/images/icon_toc.svg +1 -5
  99. package/BookReader/images/icon_two_pages.svg +1 -9
  100. package/BookReader/images/marker_chap-off.svg +1 -11
  101. package/BookReader/images/marker_chap-on.svg +1 -11
  102. package/BookReader/images/marker_srch-on.svg +1 -11
  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 -172
  108. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  109. package/BookReader/plugins/plugin.autoplay.js +1 -165
  110. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  111. package/BookReader/plugins/plugin.chapters.js +19 -301
  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 -74
  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 -368
  122. package/BookReader/plugins/plugin.resume.js.map +1 -1
  123. package/BookReader/plugins/plugin.search.js +2 -1420
  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 -1080
  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 +2 -9193
  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 -269
  136. package/BookReader/plugins/plugin.url.js.map +1 -1
  137. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
  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 -356
  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 +30 -16
  160. package/src/BookReader/Navbar/Navbar.js +201 -76
  161. package/src/BookReader/PageContainer.js +120 -23
  162. package/src/BookReader/ReduceSet.js +3 -3
  163. package/src/BookReader/Toolbar/Toolbar.js +19 -41
  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 +141 -13
  171. package/src/BookReader.js +711 -1241
  172. package/src/BookReaderPlugin.js +52 -0
  173. package/src/assets/icons/close-circle-dark.svg +1 -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 -17
  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 +33 -27
  188. package/src/css/_BRnav.scss +74 -70
  189. package/src/css/_BRpages.scss +171 -42
  190. package/src/css/_BRsearch.scss +69 -235
  191. package/src/css/_BRtoolbar.scss +5 -5
  192. package/src/css/_TextSelection.scss +129 -24
  193. package/src/css/_colorbox.scss +2 -2
  194. package/src/css/_controls.scss +24 -7
  195. package/src/css/_icons.scss +14 -1
  196. package/src/{BookNavigator/assets → css}/button-base.js +10 -3
  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 +29 -25
  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 +44 -32
  209. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-list.js +48 -49
  210. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-loginCTA.js +5 -10
  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 +310 -201
  217. package/src/plugins/plugin.experiments.js +321 -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 +53 -50
  221. package/src/plugins/plugin.text_selection.js +522 -219
  222. package/src/plugins/plugin.vendor-fullscreen.js +7 -7
  223. package/src/plugins/search/plugin.search.js +380 -360
  224. package/src/{BookNavigator → plugins}/search/search-provider.js +94 -32
  225. package/src/{BookNavigator → plugins}/search/search-results.js +108 -90
  226. package/src/plugins/search/utils.js +50 -0
  227. package/src/plugins/search/view.js +79 -210
  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 +21 -31
  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 +191 -0
  238. package/src/plugins/{plugin.url.js → url/plugin.url.js} +47 -18
  239. package/src/util/TextSelectionManager.js +282 -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 -49
  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 -28
  253. package/.github/workflows/npm-publish.yml +0 -47
  254. package/.testcaferc.json +0 -5
  255. package/BookReader/bookreader-component-bundle.js +0 -14330
  256. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  257. package/BookReader/bookreader-component-bundle.js.map +0 -1
  258. package/BookReader/icons/sort-ascending.svg +0 -1
  259. package/BookReader/icons/sort-descending.svg +0 -1
  260. package/BookReader/jquery-1.10.1.js +0 -108
  261. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  262. package/BookReader/plugins/plugin.menu_toggle.js +0 -369
  263. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  264. package/BookReader/plugins/plugin.mobile_nav.js +0 -335
  265. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  266. package/BookReaderDemo/BookReaderDemo.css +0 -41
  267. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
  268. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  269. package/BookReaderDemo/BookReaderJSSimple.js +0 -55
  270. package/BookReaderDemo/IIIFBookReader.js +0 -207
  271. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  272. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  273. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  274. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  275. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  276. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  277. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  278. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  279. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  280. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  281. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  282. package/BookReaderDemo/demo-advanced.html +0 -33
  283. package/BookReaderDemo/demo-autoplay.html +0 -38
  284. package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
  285. package/BookReaderDemo/demo-embed.html +0 -26
  286. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
  287. package/BookReaderDemo/demo-fullscreen.html +0 -33
  288. package/BookReaderDemo/demo-iiif.html +0 -34
  289. package/BookReaderDemo/demo-iiif.js +0 -26
  290. package/BookReaderDemo/demo-internetarchive.html +0 -74
  291. package/BookReaderDemo/demo-multiple.html +0 -43
  292. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  293. package/BookReaderDemo/demo-preview-pages.html +0 -1092
  294. package/BookReaderDemo/demo-simple.html +0 -34
  295. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
  296. package/BookReaderDemo/immersion-1up.html +0 -64
  297. package/BookReaderDemo/immersion-mode.html +0 -35
  298. package/BookReaderDemo/toggle_controls.html +0 -53
  299. package/BookReaderDemo/view_mode.html +0 -39
  300. package/BookReaderDemo/viewmode-cycle.html +0 -41
  301. package/CHANGELOG.md +0 -476
  302. package/CONTRIBUTING.md +0 -7
  303. package/codecov.yml +0 -17
  304. package/index.html +0 -31
  305. package/karma.conf.js +0 -23
  306. package/screenshot.png +0 -0
  307. package/scripts/postversion.js +0 -10
  308. package/scripts/preversion.js +0 -14
  309. package/scripts/version.js +0 -26
  310. package/src/BookNavigator/BookModel.js +0 -14
  311. package/src/BookNavigator/BookNavigator.js +0 -451
  312. package/src/BookNavigator/assets/book-loader.js +0 -27
  313. package/src/BookNavigator/assets/icon_checkmark.js +0 -6
  314. package/src/BookNavigator/assets/icon_close.js +0 -3
  315. package/src/BookNavigator/assets/icon_sort_ascending.js +0 -5
  316. package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
  317. package/src/BookNavigator/bookmarks/bookmarks-provider.js +0 -53
  318. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  319. package/src/BookNavigator/downloads/downloads-provider.js +0 -66
  320. package/src/BookNavigator/search/a-search-result.js +0 -55
  321. package/src/BookNavigator/volumes/volumes-provider.js +0 -75
  322. package/src/BookNavigator/volumes/volumes.js +0 -161
  323. package/src/BookReader/DebugConsole.js +0 -54
  324. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  325. package/src/ItemNavigator/ItemNavigator.js +0 -372
  326. package/src/ItemNavigator/providers/sharing.js +0 -29
  327. package/src/assets/icons/sort-ascending.svg +0 -1
  328. package/src/assets/icons/sort-descending.svg +0 -1
  329. package/src/css/_MobileNav.scss +0 -194
  330. package/src/dragscrollable-br.js +0 -261
  331. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  332. package/src/plugins/plugin.mobile_nav.js +0 -287
  333. package/tests/BookReader/BookModel.test.js +0 -312
  334. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  335. package/tests/BookReader/DebugConsole.test.js +0 -25
  336. package/tests/BookReader/ImageCache.test.js +0 -150
  337. package/tests/BookReader/Mode1Up.test.js +0 -164
  338. package/tests/BookReader/Mode2Up.test.js +0 -247
  339. package/tests/BookReader/Navbar/Navbar.test.js +0 -169
  340. package/tests/BookReader/PageContainer.test.js +0 -115
  341. package/tests/BookReader/ReduceSet.test.js +0 -38
  342. package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
  343. package/tests/BookReader/utils/classes.test.js +0 -88
  344. package/tests/BookReader/utils.test.js +0 -109
  345. package/tests/BookReader.options.test.js +0 -39
  346. package/tests/BookReader.test.js +0 -301
  347. package/tests/e2e/README.md +0 -75
  348. package/tests/e2e/autoplay.test.js +0 -13
  349. package/tests/e2e/base.test.js +0 -35
  350. package/tests/e2e/helpers/base.js +0 -258
  351. package/tests/e2e/helpers/debug.js +0 -13
  352. package/tests/e2e/helpers/desktopSearch.js +0 -72
  353. package/tests/e2e/helpers/mobileSearch.js +0 -85
  354. package/tests/e2e/helpers/mockSearch.js +0 -93
  355. package/tests/e2e/helpers/rightToLeft.js +0 -29
  356. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  357. package/tests/e2e/models/BookReader.js +0 -11
  358. package/tests/e2e/models/Navigation.js +0 -56
  359. package/tests/e2e/rightToLeft.test.js +0 -20
  360. package/tests/e2e/viewmode.test.js +0 -37
  361. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  362. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
  363. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
  364. package/tests/karma/BookNavigator/search-results.test.js +0 -240
  365. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  366. package/tests/karma/BookNavigator/volumes.test.js +0 -133
  367. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  368. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  369. package/tests/plugins/plugin.autoplay.test.js +0 -52
  370. package/tests/plugins/plugin.chapters.test.js +0 -130
  371. package/tests/plugins/plugin.iframe.test.js +0 -42
  372. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  373. package/tests/plugins/plugin.resume.test.js +0 -98
  374. package/tests/plugins/plugin.text_selection.test.js +0 -203
  375. package/tests/plugins/plugin.url.test.js +0 -129
  376. package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
  377. package/tests/plugins/search/plugin.search.test.js +0 -166
  378. package/tests/plugins/search/plugin.search.view.test.js +0 -106
  379. package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
  380. package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
  381. package/tests/plugins/tts/PageChunk.test.js +0 -57
  382. package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
  383. package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
  384. package/tests/plugins/tts/utils.test.js +0 -133
  385. package/tests/util/browserSniffing.test.js +0 -56
  386. package/tests/util/docCookies.test.js +0 -15
  387. package/tests/util/strings.test.js +0 -63
  388. package/tests/utils.js +0 -42
  389. package/webpack.config.js +0 -86
@@ -1,129 +0,0 @@
1
-
2
- import BookReader from '../../src/BookReader.js';
3
- import '../../src/plugins/plugin.url.js';
4
-
5
- let br;
6
- beforeAll(() => {
7
- document.body.innerHTML = '<div id="BookReader">';
8
- br = new BookReader();
9
- });
10
-
11
- afterEach(() => {
12
- jest.clearAllMocks();
13
- });
14
-
15
- describe('Plugin: URL controller', () => {
16
- test('has default option flag', () => {
17
- expect(BookReader.defaultOptions.enableUrlPlugin).toEqual(true);
18
- });
19
-
20
- test('adds url specific fields to BR', () => {
21
- const { defaultOptions } = BookReader;
22
- expect(defaultOptions).toHaveProperty('urlTrackIndex0');
23
- expect(defaultOptions).toHaveProperty('urlTrackedParams');
24
- expect(defaultOptions).toHaveProperty('urlHistoryBasePath');
25
- expect(defaultOptions).toHaveProperty('urlMode');
26
- expect(defaultOptions).toHaveProperty('updateWindowTitle');
27
- expect(defaultOptions).toHaveProperty('defaults');
28
- expect(defaultOptions).toHaveProperty('bookId');
29
- })
30
-
31
- test('has a whitelist of params that it tracks', () => {
32
- ['page', 'search', 'mode', 'region', 'highlight']
33
- const { defaultOptions: { urlTrackedParams } } = BookReader;
34
- expect(Array.isArray(urlTrackedParams)).toEqual(true);
35
- expect(urlTrackedParams.find(param => param === 'page')).toBeTruthy();
36
- expect(urlTrackedParams.find(param => param === 'search')).toBeTruthy();
37
- expect(urlTrackedParams.find(param => param === 'mode')).toBeTruthy();
38
- expect(urlTrackedParams.find(param => param === 'region')).toBeTruthy();
39
- expect(urlTrackedParams.find(param => param === 'highlight')).toBeTruthy();
40
- })
41
-
42
- test('initializes polling for url changes if using hash', () => {
43
- BookReader.prototype.urlStartLocationPolling = jest.fn();
44
- br.init();
45
-
46
- expect(br.urlStartLocationPolling).toHaveBeenCalled();
47
- });
48
-
49
- test('updates URL when index changes', () => {
50
- window.history.replaceState = jest.fn();
51
- BookReader.prototype.currentIndex = jest.fn(() => 1);
52
- BookReader.prototype.urlReadFragment = jest.fn(() => '/page/2/mode/1up');
53
- BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
54
- index: 88,
55
- mode: 1,
56
- search: ''
57
- }));
58
- br.options.urlMode = 'history';
59
- br.init();
60
- br.urlUpdateFragment();
61
-
62
- expect(window.history.replaceState).toHaveBeenCalled();
63
- })
64
-
65
- test('updates URL when mode changes', () => {
66
- window.history.replaceState = jest.fn();
67
- BookReader.prototype.currentIndex = jest.fn(() => 1);
68
- BookReader.prototype.urlReadFragment = jest.fn(() => '/page/2/mode/1up');
69
- BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
70
- index: 2,
71
- mode: 2,
72
- search: ''
73
- }));
74
- br.options.urlMode = 'history';
75
- br.init();
76
- br.urlUpdateFragment();
77
-
78
- expect(window.history.replaceState).toHaveBeenCalled();
79
- })
80
-
81
- test('updates URL when search changes', () => {
82
- window.history.replaceState = jest.fn();
83
- BookReader.prototype.currentIndex = jest.fn(() => 1);
84
- BookReader.prototype.urlReadFragment = jest.fn(() => '');
85
- BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
86
- index: 1,
87
- mode: 2,
88
- search: 'foo'
89
- }));
90
- BookReader.prototype.search = jest.fn();
91
- br.options.urlMode = 'history';
92
- br.init();
93
- br.urlUpdateFragment();
94
-
95
- expect(window.history.replaceState).toHaveBeenCalled();
96
- })
97
-
98
- test('does not update URL when search in query string', () => {
99
- window.history.replaceState = jest.fn();
100
- BookReader.prototype.currentIndex = jest.fn(() => 1);
101
- BookReader.prototype.urlReadFragment = jest.fn(() => 'mode/2up');
102
- BookReader.prototype.getLocationSearch = jest.fn(() => '?q=foo');
103
- BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
104
- index: 1,
105
- mode: 2,
106
- search: 'foo'
107
- }));
108
- BookReader.prototype.search = jest.fn();
109
- br.options.initialSearchTerm = 'foo';
110
- br.options.urlMode = 'history';
111
- br.init();
112
- br.urlUpdateFragment();
113
-
114
- expect(window.history.replaceState).toHaveBeenCalledTimes(0);
115
- })
116
-
117
- test('only q= param is selected from url query params', () => {
118
- const INTIAL_URL = "http://127.0.0.1:8080/BookReaderDemo/demo-internetarchive.html?ocaid=adventuresofoli00dick&q=foo"
119
- const result = br.urlParamsFiltersOnlySearch(INTIAL_URL);
120
- expect(result).toBe("?q=foo");
121
- })
122
-
123
- test('only q= param is selected from url query params with special character', () => {
124
- const INTIAL_URL = "http://127.0.0.1:8080/BookReaderDemo/demo-internetarchive.html?ocaid=adventuresofoli00dick&q=foo%24%24"
125
- const result = br.urlParamsFiltersOnlySearch(INTIAL_URL);
126
- expect(result).toBe("?q=foo%24%24");
127
- })
128
- });
129
-
@@ -1,65 +0,0 @@
1
-
2
- import BookReader from '../../src/BookReader.js';
3
- import * as util from '../../src/plugins/plugin.vendor-fullscreen.js';
4
-
5
- let br;
6
- beforeEach(() => {
7
- document.body.innerHTML = '<div id="BookReader">';
8
- br = new BookReader();
9
- br.init();
10
- });
11
-
12
- afterEach(() => {
13
- jest.clearAllMocks();
14
- });
15
-
16
- describe('Plugin: Vendor-fullscreen', () => {
17
- test('has option flag', () => {
18
- expect(BookReader.defaultOptions.enableVendorFullscreenPlugin).toEqual(true);
19
- });
20
-
21
- test('enterFullWindow will run when enter in Fullscreen mode', () => {
22
- const enterFullWindow = br.enterFullWindow;
23
- br.updateBrClasses = jest.fn();
24
- br.resize = jest.fn();
25
- br.init();
26
- br.enterFullWindow();
27
-
28
- expect(enterFullWindow).toBeTruthy();
29
-
30
- // br.isVendorFullscreenActive set to `true` when enterFullWindow Called
31
- expect(br.isVendorFullscreenActive).toEqual(true);
32
-
33
- // br.updateBrClasses trigger when enterFullWindow called
34
- expect(br.updateBrClasses).toHaveBeenCalledTimes(2);
35
-
36
- // br.resize trigger when enterFullWindow called
37
- expect(br.resize).toHaveBeenCalledTimes(1);
38
- });
39
-
40
- test('exitFullWindow will run when exit Fullscreen mode', () => {
41
- const exitFullWindow = br.exitFullWindow;
42
- br.updateBrClasses = jest.fn();
43
- br.init();
44
- br.exitFullWindow();
45
-
46
- expect(exitFullWindow).toBeTruthy();
47
-
48
- // br.isFullscreenActive set to `false` when exitFullWindow Called
49
- expect(br.isFullscreenActive).toEqual(false);
50
-
51
- // br.updateBrClasses trigger when exitFullWindow called
52
- expect(br.updateBrClasses).toHaveBeenCalledTimes(2);
53
- });
54
-
55
- test('isFullscreen returns true when fullscreen activated', () => {
56
- br.init();
57
- br.isVendorFullscreenActive = true;
58
- expect(br.isFullscreen).toBeTruthy();
59
- });
60
-
61
- test('util: isFullscreenActive', () => {
62
- document.fullscreenElement = true;
63
- expect(util.isFullscreenActive).toBeTruthy();
64
- });
65
- });
@@ -1,166 +0,0 @@
1
-
2
- import BookReader from '../../../src/BookReader.js';
3
- import '../../../src/plugins/plugin.mobile_nav.js';
4
- import '../../../src/plugins/search/plugin.search.js';
5
-
6
- jest.mock('../../../src/plugins/search/view.js');
7
-
8
- let br;
9
- const namespace = 'BookReader:';
10
- const triggeredEvents = () => {
11
- return $.fn.trigger.mock.calls.map((params) => {
12
- if (typeof params[0] === 'string') { return params[0]; }
13
- return params[0].type;
14
- });
15
- };
16
-
17
- beforeEach(() => {
18
- $.ajax = jest.fn().mockImplementation(() => {
19
- // return from:
20
- // `https://ia800304.us.archive.org/fulltext/inside.php?item_id=adventuresofoli00dick&doc=adventuresofoli00dick&path=/30/items/adventuresofoli00dick&q=child&callback=<serialized jQ CB>`
21
- return Promise.resolve({
22
- ia: "adventuresofoli00dick",
23
- q: "child",
24
- indexed: true,
25
- page_count: 644,
26
- body_length: 666,
27
- leaf0_missing: false,
28
- matches: [{
29
- text: 'For a long; time after it was ushered into this world of sorrow and trouble, by the parish surgeon, it remained a matter of considerable doubt wliether the {{{child}}} Avould survi^ e to bear any name at all; in which case it is somewhat more than probable that these memoirs would never have appeared; or, if they had, that being comprised within a couple of pages, they would have possessed the inestimable meiit of being the most concise and faithful specimen of biography, extant in the literature of any age or country.',
30
- par: [{
31
- boxes: [{r: 1221, b: 2121, t: 2075, page: 37, l: 1107}],
32
- b: 2535,
33
- t: 1942,
34
- page_width: 1790,
35
- r: 1598,
36
- l: 50,
37
- page_height: 2940,
38
- page: 37
39
- }]
40
- }]
41
- });
42
- });
43
-
44
- $.fn.trigger = jest.fn();
45
- document.body.innerHTML = '<div id="BookReader">';
46
- br = new BookReader();
47
- br.initToolbar = jest.fn();
48
- br.showProgressPopup = jest.fn();
49
- });
50
-
51
- afterEach(() => {
52
- jest.clearAllMocks();
53
- });
54
-
55
- describe('Plugin: Search', () => {
56
- test('has option flag', () => {
57
- expect(BookReader.defaultOptions.enableSearch).toEqual(true);
58
- });
59
-
60
- test('has added BR property: server', () => {
61
- expect(br).toHaveProperty('server');
62
- expect(br.server).toBeTruthy();
63
- });
64
-
65
- test('has added BR property: bookId', () => {
66
- expect(br).toHaveProperty('bookId');
67
- expect(br.bookId).toBeFalsy();
68
- });
69
-
70
- test('has added BR property: subPrefix', () => {
71
- expect(br).toHaveProperty('subPrefix');
72
- expect(br.subPrefix).toBeFalsy();
73
- });
74
-
75
- test('has added BR property: bookPath', () => {
76
- expect(br).toHaveProperty('bookPath');
77
- expect(br.bookPath).toBeFalsy();
78
- });
79
-
80
- test('has added BR property: searchInsideUrl', () => {
81
- expect(br).toHaveProperty('searchInsideUrl');
82
- expect(br.searchInsideUrl).toBeTruthy();
83
- });
84
-
85
- test('has added BR property: initialSearchTerm', () => {
86
- expect(br.options).toHaveProperty('initialSearchTerm');
87
- expect(br.options.initialSearchTerm).toBeFalsy();
88
- });
89
-
90
- test('On init, it loads the toolbar', () => {
91
- br.init();
92
- expect(br.initToolbar).toHaveBeenCalled();
93
- });
94
-
95
- test('On init, it will run a search if given `options.initialSearchTerm`', () => {
96
- br.search = jest.fn();
97
- br.options.initialSearchTerm = 'foo';
98
- br.init();
99
-
100
- expect(br.search).toHaveBeenCalled();
101
- expect(br.search.mock.calls[0][1])
102
- .toHaveProperty('goToFirstResult', true);
103
- expect(br.search.mock.calls[0][1])
104
- .toHaveProperty('suppressFragmentChange', true);
105
- });
106
-
107
- test('calling `search` fires ajax call`', () => {
108
- br.init();
109
- br.search('foo');
110
- expect($.ajax).toHaveBeenCalled();
111
- });
112
-
113
- test('SearchStarted event fires when search method called', () => {
114
- br.init();
115
- br.search('foo');
116
- expect(triggeredEvents()).toContain(`${namespace}SearchStarted`);
117
- });
118
-
119
- test('SearchCallback event fires when AJAX search returns results', () => {
120
- br.init();
121
- const dfd = br.search('foo');
122
- return dfd.then(() => {
123
- expect(triggeredEvents()).toContain(`${namespace}SearchCallback`);
124
- });
125
- });
126
-
127
- test('SearchCallbackError event fires when AJAX search returns error', () => {
128
- $.ajax = jest.fn().mockImplementation(() => {
129
- return Promise.resolve({
130
- error: true,
131
- });
132
- });
133
- br.init();
134
- const dfd = br.search('foo');
135
- return dfd.then(() => {
136
- expect(triggeredEvents()).toContain(`${namespace}SearchCallbackError`);
137
- });
138
- });
139
-
140
- test('SearchCallbackNotIndexed event fires when AJAX search returns false indexed value', () => {
141
- $.ajax = jest.fn().mockImplementation(() => {
142
- return Promise.resolve({
143
- matches: [],
144
- indexed: false,
145
- });
146
- });
147
- br.init();
148
- const dfd = br.search('foo');
149
- return dfd.then(() => {
150
- expect(triggeredEvents()).toContain(`${namespace}SearchCallbackBookNotIndexed`);
151
- });
152
- });
153
-
154
- test('SearchCallbackEmpty event fires when AJAX search returns no matches', () => {
155
- $.ajax = jest.fn().mockImplementation(() => {
156
- return Promise.resolve({
157
- matches: [],
158
- });
159
- });
160
- br.init();
161
- const dfd = br.search('foo');
162
- return dfd.then(() => {
163
- expect(triggeredEvents()).toContain(`${namespace}SearchCallbackEmpty`);
164
- });
165
- });
166
- });
@@ -1,106 +0,0 @@
1
-
2
- import BookReader from '../../../src/BookReader.js';
3
- import '../../../src/plugins/plugin.mobile_nav.js';
4
- import '../../../src/plugins/search/plugin.search.js';
5
- import '../../../src/plugins/search/view.js';
6
-
7
- let br;
8
- const namespace = 'BookReader:';
9
- const results = {
10
- ia: "adventuresofoli00dick",
11
- q: "child",
12
- indexed: true,
13
- page_count: 644,
14
- body_length: 666,
15
- leaf0_missing: false,
16
- matches: [{
17
- text: 'For a long; time after it was ushered into this world of sorrow and trouble, by the parish surgeon, it remained a matter of considerable doubt wliether the {{{child}}} Avould survi^ e to bear any name at all; in which case it is somewhat more than probable that these memoirs would never have appeared; or, if they had, that being comprised within a couple of pages, they would have possessed the inestimable meiit of being the most concise and faithful specimen of biography, extant in the literature of any age or country.',
18
- par: [{
19
- boxes: [{r: 1221, b: 2121, t: 2075, page: 37, l: 1107}],
20
- b: 2535,
21
- t: 1942,
22
- page_width: 1790,
23
- r: 1598,
24
- l: 50,
25
- page_height: 2940,
26
- page: 37
27
- }]
28
- }]
29
- };
30
- beforeEach(() => {
31
- $.ajax = jest.fn().mockImplementation(() => {
32
- // return from:
33
- // `https://ia800304.us.archive.org/fulltext/inside.php?item_id=adventuresofoli00dick&doc=adventuresofoli00dick&path=/30/items/adventuresofoli00dick&q=child&callback=<serialized jQ CB>`
34
- return Promise.resolve(results);
35
- });
36
-
37
- $.fn.trigger = jest.fn();
38
- document.body.innerHTML = '<div id="BookReader">';
39
- br = new BookReader();
40
- br.initToolbar = jest.fn();
41
- br.showProgressPopup = jest.fn();
42
- });
43
-
44
- afterEach(() => {
45
- jest.clearAllMocks();
46
- });
47
-
48
- describe('View: Plugin: Search', () => {
49
- test('When search runs, the view gets created.', () => {
50
- br.search = jest.fn();
51
- br.options.initialSearchTerm = 'foo';
52
- br.init();
53
-
54
- expect(br.searchView).toBeDefined();
55
- expect(br.searchView.handleSearchCallback).toBeDefined();
56
- });
57
-
58
- describe("Search results navigation bar", () => {
59
- test('Search Results callback creates the results nav', () => {
60
- br.init();
61
- const event = new CustomEvent(`${namespace}SearchCallback`);
62
- const options = { goToFirstResult: false };
63
-
64
- expect(br.searchView.dom.searchNavigation).toBeUndefined();
65
-
66
- br.searchView.handleSearchCallback(event, { results, options})
67
- expect(br.searchView.dom.searchNavigation).toBeDefined();
68
- });
69
- test('has controls', () => {
70
- br.init();
71
- const event = new CustomEvent(`${namespace}SearchCallback`);
72
- const options = { goToFirstResult: false };
73
- br.searchView.handleSearchCallback(event, { results, options})
74
-
75
- const searchResultsNav = document.querySelector('.BRsearch-navigation');
76
- expect(searchResultsNav).toBeDefined();
77
-
78
- expect(searchResultsNav.querySelectorAll('button').length).toEqual(4);
79
- expect(searchResultsNav.querySelector('.clear')).toBeDefined();
80
- expect(searchResultsNav.querySelector('.toggle-sidebar')).toBeDefined();
81
- expect(searchResultsNav.querySelector('.prev')).toBeDefined();
82
- expect(searchResultsNav.querySelector('.next')).toBeDefined();
83
- });
84
-
85
- describe('Click events handlers', () => {
86
- it('triggers custom event when toggling side menu', () => {
87
- br.init();
88
- let eventNameTriggered = '';
89
- br.trigger = (eventName) => eventNameTriggered = eventName;
90
-
91
- expect(eventNameTriggered).toBeFalsy();
92
- br.searchView.toggleSidebar();
93
- expect(eventNameTriggered).toEqual('ToggleSearchMenu');
94
- });
95
- it('triggers custom event when closing navbar', () => {
96
- br.init();
97
- let eventNameTriggered = '';
98
- br.trigger = (eventName) => eventNameTriggered = eventName;
99
-
100
- expect(eventNameTriggered).toBeFalsy();
101
- br.searchView.clearSearchFieldAndResults();
102
- expect(eventNameTriggered).toEqual('SearchResultsCleared');
103
- });
104
- });
105
- });
106
- });
@@ -1,153 +0,0 @@
1
- import sinon from 'sinon';
2
- import { afterEventLoop } from '../../utils.js';
3
- import AbstractTTSEngine from '../../../src/plugins/tts/AbstractTTSEngine.js';
4
- import PageChunkIterator from '../../../src/plugins/tts/PageChunkIterator.js';
5
- /** @typedef {import('../../../src/plugins/tts/AbstractTTSEngine.js').TTSEngineOptions} TTSEngineOptions */
6
-
7
- // Skipping because it's flaky. Fix in #672
8
- describe.skip('AbstractTTSEngine', () => {
9
- test('stops playing once done', () => {
10
- class DummyEngine extends AbstractTTSEngine {
11
- getVoices() { return []; }
12
- }
13
- const d = new DummyEngine(DUMMY_TTS_ENGINE_OPTS);
14
- d._chunkIterator = { next: sinon.stub().resolves(PageChunkIterator.AT_END) };
15
- const stopStub = sinon.stub(d, 'stop');
16
- expect(stopStub.callCount).toBe(0);
17
- d.step();
18
- return afterEventLoop()
19
- .then(() => expect(stopStub.callCount).toBe(1));
20
- });
21
- });
22
-
23
- for (const dummyVoice of [dummyVoice, dummyVoiceUnderscores]) {
24
- describe(`getBestBookVoice with BCP47 ${dummyVoice == dummyVoiceUnderscores ? '+' : '-'} underscores`, () => {
25
- const { getBestBookVoice } = AbstractTTSEngine;
26
-
27
- test('undefined if no voices', () => {
28
- expect(getBestBookVoice([], 'en', [])).toBe(undefined);
29
- });
30
-
31
- test('returns first voice if no matching', () => {
32
- const enVoice = dummyVoice({lang: "en-US"});
33
- expect(getBestBookVoice([enVoice], 'fr', [])).toBe(enVoice);
34
- });
35
-
36
- test('choose first matching voice', () => {
37
- const voices = [
38
- dummyVoice({lang: "en-GB"}),
39
- dummyVoice({lang: "en-US"}),
40
- ];
41
- expect(getBestBookVoice(voices, 'en', [])).toBe(voices[0]);
42
- });
43
-
44
- test('choose first matching default voice', () => {
45
- const voices = [
46
- dummyVoice({lang: "en-GB"}),
47
- dummyVoice({lang: "en-US", default: true}),
48
- ];
49
- expect(getBestBookVoice(voices, 'en', [])).toBe(voices[1]);
50
- });
51
-
52
- test('does not choose default if better language match exists', () => {
53
- const voices = [
54
- dummyVoice({lang: "en-US", default: true}),
55
- dummyVoice({lang: "fr-FR"}),
56
- ];
57
- expect(getBestBookVoice(voices, 'fr', [])).toBe(voices[1]);
58
- });
59
-
60
- test('choose users dialect if present', () => {
61
- const voices = [
62
- dummyVoice({lang: "en-GB"}),
63
- dummyVoice({lang: "en-CA"}),
64
- dummyVoice({lang: "en-US"}),
65
- ];
66
- expect(getBestBookVoice(voices, 'en', ['en-CA', 'en'])).toBe(voices[1]);
67
- });
68
-
69
- test('choose users dialect even if not default', () => {
70
- const voices = [
71
- dummyVoice({lang: "en-US", default: true}),
72
- dummyVoice({lang: "en-GB"}),
73
- dummyVoice({lang: "en-CA"}),
74
- ];
75
- expect(getBestBookVoice(voices, 'en', ['en-CA', 'en'])).toBe(voices[2]);
76
- });
77
-
78
- test('choose language even if dialect does not match', () => {
79
- const voices = [
80
- dummyVoice({lang: "en-GB"}),
81
- ];
82
- expect(getBestBookVoice(voices, 'en', ['en-CA'])).toBe(voices[0]);
83
- });
84
-
85
- test('real world example', () => {
86
- // Chrome 77 @ Windows 10
87
- const voices = [
88
- { default: true, lang: "en-US", name: "Microsoft David Desktop - English (United States)", localService: true, voiceURI: "Microsoft David Desktop - English (United States)" },
89
- { default: false, lang: "de-DE", name: "Microsoft Hedda Desktop - German", localService: true, voiceURI: "Microsoft Hedda Desktop - German" },
90
- { default: false, lang: "en-US", name: "Microsoft Zira Desktop - English (United States)", localService: true, voiceURI: "Microsoft Zira Desktop - English (United States)" },
91
- { default: false, lang: "de-DE", name: "Google Deutsch", localService: false, voiceURI: "Google Deutsch" },
92
- { default: false, lang: "en-US", name: "Google US English", localService: false, voiceURI: "Google US English" },
93
- { default: false, lang: "en-GB", name: "Google UK English Female", localService: false, voiceURI: "Google UK English Female" },
94
- { default: false, lang: "en-GB", name: "Google UK English Male", localService: false, voiceURI: "Google UK English Male" },
95
- { default: false, lang: "es-ES", name: "Google español", localService: false, voiceURI: "Google español" },
96
- { default: false, lang: "es-US", name: "Google español de Estados Unidos", localService: false, voiceURI: "Google español de Estados Unidos" },
97
- { default: false, lang: "fr-FR", name: "Google français", localService: false, voiceURI: "Google français" },
98
- { default: false, lang: "hi-IN", name: "Google हिन्दी", localService: false, voiceURI: "Google हिन्दी" },
99
- { default: false, lang: "id-ID", name: "Google Bahasa Indonesia", localService: false, voiceURI: "Google Bahasa Indonesia" },
100
- { default: false, lang: "it-IT", name: "Google italiano", localService: false, voiceURI: "Google italiano" },
101
- { default: false, lang: "ja-JP", name: "Google 日本語", localService: false, voiceURI: "Google 日本語" },
102
- { default: false, lang: "ko-KR", name: "Google 한국의", localService: false, voiceURI: "Google 한국의" },
103
- { default: false, lang: "nl-NL", name: "Google Nederlands", localService: false, voiceURI: "Google Nederlands" },
104
- { default: false, lang: "pl-PL", name: "Google polski", localService: false, voiceURI: "Google polski" },
105
- { default: false, lang: "pt-BR", name: "Google português do Brasil", localService: false, voiceURI: "Google português do Brasil" },
106
- { default: false, lang: "ru-RU", name: "Google русский", localService: false, voiceURI: "Google русский" },
107
- { default: false, lang: "zh-CN", name: "Google 普通话(中国大陆)", localService: false, voiceURI: "Google 普通话(中国大陆)" },
108
- { default: false, lang: "zh-HK", name: "Google 粤語(香港)", localService: false, voiceURI: "Google 粤語(香港)" },
109
- { default: false, lang: "zh-TW", name: "Google 國語(臺灣)", localService: false, voiceURI: "Google 國語(臺灣)" }
110
- ];
111
-
112
- expect(getBestBookVoice(voices, 'en', ['en-CA', 'en'])).toBe(voices[0]);
113
- });
114
- });
115
- }
116
-
117
- /** @type {TTSEngineOptions} */
118
- export const DUMMY_TTS_ENGINE_OPTS = {
119
- server: 'blah',
120
- bookPath: 'blah',
121
- bookLanguage: 'blah',
122
- onLoadingStart() {},
123
- onLoadingComplete() {},
124
- onDone() {},
125
- beforeChunkPlay() { return Promise.resolve(); },
126
- afterChunkPlay() {},
127
- };
128
-
129
- /**
130
- * @param {SpeechSynthesisVoice}
131
- * @return {SpeechSynthesisVoice}
132
- **/
133
- function dummyVoice(overrides) {
134
- return Object.assign({
135
- default: false,
136
- lang: "en-US",
137
- name: "Microsoft David",
138
- localService: false,
139
- voiceURI: "",
140
- }, overrides);
141
- }
142
-
143
- /**
144
- * Construct a voice-like object using underscores instead of hyphenes
145
- * (Like Chrome/Android)
146
- * @param {SpeechSynthesisVoice}
147
- * @return {SpeechSynthesisVoice}
148
- **/
149
- function dummyVoiceUnderscores(overrides) {
150
- const voice = dummyVoice(overrides);
151
- voice.lang = voice.lang.replace('-', '_');
152
- return voice;
153
- }
@@ -1,59 +0,0 @@
1
- import FestivalTTSEngine from '../../../src/plugins/tts/FestivalTTSEngine.js';
2
- import sinon from 'sinon';
3
- import { afterEventLoop } from '../../utils.js';
4
- import { DUMMY_TTS_ENGINE_OPTS } from './AbstractTTSEngine.test.js';
5
- import PageChunk from '../../../src/plugins/tts/PageChunk.js';
6
- import PageChunkIterator from '../../../src/plugins/tts/PageChunkIterator.js';
7
- /** @typedef {import('../../../src/plugins/tts/AbstractTTSEngine.js').TTSEngineOptions} TTSEngineOptions */
8
-
9
- describe('iOSCaptureUserIntentHack', () => {
10
- test('synchronously calls createSound/play to capture user intent', () => {
11
- const mockSound = createMockSound();
12
- const sm = {
13
- supported: sinon.stub().returns(true),
14
- createSound: sinon.stub().returns(mockSound),
15
- };
16
- window.soundManager = sm;
17
- const engine = new FestivalTTSEngine(DUMMY_TTS_ENGINE_OPTS);
18
- engine.iOSCaptureUserIntentHack();
19
-
20
- expect(sm.createSound.callCount).toBe(1);
21
- expect(mockSound.play.callCount).toBe(1);
22
- });
23
- });
24
-
25
- describe('misc', () => {
26
- test('starts playing even if onload not called until play starts', async () => {
27
- const sm = {
28
- supported: sinon.stub().returns(true),
29
- createSound: sinon.stub().returns(createMockSound()),
30
- stopAll: sinon.stub(),
31
- };
32
- window.soundManager = sm;
33
- const engine = new FestivalTTSEngine(DUMMY_TTS_ENGINE_OPTS);
34
- sinon.stub(engine, 'playSound').returns(new Promise(() => {}));
35
- sinon.stub(engine, 'stop');
36
- sinon.stub(PageChunkIterator.prototype, '_fetchPageChunks').resolves([dummyPageChunk()]);
37
- engine.start(0, 5);
38
-
39
- // because things happen in callbacks, need to run code at end of the JS event loop
40
- await afterEventLoop();
41
- expect(sm.createSound.callCount).toBe(1);
42
- expect(PageChunkIterator.prototype._fetchPageChunks.callCount).toBeGreaterThanOrEqual(1);
43
- expect(engine.playSound.callCount).toBe(1);
44
- });
45
- });
46
-
47
- /** @returns {SMSound} */
48
- function createMockSound() {
49
- return {
50
- load: sinon.stub(),
51
- play: sinon.stub(),
52
- destruct: sinon.stub(),
53
- };
54
- }
55
-
56
- /** @return {PageChunk} */
57
- function dummyPageChunk() {
58
- return new PageChunk(0, 0, 'Once upon a time', []);
59
- }