@internetarchive/bookreader 5.0.0-6-14 → 5.0.0-60

Sign up to get free protection for your applications and to get access to all the features.
Files changed (271) hide show
  1. package/.eslintrc.js +17 -15
  2. package/.github/workflows/node.js.yml +72 -10
  3. package/.github/workflows/npm-publish.yml +6 -20
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +241 -140
  6. package/BookReader/BookReader.js +1 -1
  7. package/BookReader/BookReader.js.LICENSE.txt +24 -20
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +1519 -0
  10. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +17 -0
  11. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  12. package/BookReader/icons/close-circle-dark.svg +1 -0
  13. package/BookReader/icons/magnify-minus.svg +1 -1
  14. package/BookReader/icons/magnify-plus.svg +1 -1
  15. package/BookReader/icons/pause.svg +1 -1
  16. package/BookReader/icons/playback-speed.svg +1 -1
  17. package/BookReader/icons/read-aloud.svg +1 -1
  18. package/BookReader/icons/voice.svg +1 -0
  19. package/BookReader/images/BRicons.svg +2 -2
  20. package/BookReader/images/books_graphic.svg +1 -1
  21. package/BookReader/images/icon_book.svg +1 -1
  22. package/BookReader/images/icon_gear.svg +1 -1
  23. package/BookReader/images/icon_info.svg +1 -1
  24. package/BookReader/images/icon_playback-rate.svg +1 -1
  25. package/BookReader/images/icon_search_button.svg +1 -1
  26. package/BookReader/images/icon_share.svg +1 -1
  27. package/BookReader/images/icon_speaker.svg +1 -1
  28. package/BookReader/images/icon_speaker_open.svg +1 -1
  29. package/BookReader/images/marker_chap-off.svg +1 -1
  30. package/BookReader/images/marker_chap-on.svg +1 -1
  31. package/BookReader/images/marker_srch-on.svg +1 -1
  32. package/BookReader/jquery-3.js +2 -0
  33. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  34. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  35. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  36. package/BookReader/plugins/plugin.autoplay.js +1 -1
  37. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  38. package/BookReader/plugins/plugin.chapters.js +1 -1
  39. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  40. package/BookReader/plugins/plugin.iframe.js +1 -1
  41. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  42. package/BookReader/plugins/plugin.mobile_nav.js +1 -1
  43. package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
  44. package/BookReader/plugins/plugin.resume.js +1 -1
  45. package/BookReader/plugins/plugin.resume.js.map +1 -1
  46. package/BookReader/plugins/plugin.search.js +1 -1
  47. package/BookReader/plugins/plugin.search.js.map +1 -1
  48. package/BookReader/plugins/plugin.text_selection.js +1 -1
  49. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  50. package/BookReader/plugins/plugin.tts.js +1 -1
  51. package/BookReader/plugins/plugin.tts.js.map +1 -1
  52. package/BookReader/plugins/plugin.url.js +1 -1
  53. package/BookReader/plugins/plugin.url.js.map +1 -1
  54. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  55. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  56. package/BookReader/webcomponents-bundle.js +3 -0
  57. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  58. package/BookReader/webcomponents-bundle.js.map +1 -0
  59. package/BookReaderDemo/BookReaderDemo.css +14 -1
  60. package/BookReaderDemo/BookReaderJSAutoplay.js +4 -1
  61. package/BookReaderDemo/BookReaderJSSimple.js +1 -0
  62. package/BookReaderDemo/IADemoBr.js +147 -0
  63. package/BookReaderDemo/demo-advanced.html +2 -2
  64. package/BookReaderDemo/demo-autoplay.html +2 -1
  65. package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
  66. package/BookReaderDemo/demo-fullscreen-mobile.html +2 -1
  67. package/BookReaderDemo/demo-fullscreen.html +2 -1
  68. package/BookReaderDemo/demo-iiif.html +2 -1
  69. package/BookReaderDemo/demo-internetarchive.html +84 -17
  70. package/BookReaderDemo/demo-multiple.html +2 -1
  71. package/BookReaderDemo/demo-preview-pages.html +2 -1
  72. package/BookReaderDemo/demo-simple.html +2 -1
  73. package/BookReaderDemo/demo-vendor-fullscreen.html +2 -1
  74. package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
  75. package/BookReaderDemo/immersion-1up.html +2 -1
  76. package/BookReaderDemo/immersion-mode.html +2 -1
  77. package/BookReaderDemo/toggle_controls.html +2 -1
  78. package/BookReaderDemo/view_mode.html +2 -1
  79. package/BookReaderDemo/viewmode-cycle.html +2 -3
  80. package/CHANGELOG.md +244 -0
  81. package/README.md +14 -1
  82. package/babel.config.js +19 -0
  83. package/codecov.yml +6 -0
  84. package/index.html +3 -0
  85. package/jsconfig.json +19 -0
  86. package/netlify.toml +5 -0
  87. package/package.json +70 -59
  88. package/renovate.json +52 -0
  89. package/scripts/preversion.js +4 -1
  90. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  91. package/src/BookNavigator/assets/button-base.js +9 -2
  92. package/src/BookNavigator/assets/ia-logo.js +17 -0
  93. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  94. package/src/BookNavigator/assets/icon_close.js +1 -1
  95. package/src/BookNavigator/assets/icon_sort_asc.js +5 -0
  96. package/src/BookNavigator/assets/icon_sort_desc.js +5 -0
  97. package/src/BookNavigator/assets/icon_sort_neutral.js +5 -0
  98. package/src/BookNavigator/assets/icon_volumes.js +11 -0
  99. package/src/BookNavigator/book-navigator.js +585 -0
  100. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  101. package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
  102. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  103. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +3 -8
  104. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  105. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  106. package/src/BookNavigator/delete-modal-actions.js +1 -1
  107. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  108. package/src/BookNavigator/downloads/downloads.js +41 -25
  109. package/src/BookNavigator/search/search-provider.js +80 -28
  110. package/src/BookNavigator/search/search-results.js +34 -25
  111. package/src/BookNavigator/sharing.js +27 -0
  112. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -10
  113. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
  114. package/src/BookNavigator/volumes/volumes-provider.js +111 -0
  115. package/src/BookNavigator/volumes/volumes.js +188 -0
  116. package/src/BookReader/BookModel.js +59 -30
  117. package/src/BookReader/DebugConsole.js +3 -3
  118. package/src/BookReader/DragScrollable.js +233 -0
  119. package/src/BookReader/Mode1Up.js +56 -351
  120. package/src/BookReader/Mode1UpLit.js +391 -0
  121. package/src/BookReader/Mode2Up.js +73 -1318
  122. package/src/BookReader/Mode2UpLit.js +781 -0
  123. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  124. package/src/BookReader/ModeSmoothZoom.js +211 -0
  125. package/src/BookReader/ModeThumb.js +17 -11
  126. package/src/BookReader/Navbar/Navbar.js +10 -36
  127. package/src/BookReader/PageContainer.js +69 -6
  128. package/src/BookReader/ReduceSet.js +1 -1
  129. package/src/BookReader/Toolbar/Toolbar.js +10 -37
  130. package/src/BookReader/events.js +2 -0
  131. package/src/BookReader/options.js +24 -2
  132. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  133. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  134. package/src/BookReader/utils.js +108 -13
  135. package/src/BookReader.js +481 -828
  136. package/src/assets/icons/close-circle-dark.svg +1 -0
  137. package/src/assets/icons/magnify-minus.svg +3 -7
  138. package/src/assets/icons/magnify-plus.svg +3 -7
  139. package/src/assets/icons/voice.svg +1 -0
  140. package/src/css/_BRBookmarks.scss +1 -1
  141. package/src/css/_BRComponent.scss +1 -1
  142. package/src/css/_BRmain.scss +33 -0
  143. package/src/css/_BRnav.scss +4 -26
  144. package/src/css/_BRpages.scss +147 -40
  145. package/src/css/_BRsearch.scss +25 -11
  146. package/src/css/_TextSelection.scss +16 -17
  147. package/src/css/_colorbox.scss +2 -2
  148. package/src/css/_controls.scss +17 -5
  149. package/src/css/_icons.scss +7 -1
  150. package/src/ia-bookreader/ia-bookreader.js +224 -0
  151. package/src/plugins/plugin.archive_analytics.js +3 -3
  152. package/src/plugins/plugin.autoplay.js +4 -9
  153. package/src/plugins/plugin.chapters.js +28 -35
  154. package/src/plugins/plugin.mobile_nav.js +11 -10
  155. package/src/plugins/plugin.resume.js +3 -3
  156. package/src/plugins/plugin.text_selection.js +32 -41
  157. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  158. package/src/plugins/search/plugin.search.js +179 -103
  159. package/src/plugins/search/view.js +59 -44
  160. package/src/plugins/tts/AbstractTTSEngine.js +46 -37
  161. package/src/plugins/tts/FestivalTTSEngine.js +13 -14
  162. package/src/plugins/tts/PageChunk.js +15 -21
  163. package/src/plugins/tts/PageChunkIterator.js +8 -12
  164. package/src/plugins/tts/WebTTSEngine.js +87 -71
  165. package/src/plugins/tts/plugin.tts.js +94 -125
  166. package/src/plugins/tts/utils.js +0 -25
  167. package/src/plugins/url/UrlPlugin.js +193 -0
  168. package/src/plugins/{plugin.url.js → url/plugin.url.js} +45 -16
  169. package/src/util/docCookies.js +21 -2
  170. package/tests/e2e/README.md +37 -0
  171. package/tests/e2e/autoplay.test.js +2 -2
  172. package/tests/e2e/base.test.js +7 -7
  173. package/tests/e2e/helpers/base.js +28 -23
  174. package/tests/e2e/helpers/debug.js +1 -1
  175. package/tests/e2e/helpers/desktopSearch.js +14 -13
  176. package/tests/e2e/helpers/mobileSearch.js +3 -3
  177. package/tests/e2e/helpers/params.js +17 -0
  178. package/tests/e2e/helpers/rightToLeft.js +4 -10
  179. package/tests/e2e/models/Navigation.js +13 -4
  180. package/tests/e2e/rightToLeft.test.js +4 -5
  181. package/tests/e2e/viewmode.test.js +40 -33
  182. package/tests/jest/BookNavigator/book-navigator.test.js +658 -0
  183. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  184. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  185. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  186. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  187. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  188. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  189. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  190. package/tests/{karma/BookNavigator → jest/BookNavigator/search}/search-results.test.js +104 -60
  191. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  192. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  193. package/tests/jest/BookNavigator/volumes/volumes-provider.test.js +184 -0
  194. package/tests/jest/BookNavigator/volumes/volumes.test.js +97 -0
  195. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +59 -14
  196. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
  197. package/tests/{BookReader → jest/BookReader}/DebugConsole.test.js +1 -1
  198. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  199. package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
  200. package/tests/jest/BookReader/Mode2Up.test.js +98 -0
  201. package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
  202. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
  203. package/tests/jest/BookReader/ModeSmoothZoom.test.js +175 -0
  204. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  205. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +10 -10
  206. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +88 -6
  207. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  208. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  209. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  210. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  211. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  212. package/tests/jest/BookReader/utils.test.js +217 -0
  213. package/tests/jest/BookReader.keyboard.test.js +190 -0
  214. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  215. package/tests/{BookReader.test.js → jest/BookReader.test.js} +26 -37
  216. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  217. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +4 -4
  218. package/tests/{plugins → jest/plugins}/plugin.chapters.test.js +10 -11
  219. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  220. package/tests/{plugins → jest/plugins}/plugin.mobile_nav.test.js +5 -5
  221. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  222. package/tests/{plugins → jest/plugins}/plugin.text_selection.test.js +39 -47
  223. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  224. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +57 -47
  225. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +35 -6
  226. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +9 -9
  227. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  228. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  229. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  230. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
  231. package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
  232. package/tests/jest/plugins/url/UrlPlugin.test.js +190 -0
  233. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +53 -14
  234. package/tests/jest/setup.js +3 -0
  235. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  236. package/tests/jest/util/docCookies.test.js +24 -0
  237. package/tests/{util → jest/util}/strings.test.js +1 -1
  238. package/tests/{utils.js → jest/utils.js} +38 -0
  239. package/webpack.config.js +11 -5
  240. package/.babelrc +0 -12
  241. package/.dependabot/config.yml +0 -6
  242. package/.testcaferc.json +0 -5
  243. package/BookReader/bookreader-component-bundle.js +0 -1450
  244. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  245. package/BookReader/bookreader-component-bundle.js.map +0 -1
  246. package/BookReader/jquery-1.10.1.js +0 -2
  247. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  248. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  249. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  250. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  251. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  252. package/karma.conf.js +0 -23
  253. package/src/BookNavigator/BookModel.js +0 -14
  254. package/src/BookNavigator/BookNavigator.js +0 -438
  255. package/src/BookNavigator/assets/book-loader.js +0 -27
  256. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  257. package/src/BookNavigator/search/a-search-result.js +0 -55
  258. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  259. package/src/ItemNavigator/ItemNavigator.js +0 -372
  260. package/src/ItemNavigator/providers/sharing.js +0 -29
  261. package/src/dragscrollable-br.js +0 -261
  262. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  263. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  264. package/tests/BookReader/Mode1Up.test.js +0 -164
  265. package/tests/BookReader/Mode2Up.test.js +0 -247
  266. package/tests/BookReader/utils.test.js +0 -109
  267. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  268. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  269. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  270. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  271. 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
+ });