'How to block the url chrome://extension and new tab in my extension with manifest v3?

My google chrome extension has a background.js and content script that communicate with port.OnMessage but I have noticed that when I run my extension in Chrome://extension it throws an error because it is not a url and the same happens with a new google tab chrome which has no url. How could I block them?

On the internet I got information that said that they were blocked with

"exclude_matches": [
            "chrome://extensions/"
        ]

however, this doesn't work for the version 3 manifest. Also how could it tell you not to run the extension in a new tab (no url)

this is my manifest v3

"name":"Certified Records Full Certificate",
    "description":"Esta extensión permite grabar la pantalla o hacer capturas de pantalla",
    "version": "1.0",
    "manifest_version":3,    
    "background":{
        "service_worker":"background.js"        
    },  
    "content_scripts": [
        {
          "matches": ["<all_urls>"],
          "js": ["content-script.js"],
          "exclude_matches": [
            "chrome://extensions/"            
        ]
        }],  
    "permissions":["storage","activeTab","scripting","tabs","desktopCapture"],
    "action":{
        "default_popup":"popup.html",
        "default_icon":{
            "16":"/images/logo-16.png",
            "32":"/images/logo-32.png",
            "48": "/images/logo-48.png",
            "128": "/images/logo-128.png"
        }
    },
    "icons":{
        "16":"/images/logo-16.png",
        "32":"/images/logo-32.png",
        "48": "/images/logo-48.png",
        "128": "/images/logo-128.png"
    } }

this is my background.js

chrome.runtime.onConnect.addListener(function (port) {
  port.onMessage.addListener(function(msg){
        if (msg.type === 'SS_UI_REQUEST') {
          requestScreenSharing(port,msg);
        }
  });
});

function requestScreenSharing(port, msg) {  
  const sources = ['window'];
  const tab = port.sender.tab;
  desktopMediaRequestId = chrome.desktopCapture.chooseDesktopMedia(
    sources,
    port.sender.tab,
    streamId => {
      if (streamId) {
        msg.type = 'SS_DIALOG_SUCCESS';
        msg.streamId = streamId;
        msg.text ="sharing";        
      } else {
        msg.type = 'SS_DIALOG_CANCEL';
        msg.text ="cancel";
      }      
      
      var tab = getTabId();
      tab.then((value) => {                                
        const respuesta = chrome.tabs.connect(value.id, {
          name: "respuesta",
        });                
        respuesta.postMessage(msg);                              
      }); 

    }
  );
}

async function getTabId() {
  let queryOptions = { active: true, currentWindow: true };
  let [tab] = await chrome.tabs.query(queryOptions);
  return tab;
}

this is my content-script.js

chrome.runtime.onConnect.addListener(function (port) {
  port.onMessage.addListener(function(msg){
    if (msg.type === 'SS_UI_REQUEST') {
      console.log(msg);      
      var background = chrome.runtime.connect();
      background.postMessage(msg);  
    }        

    if (msg.type === 'SS_DIALOG_SUCCESS') {
      console.log(msg);                 
      startScreenStreamFrom(msg.streamId);      
    }        

    if (msg.type === 'SS_DIALOG_CANCEL') {
      console.log(msg);           
    }
    
    if(msg.type === "SS_UI_TAKESCREENSHOT")
    {
      console.log("tomar screenshot");
      TakeScreenShot();
    }

  });  

});

function startScreenStreamFrom(streamId) {
  console.log("compartiendo pantalla");
  navigator.mediaDevices
    .getUserMedia({
      audio: false,
      video: {
        mandatory: {
          chromeMediaSource: 'desktop',
          chromeMediaSourceId: streamId
        }
      }
    })
    .then(stream => {
        window.stream = stream;         
    });
}



async function TakeScreenShot(){          
  setTimeout(async () => {               
    const screen = window.stream;                                
    const track = screen.getVideoTracks()[0];               
    const imageCapture = new ImageCapture(track);                                                      
    await imageCapture.grabFrame()
    .then(function(bitmap) {           
    track.stop();        
    var canvas = document.createElement('canvas');                
    canvas.width = bitmap.width
    canvas.height = bitmap.height
    const context = canvas.getContext('2d')        
    context.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height)
    const image = canvas.toDataURL()    
    var link = document.createElement('a');
    link.download = 'FullCertificateCaptureScreen.png';
    link.href = image
    link.click();        
    })
    .catch(function(error) {
      track.stop();            
      console.log('grabFrame() error: ', error);
    });           
  }, 1000);    
}

this is the popup script

document.getElementById("btn-share").addEventListener("click", function(){  
  var tab = getTabId();
    tab.then((value) => {                        
      chrome.storage.local.set({'pestaña': value.id});
      const port = chrome.tabs.connect(value.id, {
        name: "conexion",
      });
      port.postMessage({ type: 'SS_UI_REQUEST', text: 'start' }, '*');                                    
    }); //fin de tab.then()       
})//fin de click addEventListener 


document.getElementById("btn-capture").addEventListener("click", async function(){
chrome.storage.local.get('pestaña', function (result) {    
  const port = chrome.tabs.connect(result.pestaña, {
    name: "tomarScreenShot",
  });  
  port.postMessage({ type: 'SS_UI_TAKESCREENSHOT', text: 'takescreenshot' }, '*');                                    
  window.close();
 }); 

});


async function getTabId() {
  let queryOptions = { active: true, currentWindow: true };
  let [tab] = await chrome.tabs.query(queryOptions);
  return tab;
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source