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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (391) hide show
  1. package/.eslintrc.js +17 -5
  2. package/.github/dependabot.yml +8 -0
  3. package/.github/workflows/node.js.yml +10 -1
  4. package/.husky/_/husky.sh +30 -0
  5. package/.testcaferc.js +10 -0
  6. package/BookReader/BookReader.css +75 -323
  7. package/BookReader/BookReader.js +32261 -2
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +15235 -0
  10. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  11. package/BookReader/icons/close-circle-dark.svg +1 -0
  12. package/BookReader/icons/voice.svg +1 -0
  13. package/BookReader/jquery-1.10.1.js +108 -2
  14. package/BookReader/plugins/plugin.archive_analytics.js +170 -1
  15. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  16. package/BookReader/plugins/plugin.autoplay.js +163 -1
  17. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  18. package/BookReader/plugins/plugin.chapters.js +333 -1
  19. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  20. package/BookReader/plugins/plugin.iframe.js +72 -1
  21. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  22. package/BookReader/plugins/plugin.mobile_nav.js +332 -1
  23. package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
  24. package/BookReader/plugins/plugin.resume.js +241 -1
  25. package/BookReader/plugins/plugin.resume.js.map +1 -1
  26. package/BookReader/plugins/plugin.search.js +1261 -1
  27. package/BookReader/plugins/plugin.search.js.map +1 -1
  28. package/BookReader/plugins/plugin.text_selection.js +839 -1
  29. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  30. package/BookReader/plugins/plugin.tts.js +9115 -2
  31. package/BookReader/plugins/plugin.tts.js.map +1 -1
  32. package/BookReader/plugins/plugin.url.js +811 -1
  33. package/BookReader/plugins/plugin.url.js.map +1 -1
  34. package/BookReader/plugins/plugin.vendor-fullscreen.js +326 -1
  35. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  36. package/BookReader/webcomponents-bundle.js +412 -0
  37. package/BookReader/webcomponents-bundle.js.map +1 -0
  38. package/BookReaderDemo/BookReaderDemo.css +14 -1
  39. package/BookReaderDemo/IADemoBr.js +107 -0
  40. package/BookReaderDemo/demo-advanced.html +1 -1
  41. package/BookReaderDemo/demo-autoplay.html +1 -0
  42. package/BookReaderDemo/demo-embed-iframe-src.html +1 -0
  43. package/BookReaderDemo/demo-fullscreen-mobile.html +1 -0
  44. package/BookReaderDemo/demo-fullscreen.html +1 -0
  45. package/BookReaderDemo/demo-iiif.html +1 -0
  46. package/BookReaderDemo/demo-internetarchive.html +66 -18
  47. package/BookReaderDemo/demo-multiple.html +1 -0
  48. package/BookReaderDemo/demo-preview-pages.html +1 -0
  49. package/BookReaderDemo/demo-simple.html +1 -0
  50. package/BookReaderDemo/demo-vendor-fullscreen.html +1 -0
  51. package/BookReaderDemo/immersion-1up.html +1 -0
  52. package/BookReaderDemo/immersion-mode.html +1 -0
  53. package/BookReaderDemo/toggle_controls.html +1 -0
  54. package/BookReaderDemo/view_mode.html +1 -0
  55. package/BookReaderDemo/viewmode-cycle.html +1 -2
  56. package/CHANGELOG.md +114 -0
  57. package/babel.config.js +18 -0
  58. package/index.html +3 -0
  59. package/jsconfig.json +19 -0
  60. package/package.json +45 -27
  61. package/src/BookNavigator/assets/button-base.js +8 -1
  62. package/src/BookNavigator/assets/ia-logo.js +17 -0
  63. package/src/BookNavigator/assets/icon_sort_asc.js +5 -0
  64. package/src/BookNavigator/assets/icon_sort_desc.js +5 -0
  65. package/src/BookNavigator/assets/icon_sort_neutral.js +5 -0
  66. package/src/BookNavigator/assets/icon_volumes.js +11 -0
  67. package/src/BookNavigator/book-navigator.js +528 -0
  68. package/src/BookNavigator/bookmarks/bookmark-button.js +2 -1
  69. package/src/BookNavigator/bookmarks/bookmark-edit.js +2 -1
  70. package/src/BookNavigator/bookmarks/bookmarks-list.js +1 -0
  71. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +4 -9
  72. package/src/BookNavigator/bookmarks/bookmarks-provider.js +32 -11
  73. package/src/BookNavigator/bookmarks/ia-bookmarks.js +88 -43
  74. package/src/BookNavigator/downloads/downloads-provider.js +22 -16
  75. package/src/BookNavigator/downloads/downloads.js +16 -23
  76. package/src/BookNavigator/search/a-search-result.js +1 -0
  77. package/src/BookNavigator/search/search-provider.js +54 -20
  78. package/src/BookNavigator/search/search-results.js +7 -18
  79. package/src/BookNavigator/sharing.js +27 -0
  80. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +10 -12
  81. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +1 -0
  82. package/src/BookNavigator/volumes/volumes-provider.js +114 -0
  83. package/src/BookNavigator/volumes/volumes.js +189 -0
  84. package/src/BookReader/DebugConsole.js +3 -3
  85. package/src/BookReader/DragScrollable.js +233 -0
  86. package/src/BookReader/Mode1Up.js +50 -351
  87. package/src/BookReader/Mode1UpLit.js +434 -0
  88. package/src/BookReader/Mode2Up.js +94 -72
  89. package/src/BookReader/ModeSmoothZoom.js +177 -0
  90. package/src/BookReader/ModeThumb.js +16 -8
  91. package/src/BookReader/Navbar/Navbar.js +2 -31
  92. package/src/BookReader/PageContainer.js +47 -2
  93. package/src/BookReader/ReduceSet.js +1 -1
  94. package/src/BookReader/Toolbar/Toolbar.js +5 -5
  95. package/src/BookReader/options.js +10 -0
  96. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  97. package/src/BookReader/utils.js +68 -13
  98. package/src/BookReader.js +316 -232
  99. package/src/assets/icons/close-circle-dark.svg +1 -0
  100. package/src/assets/icons/voice.svg +1 -0
  101. package/src/css/BookReader.scss +0 -12
  102. package/src/css/_BRComponent.scss +1 -1
  103. package/src/css/_BRmain.scss +19 -24
  104. package/src/css/_BRnav.scss +4 -26
  105. package/src/css/_BRpages.scss +35 -0
  106. package/src/css/_BRsearch.scss +11 -215
  107. package/src/css/_TextSelection.scss +1 -17
  108. package/src/css/_controls.scss +16 -3
  109. package/src/css/_icons.scss +6 -0
  110. package/src/ia-bookreader/ia-bookreader.js +206 -0
  111. package/src/plugins/plugin.chapters.js +15 -18
  112. package/src/plugins/plugin.mobile_nav.js +11 -10
  113. package/src/plugins/plugin.resume.js +3 -3
  114. package/src/plugins/plugin.text_selection.js +17 -29
  115. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  116. package/src/plugins/search/plugin.search.js +113 -104
  117. package/src/plugins/search/view.js +48 -163
  118. package/src/plugins/tts/AbstractTTSEngine.js +7 -0
  119. package/src/plugins/tts/FestivalTTSEngine.js +2 -2
  120. package/src/plugins/tts/WebTTSEngine.js +5 -0
  121. package/src/plugins/tts/plugin.tts.js +67 -102
  122. package/src/plugins/url/UrlPlugin.js +184 -0
  123. package/src/plugins/url/plugin.url.js +220 -0
  124. package/{src → stat}/BookNavigator/BookModel.js +0 -0
  125. package/{src → stat}/BookNavigator/BookNavigator.js +151 -104
  126. package/stat/BookNavigator/assets/bookmark-colors.js +15 -0
  127. package/stat/BookNavigator/assets/button-base.js +61 -0
  128. package/stat/BookNavigator/assets/ia-logo.js +17 -0
  129. package/stat/BookNavigator/assets/icon_checkmark.js +6 -0
  130. package/stat/BookNavigator/assets/icon_close.js +3 -0
  131. package/stat/BookNavigator/assets/icon_sort_asc.js +5 -0
  132. package/stat/BookNavigator/assets/icon_sort_desc.js +5 -0
  133. package/stat/BookNavigator/assets/icon_sort_neutral.js +5 -0
  134. package/stat/BookNavigator/assets/icon_volumes.js +11 -0
  135. package/stat/BookNavigator/bookmarks/bookmark-button.js +64 -0
  136. package/stat/BookNavigator/bookmarks/bookmark-edit.js +215 -0
  137. package/stat/BookNavigator/bookmarks/bookmarks-list.js +285 -0
  138. package/stat/BookNavigator/bookmarks/bookmarks-loginCTA.js +28 -0
  139. package/stat/BookNavigator/bookmarks/bookmarks-provider.js +56 -0
  140. package/stat/BookNavigator/bookmarks/ia-bookmarks.js +523 -0
  141. package/{src → stat}/BookNavigator/br-fullscreen-mgr.js +1 -2
  142. package/stat/BookNavigator/delete-modal-actions.js +49 -0
  143. package/stat/BookNavigator/downloads/downloads-provider.js +72 -0
  144. package/stat/BookNavigator/downloads/downloads.js +139 -0
  145. package/stat/BookNavigator/provider-config.js +0 -0
  146. package/stat/BookNavigator/search/a-search-result.js +55 -0
  147. package/stat/BookNavigator/search/search-provider.js +180 -0
  148. package/stat/BookNavigator/search/search-results.js +360 -0
  149. package/stat/BookNavigator/sharing.js +31 -0
  150. package/stat/BookNavigator/visual-adjustments/visual-adjustments-provider.js +94 -0
  151. package/stat/BookNavigator/visual-adjustments/visual-adjustments.js +280 -0
  152. package/stat/BookNavigator/volumes/volumes-provider.js +83 -0
  153. package/stat/BookNavigator/volumes/volumes.js +178 -0
  154. package/stat/BookReader/BookModel.js +518 -0
  155. package/stat/BookReader/DebugConsole.js +54 -0
  156. package/stat/BookReader/DragScrollable.js +233 -0
  157. package/stat/BookReader/ImageCache.js +116 -0
  158. package/stat/BookReader/Mode1Up.js +102 -0
  159. package/stat/BookReader/Mode1UpLit.js +434 -0
  160. package/stat/BookReader/Mode2Up.js +1372 -0
  161. package/stat/BookReader/ModeSmoothZoom.js +177 -0
  162. package/stat/BookReader/ModeThumb.js +344 -0
  163. package/stat/BookReader/Navbar/Navbar.js +310 -0
  164. package/stat/BookReader/PageContainer.js +120 -0
  165. package/stat/BookReader/ReduceSet.js +26 -0
  166. package/stat/BookReader/Toolbar/Toolbar.js +384 -0
  167. package/stat/BookReader/events.js +20 -0
  168. package/stat/BookReader/options.js +324 -0
  169. package/stat/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  170. package/stat/BookReader/utils/classes.js +36 -0
  171. package/stat/BookReader/utils.js +240 -0
  172. package/stat/BookReader.js +2550 -0
  173. package/{src → stat}/BookReaderComponent/BookReaderComponent.js +16 -11
  174. package/stat/assets/icons/1up.svg +12 -0
  175. package/stat/assets/icons/2up.svg +15 -0
  176. package/stat/assets/icons/advance.svg +26 -0
  177. package/stat/assets/icons/chevron-right.svg +1 -0
  178. package/stat/assets/icons/close-circle-dark.svg +1 -0
  179. package/stat/assets/icons/close-circle.svg +1 -0
  180. package/stat/assets/icons/fullscreen.svg +17 -0
  181. package/stat/assets/icons/fullscreen_exit.svg +17 -0
  182. package/stat/assets/icons/hamburger.svg +15 -0
  183. package/stat/assets/icons/left-arrow.svg +12 -0
  184. package/stat/assets/icons/magnify-minus.svg +16 -0
  185. package/stat/assets/icons/magnify-plus.svg +17 -0
  186. package/stat/assets/icons/magnify.svg +15 -0
  187. package/stat/assets/icons/pause.svg +23 -0
  188. package/stat/assets/icons/play.svg +22 -0
  189. package/stat/assets/icons/playback-speed.svg +34 -0
  190. package/stat/assets/icons/read-aloud.svg +22 -0
  191. package/stat/assets/icons/review.svg +22 -0
  192. package/stat/assets/icons/thumbnails.svg +17 -0
  193. package/stat/assets/icons/voice.svg +1 -0
  194. package/stat/assets/icons/volume-full.svg +22 -0
  195. package/stat/assets/images/BRicons.png +0 -0
  196. package/stat/assets/images/BRicons.svg +94 -0
  197. package/stat/assets/images/BRicons_ia.png +0 -0
  198. package/stat/assets/images/back_pages.png +0 -0
  199. package/stat/assets/images/book_bottom_icon.png +0 -0
  200. package/stat/assets/images/book_down_icon.png +0 -0
  201. package/stat/assets/images/book_left_icon.png +0 -0
  202. package/stat/assets/images/book_leftmost_icon.png +0 -0
  203. package/stat/assets/images/book_right_icon.png +0 -0
  204. package/stat/assets/images/book_rightmost_icon.png +0 -0
  205. package/stat/assets/images/book_top_icon.png +0 -0
  206. package/stat/assets/images/book_up_icon.png +0 -0
  207. package/stat/assets/images/books_graphic.svg +177 -0
  208. package/stat/assets/images/booksplit.png +0 -0
  209. package/stat/assets/images/control_pause_icon.png +0 -0
  210. package/stat/assets/images/control_play_icon.png +0 -0
  211. package/stat/assets/images/embed_icon.png +0 -0
  212. package/stat/assets/images/icon-home-ia.png +0 -0
  213. package/stat/assets/images/icon_OL-logo-xs.png +0 -0
  214. package/stat/assets/images/icon_alert-xs.png +0 -0
  215. package/stat/assets/images/icon_book.svg +12 -0
  216. package/stat/assets/images/icon_bookmark.svg +12 -0
  217. package/stat/assets/images/icon_close-pop.png +0 -0
  218. package/stat/assets/images/icon_download.png +0 -0
  219. package/stat/assets/images/icon_gear.svg +14 -0
  220. package/stat/assets/images/icon_hamburger.svg +20 -0
  221. package/stat/assets/images/icon_home.png +0 -0
  222. package/stat/assets/images/icon_home.svg +21 -0
  223. package/stat/assets/images/icon_home_ia.png +0 -0
  224. package/stat/assets/images/icon_indicator.png +0 -0
  225. package/stat/assets/images/icon_info.svg +11 -0
  226. package/stat/assets/images/icon_one_page.svg +8 -0
  227. package/stat/assets/images/icon_pause.svg +1 -0
  228. package/stat/assets/images/icon_play.svg +1 -0
  229. package/stat/assets/images/icon_playback-rate.svg +15 -0
  230. package/stat/assets/images/icon_return.png +0 -0
  231. package/stat/assets/images/icon_search_button.svg +8 -0
  232. package/stat/assets/images/icon_share.svg +9 -0
  233. package/stat/assets/images/icon_skip-ahead.svg +6 -0
  234. package/stat/assets/images/icon_skip-back.svg +13 -0
  235. package/stat/assets/images/icon_speaker.svg +18 -0
  236. package/stat/assets/images/icon_speaker_open.svg +10 -0
  237. package/stat/assets/images/icon_thumbnails.svg +12 -0
  238. package/stat/assets/images/icon_toc.svg +5 -0
  239. package/stat/assets/images/icon_two_pages.svg +9 -0
  240. package/stat/assets/images/icon_zoomer.png +0 -0
  241. package/stat/assets/images/loading.gif +0 -0
  242. package/stat/assets/images/logo_icon.png +0 -0
  243. package/stat/assets/images/marker_chap-off.png +0 -0
  244. package/stat/assets/images/marker_chap-off.svg +11 -0
  245. package/stat/assets/images/marker_chap-off_ia.png +0 -0
  246. package/stat/assets/images/marker_chap-on.png +0 -0
  247. package/stat/assets/images/marker_chap-on.svg +11 -0
  248. package/stat/assets/images/marker_srch-on.svg +11 -0
  249. package/stat/assets/images/marker_srchchap-off.png +0 -0
  250. package/stat/assets/images/marker_srchchap-on.png +0 -0
  251. package/stat/assets/images/nav_control-dn.png +0 -0
  252. package/stat/assets/images/nav_control-dn_ia.png +0 -0
  253. package/stat/assets/images/nav_control-up.png +0 -0
  254. package/stat/assets/images/nav_control-up_ia.png +0 -0
  255. package/stat/assets/images/nav_control.png +0 -0
  256. package/stat/assets/images/one_page_mode_icon.png +0 -0
  257. package/stat/assets/images/paper-badge.png +0 -0
  258. package/stat/assets/images/print_icon.png +0 -0
  259. package/stat/assets/images/progressbar.gif +0 -0
  260. package/stat/assets/images/right_edges.png +0 -0
  261. package/stat/assets/images/slider.png +0 -0
  262. package/stat/assets/images/slider_ia.png +0 -0
  263. package/stat/assets/images/thumbnail_mode_icon.png +0 -0
  264. package/stat/assets/images/transparent.png +0 -0
  265. package/stat/assets/images/two_page_mode_icon.png +0 -0
  266. package/stat/assets/images/zoom_in_icon.png +0 -0
  267. package/stat/assets/images/zoom_out_icon.png +0 -0
  268. package/stat/css/BookReader.scss +89 -0
  269. package/stat/css/_BRBookmarks.scss +29 -0
  270. package/stat/css/_BRComponent.scss +13 -0
  271. package/stat/css/_BRfloat.scss +197 -0
  272. package/stat/css/_BRicon.scss +48 -0
  273. package/stat/css/_BRmain.scss +251 -0
  274. package/stat/css/_BRnav.scss +359 -0
  275. package/stat/css/_BRpages.scss +139 -0
  276. package/stat/css/_BRsearch.scss +226 -0
  277. package/stat/css/_BRtoolbar.scss +84 -0
  278. package/stat/css/_BRvendor.scss +5 -0
  279. package/stat/css/_MobileNav.scss +194 -0
  280. package/stat/css/_TextSelection.scss +32 -0
  281. package/stat/css/_colorbox.scss +52 -0
  282. package/stat/css/_controls.scss +253 -0
  283. package/stat/css/_icons.scss +121 -0
  284. package/stat/jquery-wrapper.js +4 -0
  285. package/stat/plugins/plugin.archive_analytics.js +86 -0
  286. package/stat/plugins/plugin.autoplay.js +129 -0
  287. package/stat/plugins/plugin.chapters.js +248 -0
  288. package/stat/plugins/plugin.iframe.js +48 -0
  289. package/stat/plugins/plugin.mobile_nav.js +288 -0
  290. package/stat/plugins/plugin.resume.js +68 -0
  291. package/stat/plugins/plugin.text_selection.js +291 -0
  292. package/{src → stat}/plugins/plugin.url.js +4 -4
  293. package/stat/plugins/plugin.vendor-fullscreen.js +247 -0
  294. package/stat/plugins/search/plugin.search.js +439 -0
  295. package/stat/plugins/search/view.js +439 -0
  296. package/stat/plugins/tts/AbstractTTSEngine.js +249 -0
  297. package/stat/plugins/tts/FestivalTTSEngine.js +169 -0
  298. package/stat/plugins/tts/PageChunk.js +107 -0
  299. package/stat/plugins/tts/PageChunkIterator.js +163 -0
  300. package/stat/plugins/tts/WebTTSEngine.js +357 -0
  301. package/stat/plugins/tts/plugin.tts.js +357 -0
  302. package/stat/plugins/tts/tooltip_dict.js +15 -0
  303. package/stat/plugins/tts/utils.js +91 -0
  304. package/stat/util/browserSniffing.js +30 -0
  305. package/stat/util/debouncer.js +26 -0
  306. package/stat/util/docCookies.js +67 -0
  307. package/stat/util/strings.js +34 -0
  308. package/tests/e2e/README.md +37 -0
  309. package/tests/e2e/autoplay.test.js +2 -2
  310. package/tests/e2e/base.test.js +5 -7
  311. package/tests/e2e/helpers/base.js +8 -3
  312. package/tests/e2e/helpers/debug.js +1 -1
  313. package/tests/e2e/helpers/desktopSearch.js +1 -1
  314. package/tests/e2e/helpers/mobileSearch.js +3 -3
  315. package/tests/e2e/helpers/params.js +17 -0
  316. package/tests/e2e/rightToLeft.test.js +4 -5
  317. package/tests/e2e/viewmode.test.js +30 -31
  318. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +3 -3
  319. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +176 -0
  320. package/tests/{BookReader → jest/BookReader}/DebugConsole.test.js +1 -1
  321. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  322. package/tests/jest/BookReader/Mode1UpLit.test.js +87 -0
  323. package/tests/{BookReader → jest/BookReader}/Mode2Up.test.js +5 -7
  324. package/tests/jest/BookReader/ModeSmoothZoom.test.js +149 -0
  325. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  326. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +7 -7
  327. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +74 -2
  328. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  329. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  330. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  331. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  332. package/tests/jest/BookReader/utils.test.js +136 -0
  333. package/tests/jest/BookReader.keyboard.test.js +190 -0
  334. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  335. package/tests/{BookReader.test.js → jest/BookReader.test.js} +20 -4
  336. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  337. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +2 -2
  338. package/tests/{plugins → jest/plugins}/plugin.chapters.test.js +8 -8
  339. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  340. package/tests/{plugins → jest/plugins}/plugin.mobile_nav.test.js +5 -5
  341. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  342. package/tests/{plugins → jest/plugins}/plugin.text_selection.test.js +14 -24
  343. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  344. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +12 -5
  345. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +6 -6
  346. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +3 -3
  347. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  348. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  349. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  350. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +1 -1
  351. package/tests/{plugins → jest/plugins}/tts/utils.test.js +3 -3
  352. package/tests/jest/plugins/url/UrlPlugin.test.js +175 -0
  353. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +33 -14
  354. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  355. package/tests/{util → jest/util}/docCookies.test.js +1 -1
  356. package/tests/{util → jest/util}/strings.test.js +1 -1
  357. package/tests/{utils.js → jest/utils.js} +38 -0
  358. package/tests/karma/BookNavigator/book-navigator.test.js +485 -0
  359. package/tests/karma/BookNavigator/bookmarks/bookmark-button.test.js +44 -0
  360. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +1 -3
  361. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +1 -2
  362. package/tests/karma/BookNavigator/downloads/downloads-provider.test.js +67 -0
  363. package/tests/karma/BookNavigator/downloads/downloads.test.js +54 -0
  364. package/tests/karma/BookNavigator/search/search-provider.test.js +123 -0
  365. package/tests/karma/BookNavigator/{search-results.test.js → search/search-results.test.js} +1 -4
  366. package/tests/karma/BookNavigator/sharing/sharing-provider.test.js +49 -0
  367. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -2
  368. package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +184 -0
  369. package/tests/karma/BookNavigator/volumes/volumes.test.js +98 -0
  370. package/webpack.config.js +11 -5
  371. package/.babelrc +0 -12
  372. package/.dependabot/config.yml +0 -6
  373. package/.testcaferc.json +0 -5
  374. package/BookReader/BookReader.js.LICENSE.txt +0 -72
  375. package/BookReader/bookreader-component-bundle.js +0 -1450
  376. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  377. package/BookReader/bookreader-component-bundle.js.map +0 -1
  378. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  379. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  380. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  381. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +0 -27
  382. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  383. package/src/BookNavigator/assets/book-loader.js +0 -27
  384. package/src/ItemNavigator/ItemNavigator.js +0 -372
  385. package/src/ItemNavigator/providers/sharing.js +0 -29
  386. package/src/dragscrollable-br.js +0 -261
  387. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  388. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  389. package/tests/BookReader/Mode1Up.test.js +0 -164
  390. package/tests/BookReader/utils.test.js +0 -109
  391. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
