@internetarchive/bookreader 5.0.0-26 → 5.0.0-29

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 (236) hide show
  1. package/.husky/_/husky.sh +30 -0
  2. package/BookReader/BookReader.css +1 -1
  3. package/BookReader/BookReader.js +1 -1
  4. package/BookReader/BookReader.js.map +1 -1
  5. package/BookReader/bookreader-component-bundle.js +570 -542
  6. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +23 -0
  7. package/BookReader/bookreader-component-bundle.js.map +1 -1
  8. package/BookReader/plugins/plugin.search.js +1 -1
  9. package/BookReader/plugins/plugin.search.js.map +1 -1
  10. package/BookReader/plugins/plugin.tts.js.map +1 -1
  11. package/BookReader/plugins/plugin.url.js +1 -1
  12. package/BookReader/plugins/plugin.url.js.map +1 -1
  13. package/BookReaderDemo/BookReaderDemo.css +14 -1
  14. package/BookReaderDemo/IADemoBr.js +104 -0
  15. package/BookReaderDemo/demo-internetarchive.html +65 -98
  16. package/CHANGELOG.md +10 -0
  17. package/package.json +9 -6
  18. package/src/BookNavigator/assets/ia-logo.js +17 -0
  19. package/src/BookNavigator/book-navigator.js +521 -0
  20. package/src/BookNavigator/bookmarks/bookmark-button.js +2 -1
  21. package/src/BookNavigator/bookmarks/bookmarks-provider.js +20 -8
  22. package/src/BookNavigator/bookmarks/ia-bookmarks.js +84 -51
  23. package/src/BookNavigator/downloads/downloads-provider.js +5 -9
  24. package/src/BookNavigator/downloads/downloads.js +1 -0
  25. package/src/BookNavigator/search/search-provider.js +15 -8
  26. package/src/BookNavigator/sharing.js +27 -0
  27. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +9 -8
  28. package/src/BookNavigator/volumes/volumes-provider.js +44 -13
  29. package/src/BookNavigator/volumes/volumes.js +14 -3
  30. package/src/BookReader/options.js +6 -0
  31. package/src/BookReader.js +20 -8
  32. package/src/BookReaderComponent/BookReaderComponent.js +53 -32
  33. package/src/css/_BRComponent.scss +1 -1
  34. package/src/plugins/search/plugin.search.js +10 -9
  35. package/src/plugins/tts/FestivalTTSEngine.js +1 -1
  36. package/src/plugins/url/UrlPlugin.js +184 -0
  37. package/src/plugins/url/plugin.url.js +220 -0
  38. package/{src → stat}/BookNavigator/BookModel.js +0 -0
  39. package/{src → stat}/BookNavigator/BookNavigator.js +109 -102
  40. package/stat/BookNavigator/assets/bookmark-colors.js +15 -0
  41. package/stat/BookNavigator/assets/button-base.js +61 -0
  42. package/stat/BookNavigator/assets/ia-logo.js +17 -0
  43. package/stat/BookNavigator/assets/icon_checkmark.js +6 -0
  44. package/stat/BookNavigator/assets/icon_close.js +3 -0
  45. package/stat/BookNavigator/assets/icon_sort_asc.js +5 -0
  46. package/stat/BookNavigator/assets/icon_sort_desc.js +5 -0
  47. package/stat/BookNavigator/assets/icon_sort_neutral.js +5 -0
  48. package/stat/BookNavigator/assets/icon_volumes.js +11 -0
  49. package/stat/BookNavigator/bookmarks/bookmark-button.js +64 -0
  50. package/stat/BookNavigator/bookmarks/bookmark-edit.js +215 -0
  51. package/stat/BookNavigator/bookmarks/bookmarks-list.js +285 -0
  52. package/stat/BookNavigator/bookmarks/bookmarks-loginCTA.js +28 -0
  53. package/stat/BookNavigator/bookmarks/bookmarks-provider.js +56 -0
  54. package/stat/BookNavigator/bookmarks/ia-bookmarks.js +523 -0
  55. package/{src → stat}/BookNavigator/br-fullscreen-mgr.js +1 -2
  56. package/stat/BookNavigator/delete-modal-actions.js +49 -0
  57. package/stat/BookNavigator/downloads/downloads-provider.js +72 -0
  58. package/stat/BookNavigator/downloads/downloads.js +139 -0
  59. package/stat/BookNavigator/provider-config.js +0 -0
  60. package/stat/BookNavigator/search/a-search-result.js +55 -0
  61. package/stat/BookNavigator/search/search-provider.js +180 -0
  62. package/stat/BookNavigator/search/search-results.js +360 -0
  63. package/{src/ItemNavigator/providers → stat/BookNavigator}/sharing.js +3 -5
  64. package/stat/BookNavigator/visual-adjustments/visual-adjustments-provider.js +94 -0
  65. package/stat/BookNavigator/visual-adjustments/visual-adjustments.js +280 -0
  66. package/stat/BookNavigator/volumes/volumes-provider.js +83 -0
  67. package/stat/BookNavigator/volumes/volumes.js +178 -0
  68. package/stat/BookReader/BookModel.js +518 -0
  69. package/stat/BookReader/DebugConsole.js +54 -0
  70. package/stat/BookReader/DragScrollable.js +233 -0
  71. package/stat/BookReader/ImageCache.js +116 -0
  72. package/stat/BookReader/Mode1Up.js +102 -0
  73. package/stat/BookReader/Mode1UpLit.js +434 -0
  74. package/stat/BookReader/Mode2Up.js +1372 -0
  75. package/stat/BookReader/ModeSmoothZoom.js +177 -0
  76. package/stat/BookReader/ModeThumb.js +344 -0
  77. package/stat/BookReader/Navbar/Navbar.js +310 -0
  78. package/stat/BookReader/PageContainer.js +120 -0
  79. package/stat/BookReader/ReduceSet.js +26 -0
  80. package/stat/BookReader/Toolbar/Toolbar.js +384 -0
  81. package/stat/BookReader/events.js +20 -0
  82. package/stat/BookReader/options.js +324 -0
  83. package/stat/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  84. package/stat/BookReader/utils/classes.js +36 -0
  85. package/stat/BookReader/utils.js +240 -0
  86. package/stat/BookReader.js +2550 -0
  87. package/stat/BookReaderComponent/BookReaderComponent.js +117 -0
  88. package/stat/assets/icons/1up.svg +12 -0
  89. package/stat/assets/icons/2up.svg +15 -0
  90. package/stat/assets/icons/advance.svg +26 -0
  91. package/stat/assets/icons/chevron-right.svg +1 -0
  92. package/stat/assets/icons/close-circle-dark.svg +1 -0
  93. package/stat/assets/icons/close-circle.svg +1 -0
  94. package/stat/assets/icons/fullscreen.svg +17 -0
  95. package/stat/assets/icons/fullscreen_exit.svg +17 -0
  96. package/stat/assets/icons/hamburger.svg +15 -0
  97. package/stat/assets/icons/left-arrow.svg +12 -0
  98. package/stat/assets/icons/magnify-minus.svg +16 -0
  99. package/stat/assets/icons/magnify-plus.svg +17 -0
  100. package/stat/assets/icons/magnify.svg +15 -0
  101. package/stat/assets/icons/pause.svg +23 -0
  102. package/stat/assets/icons/play.svg +22 -0
  103. package/stat/assets/icons/playback-speed.svg +34 -0
  104. package/stat/assets/icons/read-aloud.svg +22 -0
  105. package/stat/assets/icons/review.svg +22 -0
  106. package/stat/assets/icons/thumbnails.svg +17 -0
  107. package/stat/assets/icons/voice.svg +1 -0
  108. package/stat/assets/icons/volume-full.svg +22 -0
  109. package/stat/assets/images/BRicons.png +0 -0
  110. package/stat/assets/images/BRicons.svg +94 -0
  111. package/stat/assets/images/BRicons_ia.png +0 -0
  112. package/stat/assets/images/back_pages.png +0 -0
  113. package/stat/assets/images/book_bottom_icon.png +0 -0
  114. package/stat/assets/images/book_down_icon.png +0 -0
  115. package/stat/assets/images/book_left_icon.png +0 -0
  116. package/stat/assets/images/book_leftmost_icon.png +0 -0
  117. package/stat/assets/images/book_right_icon.png +0 -0
  118. package/stat/assets/images/book_rightmost_icon.png +0 -0
  119. package/stat/assets/images/book_top_icon.png +0 -0
  120. package/stat/assets/images/book_up_icon.png +0 -0
  121. package/stat/assets/images/books_graphic.svg +177 -0
  122. package/stat/assets/images/booksplit.png +0 -0
  123. package/stat/assets/images/control_pause_icon.png +0 -0
  124. package/stat/assets/images/control_play_icon.png +0 -0
  125. package/stat/assets/images/embed_icon.png +0 -0
  126. package/stat/assets/images/icon-home-ia.png +0 -0
  127. package/stat/assets/images/icon_OL-logo-xs.png +0 -0
  128. package/stat/assets/images/icon_alert-xs.png +0 -0
  129. package/stat/assets/images/icon_book.svg +12 -0
  130. package/stat/assets/images/icon_bookmark.svg +12 -0
  131. package/stat/assets/images/icon_close-pop.png +0 -0
  132. package/stat/assets/images/icon_download.png +0 -0
  133. package/stat/assets/images/icon_gear.svg +14 -0
  134. package/stat/assets/images/icon_hamburger.svg +20 -0
  135. package/stat/assets/images/icon_home.png +0 -0
  136. package/stat/assets/images/icon_home.svg +21 -0
  137. package/stat/assets/images/icon_home_ia.png +0 -0
  138. package/stat/assets/images/icon_indicator.png +0 -0
  139. package/stat/assets/images/icon_info.svg +11 -0
  140. package/stat/assets/images/icon_one_page.svg +8 -0
  141. package/stat/assets/images/icon_pause.svg +1 -0
  142. package/stat/assets/images/icon_play.svg +1 -0
  143. package/stat/assets/images/icon_playback-rate.svg +15 -0
  144. package/stat/assets/images/icon_return.png +0 -0
  145. package/stat/assets/images/icon_search_button.svg +8 -0
  146. package/stat/assets/images/icon_share.svg +9 -0
  147. package/stat/assets/images/icon_skip-ahead.svg +6 -0
  148. package/stat/assets/images/icon_skip-back.svg +13 -0
  149. package/stat/assets/images/icon_speaker.svg +18 -0
  150. package/stat/assets/images/icon_speaker_open.svg +10 -0
  151. package/stat/assets/images/icon_thumbnails.svg +12 -0
  152. package/stat/assets/images/icon_toc.svg +5 -0
  153. package/stat/assets/images/icon_two_pages.svg +9 -0
  154. package/stat/assets/images/icon_zoomer.png +0 -0
  155. package/stat/assets/images/loading.gif +0 -0
  156. package/stat/assets/images/logo_icon.png +0 -0
  157. package/stat/assets/images/marker_chap-off.png +0 -0
  158. package/stat/assets/images/marker_chap-off.svg +11 -0
  159. package/stat/assets/images/marker_chap-off_ia.png +0 -0
  160. package/stat/assets/images/marker_chap-on.png +0 -0
  161. package/stat/assets/images/marker_chap-on.svg +11 -0
  162. package/stat/assets/images/marker_srch-on.svg +11 -0
  163. package/stat/assets/images/marker_srchchap-off.png +0 -0
  164. package/stat/assets/images/marker_srchchap-on.png +0 -0
  165. package/stat/assets/images/nav_control-dn.png +0 -0
  166. package/stat/assets/images/nav_control-dn_ia.png +0 -0
  167. package/stat/assets/images/nav_control-up.png +0 -0
  168. package/stat/assets/images/nav_control-up_ia.png +0 -0
  169. package/stat/assets/images/nav_control.png +0 -0
  170. package/stat/assets/images/one_page_mode_icon.png +0 -0
  171. package/stat/assets/images/paper-badge.png +0 -0
  172. package/stat/assets/images/print_icon.png +0 -0
  173. package/stat/assets/images/progressbar.gif +0 -0
  174. package/stat/assets/images/right_edges.png +0 -0
  175. package/stat/assets/images/slider.png +0 -0
  176. package/stat/assets/images/slider_ia.png +0 -0
  177. package/stat/assets/images/thumbnail_mode_icon.png +0 -0
  178. package/stat/assets/images/transparent.png +0 -0
  179. package/stat/assets/images/two_page_mode_icon.png +0 -0
  180. package/stat/assets/images/zoom_in_icon.png +0 -0
  181. package/stat/assets/images/zoom_out_icon.png +0 -0
  182. package/stat/css/BookReader.scss +89 -0
  183. package/stat/css/_BRBookmarks.scss +29 -0
  184. package/stat/css/_BRComponent.scss +13 -0
  185. package/stat/css/_BRfloat.scss +197 -0
  186. package/stat/css/_BRicon.scss +48 -0
  187. package/stat/css/_BRmain.scss +251 -0
  188. package/stat/css/_BRnav.scss +359 -0
  189. package/stat/css/_BRpages.scss +139 -0
  190. package/stat/css/_BRsearch.scss +226 -0
  191. package/stat/css/_BRtoolbar.scss +84 -0
  192. package/stat/css/_BRvendor.scss +5 -0
  193. package/stat/css/_MobileNav.scss +194 -0
  194. package/stat/css/_TextSelection.scss +32 -0
  195. package/stat/css/_colorbox.scss +52 -0
  196. package/stat/css/_controls.scss +253 -0
  197. package/stat/css/_icons.scss +121 -0
  198. package/stat/jquery-wrapper.js +4 -0
  199. package/stat/plugins/plugin.archive_analytics.js +86 -0
  200. package/stat/plugins/plugin.autoplay.js +129 -0
  201. package/stat/plugins/plugin.chapters.js +248 -0
  202. package/stat/plugins/plugin.iframe.js +48 -0
  203. package/stat/plugins/plugin.mobile_nav.js +288 -0
  204. package/stat/plugins/plugin.resume.js +68 -0
  205. package/stat/plugins/plugin.text_selection.js +291 -0
  206. package/{src → stat}/plugins/plugin.url.js +0 -0
  207. package/stat/plugins/plugin.vendor-fullscreen.js +247 -0
  208. package/stat/plugins/search/plugin.search.js +439 -0
  209. package/stat/plugins/search/view.js +439 -0
  210. package/stat/plugins/tts/AbstractTTSEngine.js +249 -0
  211. package/stat/plugins/tts/FestivalTTSEngine.js +169 -0
  212. package/stat/plugins/tts/PageChunk.js +107 -0
  213. package/stat/plugins/tts/PageChunkIterator.js +163 -0
  214. package/stat/plugins/tts/WebTTSEngine.js +357 -0
  215. package/stat/plugins/tts/plugin.tts.js +357 -0
  216. package/stat/plugins/tts/tooltip_dict.js +15 -0
  217. package/stat/plugins/tts/utils.js +91 -0
  218. package/stat/util/browserSniffing.js +30 -0
  219. package/stat/util/debouncer.js +26 -0
  220. package/stat/util/docCookies.js +67 -0
  221. package/stat/util/strings.js +34 -0
  222. package/tests/e2e/viewmode.test.js +30 -30
  223. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +64 -52
  224. package/tests/jest/BookReader.test.js +1 -1
  225. package/tests/jest/plugins/url/UrlPlugin.test.js +175 -0
  226. package/tests/jest/plugins/{plugin.url.test.js → url/plugin.url.test.js} +3 -2
  227. package/tests/karma/BookNavigator/book-navigator.test.js +413 -108
  228. package/tests/karma/BookNavigator/bookmarks/bookmark-button.test.js +44 -0
  229. package/tests/karma/BookNavigator/downloads/downloads-provider.test.js +6 -3
  230. package/tests/karma/BookNavigator/search/search-provider.test.js +106 -6
  231. package/tests/karma/BookNavigator/search/search-results.test.js +0 -2
  232. package/tests/karma/BookNavigator/sharing/sharing-provider.test.js +29 -20
  233. package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +46 -22
  234. package/webpack.config.js +1 -1
  235. package/src/BookNavigator/assets/book-loader.js +0 -27
  236. package/src/ItemNavigator/ItemNavigator.js +0 -377
