---
name: cdp_new_tab_background
kind: function
lang: go
domain: browser
version: 1.0.0
purity: impure
signature: "func CdpNewTabBackground(host string, port int, startURL string) (CdpTab, error)"
description: "Abre una pestaña nueva via CDP Target.createTarget con background:true, sin activarla ni elevar la ventana del navegador (no roba el foco del WM). Drop-in sin-foco de CdpNewTab: misma firma y mismo CdpTab de retorno, pero usando el comando CDP browser-level en lugar del endpoint HTTP /json/new (que SI roba foco)."
tags: [browser, cdp, tabs, spawn, background, no-focus]
uses_functions: [cdp_list_tabs_go_browser]
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [fmt]
example: |
  tab, err := browser.CdpNewTabBackground("localhost", 9333, "https://example.com")
  if err == nil {
      fmt.Println("nueva tab en segundo plano id=", tab.ID)
  }
tested: true
tests: ["TestCdpNewTabBackground_closedPort", "TestCdpNewTabBackground_emptyStartURLClosedPort"]
test_file_path: "functions/browser/cdp_new_tab_background_test.go"
file_path: "functions/browser/cdp_new_tab_background.go"
notes: |
  - Usa los helpers privados del paquete: cdpGetWSURL (browser-level WS),
    cdpConnectWS, (*CDPConn).sendCDP y CdpListTabs. No reescribe el transporte CDP.
  - El cierre del WebSocket se hace con CdpDisconnect (solo suelta la sesion, deja
    el navegador vivo).
  - Resuelve el CdpTab completo via CdpListTabs buscando por targetId; si hay
    carrera y aun no aparece, devuelve un CdpTab minimo (id, type, url) como fallback.
documentation: |
  Alternativa a CdpNewTab cuando NO quieres que la ventana del navegador robe el
  foco del window manager — por ejemplo, mientras el usuario escribe en otra
  ventana. El endpoint HTTP /json/new no admite el parametro background, asi que
  CdpNewTab siempre eleva la ventana; esta funcion usa Target.createTarget con
  "background": true para crear la pestaña en segundo plano.
params:
  - name: host
    desc: "Host CDP donde escucha el navegador (vacio = localhost)."
  - name: port
    desc: "Puerto remote-debugging de Chrome/Chromium (ej. 9333)."
  - name: startURL
    desc: "URL inicial de la pestaña. Vacio = about:blank."
output: "CdpTab del target recien creado (id, webSocketDebuggerUrl, title, url, ...). Error si /json/version o el comando CDP fallan."
---

## Ejemplo

```go
// Abrir una pestaña en segundo plano sin robar el foco del usuario.
tab, err := browser.CdpNewTabBackground("localhost", 9333, "https://example.com")
if err != nil {
    log.Fatal(err)
}
fmt.Println("pestaña creada en background:", tab.ID, tab.URL)
```

## Cuando usarla

Cuando abras una pestaña por CDP y NO quieras que la ventana del navegador robe
el foco del WM (el usuario esta escribiendo en otra ventana). Alternativa
sin-foco a `CdpNewTab` / endpoint HTTP `/json/new`, que siempre eleva la ventana.

## Gotchas

- Funcion impura: abre un WebSocket al navegador y manda un comando CDP. Falla si
  el puerto no responde o el comando no devuelve `targetId`.
- El parametro `background` de `Target.createTarget` no aplica en MacOS (alli la
  pestaña se activa igual). Esto esta pensado para Linux/Chromium.
- Requiere conexion **browser-level** (`/json/version`), no page-level: por eso usa
  `cdpGetWSURL` y no la primera tab `page`.
- Si el navegador corre headless, el foco es irrelevante — `CdpNewTab` y esta
  funcion son equivalentes en ese caso.
