2012-04-27 110 views
9

我做了一個非常基本的Chrome擴展,並設置了一個簡單的node.js服務器來測試自動更新功能。服務器託管.crx文件,因此我可以通過訪問http://localhost:3000/clients/chrome/extension.crx而毫無困難地安裝擴展。但是當我去tools - >extensions並點擊Update extensions now時,擴展名不會獲取新版本。服務器確實收到localhost:3000/clients/chrome/updates.xml的請求,但沒有收到任何關於新的extension.crx文件的請求。我在這裏做錯了什麼?爲什麼我的Chrome擴展不能自動更新?


CODE

讓我帶你通過代碼來使這個reproductible:

$樹

. 
|-- clients 
| `-- chrome 
|  |-- extension 
|  | `-- manifest.json 
|  |-- extension.crx 
|  |-- extension.pem 
|  `-- updates.xml 
`-- web.js 

擴展名是真的只是一個清單文件。

manifest.json的

{ 
    "name": "testing auto-updates", 
    "version": "1.0", 
    "update_url": "http://localhost:3000/clients/chrome/updates.xml" 
} 

正如你所看到的,我指的是一個update_url進行自動更新的可能。

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> 

打包擴展創建extension.crxextension.pem

我也做了一個簡單的node.js服務器提供文件服務:

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); 
}); 

好吧,讓我們來測試這一點。首先,啓動服務器:

$節點web.js

Listening on 3000 

訪問http://localhost:3000/clients/chrome/extension.crx安裝擴展。這部分工作完美的第一次嘗試。服務器記錄該請求:

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" 

讓我們修改擴展名:

  1. 的manifest.json,設置version〜1.1(1.0這一翻譯)。
  2. 在updates.xml中,將version設置爲1.1(而不是1.0)。
  3. 首次使用相同的extention.pem文件重新打包擴展。
  4. 創建新的extension.crx文件。
  5. 點擊Tools - >Extensions - >Update extensions now

人們會期望看到擴展的版本號的變化在Tools 1.1 - >Extensions

相反,沒有任何反應。服務器收到updates.xml的請求,但不是extension.crx

回答

2

我認爲錯誤在於你web.js文件如何提供updates.xml。這是我的推理:

  • 我複製你的設置,並看到同樣的缺乏更新。
  • 然後我做了第二次測試,只使用了我的公共Dropbox文件夾,並且一切都很順利。
  • 最後,我做了兩個試驗:一個節點託管updates.xml指向一個Dropbox的託管文件,而另一個與Dropbox的託管updates.xml指向一個節點託管CRX文件。

結果是,每當updates.xml由節點提供服務,Chrome未正確更新擴展,當updates.xml被Dropbox的,一切都很好,當,無論誰主辦的CRX檔案託管。 (而且我確實更改了清單中的update_url,併爲每個試驗重建/上傳了擴展名)。

究竟爲什麼發生這種情況仍然是一個相當大的謎給我。下面是HTTP響應頭,當我在Chrome中獲取updates.xml我得到(通常情況下,使用地址欄;我不是從更新操作嗅探實際淨流量,只是模擬它):

的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 

我想也可能是與端口的問題(也許Chrome不喜歡非80 PO更新rts?),現在我剛剛發現服務於updates.xml和端口80上的我自己的Apache服務器上的crx文件導致破壞與Node中觀察到的問題相同。

我希望我有一個實際的答案,但也許你可以運行一些測試與Dropbox和最後發現他們在做什麼不同,使得瀏覽器像他們的更新文件。

+0

至少我與Dropbox的成功排除了一個未公開的鍍鉻強制HTTPS的可能性要求,這是我早先的猜測之一,因爲Dropbox在HTTP和HTTPS上工作得很好。 – apsillers 2012-04-30 06:15:06

+0

這是最奇怪的事情:我正準備嘗試使用各種標題,看看它有什麼不同,但是第一次嘗試的時候沒有任何修改......我會回覆,如果我找到了什麼我在第一次嘗試中搞砸了。 – Shawn 2012-05-02 00:13:45

+0

我唯一的其他理論是1.1 CRX文件需要命名與原始1.0文件不同的東西嗎?這是我能想到的唯一的事情,我沒有檢查,可能在我的測試中做了不同的處理。 – apsillers 2012-05-03 21:21:50

1

因爲它得到您的XML並且不更新它不喜歡的可能是你更新XML東西延伸。我最好的猜測是你的'appid'與安裝的擴展名的App ID不匹配。在頁面鉻://擴展查看已安裝的擴展的「ID」,並驗證值相匹配的是在update.xml

+0

事實上,沒有我改變任何東西(我知道),問題就消失了。換句話說,我解決了它,但我不知道如何。你的理論很明顯,但我不記得改變appid,所以我不能確認... – Shawn 2012-05-03 20:57:59

相關問題