@internetarchive/bookreader 5.0.0-7 → 5.0.0-70-a1

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 (307) hide show
  1. package/.eslintrc.js +17 -15
  2. package/.github/workflows/node.js.yml +73 -10
  3. package/.github/workflows/npm-publish.yml +6 -20
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +396 -1129
  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 +1788 -0
  10. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +19 -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/jquery-3.js +2 -0
  58. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  59. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  60. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  61. package/BookReader/plugins/plugin.autoplay.js +1 -1
  62. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  63. package/BookReader/plugins/plugin.chapters.js +25 -1
  64. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  65. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  66. package/BookReader/plugins/plugin.iframe.js +1 -1
  67. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  68. package/BookReader/plugins/plugin.resume.js +1 -1
  69. package/BookReader/plugins/plugin.resume.js.map +1 -1
  70. package/BookReader/plugins/plugin.search.js +2 -1
  71. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  72. package/BookReader/plugins/plugin.search.js.map +1 -1
  73. package/BookReader/plugins/plugin.text_selection.js +2 -1
  74. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  75. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  76. package/BookReader/plugins/plugin.tts.js +1 -1
  77. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  78. package/BookReader/plugins/plugin.tts.js.map +1 -1
  79. package/BookReader/plugins/plugin.url.js +1 -1
  80. package/BookReader/plugins/plugin.url.js.map +1 -1
  81. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  82. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  83. package/BookReader/webcomponents-bundle.js +3 -0
  84. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  85. package/BookReader/webcomponents-bundle.js.map +1 -0
  86. package/BookReaderDemo/BookReaderDemo.css +16 -19
  87. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -3
  88. package/BookReaderDemo/BookReaderJSAutoplay.js +4 -1
  89. package/BookReaderDemo/BookReaderJSSimple.js +1 -0
  90. package/BookReaderDemo/IADemoBr.js +147 -0
  91. package/BookReaderDemo/demo-advanced.html +2 -2
  92. package/BookReaderDemo/demo-autoplay.html +2 -3
  93. package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
  94. package/BookReaderDemo/demo-fullscreen-mobile.html +3 -5
  95. package/BookReaderDemo/demo-fullscreen.html +2 -4
  96. package/BookReaderDemo/demo-iiif.html +2 -1
  97. package/BookReaderDemo/demo-iiif.js +0 -1
  98. package/BookReaderDemo/demo-internetarchive.html +213 -17
  99. package/BookReaderDemo/demo-multiple.html +2 -1
  100. package/BookReaderDemo/demo-preview-pages.html +2 -1
  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 +279 -0
  110. package/README.md +14 -1
  111. package/babel.config.js +20 -0
  112. package/codecov.yml +6 -0
  113. package/index.html +4 -1
  114. package/jsconfig.json +19 -0
  115. package/netlify.toml +9 -0
  116. package/package.json +69 -60
  117. package/renovate.json +52 -0
  118. package/scripts/preversion.js +4 -1
  119. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  120. package/src/BookNavigator/assets/button-base.js +4 -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 +586 -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 +3 -8
  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 +41 -25
  134. package/src/BookNavigator/search/search-provider.js +49 -27
  135. package/src/BookNavigator/search/search-results.js +23 -9
  136. package/src/BookNavigator/sharing.js +27 -0
  137. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -10
  138. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
  139. package/src/BookNavigator/volumes/volumes-provider.js +95 -0
  140. package/src/BookReader/BookModel.js +64 -34
  141. package/src/BookReader/DragScrollable.js +233 -0
  142. package/src/BookReader/Mode1Up.js +56 -351
  143. package/src/BookReader/Mode1UpLit.js +388 -0
  144. package/src/BookReader/Mode2Up.js +73 -1318
  145. package/src/BookReader/Mode2UpLit.js +776 -0
  146. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  147. package/src/BookReader/ModeSmoothZoom.js +312 -0
  148. package/src/BookReader/ModeThumb.js +18 -12
  149. package/src/BookReader/Navbar/Navbar.js +12 -38
  150. package/src/BookReader/PageContainer.js +81 -6
  151. package/src/BookReader/ReduceSet.js +1 -1
  152. package/src/BookReader/Toolbar/Toolbar.js +10 -37
  153. package/src/BookReader/events.js +2 -3
  154. package/src/BookReader/options.js +24 -2
  155. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  156. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  157. package/src/BookReader/utils/SelectionObserver.js +43 -0
  158. package/src/BookReader/utils.js +118 -13
  159. package/src/BookReader.js +423 -1056
  160. package/src/assets/icons/magnify-minus.svg +3 -7
  161. package/src/assets/icons/magnify-plus.svg +3 -7
  162. package/src/assets/icons/voice.svg +1 -0
  163. package/src/css/BookReader.scss +1 -5
  164. package/src/css/_BRBookmarks.scss +1 -1
  165. package/src/css/_BRComponent.scss +1 -1
  166. package/src/css/_BRmain.scss +16 -0
  167. package/src/css/_BRnav.scss +11 -38
  168. package/src/css/_BRpages.scss +149 -40
  169. package/src/css/_BRsearch.scss +67 -21
  170. package/src/css/_TextSelection.scss +87 -27
  171. package/src/css/_colorbox.scss +2 -2
  172. package/src/css/_controls.scss +20 -7
  173. package/src/css/_icons.scss +1 -1
  174. package/src/ia-bookreader/ia-bookreader.js +224 -0
  175. package/src/plugins/plugin.archive_analytics.js +3 -3
  176. package/src/plugins/plugin.autoplay.js +5 -11
  177. package/src/plugins/plugin.chapters.js +211 -186
  178. package/src/plugins/plugin.resume.js +3 -3
  179. package/src/plugins/plugin.text_selection.js +464 -134
  180. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  181. package/src/plugins/search/plugin.search.js +142 -125
  182. package/src/plugins/search/utils.js +43 -0
  183. package/src/plugins/search/view.js +33 -58
  184. package/src/plugins/tts/AbstractTTSEngine.js +46 -37
  185. package/src/plugins/tts/FestivalTTSEngine.js +13 -14
  186. package/src/plugins/tts/PageChunk.js +15 -21
  187. package/src/plugins/tts/PageChunkIterator.js +8 -12
  188. package/src/plugins/tts/WebTTSEngine.js +87 -71
  189. package/src/plugins/tts/plugin.tts.js +95 -126
  190. package/src/plugins/tts/utils.js +0 -25
  191. package/src/plugins/url/UrlPlugin.js +193 -0
  192. package/src/plugins/{plugin.url.js → url/plugin.url.js} +45 -16
  193. package/src/util/browserSniffing.js +22 -0
  194. package/src/util/docCookies.js +21 -2
  195. package/tests/e2e/README.md +37 -0
  196. package/tests/e2e/autoplay.test.js +2 -2
  197. package/tests/e2e/base.test.js +8 -16
  198. package/tests/e2e/helpers/base.js +53 -48
  199. package/tests/e2e/helpers/debug.js +1 -1
  200. package/tests/e2e/helpers/params.js +17 -0
  201. package/tests/e2e/helpers/rightToLeft.js +8 -14
  202. package/tests/e2e/helpers/search.js +73 -0
  203. package/tests/e2e/models/Navigation.js +20 -37
  204. package/tests/e2e/rightToLeft.test.js +4 -5
  205. package/tests/e2e/viewmode.test.js +40 -33
  206. package/tests/jest/BookNavigator/book-navigator.test.js +658 -0
  207. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  208. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  209. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  210. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  211. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  212. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  213. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  214. package/tests/{karma → jest}/BookNavigator/search/search-results.test.js +109 -60
  215. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  216. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  217. package/tests/jest/BookNavigator/volumes/volumes-provider.test.js +80 -0
  218. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +74 -14
  219. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
  220. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  221. package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
  222. package/tests/jest/BookReader/Mode2Up.test.js +98 -0
  223. package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
  224. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
  225. package/tests/jest/BookReader/ModeSmoothZoom.test.js +218 -0
  226. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  227. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +10 -10
  228. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +88 -6
  229. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  230. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  231. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  232. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  233. package/tests/jest/BookReader/utils/SelectionObserver.test.js +43 -0
  234. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  235. package/tests/jest/BookReader/utils.test.js +229 -0
  236. package/tests/jest/BookReader.keyboard.test.js +190 -0
  237. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  238. package/tests/{BookReader.test.js → jest/BookReader.test.js} +26 -37
  239. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  240. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +4 -4
  241. package/tests/jest/plugins/plugin.chapters.test.js +145 -0
  242. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  243. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  244. package/tests/jest/plugins/plugin.text_selection.test.js +317 -0
  245. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  246. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +25 -47
  247. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +39 -6
  248. package/tests/jest/plugins/search/utils.js +25 -0
  249. package/tests/jest/plugins/search/utils.test.js +29 -0
  250. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +9 -9
  251. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  252. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  253. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  254. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
  255. package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
  256. package/tests/jest/plugins/url/UrlPlugin.test.js +190 -0
  257. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +53 -14
  258. package/tests/jest/setup.js +3 -0
  259. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  260. package/tests/jest/util/docCookies.test.js +24 -0
  261. package/tests/{util → jest/util}/strings.test.js +1 -1
  262. package/tests/{utils.js → jest/utils.js} +38 -0
  263. package/webpack.config.js +11 -6
  264. package/.babelrc +0 -12
  265. package/.dependabot/config.yml +0 -6
  266. package/.testcaferc.json +0 -5
  267. package/BookReader/bookreader-component-bundle.js +0 -1450
  268. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  269. package/BookReader/bookreader-component-bundle.js.map +0 -1
  270. package/BookReader/jquery-1.10.1.js +0 -2
  271. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  272. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  273. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  274. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  275. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  276. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  277. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  278. package/karma.conf.js +0 -23
  279. package/src/BookNavigator/BookModel.js +0 -14
  280. package/src/BookNavigator/BookNavigator.js +0 -446
  281. package/src/BookNavigator/assets/book-loader.js +0 -27
  282. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  283. package/src/BookNavigator/search/a-search-result.js +0 -55
  284. package/src/BookReader/DebugConsole.js +0 -54
  285. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  286. package/src/ItemNavigator/ItemNavigator.js +0 -376
  287. package/src/ItemNavigator/providers/sharing.js +0 -29
  288. package/src/css/_MobileNav.scss +0 -194
  289. package/src/dragscrollable-br.js +0 -261
  290. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  291. package/src/plugins/plugin.mobile_nav.js +0 -287
  292. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  293. package/tests/BookReader/DebugConsole.test.js +0 -25
  294. package/tests/BookReader/Mode1Up.test.js +0 -164
  295. package/tests/BookReader/Mode2Up.test.js +0 -247
  296. package/tests/BookReader/utils.test.js +0 -109
  297. package/tests/e2e/helpers/desktopSearch.js +0 -72
  298. package/tests/e2e/helpers/mobileSearch.js +0 -85
  299. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  300. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  301. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  302. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  303. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  304. package/tests/plugins/plugin.chapters.test.js +0 -130
  305. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  306. package/tests/plugins/plugin.text_selection.test.js +0 -203
  307. package/tests/util/docCookies.test.js +0 -15
