@internetarchive/bookreader 5.0.0-94 → 5.0.0-95

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 (181) hide show
  1. package/.github/workflows/npm-publish.yml +2 -12
  2. package/CHANGELOG.md +7 -0
  3. package/README.md +0 -2
  4. package/package.json +1 -1
  5. package/scripts/version.js +0 -3
  6. package/BookReader/BookReader.css +0 -2251
  7. package/BookReader/BookReader.js +0 -3
  8. package/BookReader/BookReader.js.LICENSE.txt +0 -72
  9. package/BookReader/BookReader.js.map +0 -1
  10. package/BookReader/ia-bookreader-bundle.js +0 -1782
  11. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +0 -7
  12. package/BookReader/ia-bookreader-bundle.js.map +0 -1
  13. package/BookReader/icons/1up.svg +0 -1
  14. package/BookReader/icons/2up.svg +0 -1
  15. package/BookReader/icons/advance.svg +0 -3
  16. package/BookReader/icons/chevron-right.svg +0 -1
  17. package/BookReader/icons/close-circle-dark.svg +0 -1
  18. package/BookReader/icons/close-circle.svg +0 -1
  19. package/BookReader/icons/fullscreen.svg +0 -1
  20. package/BookReader/icons/fullscreen_exit.svg +0 -1
  21. package/BookReader/icons/hamburger.svg +0 -1
  22. package/BookReader/icons/left-arrow.svg +0 -1
  23. package/BookReader/icons/magnify-minus.svg +0 -1
  24. package/BookReader/icons/magnify-plus.svg +0 -1
  25. package/BookReader/icons/magnify.svg +0 -1
  26. package/BookReader/icons/pause.svg +0 -1
  27. package/BookReader/icons/play.svg +0 -1
  28. package/BookReader/icons/playback-speed.svg +0 -1
  29. package/BookReader/icons/read-aloud.svg +0 -1
  30. package/BookReader/icons/review.svg +0 -3
  31. package/BookReader/icons/thumbnails.svg +0 -1
  32. package/BookReader/icons/voice.svg +0 -1
  33. package/BookReader/icons/volume-full.svg +0 -1
  34. package/BookReader/images/BRicons.png +0 -0
  35. package/BookReader/images/BRicons.svg +0 -5
  36. package/BookReader/images/BRicons_ia.png +0 -0
  37. package/BookReader/images/back_pages.png +0 -0
  38. package/BookReader/images/book_bottom_icon.png +0 -0
  39. package/BookReader/images/book_down_icon.png +0 -0
  40. package/BookReader/images/book_left_icon.png +0 -0
  41. package/BookReader/images/book_leftmost_icon.png +0 -0
  42. package/BookReader/images/book_right_icon.png +0 -0
  43. package/BookReader/images/book_rightmost_icon.png +0 -0
  44. package/BookReader/images/book_top_icon.png +0 -0
  45. package/BookReader/images/book_up_icon.png +0 -0
  46. package/BookReader/images/books_graphic.svg +0 -1
  47. package/BookReader/images/booksplit.png +0 -0
  48. package/BookReader/images/control_pause_icon.png +0 -0
  49. package/BookReader/images/control_play_icon.png +0 -0
  50. package/BookReader/images/embed_icon.png +0 -0
  51. package/BookReader/images/hypothesis.ico +0 -0
  52. package/BookReader/images/icon-home-ia.png +0 -0
  53. package/BookReader/images/icon_OL-logo-xs.png +0 -0
  54. package/BookReader/images/icon_alert-xs.png +0 -0
  55. package/BookReader/images/icon_book.svg +0 -1
  56. package/BookReader/images/icon_bookmark.svg +0 -1
  57. package/BookReader/images/icon_close-pop.png +0 -0
  58. package/BookReader/images/icon_download.png +0 -0
  59. package/BookReader/images/icon_gear.svg +0 -1
  60. package/BookReader/images/icon_hamburger.svg +0 -1
  61. package/BookReader/images/icon_home.png +0 -0
  62. package/BookReader/images/icon_home.svg +0 -1
  63. package/BookReader/images/icon_home_ia.png +0 -0
  64. package/BookReader/images/icon_indicator.png +0 -0
  65. package/BookReader/images/icon_info.svg +0 -1
  66. package/BookReader/images/icon_one_page.svg +0 -1
  67. package/BookReader/images/icon_pause.svg +0 -1
  68. package/BookReader/images/icon_play.svg +0 -1
  69. package/BookReader/images/icon_playback-rate.svg +0 -1
  70. package/BookReader/images/icon_return.png +0 -0
  71. package/BookReader/images/icon_search_button.svg +0 -1
  72. package/BookReader/images/icon_share.svg +0 -1
  73. package/BookReader/images/icon_skip-ahead.svg +0 -1
  74. package/BookReader/images/icon_skip-back.svg +0 -2
  75. package/BookReader/images/icon_speaker.svg +0 -1
  76. package/BookReader/images/icon_speaker_open.svg +0 -1
  77. package/BookReader/images/icon_thumbnails.svg +0 -1
  78. package/BookReader/images/icon_toc.svg +0 -1
  79. package/BookReader/images/icon_two_pages.svg +0 -1
  80. package/BookReader/images/icon_zoomer.png +0 -0
  81. package/BookReader/images/loading.gif +0 -0
  82. package/BookReader/images/logo_icon.png +0 -0
  83. package/BookReader/images/marker_chap-off.png +0 -0
  84. package/BookReader/images/marker_chap-off.svg +0 -1
  85. package/BookReader/images/marker_chap-off_ia.png +0 -0
  86. package/BookReader/images/marker_chap-on.png +0 -0
  87. package/BookReader/images/marker_chap-on.svg +0 -1
  88. package/BookReader/images/marker_srch-on.svg +0 -1
  89. package/BookReader/images/marker_srchchap-off.png +0 -0
  90. package/BookReader/images/marker_srchchap-on.png +0 -0
  91. package/BookReader/images/nav_control-dn.png +0 -0
  92. package/BookReader/images/nav_control-dn_ia.png +0 -0
  93. package/BookReader/images/nav_control-up.png +0 -0
  94. package/BookReader/images/nav_control-up_ia.png +0 -0
  95. package/BookReader/images/nav_control.png +0 -0
  96. package/BookReader/images/one_page_mode_icon.png +0 -0
  97. package/BookReader/images/paper-badge.png +0 -0
  98. package/BookReader/images/print_icon.png +0 -0
  99. package/BookReader/images/progressbar.gif +0 -0
  100. package/BookReader/images/right_edges.png +0 -0
  101. package/BookReader/images/slider.png +0 -0
  102. package/BookReader/images/slider_ia.png +0 -0
  103. package/BookReader/images/thumbnail_mode_icon.png +0 -0
  104. package/BookReader/images/transparent.png +0 -0
  105. package/BookReader/images/two_page_mode_icon.png +0 -0
  106. package/BookReader/images/unviewable_page.png +0 -0
  107. package/BookReader/images/zoom_in_icon.png +0 -0
  108. package/BookReader/images/zoom_out_icon.png +0 -0
  109. package/BookReader/jquery-3.js +0 -2
  110. package/BookReader/jquery-3.js.LICENSE.txt +0 -24
  111. package/BookReader/plugins/plugin.archive_analytics.js +0 -2
  112. package/BookReader/plugins/plugin.archive_analytics.js.map +0 -1
  113. package/BookReader/plugins/plugin.autoplay.js +0 -2
  114. package/BookReader/plugins/plugin.autoplay.js.map +0 -1
  115. package/BookReader/plugins/plugin.chapters.js +0 -26
  116. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +0 -1
  117. package/BookReader/plugins/plugin.chapters.js.map +0 -1
  118. package/BookReader/plugins/plugin.experiments.js +0 -3
  119. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +0 -1
  120. package/BookReader/plugins/plugin.experiments.js.map +0 -1
  121. package/BookReader/plugins/plugin.iframe.js +0 -2
  122. package/BookReader/plugins/plugin.iframe.js.map +0 -1
  123. package/BookReader/plugins/plugin.iiif.js +0 -2
  124. package/BookReader/plugins/plugin.iiif.js.map +0 -1
  125. package/BookReader/plugins/plugin.resume.js +0 -2
  126. package/BookReader/plugins/plugin.resume.js.map +0 -1
  127. package/BookReader/plugins/plugin.search.js +0 -3
  128. package/BookReader/plugins/plugin.search.js.LICENSE.txt +0 -1
  129. package/BookReader/plugins/plugin.search.js.map +0 -1
  130. package/BookReader/plugins/plugin.text_selection.js +0 -3
  131. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +0 -1
  132. package/BookReader/plugins/plugin.text_selection.js.map +0 -1
  133. package/BookReader/plugins/plugin.tts.js +0 -3
  134. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +0 -29
  135. package/BookReader/plugins/plugin.tts.js.map +0 -1
  136. package/BookReader/plugins/plugin.url.js +0 -2
  137. package/BookReader/plugins/plugin.url.js.map +0 -1
  138. package/BookReader/plugins/plugin.vendor-fullscreen.js +0 -2
  139. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +0 -1
  140. package/BookReader/webcomponents-bundle.js +0 -3
  141. package/BookReader/webcomponents-bundle.js.LICENSE.txt +0 -9
  142. package/BookReader/webcomponents-bundle.js.map +0 -1
  143. package/src/BookReader/BookModel.js +0 -564
  144. package/src/BookReader/DragScrollable.js +0 -233
  145. package/src/BookReader/ImageCache.js +0 -149
  146. package/src/BookReader/Mode1Up.js +0 -110
  147. package/src/BookReader/Mode1UpLit.js +0 -388
  148. package/src/BookReader/Mode2Up.js +0 -107
  149. package/src/BookReader/Mode2UpLit.js +0 -777
  150. package/src/BookReader/ModeCoordinateSpace.js +0 -29
  151. package/src/BookReader/ModeSmoothZoom.js +0 -312
  152. package/src/BookReader/ModeThumb.js +0 -344
  153. package/src/BookReader/Navbar/Navbar.js +0 -355
  154. package/src/BookReader/PageContainer.js +0 -172
  155. package/src/BookReader/ReduceSet.js +0 -26
  156. package/src/BookReader/Toolbar/Toolbar.js +0 -362
  157. package/src/BookReader/events.js +0 -19
  158. package/src/BookReader/options.js +0 -387
  159. package/src/BookReader/utils/HTMLDimensionsCacher.js +0 -44
  160. package/src/BookReader/utils/ScrollClassAdder.js +0 -31
  161. package/src/BookReader/utils/SelectionObserver.js +0 -45
  162. package/src/BookReader/utils/classes.js +0 -36
  163. package/src/BookReader/utils.js +0 -313
  164. package/tests/jest/BookReader/BookModel.test.js +0 -372
  165. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +0 -263
  166. package/tests/jest/BookReader/ImageCache.test.js +0 -150
  167. package/tests/jest/BookReader/Mode1UpLit.test.js +0 -73
  168. package/tests/jest/BookReader/Mode2Up.test.js +0 -98
  169. package/tests/jest/BookReader/Mode2UpLit.test.js +0 -190
  170. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +0 -16
  171. package/tests/jest/BookReader/ModeSmoothZoom.test.js +0 -218
  172. package/tests/jest/BookReader/ModeThumb.test.js +0 -71
  173. package/tests/jest/BookReader/Navbar/Navbar.test.js +0 -182
  174. package/tests/jest/BookReader/PageContainer.test.js +0 -249
  175. package/tests/jest/BookReader/ReduceSet.test.js +0 -38
  176. package/tests/jest/BookReader/Toolbar/Toolbar.test.js +0 -26
  177. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +0 -59
  178. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +0 -49
  179. package/tests/jest/BookReader/utils/SelectionObserver.test.js +0 -57
  180. package/tests/jest/BookReader/utils/classes.test.js +0 -88
  181. package/tests/jest/BookReader/utils.test.js +0 -250
