@internetarchive/bookreader 5.0.0-28 → 5.0.0-30-a

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 (233) 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/ia-bookreader-bundle.js +1458 -0
  6. package/BookReader/{bookreader-component-bundle.js.LICENSE.txt → ia-bookreader-bundle.js.LICENSE.txt} +12 -0
  7. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  8. package/BookReader/plugins/plugin.search.js +1 -1
  9. package/BookReader/plugins/plugin.search.js.map +1 -1
  10. package/BookReader/plugins/plugin.url.js +1 -1
  11. package/BookReader/plugins/plugin.url.js.map +1 -1
  12. package/BookReaderDemo/BookReaderDemo.css +14 -1
  13. package/BookReaderDemo/IADemoBr.js +107 -0
  14. package/BookReaderDemo/demo-internetarchive.html +64 -99
  15. package/CHANGELOG.md +4 -0
  16. package/package.json +9 -6
  17. package/src/BookNavigator/assets/ia-logo.js +17 -0
  18. package/src/BookNavigator/book-navigator.js +528 -0
  19. package/src/BookNavigator/bookmarks/bookmark-button.js +2 -1
  20. package/src/BookNavigator/bookmarks/bookmarks-provider.js +20 -8
  21. package/src/BookNavigator/bookmarks/ia-bookmarks.js +84 -51
  22. package/src/BookNavigator/downloads/downloads-provider.js +5 -9
  23. package/src/BookNavigator/downloads/downloads.js +1 -0
  24. package/src/BookNavigator/search/search-provider.js +15 -8
  25. package/src/BookNavigator/sharing.js +27 -0
  26. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +9 -8
  27. package/src/BookNavigator/volumes/volumes-provider.js +3 -4
  28. package/src/BookReader/options.js +6 -0
  29. package/src/BookReader.js +20 -8
  30. package/src/css/_BRComponent.scss +1 -1
  31. package/src/ia-bookreader/ia-bookreader.js +205 -0
  32. package/src/plugins/search/plugin.search.js +9 -9
  33. package/src/plugins/url/UrlPlugin.js +5 -6
  34. package/{src → stat}/BookNavigator/BookModel.js +0 -0
  35. package/{src → stat}/BookNavigator/BookNavigator.js +109 -102
  36. package/stat/BookNavigator/assets/bookmark-colors.js +15 -0
  37. package/stat/BookNavigator/assets/button-base.js +61 -0
  38. package/stat/BookNavigator/assets/ia-logo.js +17 -0
  39. package/stat/BookNavigator/assets/icon_checkmark.js +6 -0
  40. package/stat/BookNavigator/assets/icon_close.js +3 -0
  41. package/stat/BookNavigator/assets/icon_sort_asc.js +5 -0
  42. package/stat/BookNavigator/assets/icon_sort_desc.js +5 -0
  43. package/stat/BookNavigator/assets/icon_sort_neutral.js +5 -0
  44. package/stat/BookNavigator/assets/icon_volumes.js +11 -0
  45. package/stat/BookNavigator/bookmarks/bookmark-button.js +64 -0
  46. package/stat/BookNavigator/bookmarks/bookmark-edit.js +215 -0
  47. package/stat/BookNavigator/bookmarks/bookmarks-list.js +285 -0
  48. package/stat/BookNavigator/bookmarks/bookmarks-loginCTA.js +28 -0
  49. package/stat/BookNavigator/bookmarks/bookmarks-provider.js +56 -0
  50. package/stat/BookNavigator/bookmarks/ia-bookmarks.js +523 -0
  51. package/{src → stat}/BookNavigator/br-fullscreen-mgr.js +1 -2
  52. package/stat/BookNavigator/delete-modal-actions.js +49 -0
  53. package/stat/BookNavigator/downloads/downloads-provider.js +72 -0
  54. package/stat/BookNavigator/downloads/downloads.js +139 -0
  55. package/stat/BookNavigator/provider-config.js +0 -0
  56. package/stat/BookNavigator/search/a-search-result.js +55 -0
  57. package/stat/BookNavigator/search/search-provider.js +180 -0
  58. package/stat/BookNavigator/search/search-results.js +360 -0
  59. package/{src/ItemNavigator/providers → stat/BookNavigator}/sharing.js +3 -5
  60. package/stat/BookNavigator/visual-adjustments/visual-adjustments-provider.js +94 -0
  61. package/stat/BookNavigator/visual-adjustments/visual-adjustments.js +280 -0
  62. package/stat/BookNavigator/volumes/volumes-provider.js +83 -0
  63. package/stat/BookNavigator/volumes/volumes.js +178 -0
  64. package/stat/BookReader/BookModel.js +518 -0
  65. package/stat/BookReader/DebugConsole.js +54 -0
  66. package/stat/BookReader/DragScrollable.js +233 -0
  67. package/stat/BookReader/ImageCache.js +116 -0
  68. package/stat/BookReader/Mode1Up.js +102 -0
  69. package/stat/BookReader/Mode1UpLit.js +434 -0
  70. package/stat/BookReader/Mode2Up.js +1372 -0
  71. package/stat/BookReader/ModeSmoothZoom.js +177 -0
  72. package/stat/BookReader/ModeThumb.js +344 -0
  73. package/stat/BookReader/Navbar/Navbar.js +310 -0
  74. package/stat/BookReader/PageContainer.js +120 -0
  75. package/stat/BookReader/ReduceSet.js +26 -0
  76. package/stat/BookReader/Toolbar/Toolbar.js +384 -0
  77. package/stat/BookReader/events.js +20 -0
  78. package/stat/BookReader/options.js +324 -0
  79. package/stat/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  80. package/stat/BookReader/utils/classes.js +36 -0
  81. package/stat/BookReader/utils.js +240 -0
  82. package/stat/BookReader.js +2550 -0
  83. package/{src → stat}/BookReaderComponent/BookReaderComponent.js +15 -10
  84. package/stat/assets/icons/1up.svg +12 -0
  85. package/stat/assets/icons/2up.svg +15 -0
  86. package/stat/assets/icons/advance.svg +26 -0
  87. package/stat/assets/icons/chevron-right.svg +1 -0
  88. package/stat/assets/icons/close-circle-dark.svg +1 -0
  89. package/stat/assets/icons/close-circle.svg +1 -0
  90. package/stat/assets/icons/fullscreen.svg +17 -0
  91. package/stat/assets/icons/fullscreen_exit.svg +17 -0
  92. package/stat/assets/icons/hamburger.svg +15 -0
  93. package/stat/assets/icons/left-arrow.svg +12 -0
  94. package/stat/assets/icons/magnify-minus.svg +16 -0
  95. package/stat/assets/icons/magnify-plus.svg +17 -0
  96. package/stat/assets/icons/magnify.svg +15 -0
  97. package/stat/assets/icons/pause.svg +23 -0
  98. package/stat/assets/icons/play.svg +22 -0
  99. package/stat/assets/icons/playback-speed.svg +34 -0
  100. package/stat/assets/icons/read-aloud.svg +22 -0
  101. package/stat/assets/icons/review.svg +22 -0
  102. package/stat/assets/icons/thumbnails.svg +17 -0
  103. package/stat/assets/icons/voice.svg +1 -0
  104. package/stat/assets/icons/volume-full.svg +22 -0
  105. package/stat/assets/images/BRicons.png +0 -0
  106. package/stat/assets/images/BRicons.svg +94 -0
  107. package/stat/assets/images/BRicons_ia.png +0 -0
  108. package/stat/assets/images/back_pages.png +0 -0
  109. package/stat/assets/images/book_bottom_icon.png +0 -0
  110. package/stat/assets/images/book_down_icon.png +0 -0
  111. package/stat/assets/images/book_left_icon.png +0 -0
  112. package/stat/assets/images/book_leftmost_icon.png +0 -0
  113. package/stat/assets/images/book_right_icon.png +0 -0
  114. package/stat/assets/images/book_rightmost_icon.png +0 -0
  115. package/stat/assets/images/book_top_icon.png +0 -0
  116. package/stat/assets/images/book_up_icon.png +0 -0
  117. package/stat/assets/images/books_graphic.svg +177 -0
  118. package/stat/assets/images/booksplit.png +0 -0
  119. package/stat/assets/images/control_pause_icon.png +0 -0
  120. package/stat/assets/images/control_play_icon.png +0 -0
  121. package/stat/assets/images/embed_icon.png +0 -0
  122. package/stat/assets/images/icon-home-ia.png +0 -0
  123. package/stat/assets/images/icon_OL-logo-xs.png +0 -0
  124. package/stat/assets/images/icon_alert-xs.png +0 -0
  125. package/stat/assets/images/icon_book.svg +12 -0
  126. package/stat/assets/images/icon_bookmark.svg +12 -0
  127. package/stat/assets/images/icon_close-pop.png +0 -0
  128. package/stat/assets/images/icon_download.png +0 -0
  129. package/stat/assets/images/icon_gear.svg +14 -0
  130. package/stat/assets/images/icon_hamburger.svg +20 -0
  131. package/stat/assets/images/icon_home.png +0 -0
  132. package/stat/assets/images/icon_home.svg +21 -0
  133. package/stat/assets/images/icon_home_ia.png +0 -0
  134. package/stat/assets/images/icon_indicator.png +0 -0
  135. package/stat/assets/images/icon_info.svg +11 -0
  136. package/stat/assets/images/icon_one_page.svg +8 -0
  137. package/stat/assets/images/icon_pause.svg +1 -0
  138. package/stat/assets/images/icon_play.svg +1 -0
  139. package/stat/assets/images/icon_playback-rate.svg +15 -0
  140. package/stat/assets/images/icon_return.png +0 -0
  141. package/stat/assets/images/icon_search_button.svg +8 -0
  142. package/stat/assets/images/icon_share.svg +9 -0
  143. package/stat/assets/images/icon_skip-ahead.svg +6 -0
  144. package/stat/assets/images/icon_skip-back.svg +13 -0
  145. package/stat/assets/images/icon_speaker.svg +18 -0
  146. package/stat/assets/images/icon_speaker_open.svg +10 -0
  147. package/stat/assets/images/icon_thumbnails.svg +12 -0
  148. package/stat/assets/images/icon_toc.svg +5 -0
  149. package/stat/assets/images/icon_two_pages.svg +9 -0
  150. package/stat/assets/images/icon_zoomer.png +0 -0
  151. package/stat/assets/images/loading.gif +0 -0
  152. package/stat/assets/images/logo_icon.png +0 -0
  153. package/stat/assets/images/marker_chap-off.png +0 -0
  154. package/stat/assets/images/marker_chap-off.svg +11 -0
  155. package/stat/assets/images/marker_chap-off_ia.png +0 -0
  156. package/stat/assets/images/marker_chap-on.png +0 -0
  157. package/stat/assets/images/marker_chap-on.svg +11 -0
  158. package/stat/assets/images/marker_srch-on.svg +11 -0
  159. package/stat/assets/images/marker_srchchap-off.png +0 -0
  160. package/stat/assets/images/marker_srchchap-on.png +0 -0
  161. package/stat/assets/images/nav_control-dn.png +0 -0
  162. package/stat/assets/images/nav_control-dn_ia.png +0 -0
  163. package/stat/assets/images/nav_control-up.png +0 -0
  164. package/stat/assets/images/nav_control-up_ia.png +0 -0
  165. package/stat/assets/images/nav_control.png +0 -0
  166. package/stat/assets/images/one_page_mode_icon.png +0 -0
  167. package/stat/assets/images/paper-badge.png +0 -0
  168. package/stat/assets/images/print_icon.png +0 -0
  169. package/stat/assets/images/progressbar.gif +0 -0
  170. package/stat/assets/images/right_edges.png +0 -0
  171. package/stat/assets/images/slider.png +0 -0
  172. package/stat/assets/images/slider_ia.png +0 -0
  173. package/stat/assets/images/thumbnail_mode_icon.png +0 -0
  174. package/stat/assets/images/transparent.png +0 -0
  175. package/stat/assets/images/two_page_mode_icon.png +0 -0
  176. package/stat/assets/images/zoom_in_icon.png +0 -0
  177. package/stat/assets/images/zoom_out_icon.png +0 -0
  178. package/stat/css/BookReader.scss +89 -0
  179. package/stat/css/_BRBookmarks.scss +29 -0
  180. package/stat/css/_BRComponent.scss +13 -0
  181. package/stat/css/_BRfloat.scss +197 -0
  182. package/stat/css/_BRicon.scss +48 -0
  183. package/stat/css/_BRmain.scss +251 -0
  184. package/stat/css/_BRnav.scss +359 -0
  185. package/stat/css/_BRpages.scss +139 -0
  186. package/stat/css/_BRsearch.scss +226 -0
  187. package/stat/css/_BRtoolbar.scss +84 -0
  188. package/stat/css/_BRvendor.scss +5 -0
  189. package/stat/css/_MobileNav.scss +194 -0
  190. package/stat/css/_TextSelection.scss +32 -0
  191. package/stat/css/_colorbox.scss +52 -0
  192. package/stat/css/_controls.scss +253 -0
  193. package/stat/css/_icons.scss +121 -0
  194. package/stat/jquery-wrapper.js +4 -0
  195. package/stat/plugins/plugin.archive_analytics.js +86 -0
  196. package/stat/plugins/plugin.autoplay.js +129 -0
  197. package/stat/plugins/plugin.chapters.js +248 -0
  198. package/stat/plugins/plugin.iframe.js +48 -0
  199. package/stat/plugins/plugin.mobile_nav.js +288 -0
  200. package/stat/plugins/plugin.resume.js +68 -0
  201. package/stat/plugins/plugin.text_selection.js +291 -0
  202. package/stat/plugins/plugin.url.js +198 -0
  203. package/stat/plugins/plugin.vendor-fullscreen.js +247 -0
  204. package/stat/plugins/search/plugin.search.js +439 -0
  205. package/stat/plugins/search/view.js +439 -0
  206. package/stat/plugins/tts/AbstractTTSEngine.js +249 -0
  207. package/stat/plugins/tts/FestivalTTSEngine.js +169 -0
  208. package/stat/plugins/tts/PageChunk.js +107 -0
  209. package/stat/plugins/tts/PageChunkIterator.js +163 -0
  210. package/stat/plugins/tts/WebTTSEngine.js +357 -0
  211. package/stat/plugins/tts/plugin.tts.js +357 -0
  212. package/stat/plugins/tts/tooltip_dict.js +15 -0
  213. package/stat/plugins/tts/utils.js +91 -0
  214. package/stat/util/browserSniffing.js +30 -0
  215. package/stat/util/debouncer.js +26 -0
  216. package/stat/util/docCookies.js +67 -0
  217. package/stat/util/strings.js +34 -0
  218. package/tests/e2e/viewmode.test.js +30 -30
  219. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +64 -52
  220. package/tests/jest/plugins/url/UrlPlugin.test.js +33 -10
  221. package/tests/karma/BookNavigator/book-navigator.test.js +413 -108
  222. package/tests/karma/BookNavigator/bookmarks/bookmark-button.test.js +44 -0
  223. package/tests/karma/BookNavigator/downloads/downloads-provider.test.js +6 -3
  224. package/tests/karma/BookNavigator/search/search-provider.test.js +106 -6
  225. package/tests/karma/BookNavigator/search/search-results.test.js +0 -2
  226. package/tests/karma/BookNavigator/sharing/sharing-provider.test.js +29 -20
  227. package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +41 -17
  228. package/webpack.config.js +1 -1
  229. package/.nvmrc +0 -1
  230. package/BookReader/bookreader-component-bundle.js +0 -1436
  231. package/BookReader/bookreader-component-bundle.js.map +0 -1
  232. package/src/BookNavigator/assets/book-loader.js +0 -27
  233. 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
  });
