2012-04-27 26 views
9

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:

  1. W manifest.json ustaw version do 1,1 (intead 1,0).
  2. W pliku updates.xml ustaw version na 1,1 (zamiast 1,0).
  3. Po raz pierwszy przepakuj rozszerzenie, używając tego samego pliku extention.pem.
  4. Utworzono nowy plik extension.crx.
  5. 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.

Odpowiedz

2

Myślę, że błąd leży w tym, w jaki sposób twój plik web.js obsługuje updates.xml. Oto moje uzasadnienie:

  • Powieliłem konfigurację i zobaczyłem ten sam brak aktualizacji.
  • Potem zrobiłem drugi test, używając tylko mojego publicznego folderu Dropbox i wszystko poszło idealnie.
  • W końcu zrobiłem jeszcze dwa testy: jeden z hostowanym na Node updates.xml wskazującym na plik hostowany przez Dropbox, a drugi z hostowanym przez Dropbox updates.xml wskazującym na plik crx hostowany przez węzeł.

Wyniki było to, że ilekroć updates.xml było podawane przez węzeł, Chrome nie poprawnie zaktualizować rozszerzenie, a kiedy updates.xml poprowadził Dropbox, kiedy wszystko w porządku, niezależnie od tego kto gospodarzem plik CRX. (I zmieniłem update_url w manifeście i przebudowałem/przesłałem rozszerzenie dla każdej wersji próbnej).

Dokładnie, dlaczego tak się dzieje, wciąż jest dla mnie wielką tajemnicą. Oto nagłówki odpowiedzi HTTP dostaję kiedy sprowadzić updates.xml w Chrome (zwykle za pomocą paska adresu, nie jestem wąchania rzeczywisty ruch netto z operacji aktualizacji, po prostu go symulowanie):

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 

Myślałem też może to być problem z portami (może Chrome nie chce aktualizować z non-80 PO rts?), a ja właśnie odkryłem, że serwowanie updates.xml i pliku crx z mojego własnego serwera Apache na porcie 80 powoduje pękanie identyczne z problemem zaobserwowanym w Node.

Żałuję, że nie mam dla ciebie odpowiedzi, ale może możesz przeprowadzić kilka testów z Dropbox i wreszcie odkryć, co robią inaczej, dzięki czemu Chrome przypomina ich plik aktualizacji.

+0

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

+0

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

+0

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

1

Ponieważ pobiera kod XML i nie aktualizuje rozszerzenia, prawdopodobnie nie podoba mu się coś w pliku XML aktualizacji. Domyślam się, że twój "appid" nie pasuje do identyfikatora aplikacji zainstalowanego rozszerzenia. Na stronie chrome: // extensions wyświetl "identyfikator" zainstalowanego rozszerzenia i sprawdź, czy ta wartość jest zgodna z wartością aktualizacji.xml

+0

W rzeczywistości problem zniknął, nie zmieniając niczego (o czym wiem). Innymi słowy, rozwiązałem to, ale nie wiem jak. Twoja teoria ma oczywisty sens, ale nie pamiętam zmiany załącznika, więc nie mogę potwierdzić ... – Shawn

Powiązane problemy