@@ -1,36 +1,36 @@
1
- import { Selector } from 'testcafe';
2
- import BookReader from './models/BookReader';
3
- import params from './helpers/params';
1
+ // import { Selector } from 'testcafe';
2
+ // import BookReader from './models/BookReader';
3
+ // import params from './helpers/params';
4
4
 
5
- fixture `Viewmode carousel`.page `${params.baseUrl}/BookReaderDemo/viewmode-cycle.html`;
5
+ // fixture `Viewmode carousel`.page `${params.baseUrl}/BookReaderDemo/viewmode-cycle.html`;
6
6
 
7
- test('Clicking `view mode` cycles through view modes', async t => {
8
- const { nav } = (new BookReader());
7
+ // test('Clicking `view mode` cycles through view modes', async t => {
8
+ // const { nav } = (new BookReader());
9
9
 
10
- // viewmode button only appear on mobile devices
11
- await t.resizeWindow(400, 800);
12
- // Flip forward one
13
- await t.pressKey('right');
10
+ // // viewmode button only appear on mobile devices
11
+ // await t.resizeWindow(400, 800);
12
+ // // Flip forward one
13
+ // await t.pressKey('right');
14
14
 
15
- // 2up to thumb
16
- await t.click(nav.desktop.viewmode);
17
- const thumbnailContainer = Selector('.BRmodeThumb');
18
- await t.expect(thumbnailContainer.visible).ok();
19
- const thumbImages = thumbnailContainer.find('.BRpageview img');
20
- await t.expect(thumbImages.count).gt(0);
15
+ // // 2up to thumb
16
+ // await t.click(nav.desktop.viewmode);
17
+ // const thumbnailContainer = Selector('.BRmodeThumb');
18
+ // await t.expect(thumbnailContainer.visible).ok();
19
+ // const thumbImages = thumbnailContainer.find('.BRpageview img');
20
+ // await t.expect(thumbImages.count).gt(0);
21
21
 
22
- // thumb to 1up
23
- await t.click(nav.desktop.viewmode);
24
- const onePageViewContainer = Selector('br-mode-1up');
25
- await t.expect(onePageViewContainer.visible).ok();
26
- const onePageImages = onePageViewContainer.find('.BRmode1up .BRpagecontainer');
27
- // we usually pre-fetch the page in question & 1 before/after it
28
- await t.expect(onePageImages.count).gte(3);
22
+ // // thumb to 1up
23
+ // await t.click(nav.desktop.viewmode);
24
+ // const onePageViewContainer = Selector('br-mode-1up');
25
+ // await t.expect(onePageViewContainer.visible).ok();
26
+ // const onePageImages = onePageViewContainer.find('.BRmode1up .BRpagecontainer');
27
+ // // we usually pre-fetch the page in question & 1 before/after it
28
+ // await t.expect(onePageImages.count).gte(3);
29
29
 
30
- // 1up to 2up
31
- await t.click(nav.desktop.viewmode);
32
- const twoPageContainer = Selector('.BRtwopageview');
33
- await t.expect(twoPageContainer.visible).ok();
34
- const twoPageImages = twoPageContainer.find('img.BRpageimage');
35
- await t.expect(twoPageImages.count).gte(2);
36
- });
30
+ // // 1up to 2up
31
+ // await t.click(nav.desktop.viewmode);
32
+ // const twoPageContainer = Selector('.BRtwopageview');
33
+ // await t.expect(twoPageContainer.visible).ok();
34
+ // const twoPageImages = twoPageContainer.find('img.BRpageimage');
35
+ // await t.expect(twoPageImages.count).gte(2);
36
+ // });
@@ -1,56 +1,66 @@
1
1
  import BookReader from '@/src/BookReader';
