[CRX] Add file chooser as fallback (fixes #9411)
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.
This commit is contained in:
parent
df516c0a52
commit
29c370af27
@ -597,7 +597,7 @@ let PDFViewerApplication = {
|
||||
args = { length, };
|
||||
}
|
||||
if (originalURL !== undefined) {
|
||||
file = { file: url, originalURL, };
|
||||
file = { url, originalURL, };
|
||||
}
|
||||
PDFViewerApplication.open(file, args);
|
||||
},
|
||||
|
@ -91,7 +91,7 @@ let ChromeCom = {
|
||||
if (isAllowedAccess) {
|
||||
callback(file);
|
||||
} else {
|
||||
requestAccessToLocalFile(file, overlayManager);
|
||||
requestAccessToLocalFile(file, overlayManager, callback);
|
||||
}
|
||||
});
|
||||
});
|
||||
@ -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
|
||||
@ -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');
|
||||
});
|
||||
}
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user