@internetarchive/bookreader 5.0.0-8 → 5.0.0-80

Sign up to get free protection for your applications and to get access to all the features.
Files changed (313) 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 +398 -1133
  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/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.iiif.js +2 -0
  69. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  70. package/BookReader/plugins/plugin.resume.js +1 -1
  71. package/BookReader/plugins/plugin.resume.js.map +1 -1
  72. package/BookReader/plugins/plugin.search.js +2 -1
  73. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  74. package/BookReader/plugins/plugin.search.js.map +1 -1
  75. package/BookReader/plugins/plugin.text_selection.js +2 -1
  76. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  77. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  78. package/BookReader/plugins/plugin.tts.js +1 -1
  79. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  80. package/BookReader/plugins/plugin.tts.js.map +1 -1
  81. package/BookReader/plugins/plugin.url.js +1 -1
  82. package/BookReader/plugins/plugin.url.js.map +1 -1
  83. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  84. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  85. package/BookReader/webcomponents-bundle.js +3 -0
  86. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  87. package/BookReader/webcomponents-bundle.js.map +1 -0
  88. package/BookReaderDemo/BookReaderDemo.css +18 -19
  89. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -3
  90. package/BookReaderDemo/BookReaderJSAutoplay.js +4 -1
  91. package/BookReaderDemo/BookReaderJSSimple.js +1 -0
  92. package/BookReaderDemo/IADemoBr.js +147 -0
  93. package/BookReaderDemo/demo-advanced.html +2 -2
  94. package/BookReaderDemo/demo-autoplay.html +2 -3
  95. package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
  96. package/BookReaderDemo/demo-fullscreen-mobile.html +3 -5
  97. package/BookReaderDemo/demo-fullscreen.html +2 -4
  98. package/BookReaderDemo/demo-iiif.html +99 -12
  99. package/BookReaderDemo/demo-internetarchive.html +214 -18
  100. package/BookReaderDemo/demo-multiple.html +2 -1
  101. package/BookReaderDemo/demo-preview-pages.html +2 -1
  102. package/BookReaderDemo/demo-simple.html +2 -1
  103. package/BookReaderDemo/demo-vendor-fullscreen.html +2 -4
  104. package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
  105. package/BookReaderDemo/immersion-1up.html +2 -2
  106. package/BookReaderDemo/immersion-mode.html +2 -4
  107. package/BookReaderDemo/toggle_controls.html +3 -2
  108. package/BookReaderDemo/view_mode.html +2 -1
  109. package/BookReaderDemo/viewmode-cycle.html +2 -3
  110. package/CHANGELOG.md +536 -33
  111. package/README.md +14 -1
  112. package/babel.config.js +20 -0
  113. package/codecov.yml +6 -0
  114. package/index.html +4 -1
  115. package/jsconfig.json +19 -0
  116. package/netlify.toml +9 -0
  117. package/package.json +70 -60
  118. package/renovate.json +52 -0
  119. package/scripts/preversion.js +0 -1
  120. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  121. package/src/BookNavigator/assets/button-base.js +4 -2
  122. package/src/BookNavigator/assets/ia-logo.js +17 -0
  123. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  124. package/src/BookNavigator/assets/icon_close.js +1 -1
  125. package/src/BookNavigator/book-navigator.js +590 -0
  126. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  127. package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
  128. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  129. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +3 -8
  130. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  131. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  132. package/src/BookNavigator/delete-modal-actions.js +1 -1
  133. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  134. package/src/BookNavigator/downloads/downloads.js +41 -25
  135. package/src/BookNavigator/search/search-provider.js +49 -27
  136. package/src/BookNavigator/search/search-results.js +23 -9
  137. package/src/BookNavigator/sharing.js +27 -0
  138. package/src/BookNavigator/viewable-files.js +95 -0
  139. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -10
  140. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
  141. package/src/BookReader/BookModel.js +64 -34
  142. package/src/BookReader/DragScrollable.js +233 -0
  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 +776 -0
  147. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  148. package/src/BookReader/ModeSmoothZoom.js +312 -0
  149. package/src/BookReader/ModeThumb.js +18 -12
  150. package/src/BookReader/Navbar/Navbar.js +14 -40
  151. package/src/BookReader/PageContainer.js +81 -6
  152. package/src/BookReader/ReduceSet.js +1 -1
  153. package/src/BookReader/Toolbar/Toolbar.js +10 -37
  154. package/src/BookReader/events.js +2 -3
  155. package/src/BookReader/options.js +27 -2
  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.js +118 -13
  160. package/src/BookReader.js +427 -1061
  161. package/src/assets/icons/magnify-minus.svg +3 -7
  162. package/src/assets/icons/magnify-plus.svg +3 -7
  163. package/src/assets/icons/voice.svg +1 -0
  164. package/src/css/BookReader.scss +1 -5
  165. package/src/css/_BRBookmarks.scss +1 -1
  166. package/src/css/_BRComponent.scss +1 -1
  167. package/src/css/_BRmain.scss +16 -3
  168. package/src/css/_BRnav.scss +12 -39
  169. package/src/css/_BRpages.scss +149 -40
  170. package/src/css/_BRsearch.scss +68 -25
  171. package/src/css/_BRtoolbar.scss +5 -5
  172. package/src/css/_TextSelection.scss +87 -27
  173. package/src/css/_colorbox.scss +2 -2
  174. package/src/css/_controls.scss +20 -7
  175. package/src/css/_icons.scss +1 -1
  176. package/src/ia-bookreader/ia-bookreader.js +224 -0
  177. package/src/plugins/plugin.archive_analytics.js +3 -3
  178. package/src/plugins/plugin.autoplay.js +5 -11
  179. package/src/plugins/plugin.chapters.js +237 -191
  180. package/src/plugins/plugin.iiif.js +151 -0
  181. package/src/plugins/plugin.resume.js +3 -3
  182. package/src/plugins/plugin.text_selection.js +464 -134
  183. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  184. package/src/plugins/search/plugin.search.js +142 -125
  185. package/src/plugins/search/utils.js +43 -0
  186. package/src/plugins/search/view.js +33 -58
  187. package/src/plugins/tts/AbstractTTSEngine.js +71 -40
  188. package/src/plugins/tts/FestivalTTSEngine.js +13 -14
  189. package/src/plugins/tts/PageChunk.js +15 -21
  190. package/src/plugins/tts/PageChunkIterator.js +8 -12
  191. package/src/plugins/tts/WebTTSEngine.js +87 -71
  192. package/src/plugins/tts/plugin.tts.js +96 -127
  193. package/src/plugins/tts/utils.js +15 -25
  194. package/src/plugins/url/UrlPlugin.js +191 -0
  195. package/src/plugins/{plugin.url.js → url/plugin.url.js} +45 -16
  196. package/src/util/browserSniffing.js +22 -0
  197. package/src/util/docCookies.js +21 -2
  198. package/tests/e2e/README.md +37 -0
  199. package/tests/e2e/autoplay.test.js +2 -2
  200. package/tests/e2e/base.test.js +8 -16
  201. package/tests/e2e/helpers/base.js +53 -48
  202. package/tests/e2e/helpers/debug.js +1 -1
  203. package/tests/e2e/helpers/params.js +17 -0
  204. package/tests/e2e/helpers/rightToLeft.js +8 -14
  205. package/tests/e2e/helpers/search.js +73 -0
  206. package/tests/e2e/models/Navigation.js +20 -37
  207. package/tests/e2e/rightToLeft.test.js +4 -5
  208. package/tests/e2e/viewmode.test.js +40 -33
  209. package/tests/jest/BookNavigator/book-navigator.test.js +661 -0
  210. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  211. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  212. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  213. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  214. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  215. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  216. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  217. package/tests/{karma → jest}/BookNavigator/search/search-results.test.js +109 -60
  218. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  219. package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +80 -0
  220. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  221. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +74 -14
  222. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
  223. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  224. package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
  225. package/tests/jest/BookReader/Mode2Up.test.js +98 -0
  226. package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
  227. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
  228. package/tests/jest/BookReader/ModeSmoothZoom.test.js +218 -0
  229. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  230. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +10 -10
  231. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +88 -6
  232. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  233. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  234. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  235. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  236. package/tests/jest/BookReader/utils/SelectionObserver.test.js +57 -0
  237. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  238. package/tests/jest/BookReader/utils.test.js +229 -0
  239. package/tests/jest/BookReader.keyboard.test.js +190 -0
  240. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  241. package/tests/{BookReader.test.js → jest/BookReader.test.js} +26 -37
  242. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  243. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +4 -4
  244. package/tests/jest/plugins/plugin.chapters.test.js +195 -0
  245. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  246. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  247. package/tests/jest/plugins/plugin.text_selection.test.js +317 -0
  248. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  249. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +25 -47
  250. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +39 -6
  251. package/tests/jest/plugins/search/utils.js +25 -0
  252. package/tests/jest/plugins/search/utils.test.js +29 -0
  253. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +29 -9
  254. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  255. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  256. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  257. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
  258. package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
  259. package/tests/jest/plugins/url/UrlPlugin.test.js +198 -0
  260. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +53 -14
  261. package/tests/jest/setup.js +3 -0
  262. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  263. package/tests/jest/util/docCookies.test.js +24 -0
  264. package/tests/{util → jest/util}/strings.test.js +1 -1
  265. package/tests/{utils.js → jest/utils.js} +38 -0
  266. package/webpack.config.js +12 -6
  267. package/.babelrc +0 -12
  268. package/.dependabot/config.yml +0 -6
  269. package/.testcaferc.json +0 -5
  270. package/BookReader/bookreader-component-bundle.js +0 -1450
  271. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  272. package/BookReader/bookreader-component-bundle.js.map +0 -1
  273. package/BookReader/jquery-1.10.1.js +0 -2
  274. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  275. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  276. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  277. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  278. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  279. package/BookReaderDemo/IIIFBookReader.js +0 -207
  280. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  281. package/BookReaderDemo/demo-iiif.js +0 -26
  282. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  283. package/karma.conf.js +0 -23
  284. package/src/BookNavigator/BookModel.js +0 -14
  285. package/src/BookNavigator/BookNavigator.js +0 -446
  286. package/src/BookNavigator/assets/book-loader.js +0 -27
  287. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  288. package/src/BookNavigator/search/a-search-result.js +0 -55
  289. package/src/BookReader/DebugConsole.js +0 -54
  290. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  291. package/src/ItemNavigator/ItemNavigator.js +0 -376
  292. package/src/ItemNavigator/providers/sharing.js +0 -29
  293. package/src/css/_MobileNav.scss +0 -194
  294. package/src/dragscrollable-br.js +0 -261
  295. package/src/lit-wrapper.js +0 -2
  296. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  297. package/src/plugins/plugin.mobile_nav.js +0 -287
  298. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  299. package/tests/BookReader/DebugConsole.test.js +0 -25
  300. package/tests/BookReader/Mode1Up.test.js +0 -164
  301. package/tests/BookReader/Mode2Up.test.js +0 -247
  302. package/tests/BookReader/utils.test.js +0 -109
  303. package/tests/e2e/helpers/desktopSearch.js +0 -72
  304. package/tests/e2e/helpers/mobileSearch.js +0 -85
  305. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  306. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  307. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  308. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  309. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  310. package/tests/plugins/plugin.chapters.test.js +0 -130
  311. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  312. package/tests/plugins/plugin.text_selection.test.js +0 -203
  313. package/tests/util/docCookies.test.js +0 -15
