Merge pull request #4163 from Rob--W/issue-4159-uri-annot

Recover from bad URI values
This commit is contained in:
Yury Delendik 2014-01-22 07:34:34 -08:00
commit 18a163c900
2 changed files with 13 additions and 5 deletions

View File

@ -640,7 +640,13 @@ var LinkAnnotation = (function LinkAnnotationClosure() {
if (action) { if (action) {
var linkType = action.get('S').name; var linkType = action.get('S').name;
if (linkType === 'URI') { if (linkType === 'URI') {
var url = addDefaultProtocolToUrl(action.get('URI')); var url = action.get('URI');
if (isName(url)) {
// Some bad PDFs do not put parentheses around relative URLs.
url = '/' + url.name;
} else {
url = addDefaultProtocolToUrl(url);
}
// TODO: pdf spec mentions urls can be relative to a Base // TODO: pdf spec mentions urls can be relative to a Base
// entry in the dictionary. // entry in the dictionary.
if (!isValidUrl(url, false)) { if (!isValidUrl(url, false)) {

View File

@ -223,7 +223,7 @@ var UnsupportedManager = PDFJS.UnsupportedManager =
function combineUrl(baseUrl, url) { function combineUrl(baseUrl, url) {
if (!url) if (!url)
return baseUrl; return baseUrl;
if (url.indexOf(':') >= 0) if (/^[a-z][a-z0-9+\-.]*:/i.test(url))
return url; return url;
if (url.charAt(0) == '/') { if (url.charAt(0) == '/') {
// absolute path // absolute path
@ -247,11 +247,13 @@ function isValidUrl(url, allowRelative) {
if (!url) { if (!url) {
return false; return false;
} }
var colon = url.indexOf(':'); // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1)
if (colon < 0) { // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url);
if (!protocol) {
return allowRelative; return allowRelative;
} }
var protocol = url.substr(0, colon); protocol = protocol[0].toLowerCase();
switch (protocol) { switch (protocol) {
case 'http': case 'http':
case 'https': case 'https':