Zrobiłem naprawdę podstawowe rozszerzenie chrome i skonfigurowałem prosty serwer node.js, aby przetestować funkcję automatycznej aktualizacji. Serwer obsługuje plik .crx, więc mogę zainstalować rozszerzenie bez żadnych problemów, odwiedzając stronę http://localhost:3000/clients/chrome/extension.crx
. Ale kiedy przejdę do tools
->extensions
i kliknę na Update extensions now
, rozszerzenie nie pobiera nowej wersji. Serwer odbiera żądanie dla localhost:3000/clients/chrome/updates.xml
, ale nie otrzymuje żadnego żądania dotyczącego nowego pliku extension.crx. Co ja tu robię źle?Dlaczego moje rozszerzenie chrome samo się nie aktualizuje?
KOD
Pozwól mi tylko przejść przez kod, aby ten reproductible:
$ drzewo
.
|-- clients
| `-- chrome
| |-- extension
| | `-- manifest.json
| |-- extension.crx
| |-- extension.pem
| `-- updates.xml
`-- web.js
Rozszerzenie jest naprawdę tylko manifest pliku .
manifest.json
{
"name": "testing auto-updates",
"version": "1.0",
"update_url": "http://localhost:3000/clients/chrome/updates.xml"
}
Jak widać, mam na myśli do update_url dokonać automatycznego aktualizowania możliwe.
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 rozszerzenie tworzy extension.crx i extension.pem.
Zrobiłem też prosty serwer node.js służyć pliki:
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, niech to sprawdzić. Po pierwsze, należy uruchomić serwer:
$ node web.js
Listening on 3000
Zainstaluj rozszerzenie odwiedzając http://localhost:3000/clients/chrome/extension.crx. Ta część działa idealnie przy pierwszej próbie. Serwer rejestruje wniosek:
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"
Zmodyfikujmy rozszerzenie:
- W manifest.json ustaw
version
do 1,1 (intead 1,0). - W pliku updates.xml ustaw
version
na 1,1 (zamiast 1,0). - Po raz pierwszy przepakuj rozszerzenie, używając tego samego pliku
extention.pem
. - Utworzono nowy plik
extension.crx
. - Kliknij
Tools
->Extensions
->Update extensions now
Można by oczekiwać, aby zobaczyć przedłużenie numer wersji zmian do 1,1 w Tools
->Extensions
.
Zamiast tego nic się nie dzieje. Serwer odbiera żądanie dla updates.xml
, ale nie dla extension.crx
.
Przynajmniej mój sukces w Dropbox wyklucza możliwość nieudokumentowanego HTTPS z Chrome wymaganie, które było jednym z moich wcześniejszych przypuszczeń, ponieważ Dropbox pracował równie dobrze nad HTTP i HTTPS. – apsillers
To jest najdziwniejsze: miałem zamiar wypróbować to z różnymi nagłówkami i zobaczyć, jakie to ma znaczenie, ale wtedy to wszystko działało przy pierwszej próbie, bez żadnych modyfikacji ... Odpowiem, jeśli się dowiem Spieprzyłem w pierwszej próbie ... – Shawn
Moja jedyna inna teoria głosi, że plik CRX 1.1 musi być nazwany czymś innym niż oryginalny plik 1.0? To jedyna rzecz, o której mogę pomyśleć, czego nie sprawdziłem i mogłem zrobić inaczej w moich testach. – apsillers