`
xiangxingchina
  • 浏览: 520368 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Firefox插件(plugins)开发实用指南

阅读更多

Firefox插件可实现强大功能,但其中麻烦事情不少。写这个实用指南首先是为了方便自己记忆,免得以后再次栽倒一些坑里面,如果能帮助其他人,则是更好。这个指南不是为了手把手教读者开发插件,而是作为一个FAQ,解决各种诡异问题

Firefox拥有众多的扩展(Extension),开发扩展也非常容易,不过有一些事情还是无法用扩展解决,需要访问操作系统的底层功能,这就需要写插件(plugins)。例如flash就是一个插件而不是扩展。

Mozilla提供了一系列的教程和文档,虽然很不详尽,众多重要的API语焉不详,但至少是一个好的开始。

最需要阅读的是plugins API和使用入门 。这是一个相当长的文档,如果看完所有的内容会花费大量的时间而且还会很晕,这里列一些重点供参考。

完成以上这些内容以后差不多就已经可以实现自己的插件了,一般而言,参照着例子来做开发不会有什么问题,只是有不少细节需要留意。

Firefox plugins开发的众多奇怪的约定(假设plugins已经被正确安装)

有些约定非常奇怪,不要问我为什么,天晓得开发firefox的牛人们怎么想的。

在Windows下,plugins必须满足以下条件才能被firefox检测到:

  • 插件的名字必须是np*.dll,也就是必须以np开头,.dll结尾
  • 插件dll资源的语言必须为LANG_ENGLISH,code page必须为1252。在rc文件里是这么写的:

    LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
    #pragma code_page(1252)
  • 插件dll的VERSION_INFO里面必须包含以下值:

    VALUE "MIMEType", "application/x-your-mimetype"

    这个MIME就是<object>标签引用插件的唯一凭证。

在Linux下,plugins必须满足以下条件才能被检测到:

  • 插件的名字必须是lib*plugin.so,即以lib开头,plugin.so结尾
  • 插件必须实现NP_GetMIMEDescription 和NP_GetPluginVersion,并返回合适MIME字符串。注意,这个字符串并不是普通的MIME,是有特殊规则的,详见前面这个链接的内容。
  • 插件so不要静态链接gtk、opensll、pthread、z等系统库,这会在不同linux平台上因为符号表的问题遇到各种运行时错误

特别需要说明的是,NP_GetPluginVersion、NP_GetEntryPoints等关键函数没有任何官方文档介绍它们,只能根据例子来猜,反正没事就别改它们的实现,copy例子中的代码就好。

firefox插件开发注意事项

写firefox插件的一个基本习惯是,经常编译代码并运行它,保证你的插件还能工作。只要firefox无法加载dll/so,或者加载出现任何错误,都会悄无声息的忽略这个插件。时常关注一下about:plugins ,看看插件是不是还在这个列表里。

firefox插件从窗口模式上可分为windowlesswindowed 两种。其中,windowless模式的文档较多较全,是firefox比较推荐的模式,坑比较少,这里就不多说了。windowed模式则相反,需要好好说说。

无论在Windows还是Linux上,windowed的插件都拥有独立于浏览器页面的窗口。firefox会通过插件的NPP_SetWindow 来告诉插件当前窗口的情况。

关于windowed插件有两个诡异问题需要注意:

  • Windows平台下,插件窗口默认会响应WM_CTLCOLOREDIT、WM_CTLCOLORLISTBOX、 WM_CTLCOLORBTN、WM_CTLCOLORSTATIC消息,并设置一个默认的背景色。这本来没问题,但在Windows XP下,这个颜色居然永远是黑色,而不是默认系统背景色(通常是白色)。最好subclass这个窗口并且拦截这些消息,不要让firefox去处理它 们。对于插件来说,firefox处理这些消息只是帮倒忙而已。至于firefox还帮了哪些倒忙,可以去源码widget/src/windows /nsWindows.cpp的nsWindow::ProcessMessage()去围观。
  • Linux平台下,NPP_SetWindow传入的NPWindow指针中虽然有一个ws_info成员,这个成员里面也确实有一个display变量指向X Window的Display结构,但绝对不要真正使用它,否则可能会导致firefox直接退出,据说 这可能是firefox的一个bug。

测试firefox插件小技巧,测试方面的高手可以无视

测试插件前建议先在firefox里面创建一个新的profile(帐号) 。这样可以创造一个最干净的开发环境,避免被其他扩展/插件干扰。

默认的profile名叫default,在命令行里输入firefox -p default 就可以使用这个profile。如果只是输入firefox -p ,会弹出一个对话框用于选择profile。这个命令在Windows和Linux下都可使用。

无论是哪个平台,调试插件的方法都很类似。

Windows下可以用VC以调试方式启动firefox,载入插件时调试器会自动载入对应的符号,捕捉发生的异常或者设断点都很方便。

Linux下直接用gdb就好,细节应该不用多说。有一点需要注意,系统默认安装的firefox命令(默认放在/usr/bin/firefox)是一个shell脚本,真正的可执行文件名字需要打开这个脚本自行查找。

实现firefox插件的基本功能

firefox为插件提供的接口十分原始,很多功能默认没有实现,下面提供了一些思路和方法。

  • 让插件接受焦点:默认情况下,<object>标签不能获得焦点,必须指定tabindex。
  • 在插件中使用tab键跳到下一个element:没有好办法,必须自己手动将焦点还给浏览器窗口(Linux下不必如此),然后自己用NPN_*系列函数找到应该获得focus的DOM element,然后调用这个element的focus()方法。
  • 隐藏和显示插件:直接设置<object>标签的style.display = “none”即可,但这里有个严重的副作用,firefox会调用插件的NS_PluginShutdown,销毁这个插件。如果不期望造成这种效果,要 么别用这种方式隐藏插件,要么把插件状态保存在js里,再次显示的时候把状态设回去。
  • 触发DOM事件:firefox没有提供任何便利的方法触发DOM事件,要在插件中做到这点,必须自己模拟js触发DOM事件的过程。例如,对于HTML事件,假设self是DOM element,js会这么做。

    evt = document.createEvent("KeyboardEvent");
    evt.initKeyEvent(
    "blur", // in DOMString typeArg,
    false, // in boolean canBubbleArg,
    false); // in boolean cancelableArg,
    self.dispatchEvent(evt);

    对应的C代码就是
  1. void  FireHTMLEvent(NPP npp,  const  string & name)  
  2. {  
  3.     NPVariant result;  
  4.     NPObject *window;  
  5.     NPVariant vDoc;  
  6.   
  7.     NPN_GetValue(npp, NPNVWindowNPObject, &window);  
  8.   
  9.     // 也许页面已经跳转了……   
  10.     if  (!window) {  
  11.         return ;  
  12.     }  
  13.   
  14.     NPIdentifier sDocument = NPN_GetStringIdentifier("document" );  
  15.     NPN_GetProperty(npp, window, sDocument, &vDoc);  
  16.     NPN_ReleaseObject(window);  
  17.   
  18.     // evt = document.createEvent("KeyboardEvent");   
  19.     NPVariant evt;  
  20.     NPObject* npDoc = NPVARIANT_TO_OBJECT(vDoc);  
  21.     NPIdentifier createEvent = NPN_GetStringIdentifier("createEvent" );  
  22.     NPVariant eventArgs[1];  
  23.     STRINGZ_TO_NPVARIANT("HTMLEvents" , eventArgs[0]);  
  24.     NPN_Invoke(npp, npDoc, createEvent, eventArgs, 1, &evt);  
  25.     NPN_ReleaseObject(npDoc);  
  26.   
  27.     // evt.initKeyEvent(   
  28.     //    "blur",      //  in DOMString typeArg,   
  29.     //    false,            //  in boolean canBubbleArg,   
  30.     //    false);            //  in boolean cancelableArg,   
  31.     NPObject * npEvt = NPVARIANT_TO_OBJECT(evt);  
  32.     NPIdentifier initKeyEvent = NPN_GetStringIdentifier("initEvent" );  
  33.     NPVariant initArgs[3];  
  34.     STRINGZ_TO_NPVARIANT(name.c_str(), initArgs[0]);  
  35.     BOOLEAN_TO_NPVARIANT(false , initArgs[1]);  
  36.     BOOLEAN_TO_NPVARIANT(false , initArgs[2]);  
  37.     NPN_Invoke(npp, npEvt, initKeyEvent, initArgs, 3, &result);  
  38.     NPN_ReleaseVariantValue(&result);  
  39.   
  40.     // this.dispatchEvent(evt);   
  41.     NPObject * self;  
  42.     NPN_GetValue(npp, NPNVPluginElementNPObject, &self);  
  43.     NPIdentifier dispatchEvent = NPN_GetStringIdentifier("dispatchEvent" );  
  44.     NPVariant dispatchArgs[1];  
  45.     dispatchArgs[0] = evt;  
  46.     NPN_Invoke(npp, self, dispatchEvent, dispatchArgs, 1, &result);  
  47.     NPN_ReleaseVariantValue(&result);  
  48.     NPN_ReleaseObject(npEvt);  
  49.   
  50.     NPN_ReleaseObject(self);  

分享到:
评论

相关推荐

    基于FireFox的Plugins的开发(带测试用源码)

    同时,由于NPAPI的安全问题,Firefox逐步限制了NPAPI插件,因此在开发过程中要遵循最新的安全指南,确保插件的安全性。 **总结** 开发Firefox Plugins是提升浏览器功能和用户体验的有效方式。通过理解NPAPI,编写...

    火狐连电子秤plugins 绝版可用

    3. npdemo.dll:这是动态链接库文件,是火狐插件的核心部分,包含了实际执行与电子秤通信的代码。在Windows系统中,DLL文件常常被用来共享函数和资源,减少内存占用。 4. readme.txt:这是主README文件,应该提供了...

    《WordPress插件开发全攻略》

    - **WebDeveloper**:Firefox插件,提供一系列开发工具,如查看页面元素、禁用脚本等。 - **XAMPP**:包含Apache、MySQL、Perl和PHP的免费软件包,可以在本地环境中运行WordPress。 #### 四、系列文章概览 1. **[1]...

    Oracle_APEX开发的指南.doc

    - **运行环境**:推荐的浏览器包括IE7+、Firefox 3.6+、Chrome 4.0+以及Safari 4.0+。数据库要求至少是Oracle Database 11g Release 1或2,10g则需要mod_plsql插件或AEPX监听器。 2. **环境搭建** - 对于11g,PL/...

    XUL开发手册.pdf

    XUL开发手册.pdf是Firefox浏览器的开发手册,提供了关于XUL的开发指南和技术信息。 从给定的文件信息可以看出,XUL开发手册.pdf主要介绍了Firefox扩展的基本结构和开发过程。下面是从文件中提取的知识点: 1. 扩展...

    redmine图片粘贴插件:clipboard_image_paste.zip

    现代浏览器如Chrome、Firefox和Edge已经内置了对剪贴板API的支持,但一些较旧或非主流的浏览器可能不支持。在使用前,建议检查并更新浏览器到最新版本。 "clipboard_image_paste"插件的源代码包含在压缩包内的"lib...

    selenium IDE 2.9.1.1

    它最初是作为Firefox浏览器的一个插件开发的,允许用户通过录制和回放功能来创建测试脚本。Selenium IDE 2.9.1.1 版本特别强调对Firefox 46及以下版本的支持,这意味着如果你的Firefox浏览器版本在这个范围内,你...

    Liferay Portlet 开发文档

    对于支持工具,文档提到了几个重要的工具,包括MySQL Query Browser用于数据库查询,Mozilla Firefox和Firebug用于前端开发和调试,以及一个解压缩工具WinRAR/WinZip。 在开发Portlet的实际过程中,文档给出了如何...

    LINUX FLASH插件

    3. 对于Firefox,需要将`libflashplayer.so`复制或软链到`~/.mozilla/plugins/`目录下: ``` cp ./flashplayer/libflashplayer.so ~/.mozilla/plugins/ 或 ln -s ./flashplayer/libflashplayer.so ~/.mozilla/...

    ubantu flash 插件

    例如,对于Firefox,通常是`~/.mozilla/plugins/`路径。使用命令`cp libflashplayer.so ~/.mozilla/plugins/`可完成此步骤。 `readme.txt`文件包含了安装和使用Flash Player的详细说明,可能包括一些注意事项、更新...

    ubuntu之安装java浏览器插件.docx

    sudo ln -s /home/jason/java/jre1.8.0_91/lib/amd64/libnpjp2.so /usr/lib/firefox-addons/plugins/ ``` 如果你的系统是32位的,那么将`amd64`替换为`i386`。 5. **验证安装**: 重启Firefox浏览器后,访问`...

    browser-plugins:这是浏览器插件的存储库,这些插件使用Data Cookbook API在用户浏览器中公开内容

    例如,Chrome浏览器使用其特有的`chrome.*` API,而Firefox则有WebExtensions API,尽管两者之间有许多相似之处,但仍有差异需要调整。 总的来说,"browser-plugins"存储库中的插件项目利用JavaScript和Data ...

    artDialog对话框插件 4.0版

    1. **跨浏览器兼容性**:artDialog 4.0支持主流浏览器,包括IE6+、Firefox、Chrome、Safari和Opera,确保了在各种环境下良好的用户体验。 2. **Iframe支持**:在4.0版本中,artDialog对Iframe的集成尤为出色,可以...

    Eclipse+Flex_Builder_3_插件配置版.docx

    - **步骤8**: 选择是否安装IE和Firefox浏览器上的Flash Player 9。建议选择安装以方便调试。 - **步骤9**: 点击“Install”按钮开始安装。 - **步骤10**: 将Flex Builder插件安装目录下的`eclipse`文件夹内的`...

    linux版flash插件

    对于Firefox,这个目录可能是`~/.mozilla/plugins/`。你需要创建该目录(如果不存在),然后复制`libflashplayer.so`到其中: ```bash mkdir -p ~/.mozilla/plugins/ cp libflashplayer.so ~/.mozilla/plugins/ ...

    flash_player_11_linux_x86_64.tar.gz

    2. 将libflashplayer.so复制到Firefox插件目录,通常为`~/.mozilla/plugins`或系统级别的`/usr/lib64/mozilla/plugins`。 3. 可能需要设置文件权限,例如使用`chmod +x libflashplayer.so`使其可执行。 4. 重启Fire...

    liferay-portlet-development

    - Firefox浏览器与Firebug插件:用于调试页面布局和脚本。 - MySQL Query Browser:方便进行数据库查询操作。 - 解压缩工具,如WinRAR或WinZip,用于处理项目文件。 ### 七、图书馆管理系统案例分析 本书将通过...

    jQuery菜单插件superfish使用指南

    下载地址:http://plugins.jquery.com/project/Superfish 文档说明:...支持阴影效果,但需要有好的浏览器支持,如Firefox,chrome…最烂浏览器IE6就免了 可选回调js函数 使用说明 1、1.

    Kali Linux安装Flash

    但为了使Firefox或其他基于Gecko内核的浏览器能够识别并使用这个插件,可能需要进行一些额外的设置。例如,在Firefox中,打开`about:config`页面,查找`plugin.state.flash`,并将其值改为2,表示启用该插件。 然而...

Global site tag (gtag.js) - Google Analytics