@internetarchive/bookreader 5.0.0-94 → 5.0.0-96

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 (167) hide show
  1. package/BookReader/BookReader.js +1 -1
  2. package/BookReader/hypothesis/LICENSE +50 -0
  3. package/BookReader/hypothesis/README.md +55 -0
  4. package/BookReader/hypothesis/build/boot.js +1 -0
  5. package/BookReader/hypothesis/build/manifest.json +20 -0
  6. package/BookReader/hypothesis/build/scripts/annotator.bundle.js +184 -0
  7. package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
  8. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +798 -0
  9. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
  10. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +711 -0
  11. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
  12. package/BookReader/hypothesis/build/styles/annotator.css +2235 -0
  13. package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
  14. package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  15. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  16. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  17. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  18. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  19. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
  20. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  21. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
  22. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
  23. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  24. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
  25. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  26. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  27. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  28. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
  29. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  30. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  31. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  32. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  33. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  34. package/BookReader/hypothesis/build/styles/highlights.css +2 -0
  35. package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
  36. package/BookReader/hypothesis/build/styles/katex.min.css +2 -0
  37. package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
  38. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +2 -0
  39. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
  40. package/BookReader/hypothesis/build/styles/sidebar.css +2731 -0
  41. package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
  42. package/BookReader/hypothesis/build/styles/ui-playground.css +2659 -0
  43. package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
  44. package/BookReader/hypothesis/package.json +126 -0
  45. package/README.md +0 -2
  46. package/package.json +6 -1
  47. package/.eslintrc.cjs +0 -51
  48. package/.gitattributes +0 -2
  49. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  50. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  51. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  52. package/.github/workflows/node.js.yml +0 -102
  53. package/.github/workflows/npm-publish.yml +0 -33
  54. package/.testcaferc.cjs +0 -10
  55. package/BookReaderDemo/BookReaderDemo.css +0 -40
  56. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -112
  57. package/BookReaderDemo/BookReaderJSSimple.js +0 -56
  58. package/BookReaderDemo/IADemoBr.js +0 -149
  59. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  60. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  61. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  62. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  63. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  64. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  65. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  66. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  67. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  68. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  69. package/BookReaderDemo/demo-advanced.html +0 -33
  70. package/BookReaderDemo/demo-embed-iframe-src.html +0 -85
  71. package/BookReaderDemo/demo-embed.html +0 -26
  72. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -34
  73. package/BookReaderDemo/demo-fullscreen.html +0 -31
  74. package/BookReaderDemo/demo-iiif.html +0 -121
  75. package/BookReaderDemo/demo-internetarchive.html +0 -271
  76. package/BookReaderDemo/demo-multiple.html +0 -44
  77. package/BookReaderDemo/demo-preview-pages.html +0 -1093
  78. package/BookReaderDemo/demo-simple.html +0 -35
  79. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -34
  80. package/BookReaderDemo/ia-multiple-volumes-manifest.js +0 -169
  81. package/BookReaderDemo/immersion-1up.html +0 -64
  82. package/BookReaderDemo/immersion-mode.html +0 -33
  83. package/BookReaderDemo/toggle_controls.html +0 -54
  84. package/BookReaderDemo/view_mode.html +0 -40
  85. package/BookReaderDemo/viewmode-cycle.html +0 -40
  86. package/CHANGELOG.md +0 -1080
  87. package/CONTRIBUTING.md +0 -7
  88. package/babel.config.cjs +0 -20
  89. package/codecov.yml +0 -23
  90. package/index.html +0 -34
  91. package/netlify.toml +0 -9
  92. package/renovate.json +0 -52
  93. package/screenshot.png +0 -0
  94. package/scripts/postversion.js +0 -11
  95. package/scripts/preversion.js +0 -15
  96. package/scripts/version.js +0 -27
  97. package/tests/e2e/README.md +0 -112
  98. package/tests/e2e/autoplay.test.js +0 -16
  99. package/tests/e2e/base.test.js +0 -27
  100. package/tests/e2e/helpers/base.js +0 -263
  101. package/tests/e2e/helpers/debug.js +0 -13
  102. package/tests/e2e/helpers/mockSearch.js +0 -90
  103. package/tests/e2e/helpers/params.js +0 -17
  104. package/tests/e2e/helpers/rightToLeft.js +0 -23
  105. package/tests/e2e/helpers/search.js +0 -73
  106. package/tests/e2e/models/BookReader.js +0 -11
  107. package/tests/e2e/models/Navigation.js +0 -39
  108. package/tests/e2e/rightToLeft.test.js +0 -19
  109. package/tests/e2e/viewmode.test.js +0 -44
  110. package/tests/jest/BookNavigator/book-navigator.test.js +0 -653
  111. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +0 -43
  112. package/tests/jest/BookNavigator/bookmarks/bookmark-edit.test.js +0 -132
  113. package/tests/jest/BookNavigator/bookmarks/bookmarks-list.test.js +0 -221
  114. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +0 -45
  115. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +0 -67
  116. package/tests/jest/BookNavigator/downloads/downloads.test.js +0 -53
  117. package/tests/jest/BookNavigator/search/search-provider.test.js +0 -179
  118. package/tests/jest/BookNavigator/search/search-results.test.js +0 -289
  119. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +0 -49
  120. package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +0 -80
  121. package/tests/jest/BookNavigator/visual-adjustments.test.js +0 -200
  122. package/tests/jest/BookReader/BookModel.test.js +0 -372
  123. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +0 -263
  124. package/tests/jest/BookReader/ImageCache.test.js +0 -150
  125. package/tests/jest/BookReader/Mode1UpLit.test.js +0 -73
  126. package/tests/jest/BookReader/Mode2Up.test.js +0 -98
  127. package/tests/jest/BookReader/Mode2UpLit.test.js +0 -190
  128. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +0 -16
  129. package/tests/jest/BookReader/ModeSmoothZoom.test.js +0 -218
  130. package/tests/jest/BookReader/ModeThumb.test.js +0 -71
  131. package/tests/jest/BookReader/Navbar/Navbar.test.js +0 -182
  132. package/tests/jest/BookReader/PageContainer.test.js +0 -249
  133. package/tests/jest/BookReader/ReduceSet.test.js +0 -38
  134. package/tests/jest/BookReader/Toolbar/Toolbar.test.js +0 -26
  135. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +0 -59
  136. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +0 -49
  137. package/tests/jest/BookReader/utils/SelectionObserver.test.js +0 -57
  138. package/tests/jest/BookReader/utils/classes.test.js +0 -88
  139. package/tests/jest/BookReader/utils.test.js +0 -250
  140. package/tests/jest/BookReader.keyboard.test.js +0 -190
  141. package/tests/jest/BookReader.options.test.js +0 -47
  142. package/tests/jest/BookReader.test.js +0 -316
  143. package/tests/jest/plugins/plugin.archive_analytics.test.js +0 -20
  144. package/tests/jest/plugins/plugin.autoplay.test.js +0 -35
  145. package/tests/jest/plugins/plugin.chapters.test.js +0 -193
  146. package/tests/jest/plugins/plugin.iframe.test.js +0 -42
  147. package/tests/jest/plugins/plugin.resume.test.js +0 -85
  148. package/tests/jest/plugins/plugin.text_selection.test.js +0 -447
  149. package/tests/jest/plugins/plugin.vendor-fullscreen.test.js +0 -65
  150. package/tests/jest/plugins/search/plugin.search.test.js +0 -120
  151. package/tests/jest/plugins/search/plugin.search.view.test.js +0 -131
  152. package/tests/jest/plugins/search/utils.js +0 -25
  153. package/tests/jest/plugins/search/utils.test.js +0 -29
  154. package/tests/jest/plugins/tts/AbstractTTSEngine.test.js +0 -173
  155. package/tests/jest/plugins/tts/FestivalTTSEngine.test.js +0 -59
  156. package/tests/jest/plugins/tts/PageChunk.test.js +0 -57
  157. package/tests/jest/plugins/tts/PageChunkIterator.test.js +0 -179
  158. package/tests/jest/plugins/tts/WebTTSEngine.test.js +0 -178
  159. package/tests/jest/plugins/tts/utils.test.js +0 -74
  160. package/tests/jest/plugins/url/UrlPlugin.test.js +0 -198
  161. package/tests/jest/plugins/url/plugin.url.test.js +0 -168
  162. package/tests/jest/setup.js +0 -3
  163. package/tests/jest/util/browserSniffing.test.js +0 -62
  164. package/tests/jest/util/docCookies.test.js +0 -24
  165. package/tests/jest/util/strings.test.js +0 -63
  166. package/tests/jest/utils.js +0 -83
  167. package/webpack.config.js +0 -97
