Hice una extensión chrome realmente básica y configuré un servidor node.js simple para probar la función de actualización automática. El servidor aloja el archivo .crx para que pueda instalar la extensión sin ningún problema simplemente visitando http://localhost:3000/clients/chrome/extension.crx
. Pero cuando voy a tools
->extensions
y hago clic en Update extensions now
, la extensión no recupera la nueva versión. El servidor recibe la solicitud de localhost:3000/clients/chrome/updates.xml
, pero no recibe ninguna solicitud para el nuevo archivo extension.crx. ¿Qué estoy haciendo mal aquí?¿Por qué mi extensión de Chrome no se actualiza automáticamente?
CÓDIGO
Me dejaron de caminar a través de un código para hacer de este reproducible:
$ árbol
.
|-- clients
| `-- chrome
| |-- extension
| | `-- manifest.json
| |-- extension.crx
| |-- extension.pem
| `-- updates.xml
`-- web.js
La extensión es en realidad un archivo de manifiesto .
manifest.json
{
"name": "testing auto-updates",
"version": "1.0",
"update_url": "http://localhost:3000/clients/chrome/updates.xml"
}
Como se puede ver, me refiero a un update_url para hacer posible la auto-actualización.
updates.xml
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='fkphbmkcjefhhnnlhhjlnkellidponel'>
<updatecheck codebase='http://localhost:3000/clients/chrome/extension.crx' version='1.0' />
</app>
</gupdate>
Packaging la extensión crea extension.crx y extension.pem.
También hice un servidor Node.js sencilla para servir a los archivos:
web.js
var express = require('express');
var app = express.createServer(express.logger());
/* ROUTES */
app.get('/clients/chrome/extension.crx', function(request, response)
{
response.contentType('application/x-chrome-extension');
response.sendfile('clients/chrome/extension.crx');
});
app.get('/clients/chrome/updates.xml', function(request, response)
{
response.sendfile('clients/chrome/updates.xml');
});
/* ROUTES END */
var port = process.env.PORT || 3000;
app.listen(port, function() {
console.log("Listening on " + port);
});
Ok, vamos a probar esto. En primer lugar, iniciar el servidor:
$ nodo web.js
Listening on 3000
instalar la extensión visitando http://localhost:3000/clients/chrome/extension.crx. Esta parte funciona perfectamente en el primer intento. El servidor registra la solicitud:
127.0.0.1 - - [Thu, 26 Apr 2012 22:25:47 GMT] "GET /clients/chrome/extension.crx HTTP/1.1" 304 - "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/11.10 Chromium/18.0.1025.151 Chrome/18.0.1025.151 Safari/535.19"
Vamos a modificar la extensión:
- En manifest.json, establezca
version
a 1,1 (intead de 1,0). - En updates.xml, configure
version
en 1.1 (en lugar de 1.0). - Vuelva a empaquetar la extensión utilizando el mismo archivo
extention.pem
como la primera vez. - Se ha creado el nuevo archivo
extension.crx
. - Haga clic en
Tools
->Extensions
->Update extensions now
uno esperaría ver un cambio de número de versión de la extensión a 1,1 en Tools
->Extensions
.
En cambio, no pasa nada. El servidor recibe una solicitud para updates.xml
pero no para extension.crx
.
Al menos mi éxito con Dropbox descarta la posibilidad de un HTTPS forzado por Chrome no documentado requisito, que era una de mis conjeturas anteriores, ya que Dropbox funcionaba igual de bien sobre HTTP y HTTPS. – apsillers
Es lo más extraño: estaba a punto de probar esto con varios encabezados y ver qué diferencia hace, pero luego la cosa solo funcionó en el primer intento, sin ninguna modificación ... Volveré a publicar si descubro qué Lo arruiné en el primer intento ... – Shawn
Mi única otra teoría es que el archivo 1.1 CRX necesita ser nombrado algo diferente del archivo original 1.0? Es lo único que se me ocurre que no revisé y que pude haber hecho de manera diferente en mis pruebas. – apsillers