Posts tagged Plugin
New Year, New Slash-to-Search
0大家新年好,赶在2012来临之前,对之前写的一个Chrome小插件Slash-to-Search做了一些小的改进,新年新气象,如果你还在用这个插件,那么来看看吧:

What’s New?
- 选项页面有了新UI,如上图。
- 规则的添加和显示集成到了一起。
- 去除了规则到处功能,让插件更小巧。
Chrome下的iframe的诡异问题
3问题
本周五的时候为了方便工作上的操作,想开发一个浏览器插件,可以获取页面里面出现的第一个iframe加载的URL地址,目标是支持Firefox和Chrome,本来是一个非常简单的需求,无非只需下面一行代码就可以搞定:
alert(document.getElementsByTagName('iframe')[0].contentWindow.document.URL);
但是这行代码在Chrome下却栽了一个大跟头。原因是在插件代码中,从iframe中拿出contentWindow是undefined,我很是不解。
原因分析
我的第一个反映是会不会是Chrome的Webkit内核不支持contentWindow,但是当我打开页面源代码的时候却看到:
源代码里面清清楚楚地写着iframe的contentWindow属性是一个DOMWindow,这和代码中的情况不符合,我去网上Google了一把,有人说是这个是Chrome的BUG,还有人联想到了跨域的问题,总之,这个是Chrome本身的问题,当然,我更相信这个是Chrome的BUG,因为contentWindow在firefox是完全可行的,Chrome支持contentWindow,但是在插件代码中获取出来又是undefined,这种不一致显然是一个BUG。
解决方案
不过,BUG归BUG,问题还是要解决,可悲的是你不能指望Chrome啥时候能够把这个BUG给修复掉,然后你可以很爽快的获取到iframe的contentWindow,现阶段只能通过猥琐手段绕过这个BUG了。
解决这个问题的难处在于对于页面里面的诸多URL加载出来的Document,如何确定出你想要的哪一个。好在Chrome插件的Content Scripts可以设置一个属性all_frames,让Content Scripts可以在页面的所有frame上都执行一遍。这样就可以通过一个放在background.html中的全局计数器,让所有frame的Content Script都去请求这个全局计数器,全局计数器每被请求一次就加一,这样就达到了给所有的frame编号,而frame的Content Script的执行顺序又是按DOM树的顺序来的,所以通过frame的编号很容易区分出你想要的frame,下面是我写的简单的代码,可供参考:
<html>
<head>
<script type="text/javascript">
var counter = 0;
var tabId;
chrome.extension.onRequest.addListener(function(request, sender, return_storage){
if (request.type == 'counter') {
counter++;
}
return_storage(counter);
});
chrome.browserAction.onClicked.addListener(function(tab) {
counter = 0
chrome.tabs.executeScript(null, {"code":"tryAlert();", "allFrames":true});
});
</script>
</head>
<body></body>
</html>
function tryAlert() {
chrome.extension.sendRequest({
"type":"counter"
}, function(response){
if(response == 2) {
alert(document.URL);
}
}
);
}
豆瓣Chrome插件–显示我的豆瓣
0豆瓣的导航栏上竟然没有我的豆瓣的链接,这让我一直很困扰,所以晚上我就动手写了一个小插件,用于为豆瓣的头部导航栏加上一个“我的豆瓣”的链接,让你在豆瓣的任何频道都可以非常方便地回到“我的豆瓣”,插件的效果如下:

当然插件本身并没有什么技术含量,代码也就几行而已,如果你觉得你也正好有这个需求,那么尽管拿去玩,插件的下载地址是:https://github.com/downloads/khotyn/Show-My-Douban/Show-My-Douban.crx
Slash to Search—-更快速地搜索
0春节期间做了一个Chrome插件,这几天晚上又捣鼓了几下,拿出来和大家分享一下:
一、Slash to Search是什么?
Slash to Search是一个Chrome插件,使你在添加了一定的规则以后就可以通过敲击“/”来将页面焦点定位在搜索框上(事实上支持所有的输入框)。
二、如何使用Slash to Search?
- 首先从https://github.com/downloads/khotyn/Slash-to-Search/Slash-to-Search-0.2.crx下在Slash to Search并安装到你的Chrome中
- 打开一个页面(比如http://www.khotyn.com),右击搜索框并点击“Add to Slash-to-Search”
- 在弹出的配置页中选择Type(regex表示在匹配URL时采用正则表达式匹配,normal表示在匹配URL时采用精确匹配)点击Add就可以将可以添加可以规则
- 回到你打开的那个页面,按下“/”,看看是不是光标已经定位到搜索框中了?
三、后续计划
- 修复Bug
- 支持在线规则导入(已经在最新的版本中支持)
四、反馈
如果你对这个插件有任何意见,欢迎发邮件告诉我:hting1(a)gmail.com,或者在Twitter(@khotyn)上给我留言。这个插件的源代码在:https://github.com/khotyn/Slash-to-Search
在Mac OS X上安装JavaHL
2在Mac OS X下为eclipse安装了subclipse,但是每次启动都说JavaHL无法找到,不胜其烦,遂着手解决
什么是JavaHL
大家知道,subversion是用native code写的,所以如果要用java调用subversion的代码,就必须提供一组java API,而JavaHL就是这么一个东西,然你可以通过它提供的Java API来调用native code。
通过MacPorts安装JavaHL
Mac下有一个MacPorts这么个犀利的工具,可以简单地理解为Ubuntu下apt-get工具,可以让你在命令行下编译安装一些包,具体MacPorts如何安装大家看看这个链接就行了:安装MacPorts
在安装完MacPorts以后,你只需要在终端下执行下面的命令就可以把JavaHL给安装好了:
sudo port install subversion-javahlbindings
这里需要注意你的系统是64位,并且你的eclipse是32位的,那么你需要安装32位的JavaHL,或者把你的eclipse换成64位的。如果需要在64位系统下安装32位JavaHL请参考这个链接
安装完JavaHL,然后重启eclipse,最后在SVN的配置界面把Client选为JavaHL就ok了~~
