@internetarchive/bookreader 5.0.0-55 → 5.0.0-57

Sign up to get free protection for your applications and to get access to all the features.
@@ -124,7 +124,7 @@ BookReader.prototype.urlStartLocationPolling = function() {
124
124
  */
125
125
  BookReader.prototype.urlUpdateFragment = function() {
126
126
  const allParams = this.paramsFromCurrent();
127
- const { urlMode, urlTrackIndex0, urlTrackedParams } = this.options;
127
+ const { urlTrackIndex0, urlTrackedParams } = this.options;
128
128
 
129
129
  if (!urlTrackIndex0
130
130
  && (typeof(allParams.index) !== 'undefined')
@@ -140,29 +140,36 @@ BookReader.prototype.urlUpdateFragment = function() {
140
140
  return validParams;
141
141
  }, {});
142
142
 
143
- const newFragment = this.fragmentFromParams(params, urlMode);
143
+ const newFragment = this.fragmentFromParams(params, this.options.urlMode);
144
144
  const currFragment = this.urlReadFragment();
145
145
  const currQueryString = this.getLocationSearch();
146
- const newQueryString = this.queryStringFromParams(params, currQueryString, urlMode);
146
+ const newQueryString = this.queryStringFromParams(params, currQueryString, this.options.urlMode);
147
147
  if (currFragment === newFragment && currQueryString === newQueryString) {
148
148
  return;
149
149
  }
150
150
 
151
- if (urlMode === 'history') {
152
- if (window.history && window.history.replaceState) {
151
+ if (this.options.urlMode === 'history') {
152
+ if (!window.history || !window.history.replaceState) {
153
+ this.options.urlMode = 'hash';
154
+ } else {
153
155
  const baseWithoutSlash = this.options.urlHistoryBasePath.replace(/\/+$/, '');
154
156
  const newFragmentWithSlash = newFragment === '' ? '' : `/${newFragment}`;
155
157
 
156
158
  const newUrlPath = `${baseWithoutSlash}${newFragmentWithSlash}${newQueryString}`;
157
- window.history.replaceState({}, null, newUrlPath);
158
- this.oldLocationHash = newFragment + newQueryString;
159
-
159
+ try {
160
+ window.history.replaceState({}, null, newUrlPath);
161
+ this.oldLocationHash = newFragment + newQueryString;
162
+ } catch (e) {
163
+ // DOMException on Chrome when in sandboxed iframe
164
+ this.options.urlMode = 'hash';
165
+ }
160
166
  }
161
- } else {
167
+ }
168
+
169
+ if (this.options.urlMode === 'hash') {
162
170
  const newQueryStringSearch = this.urlParamsFiltersOnlySearch(this.readQueryString());
163
171
  window.location.replace('#' + newFragment + newQueryStringSearch);
164
172
  this.oldLocationHash = newFragment + newQueryStringSearch;
165
-
166
173
  }
167
174
  };
168
175
 
@@ -148,6 +148,9 @@ describe('<book-navigator>', () => {
148
148
  el.bookreader = brStub;
149
149
  await el.elementUpdated;
150
150
 
151
+ el.downloadableTypes = ['foo/bar'];
152
+ await el.elementUpdated;
153
+
151
154
  el.initializeBookSubmenus();
152
155
  await el.elementUpdated;
153
156
  const defaultMenus = Object.keys(el.menuProviders);
@@ -229,6 +232,27 @@ describe('<book-navigator>', () => {
229
232
  expect(baseConfigKeys).toContain('isAdmin');
230
233
  expect(baseConfigKeys).toContain('onProviderChange');
231
234
  });
235
+
236
+ test('Downloads panel - does not show if no available `downloadableTypes`', async () => {
237
+ const el = fixtureSync(container());
238
+ const $brContainer = document.createElement('div');
239
+ const brStub = {
240
+ resize: sinon.fake(),
241
+ currentIndex: sinon.fake(),
242
+ jumpToIndex: sinon.fake(),
243
+ options: {},
244
+ refs: {
245
+ $brContainer
246
+ }
247
+ };
248
+ el.bookreader = brStub;
249
+ await el.elementUpdated;
250
+
251
+ el.initializeBookSubmenus();
252
+ await el.elementUpdated;
253
+ const defaultMenus = Object.keys(el.menuProviders);
254
+ expect(defaultMenus.find(menu => menu === 'downloads')).toBeUndefined;
255
+ });
232
256
  });
233
257
 
234
258
  describe('Controlling Menu Side Panel & Shortcuts', () => {
@@ -114,6 +114,26 @@ describe('Plugin: URL controller', () => {
114
114
  expect(window.history.replaceState).toHaveBeenCalled();
115
115
  });
116
116
 
117
+ test('switches to hashMode if replaceState errors', () => {
118
+ window.history.replaceState = jest.fn(() => {
119
+ throw new Error('foo');
120
+ });
121
+ BookReader.prototype.currentIndex = jest.fn(() => 1);
122
+ BookReader.prototype.urlReadFragment = jest.fn(() => '');
123
+ BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
124
+ index: 1,
125
+ mode: 2,
126
+ view: 'theater'
127
+ }));
128
+ BookReader.prototype.search = jest.fn();
129
+ br.options.urlMode = 'history';
130
+ br.init();
131
+ br.urlUpdateFragment();
132
+
133
+ expect(window.history.replaceState).toHaveBeenCalled();
134
+ expect(br.options.urlMode).toEqual('hash');
135
+ });
136
+
117
137
  test('does not update URL when search in query string', () => {
118
138
  window.history.replaceState = jest.fn();
119
139
  BookReader.prototype.currentIndex = jest.fn(() => 1);