2013-10-25 4 views
2

자바 스크립트를 처음 사용하고 Chrome 확장 기능을 배우려고합니다. 생각할 수있는 모든 질문에 대한 내 검색을 실시했으나 발견 한 답변이 내 구체적인 문제에 대해 작동하지 않습니다. 크롬 확장을위한 자습서를 살펴 보았습니다. 실제로 작동해야한다고 생각하는 것은 사실 작동하지 않습니다.Chrome 확장 프로그램에서 content_scripts 일치가 무시되고 있습니다.

내가 작성한 확장 프로그램에는 html 페이지가 없으며 항상 실행해야하는 아이콘 만 있습니다. 실제로는 완벽하게 작동하여 채팅 창을 열지 못하도록 특정 채팅 프로그램에 대한 호출을 차단합니다. 오랫동안 사이트에 있어야하고 채팅 창을 닫지 않으려는 테스터를 위해 작성되었습니다.

확장 기능은 모든 웹 사이트에서 작동하며 한 웹 사이트에서만 작동하는 것이 문제입니다. 즉, 사용자가 동일한 채팅 소프트웨어를 사용하는 다른 웹 사이트에있을 때 채팅 창이 차단됩니다.

내가 읽은 것은 manifest.json의 content_scripts 블록에서 사용하려는 웹 사이트와 일치하는 항목을 사용하면 해당 사이트에서만 확장 프로그램이 실행됩니다. 작동하지 않습니다. 사실 manifest 파일에서 content_scripts 블록을 완전히 제거하면 확장 기능은 완전히 동일하게 작동합니다. javascript 함수가 호출되고 채팅 창이 차단됩니다. 따라서 어떤 이유 때문에 content_scripts 블록이 무시되고 있습니다. javascript 멍청한 놈처럼, 나는 중요한 단계를 빠뜨린 것 같아. 나는이 코드의 대부분을 예제에서 가지고 약간 수정했다. 누구든지 도와 줄 수 있습니까?

의 manifest.json :

{ 
    "manifest_version": 2, 
    "version": "1.0", 
    "name": "ChatBlock", 
    "description": "Shut down liveperson chat on mywebsite.com before it runs.", 

    "permissions": [   
    "tabs", 
    "webRequest", 
    "webRequestBlocking", 
    "*://sales.liveperson.net/" 
    ], 
    "web_accessible_resources": ["jquery-1.10.2.min.js"], 
    "content_scripts": [ 
    { 
     "matches": ["*://*.mywebsite.com/*"], 
     "js": ["jquery-1.10.2.min.js"] 
    } 
    ], 
    "browser_action": { 
    "default_icon": "chatblockIcon.png" 
    }, 
    "background": { 
    "scripts": ["avoid.js"] 
    } 

    } 

자바 스크립트 파일 (avoid.js) :

chrome.webRequest.onBeforeRequest.addListener(
    function(details) { 
    return { 
     cancel: true 
     }; 
    }, 
    {urls: ["*://sales.liveperson.net/*"]}, 
    ["blocking"]); 

편집 : 내 매니페스트에서 JQuery와에 대한 참조를 제거했습니다. 이 도구는 여전히 똑같이 작동하지 않으므로 아래 주석은 정확했지만 필요한 것은 아니 었습니다 - thanks @ExpertSystem. 그러나 차단은 여전히 ​​모든 웹 사이트에서 발생합니다. 나는 이전에 (이 질문을 게시하기 전에) @ ExpertSystem의 두 번째 제안에서 원하는 웹 사이트의 탭을 확인하거나 리퍼러를 확인하려고 시도했지만 제대로 작동하도록 올바른 JavaScript 구문을 찾을 수 없었습니다. 또한, 나는 "매치"속성을 사용하는 것에 매우 관심이있어서 가능한 경우 자바 스크립트가 더 일반적입니다. 나는 아직도 "성냥"이 작동하지 않는 이유에 대해 혼란스러워합니다 - 성냥과 관련하여 내가 뭘 잘못하고 있습니까? 의 manifest.json의

새로운 버전 :

{ 
    "manifest_version": 2, 
    "version": "1.0", 
    "name": "ChatBlock", 
    "description": "Shut down liveperson chat on myWebsite.com before it runs.", 

    "permissions": [   
    "tabs", 
    "webRequest", 
    "webRequestBlocking", 
    "*://sales.liveperson.net/" 
    ], 
    "content_scripts": [ 
    { 
     "matches": ["*://*.myWebsite.com/*"], 
     "js": ["avoid.js"] 
    } 
    ], 
    "browser_action": { 
    "default_icon": "chatblockIcon.png" 
    }, 
    "background": { 
    "scripts": ["avoid.js"] 
    } 

    } 
+0