@@ -1,372 +0,0 @@
1
- import sinon from 'sinon';
2
- import { deepCopy } from '../utils.js';
3
- import { BookModel } from '@/src/BookReader/BookModel.js';
4
- import { NAMED_REDUCE_SETS } from '@/src/BookReader/ReduceSet.js';
5
- /** @typedef {import('@/src/BookReader/options.js').BookReaderOptions} BookReaderOptions */
6
-
7
- afterEach(() => {
8
- sinon.restore();
9
- });
10
-
11
- /** @type {BookReaderOptions['data']} */
12
- const SAMPLE_DATA = [
13
- [
14
- { width: 123, height: 123, uri: 'https://archive.org/image0.jpg', pageNum: '1' },
15
- ],
16
- [
17
- { width: 123, height: 123, uri: 'https://archive.org/image1.jpg', pageNum: '2' },
18
- { width: 123, height: 123, uri: 'https://archive.org/image2.jpg', pageNum: '3' },
19
- ],
20
- [
21
- { width: 123, height: 123, uri: 'https://archive.org/image3.jpg', pageNum: '4' },
22
- ],
23
- ];
24
-
25
- describe('getMedianPageSizeInches', () => {
26
- test('handles single page data', () => {
27
- const bm = new BookModel({ data: SAMPLE_DATA.slice(0, 1), options: {ppi: 10} });
28
- expect(bm.getMedianPageSizeInches()).toEqual({ width: 12.3, height: 12.3 });
29
- });
30
-
31
- test('handles odd pages data', () => {
32
- const sizes = [
33
- {width: 300, height: 2200},
34
- {width: 200, height: 2100},
35
- {width: 100, height: 2300},
36
- ];
37
- const data = deepCopy(SAMPLE_DATA);
38
- delete data[2];
39
- Object.assign(data[0][0], sizes[0]);
40
- Object.assign(data[1][0], sizes[1]);
41
- Object.assign(data[1][1], sizes[2]);
42
- const bm = new BookModel({ data, options: {ppi: 10} });
43
- expect(bm.getMedianPageSizeInches()).toEqual({ width: 20, height: 220 });
44
- });
45
-
46
-
47
- test('handles even pages data', () => {
48
- const sizes = [
49
- {width: 300, height: 2200},
50
- {width: 200, height: 2100},
51
- {width: 100, height: 2300},
52
- {width: 400, height: 2400},
53
- ];
54
- const data = deepCopy(SAMPLE_DATA);
55
- Object.assign(data[0][0], sizes[0]);
56
- Object.assign(data[1][0], sizes[1]);
57
- Object.assign(data[1][1], sizes[2]);
58
- Object.assign(data[2][0], sizes[3]);
59
- const bm = new BookModel({ data, options: {ppi: 10} });
60
- expect(bm.getMedianPageSizeInches()).toEqual({ width: 30, height: 230 });
61
- });
62
-
63
- test('does not lexicographic sort for median', () => {
64
- const sizes = [
65
- {width: 100, height: 100},
66
- {width: 20, height: 20},
67
- {width: 30, height: 30},
68
- ];
69
- const data = deepCopy(SAMPLE_DATA);
70
- delete data[2];
71
- Object.assign(data[0][0], sizes[0]);
72
- Object.assign(data[1][0], sizes[1]);
73
- Object.assign(data[1][1], sizes[2]);
74
- const bm = new BookModel({ data, options: {ppi: 10} });
75
- expect(bm.getMedianPageSizeInches()).toEqual({ width: 3, height: 3 });
76
- });
77
-
78
- test('caches result', () => {
79
- const bm = new BookModel({ data: SAMPLE_DATA });
80
- const firstResult = bm.getMedianPageSizeInches();
81
- expect(bm.getMedianPageSizeInches()).toBe(firstResult);
82
- expect(bm.getMedianPageSizeInches()).toBe(firstResult);
83
- expect(bm.getMedianPageSizeInches()).toBe(firstResult);
84
- });
85
- });
86
-
87
- describe('getPageIndices', () => {
88
- test('handles unique indices', () => {
89
- const bm = new BookModel({ data: SAMPLE_DATA });
90
- expect(bm.getPageIndices('1')).toEqual([0]);
91
- });
92
-
93
- test('handles invalid indices', () => {
94
- const bm = new BookModel({ data: SAMPLE_DATA });
95
- expect(bm.getPageIndices('foo')).toEqual([]);
96
- expect(bm.getPageIndices('123')).toEqual([]);
97
- });
98
-
99
- test('handles non-unique indices', () => {
100
- const data = deepCopy(SAMPLE_DATA);
101
- data[0][0].pageNum = '2';
102
- const bm = new BookModel({ data });
103
- expect(bm.getPageIndices('2')).toEqual([0, 1]);
104
- });
105
-
106
- test('handles n-prefixed pages', () => {
107
- const data = deepCopy(SAMPLE_DATA);
108
- data[0][0].pageNum = 'n0';
109
- const bm = new BookModel({ data });
110
- expect(bm.getPageIndices('n0')).toEqual([0]);
111
- });
112
- });
113
-
114
- test('getPageName', () => {
115
- const bm = new BookModel({ data: SAMPLE_DATA });
116
- expect(bm.getPageName(0)).toEqual('Page 1');
117
- expect(bm.getPageName(1)).toEqual('Page 2');
118
- });
119
-
120
- describe('numLeafs', () => {
121
- test('reads from data', () => {
122
- const bm = new BookModel({ data: SAMPLE_DATA });
123
- expect(bm.getNumLeafs()).toBe(4);
124
- });
125
-
126
- test('numLeafs can be overriden', () => {
127
- const bm = new BookModel({ data: SAMPLE_DATA, numLeafs: 12 });
128
- expect(bm.getNumLeafs()).toBe(12);
129
- });
130
- });
131
-
132
- test('getPageNum', () => {
133
- const bm = new BookModel({ data: SAMPLE_DATA });
134
- expect(bm.getPageNum(0)).toBe('1');
135
- });
136
-
137
- test('getPageProp gets values from correct document', () => {
138
- const bm = new BookModel({ data: SAMPLE_DATA });
139
- expect(bm.getPageProp(1, 'uri')).toBe(SAMPLE_DATA[1][0].uri);
140
- });
141
-
142
- describe('getSpreadIndices', () => {
143
- test('Works for left to right text', () => {
144
- const bm = new BookModel({ data: SAMPLE_DATA, pageProgression: 'lr' });
145
- expect(bm.getSpreadIndices(1)).toEqual([1, 2]);
146
- expect(bm.getSpreadIndices(2)).toEqual([1, 2]);
147
- });
148
- });
149
-
150
- describe('leafNumToIndex', () => {
151
- test('returns input if no leafNum in data', () => {
152
- const bm = new BookModel({ data: SAMPLE_DATA });
153
- expect(bm.leafNumToIndex(1)).toBe(1);
154
- expect(bm.leafNumToIndex(2)).toBe(2);
155
- expect(bm.leafNumToIndex(3)).toBe(3);
156
- });
157
-
158
- test('returns true index when leafNum does not point to index', () => {
159
- const data = deepCopy(SAMPLE_DATA);
160
- for (const spread of data) {
161
- for (const page of spread) {
162
- page.leafNum = parseFloat(page.pageNum) + 2;
163
- }
164
- }
165
-
166
- const bm = new BookModel({ data });
167
- expect(bm.leafNumToIndex(3)).toBe(0);
168
- });
169
- });
170
-
171
- describe('parsePageString', () => {
172
- test('handles leaf-prefixed PageString', () => {
173
- const data = deepCopy(SAMPLE_DATA);
174
- for (const spread of data) {
175
- for (const page of spread) {
176
- page.leafNum = parseFloat(page.pageNum) + 2;
177
- }
178
- }
179
-
180
- const bm = new BookModel({ data });
181
- expect(bm.parsePageString('leaf3')).toBe(0);
182
- });
183
- });
184
-
185
- describe('pagesIterator', () => {
186
- test('Goes through all pages', () => {
187
- const bm = new BookModel({ data: SAMPLE_DATA });
188
- let i = 0;
189
- for (const page of bm.pagesIterator()) {
190
- expect(page.index).toBe(i++);
191
- }
192
- });
193
-
194
- test('Can combine unviewables', () => {
195
- const data = deepCopy(SAMPLE_DATA);
196
- // add some more pages
197
- data.splice(2, 0, deepCopy(data[0]));
198
- data[1].forEach(page => page.viewable = false);
199
- const bm = new BookModel({ data });
200
- for (const page of bm.pagesIterator({combineConsecutiveUnviewables: true})) {
201
- expect(page.isConsecutiveUnviewable).toBe(false);
202
- }
203
- });
204
- });
205
-
206
- describe('_getDataFlattened', () => {
207
- test('Assigns correct page sides', () => {
208
- const bm = new BookModel({ data: SAMPLE_DATA });
209
- expect(bm._getDataFlattened().map(page => page.pageSide)).toEqual(['R', 'L', 'R', 'L']);
210
- });
211
-
212
- test('Memoized based on data length', () => {
213
- const data = deepCopy(SAMPLE_DATA);
214
- const bm = new BookModel({ data });
215
- const firstResult = bm._getDataFlattened();
216
- expect(bm._getDataFlattened()).toBe(firstResult);
217
- expect(bm._getDataFlattened()).toBe(firstResult);
218
- bm.br.data = data.slice(0, 1);
219
- expect(bm._getDataFlattened()).not.toBe(firstResult);
220
- });
221
-
222
- test('Assigns unviewablesStart', () => {
223
- const data = deepCopy(SAMPLE_DATA);
224
- data.slice(1, -1)
225
- .forEach(spread => spread.forEach(page => {
226
- page.viewable = false;
227
- }));
228
- const bm = new BookModel({ data });
229
- const pages = bm._getDataFlattened();
230
- expect(pages[0].unviewablesStart).toBeUndefined();
231
- expect(pages[1].unviewablesStart).toBe(1);
232
- expect(pages[2].unviewablesStart).toBe(1);
233
- expect(pages[3].unviewablesStart).toBeUndefined();
234
- });
235
- });
236
-
237
- describe('getPage', () => {
238
- test('loops around by default', () => {
239
- const bm = new BookModel({ data: SAMPLE_DATA });
240
- expect(bm.getPage(-1).index).toBe(3);
241
- expect(bm.getPage(-2).index).toBe(2);
242
- expect(bm.getPage(-3).index).toBe(1);
243
- expect(bm.getPage(4).index).toBe(0);
244
- expect(bm.getPage(5).index).toBe(1);
245
- });
246
-
247
- test('does not loop if loop=false', () => {
248
- const bm = new BookModel({ data: SAMPLE_DATA });
249
- expect(bm.getPage(-1, false)).toBeUndefined();
250
- expect(bm.getPage(-2, false)).toBeUndefined();
251
- expect(bm.getPage(4, false)).toBeUndefined();
252
- expect(bm.getPage(5, false)).toBeUndefined();
253
- });
254
- });
255
-
256
- describe('PageModel', () => {
257
- test('constructor copies fields from book model', () => {
258
- const bm = new BookModel({ data: SAMPLE_DATA });
259
- const spy = sinon.spy(bm, 'getPageWidth');
260
- const page = bm.getPage(0);
261
- expect(spy.callCount).toBe(1);
262
- expect(page.width).toBe(SAMPLE_DATA[0][0].width);
263
- });
264
-
265
- test('prev at start of book returns null', () => {
266
- const bm = new BookModel({ data: SAMPLE_DATA });
267
- expect(bm.getPage(0).prev).toBeUndefined();
268
- });
269
-
270
- test('prev to return previous', () => {
271
- const bm = new BookModel({ data: SAMPLE_DATA });
272
- expect(bm.getPage(1).prev.index).toBe(0);
273
- expect(bm.getPage(3).prev.prev.index).toBe(1);
274
- });
275
-
276
- test('next at end of book returns null', () => {
277
- const bm = new BookModel({ data: SAMPLE_DATA });
278
- expect(bm.getPage(-1).next).toBeUndefined();
279
- });
280
-
281
- test('next to return next page', () => {
282
- const bm = new BookModel({ data: SAMPLE_DATA });
283
- expect(bm.getPage(0).next.index).toBe(1);
284
- expect(bm.getPage(1).next.next.index).toBe(3);
285
- });
286
-
287
- describe('findNext combineConsecutiveUnviewables=true', () => {
288
- const data = deepCopy(SAMPLE_DATA);
289
- // add some more pages
290
- data.splice(2, 0, deepCopy(data[0]));
291
- data[1].forEach(page => page.viewable = false);
292
-
293
- const bm = new BookModel({ data });
294
-
295
- test('does not skip the first unviewable page', () => {
296
- expect(bm.getPage(0).findNext({ combineConsecutiveUnviewables: true }).index).toBe(1);
297
- });
298
-
299
- test('skips consecutive unviewables', () => {
300
- expect(bm.getPage(1).findNext({ combineConsecutiveUnviewables: true }).index).toBe(3);
301
- });
302
-
303
- test('at end is undefined', () => {
304
- expect(bm.getPage(-1).findNext({ combineConsecutiveUnviewables: true })).toBeUndefined();
305
- });
306
- });
307
-
308
- describe('findPrev', () => {
309
- const data = deepCopy(SAMPLE_DATA);
310
- // add some more pages
311
- data.splice(2, 0, deepCopy(data[0]));
312
- data[1].forEach(page => page.viewable = false);
313
-
314
- const bm = new BookModel({ data });
315
-
316
- test('works if called on first unviewable', () => {
317
- expect(bm.getPage(1).findPrev({ combineConsecutiveUnviewables: true }).index).toBe(0);
318
- });
319
-
320
- test('works if called within unviewable chunk', () => {
321
- expect(bm.getPage(2).findPrev({ combineConsecutiveUnviewables: true }).index).toBe(1);
322
- });
323
-
324
- test('at start is undefined', () => {
325
- expect(bm.getPage(0).findPrev({ combineConsecutiveUnviewables: true })).toBeUndefined();
326
- });
327
- });
328
-
329
- describe('findLeft/findRight', () => {
330
- const data = deepCopy(SAMPLE_DATA);
331
-
332
- test('Calls findNext/findPrev based on progression', () => {
333
- const bm = new BookModel({ data });
334
- const page = bm.getPage(0);
335
- const findNextStub = sinon.stub(page, 'findNext');
336
- const findPrevStub = sinon.stub(page, 'findPrev');
337
- bm.pageProgression = 'lr';
338
- page.findLeft();
339
- expect(findPrevStub.callCount).toBe(1);
340
- expect(findNextStub.callCount).toBe(0);
341
- page.findRight();
342
- expect(findPrevStub.callCount).toBe(1);
343
- expect(findNextStub.callCount).toBe(1);
344
- bm.pageProgression = 'rl';
345
- page.findLeft();
346
- expect(findPrevStub.callCount).toBe(1);
347
- expect(findNextStub.callCount).toBe(2);
348
- page.findRight();
349
- expect(findPrevStub.callCount).toBe(2);
350
- expect(findNextStub.callCount).toBe(2);
351
- });
352
- });
353
-
354
- describe('getURISrcSet', () => {
355
- const data = deepCopy(SAMPLE_DATA);
356
- const bm = new BookModel({ data, reduceSet: NAMED_REDUCE_SETS.pow2 });
357
- bm.getPageURI = (index, scale, rotate) => `correctURL.png?scale=${scale}`;
358
- const page = bm.getPage(0);
359
-
360
- test('with 0 elements in srcset', () => {
361
- expect(page.getURISrcSet(1)).toBe("");
362
- });
363
-
364
- test('with 2 elements in srcset', () => {
365
- expect(page.getURISrcSet(5)).toBe("correctURL.png?scale=2 2x, correctURL.png?scale=1 4x");
366
- });
367
-
368
- test('with the most elements in srcset', () => {
369
- expect(page.getURISrcSet(35)).toBe("correctURL.png?scale=16 2x, correctURL.png?scale=8 4x, correctURL.png?scale=4 8x, correctURL.png?scale=2 16x, correctURL.png?scale=1 32x");
370
- });
371
- });
372
- });
@@ -1,263 +0,0 @@
1
- import BookReader from '@/src/BookReader.js';
2
- import { sleep } from '@/src/BookReader/utils.js';
3
- import sinon from 'sinon';
4
-
5
- beforeAll(() => {
6
- global.alert = sinon.fake();
7
- });
8
- afterEach(() => {
9
- sinon.restore();
10
- });
11
-
12
- describe('BookReader.prototype.toggleFullscreen', () => {
13
- test('uses `isFullscreen` to check fullscreen state', () => {
14
- const isFSmock = sinon.fake();
15
- // isFSmock.mockReturnValueOnce(false);
16
- const br = new BookReader();
17
- br.mode = br.constMode1up;
18
- br.enterFullscreen = sinon.fake();
19
- br.isFullscreen = isFSmock;
20
-
21
- br.toggleFullscreen();
22
- expect(br.isFullscreen.callCount).toEqual(1);
23
- });
24
-
25
- test('will always emit an event', async () => {
26
- const br = new BookReader();
27
- br.mode = br.constMode2up;
28
- br.trigger = sinon.fake();
29
- br.switchMode = sinon.fake();
30
- br.updateBrClasses = sinon.fake();
31
- br.jumpToIndex = sinon.fake();
32
- br.refs.$brContainer = {
33
- css: sinon.fake(),
34
- animate: (options, speed, style, callback) => callback(),
35
- };
36
- br.refs.$br = {
37
- updateBrClasses: sinon.fake(),
38
- removeClass: sinon.fake(),
39
- addClass: sinon.fake(),
40
- css: sinon.fake(),
41
- animate: (options, speed, style, callback) => callback(),
42
- };
43
-
44
- await br.toggleFullscreen();
45
- expect(br.trigger.callCount).toBeGreaterThan(0);
46
- });
47
-
48
- test('will start with opening fullscreen', () => {
49
- const br = new BookReader();
50
- br.mode = br.constMode2up;
51
- br.enterFullscreen = sinon.fake();
52
-
53
- br.toggleFullscreen();
54
- expect(br.enterFullscreen.callCount).toEqual(1);
55
- });
56
-
57
- test('will close fullscreen if BookReader is in fullscreen', () => {
58
- const br = new BookReader();
59
- br.mode = br.constMode1up;
60
- br.exitFullScreen = sinon.fake();
61
- br.isFullscreenActive = true;
62
-
63
- br.toggleFullscreen();
64
- expect(br.exitFullScreen.callCount).toEqual(1);
65
- });
66
- });
67
-
68
- describe('BookReader.prototype.enterFullscreen', () => {
69
- test('will bind `_fullscreenCloseHandler` by default', () => {
70
- const br = new BookReader();
71
- br.mode = br.constMode1up;
72
- br.switchMode = sinon.fake();
73
- br.updateBrClasses = sinon.fake();
74
- br.refs.$br = {
75
- css: sinon.fake(),
76
- animate: sinon.fake(),
77
- addClass: sinon.fake(),
78
- };
79
- expect(br._fullscreenCloseHandler).toBeUndefined();
80
-
81
- br.enterFullscreen();
82
- expect(br._fullscreenCloseHandler).toBeDefined();
83
- });
84
-
85
- test('fires certain events when called', async () => {
86
- const br = new BookReader();
87
- br.mode = br.constMode2up;
88
- br.switchMode = sinon.fake();
89
- br.updateBrClasses = sinon.fake();
90
- br.trigger = sinon.fake();
91
- br.resize = sinon.fake();
92
- br.jumpToIndex = sinon.fake();
93
- br.refs.$br = {
94
- addClass: sinon.fake(),
95
- removeClass: sinon.fake(),
96
- };
97
- br.refs.$brContainer = {
98
- css: sinon.fake(),
99
- animate: (options, speed, style, callback) => callback(),
100
- };
101
-
102
- await br.enterFullscreen();
103
- expect(br.switchMode.callCount).toEqual(1);
104
- expect(br.updateBrClasses.callCount).toEqual(1);
105
- expect(br.trigger.callCount).toEqual(2); // fragmentChange, fullscreenToggled
106
- expect(br.jumpToIndex.callCount).toEqual(1);
107
-
108
- await sleep(0);
109
- expect(br.resize.callCount).toEqual(1);
110
- });
111
- });
112
-
113
- describe('BookReader.prototype.exitFullScreen', () => {
114
- test('fires certain events when called', async () => {
115
- const br = new BookReader();
116
- br.mode = br.constMode2up;
117
- br.switchMode = sinon.fake();
118
- br.updateBrClasses = sinon.fake();
119
- br.trigger = sinon.fake();
120
- br.resize = sinon.fake();
121
- br.refs.$br = {
122
- addClass: sinon.fake(),
123
- removeClass: sinon.fake(),
124
- };
125
- br.refs.$brContainer = {
126
- css: sinon.fake(),
127
- animate: (options, speed, style, callback) => callback(),
128
- };
129
- await br.exitFullScreen();
130
- expect(br.switchMode.callCount).toEqual(1);
131
- expect(br.updateBrClasses.callCount).toEqual(1);
132
- expect(br.trigger.callCount).toEqual(2); // fragmentChange, fullscreenToggled
133
- expect(br.resize.callCount).toEqual(1);
134
- });
135
- });
136
-
137
- describe('BookReader.prototype.trigger', () => {
138
- test('fires custom event', () => {
139
- const br = new BookReader();
140
- global.br = br;
141
- global.dispatchEvent = sinon.fake();
142
-
143
- const props = {bar: 1};
144
- br.trigger('foo', props);
145
- expect(global.dispatchEvent.callCount).toBe(1);
146
- });
147
- });
148
-
149
- describe('`BookReader.prototype.prev`', () => {
150
- let br;
151
- let flipAnimationStub;
152
- beforeEach(() => {
153
- br = new BookReader();
154
- global.br = br;
155
- br.trigger = sinon.fake();
156
- br.jumpToIndex = sinon.fake();
157
- flipAnimationStub = sinon.stub(br._modes.mode2Up.mode2UpLit, 'flipAnimation');
158
- });
159
-
160
- afterEach(() => {
161
- sinon.restore();
162
- });
163
-
164
- test('does not take action if user is on front page', () => {
165
- br.firstIndex = 0;
166
- br.prev();
167
- expect(br.trigger.callCount).toBe(0);
168
- expect(flipAnimationStub.callCount).toBe(0);
169
- expect(br.jumpToIndex.callCount).toBe(0);
170
- });
171
-
172
- describe('2up mode', () => {
173
- test('fires event and turns the page', () => {
174
- br.firstIndex = 10;
175
- br.mode = br.constMode2up;
176
- br.prev();
177
- expect(br.jumpToIndex.callCount).toBe(0); // <-- does not get called
178
- expect(br.trigger.callCount).toBe(1);
179
- expect(flipAnimationStub.callCount).toBe(1);
180
- });
181
- });
182
-
183
- describe('non 2up mode', () => {
184
- test('jumps to provided index', () => {
185
- br.firstIndex = 100;
186
- br.mode = br.constMode1up;
187
- br.prev();
188
- expect(br.jumpToIndex.callCount).toBe(1); // <-- gets called
189
- expect(flipAnimationStub.callCount).toBe(0); // <-- gets called by `jumpToIndex` internally
190
- });
191
- });
192
- });
193
-
194
- describe('`BookReader.prototype.jumpToIndex`', () => {
195
- /**
196
- * @param {Partial<BookReaderOptions>} overrides
197
- */
198
- function makeFakeBr(overrides = {}) {
199
- const br = new BookReader({
200
- data: [
201
- [
202
- { index: 0, viewable: true },
203
- ],
204
- [
205
- { index: 1, viewable: false },
206
- { index: 2, viewable: false },
207
- ],
208
- [
209
- { index: 3, viewable: false },
210
- { index: 4, viewable: false },
211
- ],
212
- [
213
- { index: 5, viewable: true },
214
- ],
215
- ],
216
- ...overrides,
217
- });
218
- br.init();
219
-
220
- br._modes.mode2Up.jumpToIndex = sinon.fake();
221
-
222
- expect(br.firstIndex).toBe(0);
223
- expect(br.mode).toBe(br.constMode2up);
224
-
225
- return br;
226
- }
227
-
228
- test('Jumping into an unviewables range will go to start of range', () => {
229
- const br = makeFakeBr();
230
- br.jumpToIndex(3, 0, 0, true);
231
- expect(br._modes.mode2Up.jumpToIndex.callCount).toBe(1);
232
- expect(br._modes.mode2Up.jumpToIndex.args[0][0]).toBe(1);
233
- });
234
-
235
- test('Trying to jump into unviewables range while in that range, will jump forward', () => {
236
- const br = makeFakeBr();
237
- br.displayedIndices = [1, 2];
238
- br.jumpToIndex(3, 0, 0, true);
239
- expect(br._modes.mode2Up.jumpToIndex.callCount).toBe(1);
240
- expect(br._modes.mode2Up.jumpToIndex.args[0][0]).toBe(5);
241
- });
242
-
243
- test('Trying to jump into unviewables range while in that range, will do nothing if cannot jump forward', () => {
244
- const br = makeFakeBr({
245
- data: [
246
- [
247
- { index: 0, viewable: true },
248
- ],
249
- [
250
- { index: 1, viewable: false },
251
- { index: 2, viewable: false },
252
- ],
253
- [
254
- { index: 3, viewable: false },
255
- { index: 4, viewable: false },
256
- ],
257
- ],
258
- });
259
- br.displayedIndices = [1, 2];
260
- br.jumpToIndex(3, 0, 0, true);
261
- expect(br._modes.mode2Up.jumpToIndex.callCount).toBe(0);
262
- });
263
- });