sábado, 6 de septiembre de 2008

Jugando con el fuente de Google chrome (Español)



Quedé muy impresionado, con la manera tan fácil, que logré compilar Google Chrome, siguiendo los pasos que se encuentran publicados en http://dev.chromium.org/developers/how-tos/getting-started. (A esto le llamo, una verdadera intención de compartir el código)

Yo soy fan número uno de Mozilla FireFox y de las herramientas Open Source, de los sistemas operativos abiertos (y sus diferentes distribuciones) a pesar que, para ganarme la vida deba moverme entre herramientas de Microsoft, Sun, de la comunidad abierta y a veces de una que otra pasada de moda, que aun me parecen válidas. Pero tengo que admitir, que para lograr compilar el FireFox, o el Minimo (versión mobile para Pocket PC y Windows Mobile) la cantidad de pasos, pre- requisitos, son muchos y en algunos casos, dificiles de conseguir.

A continuación voy a compartir una traducción al español de esos pasos, para deleite de los gomosos (entusiastas) que comparten conmigo, la opinión que Google Chrome es un excelente navegador, muy liviano, muy rápido y demasiado estable, todas estas características, para ser un navegador versión Beta.

Breves comentarios de Google Chrome antes de comenzar.

La mayor parte del código esta desarrollada en C (curiosamente las extensiones de los archivos son .cc y h, no cpp). Tiene muchos modulos que incluyen Java script, para complementar su funcionalidad, pero una de las cosas mas curiosas, es que aun no soporta Objetos de Microsoft Active X.

En las pruebas preliminares ingresé a YouTube, asi que comprobé que es compatible con los formatos de video FLV. El Java Script es super rápido, su ejecución se basa en un motor llamado V8. Aqui podemos ver un video en inglés con subtitulos en español, que describe buena parte de las ideas en las que se basaron para justificar la creación de este browser. http://tools.google.com/chrome/intl/es-419/features.html, llamado por algunos, el MS IE Killer (vaya uno a saber)

A continuación, la traducción de la página que comenté anteriormente. Podria haber pasado el traductor disponible por la propia Google, pero quedé tan impresionado, que me animé a hacer la traducción, ya que segui los pasos, y de una manera simple, sin rodeos, ni secretos propios de Geeks o genios de la computación, lo logré. La mayor demora fue, la descarga del código. Eso si que me dió trabajo. Imagino que deben existir alrededor del mundo una mano (gran cantidad) de gomosos (entusiastas) con la misma curiosidad que yo, lo cual dificultó dicha descarga. Tuve que intentarlo, sin mentirles, 5 veces. Me perdonarán los errores al español, traté de ser lo mas parco y correcto posible, pero con seguridad, habrá una que otra palabra, que no fue fielmente traducida, y colocada, mas pensando en el lenguaje tipico, con el que me comunicaría con alguno de mis compañeros de oficina. Por ejemplo, Build ( a pesar de significar construcción del código, nosotros le llamamos compilación, a sabiendas, que este paso es solo uno, de los necesarios para llegar al ejecutable, binario u objeto)


Comenzando


Si usted esta seriamente interesado sobre el aprendizaje de como Chromium funciona, esta página es para usted. Podrá obtener el código de Chromium y compilarlo. Entonces usará el debugger (o depurador) de Visual Studio 2005 para ver como el navegador funciona — en particular, como responde a acciones comunes de usuario.

Nota: Esta página es para desarrolladores y testers que tienen Windows y quieren revisar el código en ejecución. Si usted no se siente preparado para compilar el ambiente, puede leer la documentación. Si no tiene Windows, dele una ojeada a las instrucciones de compilación para Mac y Linux.

Obteniendo el software que necesita

Esta sección le explica como configurar su ambiente de Construcción en Windows. Si tiene problemas o necesita detalles mas precisos, vea las Instrucciones (Windows).

Software prerrequisito