@@ -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 & You');
24
- expect(escapeHTML('Me > You')).toEqual('Me > 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
- });
@@ -1,201 +0,0 @@
1
- import {
2
- html,
3
- fixture,
4
- expect,
5
- oneEvent,
6
- } from '@open-wc/testing';
7
- import sinon from 'sinon';
8
- import { IABookVisualAdjustments } from '../../../src/BookNavigator/visual-adjustments/visual-adjustments.js';
9
-
10
- const options = [{
11
- id: 'contrast',
12
- name: 'Adjust contrast',
13
- active: true,
14
- min: 0,
15
- max: 150,
16
- step: 1,
17
- value: 100,
18
- }, {
19
- id: 'invert',
20
- name: 'Invert colors',
21
- active: false,
22
- }, {
23
- id: 'brightness',
24
- name: 'Adjust brightness',
25
- active: false,
26
- value: 100,
27
- }];
28
-
29
- const container = (renderHeader = false) => (
30
- html`<ia-book-visual-adjustments .options=${options} ?renderHeader=${renderHeader}></ia-book-visual-adjustments>`
31
- );
32
-
33
- describe('<ia-book-visual-adjustments>', () => {
34
- afterEach(() => {
35
- sinon.restore();
36
- });
37
-
38
- it('sets default properties', async () => {
39
- const el = await fixture(container());
40
-
41
- expect(el.options).to.exist;
42
- expect(el.options.length).to.equal(options.length);
43
- expect(el.renderHeader).to.exist;
44
- expect(el.renderHeader).to.be.false;
45
- expect(el.activeCount).to.exist;
46
- expect(el.showZoomControls).to.be.true;
47
- });
48
-
49
- it('renders all properties of a visual adjustment option', async () => {
50
- const el = await fixture(container());
51
-
52
- await el.updateComplete;
53
-
54
- const label = el.shadowRoot.querySelector('label');
55
- const name = label.querySelector('.name');
56
- const checkbox = label.querySelector('input');
57
- expect(name.innerText).to.equal(options[0].name);
58
- expect(checkbox.checked).to.equal(true);
59
- });
60
-
61
- it('can render header with active options count', async () => {
62
- const renderHeader = true;
63
- const el = await fixture(container(renderHeader));
64
- expect(el.shadowRoot.querySelector('header p').innerText).to.include('1');
65
- });
66
-
67
- it('does not render active options count element when none are selected', async () => {
68
- const el = await fixture(container());
69
-
70
- el.options = [options[1]];
71
- await el.updateComplete;
72
-
73
- expect(el.shadowRoot.querySelector('header p')).not.to.exist;
74
- });
75
-
76
- it('changes option\'s active state when input changed', async () => {
77
- const el = await fixture(container());
78
-
79
- el.shadowRoot.querySelector('li input').dispatchEvent(new Event('change'));
80
- await el.updateComplete;
81
-
82
- expect(el.options[0].active).to.equal(false);
83
- });
84
-
85
- it('renders zoom in and out controls when enabled', async () => {
86
- const el = await fixture(container());
87
-
88
- expect(el.shadowRoot.querySelector('.zoom_out')).to.exist;
89
- expect(el.shadowRoot.querySelector('.zoom_in')).to.exist;
90
- });
91
-
92
- it('does not render zoom controls when disabled', async () => {
93
- const el = await fixture(container());
94
-
95
- el.showZoomControls = false;
96
- await el.updateComplete;
97
-
98
- expect(el.shadowRoot.querySelector('.zoom_out')).not.to.exist;
99
- expect(el.shadowRoot.querySelector('.zoom_in')).not.to.exist;
100
- });
101
-
102
- describe('Custom events', () => {
103
- it('prepareEventDetails returns proper params', async () => {
104
- const el = await fixture(container());
105
- await el.updateComplete;
106
- const params = el.prepareEventDetails();
107
-
108
- expect(params.activeCount).to.exist;
109
- expect(typeof (params.activeCount)).to.be.equal('number');
110
- expect(params.changedOptionId).to.exist;
111
- expect(typeof (params.changedOptionId)).to.be.equal('string');
112
- expect(params.options).to.exist;
113
- expect(params.options.length).to.exist;
114
- expect(params.options.length).to.be.greaterThan(0);
115
- });
116
- it('emitOptionChangedEvent calls for the params', async () => {
117
- IABookVisualAdjustments.prototype.prepareEventDetails = sinon.fake();
118
- const el = await fixture(container());
119
- await el.updateComplete;
120
-
121
- expect(el.prepareEventDetails.callCount).to.equal(1);
122
- });
123
- it('triggers an emitOptionChangedEvent event at firstUpdate', async () => {
124
- IABookVisualAdjustments.prototype.emitOptionChangedEvent = sinon.fake();
125
- const el = await fixture(container());
126
-
127
- expect(el.emitOptionChangedEvent.callCount).to.equal(1);
128
- });
129
-
130
- it('triggers an emitOptionChangedEvent event when a checkbox\'s change event fires', async () => {
131
- IABookVisualAdjustments.prototype.emitOptionChangedEvent = sinon.fake();
132
- const el = await fixture(container());
133
-
134
- expect(el.emitOptionChangedEvent.callCount).to.equal(1); // firstUpdate fire
135
-
136
- el.shadowRoot.querySelector('li input').dispatchEvent(new Event('change'));
137
- expect(el.emitOptionChangedEvent.callCount).to.equal(2);
138
- });
139
-
140
- it('triggers an emitOptionChangedEvent event when a range\'s change event fires', async () => {
141
- IABookVisualAdjustments.prototype.emitOptionChangedEvent = sinon.fake();
142
-
143
- const el = await fixture(container());
144
- expect(el.emitOptionChangedEvent.callCount).to.equal(1); // firstUpdate fire
145
-
146
- el.shadowRoot.querySelector('[name="brightness_range"]').dispatchEvent(new Event('change'));
147
- expect(el.emitOptionChangedEvent.callCount).to.equal(2);
148
- });
149
-
150
- it('emits a zoom out event when zoom out button clicked', async () => {
151
- const el = await fixture(container());
152
-
153
- setTimeout(() => (
154
- el.shadowRoot.querySelector('.zoom_out').click()
155
- ));
156
- const response = await oneEvent(el, 'visualAdjustmentZoomOut');
157
-
158
- expect(response).to.exist;
159
- });
160
-
161
- it('emits a zoom in event when zoom in button clicked', async () => {
162
- const el = await fixture(container());
163
-
164
- setTimeout(() => (
165
- el.shadowRoot.querySelector('.zoom_in').click()
166
- ));
167
- const response = await oneEvent(el, 'visualAdjustmentZoomIn');
168
-
169
- expect(response).to.exist;
170
- });
171
- });
172
-
173
- it('sets range defaults when none supplied', async () => {
174
- const el = await fixture(container());
175
- const brightnessRange = el.shadowRoot.querySelector('[name="brightness_range"]');
176
-
177
- expect(brightnessRange.getAttribute('min')).to.equal('0');
178
- expect(brightnessRange.getAttribute('max')).to.equal('100');
179
- expect(brightnessRange.getAttribute('step')).to.equal('1');
180
- });
181
-
182
- it('sets the updated range value on the options prop', async () => {
183
- const el = await fixture(container());
184
- const { id } = options[0];
185
- const newValue = 120;
186
-
187
- el.setRangeValue(id, newValue);
188
- await el.updateComplete;
189
-
190
- expect(el.options[0].value).to.equal(newValue);
191
- });
192
-
193
- it('triggers a setRangeValue event when a range\'s input event fires', async () => {
194
- IABookVisualAdjustments.prototype.setRangeValue = sinon.fake();
195
-
196
- const el = await fixture(container());
197
-
198
- el.shadowRoot.querySelector('[name="brightness_range"]').dispatchEvent(new Event('input'));
199
- expect(el.setRangeValue.callCount).to.equal(1);
200
- });
201
- });