@@ -0,0 +1,485 @@
1
+ import {
2
+ html,
3
+ elementUpdated,
4
+ fixtureCleanup,
5
+ fixtureSync,
6
+ expect,
7
+ } from '@open-wc/testing';
8
+ import sinon from 'sinon';
9
+ import DownloadsProvider from '../../../src/BookNavigator/downloads/downloads-provider.js';
10
+ import SearchProvider from '../../../src/BookNavigator/search/search-provider.js';
11
+ import SharingProvider from '../../../src/BookNavigator/sharing.js';
12
+ import VisualAdjustmentsProvider from '../../../src/BookNavigator/visual-adjustments/visual-adjustments-provider.js';
13
+ import VolumesProvider from '../../../src/BookNavigator/volumes/volumes-provider.js';
14
+ import { ModalManager } from '@internetarchive/modal-manager';
15
+ import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
16
+ import '../../../src/BookNavigator/book-navigator.js';
17
+
18
+ const promise0 = () => new Promise(res => setTimeout(res, 0));
19
+
20
+ const container = (sharedObserver = null) => {
21
+ const itemStub = {
22
+ metadata: {
23
+ identifier: 'foo',
24
+ creator: 'bar',
25
+ title: 'baz',
26
+ }
27
+ };
28
+ const modalMgr = new ModalManager();
29
+ return html`
30
+ <book-navigator
31
+ .itemMD=${itemStub}
32
+ .baseHost=${`https://foo.archive.org`}
33
+ .sharedObserver=${sharedObserver || new SharedResizeObserver()}
34
+ .modal=${modalMgr}
35
+ >
36
+ <div slot="theater-main">
37
+ <div id="BookReader"></div>
38
+ <p class="visible-in-reader">now showing</p>
39
+ <\div>
40
+ </book-navigator>
41
+ `;
42
+ };
43
+
44
+ afterEach(() => {
45
+ window.br = null;
46
+ fixtureCleanup();
47
+ const body = document.querySelector('body');
48
+ body.innerHTML = '';
49
+ sinon.restore();
50
+ });
51
+
52
+
53
+ describe('<book-navigator>', () => {
54
+ describe("How it loads", () => {
55
+ describe('Attaches BookReader listeners before `br.init` is called', () => {
56
+ it('binds global event listeners', async () => {
57
+ const el = fixtureSync(container());
58
+ const spy = sinon.spy(el, 'bindEventListeners');
59
+ await elementUpdated(el);
60
+ expect(spy.callCount).to.equal(1);
61
+ });
62
+ it('Listens for Global Event @BookReader:PostInit', async () => {
63
+ const brStub = {
64
+ resize: sinon.fake(),
65
+ currentIndex: sinon.fake(),
66
+ jumpToIndex: sinon.fake(),
67
+ options: { enableMultipleBooks: false }, // for multipleBooks
68
+ el: '#BookReader'
69
+ };
70
+
71
+ const sharedObserver = new SharedResizeObserver();
72
+ sinon.spy(sharedObserver, 'addObserver');
73
+ const el = fixtureSync(container(sharedObserver));
74
+
75
+ el.initializeBookSubmenus = sinon.fake();
76
+ el.emitLoadingStatusUpdate = sinon.fake();
77
+ el.handleResize = sinon.fake();
78
+ await elementUpdated(el);
79
+
80
+ expect(brStub.resize.callCount).to.equal(0);
81
+
82
+ window.dispatchEvent(new CustomEvent('BookReader:PostInit', {
83
+ detail: { props: brStub }
84
+ }));
85
+ await elementUpdated(el);
86
+
87
+ expect(el.emitLoadingStatusUpdate.callCount).to.equal(1);
88
+ expect(el.bookreader).to.equal(brStub); // sets bookreader
89
+ expect(el.bookReaderLoaded).to.be.true; // notes bookreader is loaded
90
+ expect(el.bookReaderCannotLoad).to.be.false;
91
+ expect(sharedObserver.addObserver.callCount).to.equal(1);
92
+
93
+ await promise0();
94
+
95
+ expect(brStub.resize.callCount > 0).to.be.true;
96
+ });
97
+ });
98
+ it('Emits a BrBookNav:PostInit event at completion', async () => {
99
+ let initEventFired = false;
100
+ window.addEventListener('BrBookNav:PostInit', (e) => {
101
+ initEventFired = true;
102
+ });
103
+ const el = fixtureSync(container());
104
+ const spy = sinon.spy(el, 'emitPostInit');
105
+
106
+ await elementUpdated(el);
107
+
108
+ expect(initEventFired).to.be.true;
109
+ expect(spy.callCount).to.equal(1);
110
+ });
111
+
112
+ it('creates an item image from metadata', async () => {
113
+ const el = fixtureSync(container());
114
+ el.item = {
115
+ metadata: { identifier: 'foo' },
116
+ };
117
+ await elementUpdated(el);
118
+
119
+ const itemImage = fixtureSync(el.itemImage);
120
+ expect(itemImage).to.be.instanceOf(HTMLImageElement);
121
+ expect(itemImage.getAttribute('class')).to.equal('cover-img');
122
+ expect(itemImage.getAttribute('src')).to.equal('https://https://foo.archive.org/services/img/foo');
123
+ });
124
+ });
125
+ describe('Menu/Layer Provider', () => {
126
+ describe('Connecting with a provider:', () => {
127
+ // loads Providers with base shared resources
128
+ it('We load 3 Sub Menus by default', async() => {
129
+ const el = fixtureSync(container());
130
+ const $brContainer = document.createElement('div');
131
+ const brStub = {
132
+ resize: sinon.fake(),
133
+ currentIndex: sinon.fake(),
134
+ jumpToIndex: sinon.fake(),
135
+ options: {},
136
+ refs: {
137
+ $brContainer
138
+ }
139
+ };
140
+ el.bookreader = brStub;
141
+ await el.elementUpdated;
142
+
143
+ el.initializeBookSubmenus();
144
+ await el.elementUpdated;
145
+ const defaultMenus = Object.keys(el.menuProviders);
146
+ expect(defaultMenus).to.contain('downloads');
147
+ expect(el.menuProviders.downloads).to.be.instanceOf(DownloadsProvider);
148
+
149
+ expect(defaultMenus).to.contain('share');
150
+ expect(el.menuProviders.share).to.be.instanceOf(SharingProvider);
151
+
152
+ expect(defaultMenus).to.contain('visualAdjustments');
153
+ expect(el.menuProviders.visualAdjustments).to.be.instanceOf(VisualAdjustmentsProvider);
154
+ });
155
+ describe('Loading Sub Menus By Plugin Flags', async() => {
156
+ it('Search: uses `enableSearch` flag', async() => {
157
+ const el = fixtureSync(container());
158
+ const $brContainer = document.createElement('div');
159
+ const brStub = {
160
+ resize: sinon.fake(),
161
+ currentIndex: sinon.fake(),
162
+ jumpToIndex: sinon.fake(),
163
+ options: { enableSearch: true },
164
+ refs: {
165
+ $brContainer
166
+ }
167
+ };
168
+ el.bookreader = brStub;
169
+ await el.elementUpdated;
170
+
171
+ el.initializeBookSubmenus();
172
+ await el.elementUpdated;
173
+
174
+ expect(el.menuProviders.search).to.exist;
175
+ expect(el.menuProviders.search).to.be.instanceOf(SearchProvider);
176
+
177
+ // also adds a menu shortcut
178
+ expect(el.menuShortcuts.find(m => m.id === 'search')).to.exist;
179
+ });
180
+ it('Volumes/Multiple Books: uses `enableMultipleBooks` flag', async() => {
181
+ const el = fixtureSync(container());
182
+ const $brContainer = document.createElement('div');
183
+ const brStub = {
184
+ resize: sinon.fake(),
185
+ currentIndex: sinon.fake(),
186
+ jumpToIndex: sinon.fake(),
187
+ options: {
188
+ enableMultipleBooks: true,
189
+ multipleBooksList: {
190
+ by_subprefix: {
191
+ fooSubprefix: 'beep'
192
+ }
193
+ }
194
+ },
195
+ refs: {
196
+ $brContainer
197
+ }
198
+ };
199
+ el.bookreader = brStub;
200
+ await el.elementUpdated;
201
+
202
+ el.initializeBookSubmenus();
203
+ await el.elementUpdated;
204
+
205
+ expect(el.menuProviders.volumes).to.exist;
206
+ expect(el.menuProviders.volumes).to.be.instanceOf(VolumesProvider);
207
+
208
+ // also adds a menu shortcut
209
+ expect(el.menuShortcuts.find(m => m.id === 'volumes')).to.be.exist;
210
+ });
211
+ });
212
+ it('keeps track of base shared resources for providers in: `baseProviderConfig`', () => {
213
+ const el = fixtureSync(container());
214
+ const baseConfigKeys = Object.keys(el.baseProviderConfig);
215
+ expect(baseConfigKeys).to.contain('baseHost');
216
+ expect(baseConfigKeys).to.contain('modal');
217
+ expect(baseConfigKeys).to.contain('sharedObserver');
218
+ expect(baseConfigKeys).to.contain('bookreader');
219
+ expect(baseConfigKeys).to.contain('item');
220
+ expect(baseConfigKeys).to.contain('signedIn');
221
+ expect(baseConfigKeys).to.contain('isAdmin');
222
+ expect(baseConfigKeys).to.contain('onProviderChange');
223
+ });
224
+ });
225
+
226
+ describe('Controlling Menu Side Panel & Shortcuts', () => {
227
+ describe('Side Menu Panels', () => {
228
+ describe('Control which side menu to toggle open by using: `this.updateSideMenu`', () => {
229
+ it('Emits `@updateSideMenu` to signal which menu gets the update', async () => {
230
+ const el = fixtureSync(container());
231
+ const brStub = {
232
+ resize: sinon.fake(),
233
+ currentIndex: sinon.fake(),
234
+ jumpToIndex: sinon.fake(),
235
+ options: { enableMultipleBooks: true }
236
+ };
237
+ el.bookreader = brStub;
238
+ await elementUpdated(el);
239
+
240
+ let initEventFired = false;
241
+ let eventDetails = {};
242
+ el.addEventListener('updateSideMenu', (e) => {
243
+ eventDetails = e.detail;
244
+ initEventFired = true;
245
+ });
246
+
247
+ el.updateSideMenu('foo', 'open');
248
+ expect(initEventFired).to.equal(true);
249
+ expect(eventDetails.menuId).to.equal('foo');
250
+ expect(eventDetails.action).to.equal('open');
251
+ });
252
+ it('Will Not Emit `@updateSideMenu` if menu ID is missing', async() => {
253
+ const el = fixtureSync(container());
254
+ const brStub = {
255
+ resize: sinon.fake(),
256
+ currentIndex: sinon.fake(),
257
+ jumpToIndex: sinon.fake(),
258
+ options: { enableMultipleBooks: true }
259
+ };
260
+ el.bookreader = brStub;
261
+ await elementUpdated(el);
262
+
263
+ let initEventFired = false;
264
+ el.addEventListener('updateSideMenu', (e) => {
265
+ initEventFired = true;
266
+ });
267
+
268
+ el.updateSideMenu('', 'open');
269
+ expect(initEventFired).to.equal(false);
270
+ });
271
+ });
272
+ });
273
+
274
+ describe('Shortcuts', () => {
275
+ it('has specific order of menu shortcuts to show', () => {
276
+ const el = fixtureSync(container());
277
+ expect(el.shortcutOrder[0]).to.equal('fullscreen');
278
+ expect(el.shortcutOrder[1]).to.equal('volumes');
279
+ expect(el.shortcutOrder[2]).to.equal('search');
280
+ expect(el.shortcutOrder[3]).to.equal('bookmarks');
281
+ });
282
+ });
283
+
284
+ describe('Behaviors for specific menus', () => {
285
+ describe('Search menu - ref: plugin.search.js', () => {
286
+ it('Event: listens for `BookReader:ToggleSearchMenu to open search side panel', async () => {
287
+ const el = fixtureSync(container());
288
+ const brStub = {
289
+ resize: sinon.fake(),
290
+ currentIndex: sinon.fake(),
291
+ jumpToIndex: sinon.fake(),
292
+ options: { enableMultipleBooks: true }
293
+ };
294
+ el.bookreader = brStub;
295
+ await elementUpdated(el);
296
+
297
+ let sidePanelConfig = {};
298
+ el.addEventListener('updateSideMenu', (e) => {
299
+ console.log();
300
+ sidePanelConfig = e.detail;
301
+ });
302
+ const toggleSearchMenuEvent = new Event('BookReader:ToggleSearchMenu');
303
+ window.dispatchEvent(toggleSearchMenuEvent);
304
+
305
+ await elementUpdated(el);
306
+ expect(sidePanelConfig.menuId).to.equal('search');
307
+ expect(sidePanelConfig.action).to.equal('toggle');
308
+ });
309
+ });
310
+ });
311
+ });
312
+ });
313
+
314
+ describe('Resizing',() => {
315
+ it('keeps track of `brWidth` and `brHeight`', async () => {
316
+ const el = fixtureSync(container());
317
+ const brStub = {
318
+ resize: sinon.fake(),
319
+ };
320
+ el.bookreader = brStub;
321
+ await elementUpdated(el);
322
+ expect(el.brWidth).to.equal(0);
323
+ expect(el.brHeight).to.equal(0);
324
+
325
+ const mockResizeEvent = {
326
+ contentRect: {
327
+ height: 500,
328
+ width: 900
329
+ },
330
+ target: el.mainBRContainer
331
+ };
332
+ el.handleResize(mockResizeEvent);
333
+
334
+ await elementUpdated(el);
335
+ await promise0();
336
+
337
+ expect(el.brHeight).to.equal(500);
338
+ expect(el.brWidth).to.equal(900);
339
+ });
340
+ it('resizes if height/width changes && is not animating', async () => {
341
+ const el = fixtureSync(container());
342
+ const brStub = {
343
+ animating: false,
344
+ resize: sinon.fake(),
345
+ };
346
+ el.bookreader = brStub;
347
+ await elementUpdated(el);
348
+ expect(el.brWidth).to.equal(0);
349
+ expect(el.brHeight).to.equal(0);
350
+
351
+ const mockResizeEvent = {
352
+ contentRect: {
353
+ height: 500,
354
+ width: 900
355
+ },
356
+ target: el.mainBRContainer
357
+ };
358
+ el.handleResize(mockResizeEvent);
359
+
360
+ await elementUpdated(el);
361
+ await promise0();
362
+
363
+ expect(brStub.resize.callCount).to.equal(1);
364
+ });
365
+ it('does not resize bookreader if animating', async () => {
366
+ const el = fixtureSync(container());
367
+ const brStub = {
368
+ animating: true, // <-- testing for this
369
+ resize: sinon.fake(),
370
+ currentIndex: sinon.fake(),
371
+ jumpToIndex: sinon.fake(),
372
+ options: { enableMultipleBooks: true }
373
+ };
374
+
375
+ el.bookreader = brStub;
376
+ await elementUpdated(el);
377
+
378
+ expect(el.bookreader.resize.callCount).to.equal(0);
379
+ expect(el.bookreader.currentIndex.callCount).to.equal(0);
380
+ expect(el.bookreader.jumpToIndex.callCount).to.equal(0);
381
+ });
382
+ });
383
+
384
+ describe('Fullscreen Management', () => {
385
+ it('needs option: `enableFSLogoShortcut` to use FS logo', async () => {
386
+ const el = fixtureSync(container());
387
+ const brStub = {
388
+ isFullscreen: () => true,
389
+ options: {
390
+ enableFSLogoShortcut: false,
391
+ }
392
+ };
393
+
394
+ el.bookreader = brStub;
395
+ el.emitMenuShortcutsUpdated = sinon.fake();
396
+ await elementUpdated(el);
397
+
398
+ el.manageFullScreenBehavior();
399
+ await elementUpdated(el);
400
+ expect(el.menuShortcuts.length).to.equal(0);
401
+ });
402
+ it('sets fullscreen shortcut when entering Fullscreen', async () => {
403
+ const el = fixtureSync(container());
404
+ const brStub = {
405
+ isFullscreen: () => true,
406
+ options: {
407
+ enableFSLogoShortcut: true,
408
+ }
409
+ };
410
+
411
+ el.bookreader = brStub;
412
+ el.emitMenuShortcutsUpdated = sinon.fake();
413
+ await elementUpdated(el);
414
+
415
+ el.manageFullScreenBehavior();
416
+ await elementUpdated(el);
417
+ expect(el.menuShortcuts.length).to.equal(1);
418
+ expect(el.menuShortcuts[0].id).to.equal('fullscreen');
419
+ expect(el.menuShortcuts[0].icon).to.exist;
420
+ expect(el.emitMenuShortcutsUpdated.callCount).to.equal(1);
421
+ });
422
+ it('clicking Fullscreen shortcut closes fullscreen', async () => {
423
+ const el = fixtureSync(container());
424
+ const brStub = {
425
+ isFullscreen: () => true,
426
+ options: {
427
+ enableFSLogoShortcut: true,
428
+ }
429
+ };
430
+
431
+ el.bookreader = brStub;
432
+ el.emitMenuShortcutsUpdated = sinon.fake();
433
+ el.closeFullscreen = sinon.fake();
434
+ await elementUpdated(el);
435
+
436
+ el.manageFullScreenBehavior();
437
+ await elementUpdated(el);
438
+
439
+ fixtureSync(el.menuShortcuts[0].icon).click();
440
+ await elementUpdated(el);
441
+
442
+ expect(el.closeFullscreen.callCount).to.equal(1);
443
+ });
444
+ it('removes Fullscreen shortcut when leaving fullscreen', async() => {
445
+ const el = fixtureSync(container());
446
+ const brStub = {
447
+ isFullscreen: () => false,
448
+ options: {
449
+ enableFSLogoShortcut: true,
450
+ }
451
+ };
452
+
453
+ el.bookreader = brStub;
454
+ el.emitMenuShortcutsUpdated = sinon.fake();
455
+ await elementUpdated(el);
456
+
457
+ el.manageFullScreenBehavior();
458
+ await elementUpdated(el);
459
+ expect(el.menuShortcuts.length).to.equal(0);
460
+ expect(el.emitMenuShortcutsUpdated.callCount).to.equal(1);
461
+ });
462
+ it('Event: Listens for `BookReader:FullscreenToggled', async() => {
463
+ const el = fixtureSync(container());
464
+ const brStub = {
465
+ isFullscreen: () => true,
466
+ resize: sinon.fake(),
467
+ currentIndex: sinon.fake(),
468
+ jumpToIndex: sinon.fake(),
469
+ options: {
470
+ enableFSLogoShortcut: true,
471
+ }
472
+ };
473
+ el.bookreader = brStub;
474
+ el.manageFullScreenBehavior = sinon.fake();
475
+ await elementUpdated(el);
476
+
477
+ window.dispatchEvent(new CustomEvent('BookReader:fullscreenToggled', {
478
+ detail: { props: brStub }
479
+ }));
480
+ await elementUpdated(el);
481
+
482
+ expect(el.manageFullScreenBehavior.callCount).to.equal(1);
483
+ });
484
+ });
485
+ });
@@ -0,0 +1,44 @@
1
+ import {
2
+ html,
3
+ fixtureSync,
4
+ expect,
5
+ fixtureCleanup,
6
+ } from '@open-wc/testing';
7
+ import '../../../../src/BookNavigator/bookmarks/bookmark-button.js';
8
+ import sinon from 'sinon';
9
+
10
+ afterEach(() => {
11
+ sinon.restore();
12
+ fixtureCleanup();
13
+ });
14
+
15
+ describe('<bookmark-button>', () => {
16
+ it('sets default properties', async () => {
17
+ const el = fixtureSync(html`<bookmark-button></bookmark-button>`);
18
+
19
+ expect(el.side).to.be.undefined;
20
+ expect(el.state).to.equal('hollow');
21
+ });
22
+ it('Event: fires `@bookmarkButtonClicked on click', async () => {
23
+ const el = fixtureSync(html`<bookmark-button></bookmark-button>`);
24
+ let buttonClicked = false;
25
+ el.addEventListener('bookmarkButtonClicked', () => { buttonClicked = true; });
26
+ const eventStub = { preventDefault: sinon.fake()};
27
+ el.handleClick(eventStub);
28
+ await el.updateComplete;
29
+
30
+ expect(buttonClicked).to.be.true;
31
+ expect(eventStub.preventDefault.callCount).to.equal(1);
32
+ });
33
+ it('Title: Toggles title between `Add/Remove bookmark`', async () => {
34
+ const el = fixtureSync(html`<bookmark-button></bookmark-button>`);
35
+ expect(el.title).to.equal('Add bookmark');
36
+ expect(el.state).to.equal('hollow');
37
+
38
+ el.state = 'filled';
39
+ await el.updateComplete;
40
+
41
+ expect(el.title).to.equal('Remove bookmark');
42
+ expect(el.state).to.not.equal('hollow');
43
+ });
44
+ });
@@ -4,7 +4,7 @@ import {
4
4
  expect,
5
5
  oneEvent,
6
6
  } from '@open-wc/testing';
