chrome 扩展开发二三事

  1. chrome 扩展可以通过 chrome.webRequest.onBeforeSendHeaders 回调来修改请求头,修改请求头部字段会在 TCP 连接发起之后,也就是这个时候 URL 已经是不能变的,这个接口也可以修改 URL,会导致一次重定向,不过貌似重定向之后携带的 cookie 会有些异常,没有细跟
  2. 那么,自然的,会想到一个问题,怎么获取请求的响应呢,对于这个问题,答案是,一般情况下,chrome 扩展无法获取请求的响应,参看,http://stackoverflow.com/quest…
  3. 那么不一般的情况呢,我们需要通过 chrome.devtools.network.onRequestFinished 来监听响应报文,但是,这个接口只能在 dev tools 中使用,所谓 dev tools,就是说,你需要自定义一个控制台面板,就是按下 F12 之后出来的那些 Elements, Network, Console 那一排,在那后面,自己追加一个,参看,http://stackoverflow.com/quest…
  4. 写一个自己的 panel 其实不难,还是 html javascript css 那一套,通过 chrome.devtools.panels.create 来创建自己的 panel
  5. 问题是一般情况下,我们把调试信息打到 console.log 里面,这个是调试一般页面的好方法,但是,如果我们本身就要调试一个 console,那么怎么办呢,http://codemadesimple.wordpres…,这里提供了一个思路,把 dev page 写成 options page,然后用 options page 来调,但是,如果我们的 dev page 是跟当前页面紧密耦合的,例如,我们需要调试当前页面的响应的话,这种情况,他的方法貌似就不奏效了
  6. http://stackoverflow.com/quest…,这里有一些其他的讨论,主要是重载 console 的,但是在我这儿试了试,貌似不是很奏效
  7. 所以我最后的办法是 alert
  8. 另外一个小 tips,对于 json 格式的 alert,会打 object,这个其实毛线用都没有,我也知道他是一个 object 啊,这个时候,可以 alert(JSON.stringify(xxx)),可以把 json 内容展开
  9. 如果想要在插件中发起跨域的 ajax 请求,记得在 manifest.json 中声明相关的权限
  10. 对于旧版本的 chrome,例如 chrome 31,即使你声明了跨域的权限,也没法在 dev page 中发起跨域的请求,background page 中可以
  11. 所以就需要曲线救国,使用 chrome 扩展的模块间通讯接口,把需要发起的请求包装送到可以发起请求的地方去发送,收到回复之后再送回来,相关的接口是 chrome.runtime.sendMessage 和 chrome.runtime.onMessage.addListener
  12. chrome.runtime.onMessage.addListener 的回调函数中有一个 sendResponse 的回复用的函数,如果需要异步的使用这个函数,记得 return true,这是个坑,而且不容易发现,官方是这么说的,runtime.onMessage: The chrome.runtime.onMessage listener must return true if you want to send a response after the listener returns
  13. 近日,google 开始推送 chrome 35.0.1916.114,从这个版本开始,chrome 不再允许用户自行安装插件
  14. 上有政策下有对策,对策总结起来不外乎,不升级 chrome,把插件发布到 store,让用户用开发者模式运行
  15. 另外还有一个大杀器,https://support.google.com/chr…,这个大杀器我还没怎么深入研究,稍后再看看这个好不好使
  16. 感言,chrome 已经不是一个浏览器,而像是一个操作系统了

———————

2014-6-13 11:22:07 update

  1. http://tieba.baidu.com/p/17401…,这里提到了用 ad block plus 作为例子的企业定制安装方式
  2. http://dev.chromium.org/admini…,这里是 google 官方给出的一些安装说明
  3. https://developer.chrome.com/e…,这里说明了安装文件的托管方式
  4. 但是当我尝试使用这种方式进行安装的时候一直安装不上去,阅读了文档,提到 content type,也正确设置了,还是不行
  5. 于是我尝试把 ad block plus 的安装文件部署到自己的环境上,是可以安装的,于是我开始认为是我的 crx 打包的有问题
  6. 后来查到了这里,http://productforums.google.co…,同学们在反应 web store 的扩展安装不上去,从这个帖子里面找到一个叫  chrome debug 的 log 文件
  7. http://www.chromium.org/for-te…,这里说明了怎么打开 log
  8. 从 log 中翻查,终于找到原因,原来是扩展的 id 不同,在开发者模式下,我看到一个 id 是 a,但是,打包之后,扩展的 id 变成了 b,跟声明的不符,所以安装不上,哇靠,要是不看日志,鬼知道 id 会不匹配啊
  9. https://developer.chrome.com/e…,这里说了一些打包时候的注意事项
  10. https://developer.chrome.com/e…,这里说明了一些关于扩展自动升级的事项
  11. 旧版本的 chrome,例如 31,在企业安装的时候,会比较慢,一般需要等 1-3 分钟才会发起请求去拉安装文件,新版本的就快很多,一般一启动就去拉了,不知道为什么
  12. chrome 31 的插件安装缓慢跟版本本身有关,跟网络环境无关,这个没办法

————————

2014-6-19 10:26:28 update

在线的 javascript 代码压缩和混淆工具有,http://closure-compiler.appspo…http://marijnhaverbeke.nl/ugli…http://ganquan.info/yui/

3 thoughts on “chrome 扩展开发二三事

  1. “修改请求头部字段会在 TCP 连接发起之后,也就是这个时候 URL 已经是不能变的” 似乎这个时候 HTTP 请求还没有建立,所以虽然 TCP 连接已建立,但是修改 Host Name 和 URL 的 Path 还是可行的吧?未亲测。

    • 嗯,修改 url 的那个方式我没有细跟,原因是当时修改了 url 之后重新带上的 cookie 貌似有问题,所以就用了修改请求头其他字段的方式,至于说重新发起 tcp,我猜可能是 chrome 为了防止修改之后的 url 跟修改之前的 url 不是同一个目标机器上的,所以才会弃用原来的 tcp 连接而发起重新的 tcp 连接

Leave a Reply to dahaijiang Cancel reply

Your email address will not be published. Required fields are marked *