Skip to content

Commit 8275df0

Browse files
ZhijieZhangjustinjung04
authored andcommitted
[update] Display error when mime type is set up correctly but missing actual worker files to load a document (#104)
1 parent e4f6a7e commit 8275df0

File tree

5 files changed

+93
-39
lines changed

5 files changed

+93
-39
lines changed

src/helpers/fireEvent.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { isIE11 } from 'helpers/device';
2+
3+
const fireEvent = (eventName, data) => {
4+
let event;
5+
if (CustomEvent && !isIE11) {
6+
event = new CustomEvent(eventName, { detail: data, bubbles: true, cancelable: true });
7+
} else {
8+
event = document.createEvent('Event');
9+
event.initEvent(eventName, true, true);
10+
event.detail = data;
11+
}
12+
window.dispatchEvent(event);
13+
};
14+
15+
export default fireEvent;
16+
export const fireError = message => {
17+
fireEvent('loaderror', message);
18+
};

src/helpers/loadDocument.js

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import i18next from 'i18next';
22

33
import core from 'core';
44
import getBackendPromise from 'helpers/getBackendPromise';
5-
import { isIE11 } from 'helpers/device';
5+
import { fireError } from 'helpers/fireEvent';
66
import { engineTypes, documentTypes } from 'constants/types';
77
import { supportedPDFExtensions, supportedOfficeExtensions, supportedBlackboxExtensions } from 'constants/supportedFiles';
88
import actions from 'actions';
@@ -227,7 +227,7 @@ const getEngineType = state => {
227227
}
228228
};
229229

