Why isn't my chrome extension auto-updating itself?

时光毁灭记忆、已成空白 提交于 2019-12-05 20:17:51

问题


I made a really basic chrome extension and set up a simple node.js server to test the auto-update feature. The server hosts the .crx file so I can install the extension without any trouble simply by visiting http://localhost:3000/clients/chrome/extension.crx. But when I go to tools->extensions and click on Update extensions now, the extension does not fetch the new version. The server does receive the request for localhost:3000/clients/chrome/updates.xml, but doesn't receive any request for the new extension.crx file. What am I doing wrong here?


CODE

Let me just walk you through the code to make this reproductible:

$ tree

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

The extension is really just a manifest file.

manifest.json

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

As you can see, I'm referring to an update_url to make auto-updating possible.

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 the extension creates extension.crx and extension.pem.

I also made a simple node.js server to serve the files:

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, let's test this. First, start the server:

$ node web.js

Listening on 3000

Install the extension by visiting http://localhost:3000/clients/chrome/extension.crx. This part works perfectly on the first try. The server logs the request:

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"

Let's modify the extension:

  1. In manifest.json, set version to 1.1 (intead of 1.0).
  2. In updates.xml, set version to 1.1 (instead of 1.0).
  3. Re-pack extension using the same extention.pem file as the first time.
  4. The new extension.crx file is created.
  5. Click on Tools->Extensions->Update extensions now

One would expect to see the extension's version number change to 1.1 in Tools->Extensions.

Instead, nothing happens. The server receives a request for updates.xml but not for extension.crx.


回答1:


I think the error lies in how your web.js file serves updates.xml. Here's my reasoning:

  • I duplicated your setup and saw the same lack of updates.
  • Then I did a second test, using only my public Dropbox folder, and everything went perfectly.
  • Finally, I did two more tests: one with a Node-hosted updates.xml pointing to a Dropbox-hosted file, and another with a Dropbox-hosted updates.xml pointing to a Node-hosted crx file.

The results was that whenever updates.xml was served by Node, Chrome didn't update the extension correctly, and when updates.xml was hosted by Dropbox, everything when fine, regardless of who hosted the crx file. (And I did change the update_url in the manifest and rebuilt/uploaded the extension for each trial).

Exactly why this happens is still a pretty big mystery to me. Here are the HTTP response headers I get when I fetch updates.xml in Chrome (normally, using the address bar; I'm not sniffing the actual net traffic from the update operation, just simulating it):

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

I thought also it might be a problem with ports (maybe Chrome doesn't like to update from non-80 ports?), and I've now just discovered that serving updates.xml and crx file from my own Apache server on port 80 causes breakage identical to the problem observed with Node.

I wish I had an actual answer for you, but maybe you can run some tests with Dropbox and finally discover what they're doing differently that makes Chrome like their update file.




回答2:


Since it gets your XML and doesn't update the extension it doesn't like something in your update xml probably. My best guess is that your 'appid' does not match the App ID of the installed Extension. On the page chrome://extensions view the 'ID' of the installed extension and verify that that value matches what is in the update.xml



来源:https://stackoverflow.com/questions/10343573/why-isnt-my-chrome-extension-auto-updating-itself

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!