@internetarchive/bookreader 5.0.0-9 → 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 (324) hide show
  1. package/.eslintrc.js +21 -19
  2. package/.github/workflows/node.js.yml +76 -11
  3. package/.github/workflows/npm-publish.yml +6 -20
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +404 -1125
  6. package/BookReader/BookReader.js +1 -1
  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 -1
  13. package/BookReader/icons/2up.svg +1 -1
  14. package/BookReader/icons/advance.svg +1 -1
  15. package/BookReader/icons/chevron-right.svg +1 -1
  16. package/BookReader/icons/close-circle-dark.svg +1 -1
  17. package/BookReader/icons/close-circle.svg +1 -1
  18. package/BookReader/icons/fullscreen.svg +1 -1
  19. package/BookReader/icons/fullscreen_exit.svg +1 -1
  20. package/BookReader/icons/hamburger.svg +1 -1
  21. package/BookReader/icons/left-arrow.svg +1 -1
  22. package/BookReader/icons/magnify-minus.svg +1 -1
  23. package/BookReader/icons/magnify-plus.svg +1 -1
  24. package/BookReader/icons/magnify.svg +1 -1
  25. package/BookReader/icons/pause.svg +1 -1
  26. package/BookReader/icons/play.svg +1 -1
  27. package/BookReader/icons/playback-speed.svg +1 -1
  28. package/BookReader/icons/read-aloud.svg +1 -1
  29. package/BookReader/icons/review.svg +1 -1
  30. package/BookReader/icons/thumbnails.svg +1 -1
  31. package/BookReader/icons/voice.svg +1 -0
  32. package/BookReader/icons/volume-full.svg +1 -1
  33. package/BookReader/images/BRicons.svg +3 -3
  34. package/BookReader/images/books_graphic.svg +1 -1
  35. package/BookReader/images/icon_book.svg +1 -1
  36. package/BookReader/images/icon_bookmark.svg +1 -1
  37. package/BookReader/images/icon_gear.svg +1 -1
  38. package/BookReader/images/icon_hamburger.svg +1 -1
  39. package/BookReader/images/icon_home.svg +1 -1
  40. package/BookReader/images/icon_info.svg +1 -1
  41. package/BookReader/images/icon_one_page.svg +1 -1
  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 -1
  45. package/BookReader/images/icon_search_button.svg +1 -1
  46. package/BookReader/images/icon_share.svg +1 -1
  47. package/BookReader/images/icon_skip-ahead.svg +1 -1
  48. package/BookReader/images/icon_skip-back.svg +1 -1
  49. package/BookReader/images/icon_speaker.svg +1 -1
  50. package/BookReader/images/icon_speaker_open.svg +1 -1
  51. package/BookReader/images/icon_thumbnails.svg +1 -1
  52. package/BookReader/images/icon_toc.svg +1 -1
  53. package/BookReader/images/icon_two_pages.svg +1 -1
  54. package/BookReader/images/marker_chap-off.svg +1 -1
  55. package/BookReader/images/marker_chap-on.svg +1 -1
  56. package/BookReader/images/marker_srch-on.svg +1 -1
  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 -1
  61. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  62. package/BookReader/plugins/plugin.autoplay.js +1 -1
  63. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  64. package/BookReader/plugins/plugin.chapters.js +25 -1
  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 -1
  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 -1
  72. package/BookReader/plugins/plugin.resume.js.map +1 -1
  73. package/BookReader/plugins/plugin.search.js +2 -1
  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 -1
  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 +1 -1
  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 -1
  83. package/BookReader/plugins/plugin.url.js.map +1 -1
  84. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  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 +584 -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 +5 -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 +50 -28
  135. package/src/BookNavigator/search/search-results.js +24 -10
  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 +544 -1078
  162. package/src/BookReaderPlugin.js +44 -0
  163. package/src/assets/icons/magnify-minus.svg +3 -7
  164. package/src/assets/icons/magnify-plus.svg +3 -7
  165. package/src/assets/icons/voice.svg +1 -0
  166. package/src/assets/images/unviewable_page.png +0 -0
  167. package/src/css/BookReader.scss +1 -5
  168. package/src/css/_BRBookmarks.scss +1 -1
  169. package/src/css/_BRComponent.scss +1 -1
  170. package/src/css/_BRicon.scss +8 -2
  171. package/src/css/_BRmain.scss +16 -3
  172. package/src/css/_BRnav.scss +12 -42
  173. package/src/css/_BRpages.scss +170 -42
  174. package/src/css/_BRsearch.scss +68 -25
  175. package/src/css/_BRtoolbar.scss +5 -5
  176. package/src/css/_TextSelection.scss +87 -27
  177. package/src/css/_colorbox.scss +2 -2
  178. package/src/css/_controls.scss +24 -7
  179. package/src/css/_icons.scss +1 -1
  180. package/src/ia-bookreader/ia-bookreader.js +224 -0
  181. package/src/plugins/plugin.archive_analytics.js +84 -78
  182. package/src/plugins/plugin.autoplay.js +99 -104
  183. package/src/plugins/plugin.chapters.js +237 -191
  184. package/src/plugins/plugin.iframe.js +1 -1
  185. package/src/plugins/plugin.iiif.js +141 -0
  186. package/src/plugins/plugin.resume.js +53 -50
  187. package/src/plugins/plugin.text_selection.js +503 -175
  188. package/src/plugins/plugin.vendor-fullscreen.js +7 -7
  189. package/src/plugins/search/plugin.search.js +151 -127
  190. package/src/plugins/search/utils.js +43 -0
  191. package/src/plugins/search/view.js +37 -59
  192. package/src/plugins/tts/AbstractTTSEngine.js +75 -45
  193. package/src/plugins/tts/FestivalTTSEngine.js +21 -31
  194. package/src/plugins/tts/PageChunk.js +16 -23
  195. package/src/plugins/tts/PageChunkIterator.js +11 -17
  196. package/src/plugins/tts/WebTTSEngine.js +88 -72
  197. package/src/plugins/tts/plugin.tts.js +310 -350
  198. package/src/plugins/tts/utils.js +16 -26
  199. package/src/plugins/url/UrlPlugin.js +191 -0
  200. package/src/plugins/{plugin.url.js → url/plugin.url.js} +47 -18
  201. package/src/util/browserSniffing.js +22 -0
  202. package/src/util/docCookies.js +21 -2
  203. package/src/util/strings.js +1 -0
  204. package/tests/e2e/README.md +37 -0
  205. package/tests/e2e/autoplay.test.js +9 -6
  206. package/tests/e2e/base.test.js +8 -16
  207. package/tests/e2e/helpers/base.js +55 -50
  208. package/tests/e2e/helpers/debug.js +1 -1
  209. package/tests/e2e/helpers/mockSearch.js +19 -22
  210. package/tests/e2e/helpers/params.js +17 -0
  211. package/tests/e2e/helpers/rightToLeft.js +8 -14
  212. package/tests/e2e/helpers/search.js +73 -0
  213. package/tests/e2e/models/Navigation.js +20 -37
  214. package/tests/e2e/rightToLeft.test.js +4 -5
  215. package/tests/e2e/viewmode.test.js +40 -33
  216. package/tests/jest/BookNavigator/book-navigator.test.js +661 -0
  217. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  218. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  219. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  220. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  221. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  222. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  223. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  224. package/tests/{karma → jest}/BookNavigator/search/search-results.test.js +109 -60
  225. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  226. package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +80 -0
  227. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  228. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +74 -14
  229. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
  230. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  231. package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
  232. package/tests/jest/BookReader/Mode2Up.test.js +98 -0
  233. package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
  234. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
  235. package/tests/jest/BookReader/ModeSmoothZoom.test.js +218 -0
  236. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  237. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +42 -29
  238. package/tests/jest/BookReader/PageContainer.test.js +238 -0
  239. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  240. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +3 -3
  241. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  242. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  243. package/tests/jest/BookReader/utils/SelectionObserver.test.js +57 -0
  244. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  245. package/tests/jest/BookReader/utils.test.js +250 -0
  246. package/tests/jest/BookReader.keyboard.test.js +190 -0
  247. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +10 -2
  248. package/tests/{BookReader.test.js → jest/BookReader.test.js} +43 -53
  249. package/tests/jest/plugins/plugin.archive_analytics.test.js +20 -0
  250. package/tests/jest/plugins/plugin.autoplay.test.js +35 -0
  251. package/tests/jest/plugins/plugin.chapters.test.js +195 -0
  252. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +4 -4
  253. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +22 -35
  254. package/tests/jest/plugins/plugin.text_selection.test.js +316 -0
  255. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  256. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +19 -47
  257. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +42 -9
  258. package/tests/jest/plugins/search/utils.js +25 -0
  259. package/tests/jest/plugins/search/utils.test.js +29 -0
  260. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +30 -10
  261. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  262. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  263. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  264. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
  265. package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
  266. package/tests/jest/plugins/url/UrlPlugin.test.js +198 -0
  267. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +57 -18
  268. package/tests/jest/setup.js +3 -0
  269. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  270. package/tests/jest/util/docCookies.test.js +24 -0
  271. package/tests/{util → jest/util}/strings.test.js +1 -1
  272. package/tests/{utils.js → jest/utils.js} +38 -0
  273. package/webpack.config.js +16 -10
  274. package/.babelrc +0 -12
  275. package/.dependabot/config.yml +0 -6
  276. package/.testcaferc.json +0 -5
  277. package/BookReader/bookreader-component-bundle.js +0 -1450
  278. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  279. package/BookReader/bookreader-component-bundle.js.map +0 -1
  280. package/BookReader/jquery-1.10.1.js +0 -2
  281. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  282. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  283. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  284. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  285. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  286. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  287. package/BookReaderDemo/IIIFBookReader.js +0 -207
  288. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  289. package/BookReaderDemo/demo-autoplay.html +0 -38
  290. package/BookReaderDemo/demo-iiif.js +0 -26
  291. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  292. package/karma.conf.js +0 -23
  293. package/src/BookNavigator/BookModel.js +0 -14
  294. package/src/BookNavigator/BookNavigator.js +0 -446
  295. package/src/BookNavigator/assets/book-loader.js +0 -27
  296. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  297. package/src/BookNavigator/search/a-search-result.js +0 -55
  298. package/src/BookReader/DebugConsole.js +0 -54
  299. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  300. package/src/ItemNavigator/ItemNavigator.js +0 -376
  301. package/src/ItemNavigator/providers/sharing.js +0 -29
  302. package/src/css/_MobileNav.scss +0 -194
  303. package/src/dragscrollable-br.js +0 -261
  304. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  305. package/src/plugins/plugin.mobile_nav.js +0 -287
  306. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  307. package/tests/BookReader/DebugConsole.test.js +0 -25
  308. package/tests/BookReader/Mode1Up.test.js +0 -164
  309. package/tests/BookReader/Mode2Up.test.js +0 -247
  310. package/tests/BookReader/PageContainer.test.js +0 -115
  311. package/tests/BookReader/utils.test.js +0 -109
  312. package/tests/e2e/helpers/desktopSearch.js +0 -72
  313. package/tests/e2e/helpers/mobileSearch.js +0 -85
  314. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  315. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  316. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  317. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  318. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  319. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  320. package/tests/plugins/plugin.autoplay.test.js +0 -52
  321. package/tests/plugins/plugin.chapters.test.js +0 -130
  322. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  323. package/tests/plugins/plugin.text_selection.test.js +0 -203
  324. package/tests/util/docCookies.test.js +0 -15