감사합니다, @ExpertSystem을, 의견을 남겨주. 귀하의 제안에 따라 manifest.json에서 jquery를 제거했습니다. 사용중인 작은 자바 스크립트 스 니펫에 필요가 없다고 말하는 것 같았습니다. 위의 편집을 참조하십시오. content_scripts 블록의 "matches"속성이 작동하지 않는 이유를 이해하는 데 여전히 관심이 있습니다. 내가 잘못 사용하고 있습니까? – hengist

+0

당신의 "matches"속성은 작동하지만, 내용 스크립트로'avoid.js'를 주입해도 효과가 없습니다. 왜냐하면'chrome.webRequest'는 내용 스크립트에서 사용할 수 없기 때문입니다. 백그라운드 페이지의'avoid.js'는 작동하지만 요청의 출처를 구별 할 방법이 없으므로 ** 모든 ** 탭에서 liveperson.com에 대한 요청을 차단합니다. (BTW, 콘텐츠 스크립트 및 배경 페이지와 동일한 스크립트를 실행하는 것은 좋지 않습니다.) – gkalpak

+0

업데이트 된 답변도 참조하십시오. – gkalpak

답변

2

당신은 귀하의 콘텐츠-스크립트와 jQuery를 주입하고 있지만 자신에 그녀는 쓸모가 없다. 또한 백그라운드 페이지에서 liveperson.com으로 웹 요청을 듣고 모든 사이트에서 취소합니다.

mywebsite.com에서 오는 요청을 구분하고 차단해야합니다. (I는 또한, jQuery를 주입하기위한 어떤 이유가 표시되지 않습니다.) 수 있습니다 요청을 구별하는

가능한 방법 :

  1. 을 헤더를 통해 details.requestHeaders (mywebsite.com 경우 세트와 같은 적절한 헤더를, 예를 들어 referer을).
  2. 백그라운드 페이지 (chrome.tabs.onUpdated 청취자를 통해)에서 mywebsite.com을 실행중인 열린 탭을 추적하고 details.tabId을 기반으로 webRequests를 필터링합니다.

...하지만 여기에는 더 많은 것이 있습니다.


위의 두 번째 옵션의 내 데모 구현 ...

의 manifest.json :

... 
"background": { 
    // Unfortunately, chrome.webRequest 
    // requires a persistent background page 
    "persistent": true, 
    "scripts": [ 
     "background.js" 
    ] 
}, 

"content_scripts": [ 
    { 
     "matches": [ 
      "*://<website1>/*", 
      "*://<website2>/*", 
      ... 
     ], 
     "js":   ["content.js"], 
     "run_at":  "document_idle", 
     "all_frames": false 
    } 
], 

"permissions": [ 
    "webRequest", 
    "webRequestBlocking", 
    "*://sales.liveperson.net/*" 
] 

content.js :

chrome.runtime.sendMessage({ text: "block_me" }); 

혈중 알코올 농도 kground.js :

// Add a tab ID to the blocking list 
function addToList(tabId) { 
    localStorage.setItem(tabId, "1"); 
    console.log("Added to list: tab " + tabId); 
    console.log("Currently blocking tabs: ", localStorage); 
} 

// Checks if a tab ID is in the blocking list 
function isInList(tabId) { 
    return (localStorage.getItem(tabId) !== null); 
} 

// Remove a tab ID from the blocking list 
function removeFromList(tabId) { 
    localStorage.removeItem(tabId); 
    console.log("Removed from list: tab " + tabId); 
    console.log("Currently blocking: ", localStorage); 
} 

// Listen for messages from content scripts 
chrome.runtime.onMessage.addListener(function(msg, sender) { 
    if (msg.text && (msg.text == "block_me")) { 
     addToList(sender.tab.id); 
    } 
}); 

// Stop blocking a tab when its is closed 
chrome.tabs.onRemoved.addListener(removeFromList); 

// Stop blocking a tab when its is updated 
// (If applicable, the newly injected content script will notify us.) 
chrome.tabs.onUpdated.addListener(function(tabId, info, tab) { 
    if (info.status && (info.status == "loading")) { 
     removeFromList(tabId); 
    } 
}); 


// Handle a web-request, i.e. either allow it or block it 
function handleRequest(details) { 
    var block = isInList(details.tabId); 
    console.log("Request from tab " + details.tabId + " - Blocked: " + block); 
    console.log("Request details: ", details); 
    return { cancel: block }; 
} 

// Block any request to 'sales.liveperson.net', 
// if it originates from a tab in our blocking list. 
chrome.webRequest.onBeforeRequest.addListener(
     handleRequest, 
     { urls: ["*://sales.liveperson.net/*"] }, 
     ["blocking"]); 

(프로덕션 배포를 들어, console.log 호출을 제거 할 수 있습니다.)

관련 문제