2013-05-13 3 views
3

글로벌 페이지와 통신해야하는 사파리 확장 팝업이 있습니다. 콘텐츠 스크립트에서 나는 이것을 사용하여사파리 확장 팝업에서 글로벌 페이지로 메시지 보내기

safari.self.tab.dispatchMessage(name,data); 

을 수행합니다. popover에서 나는 그것을 할 방법을 찾지 못했습니다. 나는 직접 글로벌 페이지의 메소드에 접근 할 수 있다는 것을 알고있다.

safari.extension.globalPage.contentWindow 

그러나 내 목표는 이미 콘텐츠 스크립트에 사용 된 코드 조각을 재사용하는 것이었다. 플러그인의 크롬 버전에서도 동일한 작업을 수행합니다.

는 팝 오버에서

safari.self.tab.dispatchMessage(name,data); 

을 에뮬레이트 조금 영리한 프록시 거기에 코드인가?

답변

3

popover 및 주입 스크립트에 다른 코드를 사용하는 것이 더 쉽습니다. 당신이 정말로 원하는 경우에, 당신은 이런 식으로 뭔가를 할 수 :

function dispatchMessage(name, message) { 
    if (safari.self.tab) { 
     safari.self.tab.dispatchMessage(name, message); 
    } else if (safari.extension.globalPage.contentWindow) { 
     safari.extension.globalPage.contentWindow.handleMessage({name: name, message: message}); 
    } 
} 

은 그럼 그냥 모두 당신의 팝 오버에 dispatchMessage('foo', 'bar')를 사용하여 스크립트를 주입. 메시지 이벤트 개체는 일반적으로 namemessage보다 많은 정보를 가지고 있기 때문에 handleMessage 함수가 실제로 글로벌 페이지에서 message 이벤트 수신기로 할당 된 함수와 동일한 지 확인해야합니다 .

+0

네가 맞다. 브라우저 아키텍처의 특정 측면이 약간 다르다하더라도 다르다. –

2

내가 다음에 설명 할 추상화 기능에 safari.self.tab.dispatchMessage 호출을 래핑하여 당신의 팝 오버에 메시지 기반 콘텐츠 스크립트 코드를 재사용 달성하기위한 간단한 방법 ...

하지만 먼저, 당신은 할 필요가 이 같은 모든 메시지를 처리하는 글로벌 페이지에서 하나의 이름 핸들러 함수를 알고 있어야합니다 :

각 다른 메시지에 대해 별도의 핸들러를 가지고, 또는 익명 함수를 사용하는 경우,이 방법은 경우
function handleMessage(evt) { 
    switch (evt.name) { 
     case 'Message1': 
      // do something with evt.message 
     break; 
     case 'Message2': 
      // do something else with evt.message 
     break; 
    } 
} 

safari.application.addEventListener('message', handleMessage, false); 

작동하지.

지금, 당신의 팝 오버 및 콘텐츠 스크립트에가는 래퍼 함수는 매우 간단합니다 : 다음

function tellGlobalPage(msgName, msgData) { 
    if (safari.self instanceof SafariExtensionPopover) { 
     // this script is running in a popover 
     var fakeMsgEvt = { name: msgName, message: msgData }; 
     safari.extension.globalPage.contentWindow.handleMessage(fakeMsgEvt); 
    } else { 
     // this script is a content script 
     safari.self.tab.dispatchMessage(msgName, msgData); 
    } 
} 

그리고이 단순한 접근 방식은 취급하지 않습니다 유의하시기 바랍니다 tellGlobalPage(name, data).

를 사용하는 대신 safari.self.tab.dispatchMessage(name, data),의 라운드 트립 메시징에서 popover 또는 content 스크립트가 글로벌 페이지로 메시지를 보내고 글로벌 페이지가 다른 메시지로 응답합니다. 이를 처리 할 수있는 다른 접근법이 있습니다.

+0

죄송합니다. Matt Swain이 광산을 구성하는 동안 동일한 답변을 게시했습니다. – canisbos

관련 문제