@@ -61,7 +61,7 @@ describe('UrlPlugin tests', () => {
61
61
  {page: 'n7', mode: '2up', q: 'hello', view: 'theather', foo: 'bar', sort: 'title_asc'}
62
62
  );
63
63
  expect(urlPlugin.urlStringToUrlState(url1)).toEqual(
64
- {page: 'n0', mode: '2up', ref: 'ol', ui: 'embed', wrapper: 'false', view: 'theater'}
64
+ {mode: '2up', ref: 'ol', ui: 'embed', wrapper: 'false', view: 'theater'}
65
65
  );
66
66
  });
67
67
 
@@ -99,15 +99,26 @@ describe('UrlPlugin tests', () => {
99
99
  });
100
100
 
101
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
+
102
113
  test('url without mode state value - use default', () => {
103
114
  urlPlugin.urlState = {};
104
115
  urlPlugin.urlMode = 'hash';
105
116
 
106
117
  urlPlugin.pullFromAddressBar({ pathname: '', search: '', hash: '#page/12' });
107
- expect(urlPlugin.urlState).toEqual({page: '12', mode: '2up'});
118
+ expect(urlPlugin.urlState).toEqual({page: '12'});
108
119
 
109
120
  urlPlugin.pushToAddressBar();
110
- expect(window.location.hash).toEqual('#page/12/mode/2up');
121
+ expect(window.location.hash).toEqual('#page/12');
111
122
  });
