fd5787c55f
- .mcp.json - bash/functions/infra/write_mcp_jupyter_config.md - bash/functions/infra/write_mcp_jupyter_config.sh - cpp/CMakeLists.txt - cpp/apps/chart_demo - cpp/apps/shaders_lab - cpp/functions/gfx/gl_framebuffer.cpp - cpp/functions/gfx/gl_framebuffer.h - cpp/functions/gfx/gl_framebuffer.md - cpp/functions/gfx/mesh_gpu.md - ... Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
162 lines
5.8 KiB
Bash
162 lines
5.8 KiB
Bash
#!/usr/bin/env bash
|
|
# chrome_load_extensions — lanza Chrome (WSL2→Windows chrome.exe) con extensiones unpacked cargadas en un perfil CDP.
|
|
# Chrome 148+: requiere --load-extension=<paths> Y --disable-extensions-except=<same paths> juntos.
|
|
# NUNCA pasar --disable-extensions (desactiva todo, incluyendo las que quieres cargar).
|
|
|
|
chrome_load_extensions() {
|
|
local port=9222
|
|
local profile=""
|
|
local proxy=""
|
|
local url=""
|
|
local -a ext_paths=()
|
|
|
|
# --- Parse args ---
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--port)
|
|
port="$2"; shift 2 ;;
|
|
--profile)
|
|
profile="$2"; shift 2 ;;
|
|
--ext)
|
|
ext_paths+=("$2"); shift 2 ;;
|
|
--proxy)
|
|
proxy="$2"; shift 2 ;;
|
|
--url)
|
|
url="$2"; shift 2 ;;
|
|
--*)
|
|
echo "chrome_load_extensions: flag desconocido: $1" >&2; return 1 ;;
|
|
*)
|
|
# Positional = extra ext path
|
|
ext_paths+=("$1"); shift ;;
|
|
esac
|
|
done
|
|
|
|
if [[ ${#ext_paths[@]} -eq 0 ]]; then
|
|
echo "chrome_load_extensions: se requiere al menos un --ext PATH de extension unpacked" >&2
|
|
return 1
|
|
fi
|
|
|
|
# --- Detectar chrome.exe ---
|
|
local chrome_bin=""
|
|
if command -v chrome.exe &>/dev/null; then
|
|
chrome_bin="chrome.exe"
|
|
elif [[ -f "/mnt/c/Program Files/Google/Chrome/Application/chrome.exe" ]]; then
|
|
chrome_bin="/mnt/c/Program Files/Google/Chrome/Application/chrome.exe"
|
|
elif [[ -f "/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe" ]]; then
|
|
chrome_bin="/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe"
|
|
else
|
|
echo "chrome_load_extensions: chrome.exe no encontrado en PATH ni en rutas conocidas" >&2
|
|
return 1
|
|
fi
|
|
|
|
# --- Detectar WSL2 ---
|
|
local wsl2=0
|
|
if grep -qi 'microsoft\|wsl' /proc/version 2>/dev/null; then
|
|
wsl2=1
|
|
fi
|
|
|
|
# --- Traducir paths de extensiones a Windows si hace falta ---
|
|
local -a win_ext_paths=()
|
|
for p in "${ext_paths[@]}"; do
|
|
if [[ $wsl2 -eq 1 ]] && [[ "$p" != [A-Za-z]:\\* ]]; then
|
|
# Path Linux → traducir a Windows
|
|
local win_p
|
|
win_p=$(wslpath -w "$p" 2>/dev/null) || {
|
|
echo "chrome_load_extensions: wslpath -w '$p' falló" >&2
|
|
return 1
|
|
}
|
|
win_ext_paths+=("$win_p")
|
|
else
|
|
win_ext_paths+=("$p")
|
|
fi
|
|
done
|
|
|
|
# --- Resolver perfil ---
|
|
if [[ -z "$profile" ]]; then
|
|
# Default: perfil canónico fn-chrome-cdp-profile en Windows
|
|
local win_user="${USERNAME:-${USER:-lucas}}"
|
|
if [[ $wsl2 -eq 1 ]]; then
|
|
profile="C:\\Users\\${win_user}\\AppData\\Local\\fn-chrome-cdp-profile"
|
|
else
|
|
profile="/tmp/fn-chrome-cdp-profile"
|
|
fi
|
|
elif [[ $wsl2 -eq 1 ]] && [[ "$profile" != [A-Za-z]:\\* ]]; then
|
|
# Path Linux del perfil → traducir a Windows
|
|
profile=$(wslpath -w "$profile" 2>/dev/null) || {
|
|
echo "chrome_load_extensions: wslpath -w '$profile' falló" >&2
|
|
return 1
|
|
}
|
|
fi
|
|
|
|
# --- Construir lista de paths separada por coma (para Chrome) ---
|
|
# Chrome usa coma como separador en --load-extension y --disable-extensions-except.
|
|
# NO usar `echo` para el join: rutas Windows como C:\Users tienen \U, y el echo de
|
|
# zsh (o sh con xpg_echo) interpreta \U como escape unicode y trunca la ruta a "C:".
|
|
# Acumulador con += y printf-safe, sin interpretacion de backslashes.
|
|
local ext_list=""
|
|
local p
|
|
for p in "${win_ext_paths[@]}"; do
|
|
ext_list+="${ext_list:+,}${p}"
|
|
done
|
|
|
|
# --- Construir args de Chrome ---
|
|
local -a args=(
|
|
"--remote-debugging-port=${port}"
|
|
"--user-data-dir=${profile}"
|
|
"--no-first-run"
|
|
"--no-default-browser-check"
|
|
"--remote-allow-origins=*"
|
|
"--load-extension=${ext_list}"
|
|
"--disable-extensions-except=${ext_list}"
|
|
# Chrome 137+ activa por defecto el feature DisableLoadExtensionCommandLineSwitch,
|
|
# que IGNORA silenciosamente --load-extension. Hay que desactivarlo o las
|
|
# extensiones unpacked no cargan (chrome://extensions sale vacio).
|
|
"--disable-features=DisableLoadExtensionCommandLineSwitch"
|
|
)
|
|
|
|
# WSL2: bind en 0.0.0.0 para que sea accesible desde la red WSL
|
|
if [[ $wsl2 -eq 1 ]]; then
|
|
args+=("--remote-debugging-address=0.0.0.0")
|
|
fi
|
|
|
|
if [[ -n "$proxy" ]]; then
|
|
args+=("--proxy-server=${proxy}")
|
|
fi
|
|
|
|
if [[ -n "$url" ]]; then
|
|
args+=("--new-window" "$url")
|
|
fi
|
|
|
|
# --- Revisar si CDP ya responde en el puerto ---
|
|
if curl -sf --max-time 1 "http://127.0.0.1:${port}/json/version" &>/dev/null; then
|
|
echo "chrome_load_extensions: CDP ya activo en puerto ${port}; lanzando ventana extra" >&2
|
|
fi
|
|
|
|
# --- Lanzar Chrome desacoplado del proceso padre ---
|
|
# setsid + redirección evita el exit 144 en el Bash tool (el pipe no queda retenido).
|
|
setsid "$chrome_bin" "${args[@]}" </dev/null >"/tmp/chrome_ext_${port}.log" 2>&1 &
|
|
local chrome_pid=$!
|
|
disown "$chrome_pid"
|
|
|
|
echo "chrome_load_extensions: Chrome lanzado PID=${chrome_pid} puerto=${port}" >&2
|
|
|
|
# --- Esperar a que CDP esté listo (hasta 15 segundos) ---
|
|
local deadline=$(( $(date +%s) + 15 ))
|
|
local ready=0
|
|
while [[ $(date +%s) -lt $deadline ]]; do
|
|
if curl -sf --max-time 1 "http://127.0.0.1:${port}/json/version" &>/dev/null; then
|
|
ready=1
|
|
break
|
|
fi
|
|
sleep 0.5
|
|
done
|
|
|
|
if [[ $ready -eq 1 ]]; then
|
|
echo "chrome_load_extensions: CDP listo en 127.0.0.1:${port}"
|
|
else
|
|
echo "chrome_load_extensions: advertencia — CDP no respondió en 15s en puerto ${port}; Chrome puede estar iniciando lentamente" >&2
|
|
fi
|
|
|
|
echo "$chrome_pid"
|
|
}
|