@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.
- package/.github/workflows/npm-publish.yml +2 -12
- package/CHANGELOG.md +7 -0
- package/README.md +0 -2
- package/package.json +1 -1
- package/scripts/version.js +0 -3
- package/BookReader/BookReader.css +0 -2251
- package/BookReader/BookReader.js +0 -3
- package/BookReader/BookReader.js.LICENSE.txt +0 -72
- package/BookReader/BookReader.js.map +0 -1
- package/BookReader/ia-bookreader-bundle.js +0 -1782
- package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +0 -7
- package/BookReader/ia-bookreader-bundle.js.map +0 -1
- package/BookReader/icons/1up.svg +0 -1
- package/BookReader/icons/2up.svg +0 -1
- package/BookReader/icons/advance.svg +0 -3
- package/BookReader/icons/chevron-right.svg +0 -1
- package/BookReader/icons/close-circle-dark.svg +0 -1
- package/BookReader/icons/close-circle.svg +0 -1
- package/BookReader/icons/fullscreen.svg +0 -1
- package/BookReader/icons/fullscreen_exit.svg +0 -1
- package/BookReader/icons/hamburger.svg +0 -1
- package/BookReader/icons/left-arrow.svg +0 -1
- package/BookReader/icons/magnify-minus.svg +0 -1
- package/BookReader/icons/magnify-plus.svg +0 -1
- package/BookReader/icons/magnify.svg +0 -1
- package/BookReader/icons/pause.svg +0 -1
- package/BookReader/icons/play.svg +0 -1
- package/BookReader/icons/playback-speed.svg +0 -1
- package/BookReader/icons/read-aloud.svg +0 -1
- package/BookReader/icons/review.svg +0 -3
- package/BookReader/icons/thumbnails.svg +0 -1
- package/BookReader/icons/voice.svg +0 -1
- package/BookReader/icons/volume-full.svg +0 -1
- package/BookReader/images/BRicons.png +0 -0
- package/BookReader/images/BRicons.svg +0 -5
- package/BookReader/images/BRicons_ia.png +0 -0
- package/BookReader/images/back_pages.png +0 -0
- package/BookReader/images/book_bottom_icon.png +0 -0
- package/BookReader/images/book_down_icon.png +0 -0
- package/BookReader/images/book_left_icon.png +0 -0
- package/BookReader/images/book_leftmost_icon.png +0 -0
- package/BookReader/images/book_right_icon.png +0 -0
- package/BookReader/images/book_rightmost_icon.png +0 -0
- package/BookReader/images/book_top_icon.png +0 -0
- package/BookReader/images/book_up_icon.png +0 -0
- package/BookReader/images/books_graphic.svg +0 -1
- package/BookReader/images/booksplit.png +0 -0
- package/BookReader/images/control_pause_icon.png +0 -0
- package/BookReader/images/control_play_icon.png +0 -0
- package/BookReader/images/embed_icon.png +0 -0
- package/BookReader/images/hypothesis.ico +0 -0
- package/BookReader/images/icon-home-ia.png +0 -0
- package/BookReader/images/icon_OL-logo-xs.png +0 -0
- package/BookReader/images/icon_alert-xs.png +0 -0
- package/BookReader/images/icon_book.svg +0 -1
- package/BookReader/images/icon_bookmark.svg +0 -1
- package/BookReader/images/icon_close-pop.png +0 -0
- package/BookReader/images/icon_download.png +0 -0
- package/BookReader/images/icon_gear.svg +0 -1
- package/BookReader/images/icon_hamburger.svg +0 -1
- package/BookReader/images/icon_home.png +0 -0
- package/BookReader/images/icon_home.svg +0 -1
- package/BookReader/images/icon_home_ia.png +0 -0
- package/BookReader/images/icon_indicator.png +0 -0
- package/BookReader/images/icon_info.svg +0 -1
- package/BookReader/images/icon_one_page.svg +0 -1
- package/BookReader/images/icon_pause.svg +0 -1
- package/BookReader/images/icon_play.svg +0 -1
- package/BookReader/images/icon_playback-rate.svg +0 -1
- package/BookReader/images/icon_return.png +0 -0
- package/BookReader/images/icon_search_button.svg +0 -1
- package/BookReader/images/icon_share.svg +0 -1
- package/BookReader/images/icon_skip-ahead.svg +0 -1
- package/BookReader/images/icon_skip-back.svg +0 -2
- package/BookReader/images/icon_speaker.svg +0 -1
- package/BookReader/images/icon_speaker_open.svg +0 -1
- package/BookReader/images/icon_thumbnails.svg +0 -1
- package/BookReader/images/icon_toc.svg +0 -1
- package/BookReader/images/icon_two_pages.svg +0 -1
- package/BookReader/images/icon_zoomer.png +0 -0
- package/BookReader/images/loading.gif +0 -0
- package/BookReader/images/logo_icon.png +0 -0
- package/BookReader/images/marker_chap-off.png +0 -0
- package/BookReader/images/marker_chap-off.svg +0 -1
- package/BookReader/images/marker_chap-off_ia.png +0 -0
- package/BookReader/images/marker_chap-on.png +0 -0
- package/BookReader/images/marker_chap-on.svg +0 -1
- package/BookReader/images/marker_srch-on.svg +0 -1
- package/BookReader/images/marker_srchchap-off.png +0 -0
- package/BookReader/images/marker_srchchap-on.png +0 -0
- package/BookReader/images/nav_control-dn.png +0 -0
- package/BookReader/images/nav_control-dn_ia.png +0 -0
- package/BookReader/images/nav_control-up.png +0 -0
- package/BookReader/images/nav_control-up_ia.png +0 -0
- package/BookReader/images/nav_control.png +0 -0
- package/BookReader/images/one_page_mode_icon.png +0 -0
- package/BookReader/images/paper-badge.png +0 -0
- package/BookReader/images/print_icon.png +0 -0
- package/BookReader/images/progressbar.gif +0 -0
- package/BookReader/images/right_edges.png +0 -0
- package/BookReader/images/slider.png +0 -0
- package/BookReader/images/slider_ia.png +0 -0
- package/BookReader/images/thumbnail_mode_icon.png +0 -0
- package/BookReader/images/transparent.png +0 -0
- package/BookReader/images/two_page_mode_icon.png +0 -0
- package/BookReader/images/unviewable_page.png +0 -0
- package/BookReader/images/zoom_in_icon.png +0 -0
- package/BookReader/images/zoom_out_icon.png +0 -0
- package/BookReader/jquery-3.js +0 -2
- package/BookReader/jquery-3.js.LICENSE.txt +0 -24
- package/BookReader/plugins/plugin.archive_analytics.js +0 -2
- package/BookReader/plugins/plugin.archive_analytics.js.map +0 -1
- package/BookReader/plugins/plugin.autoplay.js +0 -2
- package/BookReader/plugins/plugin.autoplay.js.map +0 -1
- package/BookReader/plugins/plugin.chapters.js +0 -26
- package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +0 -1
- package/BookReader/plugins/plugin.chapters.js.map +0 -1
- package/BookReader/plugins/plugin.experiments.js +0 -3
- package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +0 -1
- package/BookReader/plugins/plugin.experiments.js.map +0 -1
- package/BookReader/plugins/plugin.iframe.js +0 -2
- package/BookReader/plugins/plugin.iframe.js.map +0 -1
- package/BookReader/plugins/plugin.iiif.js +0 -2
- package/BookReader/plugins/plugin.iiif.js.map +0 -1
- package/BookReader/plugins/plugin.resume.js +0 -2
- package/BookReader/plugins/plugin.resume.js.map +0 -1
- package/BookReader/plugins/plugin.search.js +0 -3
- package/BookReader/plugins/plugin.search.js.LICENSE.txt +0 -1
- package/BookReader/plugins/plugin.search.js.map +0 -1
- package/BookReader/plugins/plugin.text_selection.js +0 -3
- package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +0 -1
- package/BookReader/plugins/plugin.text_selection.js.map +0 -1
- package/BookReader/plugins/plugin.tts.js +0 -3
- package/BookReader/plugins/plugin.tts.js.LICENSE.txt +0 -29
- package/BookReader/plugins/plugin.tts.js.map +0 -1
- package/BookReader/plugins/plugin.url.js +0 -2
- package/BookReader/plugins/plugin.url.js.map +0 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js +0 -2
- package/BookReader/plugins/plugin.vendor-fullscreen.js.map +0 -1
- package/BookReader/webcomponents-bundle.js +0 -3
- package/BookReader/webcomponents-bundle.js.LICENSE.txt +0 -9
- package/BookReader/webcomponents-bundle.js.map +0 -1
- package/src/BookReader/BookModel.js +0 -564
- package/src/BookReader/DragScrollable.js +0 -233
- package/src/BookReader/ImageCache.js +0 -149
- package/src/BookReader/Mode1Up.js +0 -110
- package/src/BookReader/Mode1UpLit.js +0 -388
- package/src/BookReader/Mode2Up.js +0 -107
- package/src/BookReader/Mode2UpLit.js +0 -777
- package/src/BookReader/ModeCoordinateSpace.js +0 -29
- package/src/BookReader/ModeSmoothZoom.js +0 -312
- package/src/BookReader/ModeThumb.js +0 -344
- package/src/BookReader/Navbar/Navbar.js +0 -355
- package/src/BookReader/PageContainer.js +0 -172
- package/src/BookReader/ReduceSet.js +0 -26
- package/src/BookReader/Toolbar/Toolbar.js +0 -362
- package/src/BookReader/events.js +0 -19
- package/src/BookReader/options.js +0 -387
- package/src/BookReader/utils/HTMLDimensionsCacher.js +0 -44
- package/src/BookReader/utils/ScrollClassAdder.js +0 -31
- package/src/BookReader/utils/SelectionObserver.js +0 -45
- package/src/BookReader/utils/classes.js +0 -36
- package/src/BookReader/utils.js +0 -313
- package/tests/jest/BookReader/BookModel.test.js +0 -372
- package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +0 -263
- package/tests/jest/BookReader/ImageCache.test.js +0 -150
- package/tests/jest/BookReader/Mode1UpLit.test.js +0 -73
- package/tests/jest/BookReader/Mode2Up.test.js +0 -98
- package/tests/jest/BookReader/Mode2UpLit.test.js +0 -190
- package/tests/jest/BookReader/ModeCoordinateSpace.test.js +0 -16
- package/tests/jest/BookReader/ModeSmoothZoom.test.js +0 -218
- package/tests/jest/BookReader/ModeThumb.test.js +0 -71
- package/tests/jest/BookReader/Navbar/Navbar.test.js +0 -182
- package/tests/jest/BookReader/PageContainer.test.js +0 -249
- package/tests/jest/BookReader/ReduceSet.test.js +0 -38
- package/tests/jest/BookReader/Toolbar/Toolbar.test.js +0 -26
- package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +0 -59
- package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +0 -49
- package/tests/jest/BookReader/utils/SelectionObserver.test.js +0 -57
- package/tests/jest/BookReader/utils/classes.test.js +0 -88
- 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
|
-
});
|