Скопируйте window.location.href в буфер обмена из расширения - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь скопировать 'window.location.href', например, URL текущей страницы в буфер обмена из моего расширения.

Моя проблема заключается в том, что когда я копирую URL в буфер обмена, это расширенияСкопированный URL, а не страница, которую я посещаю.

Панель расширений:

<!DOCTYPE HTML>
<html>
    <head>
        <button onclick="copyFunction();">Copy</button>
        <script type="text/javascript">
          function copyFunction() {
          var inputDump = document.createElement('input'),
              hrefText = window.location.href;
          document.body.appendChild(inputDump);
          inputDump.value = hrefText;
          inputDump.select();
          document.execCommand('copy');
          document.body.removeChild(inputDump);
          }
        </script>
    </head>
</html>

Насколько я понимаю, решение должно быть таким, но я боюсь, что я слишкомНе зная, как поступить: https://developer.apple.com/documentation/safariservices/safari_app_extensions/passing_messages_between_safari_app_extensions_and_injected_scripts

Вот как я (пытался) продолжить, создав страницу global.html и внедренный скрипт.

Глобальная страница:

<!DOCTYPE HTML>
<script>
    safari.application.addEventListener("command", copyFunction, false);

    function copyFunctionEvent(event) {
        if (event.command == "CopyToClipboard") {
            safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("CopyToClipboard", "all");

    }
}
</script>

Введенный сценарий:

function myextension_openAll(event){
    if (event.name == 'CopyToClipboard'){         
       function copyFunction() {
       var inputDump = document.createElement('input'),
           hrefText = window.location.href;
       document.body.appendChild(inputDump);
       inputDump.value = hrefText;
       inputDump.select();
       document.execCommand('copy');
       document.body.removeChild(inputDump);
       }

}
safari.self.addEventListener("message", myextension_openAll, true);

Факт: расширение сафари: //com.myextension-0000000000/abc123/extensionbar.html

Ожидается: http://www.google.com (например, если текущая вкладка)

1 Ответ

0 голосов
/ 10 февраля 2019

Из приведенного выше кода (Extensionbar html) вы, кажется, пишете устаревшее расширение Safari (.safariextz), и оно устарело.См. «Что нового в Safari и WebKit» на WWDC18

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

Создание проекта расширения приложения

Создание расширения приложения, следуя [Файл] -> [Создать] -> [Project ...], затем выберите [Safari Extension App] в Xcode. Шаблон проекта содержит пример реализации menubar.

Копирование location.href путем нажатия кнопки строки меню

Следующий коддобавит функциональность для копирования location.href при нажатии кнопки строки меню.

Просто вставьте это в SafariExtensionHandler.swift.

class SafariExtensionHandler: SFSafariExtensionHandler {

    override func messageReceived(withName messageName: String, from page: SFSafariPage, userInfo: [String : Any]?) {

        // WHen injected script calls safari.extension.dispatchMessage, the message will come here

        guard let href = userInfo?["href"] as? String else { return }

        // Save href to clipboard
        NSPasteboard.general.clearContents()
        NSPasteboard.general.setString(href, forType: .string)
    }

    override func toolbarItemClicked(in window: SFSafariWindow) {
        // Request injected script a message to send location.href
        window.getActiveTab { currentTab in
            currentTab!.getActivePage { currentPage in
                currentPage!.dispatchMessageToScript(withName: "getHref", userInfo: nil)
            }
        }
    }
}

И вставьте скрипт (script.js) следующим образом.

safari.self.addEventListener("message", function(event) {
  console.log("event received");
  safari.extension.dispatchMessage("sendHref", { "href": location.href });
});

Рабочий пример

Полный рабочий код здесь, это может помочь вашей работе. Удачи:)

https://github.com/horimislime/safari-extension-menubar-example

...