@@ -1,115 +0,0 @@
1
- import {PageContainer} from '../../src/BookReader/PageContainer.js';
2
-
3
- describe('constructor', () => {
4
- test('protected books', () => {
5
- const pc = new PageContainer(null, {isProtected: true});
6
- expect(pc.$container.hasClass('protected')).toBe(true);
7
- expect(pc.$container.find('.BRscreen').length).toBe(1);
8
- });
9
-
10
- test('non-protected books', () => {
11
- const pc = new PageContainer(null, {isProtected: false});
12
- expect(pc.$container.hasClass('protected')).toBe(false);
13
- expect(pc.$container.find('.BRscreen').length).toBe(0);
14
- });
15
-
16
- test('empty page', () => {
17
- const pc = new PageContainer(null, {isProtected: false});
18
- expect(pc.$container.hasClass('BRemptypage')).toBe(true);
19
- });
20
-
21
- test('non-empty page', () => {
22
- const pc = new PageContainer({index: 7}, {isProtected: false});
23
- expect(pc.$container.hasClass('BRemptypage')).toBe(false);
24
- expect(pc.$container.hasClass('pagediv7')).toBe(true);
25
- });
26
-
27
- test('adds side attribute', () => {
28
- const pc = new PageContainer({index: 7, pageSide: 'R'}, {isProtected: false});
29
- expect(pc.$container.hasClass('BRemptypage')).toBe(false);
30
- expect(pc.$container.attr('data-side')).toBe('R');
31
- });
32
- });
33
-
34
- describe('update', async () => {
35
- test('dimensions sets CSS', () => {
36
- const pc = new PageContainer(null, {});
37
- pc.update({ dimensions: { left: 20 } });
38
- expect(pc.$container[0].style.left).toBe('20px');
39
- });
40
-
41
- test('does not create image if empty page', () => {
42
- const pc = new PageContainer(null, {});
43
- pc.update({ reduce: null });
44
- expect(pc.$img).toBeNull();
45
- pc.update({ reduce: 7 });
46
- expect(pc.$img).toBeNull();
47
- });
48
-
49
- test('does not create image if no reduce', () => {
50
- const pc = new PageContainer({index: 17}, {});
51
- pc.update({ reduce: null });
52
- expect(pc.$img).toBeNull();
53
- });
54
-
55
- test('does not set background image if already loaded', () => {
56
- const fakeImageCache = {
57
- imageLoaded: () => true,
58
- image: () => $('<img/>'),
59
- };
60
- const pc = new PageContainer({index: 12}, {imageCache: fakeImageCache});
61
- pc.update({ reduce: 7 });
62
- expect(pc.$img[0].style.background).toBe('');
63
- });
64
-
65
- test('removes image between updates', () => {
66
- const fakeImageCache = {
67
- imageLoaded: () => true,
68
- image: () => $('<img/>'),
69
- };
70
- const pc = new PageContainer({index: 12}, {imageCache: fakeImageCache});
71
- pc.update({ reduce: 7 });
72
- const $im1 = pc.$img;
73
- pc.update({ reduce: 7 });
74
- const $im2 = pc.$img;
75
- expect($im1).not.toBe($im2);
76
- expect($im1.parent().length).toBe(0);
77
- });
78
-
79
- test('adds/removes loading indicators while loading', () => {
80
- const fakeImageCache = {
81
- imageLoaded: () => false,
82
- image: () => $('<img/>'),
83
- getBestLoadedReduce: () => undefined,
84
- };
85
- const pc = new PageContainer({index: 12}, {imageCache: fakeImageCache, loadingImage: 'loading.gif'});
86
- pc.update({ reduce: 7 });
87
- expect(pc.$container.hasClass('BRpageloading')).toBe(true);
88
- // See https://github.com/jsdom/jsdom/issues/3169
89
- // expect(pc.$img.css('background')).toBeTruthy();
90
- // expect(pc.$img.css('background').includes('loading.gif')).toBe(true);
91
- // expect(pc.$img.css('background').includes(',')).toBe(false);
92
-
93
- pc.$img.trigger('loadend');
94
- expect(pc.$container.hasClass('BRpageloading')).toBe(false);
95
- expect(pc.$img.css('background')).toBeFalsy();
96
- });
97
-
98
- test('shows lower res image while loading if one available', () => {
99
- const fakeImageCache = {
100
- imageLoaded: () => false,
101
- image: () => $('<img/>'),
102
- getBestLoadedReduce: () => 3,
103
- };
104
- const fakePage = {
105
- index: 12,
106
- getURI: () => 'page12.jpg',
107
- };
108
- const pc = new PageContainer(fakePage, {imageCache: fakeImageCache, loadingImage: 'loading.gif'});
109
- pc.update({ reduce: 7 });
110
- // See https://github.com/jsdom/jsdom/issues/3169
111
- // expect(pc.$img.css('background').includes('page12.jpg')).toBe(true);
112
- pc.$img.trigger('loadend');
113
- expect(pc.$img.css('background')).toBeFalsy();
114
- });
115
- });
@@ -1,109 +0,0 @@
1
- import sinon from 'sinon';
2
- import {
3
- clamp,
4
- cssPercentage,
5
- debounce,
6
- decodeURIComponentPlus,
7
- encodeURIComponentPlus,
8
- escapeHTML,
9
- polyfillCustomEvent,
10
- PolyfilledCustomEvent,
11
- sleep,
12
- } from '../../src/BookReader/utils.js';
13
-
14
- test('clamp function returns Math.min(Math.max(value, min), max)', () => {
15
- expect(clamp(2,1,3)).toEqual(2);
16
- });
17
-
18
- test('calculate a percentage suitable for CSS', () => {
19
- expect(cssPercentage(2,1)).toEqual('200%');
20
- });
21
-
22
- test('escapeHTML function which replaces the string', () => {
23
- expect(escapeHTML('Me & You')).toEqual('Me &amp; You');
24
- expect(escapeHTML('Me > You')).toEqual('Me &gt; You');
25
- expect(escapeHTML('Me < You')).toEqual('Me &lt; You');
26
- expect(escapeHTML('Me " You')).toEqual('Me &quot; You');
27
- });
28
-
29
- test('Decodes a URI component and converts + to emptyStr', () => {
30
- expect(decodeURIComponentPlus("https%3A%2F%2Farchive.org%2Fskr+")).toEqual("https://archive.org/skr ");
31
- expect(decodeURIComponentPlus("%3Fx%3D+test")).toEqual("?x= test");
32
- });
33
-
34
- test('Encodes a URI component and converts emptyStr to +', () => {
35
- expect(encodeURIComponentPlus("?x=test ")).toEqual("%3Fx%3Dtest+");
36
- expect(encodeURIComponentPlus("ABC abc 123")).toEqual("ABC+abc+123");
37
- });
38
-
39
- let clock;
40
-
41
- beforeEach(() => {
42
- clock = sinon.useFakeTimers();
43
- });
44
-
45
- afterEach(() => {
46
- clock.restore();
47
- });
48
-
49
- test('testing debounce', () => {
50
- const func = jest.fn();
51
- const debouncedFunc = debounce(func, 1000);
52
- // Call it immediately
53
- debouncedFunc();
54
- expect(func).toHaveBeenCalledTimes(0); // func not called
55
-
56
- // Call it several times with 500ms between each call
57
- for (let i = 0; i < 10; i++) {
58
- clock.tick(500);
59
- debouncedFunc();
60
- }
61
- expect(func).toHaveBeenCalledTimes(0); // func not called
62
-
63
- // wait 1000ms
64
- clock.tick(1000);
65
- expect(func).toHaveBeenCalledTimes(1); // func called
66
- });
67
-
68
-
69
- describe('polyfillCustomEvent', () => {
70
- test('Overrides when missing', () => {
71
- const win = {};
72
- polyfillCustomEvent(win);
73
- expect(win).toHaveProperty('CustomEvent');
74
- });
75
-
76
- test('Overrides when not a function', () => {
77
- const win = { CustomEvent: {} };
78
- polyfillCustomEvent(win);
79
- expect(typeof win.CustomEvent).toBe('function');
80
- });
81
- });
82
-
83
- describe('PolyfilledCustomEvent', () => {
84
- test('Can be called as a constructor', () => {
85
- new PolyfilledCustomEvent('foo');
86
- });
87
-
88
- test('Calls deprecated browser methods', () => {
89
- const createEventSpy = sinon.spy(document, 'createEvent');
90
- const initCustomEventSpy = sinon.spy(CustomEvent.prototype, 'initCustomEvent');
91
- new PolyfilledCustomEvent('foo');
92
- expect(createEventSpy.callCount).toBe(1);
93
- expect(initCustomEventSpy.callCount).toBe(1);
94
- });
95
- });
96
-
97
- describe('sleep', () => {
98
- test('can set sleep in ms', async () => {
99
- jest.useFakeTimers();
100
-
101
- const sleepTimeMS = 11;
102
- await sleep(sleepTimeMS);
103
-
104
- expect(setTimeout).toHaveBeenCalledTimes(1);
105
- expect(setTimeout).toHaveBeenLastCalledWith(undefined, sleepTimeMS);
106
-
107
- jest.clearAllTimers();
108
- });
109
- });
@@ -1,72 +0,0 @@
1
- import { ClientFunction, RequestMock } from 'testcafe';
2
- import { SEARCH_INSIDE_URL_RE , mockResponseFound, mockResponseNotFound,
3
- TEST_TEXT_FOUND, TEST_TEXT_NOT_FOUND, PAGE_FIRST_RESULT, SEARCH_MATCHES_LENGTH } from './mockSearch';
4
-
5
-
6
- export function runDesktopSearchTests(br) {
7
- //building mock response for successful and unsuccessful search
8
- const mockFound = RequestMock()
9
- .onRequestTo(SEARCH_INSIDE_URL_RE )
10
- .respond(mockResponseFound, 202);
11
-
12
- const mockNotFound = RequestMock()
13
- .onRequestTo(SEARCH_INSIDE_URL_RE )
14
- .respond(mockResponseNotFound, 202);
15
-
16
-
17
- test
18
- .requestHooks(mockFound)('Desktop search - successful search', async t => {
19
- const nav = br.nav;
20
-
21
- //assuring that the search bar is enabled
22
- await t.expect(nav.desktop.searchBox.visible).ok();
23
-
24
- //testing search for a word found in the book
25
- await t
26
- .selectText(nav.desktop.searchBox.child('.BRsearchInput'))
27
- .pressKey('delete');
28
- await t.typeText(nav.desktop.searchBox.child('.BRsearchInput'), TEST_TEXT_FOUND);
29
- await t.click((nav.desktop.searchBox).child('.BRsearchSubmit'));
30
- await t.expect(nav.desktop.searchPin.exists).ok();
31
- await t.expect(nav.desktop.searchPin.child('.BRquery').child('div').exists).ok();
32
- await t.expect(nav.desktop.searchPin.child('.BRquery').child('div').innerText).contains(TEST_TEXT_FOUND);
33
- await t.expect(nav.desktop.searchNavigation.exists).ok();
34
- await t.expect(nav.desktop.searchNavigation.find('[data-id="resultsCount"]').exists).ok();
35
- await t.expect(nav.desktop.searchNavigation.find('[data-id="resultsCount"]').innerText).contains(SEARCH_MATCHES_LENGTH);
36
-
37
- //checking url
38
- const getPageUrl = ClientFunction(() => window.location.href.toString());
39
- await t.expect(getPageUrl()).contains(TEST_TEXT_FOUND);
40
-
41
- //checks clicking on first search pin opens correct page
42
- await t.click(nav.desktop.searchPin);
43
- await t.expect(getPageUrl()).contains(PAGE_FIRST_RESULT);
44
-
45
- //checks highlight on result page is visible
46
- const highlight = br.shell.find(".BookReaderSearchHilite");
47
- await t.expect(highlight.visible).ok();
48
-
49
- });
50
-
51
-
52
- test
53
- .requestHooks(mockNotFound)('Desktop search - unsuccessful search', async t => {
54
- const nav = br.nav;
55
-
56
- //assuring that the search bar is enabled
57
- await t.expect(nav.desktop.searchBox.visible).ok();
58
-
59
- //testing search for a word not found in the book
60
- await t
61
- .selectText(nav.desktop.searchBox.child('.BRsearchInput'))
62
- .pressKey('delete');
63
- await t.typeText(nav.desktop.searchBox.child('.BRsearchInput'), TEST_TEXT_NOT_FOUND);
64
- await t.click((nav.desktop.searchBox).child('.BRsearchSubmit'));
65
- await t.expect(nav.desktop.searchPin.child('.BRquery').child('div').withText(TEST_TEXT_NOT_FOUND).exists).notOk();
66
-
67
- const getPageUrl = ClientFunction(() => window.location.href.toString());
68
- await t.expect(getPageUrl()).contains(TEST_TEXT_NOT_FOUND);
69
- });
70
-
71
-
72
- }
@@ -1,85 +0,0 @@
1
- import { ClientFunction, RequestMock } from 'testcafe';
2
- import { SEARCH_INSIDE_URL_RE , mockResponseFound, mockResponseNotFound,
3
- TEST_TEXT_FOUND, TEST_TEXT_NOT_FOUND, PAGE_FIRST_RESULT } from './mockSearch';
4
-
5
-
6
- export function runMobileSearchTests(br) {
7
- //building mock response for successful and unsuccessful search
8
- const mockFound = RequestMock()
9
- .onRequestTo(SEARCH_INSIDE_URL_RE )
10
- .respond(mockResponseFound, 202);
11
-
12
- const mockNotFound = RequestMock()
13
- .onRequestTo(SEARCH_INSIDE_URL_RE )
14
- .respond(mockResponseNotFound, 202);
15
-
16
- test
17
- .requestHooks(mockFound)('Mobile search - successful search', async t => {
18
- await t.resizeWindowToFitDevice('Sony Xperia Z', {portraitOrientation: true})
19
- const nav = br.nav.mobile;
20
-
21
- //opening side menu and search
22
- await t.expect(nav.hamburgerButton.visible).ok();
23
- await t.click(nav.hamburgerButton);
24
- await t.expect(nav.menuSearchButton.visible).ok();
25
- await t.click(nav.menuSearchButton);
26
-
27
- //assuring that the search bar is enabled
28
- await t.expect(nav.searchBox.visible).ok();
29
-
30
- //testing successful search
31
- await t
32
- .selectText(nav.searchBox.find('[name="query"]'))
33
- .pressKey('delete');
34
- await t
35
- .typeText(nav.searchBox.find('[name="query"]'), TEST_TEXT_FOUND)
36
- .pressKey('enter');
37
- await t.expect(nav.searchResults.visible).ok();
38
- await t.expect(nav.searchResultText.exists).ok();
39
- await t.expect(nav.searchResultText.innerText).contains(TEST_TEXT_FOUND);
40
-
41
- //checking url
42
- const getPageUrl = ClientFunction(() => window.location.href);
43
- await t.expect(getPageUrl()).contains(TEST_TEXT_FOUND);
44
-
45
- //checks clicking on first search result opens correct page
46
- await t.click(nav.searchResults.child(0));
47
- await t.expect(getPageUrl()).contains(PAGE_FIRST_RESULT);
48
-
49
- //checks highlight on result page is visible
50
- const highlight = br.shell.find(".BookReaderSearchHilite");
51
- await t.expect(highlight.visible).ok();
52
-
53
- await t.maximizeWindow();
54
- });
55
-
56
- test
57
- .requestHooks(mockNotFound)('Mobile search - unsuccessful search', async t => {
58
- await t.resizeWindowToFitDevice('Sony Xperia Z', {portraitOrientation: true})
59
- const nav = br.nav.mobile;
60
-
61
- //opening side menu and search
62
- await t.expect(nav.hamburgerButton.visible).ok();
63
- await t.click(nav.hamburgerButton);
64
- await t.expect(nav.menuSearchButton.visible).ok();
65
- await t.click(nav.menuSearchButton);
66
-
67
- //assuring that the search bar is enabled
68
- await t.expect(nav.searchBox.visible).ok();
69
-
70
- //testing unsuccessful search
71
- await t
72
- .selectText(nav.searchBox.find('[name="query"]'))
73
- .pressKey('delete');
74
- await t
75
- .typeText(nav.searchBox.find('[name="query"]'), TEST_TEXT_NOT_FOUND)
76
- .pressKey('enter');
77
- await t.expect(nav.searchResultText.withText(TEST_TEXT_NOT_FOUND).exists).notOk();
78
-
79
- //checking url
80
- const getPageUrl = ClientFunction(() => window.location.href.toString());
81
- await t.expect(getPageUrl()).contains(TEST_TEXT_NOT_FOUND);
82
- await t.maximizeWindow();
83
- });
84
-
85
- }
@@ -1,17 +0,0 @@
1
- import { runBaseTests } from '../helpers/base';
2
- import BookReader from '../models/BookReader';
3
-
4
- const localURL = 'https://archive.org/details/';
5
- const books = [
6
- 'birdbookillustra00reedrich', // publicDomain
7
- // 'pianoservicingtu00rebl_0', // borrowable,
8
- // 'adventuresoftoms00twaiiala', // has chapter markers
9
- // 'gendaitankashu00meijuoft', // Right to Left book
10
- // 'gov.uspto.patents.application.10074026', // multiple files
11
- ];
12
-
13
- books.forEach(function(page) {
14
- const url = `${localURL}${page}`;
15
- fixture `Archive.org BR Base Tests for: ${page}`.page `${url}`;
16
- runBaseTests(new BookReader());
17
- });
@@ -1,132 +0,0 @@
1
- import {
2
- html,
3
- elementUpdated,
4
- fixtureCleanup,
5
- fixtureSync,
6
- expect,
7
- } from '@open-wc/testing';
8
- import sinon from 'sinon';
9
-
10
- import '../../../src/BookNavigator/BookNavigator.js';
11
- import BRFullscreenMgr from '../../../src/BookNavigator/br-fullscreen-mgr.js';
12
-
13
- const container = () => {
14
- const item = {};
15
- return html`
16
- <book-navigator
17
- .item=${item}
18
- .baseHost
19
- >
20
- <div slot="bookreader">
21
- <p class="visible-in-reader">now showing</p>
22
- <div>
23
- <p class="bunny">foo</p>
24
- </
25
- `;
26
- }
27
-
28
- beforeEach(() => {
29
- const body = document.querySelector('body');
30
- const brHook = document.createElement('div');
31
- brHook.setAttribute('id', 'BookReader');
32
- body.appendChild(brHook);
33
- });
34
-
35
- afterEach(() => {
36
- window.br = null;
37
- fixtureCleanup();
38
- });
39
-
40
-
41
- describe('<book-navigator>', () => {
42
- describe('first update', () => {
43
- it('binds global event listeners', async () => {
44
- const el = fixtureSync(container());
45
- const spy = sinon.spy(el, 'bindEventListeners');
46
- await elementUpdated(el);
47
- expect(spy.callCount).to.equal(1);
48
- });
49
- it('emits a BrBookNav:PostInit event', async () => {
50
- let initEventFired = false;
51
- window.addEventListener('BrBookNav:PostInit', (e) => {
52
- initEventFired = true;
53
- });
54
- const el = fixtureSync(container());
55
- const spy = sinon.spy(el, 'emitPostInit');
56
- await elementUpdated(el);
57
-
58
- expect(initEventFired).to.be.true;
59
- expect(spy.callCount).to.equal(1);
60
- });
61
- });
62
-
63
- it('handles global event: BookReader:PostInit', async () => {
64
- const setTimeoutSpy = sinon.spy(window, 'setTimeout');
65
- const brStub = {
66
- resize: sinon.fake(),
67
- currentIndex: sinon.fake(),
68
- jumpToIndex: sinon.fake(),
69
- el: '#BookReader'
70
- };
71
-
72
- const el = fixtureSync(container());
73
- const initializeBookSubmenus = sinon.spy(el, 'initializeBookSubmenus');
74
-
75
- await elementUpdated(el);
76
- window.dispatchEvent(new CustomEvent('BookReader:PostInit', {
77
- detail: { props: brStub }
78
- }));
79
- await elementUpdated(el);
80
-
81
- expect(initializeBookSubmenus.callCount).to.equal(1);
82
- expect(el.bookreader).to.equal(brStub); // sets bookreader
83
- expect(el.bookReaderLoaded).to.be.true; // notes bookreader is loaded
84
- expect(el.bookReaderCannotLoad).to.be.false;
85
- expect(el.fullscreenMgr).to.an.instanceof(BRFullscreenMgr);
86
- expect(el.brResizeObserver).to.an.instanceof(window.ResizeObserver);
87
- expect(setTimeoutSpy.callCount).to.equal(1); // resizes at end
88
- });
89
-
90
- it('resizes bookreader when side menu toggles', async () => {
91
- const el = fixtureSync(container());
92
- const brStub = {
93
- resize: sinon.fake(),
94
- currentIndex: sinon.fake(),
95
- jumpToIndex: sinon.fake()
96
- }
97
- el.bookreader = brStub;
98
- await elementUpdated(el);
99
-
100
- el.sideMenuOpen = true;
101
- await elementUpdated(el);
102
-
103
- expect(el.bookreader.resize.callCount).to.equal(1);
104
- expect(el.bookreader.currentIndex.callCount).to.equal(1);
105
- expect(el.bookreader.jumpToIndex.callCount).to.equal(1);
106
-
107
- el.sideMenuOpen = false;
108
- await elementUpdated(el);
109
-
110
- expect(el.bookreader.resize.callCount).to.equal(2);
111
- expect(el.bookreader.currentIndex.callCount).to.equal(2);
112
- expect(el.bookreader.jumpToIndex.callCount).to.equal(2);
113
- });
114
- it('does not resize bookreader if animating', async () => {
115
- const el = fixtureSync(container());
116
- const brStub = {
117
- animating: true, // <-- testing for this
118
- resize: sinon.fake(),
119
- currentIndex: sinon.fake(),
120
- jumpToIndex: sinon.fake()
121
- }
122
- el.bookreader = brStub;
123
- await elementUpdated(el);
124
-
125
- el.sideMenuOpen = true;
126
- await elementUpdated(el);
127
-
128
- expect(el.bookreader.resize.callCount).to.equal(0);
129
- expect(el.bookreader.currentIndex.callCount).to.equal(0);
130
- expect(el.bookreader.jumpToIndex.callCount).to.equal(0);
131
- });
132
- });
@@ -1,23 +0,0 @@
1
- import { expect } from '@open-wc/testing';
2
- import sinon from 'sinon';
3
- import searchProvider from '../../../../src/BookNavigator/search/search-provider';
4
-
5
- afterEach(() => {
6
- sinon.restore();
7
- });
8
-
9
- describe('Search Provider', () => {
10
- describe('constructor', () => {
11
- const onSearchChangeCB = sinon.fake();
12
- const br = sinon.fake();
13
- const provider = new searchProvider(onSearchChangeCB, br);
14
-
15
- expect(provider.bookreader).to.equal(br);
16
- expect(provider.onSearchChange).to.equal(onSearchChangeCB);
17
- expect(provider.id).to.equal('search');
18
- expect(provider.icon).to.exist;
19
- expect(provider.label).to.equal('Search inside');
20
- expect(provider.menuDetails).to.exist;
21
- expect(provider.component).to.exist;
22
- });
23
- });