@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,316 +0,0 @@
1
-
2
- import BookReader, {_modeStringToNumber} from '@/src/BookReader.js';
3
- import '@/src/plugins/plugin.resume.js';
4
- import '@/src/plugins/url/plugin.url.js';
5
-
6
- /** @type {import('@/src/BookReader.js').default} */
7
- let br;
8
- beforeAll(() => {
9
- document.body.innerHTML = '<div id="BookReader">';
10
- br = new BookReader({
11
- server: '',
12
- bookId: '',
13
- subPrefix: '',
14
- bookPath: '',
15
- });
16
- });
17
-
18
- afterEach(() => {
19
- jest.clearAllMocks();
20
- });
21
-
22
- test('has registered PostInit events', () => {
23
- expect(BookReader.eventNames.PostInit).toBeTruthy();
24
- });
25
-
26
- test('has registered zoom events', () => {
27
- expect(BookReader.eventNames.zoomIn).toBeTruthy();
28
- expect(BookReader.eventNames.zoomOut).toBeTruthy();
29
- });
30
-
31
- test('has registered view type selected events', () => {
32
- expect(BookReader.eventNames['1PageViewSelected']).toBeTruthy();
33
- expect(BookReader.eventNames['2PageViewSelected']).toBeTruthy();
34
- expect(BookReader.eventNames['3PageViewSelected']).toBeTruthy();
35
- });
36
-
37
- test('has registered fullscreen toggle event', () => {
38
- expect(BookReader.eventNames.fullscreenToggled).toBeTruthy();
39
- });
40
-
41
- test('checks cookie when initParams called', () => {
42
- br.plugins.resume.getResumeValue = jest.fn(() => 15);
43
- br.urlReadFragment = jest.fn(() => '');
44
-
45
- const params = br.initParams();
46
- expect(br.plugins.resume.getResumeValue).toHaveBeenCalledTimes(1);
47
- expect(params.init).toBe(true);
48
- expect(params.index).toBe(15);
49
- expect(params.fragmentChange).toBe(true);
50
- });
51
-
52
- test('does not check cookie when initParams called', () => {
53
- br.plugins.resume.getResumeValue = jest.fn(() => null);
54
- br.urlReadFragment = jest.fn(() => '');
55
- br.options.plugins.resume.enabled = false;
56
-
57
- const params = br.initParams();
58
- expect(br.plugins.resume.getResumeValue).toHaveBeenCalledTimes(0);
59
- expect(params.init).toBe(true);
60
- expect(params.index).toBe(0);
61
- expect(params.fragmentChange).toBe(false);
62
- });
63
-
64
- test('gets index from fragment when both fragment and cookie when InitParams called', () => {
65
- br.plugins.resume.getResumeValue = jest.fn(() => 15);
66
- br.urlReadFragment = jest.fn(() => 'page/n4');
67
- br.options.plugins.resume.enabled = true;
68
-
69
- const params = br.initParams();
70
- expect(br.plugins.resume.getResumeValue).toHaveBeenCalledTimes(1);
71
- expect(params.init).toBe(true);
72
- expect(params.index).toBe(4);
73
- expect(params.fragmentChange).toBe(true);
74
- });
75
-
76
- test('sets prevReadMode when init called', () => {
77
- br.init();
78
- expect(br.prevReadMode).toBeTruthy();
79
- });
80
-
81
- // Default behavior same in
82
- // BookReader.prototype.drawLeafsThumbnail
83
- // BookReader.prototype.getPrevReadMode
84
- test('sets prevPageMode if initial mode is thumb', () => {
85
- br.urlReadFragment = jest.fn(() => 'page/n4/mode/thumb');
86
-
87
- br.init();
88
- expect(br.prevReadMode).toBe(BookReader.constMode1up);
89
- });
90
-
91
- test('calls switchMode with init option when init called', () => {
92
- br.switchMode = jest.fn();
93
-
94
- br.init();
95
- expect(br.switchMode.mock.calls[0][1])
96
- .toHaveProperty('init', true);
97
- });
98
-
99
- test('has added BR property: server', () => {
100
- expect(br).toHaveProperty('server');
101
- expect(br.server).toBeDefined();
102
- });
103
-
104
- test('has added BR property: bookId', () => {
105
- expect(br).toHaveProperty('bookId');
106
- expect(br.bookId).toBeDefined();
107
- });
108
-
109
- test('has added BR property: subPrefix', () => {
110
- expect(br).toHaveProperty('subPrefix');
111
- expect(br.subPrefix).toBeDefined();
112
- });
113
-
114
- test('has added BR property: bookPath', () => {
115
- expect(br).toHaveProperty('bookPath');
116
- expect(br.bookPath).toBeDefined();
117
- });
118
-
119
- test('has suppressFragmentChange true when init with no input', () => {
120
- br.plugins.resume.getResumeValue = jest.fn(() => null);
121
- br.urlReadFragment = jest.fn(() => '');
122
- br.urlReadHashFragment = jest.fn(() => '');
123
- br.switchMode = jest.fn();
124
-
125
- br.init();
126
- expect(br.switchMode.mock.calls[0][1])
127
- .toHaveProperty('suppressFragmentChange', true);
128
- });
129
-
130
- test('has suppressFragmentChange false when init with cookie', () => {
131
- br.plugins.resume.getResumeValue = jest.fn(() => 5);
132
- br.urlReadFragment = jest.fn(() => '');
133
- br.switchMode = jest.fn();
134
-
135
- br.init();
136
- expect(br.switchMode.mock.calls[0][1])
137
- .toHaveProperty('suppressFragmentChange', false);
138
- });
139
-
140
- test('has suppressFragmentChange false when init with fragment', () => {
141
- br.plugins.resume.getResumeValue = jest.fn(() => null);
142
- br.urlReadFragment = jest.fn(() => 'mode/1up');
143
- br.switchMode = jest.fn();
144
-
145
- br.init();
146
- expect(br.switchMode.mock.calls[0][1])
147
- .toHaveProperty('suppressFragmentChange', false);
148
- });
149
-
150
- test('has suppressFragmentChange false when init with hash fragment', () => {
151
- br.plugins.resume.getResumeValue = jest.fn(() => null);
152
- br.urlReadFragment = jest.fn(() => '');
153
- br.urlReadHashFragment = jest.fn(() => 'mode/1up');
154
- br.switchMode = jest.fn();
155
- br.options.urlMode = 'history',
156
-
157
- br.init();
158
- expect(br.switchMode.mock.calls[0][1])
159
- .toHaveProperty('suppressFragmentChange', false);
160
- });
161
-
162
- test('adds q= term to urlMode=history query string', () => {
163
- expect(br.queryStringFromParams(
164
- { search: 'test value' },
165
- 'name=value',
166
- 'history',
167
- )).toBe('?name=value&q=test+value');
168
- });
169
-
170
- test('replaces q= term in urlMode=history query string', () => {
171
- expect(br.queryStringFromParams(
172
- { search: 'test+value' },
173
- 'q=foo&a=1&b=2&c=3',
174
- 'history',
175
- )).toBe('?q=test%2Bvalue&a=1&b=2&c=3');
176
- });
177
-
178
- test('does not add q= term to urlMode=hash query string', () => {
179
- expect(br.queryStringFromParams(
180
- { search: 'test value' },
181
- 'name=value',
182
- 'hash',
183
- )).toBe('?name=value');
184
- });
185
-
186
- describe('Navigation Bars', () => {
187
- test('Standard navigation is being used by default', () => {
188
- br.initNavbar = jest.fn();
189
- br.options.ui = '';
190
- br.init();
191
- expect(br.initNavbar).toHaveBeenCalledTimes(1);
192
- });
193
- test('Standard navigation is being used by default - when bookreader is embedded', () => {
194
- br.initNavbar = jest.fn();
195
- br.options.ui = 'embed';
196
- br.init();
197
- expect(br.initNavbar).toHaveBeenCalledTimes(1);
198
- expect(br.options.ui).toEqual('embed');
199
- });
200
- });
201
-
202
- describe('quantizeReduce', () => {
203
- const quantizeReduce = BookReader.prototype.quantizeReduce;
204
- const SAMPLE_FACTORS = [
205
- { reduce: 0.5 },
206
- { reduce: 1 },
207
- { reduce: 2 },
208
- { reduce: 3 },
209
- { reduce: 4 },
210
- { reduce: 6 },
211
- ];
212
- test('Number larger than max', () => {
213
- expect(quantizeReduce(10, SAMPLE_FACTORS)).toBe(6);
214
- });
215
-
216
- test('Number lower than max', () => {
217
- expect(quantizeReduce(0.25, SAMPLE_FACTORS)).toBe(0.5);
218
- });
219
-
220
- test('Number directly between two reduction factors chooses first factor', () => {
221
- expect(quantizeReduce(5, SAMPLE_FACTORS)).toBe(4);
222
- });
223
-
224
- test('Exact match', () => {
225
- expect(quantizeReduce(2, SAMPLE_FACTORS)).toBe(2);
226
- });
227
-
228
- test('Closer to a lower boundary', () => {
229
- expect(quantizeReduce(1.115, SAMPLE_FACTORS)).toBe(1);
230
- });
231
-
232
- test('Closer to an upper bound', () => {
233
- expect(quantizeReduce(1.95, SAMPLE_FACTORS)).toBe(2);
234
- });
235
-
236
- test('Only one reduction factor', () => {
237
- expect(quantizeReduce(17, [{reduce: 10}])).toBe(10);
238
- });
239
- });
240
-
241
-
242
- describe('nextReduce', () => {
243
- describe('Test matrix', () => {
244
- const nextReduce = BookReader.prototype.nextReduce;
245
- const SAMPLE_FACTORS = [
246
- { reduce: 0.5 },
247
- { reduce: 1 },
248
- { reduce: 2 },
249
- { reduce: 3 },
250
- { reduce: 3.3, autofit: "width" },
251
- { reduce: 4 },
252
- { reduce: 6 },
253
- { reduce: 6.1, autofit: "height" },
254
- // auto doesn't get read by nextReduce (bug)
255
- // It looks like width/height are set for 1up, and auto is set for 2up,
256
- // and neither is set for thumb
257
- { reduce: 6.2, autofit: "auto" },
258
- ];
259
-
260
- const currentReduces = [
261
- { name: 'Exact match', value: 2 },
262
- { name: 'In-between', value: 4.5 },
263
- { name: '< Min', value: 0.25 },
264
- { name: '> Max', value: 10 },
265
-
266
- { name: '= Min', value: 0.5 },
267
- { name: '= Max', value: 6.2 },
268
- ];
269
-
270
- const directions = [ 'in', 'out', 'width', 'height', 'auto' ];
271
-
272
- const expectations = [
273
- // currentReduces <->
274
- // v^ directions
275
- /* 2, 4.5, 0.25, 10, 0.5, 6.2 */
276
- /* in */ [ 1, 4, 0.5, 6.2, 0.5, 6.1 ],
277
- /* out */ [ 3, 6, 0.5, 6.2, 1, 6.2 ],
278
- /* width */ [ 3.3, 3.3, 3.3, 3.3, 3.3, 3.3 ],
279
- /* height */ [ 6.1, 6.1, 6.1, 6.1, 6.1, 6.1 ],
280
- /* auto */ [ 6.2, 6.2, 6.2, 6.2, 6.2, 6.2 ],
281
- ];
282
-
283
- for (const [y, row] of expectations.entries()) {
284
- for (const [x, expectedValue] of row.entries()) {
285
- test(`${currentReduces[x].name} ${directions[y]}`, () => {
286
- expect(nextReduce(currentReduces[x].value, directions[y], SAMPLE_FACTORS).reduce)
287
- .toBe(expectedValue);
288
- });
289
- }
290
- }
291
- });
292
-
293
- describe('No matching reduction', () => {
294
- const nextReduce = BookReader.prototype.nextReduce;
295
- const SAMPLE_FACTORS = [
296
- { reduce: 0.5 },
297
- { reduce: 1 },
298
- { reduce: 2 },
299
- { reduce: 3 },
300
- ];
301
-
302
- test('Returns first reduction when no match found', () => {
303
- expect(nextReduce(2, 'width', SAMPLE_FACTORS).reduce).toBe(0.5);
304
- expect(nextReduce(2, 'height', SAMPLE_FACTORS).reduce).toBe(0.5);
305
- expect(nextReduce(2, 'auto', SAMPLE_FACTORS).reduce).toBe(0.5);
306
- });
307
- });
308
- });
309
-
310
- describe('_modeStringToNumber', () => {
311
- test('Returns correct number', () => {
312
- expect(_modeStringToNumber('mode/1up')).toBe(1);
313
- expect(_modeStringToNumber('mode/2up')).toBe(2);
314
- expect(_modeStringToNumber('mode/thumb')).toBe(3);
315
- });
316
- });
@@ -1,20 +0,0 @@
1
- import sinon from 'sinon';
2
- import {ArchiveAnalyticsPlugin} from '@/src/plugins/plugin.archive_analytics.js';
3
-
4
- describe('sendEvent', () => {
5
- test('logs if debug set to true', () => {
6
- const stub = sinon.stub(console, 'log');
7
- const p = new ArchiveAnalyticsPlugin({});
8
- p.setup({ debug: true });
9
- p.sendEvent();
10
- expect(stub.callCount).toBe(1);
11
- stub.restore();
12
- });
13
-
14
- test('Does not error if window.archive_analytics is undefined', () => {
15
- const p = new ArchiveAnalyticsPlugin({});
16
- const spy = sinon.spy(p.sendEvent);
17
- p.sendEvent();
18
- expect(spy.threw()).toBe(false);
19
- });
20
- });
@@ -1,35 +0,0 @@
1
-
2
- import BookReader from '@/src/BookReader.js';
3
- import '@/src/plugins/plugin.autoplay.js';
4
-
5
- /** @type {BookReader} */
6
- let br;
7
- beforeEach(() => {
8
- document.body.innerHTML = '<div id="BookReader">';
9
- br = new BookReader();
10
- });
11
-
12
- afterEach(() => {
13
- jest.clearAllMocks();
14
- });
15
-
16
- describe('Plugin: Menu Toggle', () => {
17
- test('autoplay does not start when BookReaderInitializes', () => {
18
- br.plugins.autoplay.toggle = jest.fn();
19
- br.init();
20
- expect(br.plugins.autoplay.toggle).toHaveBeenCalledTimes(0);
21
- });
22
- test('autoplay will run without `flipSpeed` parameters', () => {
23
- const initialTimer = br.plugins.autoplay.timer;
24
- br.next = jest.fn();
25
- br.plugins.autoplay.stop = jest.fn();
26
- br.init();
27
- br.plugins.autoplay.toggle();
28
- // internally referenced functions that fire
29
- expect(br.next).toHaveBeenCalledTimes(1);
30
-
31
- expect(initialTimer).toBeFalsy();
32
- // timer changes when autoplay turns on
33
- expect(br.plugins.autoplay.timer).toBeTruthy();
34
- });
35
- });
@@ -1,193 +0,0 @@
1
- import sinon from "sinon";
2
-
3
- import "@/src/BookReader.js";
4
- import {ChaptersPlugin} from "@/src/plugins/plugin.chapters.js";
5
- import { BookModel } from "@/src/BookReader/BookModel.js";
6
- import { deepCopy } from "../utils.js";
7
- /** @typedef {import('@/src/plugins/plugin.chapters').TocEntry} TocEntry */
8
-
9
- /** @type {TocEntry[]} */
10
- const SAMPLE_TOC = [{
11
- "pagenum": "3",
12
- "level": 1,
13
- "label": "CHAPTER I",
14
- "type": { "key": "/type/toc_item" },
15
- "title": "THE COUNTRY AND THE MISSION 1",
16
- "pageIndex": 3,
17
- }, {
18
- "pagenum": "17",
19
- "level": 1,
20
- "label": "CHAPTER II",
21
- "type": { "key": "/type/toc_item" },
22
- "title": "THE COUNTRY AND THE MISSION 2",
23
- "pageIndex": 17,
24
- }, {
25
- "pagenum": "undefined",
26
- "level": 1,
27
- "label": "CHAPTER III",
28
- "type": { "key": "/type/toc_item" },
29
- "title": "THE COUNTRY AND THE MISSION 3",
30
- }, {
31
- "pagenum": "40",
32
- "level": 1,
33
- "label": "CHAPTER IV",
34
- "type": { "key": "/type/toc_item" },
35
- "title": "THE COUNTRY AND THE MISSION 4",
36
- "pageIndex": 40,
37
- }];
38
-
39
- /** @type {TocEntry[]} */
40
- const SAMPLE_TOC_UNDEF = [
41
- {
42
- "level": 1,
43
- "label": "CHAPTER I",
44
- "type": { "key": "/type/toc_item" },
45
- "title": "THE COUNTRY AND THE MISSION 1",
46
- },
47
- {
48
- "level": 1,
49
- "label": "CHAPTER II",
50
- "type": { "key": "/type/toc_item" },
51
- "title": "THE COUNTRY AND THE MISSION 2",
52
- },
53
- ];
54
-
55
- /** @type {TocEntry[]} */
56
- const SAMPLE_TOC_OPTION = [
57
- {
58
- "level": 1,
59
- "title": "THE COUNTRY AND THE MISSION 1",
60
- },
61
- {
62
- "level": 1,
63
- "title": "THE COUNTRY AND THE MISSION 2",
64
- },
65
- ];
66
-
67
- afterEach(() => {
68
- sinon.restore();
69
- });
70
-
71
- describe("ChaptersPlugin", () => {
72
- beforeEach(() => {
73
- sinon.stub(BookModel.prototype, "getPageIndex").callsFake((str) =>
74
- parseFloat(str),
75
- );
76
- });
77
-
78
- describe("init", () => {
79
- test("does not render when open library has no record", async () => {
80
- const p = new ChaptersPlugin({ options: { vars: {} } });
81
- sinon.stub(p, "getOpenLibraryRecord").resolves(null);
82
- sinon.spy(p, "_render");
83
- await p.init();
84
- expect(p._render.callCount).toBe(0);
85
- });
86
-
87
- test("does not render when open library record has no TOC", async () => {
88
- const p = new ChaptersPlugin({ options: { vars: {} } });
89
- sinon.stub(p, "getOpenLibraryRecord").resolves({ key: "/books/OL1M" });
90
- sinon.spy(p, "_render");
91
- await p.init();
92
- expect(p._render.callCount).toBe(0);
93
- });
94
-
95
- test("renders if valid TOC on open library", async () => {
96
- const fakeBR = {
97
- options: { vars: {} },
98
- bind: sinon.stub(),
99
- };
100
- const p = new ChaptersPlugin(fakeBR);
101
- sinon.stub(p, "getOpenLibraryRecord").resolves({
102
- "title": "The Adventures of Sherlock Holmes",
103
- "table_of_contents": deepCopy(SAMPLE_TOC_OPTION),
104
- "ocaid": "adventureofsherl0000unse",
105
- });
106
- sinon.stub(p, "_render");
107
- await p.init();
108
- expect(p._render.callCount).toBe(1);
109
- });
110
-
111
- test("does not fetch open library record if table of contents in options", async () => {
112
- const fakeBR = {
113
- options: {
114
- table_of_contents: deepCopy(SAMPLE_TOC_UNDEF),
115
- },
116
- bind: sinon.stub(),
117
- };
118
- const p = new ChaptersPlugin(fakeBR);
119
- sinon.stub(p, "getOpenLibraryRecord");
120
- sinon.stub(p, "_render");
121
- await p.init();
122
- expect(p.getOpenLibraryRecord.callCount).toBe(0);
123
- expect(p._render.callCount).toBe(1);
124
- });
125
-
126
- test("converts leafs and pagenums to page index", async () => {
127
- const table_of_contents = deepCopy(SAMPLE_TOC_UNDEF);
128
- table_of_contents[0].leaf = 0;
129
- table_of_contents[1].pagenum = '17';
130
- const fakeBR = {
131
- options: {
132
- table_of_contents,
133
- },
134
- bind: sinon.stub(),
135
- book: {
136
- leafNumToIndex: (leaf) => leaf + 1,
137
- getPageIndex: (str) => parseFloat(str),
138
- },
139
- };
140
- const p = new ChaptersPlugin(fakeBR);
141
- sinon.stub(p, "_render");
142
- await p.init();
143
- expect(p._render.callCount).toBe(1);
144
- expect(p._tocEntries[0].pageIndex).toBe(1);
145
- expect(p._tocEntries[1].pageIndex).toBe(17);
146
- });
147
- });
148
-
149
- describe('_render', () => {
150
- test('renders markers and panel', () => {
151
- const fakeBR = {
152
- shell: {
153
- menuProviders: {},
154
- addMenuShortcut: sinon.stub(),
155
- updateMenuContents: sinon.stub(),
156
- },
157
- };
158
- const p = new ChaptersPlugin(fakeBR);
159
- sinon.stub(p, '_renderMarker');
160
- p._tocEntries = deepCopy(SAMPLE_TOC);
161
- p._render();
162
- expect(fakeBR.shell.menuProviders['chapters']).toBeTruthy();
163
- expect(fakeBR.shell.addMenuShortcut.callCount).toBe(1);
164
- expect(fakeBR.shell.updateMenuContents.callCount).toBe(1);
165
- expect(p._renderMarker.callCount).toBeGreaterThan(1);
166
- });
167
- });
168
-
169
- describe('_updateCurrent', () => {
170
- test('highlights the current chapter', () => {
171
- const fakeBR = {
172
- mode: 2,
173
- firstIndex: 16,
174
- displayedIndices: [16, 17],
175
- };
176
- const p = new ChaptersPlugin(fakeBR);
177
- p._tocEntries = deepCopy(SAMPLE_TOC);
178
- p._chaptersPanel = {
179
- currentChapter: null,
180
- };
181
- p._updateCurrent();
182
- expect(p._chaptersPanel.currentChapter).toEqual(SAMPLE_TOC[1]);
183
-
184
- fakeBR.mode = 1;
185
- p._updateCurrent();
186
- expect(p._chaptersPanel.currentChapter).toEqual(SAMPLE_TOC[0]);
187
-
188
- fakeBR.firstIndex = 0;
189
- p._updateCurrent();
190
- expect(p._chaptersPanel.currentChapter).toBeUndefined();
191
- });
192
- });
193
- });
@@ -1,42 +0,0 @@
1
- import sinon from 'sinon';
2
-
3
- import BookReader from '@/src/BookReader.js';
4
- import { _attachEventListeners } from '@/src/plugins/plugin.iframe.js';
5
-
6
- afterEach(() => {
7
- sinon.restore();
8
- });
9
-
10
- test('listens for br events if parent', () => {
11
- const br = new BookReader();
12
- sinon.spy(br, 'bind');
13
- sinon.spy(window, 'addEventListener');
14
-
15
- _attachEventListeners(br, window.parent);
16
- expect(br.bind.callCount).toBe(1);
17
- expect(window.addEventListener.callCount).toBe(1);
18
- expect(window.addEventListener.args[0][0]).toBe('message');
19
- });
20
-
21
- test('does not attach if not in iframe', () => {
22
- const br = new BookReader();
23
- sinon.spy(br, 'bind');
24
- sinon.spy(window, 'addEventListener');
25
-
26
- _attachEventListeners(br, null);
27
- expect(br.bind.callCount).toBe(0);
28
- expect(window.addEventListener.callCount).toBe(0);
29
- });
30
-
31
- test('updates params when window receives a message', () => {
32
- const br = new BookReader();
33
- sinon.spy(br, 'updateFromParams');
34
- _attachEventListeners(br);
35
- window.dispatchEvent(new MessageEvent('message', {
36
- data: {
37
- type: 'bookReaderFragmentChange',
38
- fragment: '',
39
- },
40
- }));
41
- expect(br.updateFromParams.callCount).toBe(1);
42
- });
@@ -1,85 +0,0 @@
1
- import BookReader from '@/src/BookReader.js';
2
- import '@/src/plugins/plugin.resume.js';
3
-
4
- import sinon from 'sinon';
5
- import * as docCookies from '@/src/util/docCookies.js';
6
- import { ResumePlugin } from '@/src/plugins/plugin.resume.js';
7
-
8
- /** @type {import('@/src/BookReader.js').default} */
9
- let br;
10
- beforeAll(() => {
11
- document.body.innerHTML = '<div id="BookReader">';
12
- br = new BookReader();
13
- br.init();
14
- });
15
-
16
- afterEach(() => {
17
- jest.clearAllMocks();
18
- sinon.restore();
19
- });
20
-
21
- describe('updateResumeValue', () => {
22
- /* Mark 2020-05-02
23
- Skipping while confirming with Neeraj
24
- I'm not sure:
25
- - What this test really does
26
- - If the instantiation of the prototype counts as a call
27
- - If so, why would there be a second call
28
- Can't find in production
29
- In this branch .toHaveBeenCalledTimes() === 1
30
- */
31
- test.skip('starts when BookReaderInit is called', () => {
32
- br.plugins.resume.updateResumeValue = jest.fn();
33
- br.init();
34
- expect(br.plugins.resume.updateResumeValue).toHaveBeenCalledTimes(2);
35
- });
36
-
37
- test('handles cookieName=null', () => {
38
- const p = new ResumePlugin(null);
39
- p.setup({ cookiePath: '/details/goody' });
40
- const setItemSpy = sinon.spy(docCookies, 'setItem');
41
-
42
- p.updateResumeValue(16);
43
- expect(setItemSpy.callCount).toBe(1);
44
- expect(setItemSpy.args[0].slice(0, 2)).toEqual(['br-resume', 16]);
45
- expect(setItemSpy.args[0][3]).toEqual('/details/goody');
46
- });
47
-
48
- test('handles cookiePath not set', () => {
49
- const setItemSpy = sinon.spy(docCookies, 'setItem');
50
- // Save function
51
- const saveFn = br.plugins.resume.getCookiePath;
52
- br.plugins.resume.getCookiePath = jest.fn(() => '/details/foo');
53
- br.plugins.resume.updateResumeValue(16);
54
- expect(setItemSpy.args[0][3]).toEqual('/details/foo');
55
- // Restore function
56
- br.plugins.resume.getCookiePath = saveFn;
57
- });
58
-
59
- test('handles cookie path from URL with decoration', () => {
60
- const complexPathWithPage = '/details/2008ELMValidityStudyFinalReportRevised/Executive%20Summary%20for%20the%20EPT%26ELM%20Validity%20Studie_20100603%20-%20Copy/page/n1/mode/2up';
61
- const complexPath = '/details/2008ELMValidityStudyFinalReportRevised/Executive%20Summary%20for%20the%20EPT%26ELM%20Validity%20Studie_20100603%20-%20Copy';
62
- expect(br.plugins.resume.getCookiePath(complexPathWithPage))
63
- .toEqual(complexPath);
64
-
65
- expect(br.plugins.resume.getCookiePath('/details/item/mode/1up'))
66
- .toEqual('/details/item');
67
-
68
- expect(br.plugins.resume.getCookiePath('/details/item/inside/a/long/path/model/is/used'))
69
- .toEqual('/details/item/inside/a/long/path/model/is/used');
70
-
71
- expect(br.plugins.resume.getCookiePath('/details/item/inside/a/long/path/mode/is/used'))
72
- .toEqual('/details/item/inside/a/long/path');
73
- });
74
-
75
- test('handles cookie path from URL with no decoration', () => {
76
- expect(br.plugins.resume.getCookiePath('/details/item'))
77
- .toEqual('/details/item');
78
-
79
- expect(br.plugins.resume.getCookiePath('/details/item/'))
80
- .toEqual('/details/item/');
81
-
82
- expect(br.plugins.resume.getCookiePath('/details/item/almost/any/kind/of/long/path'))
83
- .toEqual('/details/item/almost/any/kind/of/long/path');
84
- });
85
- });