@internetarchive/bookreader 5.0.0-9-multiple-files → 5.0.0-90

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 (333) hide show
  1. package/.eslintrc.js +21 -19
  2. package/.github/workflows/node.js.yml +81 -7
  3. package/.github/workflows/npm-publish.yml +6 -20
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +505 -1442
  6. package/BookReader/BookReader.js +2 -21564
  7. package/BookReader/BookReader.js.LICENSE.txt +20 -20
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +1782 -0
  10. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +7 -0
  11. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  12. package/BookReader/icons/1up.svg +1 -12
  13. package/BookReader/icons/2up.svg +1 -15
  14. package/BookReader/icons/advance.svg +3 -26
  15. package/BookReader/icons/chevron-right.svg +1 -1
  16. package/BookReader/icons/close-circle-dark.svg +1 -0
  17. package/BookReader/icons/close-circle.svg +1 -1
  18. package/BookReader/icons/fullscreen.svg +1 -17
  19. package/BookReader/icons/fullscreen_exit.svg +1 -17
  20. package/BookReader/icons/hamburger.svg +1 -15
  21. package/BookReader/icons/left-arrow.svg +1 -12
  22. package/BookReader/icons/magnify-minus.svg +1 -16
  23. package/BookReader/icons/magnify-plus.svg +1 -17
  24. package/BookReader/icons/magnify.svg +1 -15
  25. package/BookReader/icons/pause.svg +1 -23
  26. package/BookReader/icons/play.svg +1 -22
  27. package/BookReader/icons/playback-speed.svg +1 -34
  28. package/BookReader/icons/read-aloud.svg +1 -22
  29. package/BookReader/icons/review.svg +3 -22
  30. package/BookReader/icons/thumbnails.svg +1 -17
  31. package/BookReader/icons/voice.svg +1 -0
  32. package/BookReader/icons/volume-full.svg +1 -22
  33. package/BookReader/images/BRicons.svg +5 -94
  34. package/BookReader/images/books_graphic.svg +1 -177
  35. package/BookReader/images/icon_book.svg +1 -12
  36. package/BookReader/images/icon_bookmark.svg +1 -12
  37. package/BookReader/images/icon_gear.svg +1 -14
  38. package/BookReader/images/icon_hamburger.svg +1 -20
  39. package/BookReader/images/icon_home.svg +1 -21
  40. package/BookReader/images/icon_info.svg +1 -11
  41. package/BookReader/images/icon_one_page.svg +1 -8
  42. package/BookReader/images/icon_pause.svg +1 -1
  43. package/BookReader/images/icon_play.svg +1 -1
  44. package/BookReader/images/icon_playback-rate.svg +1 -15
  45. package/BookReader/images/icon_search_button.svg +1 -8
  46. package/BookReader/images/icon_share.svg +1 -9
  47. package/BookReader/images/icon_skip-ahead.svg +1 -6
  48. package/BookReader/images/icon_skip-back.svg +2 -13
  49. package/BookReader/images/icon_speaker.svg +1 -18
  50. package/BookReader/images/icon_speaker_open.svg +1 -10
  51. package/BookReader/images/icon_thumbnails.svg +1 -12
  52. package/BookReader/images/icon_toc.svg +1 -5
  53. package/BookReader/images/icon_two_pages.svg +1 -9
  54. package/BookReader/images/marker_chap-off.svg +1 -11
  55. package/BookReader/images/marker_chap-on.svg +1 -11
  56. package/BookReader/images/marker_srch-on.svg +1 -11
  57. package/BookReader/images/unviewable_page.png +0 -0
  58. package/BookReader/jquery-3.js +2 -0
  59. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  60. package/BookReader/plugins/plugin.archive_analytics.js +1 -172
  61. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  62. package/BookReader/plugins/plugin.autoplay.js +1 -165
  63. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  64. package/BookReader/plugins/plugin.chapters.js +22 -301
  65. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  66. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  67. package/BookReader/plugins/plugin.iframe.js +1 -74
  68. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  69. package/BookReader/plugins/plugin.iiif.js +2 -0
  70. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  71. package/BookReader/plugins/plugin.resume.js +1 -368
  72. package/BookReader/plugins/plugin.resume.js.map +1 -1
  73. package/BookReader/plugins/plugin.search.js +2 -1420
  74. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  75. package/BookReader/plugins/plugin.search.js.map +1 -1
  76. package/BookReader/plugins/plugin.text_selection.js +2 -1080
  77. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  78. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  79. package/BookReader/plugins/plugin.tts.js +2 -9193
  80. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  81. package/BookReader/plugins/plugin.tts.js.map +1 -1
  82. package/BookReader/plugins/plugin.url.js +1 -269
  83. package/BookReader/plugins/plugin.url.js.map +1 -1
  84. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
  85. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  86. package/BookReader/webcomponents-bundle.js +3 -0
  87. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  88. package/BookReader/webcomponents-bundle.js.map +1 -0
  89. package/BookReaderDemo/BookReaderDemo.css +18 -19
  90. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -3
  91. package/BookReaderDemo/BookReaderJSSimple.js +1 -0
  92. package/BookReaderDemo/IADemoBr.js +144 -0
  93. package/BookReaderDemo/demo-advanced.html +2 -2
  94. package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
  95. package/BookReaderDemo/demo-fullscreen-mobile.html +3 -5
  96. package/BookReaderDemo/demo-fullscreen.html +2 -4
  97. package/BookReaderDemo/demo-iiif.html +99 -12
  98. package/BookReaderDemo/demo-internetarchive.html +214 -18
  99. package/BookReaderDemo/demo-multiple.html +2 -1
  100. package/BookReaderDemo/demo-preview-pages.html +526 -525
  101. package/BookReaderDemo/demo-simple.html +2 -1
  102. package/BookReaderDemo/demo-vendor-fullscreen.html +2 -4
  103. package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
  104. package/BookReaderDemo/immersion-1up.html +2 -2
  105. package/BookReaderDemo/immersion-mode.html +2 -4
  106. package/BookReaderDemo/toggle_controls.html +3 -2
  107. package/BookReaderDemo/view_mode.html +2 -1
  108. package/BookReaderDemo/viewmode-cycle.html +2 -3
  109. package/CHANGELOG.md +595 -33
  110. package/README.md +14 -1
  111. package/babel.config.js +20 -0
  112. package/codecov.yml +6 -0
  113. package/index.html +5 -2
  114. package/jsconfig.json +19 -0
  115. package/netlify.toml +9 -0
  116. package/package.json +70 -62
  117. package/renovate.json +52 -0
  118. package/scripts/preversion.js +0 -1
  119. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  120. package/src/BookNavigator/assets/button-base.js +10 -2
  121. package/src/BookNavigator/assets/ia-logo.js +17 -0
  122. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  123. package/src/BookNavigator/assets/icon_close.js +1 -1
  124. package/src/BookNavigator/book-navigator.js +590 -0
  125. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  126. package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
  127. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  128. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +4 -9
  129. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  130. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  131. package/src/BookNavigator/delete-modal-actions.js +1 -1
  132. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  133. package/src/BookNavigator/downloads/downloads.js +29 -25
  134. package/src/BookNavigator/search/search-provider.js +80 -28
  135. package/src/BookNavigator/search/search-results.js +29 -26
  136. package/src/BookNavigator/sharing.js +27 -0
  137. package/src/BookNavigator/viewable-files.js +95 -0
  138. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +13 -12
  139. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +7 -7
  140. package/src/BookReader/BookModel.js +76 -41
  141. package/src/BookReader/DragScrollable.js +233 -0
  142. package/src/BookReader/ImageCache.js +48 -15
  143. package/src/BookReader/Mode1Up.js +56 -351
  144. package/src/BookReader/Mode1UpLit.js +388 -0
  145. package/src/BookReader/Mode2Up.js +73 -1318
  146. package/src/BookReader/Mode2UpLit.js +777 -0
  147. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  148. package/src/BookReader/ModeSmoothZoom.js +312 -0
  149. package/src/BookReader/ModeThumb.js +19 -13
  150. package/src/BookReader/Navbar/Navbar.js +70 -54
  151. package/src/BookReader/PageContainer.js +116 -22
  152. package/src/BookReader/ReduceSet.js +3 -3
  153. package/src/BookReader/Toolbar/Toolbar.js +14 -41
  154. package/src/BookReader/events.js +2 -3
  155. package/src/BookReader/options.js +73 -15
  156. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  157. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  158. package/src/BookReader/utils/SelectionObserver.js +45 -0
  159. package/src/BookReader/utils/classes.js +1 -1
  160. package/src/BookReader/utils.js +128 -13
  161. package/src/BookReader.js +562 -1078
  162. package/src/BookReaderPlugin.js +44 -0
  163. package/src/assets/icons/close-circle-dark.svg +1 -0
  164. package/src/assets/icons/magnify-minus.svg +3 -7
  165. package/src/assets/icons/magnify-plus.svg +3 -7
  166. package/src/assets/icons/voice.svg +1 -0
  167. package/src/assets/images/unviewable_page.png +0 -0
  168. package/src/css/BookReader.scss +1 -17
  169. package/src/css/_BRBookmarks.scss +1 -1
  170. package/src/css/_BRComponent.scss +1 -1
  171. package/src/css/_BRicon.scss +8 -2
  172. package/src/css/_BRmain.scss +33 -27
  173. package/src/css/_BRnav.scss +12 -42
  174. package/src/css/_BRpages.scss +170 -42
  175. package/src/css/_BRsearch.scss +68 -230
  176. package/src/css/_BRtoolbar.scss +5 -5
  177. package/src/css/_TextSelection.scss +87 -27
  178. package/src/css/_colorbox.scss +2 -2
  179. package/src/css/_controls.scss +24 -7
  180. package/src/css/_icons.scss +7 -1
  181. package/src/ia-bookreader/ia-bookreader.js +224 -0
  182. package/src/plugins/plugin.archive_analytics.js +84 -78
  183. package/src/plugins/plugin.autoplay.js +99 -104
  184. package/src/plugins/plugin.chapters.js +237 -191
  185. package/src/plugins/plugin.iframe.js +1 -1
  186. package/src/plugins/plugin.iiif.js +141 -0
  187. package/src/plugins/plugin.resume.js +53 -50
  188. package/src/plugins/plugin.text_selection.js +503 -175
  189. package/src/plugins/plugin.vendor-fullscreen.js +7 -7
  190. package/src/plugins/search/plugin.search.js +183 -121
  191. package/src/plugins/search/utils.js +43 -0
  192. package/src/plugins/search/view.js +67 -202
  193. package/src/plugins/tts/AbstractTTSEngine.js +75 -45
  194. package/src/plugins/tts/FestivalTTSEngine.js +21 -31
  195. package/src/plugins/tts/PageChunk.js +16 -23
  196. package/src/plugins/tts/PageChunkIterator.js +11 -17
  197. package/src/plugins/tts/WebTTSEngine.js +88 -72
  198. package/src/plugins/tts/plugin.tts.js +310 -350
  199. package/src/plugins/tts/utils.js +16 -26
  200. package/src/plugins/url/UrlPlugin.js +191 -0
  201. package/src/plugins/{plugin.url.js → url/plugin.url.js} +47 -18
  202. package/src/util/browserSniffing.js +22 -0
  203. package/src/util/docCookies.js +21 -2
  204. package/src/util/strings.js +1 -0
  205. package/tests/e2e/README.md +37 -0
  206. package/tests/e2e/autoplay.test.js +9 -6
  207. package/tests/e2e/base.test.js +8 -16
  208. package/tests/e2e/helpers/base.js +55 -50
  209. package/tests/e2e/helpers/debug.js +1 -1
  210. package/tests/e2e/helpers/mockSearch.js +19 -22
  211. package/tests/e2e/helpers/params.js +17 -0
  212. package/tests/e2e/helpers/rightToLeft.js +8 -14
  213. package/tests/e2e/helpers/search.js +73 -0
  214. package/tests/e2e/models/Navigation.js +20 -37
  215. package/tests/e2e/rightToLeft.test.js +4 -5
  216. package/tests/e2e/viewmode.test.js +40 -33
  217. package/tests/jest/BookNavigator/book-navigator.test.js +661 -0
  218. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  219. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  220. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  221. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  222. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  223. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  224. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  225. package/tests/{karma/BookNavigator → jest/BookNavigator/search}/search-results.test.js +109 -60
  226. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  227. package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +80 -0
  228. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  229. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +74 -14
  230. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
  231. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  232. package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
  233. package/tests/jest/BookReader/Mode2Up.test.js +98 -0
  234. package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
  235. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
  236. package/tests/jest/BookReader/ModeSmoothZoom.test.js +218 -0
  237. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  238. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +42 -29
  239. package/tests/jest/BookReader/PageContainer.test.js +238 -0
  240. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  241. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +3 -3
  242. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  243. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  244. package/tests/jest/BookReader/utils/SelectionObserver.test.js +57 -0
  245. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  246. package/tests/jest/BookReader/utils.test.js +250 -0
  247. package/tests/jest/BookReader.keyboard.test.js +190 -0
  248. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +10 -2
  249. package/tests/{BookReader.test.js → jest/BookReader.test.js} +43 -53
  250. package/tests/jest/plugins/plugin.archive_analytics.test.js +20 -0
  251. package/tests/jest/plugins/plugin.autoplay.test.js +35 -0
  252. package/tests/jest/plugins/plugin.chapters.test.js +195 -0
  253. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +4 -4
  254. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +22 -35
  255. package/tests/jest/plugins/plugin.text_selection.test.js +316 -0
  256. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  257. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +26 -47
  258. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +42 -9
  259. package/tests/jest/plugins/search/utils.js +25 -0
  260. package/tests/jest/plugins/search/utils.test.js +29 -0
  261. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +30 -10
  262. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  263. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  264. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  265. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
  266. package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
  267. package/tests/jest/plugins/url/UrlPlugin.test.js +198 -0
  268. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +57 -18
  269. package/tests/jest/setup.js +3 -0
  270. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  271. package/tests/jest/util/docCookies.test.js +24 -0
  272. package/tests/{util → jest/util}/strings.test.js +1 -1
  273. package/tests/{utils.js → jest/utils.js} +38 -0
  274. package/webpack.config.js +16 -10
  275. package/.babelrc +0 -12
  276. package/.dependabot/config.yml +0 -6
  277. package/.testcaferc.json +0 -5
  278. package/BookReader/bookreader-component-bundle.js +0 -14330
  279. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  280. package/BookReader/bookreader-component-bundle.js.map +0 -1
  281. package/BookReader/icons/sort-ascending.svg +0 -1
  282. package/BookReader/icons/sort-descending.svg +0 -1
  283. package/BookReader/jquery-1.10.1.js +0 -108
  284. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  285. package/BookReader/plugins/plugin.menu_toggle.js +0 -369
  286. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  287. package/BookReader/plugins/plugin.mobile_nav.js +0 -335
  288. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  289. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  290. package/BookReaderDemo/IIIFBookReader.js +0 -207
  291. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  292. package/BookReaderDemo/demo-autoplay.html +0 -38
  293. package/BookReaderDemo/demo-iiif.js +0 -26
  294. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  295. package/karma.conf.js +0 -23
  296. package/src/BookNavigator/BookModel.js +0 -14
  297. package/src/BookNavigator/BookNavigator.js +0 -452
  298. package/src/BookNavigator/assets/book-loader.js +0 -27
  299. package/src/BookNavigator/assets/icon_sort_ascending.js +0 -5
  300. package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
  301. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  302. package/src/BookNavigator/search/a-search-result.js +0 -55
  303. package/src/BookNavigator/volumes/volumes-provider.js +0 -108
  304. package/src/BookNavigator/volumes/volumes.js +0 -162
  305. package/src/BookReader/DebugConsole.js +0 -54
  306. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  307. package/src/ItemNavigator/ItemNavigator.js +0 -372
  308. package/src/ItemNavigator/providers/sharing.js +0 -29
  309. package/src/assets/icons/sort-ascending.svg +0 -1
  310. package/src/assets/icons/sort-descending.svg +0 -1
  311. package/src/css/_MobileNav.scss +0 -194
  312. package/src/dragscrollable-br.js +0 -261
  313. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  314. package/src/plugins/plugin.mobile_nav.js +0 -287
  315. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  316. package/tests/BookReader/DebugConsole.test.js +0 -25
  317. package/tests/BookReader/Mode1Up.test.js +0 -164
  318. package/tests/BookReader/Mode2Up.test.js +0 -247
  319. package/tests/BookReader/PageContainer.test.js +0 -115
  320. package/tests/BookReader/utils.test.js +0 -109
  321. package/tests/e2e/helpers/desktopSearch.js +0 -72
  322. package/tests/e2e/helpers/mobileSearch.js +0 -85
  323. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  324. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  325. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  326. package/tests/karma/BookNavigator/volumes.test.js +0 -133
  327. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  328. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  329. package/tests/plugins/plugin.autoplay.test.js +0 -52
  330. package/tests/plugins/plugin.chapters.test.js +0 -130
  331. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  332. package/tests/plugins/plugin.text_selection.test.js +0 -203
  333. package/tests/util/docCookies.test.js +0 -15
