@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,249 +0,0 @@
1
- import {PageContainer, boxToSVGRect, createSVGPageLayer, renderBoxesInPageContainerLayer} from '@/src/BookReader/PageContainer.js';
2
- import {ImageCache} from '@/src/BookReader/ImageCache.js';
3
- import {BookModel} from '@/src/BookReader/BookModel.js';
4
- import { afterEventLoop } from '../utils.js';
5
- import sinon from 'sinon';
6
- /** @typedef {import('@/src/BookReader/options.js').BookReaderOptions} BookReaderOptions */
7
-
8
- const SAMPLE_BOOK = new BookModel(
9
- {
10
- data: [
11
- [
12
- { width: 123, height: 123, uri: 'https://archive.org/image0.jpg', pageNum: '1' },
13
- ],
14
- [
15
- { width: 123, height: 123, uri: 'https://archive.org/image1.jpg', pageNum: '2' },
16
- { width: 123, height: 123, uri: 'https://archive.org/image2.jpg', pageNum: '3' },
17
- ],
18
- [
19
- { width: 123, height: 123, uri: 'https://archive.org/image3.jpg', pageNum: '4' },
20
- { width: 123, height: 123, uri: 'https://archive.org/image4.jpg', pageNum: '5' },
21
- ],
22
- [
23
- { width: 123, height: 123, uri: 'https://archive.org/image5.jpg', pageNum: '6' },
24
- ],
25
- ],
26
- },
27
- );
28
-
29
- const realGetPageURI = SAMPLE_BOOK.getPageURI;
30
- SAMPLE_BOOK.getPageURI = function (index, reduce, rotate) {
31
- // Need to add a reduce url parameter, since the src is used
32
- // for caching
33
- return realGetPageURI.call(SAMPLE_BOOK, index, reduce, rotate) + `?reduce=${reduce}`;
34
- };
35
-
36
- describe('constructor', () => {
37
- test('protected books', () => {
38
- const pc = new PageContainer(null, {isProtected: true});
39
- expect(pc.$container.hasClass('protected')).toBe(true);
40
- expect(pc.$container.find('.BRscreen').length).toBe(1);
41
- });
42
-
43
- test('non-protected books', () => {
44
- const pc = new PageContainer(null, {isProtected: false});
45
- expect(pc.$container.hasClass('protected')).toBe(false);
46
- expect(pc.$container.find('.BRscreen').length).toBe(0);
47
- });
48
-
49
- test('empty page', () => {
50
- const pc = new PageContainer(null, {isProtected: false});
51
- expect(pc.$container.hasClass('BRemptypage')).toBe(true);
52
- });
53
-
54
- test('non-empty page', () => {
55
- const page = {
56
- index: 7,
57
- getPageNum: () => '8',
58
- };
59
- const pc = new PageContainer(page, {isProtected: false});
60
- expect(pc.$container.hasClass('BRemptypage')).toBe(false);
61
- expect(pc.$container.hasClass('pagediv7')).toBe(true);
62
- });
63
-
64
- test('adds attributes', () => {
65
- const page = {
66
- index: 7,
67
- pageSide: 'R',
68
- getPageNum: () => '8',
69
- };
70
- const pc = new PageContainer(page, {isProtected: false});
71
- expect(pc.$container.hasClass('BRemptypage')).toBe(false);
72
- expect(pc.$container.attr('data-side')).toBe('R');
73
- expect(pc.$container.attr('data-index')).toBe('7');
74
- expect(pc.$container.attr('data-page-num')).toBe('8');
75
- });
76
- });
77
-
78
- describe('update', () => {
79
- test('dimensions sets CSS', () => {
80
- const imageCache = new ImageCache(SAMPLE_BOOK);
81
- const pc = new PageContainer(null, {imageCache});
82
- pc.update({ dimensions: { left: 20 } });
83
- expect(pc.$container[0].style.left).toBe('20px');
84
- });
85
-
86
- test('does not create image if empty page', () => {
87
- const imageCache = new ImageCache(SAMPLE_BOOK);
88
- const pc = new PageContainer(null, {imageCache});
89
- pc.update({ reduce: null });
90
- expect(pc.$img).toBeNull();
91
- pc.update({ reduce: 7 });
92
- expect(pc.$img).toBeNull();
93
- });
94
-
95
- test('does not create image if no reduce', () => {
96
- const imageCache = new ImageCache(SAMPLE_BOOK);
97
- const pc = new PageContainer(SAMPLE_BOOK.getPage(3), {imageCache});
98
- pc.update({ reduce: null });
99
- expect(pc.$img).toBeNull();
100
- });
101
-
102
- test('loads image on initial load', () => {
103
- const imageCache = new ImageCache(SAMPLE_BOOK);
104
- const pc = new PageContainer(SAMPLE_BOOK.getPage(3), {imageCache});
105
- pc.update({ reduce: 7 }); // This will load reduce=8 into memory
106
- expect(pc.$container.hasClass('BRpageloading')).toBe(true);
107
- expect(pc.$container.children('.BRpageimage').length).toBe(1);
108
- pc.$img.trigger('load');
109
- expect(pc.$container.hasClass('BRpageloading')).toBe(false);
110
- expect(pc.$container.children('.BRpageimage').length).toBe(1);
111
- });
112
-
113
- test('does not set loading class if already loaded', () => {
114
- const imageCache = new ImageCache(SAMPLE_BOOK);
115
- const pc = new PageContainer(SAMPLE_BOOK.getPage(3), {imageCache});
116
- pc.update({ reduce: 7 }); // This will load reduce=8 into memory
117
- pc.$img.trigger('load');
118
- pc.update({ reduce: 6 }); // This will still load reduce=8
119
- expect(pc.$container.hasClass('BRpageloading')).toBe(false);
120
- expect(pc.$container.children('.BRpageimage').length).toBe(1);
121
- });
122
-
123
- test('removes image between updates only if changed', async () => {
124
- const clock = sinon.useFakeTimers();
125
- const imageCache = new ImageCache(SAMPLE_BOOK);
126
- const pc = new PageContainer(SAMPLE_BOOK.getPage(3), {imageCache});
127
-
128
- // load reduce=8
129
- pc.update({ reduce: 7 });
130
- pc.$img.trigger('load');
131
- const img1 = pc.$img[0];
132
-
133
- // Should not create a new image; same final reduce
134
- pc.update({ reduce: 6 });
135
- expect(pc.$img[0]).toBe(img1);
136
- expect(pc.$container.children('.BRpageimage').length).toBe(1);
137
-
138
- // Should create a new image; different reduce
139
- pc.update({ reduce: 3 });
140
- expect(pc.$img[0]).not.toBe(img1);
141
- expect(pc.$container.children('.BRpageimage').length).toBe(2);
142
-
143
- pc.$img.trigger('load');
144
- // After loading we remove the old image; but not immediately!
145
- expect(pc.$container.children('.BRpageimage').length).toBe(2);
146
- expect(pc.$container.hasClass('BRpageloading')).toBe(false);
147
- // increment time clock 100ms
148
- clock.tick(100);
149
- // wait for promises to resolve
150
- clock.restore();
151
- await afterEventLoop();
152
- // NOW we remove the old image
153
- expect(pc.$container.children('.BRpageimage').length).toBe(1);
154
- });
155
-
156
- test('shows lower res image while loading if one available', () => {
157
- const imageCache = new ImageCache(SAMPLE_BOOK);
158
- const pc = new PageContainer(SAMPLE_BOOK.getPage(3), {imageCache});
159
- pc.update({ reduce: 7 });
160
- pc.$img.trigger('load');
161
-
162
- pc.update({reduce: 2});
163
- expect(pc.$container.hasClass('BRpageloading')).toBe(true);
164
- expect(pc.$container.children('.BRpageimage').length).toBe(2);
165
- expect(pc.$container.children('.BRpageimage')[0].src).toContain('reduce=4');
166
- expect(pc.$img[0].src).toContain('reduce=2');
167
- });
168
- });
169
-
170
- describe('createSVGPageLayer', () => {
171
- test('Does what it says', () => {
172
- const svg = createSVGPageLayer({ width: 100, height: 200}, 'myClass');
173
- expect(svg.getAttribute('viewBox')).toBe('0 0 100 200');
174
- expect(svg.getAttribute('class')).toContain('myClass');
175
- });
176
- });
177
-
178
- describe('boxToSVGRect', () => {
179
- test('Does what it says', () => {
180
- const rect = boxToSVGRect({ l: 100, r: 200, t: 300, b: 500 });
181
- expect(rect.getAttribute('x')).toBe('100');
182
- expect(rect.getAttribute('y')).toBe('300');
183
- expect(rect.getAttribute('width')).toBe('100');
184
- expect(rect.getAttribute('height')).toBe('200');
185
- });
186
- });
187
-
188
- describe('renderBoxesInPageContainerLayer', () => {
189
- test('Handles missing layer', () => {
190
- const container = document.createElement('div');
191
- const page = { width: 100, height: 200 };
192
- const boxes = [{l: 1, r: 2, t: 3, b: 4}];
193
- renderBoxesInPageContainerLayer('foo', boxes, page, container);
194
- expect(container.querySelector('.foo')).toBeTruthy();
195
- expect(container.querySelectorAll('.foo rect').length).toBe(1);
196
- });
197
-
198
- test('Handles existing layer', () => {
199
- const container = document.createElement('div');
200
- const layer = document.createElement('svg');
201
- layer.classList.add('foo');
202
- container.append(layer);
203
-
204
- const page = { width: 100, height: 200 };
205
- const boxes = [{l: 1, r: 2, t: 3, b: 4}];
206
- renderBoxesInPageContainerLayer('foo', boxes, page, container);
207
- expect(container.querySelector('.foo')).toBe(layer);
208
- expect(container.querySelectorAll('.foo rect').length).toBe(1);
209
- });
210
-
211
- test('Adds layer after image if it exists', () => {
212
- const container = document.createElement('div');
213
- const img = document.createElement('img');
214
- img.classList.add('BRpageimage');
215
- container.append(img);
216
-
217
- const page = { width: 100, height: 200 };
218
- const boxes = [{l: 1, r: 2, t: 3, b: 4}];
219
- renderBoxesInPageContainerLayer('foo', boxes, page, container);
220
- expect(container.querySelector('.foo')).toBeTruthy();
221
- expect(container.children[0].getAttribute('class')).toBe('BRpageimage');
222
- expect(container.children[1].getAttribute('class')).toBe('BRPageLayer foo');
223
- });
224
-
225
- test('Renders all boxes', () => {
226
- const container = document.createElement('div');
227
- const page = { width: 100, height: 200 };
228
- const boxes = [{l: 1, r: 2, t: 3, b: 4}, {l: 1, r: 2, t: 3, b: 4}, {l: 1, r: 2, t: 3, b: 4}];
229
- renderBoxesInPageContainerLayer('foo', boxes, page, container);
230
- expect(container.querySelectorAll('.foo rect').length).toBe(3);
231
- });
232
-
233
- test('Adds optional classes', () => {
234
- const container = document.createElement('div');
235
- const page = { width: 100, height: 200 };
236
- const boxes = [{l: 1, r: 2, t: 3, b: 4}, {l: 1, r: 2, t: 3, b: 4}, {l: 1, r: 2, t: 3, b: 4}];
237
- renderBoxesInPageContainerLayer('foo', boxes, page, container, ['match-1', 'match-2', 'match-3']);
238
- const rects = Array.from(container.querySelectorAll('.foo rect'));
239
- expect(rects.map(r => r.getAttribute('class'))).toEqual(['match-1', 'match-2', 'match-3']);
240
- });
241
-
242
- test('Handles no boxes', () => {
243
- const container = document.createElement('div');
244
- const page = { width: 100, height: 200 };
245
- const boxes = [];
246
- renderBoxesInPageContainerLayer('foo', boxes, page, container);
247
- expect(container.querySelectorAll('.foo rect').length).toBe(0);
248
- });
249
- });
@@ -1,38 +0,0 @@
1
- import {IntegerReduceSet, Pow2ReduceSet} from '@/src/BookReader/ReduceSet.js';
2
-
3
- describe('IntegerReduceSet', () => {
4
- test('floor', () => {
5
- const f = IntegerReduceSet.floor;
6
- expect(f(1)).toBe(1);
7
- expect(f(3)).toBe(3);
8
- expect(f(3.1)).toBe(3);
9
- expect(f(3.5)).toBe(3);
10
- expect(f(3.9)).toBe(3);
11
- });
12
-
13
- test('decr', () => {
14
- const f = IntegerReduceSet.decr;
15
- expect(f(1)).toBe(0);
16
- expect(f(3)).toBe(2);
17
- expect(f(0)).toBe(-1);
18
- });
19
- });
20
-
21
- describe('Pow2ReduceSet', () => {
22
- test('floor', () => {
23
- const f = Pow2ReduceSet.floor;
24
- expect(f(1)).toBe(1);
25
- expect(f(3)).toBe(2);
26
- expect(f(3.5)).toBe(2);
27
- expect(f(4.1)).toBe(4);
28
- expect(f(8)).toBe(8);
29
- });
30
-
31
- test('decr', () => {
32
- const f = Pow2ReduceSet.decr;
33
- expect(f(1)).toBe(0.5);
34
- expect(f(2)).toBe(1);
35
- expect(f(4)).toBe(2);
36
- expect(f(8)).toBe(4);
37
- });
38
- });
@@ -1,26 +0,0 @@
1
- import sinon from 'sinon';
2
-
3
- import { createPopup } from '@/src/BookReader/Toolbar/Toolbar.js';
4
-
5
- afterEach(() => {
6
- sinon.restore();
7
- });
8
-
9
- describe('createPopup', () => {
10
- test('calls window.open', () => {
11
- const openStub = sinon.stub(window, 'open');
12
- createPopup('openlibrary.org', 100, 100, 'Open Library');
13
- expect(openStub.callCount).toBe(1);
14
- });
15
-
16
- test('opens in center', () => {
17
- const openStub = sinon.stub(window, 'open');
18
- createPopup('openlibrary.org', 100, 100, 'Open Library');
19
- // jest default window size is 1024x768
20
- expect(openStub.args[0]).toEqual([
21
- 'openlibrary.org',
22
- 'Open Library',
23
- 'status=1,width=100,height=100,top=334,left=462',
24
- ]);
25
- });
26
- });
@@ -1,59 +0,0 @@
1
- // @ts-check
2
- import sinon from 'sinon';
3
- import { HTMLDimensionsCacher } from '@/src/BookReader/utils/HTMLDimensionsCacher.js';
4
-
5
- describe('HTMLDimensionsCacher', () => {
6
- test('Does not read from element directly', () => {
7
- const element = document.createElement('div');
8
- const getBoundingClientRectStub = element.getBoundingClientRect = sinon.stub().returns({ top: 10, left: 20 });
9
- const clientWidthStub = sinon.stub().returns(300);
10
- const clientHeightStub = sinon.stub().returns(500);
11
- Object.defineProperty(element, 'clientWidth', { get: clientWidthStub });
12
- Object.defineProperty(element, 'clientHeight', { get: clientHeightStub });
13
-
14
- const hdc = new HTMLDimensionsCacher(element);
15
- hdc.clientHeight;
16
- expect(getBoundingClientRectStub.callCount).toBe(0);
17
- expect(clientWidthStub.callCount).toBe(0);
18
- expect(clientHeightStub.callCount).toBe(0);
19
- });
20
-
21
- test('Read from element when calling update', () => {
22
- const element = document.createElement('div');
23
- const getBoundingClientRectStub = element.getBoundingClientRect = sinon.stub().returns({ top: 10, left: 20 });
24
- const clientWidthStub = sinon.stub().returns(300);
25
- const clientHeightStub = sinon.stub().returns(500);
26
- Object.defineProperty(element, 'clientWidth', { get: clientWidthStub });
27
- Object.defineProperty(element, 'clientHeight', { get: clientHeightStub });
28
-
29
- const hdc = new HTMLDimensionsCacher(element);
30
- hdc.updateClientSizes();
31
- expect(getBoundingClientRectStub.callCount).toBe(1);
32
- expect(clientWidthStub.callCount).toBe(1);
33
- expect(clientHeightStub.callCount).toBe(1);
34
-
35
- expect(hdc.boundingClientRect).toEqual({ top: 10, left: 20 });
36
- expect(hdc.clientWidth).toBe(300);
37
- expect(hdc.clientHeight).toBe(500);
38
- });
39
-
40
- test('Does not listen for window resizes when not attached', () => {
41
- const element = document.createElement('div');
42
- const hdc = new HTMLDimensionsCacher(element);
43
- const dummyWindow = new EventTarget();
44
- const debouncedUpdateSpy = sinon.spy(hdc, 'debouncedUpdateClientSizes');
45
-
46
- dummyWindow.dispatchEvent(new Event('resize', {}));
47
- expect(debouncedUpdateSpy.callCount).toBe(0);
48
-
49
- hdc.attachResizeListener(dummyWindow);
50
-
51
- dummyWindow.dispatchEvent(new Event('resize', {}));
52
- expect(debouncedUpdateSpy.callCount).toBe(1);
53
-
54
- hdc.detachResizeListener(dummyWindow);
55
-
56
- dummyWindow.dispatchEvent(new Event('resize', {}));
57
- expect(debouncedUpdateSpy.callCount).toBe(1);
58
- });
59
- });
@@ -1,49 +0,0 @@
1
- // @ts-check
2
- import sinon from 'sinon';
3
- import { ScrollClassAdder } from '@/src/BookReader/utils/ScrollClassAdder.js';
4
-
5
- describe('ScrollClassAdder', () => {
6
- test('Does not attach during construction', () => {
7
- const element = document.createElement('div');
8
- const attachSpy = sinon.spy(ScrollClassAdder.prototype, 'attach');
9
- new ScrollClassAdder(element, 'foo');
10
- expect(attachSpy.callCount).toBe(0);
11
- });
12
-
13
- test('Attach/detach call correct methods', () => {
14
- const el = document.createElement('div');
15
- const addEventListenerSpy = sinon.spy(el, 'addEventListener');
16
- const removeEventListenerSpy = sinon.spy(el, 'removeEventListener');
17
- const sca = new ScrollClassAdder(el, 'foo');
18
- expect(addEventListenerSpy.callCount).toBe(0);
19
- sca.attach();
20
- expect(addEventListenerSpy.callCount).toBe(1);
21
- sca.detach();
22
- expect(removeEventListenerSpy.callCount).toBe(1);
23
- });
24
-
25
- test('onScroll adds class at right time', () => {
26
- const clock = sinon.useFakeTimers();
27
- const el = document.createElement('div');
28
- const sca = new ScrollClassAdder(el, 'foo');
29
- expect(el.getAttribute('class')).toBeFalsy();
30
- sca.onScroll();
31
- expect(el.getAttribute('class')).toBe('foo');
32
- clock.tick(600);
33
- expect(el.getAttribute('class')).toBeFalsy();
34
-
35
- sca.onScroll();
36
- expect(el.getAttribute('class')).toBe('foo');
37
- clock.tick(500);
38
- expect(el.getAttribute('class')).toBe('foo');
39
- sca.onScroll();
40
- expect(el.getAttribute('class')).toBe('foo');
41
- clock.tick(100);
42
- expect(el.getAttribute('class')).toBe('foo');
43
- clock.tick(499);
44
- expect(el.getAttribute('class')).toBe('foo');
45
- clock.tick(1);
46
- expect(el.getAttribute('class')).toBeFalsy();
47
- clock.restore();
48
- });
49
- });
@@ -1,57 +0,0 @@
1
- // @ts-check
2
- import sinon from "sinon";
3
- import { SelectionObserver } from "@/src/BookReader/utils/SelectionObserver.js";
4
-
5
- afterEach(() => {
6
- sinon.restore();
7
- });
8
-
9
- describe("SelectionObserver", () => {
10
- test("_onSelectionChange", () => {
11
- const handler = sinon.spy();
12
- const observer = new SelectionObserver(".text-layer", handler);
13
- const target = document.createElement("div");
14
- target.classList.add("text-layer");
15
-
16
- // stub window.getSelection
17
- const getSelectionStub = sinon.stub(window, "getSelection");
18
- getSelectionStub.returns({ toString: () => "test", anchorNode: target });
19
- observer._onSelectionChange();
20
- expect(handler.callCount).toBe(1);
21
- expect(handler.calledWith("started", target)).toBe(true);
22
- expect(observer.selecting).toBe(true);
23
-
24
- // Calling it again does not call the handler again
25
- observer._onSelectionChange();
26
- expect(handler.callCount).toBe(1);
27
-
28
- // Until the selection is cleared
29
- getSelectionStub.returns({ toString: () => "", anchorNode: null });
30
- expect(observer.selecting).toBe(true);
31
- expect(handler.callCount).toBe(1);
32
-
33
- observer._onSelectionChange();
34
- expect(handler.callCount).toBe(2);
35
- expect(handler.calledWith("cleared", target)).toBe(true);
36
-
37
- // Calling it again does not call the handler again
38
- sinon.restore();
39
- sinon.stub(window, "getSelection").returns({ toString: () => "" });
40
- observer._onSelectionChange();
41
- expect(handler.callCount).toBe(2);
42
- });
43
-
44
- test('Only fires when selection started in selector', () => {
45
- const handler = sinon.spy();
46
- const observer = new SelectionObserver(".text-layer", handler);
47
- const target = document.createElement("div");
48
- target.classList.add("text-layer");
49
-
50
- // stub window.getSelection
51
- const getSelectionStub = sinon.stub(window, "getSelection");
52
- getSelectionStub.returns({ toString: () => "test", anchorNode: document.body });
53
- observer._onSelectionChange();
54
- expect(handler.callCount).toBe(0);
55
- expect(observer.selecting).toBe(false);
56
- });
57
- });
@@ -1,88 +0,0 @@
1
- import { exposeOverrideable } from '@/src/BookReader/utils/classes.js';
2
-
3
- describe('exposeOverrideable', () => {
4
- test('adds method to To class', () => {
5
- class From { foo() { return 3; } }
6
- class To { }
7
- exposeOverrideable(From, 'foo', x => x, To, 'foo', x => x);
8
- expect(To.prototype).toHaveProperty('foo');
9
- expect(new To().foo()).toBe(3);
10
- });
11
-
12
- test('modifying To method modifies original class', () => {
13
- class From { foo() { return 3; } }
14
- class To { }
15
- const originalFoo = From.prototype.foo;
16
- exposeOverrideable(From, 'foo', x => x, To, 'foo', x => x);
17
- To.prototype.foo = () => 7;
18
- expect(originalFoo).not.toBe(From.prototype.foo);
19
- expect(new To().foo()).toBe(7);
20
- expect(new From().foo()).toBe(7);
21
- });
22
-
23
- test('can transform this', () => {
24
- class From { foo() { return this; } }
25
- class To { }
26
- exposeOverrideable(From, 'foo', x => 'fake-this1', To, 'foo', x => 'fake-this2');
27
- const f = new From();
28
- expect(f.foo()).toBe(f);
29
- expect(new To().foo()).toBe('fake-this2');
30
- });
31
-
32
- test('can transform this both ways if overriden', () => {
33
- class From { foo() { return [this]; } }
34
- class To { }
35
- exposeOverrideable(From, 'foo', x => 'fake-this1', To, 'foo', x => 'fake-this2');
36
- // Override pattern common in bookreader
37
- To.prototype.foo = function(_super) {
38
- return function() {
39
- return [this, ..._super.call(this)];
40
- };
41
- }(To.prototype.foo);
42
-
43
- const calledFromTo = new To().foo();
44
- expect(calledFromTo).toHaveLength(2);
45
- expect(calledFromTo[0]).toBeInstanceOf(To);
46
- expect(calledFromTo[1]).toBe('fake-this2');
47
-
48
- const calledFromFrom = new From().foo();
49
- expect(calledFromFrom).toHaveLength(2);
50
- expect(calledFromFrom[0]).toBe('fake-this1');
51
- expect(calledFromFrom[1]).toBe('fake-this2');
52
- });
53
-
54
- test('BookReader override pattern', () => {
55
- class Component {
56
- constructor(br) { this.br = br; }
57
- createButton() { return 'root button'; }
58
- // need to test that when called through a
59
- // Component method, that it work correctly
60
- initToolbar() { return [this.createButton()]; }
61
- }
62
- class BookReader {
63
- constructor() {
64
- this.component = new Component(this);
65
- }
66
- }
67
-
68
- exposeOverrideable(Component, 'createButton', c => c.br, BookReader, 'createButton', br => br.component);
69
-
70
- expect(new BookReader().createButton()).toBe('root button');
71
- expect(new BookReader().component.initToolbar()).toEqual(['root button']);
72
-
73
- // And then a bunch of plugins come along!
74
- for (const plugin of ['plugin 1', 'plugin 2']) {
75
- BookReader.prototype.createButton = function(_super) {
76
- return function() {
77
- return plugin + ' ' + _super.call(this);
78
- };
79
- }(BookReader.prototype.createButton);
80
- }
81
-
82
- const br = new BookReader();
83
- expect(br.createButton()).toBe('plugin 2 plugin 1 root button');
84
- expect(br.component.createButton()).toBe('plugin 2 plugin 1 root button');
85
- // Calls the overridden method on BookReader!
86
- expect(br.component.initToolbar()).toEqual(['plugin 2 plugin 1 root button']);
87
- });
88
- });