112
123
 
113
124
  test('url with query param', () => {
@@ -115,24 +126,36 @@ describe('UrlPlugin tests', () => {
115
126
  urlPlugin.urlMode = 'hash';
116
127
 
117
128
  urlPlugin.pullFromAddressBar({ pathname: '', search: '', hash: '#page/12?q=hello&view=theater' });
118
- expect(urlPlugin.urlState).toEqual({page: '12', mode: '2up', q: 'hello', view: 'theater'});
129
+ expect(urlPlugin.urlState).toEqual({page: '12', q: 'hello', view: 'theater'});
119
130
 
120
131
  urlPlugin.pushToAddressBar();
121
- expect(window.location.hash).toEqual('#page/12/mode/2up?q=hello&view=theater');
132
+ expect(window.location.hash).toEqual('#page/12?q=hello&view=theater');
122
133
  });
123
134
  });
124
135
 
125
136
  describe('pullFromAddressBar and pushToAddressBar - history mode', () => {
126
- test('url without mode state value - use default', () => {
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', () => {
127
150
  urlPlugin.urlState = {};
128
151
  urlPlugin.urlHistoryBasePath = '/details/foo/';
129
152
  urlPlugin.urlMode = 'history';
130
153
 
131
154
  urlPlugin.pullFromAddressBar({ pathname: '/details/foo/page/12', search: '', hash: '' });
132
- expect(urlPlugin.urlState).toEqual({page: '12', mode: '2up'});
155
+ expect(urlPlugin.urlState).toEqual({page: '12'});
133
156
 
134
157
  urlPlugin.pushToAddressBar();
135
- expect(window.location.pathname).toEqual('/details/foo/page/12/mode/2up');
158
+ expect(window.location.pathname).toEqual('/details/foo/page/12');
136
159
  });
137
160
 
138
161
  test('url with query param', () => {
@@ -141,11 +164,11 @@ describe('UrlPlugin tests', () => {
141
164
  urlPlugin.urlMode = 'history';
142
165
 
143
166
  urlPlugin.pullFromAddressBar({ pathname: '/details/foo/page/12', search: '?q=hello&view=theater', hash: '' });
144
- expect(urlPlugin.urlState).toEqual({page: '12', mode: '2up', q: 'hello', view: 'theater'});
167
+ expect(urlPlugin.urlState).toEqual({page: '12', q: 'hello', view: 'theater'});
145
168
 
146
169
  urlPlugin.pushToAddressBar();
147
170
  const locationUrl = `${window.location.pathname}${window.location.search}`;
148
- expect(locationUrl).toEqual('/details/foo/page/12/mode/2up?q=hello&view=theater');
171
+ expect(locationUrl).toEqual('/details/foo/page/12?q=hello&view=theater');
149
172
  });
150
173
  });
151
174