@@ -0,0 +1,250 @@
1
+ import sinon from 'sinon';
2
+ import { afterEventLoop, eventTargetMixin } from '../utils.js';
3
+ import {
4
+ clamp,
5
+ cssPercentage,
6
+ debounce,
7
+ decodeURIComponentPlus,
8
+ encodeURIComponentPlus,
9
+ escapeHTML,
10
+ escapeRegExp,
11
+ getActiveElement,
12
+ isInputActive,
13
+ parseAnimationSpeed,
14
+ poll,
15
+ polyfillCustomEvent,
16
+ PolyfilledCustomEvent,
17
+ promisifyEvent,
18
+ sleep,
19
+ } from '@/src/BookReader/utils.js';
20
+
21
+ test('clamp function returns Math.min(Math.max(value, min), max)', () => {
22
+ expect(clamp(2,1,3)).toEqual(2);
23
+ });
24
+
25
+ test('calculate a percentage suitable for CSS', () => {
26
+ expect(cssPercentage(2,1)).toEqual('200%');
27
+ });
28
+
29
+ test('escapeHTML function which replaces the string', () => {
30
+ expect(escapeHTML('Me & You')).toEqual('Me & You');
31
+ expect(escapeHTML('Me > You')).toEqual('Me > You');
32
+ expect(escapeHTML('Me < You')).toEqual('Me &lt; You');
33
+ expect(escapeHTML('Me " You')).toEqual('Me &quot; You');
34
+ });
35
+
36
+ test('Decodes a URI component and converts + to emptyStr', () => {
37
+ expect(decodeURIComponentPlus("https%3A%2F%2Farchive.org%2Fskr+")).toEqual("https://archive.org/skr ");
38
+ expect(decodeURIComponentPlus("%3Fx%3D+test")).toEqual("?x= test");
39
+ });
40
+
41
+ test('Encodes a URI component and converts emptyStr to +', () => {
42
+ expect(encodeURIComponentPlus("?x=test ")).toEqual("%3Fx%3Dtest+");
43
+ expect(encodeURIComponentPlus("ABC abc 123")).toEqual("ABC+abc+123");
44
+ });
45
+
46
+ describe('getActiveElement', () => {
47
+ test('Can ignore shadow DOM', () => {
48
+ const doc = {activeElement: { shadowRoot: {activeElement: {}}}};
49
+ expect(getActiveElement(doc, false)).toBe(doc.activeElement);
50
+ });
51
+
52
+ test('Can traverse shadow DOM', () => {
53
+ const doc = {activeElement: { shadowRoot: {activeElement: {}}}};
54
+ expect(getActiveElement(doc, true)).toBe(doc.activeElement.shadowRoot.activeElement);
55
+ });
56
+
57
+ test('Handles non-shadow elements', () => {
58
+ const doc = {activeElement: {}};
59
+ expect(getActiveElement(doc, true)).toBe(doc.activeElement);
60
+ });
61
+
62
+ test('Handles no active element', () => {
63
+ const doc = {activeElement: null};
64
+ expect(getActiveElement(doc, true)).toBe(null);
65
+ });
66
+ });
67
+
68
+ describe('isInputActive', () => {
69
+ test('Handles no activeElement', () => {
70
+ expect(isInputActive({activeElement: null})).toBe(false);
71
+ });
72
+
73
+ test('Handles deep input activeElement', () => {
74
+ const doc = {activeElement: { shadowRoot: {activeElement: { tagName: 'INPUT' }}}};
75
+ expect(isInputActive(doc)).toBe(true);
76
+ });
77
+
78
+ test('Handles deep non-input activeElement', () => {
79
+ const doc = {activeElement: { shadowRoot: {activeElement: { tagName: 'A' }}}};
80
+ expect(isInputActive(doc)).toBe(false);
81
+ });
82
+
83
+ test('Handles textarea activeElement', () => {
84
+ const doc = {activeElement: { tagName: 'TEXTAREA' }};
85
+ expect(isInputActive(doc)).toBe(true);
86
+ });
87
+ });
88
+
89
+ describe('debounce', () => {
90
+ /** @type {sinon.SinonFakeTimers} */
91
+ let clock;
92
+ beforeEach(() => clock = sinon.useFakeTimers());
93
+ afterEach(() => clock.restore());
94
+
95
+ test('testing debounce', () => {
96
+ const func = jest.fn();
97
+ const debouncedFunc = debounce(func, 1000);
98
+ // Call it immediately
99
+ debouncedFunc();
100
+ expect(func).toHaveBeenCalledTimes(0); // func not called
101
+
102
+ // Call it several times with 500ms between each call
103
+ for (let i = 0; i < 10; i++) {
104
+ clock.tick(500);
105
+ debouncedFunc();
106
+ }
107
+ expect(func).toHaveBeenCalledTimes(0); // func not called
108
+
109
+ // wait 1000ms
110
+ clock.tick(1000);
111
+ expect(func).toHaveBeenCalledTimes(1); // func called
112
+ });
113
+ });
114
+
115
+
116
+ describe('polyfillCustomEvent', () => {
117
+ test('Overrides when missing', () => {
118
+ const win = {};
119
+ polyfillCustomEvent(win);
120
+ expect(win).toHaveProperty('CustomEvent');
121
+ });
122
+
123
+ test('Overrides when not a function', () => {
124
+ const win = { CustomEvent: {} };
125
+ polyfillCustomEvent(win);
126
+ expect(typeof win.CustomEvent).toBe('function');
127
+ });
128
+ });
129
+
130
+ describe('PolyfilledCustomEvent', () => {
131
+ test('Can be called as a constructor', () => {
132
+ new PolyfilledCustomEvent('foo');
133
+ });
134
+
135
+ test('Calls deprecated browser methods', () => {
136
+ const createEventSpy = sinon.spy(document, 'createEvent');
137
+ const initCustomEventSpy = sinon.spy(CustomEvent.prototype, 'initCustomEvent');
138
+ new PolyfilledCustomEvent('foo');
139
+ expect(createEventSpy.callCount).toBe(1);
140
+ expect(initCustomEventSpy.callCount).toBe(1);
141
+ });
142
+ });
143
+
144
+ describe('poll', () => {
145
+ beforeEach(() => jest.useFakeTimers());
146
+ afterEach(() => jest.useRealTimers());
147
+ test('polls until condition is true', async () => {
148
+ const fakeSleep = sinon.spy((ms) => jest.advanceTimersByTime(ms));
149
+
150
+ const returns = [null, null, 'foo'];
151
+ const check = sinon.spy(() => returns.shift());
152
+ const result = await poll(check, {_sleep: fakeSleep});
153
+ expect(fakeSleep.callCount).toBe(2);
154
+ expect(result).toBe('foo');
155
+ expect(check.callCount).toBe(3);
156
+ });
157
+
158
+ test('times out eventually', async () => {
159
+ const fakeSleep = sinon.spy((ms) => jest.advanceTimersByTime(ms));
160
+
161
+ const check = sinon.stub().returns(null);
162
+ const result = await poll(check, {_sleep: fakeSleep});
163
+ expect(result).toBeUndefined();
164
+ expect(check.callCount).toBe(10);
165
+ });
166
+ });
167
+
168
+ describe('sleep', () => {
169
+ test('Sleep 0 doest not called immediately', async () => {
170
+ const spy = sinon.spy();
171
+ sleep(0).then(spy);
172
+ expect(spy.callCount).toBe(0);
173
+ await afterEventLoop();
174
+ expect(spy.callCount).toBe(1);
175
+ });
176
+
177
+ test('Waits the appropriate ms', async () => {
178
+ const clock = sinon.useFakeTimers();
179
+ const spy = sinon.spy();
180
+ sleep(10).then(spy);
181
+ expect(spy.callCount).toBe(0);
182
+ clock.tick(10);
183
+ expect(spy.callCount).toBe(0);
184
+ clock.restore();
185
+
186
+ await afterEventLoop();
187
+ expect(spy.callCount).toBe(1);
188
+ });
189
+ });
190
+
191
+ describe('promisifyEvent', () => {
192
+ test('Resolves once event fires', async () => {
193
+ const fakeTarget = eventTargetMixin();
194
+ const resolveSpy = sinon.spy();
195
+ promisifyEvent(fakeTarget, 'pause').then(resolveSpy);
196
+
197
+ await afterEventLoop();
198
+ expect(resolveSpy.callCount).toBe(0);
199
+ fakeTarget.dispatchEvent('pause', {});
200
+ await afterEventLoop();
201
+ expect(resolveSpy.callCount).toBe(1);
202
+ });
203
+
204
+ test('Only resolves once', async () => {
205
+ const fakeTarget = eventTargetMixin();
206
+ const resolveSpy = sinon.spy();
207
+ promisifyEvent(fakeTarget, 'pause').then(resolveSpy);
208
+
209
+ await afterEventLoop();
210
+ expect(resolveSpy.callCount).toBe(0);
211
+ fakeTarget.dispatchEvent('pause', {});
212
+ fakeTarget.dispatchEvent('pause', {});
213
+ fakeTarget.dispatchEvent('pause', {});
214
+ fakeTarget.dispatchEvent('pause', {});
215
+
216
+ await afterEventLoop();
217
+ expect(resolveSpy.callCount).toBe(1);
218
+ });
219
+ });
220
+
221
+ describe('escapeRegex', () => {
222
+ test('Escapes regex', () => {
223
+ expect(escapeRegExp('.*')).toBe('\\.\\*');
224
+ expect(escapeRegExp('foo')).toBe('foo');
225
+ expect(escapeRegExp('foo.bar')).toBe('foo\\.bar');
226
+ expect(escapeRegExp('{{{')).toBe('\\{\\{\\{');
227
+ expect(escapeRegExp('')).toBe('');
228
+ expect(escapeRegExp('https://example.com')).toBe('https://example\\.com');
229
+ });
230
+ });
231
+
232
+ describe('parseAnimationSpeed', () => {
233
+ test('Parses numbers', () => {
234
+ expect(parseAnimationSpeed(100)).toBe(100);
235
+ expect(parseAnimationSpeed(0)).toBe(0);
236
+ expect(parseAnimationSpeed(1000)).toBe(1000);
237
+ });
238
+
239
+ test('Parses strings', () => {
240
+ expect(parseAnimationSpeed('slow')).toBe(600);
241
+ expect(parseAnimationSpeed('fast')).toBe(200);
242
+ expect(parseAnimationSpeed('100')).toBe(100);
243
+ });
244
+
245
+ test('Handles invalid input', () => {
246
+ expect(parseAnimationSpeed('foo')).toBeFalsy();
247
+ expect(parseAnimationSpeed('')).toBeFalsy();
248
+ expect(parseAnimationSpeed(null)).toBeFalsy();
249
+ });
250
+ });
@@ -0,0 +1,190 @@
1
+ import BookReader from '@/src/BookReader.js';
2
+ import * as utils from '@/src/BookReader/utils.js';
3
+
4
+ let br;
5
+ beforeAll(() => {
6
+ document.body.innerHTML = '<div id="BookReader">';
7
+ br = new BookReader();
8
+ });
9
+
10
+ afterEach(() => {
11
+ jest.clearAllMocks();
12
+ });
13
+
14
+ /**
15
+ * Only run init() once. Otherwise multiple EventListeners will be added.
16
+ */
17
+ test('Initialzation enables IntersectionObserver and defaults', () => {
18
+ const observe = jest.fn();
19
+ window.IntersectionObserver = jest.fn(() => ({
20
+ observe,
21
+ }));
22
+ br.init();
23
+ expect(br.hasKeyFocus).toBe(true);
24
+ expect(observe).toHaveBeenCalledTimes(1);
25
+ });
26
+
27
+ describe('Keyboard shortcuts turned off', () => {
28
+
29
+ test('Focus flag disables', () => {
30
+ br.next = jest.fn();
31
+ br.hasKeyFocus = false;
32
+ const keyEvent = new KeyboardEvent('keydown', {'key': 'ArrowDown'});
33
+ keyEvent.preventDefault = jest.fn();
34
+ document.dispatchEvent(keyEvent);
35
+ expect(br.next).toHaveBeenCalledTimes(0);
36
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(0);
37
+ // Must reset for following tests
38
+ br.hasKeyFocus = true;
39
+ });
40
+
41
+ test('Input active disables', () => {
42
+ // eslint-disable-next-line no-import-assign
43
+ utils.isInputActive = jest.fn(() => true);
44
+ br.next = jest.fn();
45
+ const keyEvent = new KeyboardEvent('keydown', {'key': 'ArrowDown'});
46
+ keyEvent.preventDefault = jest.fn();
47
+ document.dispatchEvent(keyEvent);
48
+ expect(br.next).toHaveBeenCalledTimes(0);
49
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(0);
50
+ // Must reset for following tests
51
+ utils.isInputActive.mockReset();
52
+ });
53
+
54
+ });
55
+
56
+ describe('Keyboard shortcuts', () => {
57
+
58
+ test('Home key', () => {
59
+ br.first = jest.fn();
60
+ const keyEvent = new KeyboardEvent('keydown', {'key': 'Home'});
61
+ keyEvent.preventDefault = jest.fn();
62
+ document.dispatchEvent(keyEvent);
63
+ expect(br.first).toHaveBeenCalledTimes(1);
64
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
65
+ });
66
+
67
+ test('End key', () => {
68
+ br.last = jest.fn();
69
+ const keyEvent = new KeyboardEvent('keydown', {'key': 'End'});
70
+ keyEvent.preventDefault = jest.fn();
71
+ document.dispatchEvent(keyEvent);
72
+ expect(br.last).toHaveBeenCalledTimes(1);
73
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
74
+ });
75
+
76
+ test('ArrowDown key', () => {
77
+ br.mode = br.constMode2up;
78
+ br.next = jest.fn();
79
+ const keyEvent = new KeyboardEvent('keydown', {'key': 'ArrowDown'});
80
+ keyEvent.preventDefault = jest.fn();
81
+ document.dispatchEvent(keyEvent);
82
+ expect(br.next).toHaveBeenCalledTimes(1);
83
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
84
+ });
85
+
86
+ test('PageDown key', () => {
87
+ br.mode = br.constMode2up;
88
+ br.next = jest.fn();
89
+ const keyEvent = new KeyboardEvent('keydown', {'key': 'PageDown'});
90
+ keyEvent.preventDefault = jest.fn();
91
+ document.dispatchEvent(keyEvent);
92
+ expect(br.next).toHaveBeenCalledTimes(1);
93
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
94
+ });
95
+
96
+ test('ArrowUp key', () => {
97
+ br.mode = br.constMode2up;
98
+ br.prev = jest.fn();
99
+ const keyEvent = new KeyboardEvent('keydown', {'key': 'ArrowUp'});
100
+ keyEvent.preventDefault = jest.fn();
101
+ document.dispatchEvent(keyEvent);
102
+ expect(br.prev).toHaveBeenCalledTimes(1);
103
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
104
+ });
105
+
106
+ test('PageUp key', () => {
107
+ br.mode = br.constMode2up;
108
+ br.prev = jest.fn();
109
+ const keyEvent = new KeyboardEvent('keydown', {'key': 'PageUp'});
110
+ keyEvent.preventDefault = jest.fn();
111
+ document.dispatchEvent(keyEvent);
112
+ expect(br.prev).toHaveBeenCalledTimes(1);
113
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
114
+ });
115
+
116
+ test('ArrowLeft key', () => {
117
+ br.mode = br.constMode2up;
118
+ br.left = jest.fn();
119
+ const keyEvent = new KeyboardEvent('keydown', {'key': 'ArrowLeft'});
120
+ keyEvent.preventDefault = jest.fn();
121
+ document.dispatchEvent(keyEvent);
122
+ expect(br.left).toHaveBeenCalledTimes(1);
123
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
124
+ });
125
+
126
+ test('ArrowRight key', () => {
127
+ br.mode = br.constMode2up;
128
+ br.right = jest.fn();
129
+ const keyEvent = new KeyboardEvent('keydown', {'key': 'ArrowRight'});
130
+ keyEvent.preventDefault = jest.fn();
131
+ document.dispatchEvent(keyEvent);
132
+ expect(br.right).toHaveBeenCalledTimes(1);
133
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
134
+ });
135
+
136
+ test('Subtract key', () => {
137
+ br.zoom = jest.fn();
138
+ const keyEvent = new KeyboardEvent('keydown', {'key': 'Subtract'});
139
+ keyEvent.preventDefault = jest.fn();
140
+ document.dispatchEvent(keyEvent);
141
+ expect(br.zoom).toHaveBeenCalledTimes(1);
142
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
143
+ });
144
+
145
+ test('- key', () => {
146
+ br.zoom = jest.fn();
147
+ const keyEvent = new KeyboardEvent('keydown', {'key': '-'});
148
+ keyEvent.preventDefault = jest.fn();
149
+ document.dispatchEvent(keyEvent);
150
+ expect(br.zoom).toHaveBeenCalledTimes(1);
151
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
152
+ });
153
+
154
+ test('Add key', () => {
155
+ br.zoom = jest.fn();
156
+ const keyEvent = new KeyboardEvent('keydown', {'key': 'Add'});
157
+ keyEvent.preventDefault = jest.fn();
158
+ document.dispatchEvent(keyEvent);
159
+ expect(br.zoom).toHaveBeenCalledTimes(1);
160
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
161
+ });
162
+
163
+ test('+ key', () => {
164
+ br.zoom = jest.fn();
165
+ const keyEvent = new KeyboardEvent('keydown', {'key': '+'});
166
+ keyEvent.preventDefault = jest.fn();
167
+ document.dispatchEvent(keyEvent);
168
+ expect(br.zoom).toHaveBeenCalledTimes(1);
169
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
170
+ });
171
+
172
+ test('= key', () => {
173
+ br.zoom = jest.fn();
174
+ const keyEvent = new KeyboardEvent('keydown', {'key': '='});
175
+ keyEvent.preventDefault = jest.fn();
176
+ document.dispatchEvent(keyEvent);
177
+ expect(br.zoom).toHaveBeenCalledTimes(1);
178
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
179
+ });
180
+
181
+ test('F key', () => {
182
+ br.toggleFullscreen = jest.fn();
183
+ const keyEvent = new KeyboardEvent('keydown', {'key': 'F'});
184
+ keyEvent.preventDefault = jest.fn();
185
+ document.dispatchEvent(keyEvent);
186
+ expect(br.toggleFullscreen).toHaveBeenCalledTimes(1);
187
+ expect(keyEvent.preventDefault).toHaveBeenCalledTimes(1);
188
+ });
189
+
190
+ });
@@ -1,5 +1,5 @@
1
1
 
