了解Firefox插件的开发知识的时候,找到了这篇文章。的确让我少走了弯路,比如,我的NP插件的DLL,之前不是NP开头的,在此非常感谢原作者,您文章让我节约了不少时间。转载传播此文章,希望对准备研究和学习Firefox插件开发的朋友有所帮助。

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

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

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

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

写第一个插件(只需要关注Writing Plug-ins这一节所谈到的内容)

获得一份firefox的源码,比如firefox 3.6。plugins的例子可以在源码里找到(modules/plugin/sdk/samples),如果出了问题还可以自己编译一个debug版的firefox来调试。

制作插件的安装程序,推荐用扩展的方式安装插件,有无数的好处

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

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就是标签引用插件的唯一凭证。

在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插件从窗口模式上可分为windowless和windowed两种。其中,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为插件提供的接口十分原始,很多功能默认没有实现,下面提供了一些思路和方法。

让插件接受焦点:默认情况下,标签不能获得焦点,必须指定tabindex。

在插件中使用tab键跳到下一个element:没有好办法,必须自己手动将焦点还给浏览器窗口(Linux下不必如此),然后自己用NPN_*系列函数找到应该获得focus的DOM element,然后调用这个element的focus()方法。

隐藏和显示插件:直接设置标签的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代码就是

void FireHTMLEvent(NPP npp, const string & name)

{

NPVariant result;

NPObject *window;

NPVariant vDoc;NPN_GetValue(npp, NPNVWindowNPObject, &window);

// 也许页面已经跳转了……

if (!window) {

return;

}

NPIdentifier sDocument = NPN_GetStringIdentifier(“document”);

NPN_GetProperty(npp, window, sDocument, &vDoc);

NPN_ReleaseObject(window);

// evt = document.createEvent(“KeyboardEvent”);

NPVariant evt;

NPObject* npDoc = NPVARIANT_TO_OBJECT(vDoc);

NPIdentifier createEvent = NPN_GetStringIdentifier(“createEvent”);

NPVariant eventArgs[1];

STRINGZ_TO_NPVARIANT(“HTMLEvents”, eventArgs[0]);

NPN_Invoke(npp, npDoc, createEvent, eventArgs, 1, &evt);

NPN_ReleaseObject(npDoc);

// evt.initKeyEvent(

//    “blur”,      //  in DOMString typeArg,

//    false,            //  in boolean canBubbleArg,

//    false);            //  in boolean cancelableArg,

NPObject * npEvt = NPVARIANT_TO_OBJECT(evt);

NPIdentifier initKeyEvent = NPN_GetStringIdentifier(“initEvent”);

NPVariant initArgs[3];

STRINGZ_TO_NPVARIANT(name.c_str(), initArgs[0]);

BOOLEAN_TO_NPVARIANT(false, initArgs[1]);

BOOLEAN_TO_NPVARIANT(false, initArgs[2]);

NPN_Invoke(npp, npEvt, initKeyEvent, initArgs, 3, &result);

NPN_ReleaseVariantValue(&result);

// this.dispatchEvent(evt);

NPObject * self;

NPN_GetValue(npp, NPNVPluginElementNPObject, &self);

NPIdentifier dispatchEvent = NPN_GetStringIdentifier(“dispatchEvent”);

NPVariant dispatchArgs[1];

dispatchArgs[0] = evt;

NPN_Invoke(npp, self, dispatchEvent, dispatchArgs, 1, &result);

NPN_ReleaseVariantValue(&result);

NPN_ReleaseObject(npEvt);

NPN_ReleaseObject(self);

}

