---
name: list_chrome_profiles
kind: function
lang: go
domain: browser
version: "1.0.0"
purity: impure
signature: "func ListChromeProfiles(userDataDir string) ([]ChromeProfile, error)"
description: "Lista los perfiles de un user-data-dir de Chrome/Chromium. Devuelve Dir (nombre del directorio para --profile-directory), Name (nombre legible de Local State), Extensions (nº de carpetas en Extensions excl. Temp) y HasPreferences. Si userDataDir es vacío usa ~/.config/chromium."
tags: [chrome, chromium, browser, profile, navegator]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: ["encoding/json", "os", "path/filepath", "sort"]
params:
  - name: userDataDir
    desc: "Ruta al user-data-dir de Chrome/Chromium. Vacío = ~/.config/chromium."
output: "Slice de ChromeProfile ordenado por Dir. Error si userDataDir no existe o no es legible."
tested: true
tests:
  - "detecta perfiles con Preferences"
  - "ordena por Dir"
  - "resuelve nombres desde Local State"
  - "cuenta extensiones excluyendo Temp"
  - "excluye System Profile"
  - "HasPreferences es true para todos los perfiles devueltos"
  - "directorio sin Preferences no aparece"
  - "fallback Name igual a Dir cuando no hay Local State"
  - "error si userDataDir no existe"
test_file_path: "functions/browser/list_chrome_profiles_test.go"
file_path: "functions/browser/list_chrome_profiles.go"
---

## Ejemplo

```go
// Lista todos los perfiles del Chromium del usuario
profiles, err := browser.ListChromeProfiles("")
if err != nil {
    log.Fatal(err)
}
for _, p := range profiles {
    fmt.Printf("--profile-directory=%q  name=%q  extensions=%d\n",
        p.Dir, p.Name, p.Extensions)
}
// Output:
// --profile-directory="Automation"  name="Automation"  extensions=1
// --profile-directory="Default"     name="Personal"    extensions=12
// --profile-directory="Profile 1"   name="Work"        extensions=4

// Con ruta explícita (ej. Chrome en ubicación no estándar)
profiles, err = browser.ListChromeProfiles("/home/user/.config/google-chrome")
```

## Cuando usarla

Antes de lanzar Chrome/Chromium con `chrome_launch_go_browser` cuando hay múltiples perfiles y quieres pasar `--profile-directory` al proceso. Sin elegir perfil, Chrome queda bloqueado en el selector de cuentas.

## Gotchas

- **Conteo de extensiones es de carpetas, no de extensiones activas.** Las carpetas de extensiones deshabilitadas o desinstaladas permanecen en disco (cache de Chrome) y se cuentan igualmente. El número es un indicador aproximado de actividad del perfil, no una lista exacta de extensiones habilitadas.
- **Local State puede no existir** si el perfil es nuevo o fue creado manualmente. En ese caso `Name` cae al valor de `Dir` (sin error).
- **Profile Directory ≠ Profile Name.** El argumento `--profile-directory` del binario Chrome acepta el valor de `ChromeProfile.Dir` (ej. `"Profile 1"`), no el `Name` legible.
- **"System Profile"** existe en Chrome pero no es un perfil de usuario; siempre se excluye.
- En Chrome (Google) el default suele ser `~/.config/google-chrome`; en Chromium `~/.config/chromium`. Pasar ruta explícita si se usa Google Chrome.