@@ -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
- });
@@ -1,150 +0,0 @@
1
- import sinon from 'sinon';
2
- import { BookModel } from '@/src/BookReader/BookModel.js';
3
- import { ImageCache } from '@/src/BookReader/ImageCache.js';
4
- import { Pow2ReduceSet } from '@/src/BookReader/ReduceSet.js';
5
- /** @typedef {import('@/src/BookReader/options.js').BookReaderOptions} BookReaderOptions */
6
-
7
- afterEach(() => {
8
- jest.restoreAllMocks();
9
- sinon.restore();
10
- });
11
-
12
- const CACHE_MOCK = { 1: [{ reduce: 3, loaded: true }] };
13
- const FIRST_PAGE_MOCK = { width: 123, height: 123, uri: 'https://archive.org/image0.jpg', pageNum: '1' };
14
- /** @type {BookReaderOptions['data']} */
15
- const SAMPLE_DATA = [
16
- [ FIRST_PAGE_MOCK ],
17
- [
18
- { width: 123, height: 123, uri: 'https://archive.org/image1.jpg', pageNum: '2' },
19
- { width: 123, height: 123, uri: 'https://archive.org/image2.jpg', pageNum: '3' },
20
- ],
21
- [
22
- { width: 123, height: 123, uri: 'https://archive.org/image3.jpg', pageNum: '4' },
23
- { width: 123, height: 123, uri: 'https://archive.org/image4.jpg', pageNum: '5' },
24
- ],
25
- [
26
- { width: 123, height: 123, uri: 'https://archive.org/image5.jpg', pageNum: '6' },
27
- ],
28
- ];
29
-
30
- describe('Image Cache', () => {
31
- describe('`image` call', () => {
32
- test('calling `image` will create an image if none is cached', () => {
33
- const reduceSet = Pow2ReduceSet;
34
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
35
- ic.cache = {};
36
- ic.image(1, 5);
37
- expect(Object.keys(ic.cache).length).toBe(1);
38
- expect(ic.cache['1'].length).toBe(1);
39
- });
40
- test('will pull from cache if image of a good quality has been stored', () => {
41
- const reduceSet = Pow2ReduceSet;
42
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
43
- const serveImgElSpy = sinon.spy(ic, '_serveImageElement');
44
- ic.cache = CACHE_MOCK;
45
- ic.image(1, 5);
46
- expect(serveImgElSpy.callCount).toBe(1);
47
- });
48
- });
49
-
50
- describe('`imageLoaded` call', () => {
51
- test('returns true if image in cache', () => {
52
- const reduceSet = Pow2ReduceSet;
53
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
54
- ic.cache = CACHE_MOCK;
55
- const isImgLoaded = ic.imageLoaded(1, 3);
56
- expect(isImgLoaded).toBe(true);
57
- });
58
- test('returns true if image reducer in cache is good enough', () => {
59
- const reduceSet = Pow2ReduceSet;
60
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
61
- ic.cache = CACHE_MOCK;
62
- const isImgLoaded = ic.imageLoaded(1, 5);
63
- expect(isImgLoaded).toBe(true);
64
- });
65
- test('returns false if no image in cache', () => {
66
- const reduceSet = Pow2ReduceSet;
67
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
68
- ic.cache = CACHE_MOCK;
69
- const isImgLoaded = ic.imageLoaded(2, 3);
70
- expect(isImgLoaded).toBe(false);
71
- });
72
- test('returns false if reducer to check is better than cache', () => {
73
- const reduceSet = Pow2ReduceSet;
74
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
75
- ic.cache = CACHE_MOCK;
76
- const isImgLoaded = ic.imageLoaded(1, 2);
77
- expect(isImgLoaded).toBe(false);
78
- });
79
- test('returns false if image has not loaded', () => {
80
- const reduceSet = Pow2ReduceSet;
81
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
82
- ic.cache = { 1: [{ reduce: 4, loaded: false }] };
83
- const isImgLoaded = ic.imageLoaded(1, 2);
84
- expect(isImgLoaded).toBe(false);
85
- });
86
- });
87
-
88
- describe('`getBestLoadedReduce` call', () => {
89
- test('handles empty cache', () => {
90
- const reduceSet = Pow2ReduceSet;
91
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
92
- ic.cache = {};
93
- expect(ic.getBestLoadedReduce(0)).toBeNull();
94
- });
95
-
96
- test('handles empty page-level cache', () => {
97
- const reduceSet = Pow2ReduceSet;
98
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
99
- ic.cache = { 0: [] };
100
- expect(ic.getBestLoadedReduce(0)).toBeNull();
101
- ic.cache = { 0: [{ reduce: 10, loaded: false }] };
102
- expect(ic.getBestLoadedReduce(0)).toBeNull();
103
- });
104
-
105
- test('chooses highest quality sufficient image', () => {
106
- const reduceSet = Pow2ReduceSet;
107
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
108
- ic.cache = { 0: [{ reduce: 1, loaded: true }, { reduce: 4, loaded: true }, { reduce: 10, loaded: true }] };
109
- expect(ic.getBestLoadedReduce(0, 5)).toBe(10);
110
- });
111
-
112
- test('chooses closest image if no lower images', () => {
113
- const reduceSet = Pow2ReduceSet;
114
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
115
- ic.cache = { 0: [{ reduce: 1, loaded: true }, { reduce: 4, loaded: true }] };
116
- expect(ic.getBestLoadedReduce(0, 5)).toBe(4);
117
- });
118
- });
119
-
120
- describe('`_serveImageElement` call', () => {
121
- test('returns jQuery image element', () => {
122
- const reduceSet = Pow2ReduceSet;
123
- const ic = new ImageCache(new BookModel({ data: SAMPLE_DATA, reduceSet }), reduceSet);
124
- const img = ic._serveImageElement(0);
125
- expect($(img).length).toBe(1);
126
- expect($(img)[0].classList.contains('BRpageimage')).toBe(true);
127
- expect($(img).attr('src')).toBe(FIRST_PAGE_MOCK.uri);
128
- });
129
-
130
- test('does not set srcset when useSrcSet=false', () => {
131
- const reduceSet = Pow2ReduceSet;
132
- const ic = new ImageCache(
133
- new BookModel({ data: SAMPLE_DATA, reduceSet }),
134
- { useSrcSet: false, reduceSet },
135
- );
136
- const $img = ic._serveImageElement(0);
137
- expect($img[0].hasAttribute('srcset')).toBe(false);
138
- });
139
-
140
- test('sets srcset when useSrcSet=true', () => {
141
- const reduceSet = Pow2ReduceSet;
142
- const ic = new ImageCache(
143
- new BookModel({ data: SAMPLE_DATA, reduceSet }),
144
- { useSrcSet: true, reduceSet },
145
- );
146
- const $img = ic._serveImageElement(0, 9);
147
- expect($img.attr('srcset')).toBeTruthy();
148
- });
149
- });
150
- });
@@ -1,73 +0,0 @@
1
- import { BookModel } from '@/src/BookReader/BookModel.js';
2
- import { Mode1UpLit } from '@/src/BookReader/Mode1UpLit.js';
3
-
4
- /** @type {import('@/src/BookReader/options.js').BookReaderOptions['data']} */
5
- const SAMPLE_DATA = [
6
- [
7
- { width: 123, height: 123, uri: 'https://archive.org/image0.jpg', pageNum: '1' },
8
- ],
9
- [
10
- { width: 123, height: 123, uri: 'https://archive.org/image1.jpg', pageNum: '2' },
11
- { width: 123, height: 123, uri: 'https://archive.org/image2.jpg', pageNum: '3' },
12
- ],
13
- [
14
- { width: 123, height: 123, uri: 'https://archive.org/image3.jpg', pageNum: '4' },
15
- { width: 123, height: 123, uri: 'https://archive.org/image4.jpg', pageNum: '5' },
16
- ],
17
- [
18
- { width: 123, height: 123, uri: 'https://archive.org/image5.jpg', pageNum: '6' },
19
- ],
20
- ];
21
-
22
- function make_dummy_br(overrides = {}) {
23
- return Object.assign({
24
- updateFirstIndex() {},
25
- _components: {
26
- navbar: {
27
- updateNavIndexThrottled() {},
28
- },
29
- },
30
- data: [],
31
- }, overrides);
32
- }
33
-
34
- describe('pageTops', () => {
35
- afterEach(() => document.body.innerHTML = '');
36
-
37
- test('Works with empty book', async () => {
38
- const br = make_dummy_br({ data: [] });
39
- const book = new BookModel(br);
40
- const mode = new Mode1UpLit(book, br);
41
- document.body.appendChild(mode);
42
- mode.requestUpdate();
43
- await mode.updateComplete;
44
- expect(mode.pageTops).toEqual({});
45
- });
46
-
47
- test('Iterates all pages', async () => {
48
- const br = make_dummy_br({ data: SAMPLE_DATA });
49
- const book = new BookModel(br);
50
- const mode = new Mode1UpLit(book, br);
51
- document.body.appendChild(mode);
52
- await mode.requestUpdate();
53
- expect(Object.values(mode.pageTops)).toHaveLength(6);
54
- });
55
-
56
- test('Computes tops', async () => {
57
- const br = make_dummy_br({ data: SAMPLE_DATA });
58
- const book = new BookModel(br);
59
- const mode = new Mode1UpLit(book, br);
60
- document.body.appendChild(mode);
61
- await mode.requestUpdate();
62
- const tops = Object.entries(mode.pageTops);
63
- expect(tops.map(([index, top]) => [index, top.toFixed(1)])).toEqual([
64
- // Recall these are in inches
65
- ['0', '0.2'],
66
- ['1', '0.6'],
67
- ['2', '1.1'],
68
- ['3', '1.5'],
69
- ['4', '2.0'],
70
- ['5', '2.4'],
71
- ]);
72
- });
73
- });
@@ -1,98 +0,0 @@
1
-
2
- import sinon from 'sinon';
3
- import { Mode2Up } from '@/src/BookReader/Mode2Up.js';
4
- import BookReader from '@/src/BookReader.js';
5
- import { BookModel } from '@/src/BookReader/BookModel.js';
6
- import { afterEventLoop } from '../utils.js';
7
- /** @typedef {import('@/src/BookReader/options.js').BookReaderOptions} BookReaderOptions */
8
-
9
- beforeAll(() => {
10
- global.alert = jest.fn();
11
- });
12
- afterEach(() => {
13
- jest.restoreAllMocks();
14
- sinon.restore();
15
- });
16
-
17
- /** @type {BookReaderOptions['data']} */
18
- const SAMPLE_DATA = [
19
- [
20
- { width: 123, height: 123, uri: 'https://archive.org/image0.jpg', pageNum: '1' },
21
- ],
22
- [
23
- { width: 123, height: 123, uri: 'https://archive.org/image1.jpg', pageNum: '2' },
24
- { width: 123, height: 123, uri: 'https://archive.org/image2.jpg', pageNum: '3' },
25
- ],
26
- [
27
- { width: 123, height: 123, uri: 'https://archive.org/image3.jpg', pageNum: '4' },
28
- { width: 123, height: 123, uri: 'https://archive.org/image4.jpg', pageNum: '5' },
29
- ],
30
- [
31
- { width: 123, height: 123, uri: 'https://archive.org/image5.jpg', pageNum: '6' },
32
- ],
33
- ];
34
-
35
-
36
- describe('Mode2Up', () => {
37
- /** @type {BookReader} */
38
- let br;
39
- /** @type {BookModel} */
40
- let bookModel;
41
- /** @type {Mode2Up} */
42
- let mode2Up;
43
-
44
- beforeEach(() => {
45
- br = new BookReader({
46
- data: SAMPLE_DATA,
47
- el: document.createElement('div'),
48
- });
49
- br.init();
50
- bookModel = new BookModel(br);
51
- mode2Up = new Mode2Up(br, bookModel);
52
- });
53
-
54
- describe('prepare', () => {
55
- it('initializes DOM properly', async () => {
56
- const spyAppend = sinon.spy(br.refs.$brContainer, 'append');
57
- const spyRequestUpdate = sinon.spy(mode2Up.mode2UpLit, 'requestUpdate');
58
- const initFirstRenderSpy = sinon.spy(mode2Up.mode2UpLit, 'initFirstRender');
59
- const jumpToIndexSpy = sinon.spy(mode2Up.mode2UpLit, 'jumpToIndex');
60
- sinon.stub(mode2Up.mode2UpLit, 'updateComplete').get(() => Promise.resolve());
61
- mode2Up.prepare();
62
-
63
- expect(br.refs.$brContainer[0].style.overflow).toEqual('hidden');
64
- expect(spyAppend.calledWith(mode2Up.$el)).toBe(true);
65
- expect(mode2Up.mode2UpLit.style.opacity).toEqual('0');
66
-
67
- await afterEventLoop();
68
-
69
- expect(initFirstRenderSpy.called).toBe(true);
70
- expect(jumpToIndexSpy.called).toBe(false);
71
- expect(mode2Up.everShown).toBe(true);
72
- expect(spyRequestUpdate.called).toBe(true);
73
- expect(mode2Up.mode2UpLit.style.opacity).toEqual('1');
74
- });
75
- });
76
-
77
- describe('resizePageView', () => {
78
- it('updates autoFit when possible', async () => {
79
- const updateClientSizesSpy = sinon.stub(mode2Up.mode2UpLit.htmlDimensionsCacher, 'updateClientSizes');
80
- const resizeViaAutofitSpy = sinon.spy(mode2Up.mode2UpLit, 'resizeViaAutofit');
81
- const recenterStub = sinon.stub(mode2Up.mode2UpLit, 'recenter');
82
-
83
- mode2Up.resizePageView();
84
- expect(updateClientSizesSpy.called).toBe(true);
85
- expect(resizeViaAutofitSpy.called).toBe(true);
86
- expect(recenterStub.called).toBe(true);
87
-
88
- // Test with scale and autoFit as 'none'
89
- mode2Up.mode2UpLit.scale = 0.1;
90
- mode2Up.mode2UpLit.autoFit = 'none';
91
- mode2Up.resizePageView();
92
-
93
- expect(mode2Up.mode2UpLit.autoFit).toEqual('auto');
94
- expect(resizeViaAutofitSpy.callCount).toEqual(2);
95
- expect(recenterStub.callCount).toEqual(2);
96
- });
97
- });
98
- });