Move the getFileName
helper function to the core
This is required to be able to use it in the annotation display code, where we now apply it to sanitize the filename of the FileAttachment annotation. The PDF file from https://bugzilla.mozilla.org/show_bug.cgi?id=1230933 has shown that some PDF generators include the path of the file rather than the filename, which causes filenames with weird initial characters. PDF viewers handle this differently (for example Foxit Reader just replaces forward slashes with spaces), but we think it's better to only show the filename as intended. Additionally we add unit tests for the `getFilenameFromUrl` helper function.
This commit is contained in:
parent
10902fd882
commit
0351c7eff4
@ -88,7 +88,7 @@ var PDFViewerApplication = {
|
|||||||
|
|
||||||
setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) {
|
setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) {
|
||||||
this.url = url;
|
this.url = url;
|
||||||
var title = PDFJS.getFileName(url) || url;
|
var title = PDFJS.getFilenameFromUrl(url) || url;
|
||||||
try {
|
try {
|
||||||
title = decodeURIComponent(title);
|
title = decodeURIComponent(title);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -32,6 +32,7 @@ var AnnotationBorderStyleType = sharedUtil.AnnotationBorderStyleType;
|
|||||||
var AnnotationType = sharedUtil.AnnotationType;
|
var AnnotationType = sharedUtil.AnnotationType;
|
||||||
var Util = sharedUtil.Util;
|
var Util = sharedUtil.Util;
|
||||||
var addLinkAttributes = sharedUtil.addLinkAttributes;
|
var addLinkAttributes = sharedUtil.addLinkAttributes;
|
||||||
|
var getFilenameFromUrl = sharedUtil.getFilenameFromUrl;
|
||||||
var warn = sharedUtil.warn;
|
var warn = sharedUtil.warn;
|
||||||
var CustomStyle = displayDOMUtils.CustomStyle;
|
var CustomStyle = displayDOMUtils.CustomStyle;
|
||||||
|
|
||||||
@ -731,7 +732,7 @@ var FileAttachmentAnnotationElement = (
|
|||||||
function FileAttachmentAnnotationElement(parameters) {
|
function FileAttachmentAnnotationElement(parameters) {
|
||||||
AnnotationElement.call(this, parameters, true);
|
AnnotationElement.call(this, parameters, true);
|
||||||
|
|
||||||
this.filename = parameters.data.file.filename;
|
this.filename = getFilenameFromUrl(parameters.data.file.filename);
|
||||||
this.content = parameters.data.file.content;
|
this.content = parameters.data.file.content;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,6 +284,17 @@ var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = {
|
|||||||
font: 'font'
|
font: 'font'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Gets the file name from a given URL.
|
||||||
|
function getFilenameFromUrl(url) {
|
||||||
|
var anchor = url.indexOf('#');
|
||||||
|
var query = url.indexOf('?');
|
||||||
|
var end = Math.min(
|
||||||
|
anchor > 0 ? anchor : url.length,
|
||||||
|
query > 0 ? query : url.length);
|
||||||
|
return url.substring(url.lastIndexOf('/', end) + 1, end);
|
||||||
|
}
|
||||||
|
PDFJS.getFilenameFromUrl = getFilenameFromUrl;
|
||||||
|
|
||||||
// Combines two URLs. The baseUrl shall be absolute URL. If the url is an
|
// Combines two URLs. The baseUrl shall be absolute URL. If the url is an
|
||||||
// absolute URL, it will be returned as is.
|
// absolute URL, it will be returned as is.
|
||||||
function combineUrl(baseUrl, url) {
|
function combineUrl(baseUrl, url) {
|
||||||
@ -2367,6 +2378,7 @@ exports.combineUrl = combineUrl;
|
|||||||
exports.createPromiseCapability = createPromiseCapability;
|
exports.createPromiseCapability = createPromiseCapability;
|
||||||
exports.deprecated = deprecated;
|
exports.deprecated = deprecated;
|
||||||
exports.error = error;
|
exports.error = error;
|
||||||
|
exports.getFilenameFromUrl = getFilenameFromUrl;
|
||||||
exports.getLookupTableFactory = getLookupTableFactory;
|
exports.getLookupTableFactory = getLookupTableFactory;
|
||||||
exports.info = info;
|
exports.info = info;
|
||||||
exports.isArray = isArray;
|
exports.isArray = isArray;
|
||||||
|
@ -1,10 +1,25 @@
|
|||||||
/* globals expect, it, describe, combineUrl, Dict, isDict, Name, PDFJS,
|
/* globals expect, it, describe, combineUrl, Dict, isDict, Name, PDFJS,
|
||||||
stringToPDFString, isExternalLinkTargetSet, LinkTarget,
|
stringToPDFString, isExternalLinkTargetSet, LinkTarget,
|
||||||
removeNullCharacters */
|
removeNullCharacters, getFilenameFromUrl */
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
describe('util', function() {
|
describe('util', function() {
|
||||||
|
describe('getFilenameFromUrl', function() {
|
||||||
|
it('should get the filename from an absolute URL', function() {
|
||||||
|
var url = 'http://server.org/filename.pdf';
|
||||||
|
var result = getFilenameFromUrl(url);
|
||||||
|
var expected = 'filename.pdf';
|
||||||
|
expect(result).toEqual(expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should get the filename from a relative URL', function() {
|
||||||
|
var url = '../../filename.pdf';
|
||||||
|
var result = getFilenameFromUrl(url);
|
||||||
|
var expected = 'filename.pdf';
|
||||||
|
expect(result).toEqual(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('combineUrl', function() {
|
describe('combineUrl', function() {
|
||||||
it('absolute url with protocol stays as is', function() {
|
it('absolute url with protocol stays as is', function() {
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
/* globals getFileName, PDFJS */
|
/* globals PDFJS */
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
@ -84,7 +84,7 @@ var PDFAttachmentView = (function PDFAttachmentViewClosure() {
|
|||||||
|
|
||||||
for (var i = 0; i < attachmentsCount; i++) {
|
for (var i = 0; i < attachmentsCount; i++) {
|
||||||
var item = attachments[names[i]];
|
var item = attachments[names[i]];
|
||||||
var filename = getFileName(item.filename);
|
var filename = PDFJS.getFilenameFromUrl(item.filename);
|
||||||
var div = document.createElement('div');
|
var div = document.createElement('div');
|
||||||
div.className = 'attachmentsItem';
|
div.className = 'attachmentsItem';
|
||||||
var button = document.createElement('button');
|
var button = document.createElement('button');
|
||||||
|
@ -15,8 +15,7 @@
|
|||||||
/*jshint globalstrict: false */
|
/*jshint globalstrict: false */
|
||||||
/* globals PDFJS, PDFViewer, PDFPageView, TextLayerBuilder, PDFLinkService,
|
/* globals PDFJS, PDFViewer, PDFPageView, TextLayerBuilder, PDFLinkService,
|
||||||
DefaultTextLayerFactory, AnnotationLayerBuilder, PDFHistory,
|
DefaultTextLayerFactory, AnnotationLayerBuilder, PDFHistory,
|
||||||
DefaultAnnotationLayerFactory, getFileName, DownloadManager,
|
DefaultAnnotationLayerFactory, DownloadManager, ProgressBar */
|
||||||
ProgressBar */
|
|
||||||
|
|
||||||
// Initializing PDFJS global object (if still undefined)
|
// Initializing PDFJS global object (if still undefined)
|
||||||
if (typeof PDFJS === 'undefined') {
|
if (typeof PDFJS === 'undefined') {
|
||||||
@ -41,7 +40,6 @@ if (typeof PDFJS === 'undefined') {
|
|||||||
PDFJS.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory;
|
PDFJS.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory;
|
||||||
PDFJS.PDFHistory = PDFHistory;
|
PDFJS.PDFHistory = PDFHistory;
|
||||||
|
|
||||||
PDFJS.getFileName = getFileName;
|
|
||||||
PDFJS.DownloadManager = DownloadManager;
|
PDFJS.DownloadManager = DownloadManager;
|
||||||
PDFJS.ProgressBar = ProgressBar;
|
PDFJS.ProgressBar = ProgressBar;
|
||||||
}).call((typeof window === 'undefined') ? this : window);
|
}).call((typeof window === 'undefined') ? this : window);
|
||||||
|
@ -23,15 +23,6 @@ var MAX_AUTO_SCALE = 1.25;
|
|||||||
var SCROLLBAR_PADDING = 40;
|
var SCROLLBAR_PADDING = 40;
|
||||||
var VERTICAL_PADDING = 5;
|
var VERTICAL_PADDING = 5;
|
||||||
|
|
||||||
function getFileName(url) {
|
|
||||||
var anchor = url.indexOf('#');
|
|
||||||
var query = url.indexOf('?');
|
|
||||||
var end = Math.min(
|
|
||||||
anchor > 0 ? anchor : url.length,
|
|
||||||
query > 0 ? query : url.length);
|
|
||||||
return url.substring(url.lastIndexOf('/', end) + 1, end);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns scale factor for the canvas. It makes sense for the HiDPI displays.
|
* Returns scale factor for the canvas. It makes sense for the HiDPI displays.
|
||||||
* @return {Object} The object with horizontal (sx) and vertical (sy)
|
* @return {Object} The object with horizontal (sx) and vertical (sy)
|
||||||
|
@ -12,15 +12,15 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
/* globals PDFJS, PDFBug, FirefoxCom, Stats, ProgressBar,
|
/* globals PDFJS, PDFBug, FirefoxCom, Stats, ProgressBar, DownloadManager,
|
||||||
DownloadManager, getFileName, getPDFFileNameFromURL,
|
getPDFFileNameFromURL, PDFHistory, Preferences, SidebarView,
|
||||||
PDFHistory, Preferences, SidebarView, ViewHistory, Stats,
|
ViewHistory, Stats, PDFThumbnailViewer, URL, noContextMenuHandler,
|
||||||
PDFThumbnailViewer, URL, noContextMenuHandler, SecondaryToolbar,
|
SecondaryToolbar, PasswordPrompt, PDFPresentationMode,
|
||||||
PasswordPrompt, PDFPresentationMode, PDFDocumentProperties, HandTool,
|
PDFDocumentProperties, HandTool, Promise, PDFLinkService,
|
||||||
Promise, PDFLinkService, PDFOutlineView, PDFAttachmentView,
|
PDFOutlineView, PDFAttachmentView, OverlayManager,
|
||||||
OverlayManager, PDFFindController, PDFFindBar, PDFViewer,
|
PDFFindController, PDFFindBar, PDFViewer, PDFRenderingQueue,
|
||||||
PDFRenderingQueue, PresentationModeState, parseQueryString,
|
PresentationModeState, parseQueryString, RenderingStates,
|
||||||
RenderingStates, UNKNOWN_SCALE, DEFAULT_SCALE_VALUE,
|
UNKNOWN_SCALE, DEFAULT_SCALE_VALUE,
|
||||||
IGNORE_CURRENT_POSITION_ON_ZOOM: true */
|
IGNORE_CURRENT_POSITION_ON_ZOOM: true */
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
@ -486,7 +486,7 @@ var PDFViewerApplication = {
|
|||||||
setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) {
|
setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) {
|
||||||
this.url = url;
|
this.url = url;
|
||||||
try {
|
try {
|
||||||
this.setTitle(decodeURIComponent(getFileName(url)) || url);
|
this.setTitle(decodeURIComponent(PDFJS.getFilenameFromUrl(url)) || url);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// decodeURIComponent may throw URIError,
|
// decodeURIComponent may throw URIError,
|
||||||
// fall back to using the unprocessed url in that case
|
// fall back to using the unprocessed url in that case
|
||||||
|
Loading…
x
Reference in New Issue
Block a user