This question helped me with my extension, recognizing the difference between a new page and loading content on the same page, so thought I'd share my solution. First you need to call onUpdated in background.js:
Manifest
{ "name": "My test extension", "version": "1", "manifest_version": 2, "background": { "scripts":["background.js"] }, "content_scripts": [ { "matches": ["http://*/*", "https://*/*"], "js": ["contentscript.js"] } ], "permissions": [ "tabs" ] }
background.js
chrome.tabs.onUpdated.addListener( function(tabId, changeInfo, tab) { // read changeInfo data if (changeInfo.url) { // url has changed; do something here } } );
Then you can expand that script to send message data from background.js to your content script (using chrome.runtime.sendMessage):
background.js (con't)
chrome.tabs.onUpdated.addListener( function(tabId, changeInfo, tab) { // read changeInfo data if (changeInfo.url) { // url has changed; do something here // like send message to content script chrome.tabs.sendMessage( tabId, { message: 'hello!', url: changeInfo.url }) } } );
And finally listen for that data in your extension's content script to be used however:
contentscript.js
chrome.runtime.onMessage.addListener( function(request, sender, sendResponse) { // listen for messages sent from background.js if (request.message === 'hello!') { console.log(request.url) // new url is now in content scripts! } });
You can pass whatever data you'd like from background.js. Hope that helps someone! \ (•◡•) /