Add new severity log info(). Change severity of some log messages. Trigger fallback on errors and warnings for extension.
This commit is contained in:
parent
fca6f352e4
commit
034583e1a1
@ -138,7 +138,7 @@ ChromeActions.prototype = {
|
|||||||
self.download(url);
|
self.download(url);
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
label: mozL10n.get('disable_pdfjs', null,
|
label: mozL10n.get('disable_viewer', null,
|
||||||
'Disable Mozilla PDF Viewer'),
|
'Disable Mozilla PDF Viewer'),
|
||||||
accessKey: null,
|
accessKey: null,
|
||||||
callback: function() {
|
callback: function() {
|
||||||
|
@ -420,7 +420,7 @@ var WorkerTransport = (function WorkerTransportClosure() {
|
|||||||
messageHandler.send('test', testObj);
|
messageHandler.send('test', testObj);
|
||||||
return;
|
return;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
warn('The worker has been disabled.');
|
info('The worker has been disabled.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Either workers are disabled, not supported or have thrown an exception.
|
// Either workers are disabled, not supported or have thrown an exception.
|
||||||
|
@ -343,10 +343,13 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|||||||
this.ctx.webkitLineDashOffset = dashPhase;
|
this.ctx.webkitLineDashOffset = dashPhase;
|
||||||
},
|
},
|
||||||
setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
|
setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
|
||||||
TODO('set rendering intent: ' + intent);
|
// Maybe if we one day fully support color spaces this will be important
|
||||||
|
// for now we can ignore.
|
||||||
|
// TODO set rendering intent?
|
||||||
},
|
},
|
||||||
setFlatness: function CanvasGraphics_setFlatness(flatness) {
|
setFlatness: function CanvasGraphics_setFlatness(flatness) {
|
||||||
TODO('set flatness: ' + flatness);
|
// There's no way to control this with canvas, but we can safely ignore.
|
||||||
|
// TODO set flatness?
|
||||||
},
|
},
|
||||||
setGState: function CanvasGraphics_setGState(states) {
|
setGState: function CanvasGraphics_setGState(states) {
|
||||||
for (var i = 0, ii = states.length; i < ii; i++) {
|
for (var i = 0, ii = states.length; i < ii; i++) {
|
||||||
@ -841,7 +844,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|||||||
text.length += shownText.length;
|
text.length += shownText.length;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
malformed('TJ array element ' + e + ' is not string or num');
|
error('TJ array element ' + e + ' is not string or num');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -451,12 +451,12 @@ var LabCS = (function LabCSClosure() {
|
|||||||
error('Invalid WhitePoint components, no fallback available');
|
error('Invalid WhitePoint components, no fallback available');
|
||||||
|
|
||||||
if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
|
if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
|
||||||
warn('Invalid BlackPoint, falling back to default');
|
info('Invalid BlackPoint, falling back to default');
|
||||||
this.XB = this.YB = this.ZB = 0;
|
this.XB = this.YB = this.ZB = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.amin > this.amax || this.bmin > this.bmax) {
|
if (this.amin > this.amax || this.bmin > this.bmax) {
|
||||||
warn('Invalid Range, falling back to defaults');
|
info('Invalid Range, falling back to defaults');
|
||||||
this.amin = -100;
|
this.amin = -100;
|
||||||
this.amax = 100;
|
this.amax = 100;
|
||||||
this.bmin = -100;
|
this.bmin = -100;
|
||||||
|
@ -7,7 +7,7 @@ var globalScope = (typeof window === 'undefined') ? this : window;
|
|||||||
|
|
||||||
var isWorker = (typeof window == 'undefined');
|
var isWorker = (typeof window == 'undefined');
|
||||||
|
|
||||||
var ERRORS = 0, WARNINGS = 1, TODOS = 5;
|
var ERRORS = 0, WARNINGS = 1, INFOS = 5;
|
||||||
var verbosity = WARNINGS;
|
var verbosity = WARNINGS;
|
||||||
|
|
||||||
// The global PDFJS object exposes the API
|
// The global PDFJS object exposes the API
|
||||||
|
@ -453,7 +453,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
|
|||||||
TODO('graphic state operator ' + key);
|
TODO('graphic state operator ' + key);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
warn('Unknown graphic state operator ' + key);
|
info('Unknown graphic state operator ' + key);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3633,7 +3633,7 @@ var CFFParser = (function CFFParserClosure() {
|
|||||||
++offset;
|
++offset;
|
||||||
|
|
||||||
if (offset != 0) {
|
if (offset != 0) {
|
||||||
warn('cff data is shifted');
|
info('cff data is shifted');
|
||||||
bytes = bytes.subarray(offset);
|
bytes = bytes.subarray(offset);
|
||||||
this.bytes = bytes;
|
this.bytes = bytes;
|
||||||
}
|
}
|
||||||
|
@ -1687,7 +1687,7 @@ var CCITTFaxStream = (function CCITTFaxStreamClosure() {
|
|||||||
|
|
||||||
if (a1 > codingLine[codingPos]) {
|
if (a1 > codingLine[codingPos]) {
|
||||||
if (a1 > this.columns) {
|
if (a1 > this.columns) {
|
||||||
warn('row is wrong length');
|
info('row is wrong length');
|
||||||
this.err = true;
|
this.err = true;
|
||||||
a1 = this.columns;
|
a1 = this.columns;
|
||||||
}
|
}
|
||||||
@ -1707,7 +1707,7 @@ var CCITTFaxStream = (function CCITTFaxStreamClosure() {
|
|||||||
|
|
||||||
if (a1 > codingLine[codingPos]) {
|
if (a1 > codingLine[codingPos]) {
|
||||||
if (a1 > this.columns) {
|
if (a1 > this.columns) {
|
||||||
warn('row is wrong length');
|
info('row is wrong length');
|
||||||
this.err = true;
|
this.err = true;
|
||||||
a1 = this.columns;
|
a1 = this.columns;
|
||||||
}
|
}
|
||||||
@ -1717,7 +1717,7 @@ var CCITTFaxStream = (function CCITTFaxStreamClosure() {
|
|||||||
codingLine[codingPos] = a1;
|
codingLine[codingPos] = a1;
|
||||||
} else if (a1 < codingLine[codingPos]) {
|
} else if (a1 < codingLine[codingPos]) {
|
||||||
if (a1 < 0) {
|
if (a1 < 0) {
|
||||||
warn('invalid code');
|
info('invalid code');
|
||||||
this.err = true;
|
this.err = true;
|
||||||
a1 = 0;
|
a1 = 0;
|
||||||
}
|
}
|
||||||
@ -1879,7 +1879,7 @@ var CCITTFaxStream = (function CCITTFaxStreamClosure() {
|
|||||||
this.eof = true;
|
this.eof = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
warn('bad 2d code');
|
info('bad 2d code');
|
||||||
this.addPixels(columns, 0);
|
this.addPixels(columns, 0);
|
||||||
this.err = true;
|
this.err = true;
|
||||||
}
|
}
|
||||||
@ -1942,7 +1942,7 @@ var CCITTFaxStream = (function CCITTFaxStreamClosure() {
|
|||||||
for (var i = 0; i < 4; ++i) {
|
for (var i = 0; i < 4; ++i) {
|
||||||
code1 = this.lookBits(12);
|
code1 = this.lookBits(12);
|
||||||
if (code1 != 1)
|
if (code1 != 1)
|
||||||
warn('bad rtc code: ' + code1);
|
info('bad rtc code: ' + code1);
|
||||||
this.eatBits(12);
|
this.eatBits(12);
|
||||||
if (this.encoding > 0) {
|
if (this.encoding > 0) {
|
||||||
this.lookBits(1);
|
this.lookBits(1);
|
||||||
@ -2065,7 +2065,7 @@ var CCITTFaxStream = (function CCITTFaxStreamClosure() {
|
|||||||
if (result[0] && result[2])
|
if (result[0] && result[2])
|
||||||
return result[1];
|
return result[1];
|
||||||
}
|
}
|
||||||
warn('Bad two dim code');
|
info('Bad two dim code');
|
||||||
return EOF;
|
return EOF;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2098,7 +2098,7 @@ var CCITTFaxStream = (function CCITTFaxStreamClosure() {
|
|||||||
if (result[0])
|
if (result[0])
|
||||||
return result[1];
|
return result[1];
|
||||||
}
|
}
|
||||||
warn('bad white code');
|
info('bad white code');
|
||||||
this.eatBits(1);
|
this.eatBits(1);
|
||||||
return 1;
|
return 1;
|
||||||
};
|
};
|
||||||
@ -2135,7 +2135,7 @@ var CCITTFaxStream = (function CCITTFaxStreamClosure() {
|
|||||||
if (result[0])
|
if (result[0])
|
||||||
return result[1];
|
return result[1];
|
||||||
}
|
}
|
||||||
warn('bad black code');
|
info('bad black code');
|
||||||
this.eatBits(1);
|
this.eatBits(1);
|
||||||
return 1;
|
return 1;
|
||||||
};
|
};
|
||||||
|
64
src/util.js
64
src/util.js
@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
// Use only for debugging purposes. This should not be used in any code that is
|
||||||
|
// in mozilla master.
|
||||||
function log(msg) {
|
function log(msg) {
|
||||||
if (console && console.log)
|
if (console && console.log)
|
||||||
console.log(msg);
|
console.log(msg);
|
||||||
@ -10,9 +12,36 @@ function log(msg) {
|
|||||||
print(msg);
|
print(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A notice for devs that will not trigger the fallback UI. These are good
|
||||||
|
// for things that are helpful to devs, such as warning that Workers were
|
||||||
|
// disabled, which is important to devs but not end users.
|
||||||
|
function info(msg) {
|
||||||
|
if (verbosity >= INFOS) {
|
||||||
|
log('Info: ' + msg);
|
||||||
|
PDFJS.LogManager.notify('info', msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Non-fatal warnings that should trigger the fallback UI.
|
||||||
function warn(msg) {
|
function warn(msg) {
|
||||||
if (verbosity >= WARNINGS)
|
if (verbosity >= WARNINGS) {
|
||||||
log('Warning: ' + msg);
|
log('Warning: ' + msg);
|
||||||
|
PDFJS.LogManager.notify('warn', msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fatal errors that should trigger the fallback UI and halt execution by
|
||||||
|
// throwing an exception.
|
||||||
|
function error(msg) {
|
||||||
|
log('Error: ' + msg);
|
||||||
|
log(backtrace());
|
||||||
|
PDFJS.LogManager.notify('error', msg);
|
||||||
|
throw new Error(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Missing features that should trigger the fallback UI.
|
||||||
|
function TODO(what) {
|
||||||
|
warn('TODO: ' + what);
|
||||||
}
|
}
|
||||||
|
|
||||||
function backtrace() {
|
function backtrace() {
|
||||||
@ -23,21 +52,6 @@ function backtrace() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function error(msg) {
|
|
||||||
log('Error: ' + msg);
|
|
||||||
log(backtrace());
|
|
||||||
throw new Error(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
function TODO(what) {
|
|
||||||
if (verbosity >= TODOS)
|
|
||||||
log('TODO: ' + what);
|
|
||||||
}
|
|
||||||
|
|
||||||
function malformed(msg) {
|
|
||||||
error('Malformed PDF: ' + msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
function assert(cond, msg) {
|
function assert(cond, msg) {
|
||||||
if (!cond)
|
if (!cond)
|
||||||
error(msg);
|
error(msg);
|
||||||
@ -47,9 +61,25 @@ function assert(cond, msg) {
|
|||||||
// behavior is undefined.
|
// behavior is undefined.
|
||||||
function assertWellFormed(cond, msg) {
|
function assertWellFormed(cond, msg) {
|
||||||
if (!cond)
|
if (!cond)
|
||||||
malformed(msg);
|
error(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var LogManager = PDFJS.LogManager = (function LogManagerClosure() {
|
||||||
|
var loggers = [];
|
||||||
|
return {
|
||||||
|
addLogger: function logManager_addLogger(logger) {
|
||||||
|
loggers.push(logger);
|
||||||
|
},
|
||||||
|
notify: function(type, message) {
|
||||||
|
for (var i = 0, ii = loggers.length; i < ii; i++) {
|
||||||
|
var logger = loggers[i];
|
||||||
|
if (logger[type])
|
||||||
|
logger[type](message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
function shadow(obj, prop, value) {
|
function shadow(obj, prop, value) {
|
||||||
Object.defineProperty(obj, prop, { value: value,
|
Object.defineProperty(obj, prop, { value: value,
|
||||||
enumerable: true,
|
enumerable: true,
|
||||||
|
@ -11,10 +11,13 @@ function MessageHandler(name, comObj) {
|
|||||||
var ah = this.actionHandler = {};
|
var ah = this.actionHandler = {};
|
||||||
|
|
||||||
ah['console_log'] = [function ahConsoleLog(data) {
|
ah['console_log'] = [function ahConsoleLog(data) {
|
||||||
console.log.apply(console, data);
|
console.log.apply(console, data);
|
||||||
}];
|
}];
|
||||||
ah['console_error'] = [function ahConsoleError(data) {
|
ah['console_error'] = [function ahConsoleError(data) {
|
||||||
console.error.apply(console, data);
|
console.error.apply(console, data);
|
||||||
|
}];
|
||||||
|
ah['_warn'] = [function ah_Warn(data) {
|
||||||
|
warn(data);
|
||||||
}];
|
}];
|
||||||
|
|
||||||
comObj.onmessage = function messageHandlerComObjOnMessage(event) {
|
comObj.onmessage = function messageHandlerComObjOnMessage(event) {
|
||||||
@ -223,6 +226,17 @@ var workerConsole = {
|
|||||||
if (typeof window === 'undefined') {
|
if (typeof window === 'undefined') {
|
||||||
globalScope.console = workerConsole;
|
globalScope.console = workerConsole;
|
||||||
|
|
||||||
|
// Add a logger so we can pass warnings on to the main thread, errors will
|
||||||
|
// throw an exception which will be forwarded on automatically.
|
||||||
|
PDFJS.LogManager.addLogger({
|
||||||
|
warn: function(msg) {
|
||||||
|
postMessage({
|
||||||
|
action: '_warn',
|
||||||
|
data: msg
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
var handler = new MessageHandler('worker_processor', this);
|
var handler = new MessageHandler('worker_processor', this);
|
||||||
WorkerMessageHandler.setup(handler);
|
WorkerMessageHandler.setup(handler);
|
||||||
}
|
}
|
||||||
|
@ -221,6 +221,7 @@ var PDFView = {
|
|||||||
initialBookmark: document.location.hash.substring(1),
|
initialBookmark: document.location.hash.substring(1),
|
||||||
container: null,
|
container: null,
|
||||||
initialized: false,
|
initialized: false,
|
||||||
|
fellback: false,
|
||||||
// called once when the document is loaded
|
// called once when the document is loaded
|
||||||
initialize: function pdfViewInitialize() {
|
initialize: function pdfViewInitialize() {
|
||||||
this.container = document.getElementById('viewerContainer');
|
this.container = document.getElementById('viewerContainer');
|
||||||
@ -375,6 +376,11 @@ var PDFView = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
fallback: function pdfViewDownload() {
|
fallback: function pdfViewDownload() {
|
||||||
|
// Only trigger the fallback once so we don't spam the user with messages
|
||||||
|
// for one PDF.
|
||||||
|
if (this.fellback)
|
||||||
|
return;
|
||||||
|
this.fellback = true;
|
||||||
var url = this.url.split('#')[0];
|
var url = this.url.split('#')[0];
|
||||||
FirefoxCom.request('fallback', url);
|
FirefoxCom.request('fallback', url);
|
||||||
},
|
},
|
||||||
@ -441,6 +447,34 @@ var PDFView = {
|
|||||||
* and optionally a 'stack' property.
|
* and optionally a 'stack' property.
|
||||||
*/
|
*/
|
||||||
error: function pdfViewError(message, moreInfo) {
|
error: function pdfViewError(message, moreInfo) {
|
||||||
|
var moreInfoText = mozL10n.get('error_build', {build: PDFJS.build},
|
||||||
|
'PDF.JS Build: {{build}}') + '\n';
|
||||||
|
if (moreInfo) {
|
||||||
|
moreInfoText +=
|
||||||
|
mozL10n.get('error_message', {message: moreInfo.message},
|
||||||
|
'Message: {{message}}');
|
||||||
|
if (moreInfo.stack) {
|
||||||
|
moreInfoText += '\n' +
|
||||||
|
mozL10n.get('error_stack', {stack: moreInfo.stack},
|
||||||
|
'Stack: {{stack}}');
|
||||||
|
} else {
|
||||||
|
if (moreInfo.filename) {
|
||||||
|
moreInfoText += '\n' +
|
||||||
|
mozL10n.get('error_file', {file: moreInfo.filename},
|
||||||
|
'File: {{file}}');
|
||||||
|
}
|
||||||
|
if (moreInfo.lineNumber) {
|
||||||
|
moreInfoText += '\n' +
|
||||||
|
mozL10n.get('error_line', {line: moreInfo.lineNumber},
|
||||||
|
'Line: {{line}}');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (PDFJS.isFirefoxExtension) {
|
||||||
|
console.error(message + '\n' + moreInfoText);
|
||||||
|
this.fallback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
var errorWrapper = document.getElementById('errorWrapper');
|
var errorWrapper = document.getElementById('errorWrapper');
|
||||||
errorWrapper.removeAttribute('hidden');
|
errorWrapper.removeAttribute('hidden');
|
||||||
|
|
||||||
@ -467,32 +501,9 @@ var PDFView = {
|
|||||||
};
|
};
|
||||||
moreInfoButton.removeAttribute('hidden');
|
moreInfoButton.removeAttribute('hidden');
|
||||||
lessInfoButton.setAttribute('hidden', 'true');
|
lessInfoButton.setAttribute('hidden', 'true');
|
||||||
errorMoreInfo.value =
|
errorMoreInfo.value = moreInfoText;
|
||||||
mozL10n.get('error_build', {build: PDFJS.build},
|
|
||||||
'PDF.JS Build: {{build}}') + '\n';
|
|
||||||
|
|
||||||
if (moreInfo) {
|
errorMoreInfo.rows = moreInfoText.split('\n').length - 1;
|
||||||
errorMoreInfo.value +=
|
|
||||||
mozL10n.get('error_message', {message: moreInfo.message},
|
|
||||||
'Message: {{message}}');
|
|
||||||
if (moreInfo.stack) {
|
|
||||||
errorMoreInfo.value += '\n' +
|
|
||||||
mozL10n.get('error_stack', {stack: moreInfo.stack},
|
|
||||||
'Stack: {{stack}}');
|
|
||||||
} else {
|
|
||||||
if (moreInfo.filename) {
|
|
||||||
errorMoreInfo.value += '\n' +
|
|
||||||
mozL10n.get('error_file', {file: moreInfo.filename},
|
|
||||||
'File: {{file}}');
|
|
||||||
}
|
|
||||||
if (moreInfo.lineNumber) {
|
|
||||||
errorMoreInfo.value += '\n' +
|
|
||||||
mozL10n.get('error_line', {line: moreInfo.lineNumber},
|
|
||||||
'Line: {{line}}');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
errorMoreInfo.rows = errorMoreInfo.value.split('\n').length - 1;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
progress: function pdfViewProgress(level) {
|
progress: function pdfViewProgress(level) {
|
||||||
@ -1385,6 +1396,14 @@ window.addEventListener('load', function webViewerLoad(evt) {
|
|||||||
PDFBug.init();
|
PDFBug.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Listen for warnings to trigger the fallback UI. Errors should be caught
|
||||||
|
// and call PDFView.error() so we don't need to listen for those.
|
||||||
|
PDFJS.LogManager.addLogger({
|
||||||
|
warn: function() {
|
||||||
|
PDFView.fallback();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
var thumbsView = document.getElementById('thumbnailView');
|
var thumbsView = document.getElementById('thumbnailView');
|
||||||
thumbsView.addEventListener('scroll', updateThumbViewArea, true);
|
thumbsView.addEventListener('scroll', updateThumbViewArea, true);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user