Primero, su computador debe tener el siguiente software instalado:
  • Windows XP (SP2 o superior) o Windows Vista
  • Microsoft Visual Studio 2005 (8.0)

Descargas Adicionales (libres)

Una vez que Visual Studio esté instalado, necesitará descargar e instalar algunos otros programas.

  1. Descargue e instale Microsoft Visual Studio 2005 Service Pack 1.
    Dependendiendo de su computador, la instalación puede llevar una hora, y pueda ser que necesite reiniciar.

  2. Descargue e instale el Microsoft Windows SDK.
    Pueda que sea necesario reiniciar. Puede ahorrar espacio eligiendo no instalar la documentación y los códigos de ejemplo.

    Nota:
    Aunque el SDK dice que es para Vista, funciona en ambos sistemas, XP y Vista. Si ya tiene instalado Microsoft 2008 SDK, no necesita instalar uno mas reciente.

  3. Integrar el SDK con Visual Studio:

    Inicio > Todos los Programas > Microsoft Windows SDK > Visual Studio Registration > Integrate Windows SDK with Visual Studio 2005


  4. Obtener las herramientas Chromium depot_tools:

    1. Descargue depot_tools.zip.

    2. Descomprima el archivo.
      Nota: Si ya tiene el Cygwin instalado, no use su herramienta unzip; esto desconfigurará los permisos.

    3. Agregue el directorio depot tools a su PATH. Ejemplo: C:\bin\depot_tools
      Nota: Por omisión, depot_tools se actualizarán automaticamente a la última version cada vez que ejecute gclient. Vea la página de depot_tools si desea deshabilitar esta opción.

Código Chromium

El código base de Chromium consiste de cientos de miles de archivos, lo cual significa que una revisión correcta del repositorio de la Subversion (SVN) puede tomar un buen tiempo. Para acelerar el proceso, hemos suministrado un "tarball" que puede usar para viabilizar la descarga. Alternativamente, puede saltarse este paso del tarball y realizar la descarga directa desde el SVN (no es recomendado).

Nota: Aqui no existe ventaja revisando directamente desde el SVN. El tarball incluye los directorios SVN asi que despues de descomprimir el tarball, puede conseguir la última revision usando el gclient sync.

Si solo desea mirar el código fuente, necesitará al menos 1.6 GB de espacio disponible en su disco duro. Si desea compilarlo y construir el binario, necesitará algo menos de 10 GB de espacio, incluyendo todos los archivos objeto y ejecutables.