2
+ import { sleep } from '@/src/plugins/tts/utils';
3
+ import sinon from 'sinon';
2
4
 
3
5
  beforeAll(() => {
4
- global.alert = jest.fn();
6
+ global.alert = sinon.fake();
5
7
  });
6
8
  afterEach(() => {
7
- jest.restoreAllMocks();
9
+ sinon.restore();
8
10
  });
9
11
 
10
12
  describe('BookReader.prototype.toggleFullscreen', () => {
11
13
  test('uses `isFullscreen` to check fullscreen state', () => {
12
- const isFSmock = jest.fn();
13
- isFSmock.mockReturnValueOnce(false);
14
+ const isFSmock = sinon.fake();
15
+ // isFSmock.mockReturnValueOnce(false);
14
16
  const br = new BookReader();
15
17
  br.mode = br.constMode1up;
16
- br.enterFullscreen = jest.fn();
18
+ br.enterFullscreen = sinon.fake();
17
19
  br.isFullscreen = isFSmock;
18
20
 
19
21
  br.toggleFullscreen();
20
- expect(br.isFullscreen).toHaveBeenCalled();
22
+ expect(br.isFullscreen.callCount).toEqual(1);
21
23
  });
22
24
 
23
25
  test('will always emit an event', async () => {
24
26
  const br = new BookReader();
25
27
  br.mode = br.constMode2up;
26
- br.trigger = jest.fn();
27
- br.switchMode = jest.fn();
28
+ br.trigger = sinon.fake();
29
+ br.switchMode = sinon.fake();
30
+ br.updateBrClasses = sinon.fake();
28
31
  br.refs.$brContainer = {
29
- css: jest.fn(),
32
+ css: sinon.fake(),
33
+ animate: (options, speed, style, callback) => callback()
34
+ };
35
+ br.refs.$br = {
36
+ updateBrClasses: sinon.fake(),
37
+ removeClass: sinon.fake(),
38
+ addClass: sinon.fake(),
39
+ css: sinon.fake(),
30
40
  animate: (options, speed, style, callback) => callback()
31
41
  };
32
42
 
33
43
  await br.toggleFullscreen();
34
- expect(br.trigger).toHaveBeenCalled();
44
+ expect(br.trigger.callCount).toBeGreaterThan(0);
35
45
  });
36
46
 
37
47
  test('will start with opening fullscreen', () => {
38
48
  const br = new BookReader();
39
49
  br.mode = br.constMode2up;
40
- br.enterFullscreen = jest.fn();
50
+ br.enterFullscreen = sinon.fake();
41
51
 
42
52
  br.toggleFullscreen();
43
- expect(br.enterFullscreen).toHaveBeenCalled();
53
+ expect(br.enterFullscreen.callCount).toEqual(1);
44
54
  });
45
55
 
46
56
  test('will close fullscreen if BookReader is in fullscreen', () => {
47
57
  const br = new BookReader();
48
58
  br.mode = br.constMode1up;
49
- br.exitFullScreen = jest.fn();
59
+ br.exitFullScreen = sinon.fake();
50
60
  br.isFullscreenActive = true;
51
61
 
52
62
  br.toggleFullscreen();
53
- expect(br.exitFullScreen).toHaveBeenCalled();
63
+ expect(br.exitFullScreen.callCount).toEqual(1);
54
64
  });
55
65
  });
