Как вы фиксируете клик как жест пользователя? - PullRequest
0 голосов
/ 29 октября 2019

Проблема

Я создаю расширение для Chrome, которое загружает файлы и добавляет ссылки на эти загруженные файлы на веб-страницу. Когда щелкают эти ссылки, я хотел бы передать этот щелчок как «жест пользователя» моему фоновому скрипту, чтобы файл открывался без запроса. Глядя на документы по соответствующему методу, chrome.downloads.open , здесь нет обсуждения пользовательских жестов.

По сути, я хочу избавиться от этого => prompt I would like to preempt

используя идею в этом комментарии .

Фон

Кажется, что это возможно, потому что

  • В этом сообщении о , что составляет пользовательский жест. перечисляет щелчок как один из типов пользовательских жестов.
  • Спецификация , в которой говорится, что щелчки будут генерировать пользовательский жест.
  • В приведенном ниже коде запись 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()
      });
    }
  }
)

Вопрос

Как получить кликоткрыть загрузку, не создавая дополнительную подсказку?

1 Ответ

0 голосов
/ 31 октября 2019

Это невозможно

Невозможно предотвратить / использовать альтернативу приглашениям для хромированных методов, требующих согласия пользователя. Исходя из этого обсуждения в группе Google Chromium Extension,

  • Некоторые методы Chrome (например, chrome.downloads.open) должны получать согласие пользователя через приглашение.
  • Этиавтоматически генерируются через сам Chrome - их нельзя переопределить или изменить.
  • Пользовательские жесты вне приглашений не относятся к методам, требующим согласия пользователя.

Это текущее поведение около 2014 для chrome.downloads.open.

Особая благодарность @wOxxOm и Деклину Джонстону за возможность ответить на этот вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...