@internetarchive/bookreader 5.0.0-46-no-right-click → 5.0.0-46-no-right-click-2

Sign up to get free protection for your applications and to get access to all the features.
@@ -130,6 +130,8 @@
130
130
  // analytics stub
131
131
  window.archive_analytics = {
132
132
  send_event_no_sampling: (category, action, label) => console.log('~~~ NO SAMPLE EVENT CALLED: ', { category, action, label }),
133
+ send_event: (category, action, label) => console.log('~~~ send_event SAMPLE EVENT CALLED: ', { category, action, label }),
134
+ send_ping: (category, action, label) => console.log('~~~ send_ping SAMPLE EVENT CALLED: ', { category, action, label }),
133
135
  }
134
136
  </script>
135
137
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@internetarchive/bookreader",
3
- "version": "5.0.0-46-no-right-click",
3
+ "version": "5.0.0-46-no-right-click-2",
4
4
  "description": "The Internet Archive BookReader.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -13,9 +13,8 @@ import VolumesProvider from '@/src/BookNavigator/volumes/volumes-provider.js';
13
13
  import { ModalManager } from '@internetarchive/modal-manager';
14
14
  import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
15
15
  import '@/src/BookNavigator/book-navigator.js';
16
- import { sleep } from '@/src/BookReader/utils';
17
16
 
18
- const promise0 = () => new Promise((res) => setTimeout(res, 0));
17
+ const promise0 = () => new Promise(res => setTimeout(res, 0));
19
18
 
20
19
  const container = (sharedObserver = null) => {
21
20
  const itemStub = {
@@ -23,7 +22,7 @@ const container = (sharedObserver = null) => {
23
22
  identifier: 'foo',
24
23
  creator: 'bar',
25
24
  title: 'baz',
26
- },
25
+ }
27
26
  };
28
27
  const modalMgr = new ModalManager();
29
28
  return html`
@@ -33,18 +32,18 @@ const container = (sharedObserver = null) => {
33
32
  .sharedObserver=${sharedObserver || new SharedResizeObserver()}
34
33
  .modal=${modalMgr}
35
34
  >
36
- <div slot='main'>
37
- <div id='BookReader'></div>
38
- <p class='visible-in-reader'>now showing</p>
35
+ <div slot="main">
36
+ <div id="BookReader"></div>
37
+ <p class="visible-in-reader">now showing</p>
39
38
  <\div>
40
39
  </book-navigator>
41
40
  `;
42
41
  };
43
42
 
44
43
  window.ResizeObserver = class ResizeObserver {
45
- observe = sinon.fake();
46
- unobserve = sinon.fake();
47
- disconnect = sinon.fake();
44
+ observe = sinon.fake()
45
+ unobserve = sinon.fake()
46
+ disconnect = sinon.fake()
48
47
  };
49
48
 
