--- 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.