#pragma once // CDP HTTP client (read + control endpoints sin WebSocket). // // Base: http://127.0.0.1:/json/... // GET /json/version -> info navegador + browser webSocketDebuggerUrl // GET /json (o /json/list) -> array de targets (pages, iframes, workers) // PUT /json/new? -> crea pestaña nueva (Chrome 137+ requiere PUT) // GET /json/activate/ -> focus pestaña // GET /json/close/ -> cierra pestaña // // Implementacion: WinSock raw + parser HTTP minimo + crude_json para parsear // payloads. Sin dependencias nuevas. #include #include namespace navegator { struct CdpTab { std::string id; std::string type; // "page", "iframe", "service_worker", "worker", ... std::string title; std::string url; std::string ws_url; // webSocketDebuggerUrl std::string favicon_url; std::string description; bool attached = false; // true si DevTools ya esta enganchado }; struct CdpVersion { std::string browser; // "Chrome/147.0.0.0" std::string protocol_version; std::string user_agent; std::string v8_version; std::string webkit_version; std::string browser_ws_url; // webSocketDebuggerUrl (browser-level) }; struct CdpHttpResult { bool ok = false; int status = 0; std::string body; std::string error; }; // Low-level: ejecuta una request HTTP/1.1 contra 127.0.0.1:port y devuelve // status + body. Cierra socket al terminar (Connection: close). CdpHttpResult cdp_http_request(const std::string& method, int port, const std::string& path, const std::string& body = "", int timeout_ms = 3000); // High-level helpers. Devuelven true si el HTTP fue 2xx y el JSON parseo OK. bool cdp_get_version(int port, CdpVersion& out, std::string* err = nullptr); bool cdp_list_tabs(int port, std::vector& out, std::string* err = nullptr); bool cdp_new_tab(int port, const std::string& url, CdpTab& out, std::string* err = nullptr); bool cdp_activate_tab(int port, const std::string& tab_id, std::string* err = nullptr); bool cdp_close_tab(int port, const std::string& tab_id, std::string* err = nullptr); } // namespace navegator