Para viabilizar el uso del tarball:
  1. Asegurese que usted tiene el programa que puede descomprimir los archivos .tar.gz. Ejemplos de estos programas incluyen el manejador de archivos de código abierto 7-Zip, la utilidad libre BsdTar (la cual forma parte de LibArchive y que fue la que usé), y WinZip.

  2. Descargue el fuente tarball.

  3. Escoja un directorio para mantener su codigo fuente. Ejemplo: c:\chromiumtrunk

    Importante:
    Asegúrese que la ruta del directorio creado no contenga espacios.

  4. Descomprima el tarball fuente en uno de los directorios que haya elegido. Ejemplo: Si esta usando LibArchive, ejecute el siguiente comando:

    "C:\Program Files\GnuWin32\bin\bsdtar.exe" -xzf chromium.tgz


  5. Opcionalmente, sincronice a la última revision de Chromium:

    1. Visite el Chromium Buildbot waterfall para ver el estado de los árboles. [Nota: Si esta parte de la infraestructura aun no esta funcionando, por favor revise el topico del canal IRC #chromium IRC en el irc.freenode.net.] Si la raíz del waterfall dice:

      OPEN
      - El árbol está en un buen estado y usted deberia estar en condición de compilar el código. Vaya al siguiente paso.

      CLOSED
      - Pueden haber fallas de pruebas o compilación. Puede descargar el código, pero obtendrá las mismas fallas cuando intente ejecutar el resto de las pruebas o de compilar. Lo mejor será volver después a revisar.

    2. En una ventana de DOS, ejecute los siguientes comandos:

      cd c:\chromiumtrunk
      gclient sync

      La herramienta gclient esta incluida en los depot tools descritos arriba. La primera vez que ejecute gclient, habrá un retardo (un minuto o más) mientras actualizan las depot tools.
Para revisar directamente desde el SVN:

Usará la herramienta gclient depot para descargar el código Chromium desde su repositorio SVN.
  1. Cree un directorio para mantener su código fuente. Ejemplo: c:\chromiumtrunk

    Importante:
    Asegúrese que la ruta del directorio no contenga espacios.

  2. Visite el Chromium Buildbot waterfall para ver el estado del árbol [Nota: Si esta parte de la infraestructura no esta funcionando todavía, por favor revise el topico del canal IRC #chromium en irc.freenode.net.] Si la raíz del waterfall dice:


    OPEN
    - El árbol está en un buen estado y usted deberia estar en condición de compilar el código. Vaya al siguiente paso.

    CLOSED
    - Pueden haber fallas de pruebas o compilación. Puede descargar el código, pero obtendrá las mismas fallas cuando intente de ejecutar el resto de las pruebas o de compilar. Lo mejor será volver después a revisar.

  3. En una ventana de DOS, ejecute los siguientes comandos:

    cd c:\chromiumtrunk

    gclient config http://src.chromium.org/svn/trunk/src
    gclient sync

    La primera vez que ejecute gclient, habrá un retardo (un minuto o más) mientras actualiza las depot tools. Descargar el código Chromium puede tomar una hora.

Compilar y ejecutar Chromium

Una vez tenga todo el código y el software, puede compilar Chromium y ejecutarlo en modo de depuración (debug).
  1. Inicie Visual Studio. (Vamos a asumir que usted posee la versión en inglés)

  2. Seleccione File > Open Project/Solution..., y vaya al directorio src\chrome (bajo c:\chromiumtrunk o donde haya colocado los archivos del Chromium), y abra el archivo chrome.sln.

  3. En el Solution Explorer, vaya al directorio App , haga clic derecho con el mouse chrome_exe, y elija la opción Set as StartUp Project.

  4. Configure el perfil de Usuario usado por su compilación de Chromium:

    1. Haga clic derecho en chrome_exe, y elija Properties.

    2. En la columna izquierda, escoja Configuration Properties > Debugging.

    3. En la columna derecha, cambie el valor de los Command Arguments a algo como esto:

      --user-data-dir=c:\tmp\DebugProfile


      Presione Ok. Chromium crea el directorio especificado (c:\tmp\DebugProfile en el ejemplo anterior) si el directorio no existe aún.

      Nota:
      Si decide no configurar el perfil, entonces si intenta ejecutar Chromium cuando Google Chrome o Chromium esta aun ejecutándose, una nueva ventana vendrá en el navegador actual. Este comportamiento garantiza acceso exclusivo al perfil de usuario, pero signfica que no puede depurar su version de Chromium!

      Advertencia: Si la última compilación de Chromium tiene un nuevo formato de
      perfil, Google Chrome y antiguas versiones de Chromium podrian no ser capaces de leer este formato. A menos que configure el perfil, podría perder sus datos del perfil de Google Chrome.

  5. Presione F5, el cual creará la solución chrome_exe e iniciará Chromium en modo Debug. Cuando le sea preguntado si reconstruir proyectos de otras fechas (out-of-date) , escoja Yes.

  6. La compilación y construcción toma entre 15-40 minutos. (A mi me tomó una hora y media con un Centrino de 1.8 y 1.5 GB de RAM). Cuando la compilación se complete, una ventana del navegador aparecerá en su escritorio.

    Si la compilación falla o una nueva ventana del navegador no aparece, vaya a Instrucciones de Compilación (Windows) para conseguir ayuda.

Tome el tour

La forma mas fácil de familiarizarse con Chromium es seguir que hace en respuesta a las acciones del usuario.

Acción del usuario: Ingresando URLs

Se puede facilmente encontrar el codigo que esta siendo ejecutado cuando el usuario ingresa una URL en la barra de direcciones.
  1. Abrir(Ctrl+O) el archivo src\chrome\browser\autocomplete\autocomplete_edit.cc.

  2. Coloque un punto de ruptura (breakpoint) en el método AutocompleteEdit::AcceptInput .
    El metodo AcceptInput es invocado cada vez que el usuario ingresa una URL.

  3. Vaya a su ventana del navegador Chromium, escriba en la barra de direcciones algo asi como google.com, y presione Enter. El UI debería detenerse cuando el punto de ruptura (breakpoint) es alcanzado.

    Nota: Si el UI no se congela, entonces probablemente no se configuró el perfil usado por su compilación de Chromium. Por favor realice (mire el Paso 4 de Compile e inicie Chromium) o cierre todas las ventanas de Google Chrome y Chromium en su escritorio. Entonces regrese a Visual Studio y presione F5 de nuevo para ejecutar el navegador con el depurador (debugger).

  4. Dele una mirada a la pila de llamadas (call stack) (Debug > Windows > Call Stack). Este le mostrará la ruta que el evento tomó de la ventana del sistema de código de Chromium que inicia el procesamiento del URL ingresado por el Usuario.

  5. Vaya paso a paso en el código (F10), mirando las pestañas Locales para ver los valores de las variables tales como las url, hasta que llegue a la linea que invoca el metodo OpenURL .

  6. Mire el código y las pestañas Locals para ver los valores de los argumentos para OpenURL. Puede ver que la URL ha sido coloreada (desde "google.com" hasta "http://google.com/", por ejemplo), la transición es colocada en 1 (PageTransition::LINK), y asi. Porque la URL fue ingresada digitando, en vez de hacerle clic a un item y arrastrándolo, de la siguiente a la última variable llegarán AutocompletePopup::kNoMatch.

  7. Para encontrar mas sobre transiciones de página, seleccione la palabra PageTransition, con clic derecho, y elija la opción Go To Definition. Verá la definición de PageTransition en src\chrome\common\page_transition_types.h. Asi como el código fuente y los comentariosse muestran, las transiciones de páginas describen que disparó la pagina visitada. Las transiciones incluyen clics en los enlaces, digitados en las URLs (como el único en este caso), envíos de formularios, recargas, y mucho mas.

  8. Vuelva a la pestaña de autocomplete_edit.cc, y vaya paso a paso en el método OpenURL (F11). Cuando se encuentre viendo al código que esta también en bajo nivel, sálgase (Shift-F11) y entre de nuevo (F11). Continue pasando a través del código que sigue y ver que pasa cuando la página es cargada.

  9. Cuando este listo, presione F5 para continuar ejecutando el navegador.

  10. Opcional: Intente otras formas de introducir una URL. Por ejemplo:
  • Comience digitando en una URL, pero en vez de presionar Enter, use el ratón para hacer clic en la URL arrastrada. Compare la pila de llamados (call stack) y los valores de las variables con respecto a las que vió previamente.

  • Ingrese un caracter o palabra -- una que no haya usado antes, tales como x -- dentro del campo de URL. Note que la variable alternative_nav_url pronto tendrá un valor, tal como http://x/. Note también que la transición es 5, indicando que el URL ha sido generado (PageTransition::GENERATED).

  • Arrastre una URL en el navegador. Note que la pila de llamados (call stack) es diferente, desde que AcceptInput es llamado por un handler del evento drop .
Para más información, vea la sección Navegando desde la barra de URL de Revisando el código fuente de Chromium. (en inglés)

Acción del Usuario : Clicando enlaces

La respuesta del navegador a los clics en los enlaces es un tris complicado, debido a los multi-procesos del Chromium, y la arquitectura multi-hilo.
  1. Abra (Ctrl+O) el archivo src\chrome\browser\browser.cc.

  2. Coloque un punto de ruptura (breakpoint) en el método Browser::NavigationStateChanged .

  3. Clique un enlace en cualquier página. Llegará hasta el punto de ruptura(breakpoint).

  4. Mire la pila de llamados (call stack). Verá el método llamar al mensaje relacionado al pasar entre hilos en el mismo proceso (asi como MessageLoop::QueueOrRunTask; vea Hilos (en inglés)) y entre procesos (asi como RenderViewHost::OnMessageReceived; vea Arquitectura Multi-proceso y Comunicación Inter-proceso en inglés).

  5. Presione F5 para iniciar la ejecución de nuevo. Inmediatemente llegará hasta otro punto de ruptura (breakpoint), asi como la pestaña se redibuja asi misma.

Característica: Comandos del navegador

A menudo, el usuario puede solicitar una operación de diferentes maneras. Por ejemplo, el usuario puede recargar una página presionando el botón de Recargar o presionando F5. Para evitar el código duplicado, muchas operaciones son manejadas por un código común, en el formulario de comandos.
  1. Abra (Ctrl+O) el archivo src\chrome\browser\browser_commands.cc.

  2. Coloque un breakpoint en el método Browser::ExecuteCommand.

  3. En el navegador, presione el botón de la estrella a la izquierda de la barra de direcciones. Ahi alcanzará el breakpoint.

  4. Vea la pila de llamados (call stack). Esto incluye una cadena de eventos de liberación del botón del ratón mouse-release, incluyendo BaseButton::OnMouseReleased.

  5. En la pestaña de Locals, mire el valor de id. Éste identifica la operación que el usuario ha solicitado.

  6. Vaya paso a paso en la sentencia de caso (IDC_STAR) que maneja esta operación. Note que la acción esta siendo grabada dentro de las métricas del usuario, y entonces el código para ejecutar la acción es invocada.

  7. Seleccione IDC_STAR, clic derecho, y seleccione Go To Definition. Verá su definición (y muchos otros de estos comandos) en chrome_dll_resource.h.

  8. Presione F5 para continuar ejecutando el navegador.

  9. Presione Ctrl+D, el teclado alternativo para la estrella. Estará alcanzando el breakpoint de nuevo.

  10. Mire la pila de llamados (call stack). Esta vez, contiene la mayoría de llamados relacionados a los inter-procesos y comunicaciones hilo-a-hilo. El único handler de evento que es visible en la pila de llamados (call stack) es WebContents::HandleKeyboardEvent.

  11. Note que el valor de id es el mismo que antes, asi que el mismo código será ejecutado cuando ha usado el botón de estrella.

  12. Opcional: Mire los otros comandos del navegador, incluyendo algunos comandos de menu. Por ejemplo:
  • Ctrl+T y la Nueva Pestaña del item de menu.
  • Botón Recargar y F5

Que sigue?

Ahora que ha compilado Chromium e ido paso a paso entre algunas lineas de su código, aqui hay algunas sugerencias de lo que podría hacer ahora.

Espero les haya gustado, les haya servido de algo y ... los haya motivado y hayan conseguido, como yo, compilar y jugar paso a paso con el código fuente del nuevo navegador de Google.

En una próxima entrega, me gustaría comentar como se podría compilar en Linux, pero por lo que he leido, aun esta en pruebas unitarias. Estoy optimista, que, por lo que sé Google ha escogido una distribución, basada en Linux Ubuntu 8.04, Hardy Heron, lo cual me facilitará mucho, realizar esta experiencia.

1 comentario:

Unknown dijo...

Ajá Booooo

Buen artículo, no he realizado el proceso de compilación, pero bueno, cuando lo haga te lo haré saber.

No sabía que esta herramienta está basada en c, osea, uno piensa que se usa un lenguaje por allá escondido que sólo lo usan en Google, pero bueno, el hecho de que así sea me hace ver que no estoy tan lejos del GooglePlex.