Проблема
Я создаю расширение для Chrome, которое загружает файлы и добавляет ссылки на эти загруженные файлы на веб-страницу. Когда щелкают эти ссылки, я хотел бы передать этот щелчок как «жест пользователя» моему фоновому скрипту, чтобы файл открывался без запроса. Глядя на документы по соответствующему методу, chrome.downloads.open , здесь нет обсуждения пользовательских жестов.
По сути, я хочу избавиться от этого =>
используя идею в этом комментарии .
Фон
Кажется, что это возможно, потому что
- В этом сообщении о , что составляет пользовательский жест. перечисляет щелчок как один из типов пользовательских жестов.
- Спецификация , в которой говорится, что щелчки будут генерировать пользовательский жест.
- В приведенном ниже коде запись
event
приводит к MouseEvent с типом click
и isTrusted
, установленным в true. [downloads.open] может выполняться только в коде, инициированном действием пользователя, например нажатием кнопки. Он не может быть выполнен из не пользовательских событий. - Xan, комментарий для Как открыть загруженный файл?
Код, приведенный ниже, предназначен для MCVE.
Скрипт содержимого
// Add an event listener for every download link
function addDownloadListeners() {
const pathElems = document.getElementsByClassName('pathClass');
for (path of pathElems) {
path.addEventListener('click', openDownload);
}
}
// Send a message with the download ID to the background script
function openDownload(event) {
const selector = '#' + event.currentTarget.id;
const downloadId = parseInt($(selector).attr('download_id'));
chrome.runtime.sendMessage({
'downloadId': downloadId,
}, function(response) {
if (response !== undefined) {
resolve(response.response);
} else {
reject(new Error(response.response));
}
});
}
manifest.json
{
"background": {
"scripts": ["js/background.js"]
},
"content_scripts": [
{
"js": [
"js/content_script.js"
],
"matches": ["*://*.website.com/*/urlpath*"],
"run_at": "document_end"
}
],
"permissions": [
"downloads",
"downloads.open"
],
"manifest_version": 2,
}
Фоновый скрипт
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
try {
chrome.downloads.open(request.downloadId);
} catch (e) {
sendResponse({response: 'Error opening file with download id ' +
request.downloadId + ' getting error ' + e.toString()
});
}
}
)
Вопрос
Как получить кликоткрыть загрузку, не создавая дополнительную подсказку?