@@ -1,10 +1,9 @@
1
1
  import {
2
2
  html,
3
3
  fixture,
4
- expect,
5
4
  oneEvent,
6
- } from '@open-wc/testing';
7
- import '../../../../src/BookNavigator/bookmarks/bookmark-edit.js';
5
+ } from '@open-wc/testing-helpers';
6
+ import '@/src/BookNavigator/bookmarks/bookmark-edit.js';
8
7
 
9
8
  const bookmarkColors = [{
10
9
  id: 0,
@@ -36,42 +35,42 @@ const bookmark = {
36
35
  };
37
36
 
38
37
  describe('<ia-bookmark-edit>', () => {
39
- it('sets default properties', async () => {
38
+ test('sets default properties', async () => {
40
39
  const el = await fixture(container(bookmark));
41
40
 
42
- expect(el.bookmark).to.equal(bookmark);
43
- expect(el.renderHeader).to.be.false;
41
+ expect(el.bookmark).toEqual(bookmark);
42
+ expect(el.renderHeader).toBeFalsy();
44
43
  });
45
44
 
46
- it('renders bookmark thumb and page number', async () => {
45
+ test('renders bookmark thumb and page number', async () => {
47
46
  const el = await fixture(container(bookmark));
48
47
 
49
- expect(el.shadowRoot.querySelector('img').getAttribute('src')).to.equal(bookmark.thumbnail);
50
- expect(el.shadowRoot.querySelector('h4').innerText).to.equal(`Page ${bookmark.page}`);
48
+ expect(el.shadowRoot.querySelector('img').getAttribute('src')).toEqual(bookmark.thumbnail);
49
+ expect(el.shadowRoot.querySelector('h4').textContent).toEqual(`Page ${bookmark.page}`);
51
50
  });
52
51
 
53
- it('renders an optional header section', async () => {
52
+ test('renders an optional header section', async () => {
54
53
  const el = await fixture(container(bookmark));
55
54
  el.renderHeader = true;
56
55
 
57
56
  await el.updateComplete;
58
57
 
59
- expect(el.shadowRoot.querySelector('header')).to.exist;
58
+ expect(el.shadowRoot.querySelector('header')).toBeDefined();
60
59
  });
61
60
 
62
- it('toggles rendering of the bookmark thumbnail and page number', async () => {
61
+ test('toggles rendering of the bookmark thumbnail and page number', async () => {
63
62
  const el = await fixture(container(bookmark));
64
- expect(el.shadowRoot.querySelector('img')).to.exist;
65
- expect(el.shadowRoot.querySelector('h4')).to.exist;
63
+ expect(el.shadowRoot.querySelector('img')).toBeDefined();
64
+ expect(el.shadowRoot.querySelector('h4')).toBeDefined();
66
65
 
67
66
  el.showBookmark = false;
68
67
  await el.updateComplete;
69
68
 
70
- expect(el.shadowRoot.querySelector('img')).to.not.exist;
71
- expect(el.shadowRoot.querySelector('h4')).to.not.exist;
69
+ expect(el.shadowRoot.querySelector('img')).toBe(null);
70
+ expect(el.shadowRoot.querySelector('h4')).toBe(null);
72
71
  });
73
72
 
74
- it('emits a custom event when the bookmark color is changed', async () => {
73
+ test('emits a custom event when the bookmark color is changed', async () => {
75
74
  const el = await fixture(container(bookmark));
76
75
 
77
76
  setTimeout(() => (
@@ -79,10 +78,10 @@ describe('<ia-bookmark-edit>', () => {
79
78
  ));
80
79
  const response = await oneEvent(el, 'bookmarkColorChanged');
81
80
 
82
- expect(response).to.exist;
81
+ expect(response).toBeDefined();
83
82
  });
84
83
 
85
- it('emits a custom event when the edit form is submitted', async () => {
84
+ test('emits a custom event when the edit form is submitted', async () => {
86
85
  const el = await fixture(container(bookmark));
87
86
 
88
87
  setTimeout(() => (
@@ -90,10 +89,10 @@ describe('<ia-bookmark-edit>', () => {
90
89
  ));
91
90
  const response = await oneEvent(el, 'saveBookmark');
92
91
 
93
- expect(response).to.exist;
92
+ expect(response).toBeDefined();
94
93
  });
95
94
 
96
- it('emits a custom event when the delete button is clicked', async () => {
95
+ test('emits a custom event when the delete button is clicked', async () => {
97
96
  const el = await fixture(container(bookmark));
98
97
 
99
98
  setTimeout(() => (
@@ -101,10 +100,10 @@ describe('<ia-bookmark-edit>', () => {
101
100
  ));
102
101
  const response = await oneEvent(el, 'deleteBookmark');
103
102
 
104
- expect(response).to.exist;
103
+ expect(response).toBeDefined();
105
104
  });
106
105
 
107
- it('updates bookmark color when a color input changed', async () => {
106
+ test('updates bookmark color when a color input changed', async () => {
108
107
  const el = await fixture(container(bookmark));
109
108
 
110
109
  setTimeout(() => (
@@ -112,10 +111,10 @@ describe('<ia-bookmark-edit>', () => {
112
111
  ));
113
112
  await oneEvent(el, 'bookmarkColorChanged');
114
113
 
115
- expect(el.bookmark.color).to.equal(2);
114
+ expect(el.bookmark.color).toEqual(2);
116
115
  });
117
116
 
118
- it('updates bookmark note when the note textarea changed', async () => {
117
+ test('updates bookmark note when the note textarea changed', async () => {
119
118
  const el = await fixture(container(bookmark));
120
119
  const textarea = el.shadowRoot.querySelector('textarea');
121
120
  const updatedNote = 'New note';
@@ -128,6 +127,6 @@ describe('<ia-bookmark-edit>', () => {
128
127
 
129
128
  await oneEvent(textarea, 'change');
130
129
 
131
- expect(el.bookmark.note).to.contain(updatedNote);
130
+ expect(el.bookmark.note).toContain(updatedNote);
132
131
  });
133
132
  });
@@ -1,10 +1,9 @@
1
1
  import {
2
2
  html,
3
3
  fixture,
4
- expect,
5
4
  oneEvent,
6
- } from '@open-wc/testing';
7
- import '../../../../src/BookNavigator/bookmarks/bookmarks-list.js';
5
+ } from '@open-wc/testing-helpers';
6
+ import '@/src/BookNavigator/bookmarks/bookmarks-list.js';
8
7
 
9
8
  const bookmarks = [{
10
9
  id: 1,
@@ -41,24 +40,24 @@ describe('<ia-bookmarks-list>', () => {
41
40
  it('sets default properties', async () => {
42
41
  const el = await fixture(container(bookmarks));
43
42
 
44
- expect(el.bookmarks).to.equal(bookmarks);
45
- expect(el.activeBookmarkID).to.be.undefined;
46
- expect(el.renderHeader).to.be.false;
43
+ expect(el.bookmarks).toEqual(bookmarks);
44
+ expect(el.activeBookmarkID).toBeUndefined();
45
+ expect(el.renderHeader).toBeFalsy();
47
46
  });
48
47
 
49
- it('renders bookmarks that contain page numbers', async () => {
48
+ test('renders bookmarks that contain page numbers', async () => {
50
49
  const el = await fixture(container(bookmarks));
51
50
 
52
- expect(el.shadowRoot.innerHTML).to.include(`Page ${bookmarks[0].page}`);
51
+ expect(el.shadowRoot.textContent).toContain(`Page ${bookmarks[0].page}`);
53
52
  });
54
53
 
55
- it('renders bookmarks that contain an optional note', async () => {
54
+ test('renders bookmarks that contain an optional note', async () => {
56
55
  const el = await fixture(container(bookmarks));
57
56
 
58
- expect(el.shadowRoot.innerHTML).to.include(bookmarks[1].note);
57
+ expect(el.shadowRoot.innerHTML).toContain(bookmarks[1].note);
59
58
  });
60
59
 
61
- it('emits a custom event when a bookmark is clicked', async () => {
60
+ test('emits a custom event when a bookmark is clicked', async () => {
62
61
  const el = await fixture(container(bookmarks));
63
62
 
64
63
  setTimeout(() => (
@@ -66,10 +65,10 @@ describe('<ia-bookmarks-list>', () => {
66
65
  ));
67
66
  const response = await oneEvent(el, 'bookmarkSelected');
68
67
 
69
- expect(response).to.exist;
68
+ expect(response).toBeDefined();
70
69
  });
71
70
 
72
- it('emits a custom event when an edit button is clicked', async () => {
71
+ test('emits a custom event when an edit button is clicked', async () => {
73
72
  const el = await fixture(container(bookmarks));
74
73
 
75
74
  setTimeout(() => (
@@ -77,10 +76,10 @@ describe('<ia-bookmarks-list>', () => {
77
76
  ));
78
77
  const response = await oneEvent(el, 'bookmarkEdited');
79
78
 
80
- expect(response).to.exist;
79
+ expect(response).toBeDefined();
81
80
  });
82
81
 
83
- it('emits a saveBookmark event', async () => {
82
+ test('emits a saveBookmark event', async () => {
84
83
  const el = await fixture(container(bookmarks));
85
84
 
86
85
  setTimeout(() => (
@@ -88,10 +87,10 @@ describe('<ia-bookmarks-list>', () => {
88
87
  ));
89
88
  const response = await oneEvent(el, 'saveBookmark');
90
89
 
91
- expect(response).to.exist;
90
+ expect(response).toBeDefined();
92
91
  });
93
92
 
94
- it('emits a deleteBookmark event', async () => {
93
+ test('emits a deleteBookmark event', async () => {
95
94
  const el = await fixture(container(bookmarks));
96
95
 
97
96
  setTimeout(() => (
@@ -99,10 +98,10 @@ describe('<ia-bookmarks-list>', () => {
99
98
  ));
100
99
  const response = await oneEvent(el, 'deleteBookmark');
101
100
 
102
- expect(response).to.exist;
101
+ expect(response).toBeDefined();
103
102
  });
104
103
 
105
- it('emits a bookmarkColorChanged event', async () => {
104
+ test('emits a bookmarkColorChanged event', async () => {
106
105
  const el = await fixture(container(bookmarks));
107
106
 
108
107
  setTimeout(() => (
@@ -110,18 +109,18 @@ describe('<ia-bookmarks-list>', () => {
110
109
  ));
111
110
  const response = await oneEvent(el, 'bookmarkColorChanged');
112
111
 
113
- expect(response).to.exist;
112
+ expect(response).toBeDefined();
114
113
  });
115
114
 
116
- it('sets editedBookmark when an edit button is clicked', async () => {
115
+ test('sets editedBookmark when an edit button is clicked', async () => {
117
116
  const el = await fixture(container(bookmarks));
118
117
  let prevState = el.editedBookmark;
119
118
 
120
119
  el.shadowRoot.querySelector('li button').click();
121
120
  await el.updateComplete;
122
121
 
123
- expect(el.editedBookmark).not.to.equal(prevState);
124
- expect(el.editedBookmark.page).to.equal(bookmarks[0].page);
122
+ expect(el.editedBookmark).not.toEqual(prevState);
123
+ expect(el.editedBookmark.page).toEqual(bookmarks[0].page);
125
124
 
126
125
  // When clicking the same edit button while in edit mode, should toggle
127
126
  // edit mode off and remove editedBookmark pointer
@@ -129,11 +128,11 @@ describe('<ia-bookmarks-list>', () => {
129
128
  el.shadowRoot.querySelector('li button').click();
130
129
  await el.updateComplete;
131
130
 
132
- expect(el.editedBookmark).not.to.equal(prevState);
133
- expect(el.editedBookmark.page).not.to.equal(bookmarks[0].page);
131
+ expect(el.editedBookmark).not.toEqual(prevState);
132
+ expect(el.editedBookmark.page).not.toEqual(bookmarks[0].page);
134
133
  });
135
134
 
136
- it('resets editedBookmark when saveBookmark callback called', async () => {
135
+ test('resets editedBookmark when saveBookmark callback called', async () => {
137
136
  const el = await fixture(container(bookmarks));
138
137
 
139
138
  [el.editedBookmark] = bookmarks;
@@ -141,11 +140,11 @@ describe('<ia-bookmarks-list>', () => {
141
140
  el.saveBookmark({ detail: { bookmark: bookmarks[0] } });
142
141
  await el.updateComplete;
143
142
 
144
- expect(el.editedBookmark).not.to.equal(bookmarks[0]);
145
- expect(el.editedBookmark).not.to.have.keys(['page', 'thumbnail', 'id']);
143
+ expect(el.editedBookmark).not.toEqual(bookmarks[0]);
144
+ expect(el.editedBookmark).not.toHaveProperty('page', 'thumbnail', 'id');
146
145
  });
147
146
 
148
- it('resets editedBookmark when deleteBookmark callback called', async () => {
147
+ test('resets editedBookmark when deleteBookmark callback called', async () => {
149
148
  const el = await fixture(container(bookmarks));
150
149
 
151
150
  [el.editedBookmark] = bookmarks;
@@ -153,33 +152,33 @@ describe('<ia-bookmarks-list>', () => {
153
152
  el.deleteBookmark({ detail: { id: bookmarks[0].id } });
154
153
  await el.updateComplete;
155
154
 
156
- expect(el.editedBookmark).not.to.equal(bookmarks[0]);
157
- expect(el.editedBookmark).not.to.have.keys(['page', 'thumbnail', 'id']);
155
+ expect(el.editedBookmark).not.toEqual(bookmarks[0]);
156
+ expect(el.editedBookmark).not.toHaveProperty('page', 'thumbnail', 'id');
158
157
  });
159
158
 
160
- it('renders the bookmarks count', async () => {
159
+ test('renders the bookmarks count', async () => {
161
160
  const el = await fixture(container([bookmarks[0]]));
162
161
  const bookmarksCount = await fixture(el.bookmarksCount);
163
162
 
164
- expect(bookmarksCount.innerHTML).to.include('(1)');
163
+ expect(bookmarksCount.textContent).toContain('(1)');
165
164
  });
166
165
 
167
- it('does not render the bookmarks count when no bookmarks present', async () => {
166
+ test('does not render the bookmarks count when no bookmarks present', async () => {
168
167
  const el = await fixture(container());
169
168
  el.renderHeader = true;
170
169
 
171
170
  await el.updateComplete;
172
171
 
173
- expect(el.shadowRoot.querySelector('header small')).not.to.exist;
172
+ expect(el.shadowRoot.querySelector('header small')).toBe(null);
174
173
  });
175
174
 
176
- it('renders an optional header section', async () => {
175
+ test('renders an optional header section', async () => {
177
176
  const el = await fixture(container(bookmarks));
178
177
  el.renderHeader = true;
179
178
 
180
179
  await el.updateComplete;
181
180
 
182
- expect(el.shadowRoot.querySelector('header')).to.exist;
181
+ expect(el.shadowRoot.querySelector('header')).toBeDefined();
183
182
  });
184
183
 
185
184
  // skipped:
@@ -192,7 +191,7 @@ describe('<ia-bookmarks-list>', () => {
192
191
  ));
193
192
  const response = await oneEvent(el, 'addBookmark');
194
193
 
195
- expect(response).to.exist;
194
+ expect(response).toBeDefined();
196
195
  });
197
196
 
198
197
  // skipped:
@@ -200,23 +199,23 @@ describe('<ia-bookmarks-list>', () => {
200
199
  xit('renders an optional add bookmark button', async () => {
201
200
  const el = await fixture(container(bookmarks));
202
201
 
203
- expect(el.shadowRoot.querySelector('.add-bookmark')).to.exist;
202
+ expect(el.shadowRoot.querySelector('.add-bookmark')).toBeDefined();
204
203
 
205
204
  el.renderAddBookmarkButton = false;
206
205
  await el.updateComplete;
207
206
 
208
- expect(el.shadowRoot.querySelector('.add-bookmark')).not.to.exist;
207
+ expect(el.shadowRoot.querySelector('.add-bookmark')).not.toBeDefined();
209
208
  });
210
209
 
211
210
  // skipped:
212
211
  // TypeError: Cannot read property 'getAttribute' of null
213
212
  xit('can toggle disable behavior of add bookmark button', async () => {
214
213
  const el = await fixture(container(bookmarks));
215
- expect(el.shadowRoot.querySelector('.add-bookmark').getAttribute('disabled')).to.be.null;
214
+ expect(el.shadowRoot.querySelector('.add-bookmark').getAttribute('disabled')).toBeNull();
216
215
 
217
216
  el.disableAddBookmarkButton = true;
218
217
  await el.updateComplete;
219
218
 
220
- expect(el.shadowRoot.querySelector('.add-bookmark').getAttribute('disabled')).to.equal('disabled');
219
+ expect(el.shadowRoot.querySelector('.add-bookmark').getAttribute('disabled')).toEqual('disabled');
221
220
  });
222
221
  });
@@ -0,0 +1,45 @@
1
+ import {
2
+ html,
3
+ fixtureSync,
4
+ fixtureCleanup,
5
+ } from '@open-wc/testing-helpers';
6
+ import '@/src/BookNavigator/bookmarks/ia-bookmarks.js';
7
+ import sinon from 'sinon';
8
+
9
+ afterEach(() => {
10
+ sinon.restore();
11
+ fixtureCleanup();
12
+ });
13
+
14
+ describe('<ia-bookmarks>', () => {
15
+ test('uses `setup` to start component', async () => {
16
+ const el = fixtureSync(html`<ia-bookmarks displayMode="bookmarks"></ia-bookmarks>`);
17
+ el.bookreader = {
18
+ bookId: 'foo',
19
+ $,
20
+ currentIndex: () => 0,
21
+ };
22
+ await el.updateComplete;
23
+ const fetchUserBookmarks = sinon.spy(el, 'fetchUserBookmarks');
24
+ const fetchBookmarks = sinon.stub(el, 'fetchBookmarks');
25
+
26
+ el.setup();
27
+ await el.updateComplete;
28
+
29
+ expect(fetchUserBookmarks.callCount).toEqual(1);
30
+ expect(fetchBookmarks.callCount).toEqual(1);
31
+ });
32
+
33
+ test('does not fetch user bookmarks if displayMode = login', async () => {
34
+ const el = fixtureSync(html`<ia-bookmarks displayMode="login"></ia-bookmarks>`);
35
+ await el.updateComplete;
36
+ const fetchSpy = sinon.spy(el, 'fetchUserBookmarks');
37
+ const fetchBookmarks = sinon.stub(el, 'fetchBookmarks');
38
+
39
+ el.setup();
40
+ await el.updateComplete;
41
+
42
+ expect(fetchSpy.callCount).toEqual(0);
43
+ expect(fetchBookmarks.callCount).toEqual(0);
44
+ });
45
+ });
@@ -0,0 +1,67 @@
1
+ import { fixtureCleanup, fixtureSync } from '@open-wc/testing-helpers';
2
+ import sinon from 'sinon';
3
+ import DownloadsProvider from '@/src/BookNavigator/downloads/downloads-provider';
4
+
5
+ const downloadableTypes = [
6
+ ["PDF", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.pdf"],
7
+ ["ePub", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.epub"],
8
+ ["Plain Text", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala_djvu.txt"],
9
+ ["DAISY", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala_daisy.zip"],
10
+ ["Kindle", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.mobi"]
11
+ ];
12
+
13
+ const downloads = [
14
+ {
15
+ type: "PDF",
16
+ url: "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.pdf",
17
+ note: "PDF files contain high quality images of pages."
18
+ },
19
+ {
20
+ type: "ePub",
21
+ url: "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.epub",
22
+ note: "ePub files are smaller in size, but may contain errors."
23
+ }
24
+ ];
25
+
26
+ afterEach(() => {
27
+ sinon.restore();
28
+ fixtureCleanup();
29
+ });
30
+
31
+ describe('Downloads Provider', () => {
32
+ test('constructor - initial setup', () => {
33
+ const isBookProtected = false;
34
+ const provider = new DownloadsProvider(isBookProtected);
35
+
36
+ expect(provider.id).toEqual('downloads');
37
+ expect(provider.icon).toBeDefined();
38
+ expect(fixtureSync(provider.icon).tagName).toEqual('IA-ICON-DL');
39
+ expect(provider.label).toEqual('Downloadable files');
40
+ expect(provider.menuDetails).toBeDefined();
41
+ expect(provider.component).toBeDefined();
42
+
43
+ provider.update(downloadableTypes);
44
+
45
+ expect(provider.isBookProtected).toEqual(false);
46
+
47
+ expect(provider.downloads[0].type).toEqual("PDF");
48
+ expect(provider.downloads[1].type).toEqual("ePub");
49
+
50
+ expect(provider.menuDetails).toEqual(`(${downloads.length} formats)`);
51
+ });
52
+
53
+ test('render view if book is protected', () => {
54
+ const provider = new DownloadsProvider({
55
+ bookreader: { options: { isProtected: true } }
56
+ });
57
+
58
+ expect(provider.isBookProtected).toEqual(true);
59
+
60
+ provider.update(downloadableTypes);
61
+
62
+ expect(provider.downloads[0].type).toEqual("Encrypted Adobe PDF");
63
+ expect(provider.downloads[1].type).toEqual("Encrypted Adobe ePub");
64
+
65
+ expect(provider.downloads.length).toEqual(downloads.length);
66
+ });
67
+ });
@@ -0,0 +1,53 @@
1
+ import {
2
+ html,
3
+ fixture,
4
+ fixtureCleanup,
5
+ } from '@open-wc/testing-helpers';
6
+ import sinon from 'sinon';
7
+ import '@/src/BookNavigator/downloads/downloads';
8
+
9
+
10
+ const downloads = [
11
+ {
12
+ type: "PDF",
13
+ url: "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.pdf",
14
+ note: "PDF files contain high quality images of pages."
15
+ },
16
+ {
17
+ type: "ePub",
18
+ url: "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.epub",
19
+ note: "ePub files are smaller in size, but may contain errors."
20
+ }
21
+ ];
22
+
23
+
24
+ const container = (downloads) => (
25
+ html`
26
+ <ia-book-downloads .downloads=${downloads}></ia-book-downloads>
27
+ `
28
+ );
29
+
30
+ beforeEach(() => {
31
+ const body = document.querySelector('body');
32
+ const brHook = document.createElement('div');
33
+ brHook.setAttribute('id', 'BookReader');
34
+ body.appendChild(brHook);
35
+ });
36
+
37
+ afterEach(() => {
38
+ sinon.restore();
39
+ fixtureCleanup();
40
+ });
41
+
42
+ describe('<ia-book-downloads>', () => {
43
+ test('sets default properties', async () => {
44
+ const el = await fixture(container(downloads));
45
+ await el.updateComplete;
46
+
47
+ expect(el.downloads.length).toEqual(2);
48
+ expect(el.shadowRoot.querySelector("ul").childElementCount).toEqual(2);
49
+ expect(el.isBookProtected).toEqual(false);
50
+
51
+ expect(el.shadowRoot.querySelector("ul li a").textContent).toContain("Get PDF");
52
+ });
53
+ });