linux firefox 插件开发教程,Firefox插件(plugins)开发实用指南相关推荐

  1. 转贴(电脑报):VBA开发实用指南

    VBA开发实用指南?? ? 唐大中 附录文章 VBA(Visual Basic for Application)是Office自带的二次开发工具,可为日常办公带来极大的便利.本文讲述Office各个成 ...

  2. linux firefox插件开发教程,Linux下firefox插件开发

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 机器环境:Linux 2.6.12-1.1456.cocreate.3 Firefox版本:firefox-1.5.0.3 ...

  3. React-Native 开发实用指南

    [CSDN 编者按]本文主要介绍 React-Native 的实际使用经验,对于想要快速入门的同学是有帮助的. 作者 | 佐玉 出品 | CSDN(ID:CSDNnews) 整体介绍 首先说, Rea ...

  4. 【chrome】插件开发-教程00(如何开发插件)

    一 chrome浏览器插件的基础知识 1.认识chrome插件文件: chrome插件的扩展名是:.crx,可以在chrome官方的应用商店下载(https://chrome.google.com/w ...

  5. 谷歌(Chrome)浏览器插件开发教程

    谷歌浏览器插件是一种小型的用于定制浏览器体验的程序.通过插件,可以自定义浏览器的一些行为来适应个人的需要,只要你会HTML,JavaScript,CSS就可以动手开发浏览器插件了. 开发谷歌浏览器插件 ...

  6. linux 火狐安装java插件_Linux下Firefox安装配置JDK插件

    在Linux下安装了firefox浏览器,版本是2.0.0.20.登录Oracle EBS后打开form,提示要装JDK1.4.2_04,手工安装完之后,PATH也已经设置好了.为什么firefox还 ...

  7. linux火狐浏览器49.0安装教程,firefox for linux

    火狐浏览器是一款免费开源的跨平台浏览器,firefox for linux引入了扩展同步机制用户能够在家用电脑和办公电脑之间进行无缝同步,能给用户更为流畅和高速的上网浏览体验,同时也让开发者能够开发出 ...

  8. WordPress插件开发教程1:开发第一个WordPress插件

    一.创建一个插件 第一步:在 wp-content \ plugins 目录新建一个目录,随便起个名字,比如:my-first-plugin.         第二步:进入 my-first-plug ...

  9. linux firefox安装flash player插件

    linux firefox安装flash player插件 1.去flash player官网下载对应的插件,可以下载yum / rpm/ tar 格式安装的,我选择的是tar格式的. 2. 使用ro ...

  10. Firefox必备的24款web开发插件[转]

    开发工具 Web Developer 1.1.8 https://addons.mozilla.org/en-US/firefox/addon/60 以工具栏的形式对网页的(X)HTML.脚本.多媒体 ...

最新文章

  1. 【原】开源——基于文件驱动的站点开发
  2. 【微信小程序企业级开发教程】页面的生命周期和参数传递
  3. 将下图的nfa确定化为dfa_作业8 非确定的自动机NFA确定化为DFA
  4. 如何做好游戏内实时语音体验
  5. java开发人员_每个Java开发人员都应该阅读的10本书
  6. Linux网站访问的电脑占CPU,详解Linux如何查看当前占用CPU或内存最多的几个进程...
  7. 基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文)
  8. mysqldump备份数据不锁表的加参数方法及原理分析
  9. 江苏省计算机学业水平测试时间,江苏2018年高中学业水平考试时间公布
  10. 小户型吊顶的注意事项有哪些
  11. gitlab一键安装 笔记
  12. System.Net.Http.Formatting的nuget版本冲突问题
  13. 计算机仿真软件multisim,电路仿真软件哪个好?2019电路仿真软件推荐
  14. 3dMax 倒角剖面(中式亭子)
  15. 鸡啄米:C++编程入门系列之三(VS2010的使用介绍)
  16. 开放耳机有什么优缺点,列举出几款口碑不错的开放式耳机
  17. Zabbix-Sender 增加自定义监控项-- Ping 到目的地链路监控--bat脚本循环运行
  18. 从入门到断送职业生涯只差这几步
  19. 简笔画花边边框超简单_简单花边边框简笔画高清图片
  20. 怎样可以快速高效查询芯片的信息?分享几个查芯片的方法

热门文章

  1. java时间显示时区_Java 时间、日期与时区的关系
  2. 家庭局域网_组建家庭无线局域网需要哪些硬件设备?
  3. Git正解 脱水版 【10. 内部机制】
  4. 【备忘】大数据最火爆技术spark之王家林2016最新高清视频教程
  5. Mybatis Generator最完整配置详解 叩丁狼教育
  6. Xmarks书签同步工具的用法
  7. android 远程管理,教你如何在Android上远程控制电脑
  8. 计算机桌面图标字变蓝色,桌面的图标都变蓝了怎么解决【解决方法】
  9. js中的symbol详解
  10. linux中help命令鸟叔,linux的帮助命令help、man、--help