Ir al contenido principal

Personalizando Chrome


Cuando hablo de personalizar no me refiero a cambios en el tema, ni modificar algún comportamiento via la configuración, no, me refiero a obtener el código, modificarlo y compilarlo para crear mi propia "distribución".

Así que antes de nada realiza esto:



En caso, como a mi, que necesite una version anterior: https://www.chromium.org/developers/how-tos/get-the-code/working-with-release-branches

Me encontré con varios errores cuando trate de descargar la versión 37, aquí está el hilo con las soluciones:
https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/pmki-Uju6Zs


La version 37 no estaba preparada para los cambios que vinieron con Yosemite, un error que encontré: https://codereview.chromium.org/555163002

https://chromium.googlesource.com/chromium/src.git/+/59c4ad104b6f03af9c9acffc0fd9a42707083390/base/mac/sdk_forward_declarations.h

Otro error:
../../chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm:223:12: error: property 'titleVisibility' not found on object of type 'ShellNSWindow *'
      self.titleVisibility = NSWindowTitleHidden;
           ^
../../chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm:223:30: error: use of undeclared identifier 'NSWindowTitleHidden'
      self.titleVisibility = NSWindowTitleHidden;
                             ^
2 errors generated. Para esto hay que aplicar un Patch al archivo base/mac/sdk_forward_declarations.h
https://codereview.chromium.org/329793003/

Al final el archivo debe quedar así: https://gist.github.com/jgutix/928380d8a2dc1bf758f8, con esto ya puedes compilar chromium.

Mi objetivo inicial era hacer que Chrome cargará por defecto con una URL que yo definiera.
El primer intento fue usar una extensión, siguiendo esto: https://developer.chrome.com/extensions/getstarted, asi que cree los siguientes archivos:

manifest.json
{
  "manifest_version": 2,
  "name": "Mi aplicacion personalizada",
  "description": "Esta es una prueba",
  "version": "1.0",
  "chrome_url_overrides": {
    "newtab":"main.html"
  },
  "chrome_settings_overrides": {
    "homepage": "main.html",
    "startup_pages": ["main.html"]
  },
"content_security_policy": "script-src 'self' https://example.com; object-src 'self'"
}

main.html

<iframe frameborder="0" height="100%" marginheight="0" marginwidth="0" scrolling="no" src="http://example.com" width="100%"></iframe>

Si bien con estos dos archivos ya se puede empaquetar la aplicación y funciona para lo que es requerida (que chrome cargue con un URL específico). El problema viene en el momento de compilar chrome y es que pretendía usar una característica de chrome en la cual empaqueta por defecto ciertas aplicaciones, basado en este artículo: http://www.chromium.org/developers/design-documents/extensions/how-the-extension-system-works/default-apps

Sin embargo aun siguiendo paso a paso dicho artículo no lo pude hacer funcionar, si tienen la respuesta por favor colaboren aquí:https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/bU9TnawPMm8

La solución la encontré modificando el archivo: src/chrome/browser/ui/startup/startup_browser_creator_impl.cc, especificamente el método: StartupBrowserCreatorImpl::AddStartupURLs, este método es el que se encarga de decidir que URL se cargarán de inicio.


Otra personalización básica que puedes hacer es ocultar algunos botones de la interfaz de usuario, entonces te conviene ver el archivo: src/chrome/browser/ui/cocoa/browser_window_controller.mm, hacia el final del archivo encontrás una sección que empieza con:


@implementation BrowserWindowController(WindowType)

Entonces si quieres desaparecer el Toolbar entonces puedes hacer esto:


- (BOOL)hasToolbar {
  return false;
    
}

Esto es apenas lo básico de todo lo que puedes hacer con Chrome para crear tu propio navegador.

Entradas populares de este blog

Enumerar filas en una consulta con MySQL

Supongamos que tenemos tablas con la estructura siguiente:
documentos (iddocumento, nombre_documento, url_original, idtipo_documento, idproyecto) proyectos (idproyecto, nombre_proyecto, longitud, unidad_medida) tipo_documentos (idtipo_documento, descripcion_tipo_documento) Tenemos necesidad de hacer una consulta como la siguiente: "Enumerar todos los documentos en la base de datos agrupados por proyecto"

Parece fácil, excepto por el término "enumerar", aquí tienes un truquito para que logres enumerar tus consultas:
SELECT (@rownum:=@rownum+1) AS rownum, nombre_documento, descripcion_tipo_documento, nombre_proyecto FROM (SELECT @rownum:=0) r, documentos AS d INNER JOIN proyectos AS p ON d.idproyecto = p.idproyecto INNER JOIN tipo_documentos AS td ON d.idtipo_documento = td.idtipo_documentoPero que tal si te piden que enumeres los proyectos con sus correspondientes documentos?. Teniendo lo anterior es un poco mas sencillo
SELECT IF(@fila=proyectos.idproyecto, @rownum:…

Como implementar SCRUM en 10 pasos fáciles - Paso #1: Ordena tu "Pila del Producto"

Esta es la continuación de la serie: Como implementar SCRUM en 10 pasos fáciles. Creación de Kelly Waters y traducida con la autorización correspondiente por su servidor.


La entrada original de este artículo es: Get your backlog in order

Ordena tu "Pila del Producto"
¿Así que quieres implementar Scrum?
¿Y te gusta la idea de hacerlo fácilmente?
Entonces escucha. Este es el paso 1 en mi serie: ¿Cómo implementar Scrum en 10 pasos fáciles.
Este no es solo el primer paso. Es el paso más importante.
A menos que puedas llevar a cabo este paso, no sigas. No lo saltes. Te prometo que te arrepentirás si lo haces. Incluso si no continuas, es probable que este paso te beneficie, a tu equipo y a tu organización.
Así que aquí está.
Primero, ¿dónde deberíamos empezar?
Alineación con el negocio
Primero, antes de nada, debes alinear tu equipo de desarrollo con el negocio.
Si eres parte de una unidad de negocio, eso puede ser natural y directo. Si estas en una organización central de desarrol…

jQuery DataTables y CodeIgniter

Ajax Source Datatables permite configurar fácilmente el origen de datos de la tabla, para que esta sea generada dinámicamente desde el servidor, así que con CodeIgniter tendríamos el siguiente código

public function page(){ $data['pedidos'] = $this->pedidos_model->get_pedidos($this->input->post('iDisplayStart')); define('AJAX_REQUEST', 1);//truco para que en nginx no muestre el debug $TOTAL = $this->pedidos_model->total(); echo json_encode(array('aaData'=>$data['pedidos'], 'iTotalRecords'=>$TOTAL, 'iTotalDisplayRecords'=>$TOTAL, 'sEcho'=>$this->input->post('sEcho'))); }
Este método producirá algo parecido a esto:

{"iTotalRecords":83099,"iTotalDisplayRecords":83099,"sEcho":"2", "aaData":[{"Id":"85514","num":"86109",&q…