50
49
  afterEach(() => {
@@ -53,11 +52,11 @@ afterEach(() => {
53
52
  const body = document.querySelector('body');
54
53
  body.innerHTML = '';
55
54
  sinon.restore();
56
- window.archive_analytics = null;
57
55
  });
58
56
 
57
+
59
58
  describe('<book-navigator>', () => {
60
- describe('How it loads', () => {
59
+ describe("How it loads", () => {
61
60
  describe('Attaches BookReader listeners before `br.init` is called', () => {
62
61
  test('binds global event listeners', async () => {
63
62
  const el = fixtureSync(container());
@@ -72,7 +71,7 @@ describe('<book-navigator>', () => {
72
71
  jumpToIndex: sinon.fake(),
73
72
  options: { enableMultipleBooks: false }, // for multipleBooks
74
73
  el: '#BookReader',
75
- refs: {},
74
+ refs: {}
76
75
  };
77
76
 
78
77
  const sharedObserver = new SharedResizeObserver();
@@ -86,11 +85,9 @@ describe('<book-navigator>', () => {
86
85
 
87
86
  expect(brStub.resize.callCount).toEqual(0);
88
87
 
89
- window.dispatchEvent(
90
- new CustomEvent('BookReader:PostInit', {
91
- detail: { props: brStub },
92
- })
93
- );
88
+ window.dispatchEvent(new CustomEvent('BookReader:PostInit', {
89
+ detail: { props: brStub }
90
+ }));
94
91
  await elementUpdated(el);
95
92
 
96
93
  expect(el.emitLoadingStatusUpdate.callCount).toEqual(1);
@@ -123,15 +120,13 @@ describe('<book-navigator>', () => {
123
120
  const itemImage = fixtureSync(el.itemImage);
124
121
  expect(itemImage).toBeInstanceOf(HTMLImageElement);
125
122
  expect(itemImage.getAttribute('class')).toEqual('cover-img');
126
- expect(itemImage.getAttribute('src')).toEqual(
127
- 'https://https://foo.archive.org/services/img/foo'
128
- );
123
+ expect(itemImage.getAttribute('src')).toEqual('https://https://foo.archive.org/services/img/foo');
129
124
  });
130
125
  });
131
126
  describe('Menu/Layer Provider', () => {
132
127
  describe('Connecting with a provider:', () => {
133
128
  // loads Providers with base shared resources
134
- test('We load 3 Sub Menus by default', async () => {
129
+ test('We load 3 Sub Menus by default', async() => {
135
130
  const el = fixtureSync(container());
136
131
  const $brContainer = document.createElement('div');
137
132
  const brStub = {
@@ -140,8 +135,8 @@ describe('<book-navigator>', () => {
140
135
  jumpToIndex: sinon.fake(),
141
136
  options: {},
142
137
  refs: {
143
- $brContainer,
144
- },
138
+ $brContainer
139
+ }
145
140
  };
146
141
  el.bookreader = brStub;
147
142
  await el.elementUpdated;
@@ -156,12 +151,10 @@ describe('<book-navigator>', () => {
156
151
  expect(el.menuProviders.share).toBeInstanceOf(SharingProvider);
157
152
 
158
153
  expect(defaultMenus).toContain('visualAdjustments');
159
- expect(el.menuProviders.visualAdjustments).toBeInstanceOf(
160
- VisualAdjustmentsProvider
161
- );
154
+ expect(el.menuProviders.visualAdjustments).toBeInstanceOf(VisualAdjustmentsProvider);
162
155
  });
163
156
  describe('Loading Sub Menus By Plugin Flags', () => {
164
- test('Search: uses `enableSearch` flag', async () => {
157
+ test('Search: uses `enableSearch` flag', async() => {
165
158
  const el = fixtureSync(container());
166
159
  const $brContainer = document.createElement('div');
167
160
  const brStub = {
@@ -170,8 +163,8 @@ describe('<book-navigator>', () => {
170
163
  jumpToIndex: sinon.fake(),
171
164
  options: { enableSearch: true },
172
165
  refs: {
173
- $brContainer,
174
- },
166
+ $brContainer
167
+ }
175
168
  };
176
169
  el.bookreader = brStub;
177
170
  await el.elementUpdated;
@@ -183,9 +176,9 @@ describe('<book-navigator>', () => {
183
176
  expect(el.menuProviders.search).toBeInstanceOf(SearchProvider);
184
177
 
185
178
  // also adds a menu shortcut
186
- expect(el.menuShortcuts.find((m) => m.id === 'search')).toBeDefined();
179
+ expect(el.menuShortcuts.find(m => m.id === 'search')).toBeDefined();
187
180
  });
188
- test('Volumes/Multiple Books: uses `enableMultipleBooks` flag', async () => {
181
+ test('Volumes/Multiple Books: uses `enableMultipleBooks` flag', async() => {
189
182
  const el = fixtureSync(container());
190
183
  const $brContainer = document.createElement('div');
191
184
  const brStub = {
@@ -196,13 +189,13 @@ describe('<book-navigator>', () => {
196
189
  enableMultipleBooks: true,
197
190
  multipleBooksList: {
198
191
  by_subprefix: {
199
- fooSubprefix: 'beep',
200
- },
201
- },
192
+ fooSubprefix: 'beep'
193
+ }
194
+ }
202
195
  },
203
196
  refs: {
204
- $brContainer,
205
- },
197
+ $brContainer
198
+ }
206
199
  };
207
200
  el.bookreader = brStub;
208
201
  await el.elementUpdated;
@@ -214,9 +207,7 @@ describe('<book-navigator>', () => {
214
207
  expect(el.menuProviders.volumes).toBeInstanceOf(VolumesProvider);
215
208
 
216
209
  // also adds a menu shortcut
217
- expect(
218
- el.menuShortcuts.find((m) => m.id === 'volumes')
219
- ).toBeDefined();
210
+ expect(el.menuShortcuts.find(m => m.id === 'volumes')).toBeDefined();
220
211
  });
221
212
  });
222
213
  test('keeps track of base shared resources for providers in: `baseProviderConfig`', () => {
@@ -324,9 +315,7 @@ describe('<book-navigator>', () => {
324
315
  console.log();
325
316
  sidePanelConfig = e.detail;
326
317
  });
327
- const toggleSearchMenuEvent = new Event(
328
- 'BookReader:ToggleSearchMenu'
329
- );
318
+ const toggleSearchMenuEvent = new Event('BookReader:ToggleSearchMenu');
330
319
  window.dispatchEvent(toggleSearchMenuEvent);
331
320
 
332
321
  await elementUpdated(el);
@@ -338,15 +327,15 @@ describe('<book-navigator>', () => {
338
327
  });
339
328
  });
340
329
 
341
- describe('Resizing', () => {
330
+ describe('Resizing',() => {
342
331
  test('keeps track of `brWidth` and `brHeight`', async () => {
343
332
  const el = fixtureSync(container());
344
333
  const brStub = {
345
334
  resize: sinon.fake(),
346
335
  options: {},
347
336
  refs: {
348
- $brContainer: document.createElement('div'),
349
- },
337
+ $brContainer: document.createElement('div')
338
+ }
350
339
  };
351
340
  el.bookreader = brStub;
352
341
  await elementUpdated(el);
@@ -356,9 +345,9 @@ describe('<book-navigator>', () => {
356
345
  const mockResizeEvent = {
357
346
  contentRect: {
358
347
  height: 500,
359
- width: 900,
348
+ width: 900
360
349
  },
361
- target: el.mainBRContainer,
350
+ target: el.mainBRContainer
362
351
  };
363
352
  el.handleResize(mockResizeEvent);
364
353
 
@@ -375,8 +364,8 @@ describe('<book-navigator>', () => {
375
364
  resize: sinon.fake(),
376
365
  options: {},
377
366
  refs: {
378
- $brContainer: document.createElement('div'),
379
- },
367
+ $brContainer: document.createElement('div')
368
+ }
380
369
  };
381
370
 
382
371
  el.bookreader = brStub;
@@ -481,7 +470,7 @@ describe('<book-navigator>', () => {
481
470
 
482
471
  expect(el.closeFullscreen.callCount).toEqual(1);
483
472
  });
484
- test('removes Fullscreen shortcut when leaving fullscreen', async () => {
473
+ test('removes Fullscreen shortcut when leaving fullscreen', async() => {
485
474
  const el = fixtureSync(container());
486
475
  const brStub = {
487
476
  isFullscreen: () => false,
@@ -500,7 +489,7 @@ describe('<book-navigator>', () => {
500
489
  expect(el.menuShortcuts.length).toEqual(0);
501
490
  expect(el.emitMenuShortcutsUpdated.callCount).toEqual(1);
502
491
  });
503
- test('Event: Listens for `BookReader:FullscreenToggled', async () => {
492
+ test('Event: Listens for `BookReader:FullscreenToggled', async() => {
504
493
  const el = fixtureSync(container());
505
494
  const brStub = {
506
495
  isFullscreen: () => true,
@@ -602,5 +591,40 @@ describe('<book-navigator>', () => {
602
591
  expect(preventDefaultSpy.called).toEqual(true);
603
592
  });
604
593
  });
594
+ it('Allows unrestricted books access to context menu', async () => {
595
+ window.archive_analytics = { send_event_no_sampling: sinon.fake() };
596
+
597
+ const el = fixtureSync(container());
598
+ const brStub = {
599
+ options: { restricted: false },
600
+ };
601
+
602
+ el.bookreader = brStub;
603
+ el.bookIsRestricted = false;
604
+
605
+ await el.elementUpdated;
606
+
607
+ expect(window.archive_analytics.send_event_no_sampling.called).toEqual(
608
+ false
609
+ );
610
+
611
+ const body = document.querySelector('body');
612
+ // const element stub for img.BRpageimage
613
+ const imgBRpageimage = document.createElement('img');
614
+ imgBRpageimage.classList.add('not-targeted-element');
615
+ body.appendChild(imgBRpageimage);
616
+ const contextMenuEvent = new Event('contextmenu', { bubbles: true });
617
+
618
+ // Set spy on contextMenuEvent to check if `preventDefault` is called
619
+ const preventDefaultSpy = sinon.spy(contextMenuEvent, 'preventDefault');
620
+ expect(preventDefaultSpy.called).toEqual(false);
621
+
622
+ imgBRpageimage.dispatchEvent(contextMenuEvent);
623
+
624
+ // analytics fires
625
+ expect(window.archive_analytics.send_event_no_sampling.called).toEqual(true);
626
+ // we do not prevent default
627
+ expect(preventDefaultSpy.called).toEqual(false);
628
+ });
605
629
  });
606
630
  });