2
- import BookReader from '../src/BookReader.js';
2
+ import BookReader from '@/src/BookReader.js';
3
3
 
4
4
  beforeAll(() => {
5
5
  document.body.innerHTML = '<div id="BookReader">';
@@ -21,7 +21,7 @@ describe('BookReader options', () => {
21
21
  describe('`startFullscreen`', () => {
22
22
  it('initializes BookReader to fullscreen', () => {
23
23
  const br = new BookReader({
24
- startFullscreen: true
24
+ startFullscreen: true,
25
25
  });
26
26
  br.init();
27
27
 
@@ -36,4 +36,12 @@ describe('BookReader options', () => {
36
36
  expect(br.options.autoResize).toBe(true);
37
37
  });
38
38
  });
39
+
40
+ describe('`showNavbar`', () => {
41
+ it('is on by default', () => {
42
+ const br = new BookReader();
43
+ br.init();
44
+ expect(br.options.showNavbar).toBe(true);
45
+ });
46
+ });
39
47
  });
@@ -1,8 +1,9 @@
1
1
 
2
- import BookReader from '../src/BookReader.js';
3
- import '../src/plugins/plugin.resume.js';
4
- import '../src/plugins/plugin.url.js';
2
+ import BookReader, {_modeStringToNumber} from '@/src/BookReader.js';
3
+ import '@/src/plugins/plugin.resume.js';
4
+ import '@/src/plugins/url/plugin.url.js';
5
5
 
6
+ /** @type {import('@/src/BookReader.js').default} */
6
7
  let br;
7
8
  beforeAll(() => {
8
9
  document.body.innerHTML = '<div id="BookReader">';
@@ -33,35 +34,35 @@ test('has registered fullscreen toggle event', () => {
33
34
  });
34
35
 
35
36
  test('checks cookie when initParams called', () => {
36
- br.getResumeValue = jest.fn(() => 15);
37
+ br._plugins.resume.getResumeValue = jest.fn(() => 15);
37
38
  br.urlReadFragment = jest.fn(() => '');
38
39
 
39
40
  const params = br.initParams();
40
- expect(br.getResumeValue).toHaveBeenCalledTimes(1);
41
+ expect(br._plugins.resume.getResumeValue).toHaveBeenCalledTimes(1);
41
42
  expect(params.init).toBe(true);
42
43
  expect(params.index).toBe(15);
43
44
  expect(params.fragmentChange).toBe(true);
44
45
  });
45
46
 
46
47
  test('does not check cookie when initParams called', () => {
47
- br.getResumeValue = jest.fn(() => null);
48
+ br._plugins.resume.getResumeValue = jest.fn(() => null);
48
49
  br.urlReadFragment = jest.fn(() => '');
49
- br.options.enablePageResume = false;
50
+ br.options.plugins.resume.enabled = false;
50
51
 
51
52
  const params = br.initParams();
52
- expect(br.getResumeValue).toHaveBeenCalledTimes(0);
53
+ expect(br._plugins.resume.getResumeValue).toHaveBeenCalledTimes(0);
53
54
  expect(params.init).toBe(true);
54
55
  expect(params.index).toBe(0);
55
56
  expect(params.fragmentChange).toBe(false);
56
57
  });
57
58
 
58
59
  test('gets index from fragment when both fragment and cookie when InitParams called', () => {
59
- br.getResumeValue = jest.fn(() => 15);
60
+ br._plugins.resume.getResumeValue = jest.fn(() => 15);
60
61
  br.urlReadFragment = jest.fn(() => 'page/n4');
61
- br.options.enablePageResume = true;
62
+ br.options.plugins.resume.enabled = true;
62
63
 
63
64
  const params = br.initParams();
64
- expect(br.getResumeValue).toHaveBeenCalledTimes(1);
65
+ expect(br._plugins.resume.getResumeValue).toHaveBeenCalledTimes(1);
65
66
  expect(params.init).toBe(true);
66
67
  expect(params.index).toBe(4);
67
68
  expect(params.fragmentChange).toBe(true);
@@ -91,7 +92,7 @@ test('calls switchMode with init option when init called', () => {
91
92
  });
92
93
 
93
94
  test('has suppressFragmentChange true when init with no input', () => {
94
- br.getResumeValue = jest.fn(() => null);
95
+ br._plugins.resume.getResumeValue = jest.fn(() => null);
95
96
  br.urlReadFragment = jest.fn(() => '');
96
97
  br.urlReadHashFragment = jest.fn(() => '');
97
98
  br.switchMode = jest.fn();
@@ -102,7 +103,7 @@ test('has suppressFragmentChange true when init with no input', () => {
102
103
  });
103
104
 
104
105
  test('has suppressFragmentChange false when init with cookie', () => {
105
- br.getResumeValue = jest.fn(() => 5);
106
+ br._plugins.resume.getResumeValue = jest.fn(() => 5);
106
107
  br.urlReadFragment = jest.fn(() => '');
107
108
  br.switchMode = jest.fn();
108
109
 
@@ -112,7 +113,7 @@ test('has suppressFragmentChange false when init with cookie', () => {
112
113
  });
113
114
 
114
115
  test('has suppressFragmentChange false when init with fragment', () => {
115
- br.getResumeValue = jest.fn(() => null);
116
+ br._plugins.resume.getResumeValue = jest.fn(() => null);
116
117
  br.urlReadFragment = jest.fn(() => 'mode/1up');
117
118
  br.switchMode = jest.fn();
118
119
 
@@ -122,9 +123,9 @@ test('has suppressFragmentChange false when init with fragment', () => {
122
123
  });
123
124
 
124
125
  test('has suppressFragmentChange false when init with hash fragment', () => {
125
- br.getResumeValue = jest.fn(() => null);
126
+ br._plugins.resume.getResumeValue = jest.fn(() => null);
126
127
  br.urlReadFragment = jest.fn(() => '');
127
- br.urlReadHashFragment = jest.fn(() => 'mode/1up')
128
+ br.urlReadHashFragment = jest.fn(() => 'mode/1up');
128
129
  br.switchMode = jest.fn();
129
130
  br.options.urlMode = 'history',
130
131
 
@@ -137,7 +138,7 @@ test('adds q= term to urlMode=history query string', () => {
137
138
  expect(br.queryStringFromParams(
138
139
  { search: 'test value' },
139
140
  'name=value',
140
- 'history'
141
+ 'history',
141
142
  )).toBe('?name=value&q=test+value');
142
143
  });
143
144
 
@@ -145,7 +146,7 @@ test('replaces q= term in urlMode=history query string', () => {
145
146
  expect(br.queryStringFromParams(
146
147
  { search: 'test+value' },
147
148
  'q=foo&a=1&b=2&c=3',
148
- 'history'
149
+ 'history',
149
150
  )).toBe('?q=test%2Bvalue&a=1&b=2&c=3');
150
151
  });
151
152
 
@@ -153,43 +154,24 @@ test('does not add q= term to urlMode=hash query string', () => {
153
154
  expect(br.queryStringFromParams(
154
155
  { search: 'test value' },
155
156
  'name=value',
156
- 'hash'
157
+ 'hash',
157
158
  )).toBe('?name=value');
158
159
  });
159
160
 
160
- test('_getPageURISrcset with 0 page book', () => {
161
- br._models.book.getNumLeafs = jest.fn(() => 0);
162
- br._models.book.getPageURI = jest.fn((index, scale, rotate) => "correctURL.png&scale=" + scale);
163
- br.init();
164
- expect(br._getPageURISrcset(5, undefined, undefined)).toBe("");
165
- });
166
-
167
- test('_getPageURISrcset with negative index', () => {
168
- br._models.book.getNumLeafs = jest.fn(() => 0);
169
- br._models.book.getPageURI = jest.fn((index, scale, rotate) => "correctURL.png&scale=" + scale);
170
- br.init();
171
- expect(br._getPageURISrcset(-7, undefined, undefined)).toBe("");
172
- });
173
-
174
- test('_getPageURISrcset with 0 elements in srcset', () => {
175
- br._models.book.getNumLeafs = jest.fn(() => 30);
176
- br._models.book.getPageURI = jest.fn((index, scale, rotate) => "correctURL.png&scale=" + scale);
177
- br.init();
178
- expect(br._getPageURISrcset(5, 1, undefined)).toBe("");
179
- });
180
-
181
- test('_getPageURISrcset with 2 elements in srcset', () => {
182
- br._models.book.getNumLeafs = jest.fn(() => 30);
183
- br._models.book.getPageURI = jest.fn((index, scale, rotate) => "correctURL.png&scale=" + scale);
184
- br.init();
185
- expect(br._getPageURISrcset(5, 5, undefined)).toBe("correctURL.png&scale=2 2x, correctURL.png&scale=1 4x");
186
- });
187
-
188
- test('_getPageURISrcset with the most elements in srcset', () => {
189
- br._models.book.getNumLeafs = jest.fn(() => 30);
190
- br._models.book.getPageURI = jest.fn((index, scale, rotate) => "correctURL.png&scale=" + scale);
191
- br.init();
192
- expect(br._getPageURISrcset(5, 35, undefined)).toBe("correctURL.png&scale=16 2x, correctURL.png&scale=8 4x, correctURL.png&scale=4 8x, correctURL.png&scale=2 16x, correctURL.png&scale=1 32x");
161
+ describe('Navigation Bars', () => {
162
+ test('Standard navigation is being used by default', () => {
163
+ br.initNavbar = jest.fn();
164
+ br.options.ui = '';
165
+ br.init();
166
+ expect(br.initNavbar).toHaveBeenCalledTimes(1);
167
+ });
168
+ test('Standard navigation is being used by default - when bookreader is embedded', () => {
169
+ br.initNavbar = jest.fn();
170
+ br.options.ui = 'embed';
171
+ br.init();
172
+ expect(br.initNavbar).toHaveBeenCalledTimes(1);
173
+ expect(br.options.ui).toEqual('embed');
174
+ });
193
175
  });
194
176
 
195
177
  describe('quantizeReduce', () => {
@@ -247,7 +229,7 @@ describe('nextReduce', () => {
247
229
  // auto doesn't get read by nextReduce (bug)
248
230
  // It looks like width/height are set for 1up, and auto is set for 2up,
249
231
  // and neither is set for thumb
250
- { reduce: 6.2, autofit: "auto" }
232
+ { reduce: 6.2, autofit: "auto" },
251
233
  ];
252
234
 
253
235
  const currentReduces = [
@@ -299,3 +281,11 @@ describe('nextReduce', () => {
299
281
  });
300
282
  });
301
283
  });
284
+
285
+ describe('_modeStringToNumber', () => {
286
+ test('Returns correct number', () => {
287
+ expect(_modeStringToNumber('mode/1up')).toBe(1);
288
+ expect(_modeStringToNumber('mode/2up')).toBe(2);
289
+ expect(_modeStringToNumber('mode/thumb')).toBe(3);
290
+ });
291
+ });
@@ -0,0 +1,20 @@
1
+ import sinon from 'sinon';
2
+ import {ArchiveAnalyticsPlugin} from '@/src/plugins/plugin.archive_analytics.js';
3
+
4
+ describe('sendEvent', () => {
5
+ test('logs if debug set to true', () => {
6
+ const stub = sinon.stub(console, 'log');
7
+ const p = new ArchiveAnalyticsPlugin({});
8
+ p.setup({ debug: true });
9
+ p.sendEvent();
10
+ expect(stub.callCount).toBe(1);
11
+ stub.restore();
12
+ });
13
+
14
+ test('Does not error if window.archive_analytics is undefined', () => {
15
+ const p = new ArchiveAnalyticsPlugin({});
16
+ const spy = sinon.spy(p.sendEvent);
17
+ p.sendEvent();
18
+ expect(spy.threw()).toBe(false);
19
+ });
20
+ });