FillForm是Firefox的一个扩展,根据名字可以看出来是填写表单,但是实际基本所有的表单元素都会处理的,这个扩展的功能就是可以保存和填写当前网页所有文本框、复选框、单选框的内容(input、textarea、select标签)。
火狐官方安装地址:https://addons.mozilla.org/zh-CN/firefox/addon/fillforms(推荐)
谷歌托管安装地址:http://code.google.com/p/ffextension/downloads/list
虽然Firefox本身也有自动填表的功能,但是也有些缺陷,例如:
1.别人临时用下你的电脑登录下邮箱,可是一打开网址发现里面已经填了你的用户名和密码,这是我们所不愿意的。
2.有些网页在打开后会初始化一些东西,例如清空所有文本框,这样Firefox刚刚自动填入的内容也没了。典型的一个例子就是163邮箱登录。
3.Firefox要保存文本框内容必须在你有提交表单动作的时候才提示“记住”还是“跳过”。
4.有些文本框并没有放在Form表单中,这样Firefox是没法直接保存的。
网上有一些填写表单的扩展的,但是用起来很不方便,记得有个扩展是把Firefox本身的填表功能升级了,填写用户名和密码后自动提交,这样上面列出的问题1对我们来说就更加糟糕了。还有个扩展是必须要用户自己设置哪个id哪个name的标签设置为什么值,这个对于大多数根本就不懂HTML基础知识的人来说应该比较困惑,即使懂HTML的人也觉得比较麻烦。
用过世界之窗浏览器的人就知道了,那个里面的自动表单功能很好用,Alt+1就保持当前表单内容,Alt+Q就填写当前表单内容(前提是你已经保存了数据),在你需要的时候才填写。本扩展就是要在Firefox上实现这功能。网上制作Firefox扩展的范例很少,在这里就顺便和大家分享下,记录下我的开发过程,大家也可以在下面发表点的建议。
关于如何写火狐扩展,网上中文资料真是少之又少,好不容易找到个范例,对照着做还是没反应。最后绕到火狐官网的开发者中心,都是英文的,尽管看着比较吃力,但是还是慢慢啃了,找到个helloworld的范例,安装很简单,直接把xpi文件拖到火狐浏览器里面即可。xpi文件其实就是个zip压缩文件,把后缀名改成zip然后解压就可以看到里面的结构和代码了。组成比较简单,基本就一个js和一个xul文件。它是在浏览器中的工具菜单下增加一项,点击后会弹出一个关于对话框。
现在要做的就是在那个js文件里使用dom方式访问当前网页了,读取设置值。可是当前页面的顶级元素是什么呢?在js中是document,我在那范例代码里的js里修改测试了下发现并不被认识,然后研究了下其它的扩展的代码(所有本机安装了的扩展都可以看到代码的),尝试了doc、application、firefox、app等,都不行。
继续找资料,发现原来火狐浏览器自己的整个界面也是个xul文件,可以通过chrome://browser/content/browser.xul访问,document是顶级元素,可是不是那个当前网页的顶级元素,这样直接用document访问显然就不行了。检查了下当前网页所在的元素是:
<tabbrowser id="content" disablehistory="true" flex="1" contenttooltip="aHTMLTooltip" contentcontextmenu="contentAreaContextMenu" onnewtab="BrowserOpenTab();" autocompletepopup="PopupAutoComplete" ondrop="contentAreaDNDObserver.onDrop(event)" onclick="return contentAreaClick(event, false);"><panel class="autoscroller" id="autoscroller"></panel></tabbrowser>
这样用document.getElementById('content')访问,但是真正要访问当前打开的页还不行,得用document.getElementById('content').selectedBrowser.contentDocument,这样就突破了一大难关,和网页交互基本不是问题了。我写了下面这段代码读取Input标签的id、name、index(测试成功):
var currentDocument = document.getElementById('content').selectedBrowser.contentDocument;var colInputs = currentDocument.getElementsByTagName('input');for(var i=0;i < colInputs.length;i++){alert('name=' + colInputs.item(i).name + '/nid=' + colInputs.item(i).id + '/nvalue=' + colInputs.item(i).value + "/nindex=" + i);}alert('ok');
要实现fillform的功能必须要解决js文件读写文件的问题,网上找了半天没什么特别有用的资料,最后还是绕道了那个develop center,有这么个页面专门讲解了如何如果操作文件:https://developer.mozilla.org/en/Code_snippets/File_I%2F%2FO ,粗略看了下,基本主要的读写功能以及读写模式什么的都有介绍,由于今天活比较多,没来得及细研究,只是把搜集到的资料保存到了一篇博文里:http://blog.csdn.net/sysdzw/article/details/5511755。
今天主要看了那个官网的File I/O的文章,打算写几个实现读写文件的功能的例子。先整理了下到目前为止遇到的些问题(*表示优先度高点的,灰色表示已解决):
*1.js多个函数书写格式及调用问题,为什么增加了个函数就挂掉了
*2.扩展读写本地文件问题
*3.数据文件的格式设计
4.界面语言(中文、英文)
5.关于对话框
6.版本控制(自动检测升级) 通过审核了会有Mozilla统一处理的
7.图标问题,为什么按规则添加的gif或jpg都无效
*8.保存的数据加密和解密问题
9.考虑将来升级版本数据兼容问题
10.可视化管理界面,暂时不提供,均由程序自动处理
*11.热键控制操作
直接复制那代码稍微修改下,然后放到一个我建立的函数writeToDataFile中,可是试了下怎么都不行,并没有写文件成功,这说明在哪一步出错了(很郁闷的是,出错应该有提示的,可是安装好有什么反应都没有,我只有在代码里各个位置加alert并不断的重启Firefox然后试,不知道有什么好点的办法),试了很多次还是不行,发现就保持那个默认的函数的可以的,我的加上去就不行了。找了很久最后才发现,原来函数的最后的右大括号“}”后面要价格逗号的“,”。而当只有一个函数的时候后面可以不加,真是郁闷。接下来又试了很多次,终于写文件成功。要打开文本文件也看到换行效果的话需要用/r/n,表示回车换行。
但是测试写入中文发现都是乱码。之后的读取中文也是的,都是乱码。都改用UTF-8模式还是不行,到目前为止还没解决。
今天设计了下大致的文件格式,第一行放url地址,紧接着就保存信息,例如标签名值什么的,暂时未处理加密问题,范例如下:
# The first line is the URL,and the following lines is record some tags's information.# The tags is "input" or "textarea" only.# Only some "input" with attribute "type" is "text" "password" "checkbox" "radio" will be processed, # the FillForm'll set its attribute "value".# All "textarea" will be processed,FillForm will set its attribute "innerHTML". # The URL following has 3 arranges:# # Arrange 1 is operate type,it has 3 kinds# 0 id (input or textarea)# 1 name (input or textarea)# 2 index (input)## Arrange 2 is tags attribute'value,the attribute due to arrange 1## Arrange 3 is tags value or innerHTML,it due to arrange 1 and arrange 2http://passport.baidu.com/?login&tpl=mn0 username sysdzw0 normModPsp test123#
今天开始着手写填写和保存网页元素的两个函数。在填写时首先获得当前打开网页的URL,然后根据从本地文件读进数据,用正则去匹配获得结果,没找到的话放弃,找到的话就开始一个个处理。文件就像上面的格式。
在js中几乎没用过正则,遇到了不少问题。一般我们用match去匹配字符串,双斜杠//之间的是个固定常量,而我需要由一个变量拼接起来形成一个表达式,找了很多资料都不行,最后发现得用new RegExp,它在声明时可以由变量组成一个表达式,最后用exec方法处理。另外一个就是如何取得括号捕获的内容,这个没花多少时间,在javaeye里面找到了答案,也是用exce方法处理。
基本填写的函数测试是通过了,基本没问题。
保存的函数也已经开始写,首先是搜集当前页面的所有信息(目前只处理了Input的信息),只处理type为“text、password、checkbox、radio”这几类。已经可以搜集保存到一个字符串中。下面就是根据情况写入到文件了,如果已经存在则用正则表达式替换更新,如果不存在则在末尾追加。
目前遇到的问题:
1.使用正则替换该如何操作?xx.replace(//,xxx)这个估计是不行了,因为我的表达式含有变量。
2.写入文件如何使用追加模式?这个可以到develop center找答案。
3.写入文件如果是中文如何保证不乱码?这个找了很久都没找到方法,先放放
另外上面提到过关于js代码出错并没有任何提示的问题其实很好解决,用try...catch捕获下就行了,呵呵。
经过csdn一位网友的启发,找到了替换文件方法,其实也就是找到了正则表达式如何用变量组成的方法,这里顺便说下方法,是用eval函数。
遇到了点小问题困惑了很久,不过最终还是解决了,这里提下,防止以后再碰到这样的问题:
js中默认的换行是/n并非/r/n,这个在我要将数据内容中的回车换行替换为“/r/n”的字符表示时浪费了很多时间。
填写的函数也已经完成,基本的功能测试都可以了,现在的最最主要的问题有以下几个:
1.不支持中文,用utf-8格式也不行。
2.不知如何设置热键。
3.设置地区语言。
4.使得弹出窗口有标题栏。(2010/5/2添加)
解决了中文乱码问题,方法很简单就是用了escape和unescape函数,对于密码什么的依然是明文显示,以后考虑解决。
对第三段值已经采用base64加密,这样中文英文都进行了处理,这样密码也不会光天化日的暴露在坏人面前了,呵呵。
接下来打算处理热键功能。另外还有个小问题就是弹出的JavaScript窗口的标题很难看,看看能不能改掉。
今天把热键的功能实现了,现在按Alt+Q就填表,按Alt+W就保存当前表单。 这个是研究了半天firebug代码的成果,好不容搞定,原来那个热键需要在key标签里定义的,而执行的需要放在command标签里。普通键直接写在key标签的key属性里,如果是特殊键的话需要用系统约定的例如“VK_F12”表示F12键、“VK_DEL”表示删除键等。如果有控制键的话约定是key标签的modifiers属性“alt、accel、shift”。
有个困惑了很久的是判断函数是“file.exists”,郁闷了我半天,最后发现原来是exists后面必须要加括号,看样子还没有完全适应js啊。
今天还把关于对话框搞定了,之前是用的自己做的一个简陋的对话框,什么东西都是写死的,版本什么的每次升级了还需要自己手动修改,现在直接调用系统的模板对话框读进配置信息,例如创建者版本什么的。
总结下今天突破一下几点:
1.解决了热键问题,下一步考虑看能否实现自定义。
2.解决了关于对话框问题。
另外保存信息部分做了点修改,即使当前文本框都为空也保存当前页面信息,不然用户可能会因此而困惑,扩展只需按用户的意愿执行就行了。目前版本为1.0.1
修改了些翻译。谢谢小白(Shelley)的帮忙,呵呵。
目前版本变更为1.0.2
晚上修正了下支持单选框和复选框已经下拉列表。重复的name也支持了。
由于提交审核被Mozilla打回,说使用eval函数可能会带来安全隐患什么的。在Mozilla官方网站提交扩展的时进行了次代码初步检查,当时就提示eval函数问题,我没在意,现在经过人工审核还是不行,看样子不得不修改了。查了下,代码里共3处使用了eval,主要就是针对于字符串的mach方法调用正则的地方。结果用new RegExp都改改了过来。
另外做了本地化处理,如果你安装的火狐是英文版,那么相关的菜单项就是英文的,如果是中文版的火狐那么菜单项就是对应的中文。
目前版本变更为1.0.6
今天收到Mozilla通过审核的通知邮件,呵呵,不容易,终于出沙盒了。
增改了一些功能:
1.在没有找到与当前网址匹配内容时可以启用通用表单的填写功能。
2.删除了以前填写的模块的一些不必要的代码。
增加了通用表单的功能,当发现并没有为当前网址保存过信息时,则从历史数据中根据id和name尽量匹配填写各个元素,这一功能为很多人带来了极大的便利,因为有时相同的一个网页可能有不同的网址,典型的比如后面带参数的,这样一处理就基本解决了问题。
为了使得读取的历史表单信息总是最新的内容,调整了保存数据模块的逻辑。
当有新数据时追加到文件的最开始处。
当有数据要更新时,先删除原来数据的数据,然后把新数据添加到文件的最开始处。
这样如果用历史数据填写时总是用的最新的数据了,这样用户也可以控制让什么数据保持在最新,想使用什么数据来作为默认值填写,这时只要再去保存下就行了。
今天下载量是198,前几天好像是110、128、144、198,呈几何级数增长啊,呵呵,很欣慰。好像默认的扩展搜索栏用fill form去搜索我的扩展都是排在第一位的,所以下载量比较高,新版本等下载量下去后再放,不然一审核的话下载量又下去了。
发现“日用户停用数 ”越来越高了,截止到昨天已经达到了28,速度很快,不知是为什么用户要停用,虽然想对于总“日活跃用户数 ”400多,这个数字并不算什么,但是我还是仔细分析了下原因:
1.用户只是把不常用的插件停用以节省资源,如果是这样还算好的。
2.用户错误的下载了自己不需要的插件,这个也没问题,不需要的插件留着做什么呢。
3.用户觉得可能有安全隐患,密码保存了会不会被别人知道呢?这个没办法,插件通过了审核的,爱下不下,没审核前下载量确实很小。
4.停用的可能是部分升级的用户,插件一升级原来保存的数据都没有了,这让用户很困惑,难以接受,所以停用。要是这样的话就是我设计的问题了。
5.觉得功能有缺陷,比如对于有frame嵌套网页的根本没法处理,这个以后会考虑解决。
以上4、5两个问题会着重解决。
另外加紧1.1.7版本的发布准备,当每日停用的用户达到50时决定正式发布。其实新版本的投入并不能减少用户的停用数,由于至少需要半个月的审核,所以此期间肯定会导致下载量大大减少。而且仓促盲目发布必然带来某些问题,翻译方面就是个典型的。
不如先将用户下载数带上去,这样以形成影响,现在绝大部分下载来源是火狐的“附加组件”那边的搜索,估计用户一般是通过关键词“fillform”或者“fill form”搜索到的,前者搜出来的只有我一个插件,后者搜出来的有很多,但是我的是排第一位的,大名鼎鼎的“autofill forms”竟然也排在我下面,尽管其周下载量是七千多,我的是一千多,不过我相信这距离会越来越短的,而且他最新的一次更新是在2008年的,上个年代的了,呵呵。
说实话,插件本身的技术性及功能上我的确实不如它,不过易用性上面它的绝对不如我的。
版本1.1.7发布前必须处理好的事:
1.数据文件的保存和转移,如果不能做到那么必须在组件介绍页写出提示,让用户备份数据,不过这是下下策,因为公开了数据源非常不好。
2.英文翻译力求地道准确,插件80%的用户都是老外,不能让他们看得困惑。
3.争取界面的人性化,典型的如保存后提示成功的对话框最好不要含有感叹号,能有个“i”的消息提示的框就好了。
一些零碎的事:
1.设置的对话框的按钮和底部距离应该小点,上面可以插入个空白。
2.设置应该翻译为“Set”还是“Options”还是“Setting”?参考下其他几个插件。
3.有必要的话采集其他插件的使用者邮件向他们推荐此插件。
4.对于input如果没有type类型的也要能够处理。
插件功能概要描述:
1.通过一个快捷键(Alt + Q)就可以填写当前网页内容。
2.通过一个快捷键(Alt + W)就可以保存当前网页内容,这是autofill forms所没有的功能。
3.对于已经保存的数据都是做了一些加密的,别人是无法轻易看到得到里面的信息的。例如用户名、密码等。这是autofill forms一直存在的缺陷。
4.对于表单,可以填写除了input标签之外的所有可填写的标签。例如textarea,select。(文本框、超文本框、下拉列表框、复选框、单选框)。
5.可以填写非表单的标签。例如有些标签并没有放在表单内我们的fillform也可以处理,而autofill forms是无法处理表单之外的标签的。
6.可以使用历史数据对未保存过信息的网址进行填写。有时一个相同的网页有着不同的网址,fillform只要保存一次就可以都填写了。
7.如果使用历史数据填写,则都是使用最新的数据进行填写。例如很多文本框的name标签都叫username,历史记录中可能保存了很多 username的值,这时如果再遇到name为username的文本框则会直接使用最近保存的一次的值进行填写。通过保存操作用户可以调整控制“默认值”。autofill forms是弹出个对话框让用户选择的,比较麻烦。
8.有效的减少了一些冲突,智能化处理的很多东西,大大降低用户的手工操作。例如几个文本框的name属性都叫“username”,在 fillform中可以自动编排处理,无须用户手工选择,这在autofill forms中需要手工确认information 的。
9.此插件虽然小但功能却是强大的,而且使用方法很简单,占用系统资源也很小。
英文部分已经翻译,可能需要调整,哪位英语好的同学帮忙看看。
FillForm features:
1. Fill out current web forms with a keyboard shortcut(Alt + Q).
2. Save current web tags's information with a keyboard shortcut(Alt + W).
3. The saved data has been encrypted. Nobody can get the information easy. Such as username, password.
4. Works with all input fields, texteareas, selections, checkboxs, radio buttons etc.
5. The addon also can deal with some input fields which are not in any forms.
6. You can use the historical data to fill the web page which is not saved. You just need to save only once even if the same page or same form has different URLs.
7. The addon always uses the latest historical data to fill the page. For example, there will be more than one input fields which have the same name property, such as "name='username'". The addon will use the latest value. You can set the "default" value by the saving operation.
8. Can reduce conflicts effectively and deal with things intelligently, this will greatly reduce the user's operations. For example, several input fields with the same name attribute ("name='username'") in a web page, the addon also can saved correctly, Of course, can filled correctly.
9. The addon is not only powerful,but also easy to use. And only active when filling out forms so it doesn't consume any system resources while surfing.
找到了confirm和alert的通用替代方法,需要做的修改:
1.信息保存成功时弹出的对话框。
标题用“Fillform”;
底部按钮用“确定”;
内容:
信息已经被成功保存!
□ 不再显示此消息
The information has been saved successfully!
□ Do not show this message again
2.当要保存的信息已存在时弹出的是否覆盖对话框。
标题用“Fillform”;
底部按钮用“是、否”;
内容:
当前网页的相关信息都已经被保存过了,是否覆盖?
http://writeblog.csdn.net/PostList.aspx
Tips
1. 按快捷键 "Alt + W" 保存当前网页信息
2. 按快捷键 "Alt + Q" 填写当前网页信息
This web page information has been saved, would you like to overwrite it?
http://writeblog.csdn.net/PostList.aspx
Tips
1. Press "Alt + W" to save current page information.
2. Press "Alt + Q" to fill information.
3.如果当前网址未保存过信息会弹出是否使用历史数据填写。
标题用“Fillform”;
底部按钮用“是、否”;
内容:
你还没有为当前网页保存过信息!是否使用历史数据填写?
http://writeblog.csdn.net/PostList.aspx
Tips
1. 按快捷键 "Alt + W" 保存当前网页信息
2. 按快捷键 "Alt + Q" 填写当前网页信息
□ 不再显示此消息
You haven't saved the information for this web page! Would you like to fill with the historical data?
http://writeblog.csdn.net/PostList.aspx
Tips
1. Press "Alt + W" to save current page information.
2. Press "Alt + Q" to fill information.
□ Do not show this message again
4.如果使用默认信息填写,但是一个都没有填写成功,那么会弹出提示“没有填写任何标签”的信息。
标题用“Fillform”;
底部按钮用“确定”;
内容:
填写失败!历史数据中没有找到任何相吻合的信息,因此当前网页中一个元素都没有被填写!
http://writeblog.csdn.net/PostList.aspx
Tips
1. 按快捷键 "Alt + W" 保存当前网页信息
2. 按快捷键 "Alt + Q" 填写当前网页信息
Failed! You haven't filled any element of this web page with the historical data!
http://writeblog.csdn.net/PostList.aspx
Tips
1. Press "Alt + W" to save current page information.
2. Press "Alt + Q" to fill information.
参考网址:https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIPromptService
重写了confirm和alert函数:
confirm: function(sTitle,sMsg){try{var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);var flags = prompts.STD_YES_NO_BUTTONS;var check = {value: true};return prompts.confirmEx(null, sTitle, sMsg, flags, "", "", "", null, check)==0;}catch(exc){alert(exc);}},alert : function(sTitle,sMsg) {try{var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);prompts.alert(null, sTitle, sMsg);}catch(exc){alert(exc);}},alertChk:function(sTitle,sMsg,sCheck,bDefaultCheck){try{var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);var check = {value: bDefaultCheck};prompts.alertCheck(null, sTitle, sMsg, sCheck, check);return check.value;}catch(exc){alert(exc);}},
今天把之前定的式样基本实现了。工作量最大的是翻译,找了好多人最后基本就这样了,已经上传到Mozilla,提示有30个插件正在排队,前几次提交都是一百多个,看样子大家都去看世界杯了。希望编辑对足球不感兴趣,呵呵。
找到了检测语言的另一个方法,直接从系统中获得,封装成了函数:
getLocale: function()
{
try{
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("general.useragent.");
return prefs.getCharPref("locale");
}catch(exc){alert(exc)}
},
另外顺便写下加按钮到工具栏的代码:
<toolbarpalette id="BrowserToolbarPalette">
<toolbarbutton id="fillform-button" label="FillForm" oncommand="FillForm.fillForm(event);" onclick="if (event.button == 1) FillForm.fillForm(event);" class="toolbarbutton-1 chromeclass-toolbar-additional" tooltiptext="FillForm"/>
</toolbarpalette>
这次更新果然很快,官方显示的6月14,也就是说提交后两天就审核通过了。
查看了下昨天下载量是165,日用户量增加一百多,以前从来没这么多,之前的可能基本70%的下载好后就删了,现在的165日用户增加是707-578=129,也就是说165中有129个人是保留着这插件的,看样子新版本还是等到很大认可的,留住了不少用户,非常高兴。
要是保守的话继续留着1.0.6的版本,估计会继续失去很多很多用户的,胜利在望了,呵呵。
现在下载量突破4000,日用户突破1000,每日下载量突破200,收效比较明显。
只是评分有点气愤,目前为止一共有4个评分,分别是4、1、4、5分,其中评分1的是一个国人的,其他都是老外的。那个丢人的国人说“PHP网页完全不能填写”,这个填写跟网页语言没任何关系的,可以看出其人对于web是基本什么都不懂的,还乱评,我在下面已经回复他了。又没有需要交费的,好像自己付了多少多少钱似的,这么嚣张,由此可见其素质,这也反映出了部分国人不知感恩,别人付出多少他不在乎,只知道自己获益多少,自私狭隘。
下一版本1.1.8需要修改的几个地方:
1.语言的获取方式,直接通过about:config那边获取
2.设置信息直接保存到火狐的公共区域,这样下次再进行安装时不会被覆盖
3.提示使用历史数据进行填写的时候那个“下次不再提醒”的对话框和上面的内容保持一个空行的距离
昨晚收到一封来自美国旧金山大学的一个朋友的邮件,反映说fillform在iMac下无法使用快捷键。
之前审核通过时编辑就发了邮件告诉我的,当时由于考虑到用着系统的人少(根据目前的统计数据来看,用widows的占90%左右)而且手头又没有这系统,所以就暂时没管。
不过最近隔壁的一个朋友买了个苹果笔记本,于是就去测试了下,果然快捷键使用有点问题。如果当前光标在文本框内按下alt+q或w时会直接在文本框内输入一个字符;但是如果在网页的任意空白地方点击下使得文本框没有焦点,然后再使用快捷键就ok了。其实是苹果下面的功能键和windows下分配习惯有点区别,苹果下面一般都用ctrl+字母,或者ctrl+shift+字母,怪不得我看其他插件基本都没有用alt+字母做快捷键的,开始还高兴这样就没有冲突了的呢,原来是暗藏玄机。
知道了问题的原因下面就要想对策了。我临时给那位朋友的意见就是不让文本框有焦点然后再按快捷键。打算最终解决问题的方案有两个:
1.根据操作系统执行快捷键,在windows下面就是目前的。苹果下面ctrl+字母基本都被使用了,火狐浏览器本身也使用了很多ctrl+字母作为快捷键。很多插件都是用ctrl+shift+字母做快捷键的,我的用的q和w,目前好像还没发现有冲突的。打算就用ctrl+shift+q和ctrl+shift+w了。
2.可以让用户自定义快捷键。这个可以参考其他软件,很多都有这功能的。
以上两点打算在下一版本1.1.8中实现。
今天又收到个用户请求说让在右击菜单中加入操作项,正好把要在下一版本1.1.8中所有可能的改造点罗列下:
1.语言的获取方式,直接通过about:config那边获取 2010/7/4
2.设置信息直接保存到火狐的公共区域,这样下次再进行安装时不会被覆盖 2010/7/4
3.提示使用历史数据进行填写的时候那个“下次不再提醒”的对话框和上面的内容保持一个空行的距离2010/7/4
4.根据操作系统设置默认快捷键。windows下就是1.1.7版本中的,iMac下面的用ctrl+shift代替alt(来自用户邮件反馈) 保留待1.1.9处理
5.可以让用户自定义快捷键。这个可以参考其他软件,很多都有这功能的 保留待1.1.9处理
6.设置选项可以让页面载入时就自动填写上保存的内容(来自火狐下载页评论) 2010/7/4
7.提供可以修改保存的数据的功能(来自火狐下载页评论) 保留待1.1.9处理
8.遍历所有frame框架页 2010/7/4
9.在右击菜单中加入直接操作的菜单项(来自csdn反馈) 2010/7/5
10.数据文件保存到非扩展目录,这样才有可能导入和导出 2010/7/6
备注 :灰色 表示已经处理,划线 表示废弃,原状的表示保留
今天对informenter进行了剖析,找到了将设置保存到火狐公共区域(about:config)的方法,主要就是处理设置的存取这一块,另外选项上面也增加了个在页面加载完成后是否自动填写当前网页,默认为是。三个默认选项分别为:不使用历史数据填写、不忽略提示成功的对话框、自动填写网页。
处理项为7月2号list中的1、2、3、6、8这几项。
顺便把封装的两个函数贴下:
//get fillform setgetUserPrefBool: function(prefName, prefDefault){try{var ife_Preferences = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);if (!ife_Preferences.prefHasUserValue(prefName))ife_Preferences.setBoolPref(prefName, prefDefault);return ife_Preferences.getBoolPref(prefName);}catch(exc){alert(exc)}},//set fillform setsetUserPrefBool: function(prefName, newBool){try{var ife_Preferences = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);ife_Preferences.setBoolPref(prefName, newBool);}catch(exc){alert(exc)}},
今天无意发现代码中的几个小问题:
1.第128行 var url =location.href; 应为 var url =doc.location.href;
2.第204行 var isFilled = false; 应该放到try语句中
3.xul那边的不需要将当前选择的browser传递到那函数,参数都可以省略,然后交由fillform函数处理
4.用 doc.baseURI; 替代 doc.location.href;
5.找到了增加网页右击菜单项的方法了,研究了好一阵子firebug才找到方法的
6.考虑到网页右击菜单中使用以前的“填写”、“保存”可能会造成歧义,所以文字上面做了较大修改,首先插件中文名称改为“自动表单”,因为可以自动填写了嘛,以前用“自动”二字一直很慎重,呵呵。另外两个操作改为“填写表单”、“保存表单”。大致和世界之窗浏览器的保持一致了。英文的还需要做相应的修改。
昨天在火狐官方论坛上发了个帖子问如何使得数据文件不覆盖,今天看了下有个热心的老外回了。感觉他的英语有点别扭,看了下国别是乌拉圭,原来是个说西班牙语的国家,呵呵,和我一样,对于英语国家来看都是老外。
扯远了,那位朋友说数据文件应该保存在profile文件夹下,也就是extension的上一层目录,并且给了个MDC关于IO的一篇官方文档的链接,看了下,找到可以在extension上层目录创建一个文件夹的方法了,可是怎么在这个目录中读写文件呢?整个文章看了半天都没找到结果。
在扩展中写文件一般需要三个对象。nsIExtensionManager、nsIFileOutputStream、nsIConverterOutputStream,第一个是创建文件对象,拥有.path、.exist等基本属性,但是不像fso那么方便可以直接write什么的,需要靠nsIFileOutputStream和nsIConverterOutputStream才可以完成输出。后面两个对象主要是控制文件输出的方式以及编码格式。
之前是在扩展目录下写文件的,范例中有代码通过nsIExtensionManager的getInstallLocation方法指定要读写的文件,可是这个方法只能局限于扩展自身的目录。我想如果要写在其他目录肯定也离不开nsIExtensionManager对象,它下面应该还有其他方法,可是搜遍了MDC都没找到满意的答案,说什么有两个接口都是叫这名字,有冲突不妥当什么的,就是没有找到个详细介绍页,然后在最新的某一份资料中发现说在Firefox4.0中这个将会被什么addonManager替代,然后找了这个对象还是没有什么实质性的内容。
想想还是去研究informenter的代码吧,因为之前看到它的选项对话框中会显示数据文件内容的,而且重装这个插件后数据还是在的。可是搜遍了default(extension的父目录)目录都没找到它的影子,无奈一行行看那些js代码吧,最后终于发现,原来它的数据文件都保存在about:config哪里的,作者太不厚道了,怎么可以放在这里呢?每次启动的话这些数据都会被加载的,十分影响火狐启动速度及其性能和稳定性的,而且我那边数据量可能很大,这个方法肯定不行,顺便也建议informenter的作者妥善处理下。
看样子必须得研究iMacros了,因为这个可以编辑内容,并且可以导入导出,而且我也看到了它在default下有个专门的文件夹iMacros,可是这家伙很庞大,代码一大堆。在火狐官网上午又求助了,不时的去刷新,到现在还没人理。还是先看看iMacros的代码吧。
那个插件的代码太复杂了,没看出什么头绪,晚上回来上了下论坛,发现老外回复了,给了方法了,十分感谢这位国际友人tito bouzout,决定加入贡献者列表。上面的问题list的第十项已经解决。
无意发现个问题,会弹出什么“invalid range in character class”错误,一行行删除代码,错误终于定位在“new RegExp(”这里了,自己检查才发现原来是构造正则表达式时由于id或name可能有元字符导致正则表达式出错。然后对于有变量的统一用 replaceRegChar函数处理了下,一个自定义函数,可以转移那些正则表达式中的元字符。
发布了才发现上面的那个错误,再去重发布下。
在英文版下测试发现快捷键显示有点不妥,然后工具菜单那边做了稍微调整,页面上的右击菜单拿掉快捷键。还有右击菜单项的id和工具栏上面菜单的重复了,修改了下。设置界面的英文太长了看起来极不协调,又调整了下现在看起来简洁多了。重新发布了,上次排队好像65,现在87了,不知又要到什么时候了。
本以为要等个几天的呢,想不到今天就收到审核通过的邮件了。Mozilla工作效率真高,某D的真应该跟老外好好学学。
发现多了条留言,原来是某个国人挑刺,说应该通过设置来决定是否在右击菜单中加入填写和保存的操作项,只给了4分,小气,不跟下面的几个老外学学。真是众口难调,那个要加入右击菜单的是这篇文章下面的某个用户要求的。现在修改了下可以通过设置来决定是否显示在右击菜单中了,等在下一个版本1.1.9中发布。
搜集并整理下1.2.9中可能需要新增加的功能:
1.右击菜单中的操作项可以由用户设置是否显示(来自火狐下载页评论) 2010/7/8
2.根据操作系统设置默认快捷键。windows下就是1.1.7版本中的,iMac下面的用ctrl+shift代替alt(来自用户邮件反馈)
3.可以让用户自定义快捷键。这个可以参考其他软件,很多都有这功能的
4.增加可以删除单条已保存数据和清空所有已保存数据的功能(来自火狐下载页评论) 2010/7/16
5.所有id命名含-的改为_ 2010/7/16
6.语言文件,自定义的语句直接用xx=yy的格式 2010/7/16
备注 :灰色 表示已经处理,划线 表示废弃,原状的表示保留
下午研究了半天firebug的代码终于搞明白了怎么用listview显示数据和处理数据了,真的很麻烦,怪不得MDC上说这个是较复杂的控件,其实类似这样的控件在其他语言中操作都比较简单的,不知道这个上面怎么搞的,非得建立个和其内部结构一致的对象。
现在已经完成了逐个删除单个数据和清空所有数据的功能。本来想支持多条数据删除的,可是selection好像无法一个个访问,只得selection.currentindex来逐个删除。剩下的导入导出好像比较麻烦的。(考虑到数据的隐私性还是不提供导出功能了)
另外还发现listview的一个bug,删除最后一个元素后明明没有选择的条目了,但是根据selection.count查询的结果还是1,奇怪。
真正发布时还得处理下原来的数据是否合法。
终于完善好了,发布下。现在已经凌晨2点47了。 - -
稍微修正了点然后又重新上传了
选项那边的第一句英文翻译。
选项的风格和数据查看的风格设置一样。
部分js代码按照功能分离到不同的js文件中了。
审核没通过,说部分变量命名和其他插件的命名冲突,比如Lib.和Base64.,我在前面都加了个ff这样就冲突了。在提交提示队列95,和上次一样,又得过个5天才能审核到我了。
今天插件的统计数据表明下载量已超1万,可喜可贺!
总下载
从 2010 年 05 月 5 日 以来
|
10,032 | 日活跃用户
在 07 月 23 日 (五)
|
2,287 | |
最近一天
07 月 23 日 (五)
|
148 | 变化率
2,297 在 7月. 22
|
-0.44% | |
平均日下载量 | 126 | 平均日活跃用户 | 824 | |
最近七天 | 1,499 | 本周平均每日用户
+16.78% 自上周以来
|
2,041 |
今天闲的蛋疼,想一鼓作气在老外人群中推广下,将下载量再推到一个高潮,可惜结果事与愿讳,将插件推向了死亡的火坑,陷入了万劫不复的境地,真是欲速则不达啊。
我写了个程序从Mozilla官网的一些评论页采集用户邮箱,然后通过网页上“插件的分享给好友功能”批量发送。由于采集结果未作重复筛选处理,结果很多人都收到几封推荐邮件,由于那上面人基本都是老外,对这样的邮件反应很强烈,结果被当做骚扰邮件向AMO举报了。AMO对此也比较重视做出了严厉的处理,直接将我插件封了,并通知我到其他地方放插件。现在那插件不能升级也不能提交新版本了,而且搜也搜不到了,打开插件的网址提示“We're sorry, but we can't find what you're looking for”,555
早上打开邮箱有回信了,说继续禁用我的插件,大大的杯具,555
今天向AMO发了邮件申请给我插件启用,说的真是声泪俱下啊,不知道有没有用。。
到现在还没收到AMO的回信。有两个可能:
1.AMO看到了后仍旧维持“原判”然后直接忽略此信,这样的话就杯具了。
2.AMO被我声泪俱下的文字感动了,正在讨论处理决定。
不过根据以前和他们的信件交往来看,不理不问的可能性比较小,无论是什么结果他们都会回信的。这样第二个可能性就比较大了,因为那时周五晚上发出的,如果他们是双休的话那么可能今天晚上(米国和我们时间相反的)他们应该才看到信件。
主啊,让我度过此劫吧!
我昨天分析的对的,差不多是上面的第二种情况,早上收到的回信,沟通无果。。。以下为接收到的邮件:
Hello,
As you said, we forgive mistakes that are not very serious. But this was very serious. We are still getting emails from people complaining about the spam. Emails sent from our site will likely be marked as spam for many users now.
It's well-known that writing scripts to scrape information from websites without using their API is considered abuse, and while it may have been unintentional that you sent multiple emails to the same users, writing the script to begin with was intentional.
And yes, due to your actions, we will be putting checks in place on the email sharing feature to make sure this can't happen again.
Justin Scott
由于旧的被封了,所以我重新注册了个账户将fillform改成fillforms提交了上去,结果审核通过。不过发展已经没有之前那么好了。 之前下载量一天好几百,现在只能几十了。通过关键字fillform已经不能搜到我的扩展了,555
虽然被火狐屏蔽了,但是插件还在他们服务器上,并没有被删除。
http://releases.mozilla.org/pub/mozilla.org/addons/160849/
有不少用户反映最近在Firefox4.0下不能使用。试了下果然如此,看看还是修改下,毕竟ff4正式发布了。把之前老外的审核邮件翻出来,看看哪些能修改的就改下。
1) On Firefox 4.0b8, it causes several alerts on startup, one stemming from your attempt to use the old nsIExtensionManager rather than the new AddonManager. These are unacceptable and must be fixed.
这个在两个地方用到的。一个是关于对话框,在mdc上找了很久没找到方法,发现firebug的对话框可以正常使用的,研究了下它的代码,原来只要修改一点点而已,这个修正完毕。另外一个就是读取文件的地方,换了另外一种方式读取这样也没问题的。主要问题解决。
2) I would be extremely surprised if this worked on Firefox 1.0 at all.
呵呵,随便写的,想不到老外还真去试验了。挺有意思的是他并没有明显的责怪意思。
3) You can improve your extension's portability and save some code if you use the prefwindow element (https://developer.mozilla.org/en/XUL/prefwindow ) to manage your preferences.
这个没找到方法,暂时搁置。
4) You should consider using window.atob and window.btoa rather than your own base64 encoder and decoder.
Please address the above issues and nominate again.
放着以后再说。
5) The extensions preferences have not the prefix "extensions." (so that they have the structure extensions.fillform.*)
几个参数统一都加上extension前缀而已,已经修改了。
6) Why do you write code like this? var sLocale = prefs.getCharPref("gene" + "ral.user" + "agent.locale");
这个我也不想的,因为提交插件时总是提示这里通不过,好像是为了什么安全问题的。我也是没办法,于是就拆开来骗下自动检测的程序。没想通竟然通过了。
新版本v1.2.10于4月6号初步审核通过。