Are content_scripts not automatically injected anymore with Manifest V3?

I have an extension doing two things: have some JS in content script and have a page_action button with a popup. It works fine with MV2, event without any host_permissions, but when I converted it to MV3 the content script is only executed when I click page_action button, not on page load.

Let’s say I have only this on content.js:

console.log("load");

Manifest.json:

"content_scripts": [
		{
			"matches": [
				"*://*.example.com/*"
			],
			"js": [
				"content.js"
			],
			"run_at": "document_idle"
		}
	]
...
"permissions": [
		"tabs",
		"storage"
	]
...
"host_permissions": [
		"*://*.example.com/*"
	]

On example.com I don’t see any “load” message on page load but when I click page_action button I do see it. Did the content_script changed in MV3 or am I missing a something?

Yes, there is a change that happened with MV3.

All MV3 permissions, including host permissions, are opt-in for users. This means that the user must grant permission to the extension and can do this either as per-visit or always for domain.

If a user has MV3 extension installed and it requires permissions to be run, it will show up in the taskbar or Unified Extensions Button with an icon indicating that action is required.

Thanks a lot for the info.

Will the unified button ask user for permissions at install time or will we need to request permissions using permissions api?

Currently the button will signal that a permission needs to be granted when that situation happens. For example, if an extension wants host permissions for example.com, the user will see that indicator when they navigate to example.com.

They can then decide whether they want to grant access for that visit only or always allow example.com.

Got it, thanks for the help.