2012-02-18 2 views
0

컨텍스트 메뉴 항목을 추가하는 간단한 Safari 확장을 개발 중입니다.이 컨텍스트 메뉴 항목을 클릭하면 현재 페이지의 데이터로 특정 작업을 수행 할 수 있습니다. 제 injected-scripts.js에는 클릭 된 탭에 대해 상황에 맞는 메뉴가 표시되어야하는지 여부를 결정하는 기능이 있습니다 (validForContextMenu). 이 함수와 함께 탭에 내 컨텍스트 메뉴 항목이 표시되는지 여부를 알려주기 위해 다음 메시지를 내 global.html에 전달합니다. 이 모든 사실이 그렇다 아주 잘 밖으로 작동각 탭의 컨텍스트 메뉴 항목 유효성 검사

var contextMenuDisabled = true; 

function respondToMessage(theMessageEvent) { 
    if (theMessageEvent.name === "validate") { 
     contextMenuDisabled = theMessageEvent.message; 
    } 
} 

safari.application.activeBrowserWindow.activeTab.addEventListener("message", respondToMessage, false); 

function validateCommand(event) { 
    event.target.disabled = contextMenuDisabled; 
} 
safari.application.addEventListener("validate", validateCommand, false); 

: global.html에서

safari.self.tab.dispatchMessage("validate", validForContextMenu()); 

나는이 메시지를 듣고 injected-scripts.js에 의해 반환 된 데이터를 저장하고, 실제 검증을 수행하기 위해 다음을 수행하고 유효성 검사는 한 번만 수행되며 내 확장이로드 될 때 가장 앞에있는 탭/페이지에 대해서만 수행됩니다. 해당 페이지가 컨텍스트 메뉴에 유효하면 다른 모든 페이지도 마찬가지입니다. 반대의 경우도 마찬가지입니다. 유효성 검사를 Safaris 탭마다 개별적으로 수행하고 싶습니다.

Ca이 작업을 수행 하시겠습니까? 주입 된 스크립트 나 메시지 전달 방식에 뭔가 빠졌는가?

답변

1

global.html은 싱글 톤이므로 모든 탭에 하나의 변수 contextMenuDisabled 만 있습니다. Safari에는이 작업을위한 특수 API 인 safari.self.tab.setContextMenuEventUserInfo이 있습니다.

내 확장 프로그램에서 다음 코드를 사용합니다. inject.js에서 : global.js에서

document.addEventListener('contextmenu', onContextMenu, false); 

function onContextMenu(ev) { 
    var UserInfo = { 
    pageId: pageId 
    }; 
    var sel = document.getSelection(); 
    if (sel && !sel.isCollapsed) 
    UserInfo.isSel = true; 

    safari.self.tab.setContextMenuEventUserInfo(ev, UserInfo); 
}; 

:

safari.application.addEventListener('validate', onValidate, false); 

function onValidate(ev) { 
    switch (ev.command) { 
    case 'DownloadSel': 
    if (!ev.userInfo || !ev.userInfo.isSel) 
     ev.target.disabled = true; 
    break; 
    }; 
}; 
+0

감사합니다, 그건 난 후 정확히 무엇을했다! 'global.html'이 싱글 톤 (singleton)이라는 완벽한 의미를 갖습니다. 각 탭에 대한 유일한 인스턴스는 여러 가지 방법으로 확장 가능성을 제한했을 것입니다. – Simon