230-
const getDocumentExtension = doc => {
230+
export const getDocumentExtension = doc => {
231231
let extension;
232232
if (doc) {
233233
const pdfExtensions = supportedPDFExtensions.join('|');
@@ -245,7 +245,7 @@ const getDocumentExtension = doc => {
245245
return extension;
246246
};
247247

248-
const getDocName = state => {
248+
export const getDocName = state => {
249249
// if the filename is specified then use that for checking the extension instead of the doc path
250250
const { path, filename, initialDoc } = state.document;
251251
return filename || path || initialDoc;
@@ -255,11 +255,11 @@ const isPDFNetJSExtension = extension => {
255255
return isOfficeExtension(extension) || isPDFExtension(extension);
256256
};
257257

258-
const isOfficeExtension = extension => {
258+
export const isOfficeExtension = extension => {
259259
return supportedOfficeExtensions.indexOf(extension) !== -1;
260260
};
261261

262-
const isPDFExtension = extension => {
262+
export const isPDFExtension = extension => {
263263
return supportedPDFExtensions.indexOf(extension) !== -1;
264264
};
265265

@@ -296,25 +296,9 @@ const getDocTypeData = ({ docName, pdfBackendType, officeBackendType, engineType
296296
return { type, extension, workerTransportPromise };
297297
};
298298

299-
const fireError = message => {
300-
fireEvent('loaderror', message);
301-
};
302-
303299
const isLocalFile = state => {
304300
const path = selectors.getDocumentPath(state);
305-
301+
306302
return !/https?:\/\//.test(path);
307303
};
308304

309-
export const fireEvent = (eventName, data) => {
310-
let event;
311-
if (CustomEvent && !isIE11) {
312-
event = new CustomEvent(eventName, { detail: data, bubbles: true, cancelable: true });
313-
} else {
314-
event = document.createEvent('Event');
315-
event.initEvent(eventName, true, true);
316-
event.detail = data;
317-
}
318-
window.dispatchEvent(event);
319-
};
320-

src/helpers/setupMIMETypeTest.js

Lines changed: 67 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,93 @@
1-
export default () => {
1+
import { fireError } from 'helpers/fireEvent';
2+
import { getDocName, getDocumentExtension, isOfficeExtension, isPDFExtension } from 'helpers/loadDocument';
3+
4+
export default store => {
25
window.addEventListener('error', e => {
36
const { src } = e.target;
4-
7+
58
if (!src) {
69
// in Safari, an error occurred in web workers will also trigger this event
710
// since we handle worker error in loaderror event, we just return here
811
return;
912
}
1013

14+
const docExtension = getDocumentExtension(getDocName(store.getState()));
1115
if (src.endsWith('nmf')) {
12-
testMIMEType(['nmf']);
16+
testMIMEType(['nmf'])
17+
.then(() => {
18+
// when the server has correct setup for MIME type but SimpleWorker.nmf is missing
19+
// we don't want to fire error since in this case we will fallback to use other worker files and can still load the document successfully
20+
if (src.indexOf('SimpleWorker.nmf') === -1) {
21+
errorMissingWorkerFiles(docExtension);
22+
}
23+
})
24+
.catch(errorMIMEType);
1325
}
1426
if (src.endsWith('pexe')) {
15-
testMIMEType(['pexe']);
27+
testMIMEType(['pexe'])
28+
.then(() => {
29+
if (src.indexOf('SimpleWorker.pexe') === -1) {
30+
errorMissingWorkerFiles(docExtension);
31+
}
32+
})
33+
.catch(errorMIMEType);
1634
}
1735
}, true);
1836

19-
window.addEventListener('loaderror', e => {
20-
if (missFilesToLoad(e)) {
21-
testMIMEType(['res', 'mem', 'wasm', 'xod']);
37+
window.addEventListener('loaderror', ({ detail }) => {
38+
const docExtension = getDocumentExtension(getDocName(store.getState()));
39+
40+
if (detail.startsWith('Error retrieving file:') && detail.includes('.xod')) {
41+
testMIMEType(['xod'])
42+
.then(() => errorMissingWorkerFiles(docExtension))
43+
.catch(errorMIMEType);
44+
}
45+
if (detail === 'The worker has encountered an error') {
46+
testMIMEType(['mem', 'wasm'])
47+
.then(() => errorMissingWorkerFiles(docExtension))
48+
.catch(errorMIMEType);
49+
}
50+
if (detail === `Couldn't fetch resource file.`) {
51+
testMIMEType(['res'])
52+
.then(() => errorMissingWorkerFiles(docExtension))
53+
.catch(errorMIMEType);
2254
}
2355
});
2456
};
2557

2658
const testMIMEType = fileExtensions => {
27-
fileExtensions.forEach(extension => {
28-
fetch(`${window.CoreControls.getWorkerPath()}/assets/mime-types/test.${extension}`)
29-
.then(({ status }) => {
59+
const fetchingTestFiles = fileExtensions.map(extension => {
60+
return new Promise((resolve, reject) => {
61+
const URL = `${window.CoreControls.getWorkerPath()}/assets/mime-types/test.${extension}`;
62+
63+
fetch(URL).then(({ status }) => {
3064
if (status === 404) {
31-
console.error(`Your server does not have a MIME type set for extension ${extension}. Please see https://www.pdftron.com/documentation/web/guides/basics/troubleshooting-document-loading/#mime-types for more information.`);
65+
reject(extension);
66+
} else {
67+
resolve();
3268
}
3369
});
70+
});
3471
});
72+
73+
return Promise.all(fetchingTestFiles);
74+
};
75+
76+
const errorMissingWorkerFiles = docExtension => {
77+
let errorMessage;
78+
79+
if (isOfficeExtension(docExtension)) {
80+
errorMessage = 'Failed to find Office worker files. This project is not set up to work with Office files.';
81+
}
82+
if (isPDFExtension(docExtension)) {
83+
errorMessage = 'Failed to find PDF worker files. This project is not set up to work with PDF files.';
84+
}
85+
86+
fireError(errorMessage);
87+
console.error(errorMessage);
3588
};
3689

37-
const missFilesToLoad = ({ detail }) => {
38-
return detail === `Couldn't fetch resource file.`
39-
|| detail === 'The worker has encountered an error'
40-
|| (detail.startsWith('Error retrieving file:') && detail.includes('.xod'));
90+
const errorMIMEType = fileExtension => {
91+
fireError(`Your server does not have a MIME type set for extension ${fileExtension}. Open developer console to see the link for correct MIME type setup`);
92+
console.error(`Your server does not have a MIME type set for extension ${fileExtension}. Please see https://www.pdftron.com/documentation/web/guides/basics/troubleshooting-document-loading/#mime-types for more information.`);
4193
};

src/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ if (window.CanvasRenderingContext2D) {
112112
setupPDFTron();
113113
setupDocViewer();
114114
setupI18n(state);
115-
setupMIMETypeTest();
115+
setupMIMETypeTest(store);
116116
setUserPermission(state);
117117
setAutoSwitch();
118118
setDefaultToolColor();

src/redux/actions/exposedActions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import isDataElementPanel from 'helpers/isDataElementPanel';
22
import core from 'core';
3-
import { fireEvent } from 'helpers/loadDocument';
3+
import fireEvent from 'helpers/fireEvent';
44

55
// viewer
66
export const enableAllElements = () => ({ type: 'ENABLE_ALL_ELEMENTS', payload: {} });

0 commit comments

Comments
 (0)