Posts tagged Plugin

New Year, New Slash-to-Search

0

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

image

What’s New?

  • 选项页面有了新UI,如上图。
  • 规则的添加和显示集成到了一起。
  • 去除了规则到处功能,让插件更小巧。

下载:Slash-to-Search

Chrome下的iframe的诡异问题

3

问题

本周五的时候为了方便工作上的操作,想开发一个浏览器插件,可以获取页面里面出现的第一个iframe加载的URL地址,目标是支持Firefox和Chrome,本来是一个非常简单的需求,无非只需下面一行代码就可以搞定:

alert(document.getElementsByTagName('iframe')[0].contentWindow.document.URL);

但是这行代码在Chrome下却栽了一个大跟头。原因是在插件代码中,从iframe中拿出contentWindow是undefined,我很是不解。

原因分析

我的第一个反映是会不会是Chrome的Webkit内核不支持contentWindow,但是当我打开页面源代码的时候却看到:

Screen Shot 2011-08-21 at 上午12.42.19

源代码里面清清楚楚地写着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

豆瓣的导航栏上竟然没有我的豆瓣的链接,这让我一直很困扰,所以晚上我就动手写了一个小插件,用于为豆瓣的头部导航栏加上一个“我的豆瓣”的链接,让你在豆瓣的任何频道都可以非常方便地回到“我的豆瓣”,插件的效果如下:
Show_My_Douban
当然插件本身并没有什么技术含量,代码也就几行而已,如果你觉得你也正好有这个需求,那么尽管拿去玩,插件的下载地址是:https://github.com/downloads/khotyn/Show-My-Douban/Show-My-Douban.crx

项目的主页是:https://github.com/khotyn/Show-My-Douban

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了~~

Go to Top