Сценарий копирования/вставки содержимого из буфера обмена (расширение Chrome)

Я использую сценарий содержимого для управления данными в DOM. Я успешно использовал document.execCommand('copy'); на всплывающей странице.

Сейчас я ищу способ заставить его работать над сценарием контента. Я проверил ограничения для скриптов содержимого здесь, но я не понимаю, ограничено ли управление буфером обмена или нет. Я также проверил ответы здесь - в stackoverflow, но кажется, что большинство из них неясны, а некоторые - несколько лет назад, поэтому могли быть изменения.

Даже если он ограничен, возможно ли какое-то обходное решение?

Спасибо!

Я публикую текущий сценарий, который у меня есть.

manifest.json

{
  "name": "Page action by URL",
  "version": "1.0",
  "description": "Прибавка за обработка на данните от НБДН.",
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "page_action" :
  {
    "default_icon" : "icon-19.png",
    "default_title" : "Приложение за НБД за PHP"
  },
  "permissions" : [
    "clipboardWrite",
    "clipboardRead",
    "declarativeContent",
    "activeTab",
    "tabs",
    "https://nbd.grao.government.bg/graoappshort/*"
  ],
  "icons" : {
    "48" : "icon-48.png",
    "128" : "icon-128.png"
  },
  "manifest_version": 2
}

фон.js

chrome.runtime.onInstalled.addListener(function() {
  // Replace all rules ...
  chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
    // With a new rule ...
    chrome.declarativeContent.onPageChanged.addRules([
      {
        conditions: [
          new chrome.declarativeContent.PageStateMatcher({
            pageUrl: { urlContains: 'nbd.grao.government.bg/graoappshort/' },
          })
        ],
        actions: [ new chrome.declarativeContent.ShowPageAction() ]
      }
    ]);
  });
});


chrome.pageAction.onClicked.addListener(function(tab) {
  chrome.tabs.executeScript(null, {file: 'page-editor.js'});
  chrome.tabs.insertCSS(null, {file: "style-inject.css"});
});

и функция внутри page-editor.js

function(){
      var copyFrom = document.createElement("textarea");
      copyFrom.textContent = PoleIME.value;
      document.body.appendChild(copyFrom);
      copyFrom.focus();
      document.execCommand('SelectAll');
      document.execCommand('Copy');
      //document.body.removeChild(copyFrom);
      }

person Yavor Tashev    schedule 02.09.2014    source источник
comment
Можете ли вы подтвердить, что скрипт вообще внедряется? Вы также должны попробовать передать tab.id вместо null.   -  person Xan    schedule 02.09.2014
comment
Что такое PoleIME? Он содержится в вашем page-editor.js или в собственном скрипте страницы?   -  person Xan    schedule 02.09.2014
comment
Да, я подтверждаю, что скрипт внедрен и DOM успешно манипулируется. PoleIME — это поле ввода, которое заполняется данными. Он содержится в нем скрипт. Текстовое поле copyForm успешно добавлено к телу, успешно заполнено и выбрано. Результат вижу на странице, но функция копирования не работает. Весь скрипт в рабочем состоянии и не оптимизирован и составляет 6600 строк - поэтому я его не включал.   -  person Yavor Tashev    schedule 02.09.2014


Ответы (1)


Скрипты контента не могут использовать буфер обмена в данный момент. В будущем однажды crbug.com/395376 разрешен, тогда код, показанный в вопросе, будет работать по назначению.

Пока эта ошибка не будет исправлена, вы должны отправить данные на фоновую страницу и скопировать оттуда текст:

// content script
chrome.runtime.sendMessage({
    type: 'copy',
    text: 'some text to copy'
});

Скрипт на фоновой странице или страница события:

chrome.runtime.onMessage.addListener(function(message) {
    if (message && message.type == 'copy') {
        var input = document.createElement('textarea');
        document.body.appendChild(input);
        input.value = message.text;
        input.focus();
        input.select();
        document.execCommand('Copy');
        input.remove();
    }
});
person Rob W    schedule 02.09.2014
comment
Спасибо большое за вашу помощь. Надеюсь, я заставлю эту штуку работать завтра в офисе. Потом прокомментирую. - person Yavor Tashev; 02.09.2014
comment
РАБОТАЕТ ОТЛИЧНО! Ты великолепен :) - person Yavor Tashev; 03.09.2014
comment
Статус ошибки исправлен с 9/2014. - person Günter Zöchbauer; 25.02.2015
comment
Я не могу получить эту работу на своем Mac [версия Chrome 49.0.2623.87 (64-разрядная версия)] - person Brook; 19.03.2016
comment
@Brook Это работает здесь (Linux), так что, вероятно, это ошибка, специфичная для Mac. В отслеживаемой проблеме довольно много ошибок, например. crbug.com/467296. Ваша ошибка звучит как crbug.com/334062, приложения: запись в буфер обмена не работает с фоновой страницы, но работает со страницы окна приложения. Кто-то предложил использовать ненулевую ширину для элемента <html> или <body>. Попробуйте! - person Rob W; 19.03.2016