56
66
 
@@ -58,11 +68,11 @@ describe('BookReader.prototype.enterFullscreen', () => {
58
68
  test('will bind `_fullscreenCloseHandler` by default', () => {
59
69
  const br = new BookReader();
60
70
  br.mode = br.constMode1up;
61
- br.switchMode = jest.fn();
62
- br.updateBrClasses = jest.fn();
71
+ br.switchMode = sinon.fake();
72
+ br.updateBrClasses = sinon.fake();
63
73
  br.refs.$brContainer = {
64
- css: jest.fn(),
65
- animate: jest.fn(),
74
+ css: sinon.fake(),
75
+ animate: sinon.fake(),
66
76
  };
67
77
  expect(br._fullscreenCloseHandler).toBeUndefined();
68
78
 
@@ -73,22 +83,24 @@ describe('BookReader.prototype.enterFullscreen', () => {
73
83
  test('fires certain events when called', async () => {
74
84
  const br = new BookReader();
75
85
  br.mode = br.constMode2up;
76
- br.switchMode = jest.fn();
77
- br.updateBrClasses = jest.fn();
78
- br.trigger = jest.fn();
79
- br.resize = jest.fn();
80
- br.jumpToIndex = jest.fn();
86
+ br.switchMode = sinon.fake();
87
+ br.updateBrClasses = sinon.fake();
88
+ br.trigger = sinon.fake();
89
+ br.resize = sinon.fake();
90
+ br.jumpToIndex = sinon.fake();
81
91
  br.refs.$brContainer = {
82
- css: jest.fn(),
92
+ css: sinon.fake(),
83
93
  animate: (options, speed, style, callback) => callback()
84
94
  };
85
95
 
86
96
  await br.enterFullscreen();
87
- expect(br.switchMode).toHaveBeenCalledTimes(1);
88
- expect(br.updateBrClasses).toHaveBeenCalledTimes(0); // book nav's fullscreen manager will set these classes
89
- expect(br.trigger).toHaveBeenCalledTimes(2); // fragmentChange, fullscreenToggled
90
- expect(br.resize).toHaveBeenCalledTimes(1);
91
- expect(br.jumpToIndex).toHaveBeenCalledTimes(1);
97
+ expect(br.switchMode.callCount).toEqual(1);
98
+ expect(br.updateBrClasses.callCount).toEqual(1);
99
+ expect(br.trigger.callCount).toEqual(2); // fragmentChange, fullscreenToggled
100
+ expect(br.jumpToIndex.callCount).toEqual(1);
101
+
102
+ await sleep(0);
103
+ expect(br.resize.callCount).toEqual(1);
92
104
  });
93
105
  });
94
106
 
@@ -96,19 +108,19 @@ describe('BookReader.prototype.exitFullScreen', () => {
96
108
  test('fires certain events when called', async () => {
97
109
  const br = new BookReader();
98
110
  br.mode = br.constMode2up;
99
- br.switchMode = jest.fn();
100
- br.updateBrClasses = jest.fn();
101
- br.trigger = jest.fn();
102
- br.resize = jest.fn();
111
+ br.switchMode = sinon.fake();
112
+ br.updateBrClasses = sinon.fake();
113
+ br.trigger = sinon.fake();
114
+ br.resize = sinon.fake();
103
115
  br.refs.$brContainer = {
104
- css: jest.fn(),
116
+ css: sinon.fake(),
105
117
  animate: (options, speed, style, callback) => callback()
106
118
  };
107
119
  await br.exitFullScreen();
108
- expect(br.switchMode).toHaveBeenCalledTimes(1);
109
- expect(br.updateBrClasses).toHaveBeenCalledTimes(1);
110
- expect(br.trigger).toHaveBeenCalledTimes(2); // fragmentChange, fullscreenToggled
111
- expect(br.resize).toHaveBeenCalledTimes(1);
120
+ expect(br.switchMode.callCount).toEqual(1);
121
+ expect(br.updateBrClasses.callCount).toEqual(1);
122
+ expect(br.trigger.callCount).toEqual(2); // fragmentChange, fullscreenToggled
123
+ expect(br.resize.callCount).toEqual(1);
112
124
  });
113
125
  });
114
126
 
@@ -116,27 +128,27 @@ describe('BookReader.prototype.trigger', () => {
116
128
  test('fires custom event', () => {
117
129
  const br = new BookReader();
118
130
  global.br = br;
119
- global.dispatchEvent = jest.fn();
131
+ global.dispatchEvent = sinon.fake();
120
132
 
121
133
  const props = {bar: 1};
122
134
  br.trigger('foo', props);
123
- expect(global.dispatchEvent.mock.calls.length).toBe(1);
135
+ expect(global.dispatchEvent.callCount).toBe(1);
124
136
  });
125
137
  });
126
138
 
127
139
  describe('`BookReader.prototype.prev`', () => {
128
140
  const br = new BookReader();
129
141
  global.br = br;
130
- br.trigger = jest.fn();
131
- br.flipBackToIndex = jest.fn();
132
- br.jumpToIndex = jest.fn();
142
+ br.trigger = sinon.fake();
143
+ br.flipBackToIndex = sinon.fake();
144
+ br.jumpToIndex = sinon.fake();
133
145
 
134
146
  test('does not take action if user is on front page', () => {
135
147
  br.firstIndex = 0;
136
148
  br.prev();
137
- expect(br.trigger.mock.calls.length).toBe(0);
138
- expect(br.flipBackToIndex.mock.calls.length).toBe(0);
139
- expect(br.jumpToIndex.mock.calls.length).toBe(0);
149
+ expect(br.trigger.callCount).toBe(0);
150
+ expect(br.flipBackToIndex.callCount).toBe(0);
151
+ expect(br.jumpToIndex.callCount).toBe(0);
140
152
  });
141
153
 
142
154
  describe('2up mode', () => {
@@ -144,9 +156,9 @@ describe('`BookReader.prototype.prev`', () => {
144
156
  br.firstIndex = 10;
145
157
  br.mode = br.constMode2up;
146
158
  br.prev();
147
- expect(br.jumpToIndex.mock.calls.length).toBe(0); // <-- does not get called
148
- expect(br.trigger.mock.calls.length).toBe(1);
149
- expect(br.flipBackToIndex.mock.calls.length).toBe(1);
159
+ expect(br.jumpToIndex.callCount).toBe(0); // <-- does not get called
160
+ expect(br.trigger.callCount).toBe(1);
161
+ expect(br.flipBackToIndex.callCount).toBe(1);
150
162
  });
151
163
  });
152
164
 
@@ -155,9 +167,9 @@ describe('`BookReader.prototype.prev`', () => {
155
167
  br.firstIndex = 100;
156
168
  br.mode = br.constMode1up;
157
169
  br.prev();
158
- expect(br.jumpToIndex.mock.calls.length).toBe(1); // <-- gets called
159
- expect(br.trigger.mock.calls.length).toBe(1); // <-- gets called by `jumpToIndex` internally
160
- expect(br.flipBackToIndex.mock.calls.length).toBe(1); // <-- gets called by `jumpToIndex` internally
170
+ expect(br.jumpToIndex.callCount).toBe(1); // <-- gets called
171
+ expect(br.trigger.callCount).toBe(1); // <-- gets called by `jumpToIndex` internally
172
+ expect(br.flipBackToIndex.callCount).toBe(1); // <-- gets called by `jumpToIndex` internally
161
173
  });
162
174
  });
163
175
  });
@@ -1,7 +1,7 @@
1
1
 
2
2
  import BookReader from '@/src/BookReader.js';
3
3
  import '@/src/plugins/plugin.resume.js';
4
- import '@/src/plugins/plugin.url.js';
4
+ import '@/src/plugins/url/plugin.url.js';
5
5
 
6
6
  let br;
7
7
  beforeAll(() => {
@@ -0,0 +1,175 @@
1
+ import { UrlPlugin } from '@/src/plugins/url/UrlPlugin';
2
+
3
+ afterEach(() => {
4
+ jest.clearAllMocks();
5
+ });
6
+
7
+ describe('UrlPlugin tests', () => {
8
+ const urlPlugin = new UrlPlugin();
9
+
10
+ describe('urlStateToUrlString tests', () => {
11
+ test('urlStateToUrlString with known states in schema', () => {
12
+ const urlState = { page: 'n7', mode: '1up', search: 'foo' };
13
+ const urlStateWithQueries = { page: 'n7', mode: '1up', q: 'hello', view: 'theater', sort: 'title_asc' };
14
+
15
+ const expectedUrlFromState = 'page/n7/mode/1up?q=foo';
16
+ const expectedUrlFromStateWithQueries = 'page/n7/mode/1up?q=hello&view=theater&sort=title_asc';
17
+
18
+ expect(urlPlugin.urlStateToUrlString(urlState)).toBe(expectedUrlFromState);
19
+ expect(urlPlugin.urlStateToUrlString(urlStateWithQueries)).toBe(expectedUrlFromStateWithQueries);
20
+ });
21
+
22
+ test('urlStateToUrlString with unknown states in schema', () => {
23
+ const urlState = { page: 'n7', mode: '1up' };
24
+ const urlStateWithQueries = { page: 'n7', mode: '1up', q: 'hello', viewer: 'theater', sortBy: 'title_asc' };
25
+
26
+ const expectedUrlFromState = 'page/n7/mode/1up';
27
+ const expectedUrlFromStateWithQueries = 'page/n7/mode/1up?q=hello&viewer=theater&sortBy=title_asc';
28
+
29
+ expect(urlPlugin.urlStateToUrlString(urlState)).toBe(expectedUrlFromState);
30
+ expect(urlPlugin.urlStateToUrlString(urlStateWithQueries)).toBe(expectedUrlFromStateWithQueries);
31
+ });
32
+
33
+ test('urlStateToUrlString with boolean value', () => {
34
+ const urlState = { page: 'n7', mode: '1up', search: 'foo', view: 'theater', wrapper: 'false' };
35
+ const expectedUrlFromState = 'page/n7/mode/1up?q=foo&view=theater&wrapper=false';
36
+
37
+ expect(urlPlugin.urlStateToUrlString(urlState)).toBe(expectedUrlFromState);
38
+ });
39
+ });
40
+
41
+ describe('urlStringToUrlState tests', () => {
42
+ test('urlStringToUrlState without query string', () => {
43
+ const url = '/page/n7/mode/2up';
44
+ const url1 = '/page/n7/mode/1up';
45
+
46
+ expect(urlPlugin.urlStringToUrlState(url)).toEqual({page: 'n7', mode: '2up'});
47
+ expect(urlPlugin.urlStringToUrlState(url1)).toEqual({page: 'n7', mode: '1up'});
48
+ });
49
+
50
+ test('urlStringToUrlState with deprecated_for', () => {
51
+ const url = '/page/n7/mode/2up/search/hello';
52
+
53
+ expect(urlPlugin.urlStringToUrlState(url)).toEqual({page: 'n7', mode: '2up', q: 'hello'});
54
+ });
55
+
56
+ test('urlStringToUrlState with query string', () => {
57
+ const url = '/page/n7/mode/2up/search/hello?view=theather&foo=bar&sort=title_asc';
58
+ const url1 = '/mode/2up?ref=ol&ui=embed&wrapper=false&view=theater';
59
+
60
+ expect(urlPlugin.urlStringToUrlState(url)).toEqual(
61
+ {page: 'n7', mode: '2up', q: 'hello', view: 'theather', foo: 'bar', sort: 'title_asc'}
62
+ );
63
+ expect(urlPlugin.urlStringToUrlState(url1)).toEqual(
64
+ {mode: '2up', ref: 'ol', ui: 'embed', wrapper: 'false', view: 'theater'}
65
+ );
66
+ });
67
+
68
+ test('urlStringToUrlState compare search and ?q', () => {
69
+ const url = '/page/n7/mode/2up/search/hello';
70
+ urlPlugin.urlState = { q: 'hello' };
71
+
72
+ expect(urlPlugin.urlStringToUrlState(url)).toEqual({page: 'n7', mode: '2up', q: 'hello'});
73
+ });
74
+ });
75
+
76
+ describe('url plugin helper functions', () => {
77
+ test('setUrlParam', () => {
78
+ urlPlugin.urlState = {};
79
+ urlPlugin.setUrlParam('page', '20');
80
+ urlPlugin.setUrlParam('mode', '2up');
81
+
82
+ expect(urlPlugin.urlState).toEqual({page: '20', mode: '2up'});
83
+ });
84
+
85
+ test('removeUrlParam', () => {
86
+ urlPlugin.setUrlParam('page', '20');
87
+ urlPlugin.setUrlParam('mode', '2up');
88
+ urlPlugin.removeUrlParam('mode');
89
+
90
+ expect(urlPlugin.urlState).toEqual({page: '20'});
91
+ });
92
+
93
+ test('getUrlParam', () => {
94
+ urlPlugin.setUrlParam('page', '20');
95
+ urlPlugin.setUrlParam('mode', '2up');
96
+ expect(urlPlugin.getUrlParam('page')).toEqual('20');
97
+ expect(urlPlugin.getUrlParam('mode')).toEqual('2up');
98
+ });
99
+ });
100
+
101
+ describe('pullFromAddressBar and pushToAddressBar - hash mode', () => {
102
+ test('url first load - empty state', () => {
103
+ urlPlugin.urlState = {};
104
+ urlPlugin.urlMode = 'hash';
105
+
106
+ urlPlugin.pullFromAddressBar({ pathname: '', search: '', hash: '#' });
107
+ expect(urlPlugin.urlState).toEqual({});
108
+
109
+ urlPlugin.pushToAddressBar();
110
+ expect(window.location.hash).toEqual('');
111
+ });
112
+
113
+ test('url without mode state value - use default', () => {
114
+ urlPlugin.urlState = {};
115
+ urlPlugin.urlMode = 'hash';
116
+
117
+ urlPlugin.pullFromAddressBar({ pathname: '', search: '', hash: '#page/12' });
118
+ expect(urlPlugin.urlState).toEqual({page: '12'});
119
+
120
+ urlPlugin.pushToAddressBar();
121
+ expect(window.location.hash).toEqual('#page/12');
122
+ });
123
+
124
+ test('url with query param', () => {
125
+ urlPlugin.urlState = {};
126
+ urlPlugin.urlMode = 'hash';
127
+
128
+ urlPlugin.pullFromAddressBar({ pathname: '', search: '', hash: '#page/12?q=hello&view=theater' });
129
+ expect(urlPlugin.urlState).toEqual({page: '12', q: 'hello', view: 'theater'});
130
+
131
+ urlPlugin.pushToAddressBar();
132
+ expect(window.location.hash).toEqual('#page/12?q=hello&view=theater');
133
+ });
134
+ });
135
+
136
+ describe('pullFromAddressBar and pushToAddressBar - history mode', () => {
137
+ test('url first load - empty state', () => {
138
+ urlPlugin.urlState = {};
139
+ urlPlugin.urlHistoryBasePath = '/details/foo';
140
+ urlPlugin.urlMode = 'history';
141
+
142
+ urlPlugin.pullFromAddressBar({ pathname: '', search: '', hash: '' });
143
+ expect(urlPlugin.urlState).toEqual({});
144
+
145
+ urlPlugin.pushToAddressBar();
146
+ expect(window.location.pathname).toEqual('/details/foo');
147
+ });
148
+
149
+ test('url without mode state value', () => {
150
+ urlPlugin.urlState = {};
151
+ urlPlugin.urlHistoryBasePath = '/details/foo/';
152
+ urlPlugin.urlMode = 'history';
153
+
154
+ urlPlugin.pullFromAddressBar({ pathname: '/details/foo/page/12', search: '', hash: '' });
155
+ expect(urlPlugin.urlState).toEqual({page: '12'});
156
+
157
+ urlPlugin.pushToAddressBar();
158
+ expect(window.location.pathname).toEqual('/details/foo/page/12');
159
+ });
160
+
161
+ test('url with query param', () => {
162
+ urlPlugin.urlState = {};
163
+ urlPlugin.urlHistoryBasePath = '/details/foo/';
164
+ urlPlugin.urlMode = 'history';
165
+
166
+ urlPlugin.pullFromAddressBar({ pathname: '/details/foo/page/12', search: '?q=hello&view=theater', hash: '' });
167
+ expect(urlPlugin.urlState).toEqual({page: '12', q: 'hello', view: 'theater'});
168
+
169
+ urlPlugin.pushToAddressBar();
170
+ const locationUrl = `${window.location.pathname}${window.location.search}`;
171
+ expect(locationUrl).toEqual('/details/foo/page/12?q=hello&view=theater');
172
+ });
173
+ });
174
+
175
+ });
@@ -1,6 +1,6 @@
1
-
2
1
  import BookReader from '@/src/BookReader.js';
3
- import '@/src/plugins/plugin.url.js';
2
+ import '@/src/plugins/url/plugin.url.js';
3
+ import sinon from 'sinon';
4
4
 
5
5
  let br;
6
6
  beforeAll(() => {
@@ -10,6 +10,7 @@ beforeAll(() => {
10
10
 
11
11
  afterEach(() => {
12
12
  jest.clearAllMocks();
13
+ sinon.restore();
13
14
  });
14
15
 
15
16
  describe('Plugin: URL controller', () => {