2012-04-27 20 views
9

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:

  1. En manifest.json, establezca version a 1,1 (intead de 1,0).
  2. En updates.xml, configure version en 1.1 (en lugar de 1.0).
  3. Vuelva a empaquetar la extensión utilizando el mismo archivo extention.pem como la primera vez.
  4. Se ha creado el nuevo archivo extension.crx.
  5. 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.

Respuesta

2

Creo que el error radica en cómo el archivo web.js sirve updates.xml. Aquí está mi razonamiento:

  • He duplicado su configuración y vi la misma falta de actualizaciones.
  • Luego hice una segunda prueba, usando solo mi carpeta pública de Dropbox, y todo salió a la perfección.
  • Finalmente, hice dos pruebas más: una con un updates.xml alojado en el nodo apuntando a un archivo alojado en Dropbox, y otro con un updates.xml alojado en Dropbox apuntando a un archivo crx alojado en el nodo.

los resultados fue que cada vez que updates.xml fue servido por el Nodo, Chrome no se actualizaba correctamente la extensión, y cuando updates.xml fue organizada por Dropbox, todo bien cuando, independientemente de quién organizó el archivo CRX. (Y cambié el update_url en el manifiesto y reconstruí/subí la extensión para cada prueba).

El porqué de que esto ocurra es todavía un gran misterio para mí. Aquí están las cabeceras de respuesta HTTP que tengo cuando voy a buscar updates.xml en Chrome (normalmente, usando la barra de direcciones, no estoy olfateando el tráfico en la red real de la operación de actualización, al igual que la simulación):

Dropbox:

HTTP/1.1 200 OK 
Server: nginx/1.0.14 
Date: ... 
Content-Type: application/xml 
Transfer-Encoding: chunked 
Connection: keep-alive 
x-robots-tag: noindex,nofollow 
etag: ... 
pragma: public 
cache-control: max-age=0 
Content-Encoding: gzip 

Node.js:

HTTP/1.1 200 OK 
X-Powered-By: Express 
Content-Type: application/xml 
Date: ... 
Cache-Control: public, max-age=0 
Last-Modified: ... 
ETag: "..." 
Accept-Ranges: bytes 
Content-Length: 284 
Connection: keep-alive 

yo también pensé que podría ser un problema con los puertos (tal vez Chrome no le gusta poner al día de la no-po 80 rts?), y ahora acabo de descubrir que el servicio de updates.xml y el archivo crx de mi propio servidor Apache en el puerto 80 causa una rotura idéntica al problema observado con Node.

Ojalá tuviese una respuesta real para ti, pero tal vez puedas ejecutar algunas pruebas con Dropbox y finalmente descubrir qué están haciendo de manera diferente, lo que hace que Chrome sea como su archivo de actualización.

+0

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

+0

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

+0

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

1

Dado que obtiene su XML y no actualiza la extensión, probablemente no le guste algo en su actualización xml. Mi mejor opción es que su 'aplicación' no coincida con la ID de aplicación de la extensión instalada. En la página chrome: // extensiones, ver el 'ID' de la extensión instalada y verificar que ese valor coincida con lo que está en update.xml

+0

En realidad, el problema se ha ido sin que yo cambie nada (que yo sepa). En otras palabras, lo resolví, pero no sé cómo. Tu teoría tiene mucho sentido obviamente, pero no recuerdo haber cambiado la aplicación, así que no puedo confirmar ... – Shawn

Cuestiones relacionadas