diff --git a/extensions/b2g/viewer.html b/extensions/b2g/viewer.html
index f3c6ea5a5..d39ed5724 100644
--- a/extensions/b2g/viewer.html
+++ b/extensions/b2g/viewer.html
@@ -25,7 +25,6 @@ limitations under the License.
-
diff --git a/src/api.js b/src/api.js
index 1d0bf133c..c1ab09d95 100644
--- a/src/api.js
+++ b/src/api.js
@@ -21,6 +21,13 @@
'use strict';
+/**
+ * The maximum allowed image size in total pixels e.g. width * height. Images
+ * above this value will not be drawn. Use -1 for no limit.
+ * @var {Number}
+ */
+PDFJS.maxImageSize = PDFJS.maxImageSize === undefined ? -1 : PDFJS.maxImageSize;
+
/**
* This is the main entry point for loading a PDF and interacting with it.
* NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)
@@ -760,7 +767,8 @@ var WorkerTransport = (function WorkerTransportClosure() {
source.chunkedViewerLoading = !!this.pdfDataRangeTransport;
this.messageHandler.send('GetDocRequest', {
source: source,
- disableRange: PDFJS.disableRange
+ disableRange: PDFJS.disableRange,
+ maxImageSize: PDFJS.maxImageSize
});
},
diff --git a/src/evaluator.js b/src/evaluator.js
index 33674d085..b3de3b102 100644
--- a/src/evaluator.js
+++ b/src/evaluator.js
@@ -234,6 +234,11 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
var w = dict.get('Width', 'W');
var h = dict.get('Height', 'H');
+ if (PDFJS.maxImageSize !== -1 && w * h > PDFJS.maxImageSize) {
+ warn('Image exceeded maximum allowed size and was removed.');
+ return null;
+ }
+
var dependencies = {};
var retData = {
dependencies: dependencies
@@ -706,6 +711,10 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
} else if ('Image' == type.name) {
var data = self.buildPaintImageXObject(
resources, xobj, false);
+ if (!data) {
+ args = [];
+ continue;
+ }
Util.extendObj(dependencies, data.dependencies);
self.insertDependencies(queue, data.dependencies);
fn = data.fn;
@@ -720,6 +729,10 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
} else if (cmd == 'EI') {
var data = self.buildPaintImageXObject(
resources, args[0], true);
+ if (!data) {
+ args = [];
+ continue;
+ }
Util.extendObj(dependencies, data.dependencies);
self.insertDependencies(queue, data.dependencies);
fn = data.fn;
diff --git a/src/worker.js b/src/worker.js
index a312643a2..9b12a2ff1 100644
--- a/src/worker.js
+++ b/src/worker.js
@@ -307,6 +307,9 @@ var WorkerMessageHandler = {
}
};
+ PDFJS.maxImageSize = data.maxImageSize === undefined ?
+ -1 : data.maxImageSize;
+
getPdfManager(data).then(function pdfManagerReady() {
loadDocument(false).then(onSuccess, function loadFailure(ex) {
// Try again with recoveryMode == true
diff --git a/web/viewer.js b/web/viewer.js
index 9ac2f5a95..192234271 100644
--- a/web/viewer.js
+++ b/web/viewer.js
@@ -3201,6 +3201,7 @@ window.addEventListener('afterprint', function afterPrint(evt) {
//#if B2G
//window.navigator.mozSetMessageHandler('activity', function(activity) {
// var url = activity.source.data.url;
+// PDFJS.maxImageSize = 1024 * 1024;
// PDFView.open(url);
// var cancelButton = document.getElementById('activityClose');
// cancelButton.addEventListener('click', function() {