diff --git a/src/display/api.js b/src/display/api.js index 57b9a3e61..9a64d2f7c 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -48,6 +48,7 @@ var error = sharedUtil.error; var deprecated = sharedUtil.deprecated; var info = sharedUtil.info; var isArrayBuffer = sharedUtil.isArrayBuffer; +var isSameOrigin = sharedUtil.isSameOrigin; var loadJpegStream = sharedUtil.loadJpegStream; var stringToBytes = sharedUtil.stringToBytes; var warn = sharedUtil.warn; @@ -1235,6 +1236,14 @@ var PDFWorker = (function PDFWorkerClosure() { return PDFJS.fakeWorkerFilesLoadedCapability.promise; } + function createCDNWrapper(url) { + // We will rely on blob URL's property to specify origin. + // We want this function to fail in case if createObjectURL or Blob do not + // exist or fail for some reason -- our Worker creation will fail anyway. + var wrapper = 'importScripts(\'' + url + '\');'; + return URL.createObjectURL(new Blob([wrapper])); + } + function PDFWorker(name) { this.name = name; this.destroyed = false; @@ -1270,6 +1279,14 @@ var PDFWorker = (function PDFWorkerClosure() { var workerSrc = getWorkerSrc(); try { +//#if GENERIC +// // Wraps workerSrc path into blob URL, if the former does not belong +// // to the same origin. +// if (!isSameOrigin(window.location.href, workerSrc)) { +// workerSrc = createCDNWrapper( +// combineUrl(window.location.href, workerSrc)); +// } +//#endif // Some versions of FF can't create a worker on localhost, see: // https://bugzilla.mozilla.org/show_bug.cgi?id=683280 var worker = new Worker(workerSrc); diff --git a/src/shared/util.js b/src/shared/util.js index cdc8113e1..93c869da4 100644 --- a/src/shared/util.js +++ b/src/shared/util.js @@ -293,6 +293,21 @@ function combineUrl(baseUrl, url) { return new URL(url, baseUrl).href; } +// Checks if URLs have the same origin. For non-HTTP based URLs, returns false. +function isSameOrigin(baseUrl, otherUrl) { + try { + var base = new URL(baseUrl); + if (!base.origin || base.origin === 'null') { + return false; // non-HTTP url + } + } catch (e) { + return false; + } + + var other = new URL(otherUrl, base); + return base.origin === other.origin; +} + // Validates if URL is safe and allowed, e.g. to avoid XSS. function isValidUrl(url, allowRelative) { if (!url) { @@ -2349,6 +2364,7 @@ exports.isExternalLinkTargetSet = isExternalLinkTargetSet; exports.isInt = isInt; exports.isNum = isNum; exports.isString = isString; +exports.isSameOrigin = isSameOrigin; exports.isValidUrl = isValidUrl; exports.addLinkAttributes = addLinkAttributes; exports.loadJpegStream = loadJpegStream;