I\'m trying to write a Chrome extension that will have a bar at the top of certain webpages. If I have my content script like this:
$(\'body\').prepend(\'&l
FYI, now in 2020, chrome.extension.onRequest is deprecated and causes an error when loading the extension. Instead, chrome.runtime.sendMessage should be used. For content.js, the code would now be:
chrome.runtime.sendMessage({cmd: "read_file"}, function(html){
$("#topbar").html(html);
});
and for background.js the code would now be:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if(request.cmd == "read_file") {
$.ajax({
url: chrome.extension.getURL("topbar.html"),
dataType: "html",
success: sendResponse
});
return true;
}
})
be sure to note the 'return true' after the ajax, that tripped me up
URL of a file inside an extenion folder has the following format:
chrome-extension://<ID>/topbar.html
You can get this path by running:
chrome.extension.getURL("topbar.html")
Now if you try to do:
$('#topbar').load(chrome.extension.getURL("topbar.html"));
it wouldn't let you because of cross-origin policy. Background pages don't have this limitation, so you would need to load HTML there and pass result to a content script:
content_script.js:
chrome.extension.sendRequest({cmd: "read_file"}, function(html){
$("#topbar").html(html);
});
background.html:
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
if(request.cmd == "read_file") {
$.ajax({
url: chrome.extension.getURL("topbar.html"),
dataType: "html",
success: sendResponse
});
}
})
In a real world you probably would read topbar.html only once and then reuse it.
While the above solution does work, one thing to pay attention to is that you need to return true from the event handler so that the communication port can still be available after the $.ajax call succeeds.
see below for more information. https://code.google.com/p/chromium/issues/detail?id=307034