From the documentation of tabs.sendMessage , extension can send a single message to the content script(s) in the specified tab. And the runtime.onMessage event will be fired in each content script running in the specified tab for the current extension. But while I am trying to make adblocker+  work as WebExtension without modification, I found the content script didn't receive the message sent through tabs.sendMessage.  https://developer.chrome.com/extensions/tabs#method-sendMessage  https://github.com/adblockplus/adblockpluschrome
When the Adblock Plus is first time installed, it will open a new tab with firstRun.html. This page contains some option button that allows user to change the configuration. I found the button icon didn't update when I click to change the configuration. The flow is something like, 1. User clicks the button on firstRun.html. 2. firstRun.html use runtime.sendMessage() to send message to the background page. 3. background page changes the configuration. 4. background page use tabs.sendMessage() to notify the configuration is changed. 5. But the firstRun.html seems not receive the notification, so the button didn't update.
`tabs.sendMessge` only sends messages to content scripts running in the given tab. Since firstRun.html is a tab page, rather than a content script, it doesn't receive those messages. You need to use `runtime.sendMessage` instead.
Chrome's documentation says the same , but in Chrome you can nevertheless use `tabs.sendMessage` to send to an extension page in a tab.  https://developer.chrome.com/extensions/tabs#method-sendMessage
Added to agenda for March 7 WebExtensions triage meeting. Agenda: https://docs.google.com/document/d/1zzfedbTKAHUmm4UctxSOIJV3iKayXQ8TuXPodXW8wC0/edit#