9

Tôi đang tạo tiện ích mở rộng chrome sẽ mở tất cả các liên kết trên một trang trong tab mới.Lỗi nội dung-chính sách trong phần mở rộng của google chrome

Dưới đây là file mã của tôi:

manifest.json

{ 
    "name": "A browser action which changes its icon when clicked.", 
    "version": "1.1", 
    "permissions": [ 
    "tabs", "<all_urls>" 
    ], 
"browser_action": {  
    "default_title": "links",  // optional; shown in tooltip 
    "default_popup": "popup.html"  // optional 
    }, 
"content_scripts": [ 
    { 
    "matches": [ "<all_urls>" ], 
     "js": ["background.js"] 
    } 
    ], 
    "manifest_version": 2 
} 

popup.html

<!doctype html> 
<html> 
    <head> 
    <title>My Awesome Popup!</title> 
    <script> 
function getPageandSelectedTextIndex() 
    { 
    chrome.tabs.getSelected(null, function(tab) { 
    chrome.tabs.sendRequest(tab.id, {greeting: "hello"}, function (response) 
    { 
     console.log(response.farewell); 
    }); 
    }); 
     } 
chrome.browserAction.onClicked.addListener(function(tab) { 
     getPageandSelectedTextIndex(); 
}); 
     </script> 
    </head> 
    <body> 
    <button onclick="getPageandSelectedTextIndex()"> 
     </button> 
    </body> 
</html> 

background.js

chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) { 
    console.log(sender.tab ? 
       "from a content script:" + sender.tab.url : 
       "from the extension"); 
    if (request.greeting == "hello") 
    updateIcon(); 

}); 
function updateIcon() { 
    var allLinks = document.links; 
    for (var i=0; i<allLinks.length; i++) { 
    alllinks[i].style.backgroundColor='#ffff00'; 

} 
} 

Ban đầu tôi muốn đánh dấu tất cả các liên kết trên t anh ta trang hoặc đánh dấu chúng theo một cách nào đó; nhưng tôi nhận được lỗi "Từ chối thực thi tập lệnh nội tuyến vì Nội dung-Bảo mật-Chính sách".

Khi tôi nhấn nút bên trong cửa sổ bật lên, tôi gặp lỗi này: Refused to execute inline event handler because of Content-Security-Policy.

Vui lòng giúp tôi khắc phục các lỗi này, vì vậy tôi có thể mở tất cả các liên kết trong tab mới bằng tiện ích mở rộng chrome của tôi.

Trả lời

18

Một trong những hậu quả của "manifest_version": 2Content Security Policy được bật theo mặc định. Và các nhà phát triển Chrome chọn nghiêm ngặt về nó và luôn không cho phép mã JavaScript nội tuyến - chỉ mã được đặt trong tệp JavaScript bên ngoài mới được phép thực thi (để ngăn chặn Cross-Site Scripting vulnerabilities trong tiện ích mở rộng). Vì vậy, thay vì quy định getPageandSelectedTextIndex() chức năng trong popup.html bạn nên đặt nó vào một tập tin popup.js và bao gồm nó trong popup.html:

<script type="text/javascript" src="popup.js"></script> 

<button onclick="getPageandSelectedTextIndex()"> phải được thay đổi là tốt, onclick thuộc tính cũng là một kịch bản nội tuyến. Bạn nên chỉ định thuộc tính ID thay thế: <button id="button">. Sau đó, trong popup.js, bạn có thể đính kèm trình xử lý sự kiện vào nút đó:

window.addEventListener("load", function() 
{ 
    document.getElementById("button") 
      .addEventListener("click", getPageandSelectedTextIndex, false); 
}, false); 
+0

Chỉ cần đánh tôi với nó. Câu trả lời hoàn hảo và chính xác là những gì bạn cần làm. – Alasdair

+0

k thanks..i sẽ thử nó – Saad

+0

Điều này thật ngu ngốc. Ai nảy ra ý tưởng này ?! Bây giờ tôi phải thay đổi tất cả onclicks nội tuyến của tôi và đặt chúng trong một tập tin js bên ngoài. Và tôi có một loạt các tập tin bao gồm cả chúng. –