Расширение Safari, доступ к странице / контенту прямо с панели инструментов? - PullRequest
3 голосов
/ 23 сентября 2011

Возможно ли получить доступ к веб-контенту непосредственно с панели инструментов (Safari)?Теперь я могу получить к нему доступ из контекстного меню, но понятия не имею, как я могу получить те же функции на панели инструментов.

Вот что я получил:

// injected
document.addEventListener("contextmenu", handleMessage, false);
function handleMessage(msgEvent) {
     var sel = '';
     sel = window.parent.getSelection()+'';
     safari.self.tab.setContextMenuEventUserInfo(msgEvent, sel);
}

// global
safari.application .addEventListener("command", performCommand, false); 
function performCommand(event) {
console.log('performCommand');
     if (event.command == "abc") {
          var query = event.userInfo;
          console.log(query);
          alert(query);
     }
}

Но как мне напрямую это содержимоес панели инструментов ??

Ответы [ 2 ]

6 голосов
/ 09 января 2012

ОК, в основном это работает так:

  • в глобальном масштабе вызывается executeCommand (при нажатии на панель инструментов), отправляющее событие
  • это событие перехватывается в handleGextText
  • в handleGextText вы делаете то, что вам нужно, и вызываете safari.self.tab.dispatchMessage, это возвращает событие обратно в глобальное
  • в глобальном вас событие поймано handleEvent

>

// Global Script
safari.application.addEventListener("command", performCommand, false);  
safari.application.addEventListener("message", handleEvent, false);

// send message
function performCommand(event) {
    console.log('command:' + event.command);

    if (event.command == "abc") {
        console.log("msg: my message");
        safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("msg", "do-something");           
    }       
}

function handleEvent(event) {
    var messageName = event.name;
    console.log("evenname:" + event.name);      
    if (messageName === "did-something") { 

        var msg = event.message;

        // do something
    }       
}


// Injected Script
if (window.top === window) { // inject only once!
    console.log("add event listners [injected.js]");
    safari.self.addEventListener("message", handleGextText, false);
}

function handleGextText(event) {
    console.log("evenname:" + event.name);
    console.log("evenmsg :" + event.message);

    var messageName = event.name;
    var messageData = event.message;
    if (messageName === "msg") { 
        if (messageData === "do-something") {           
            console.log('msg received: ' + event.name);
            var sel = '';

            // do what you need to do and  dispatch message back to Global
            console.log("send message to toolbar");             
            safari.self.tab.dispatchMessage("did-something", sel);          
        }
     }
}
1 голос
/ 24 сентября 2011

ОК, хорошо нашел.Я решил это с помощью сообщений.

Я отправляю в 'global' сообщение, которое ловится введенным скриптом.Эта функция получает выделенный текст (помещает его в userinfo) и отправляет сообщение обратно в global.

Вот так.

...