7
- import { IABookmarkEdit } from '../../../../src/BookNavigator/bookmarks/bookmark-edit.js';
7
+ import '../../../../src/BookNavigator/bookmarks/bookmark-edit.js';
8
8
 
9
9
  const bookmarkColors = [{
10
10
  id: 0,
@@ -23,8 +23,6 @@ const bookmarkColors = [{
23
23
  className: 'yellow',
24
24
  }];
25
25
 
26
- customElements.define('ia-bookmark-edit', IABookmarkEdit);
27
-
28
26
  const container = (bookmark = {}) => (
29
27
  html`<ia-bookmark-edit .bookmark=${bookmark} .bookmarkColors=${bookmarkColors}></ia-bookmark-edit>`
30
28
  );
@@ -4,8 +4,7 @@ import {
4
4
  expect,
5
5
  oneEvent,
6
6
  } from '@open-wc/testing';
7
- import { IABookmarksList } from '../../../../src/BookNavigator/bookmarks/bookmarks-list.js';
8
- customElements.define('ia-bookmarks-list', IABookmarksList);
7
+ import '../../../../src/BookNavigator/bookmarks/bookmarks-list.js';
9
8
 
10
9
  const bookmarks = [{
11
10
  id: 1,
@@ -0,0 +1,67 @@
1
+ import { expect, fixtureCleanup, fixtureSync } from '@open-wc/testing';
2
+ import sinon from 'sinon';
3
+ import DownloadsProvider from '../../../../src/BookNavigator/downloads/downloads-provider';
4
+
5
+ const downloadableTypes = [
6
+ ["PDF", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.pdf"],
7
+ ["ePub", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.epub"],
8
+ ["Plain Text", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala_djvu.txt"],
9
+ ["DAISY", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala_daisy.zip"],
10
+ ["Kindle", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.mobi"]
11
+ ];
12
+
13
+ const downloads = [
14
+ {
15
+ type: "PDF",
16
+ url: "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.pdf",
17
+ note: "PDF files contain high quality images of pages."
18
+ },
19
+ {
20
+ type: "ePub",
21
+ url: "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.epub",
22
+ note: "ePub files are smaller in size, but may contain errors."
23
+ }
24
+ ];
25
+
26
+ afterEach(() => {
27
+ sinon.restore();
28
+ fixtureCleanup();
29
+ });
30
+
31
+ describe('Downloads Provider', () => {
32
+ it('constructor - initial setup', () => {
33
+ const isBookProtected = false;
34
+ const provider = new DownloadsProvider(isBookProtected);
35
+
36
+ expect(provider.id).to.equal('downloads');
37
+ expect(provider.icon).to.exist;
38
+ expect(fixtureSync(provider.icon).tagName).to.equal('IA-ICON-DL');
39
+ expect(provider.label).to.equal('Downloadable files');
40
+ expect(provider.menuDetails).to.exist;
41
+ expect(provider.component).to.exist;
42
+
43
+ provider.update(downloadableTypes);
44
+
45
+ expect(provider.isBookProtected).to.equal(false);
46
+
47
+ expect(provider.downloads[0].type).to.equals("PDF");
48
+ expect(provider.downloads[1].type).to.equals("ePub");
49
+
50
+ expect(provider.menuDetails).to.equal(`(${downloads.length} formats)`);
51
+ });
52
+
53
+ it('render view if book is protected', () => {
54
+ const provider = new DownloadsProvider({
55
+ bookreader: { options: { isProtected: true } }
56
+ });
57
+
58
+ expect(provider.isBookProtected).to.equal(true);
59
+
60
+ provider.update(downloadableTypes);
61
+
62
+ expect(provider.downloads[0].type).to.equals("Encrypted Adobe PDF");
63
+ expect(provider.downloads[1].type).to.equals("Encrypted Adobe ePub");
64
+
65
+ expect(provider.downloads.length).to.equals(downloads.length);
66
+ });
67
+ });
@@ -0,0 +1,54 @@
1
+ import {
2
+ html,
3
+ fixture,
4
+ expect,
5
+ fixtureCleanup,
6
+ } from '@open-wc/testing';
7
+ import sinon from 'sinon';
8
+ import '../../../../src/BookNavigator/downloads/downloads';
9
+
10
+
11
+ const downloads = [
12
+ {
13
+ type: "PDF",
14
+ url: "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.pdf",
15
+ note: "PDF files contain high quality images of pages."
16
+ },
17
+ {
18
+ type: "ePub",
19
+ url: "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.epub",
20
+ note: "ePub files are smaller in size, but may contain errors."
21
+ }
22
+ ];
23
+
24
+
25
+ const container = (downloads) => (
26
+ html`
27
+ <ia-book-downloads .downloads=${downloads}></ia-book-downloads>
28
+ `
29
+ );
30
+
31
+ beforeEach(() => {
32
+ const body = document.querySelector('body');
33
+ const brHook = document.createElement('div');
34
+ brHook.setAttribute('id', 'BookReader');
35
+ body.appendChild(brHook);
36
+ });
37
+
38
+ afterEach(() => {
39
+ sinon.restore();
40
+ fixtureCleanup();
41
+ });
42
+
43
+ describe('<ia-book-downloads>', () => {
44
+ it('sets default properties', async () => {
45
+ const el = await fixture(container(downloads));
46
+ await el.updateComplete;
47
+
48
+ expect(el.downloads.length).to.equal(2);
49
+ expect(el.shadowRoot.querySelector("ul").childElementCount).to.equal(2);
50
+ expect(el.isBookProtected).to.equal(false);
51
+
52
+ expect(el.shadowRoot.querySelector("ul li a").innerHTML).to.include("Get PDF");
53
+ });
54
+ });