Skip to content

Commit

Permalink
[CRX] Add file chooser as fallback (fixes mozilla#9411)
Browse files Browse the repository at this point in the history
Test case to exercise the different encodings:
1. Create a file "some file#@%M<br>%25 .pdf"
2. Build the extension with `gulp chromium` and load it in Chrome.
3. Go to `chrome://extensions/` and ensure that the
   "Allow access to file URLs" is disabled.
4. Try to open the file from step 1 in Chrome (maybe reload once).
5. PDF.js should be showing a file chooser button.
6. Click on that button and select a different file.

   Test: Check that a confirmation dialog pops up that warns about
   a different file name. Cancel the dialog.

7. Click on the button again and select the original file.

   Test: Check that the file opens as expected.
  • Loading branch information
Rob--W committed Mar 21, 2018
1 parent cfbde53 commit 4367966
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 3 deletions.
2 changes: 1 addition & 1 deletion web/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -597,7 +597,7 @@ let PDFViewerApplication = {
args = { length, };
}
if (originalURL !== undefined) {
file = { file: url, originalURL, };
file = { url, originalURL, };
}
PDFViewerApplication.open(file, args);
},
Expand Down
27 changes: 25 additions & 2 deletions web/chromecom.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ let ChromeCom = {
if (isAllowedAccess) {
callback(file);
} else {
requestAccessToLocalFile(file, overlayManager);
requestAccessToLocalFile(file, overlayManager, callback);
}
});
});
Expand Down Expand Up @@ -137,7 +137,7 @@ function reloadIfRuntimeIsUnavailable() {
}

let chromeFileAccessOverlayPromise;
function requestAccessToLocalFile(fileUrl, overlayManager) {
function requestAccessToLocalFile(fileUrl, overlayManager, callback) {
let onCloseOverlay = null;
if (top !== window) {
// When the extension reloads after receiving new permissions, the pages
Expand Down Expand Up @@ -197,6 +197,29 @@ function requestAccessToLocalFile(fileUrl, overlayManager) {
// why this permission request is shown.
document.getElementById('chrome-url-of-local-file').textContent = fileUrl;

document.getElementById('chrome-file-fallback').onchange = function() {
let file = this.files[0];
if (file) {
let originalFilename = decodeURIComponent(fileUrl.split('/').pop());
let originalURL = fileUrl;
if (originalFilename !== file.name) {
let msg = 'The selected file does not match the original file.' +
'\nOriginal: ' + originalFilename +
'\nSelected: ' + file.name +
'\nDo you want to open the selected file?';
if (!confirm(msg)) {
this.value = '';
return;
}
// There is no way to retrieve the original URL from the File object.
// So just generate a fake path.
originalURL = 'file:///fakepath/to/' + encodeURIComponent(file.name);
}
callback(URL.createObjectURL(file), file.size, originalURL);
overlayManager.close('chromeFileAccessOverlay');
}
};

overlayManager.open('chromeFileAccessOverlay');
});
}
Expand Down
6 changes: 6 additions & 0 deletions web/viewer-snippet-chrome-overlays.html
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,11 @@
to view <span id="chrome-url-of-local-file">this PDF file.</span>
</p>
</div>
<div class="row">
<p>
or select the file again:
<input type="file" id="chrome-file-fallback" accept=".pdf">
</p>
</div>
</div>
</div>

0 comments on commit 4367966

Please sign in to comment.