【转】 firefox插件开发和调试

Firefox插件开发-入门篇 本文简要的介绍了Firefox插件的开发的步骤,结合具体的实例进行了分步介绍,希望能给初学者带来帮助。 阅读详情

原文:http://huandu.me/2010/02/11/595/


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

  • 让插件接受焦点:默认情况下,<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);  
  51. }  

暂时先写到这里,如果还有什么疑难杂症,欢迎评论,我继续添加。




如何对于plugin进行调试。

如firefox安装路径如下: C:\Program Files\Mozilla Firefox

1)在配置属性/调试/命令, 设置为你的firefo.exe路径:
C:\Program Files\Mozilla Firefox\firefox.exe

2)在配置属性/常规/输出目录, 设置为:
C:\Program Files\Mozilla Firefox\plugins


3) 在配置属性/生成事件/生成后事件/命令行, 设置为
copy "$(OutDir)\$(ProjectName).dll" "C:\Program Files\Mozilla Firefox\plugins\$(ProjectName).dll"


< 2和3任选其一 >

运行, 打开测试的htm, 就可以调试 


楼上的方法现在应该行不通了。
我的环境是firefox 5, VS2008,断点进不去,但是可以肯定调用的是我自己的插件。
目前我发现的调试插件dll的解决方法如下:
按照上述设置(也可以做成xpi安装后,安装目录在appdata下一个文件夹内,将插件放到那里,只要firefox能找到插件正常调用就好了)后,正常F5进入调试状态,再attach到进程:plugin_container上,断点就可以进入调试了。


Firefox与FireBug:Web开发与调试的终极组合 性能优化是任何浏览器更新的关键词。对于Firefox 50.0.2版本而言,性能的提升体现在多个层面,其中包括启动速度和内存占用的优化。Timeline工具是FireBug中用于记录和分析页面加载、脚本执行、渲染过程的工具,它提供了一个时间轴视图,通过该视图用户可以看到不同事件在时间上的分布,帮助开发者理解页面的性能瓶颈。使用Timeline工具首先需要通过FireBug扩展访问它的界面,打开FireBug后,点击顶部的“Timeline”标签进入该工具。 阅读详情

相关推荐

firefox插件开发教程

firefox插件开发教程firefox插件开发教程

Firefox插件(拓展)开发

JavaScript编写插件时,通常分为以下几个脚本:1.:用于操作网页内容,可以访问DOM和页面元素,可以修改页面样式和行为,与页面共享同一个JavaScript环境。2.:用于处理插件的后台任务,例如处理网络请求、管理插件状态、与其他插件通信等,与页面不共享JavaScript环境。3.:用于处理插件弹出窗口的交互逻辑,例如响应用户点击事件、发送消息给后台脚本等。4.:用于处理插件选项页面的交互逻辑,例如保存用户设置、发送消息给后台脚本等。

@zhujj_的博客 9754

我的Firefox插件开发之旅——从零开始

NULL 博文链接:https://xiangxingchina.iteye.com/blog/938131

FireFox插件开发说明与示例

火狐浏览器插件开发过程详细说明

willy16的专栏 4756

避坑指南:CST粒子工作室Track Solver常见的5个参数设置错误

本文深入剖析了CST粒子工作室中Track Solver在电子枪仿真时常见的5个关键参数设置错误,包括空间电荷模型选择、发射源定义、材料边界处理、监视器配置及求解器稳定性设置。通过对比错误与正确做法,帮助用户避开陷阱,确保粒子追踪仿真的物理准确性与数值稳定性,从而获得更精准的电子枪仿真结果。

dapp9builder的博客 485

Linux磁盘扩容实战:用parted命令无损扩展/data分区(附常见报错解决方案)

本文详细介绍了在Linux生产环境中使用parted命令对已挂载的/data分区进行在线磁盘扩容的完整实战流程。通过风险评估、状态检查、parted工具深度解析及实战演练,指导用户安全完成动态扩容,并提供了常见报错如'Partition is being used'、MBR 2TB限制等的解决方案,确保业务不中断、数据不丢失。

weixin_29207439的博客 296

火狐浏览器插件开发小试

火狐浏览器插件开发小试

the_27th的博客 927

关于深度可分离卷积

关于深度学习中的深度可分离卷积

qq_45670407的博客 1796

firefox插件(plugin)开发概述

firefox的插件分两种类型,一种extension,叫扩展,一种是plugin,我们叫插件.两种是完全不同的两个东西。extension相对来说简单很多,用的主要是XUL,只是xml的一个变相。而plugin相对来说复杂一些。具体的官网说明如下https://developer.mozilla.org/en/Gecko_Plugin_API_Reference 一、 插件的标准   1、在

2万+

【MATLAB代码】雷达观测目标跟踪模型|H-infinity Filter(H无穷大滤波)与EKF(扩展卡尔曼滤波)的对比。附完整代码,订阅专栏后可直接查看

对比了经典扩展卡尔曼滤波(EKF)与H∞优化的EKF(H∞-EKF)在目标跟踪中的性能。通过MATLAB仿真实验,结果显示:在存在模型误差和测量噪声的情况下,H∞-EKF相比经典EKF在位置误差上降低

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 243

SAP_SD模块信用管理-最早未清项判断逾期

在 SAP SD 模块的信用管理(Credit Management) 中,系统可以通过 最早未清项(Oldest Open Item) 来判断客户是否存在逾期,从而影响订单的信用检查结果。例如: 定义最大未清项目%为1%,未清天数为1天,即允许客户“逾期1天的未清应收帐款/该客户的应收帐款余额”最大比例为1%,若超过1%则将被信用冻结。的信用检查功能,用于判断客户是否有账龄过长的未清款项,并据此决定是否允许新的销售订单继续处理。然后在查看客户的信贷信息可以看到,最早的未清信息显示在系统中。

我小时候很黑的博客 860

猫抓插件:一站式浏览器资源嗅探与下载终极解决方案

还在为网页视频无法下载而烦恼?猫抓插件为你提供专业级的浏览器资源嗅探能力,让任何在线媒体资源都触手可及。这款开源免费的浏览器扩展专为技术爱好者和普通用户设计,通过智能嗅探技术,轻松捕获网页中的视频、音频、图片等各类资源,彻底解决资源下载难题。 ## 为什么选择猫抓插件?传统下载方式的三大痛点 **传统下载方式的局限性:** 1. **技术门槛高**:需要掌握开发者工具和网络请求分析技能 2.

gitblog_00649的博客 429

【电机驱动与运动控制】期末重点问题集合

问题1 梯形曲线和S形曲线各自的特点和区别,比较梯形和S形曲线位置、速度、加速度、加加速度的区别。 问题2 总惯量的计算包含哪几个部分? 哪几个部分需要进行折算? 在齿轮箱的输出侧(2号轴)总惯量需要折算到齿轮箱的输入侧(1号轴) 为什么需要折算? 齿轮箱比的存在使2号轴的转速和电机的转速不同 问题3 指出每个部分的名称。 每个部分的功能。 主磁极的励磁绕组:绝大部分直流电机都是由励磁绕组通以直流电建立主磁场; - 电枢铁心:在两个主磁极内表面之间,由硅钢片叠成的圆

【人工智障 | 计算鸡视觉 | 机器孩】 5703

猫抓完整指南:5 分钟装好浏览器视频下载插件,从捕获到 M3U8 合并 MP4

猫抓(cat-catch)是一款开源免费的浏览器资源嗅探扩展。你浏览网页时,它负责监听页面发出的媒体请求,把视频、音频和 M3U8/HLS、MPD/DASH 这类流媒体资源列成清单,让你能挑出来存成文件。本文带你从安装一路走到把 M3U8 合并成 MP4,顺带讲清过滤规则和常见故障怎么排查。 ## 五分钟装好猫抓插件 ### 两种加载方式对比 | 方式 | 操作步骤 | 适合谁 | |---

gitblog_01132的博客 321

[QMT和ptrade量化交易小白入门]-122、基于聚类分析的动态股票池构建与ETF轮动策略,回测年化 132.09%

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1024

Android11车机系统海外项目资源包RRO方案优化

本文介绍了汽车设置应用如何通过Android RRO(运行时资源叠加)方案实现多车型差异化资源管理。针对不同车型(国内/海外、轿车/SUV)和配置(方向盘、轮毂等),采用产品变体(productFlavors)构建不同APK版本,并通过JSON配置文件动态启用对应资源包。系统根据车辆下线配置自动匹配适用的资源叠加包,解决了硬编码判断带来的维护问题。该方案实现了资源的高效复用,同时支持灵活配置多种车型组合,为汽车行业多车型共平台开发提供了可扩展的技术实现。

shusuanly的博客 469

探索VSCode Firefox调试插件:提升跨浏览器开发效率的新选择

探索VSCode Firefox调试插件:提升跨浏览器开发效率的新选择 vscode-firefox-debugVS Code Debug Adapter for Firefox项目地址:https://gitcode.com/gh_mirrors/vs/vscode-firefox-debug 在Web开发的世界中,跨浏览器兼容性测试是必不可少的一环。为了帮助开发者更高效地进行Firefox浏...

gitblog_00043的博客 1205

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

HTTP抓包与调试(Firefox插件)

Firefox插件

rainy_allen的专栏 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

firefox插件开发和调试

 firefox插件firefoxpluginsmozillawindowslinux 目录(?)[+] Firefox插件plugins开发实用指南 如何对于plugin进行调试 原文:http://huandu.me/2010/02/11/595/ Firefox插件(plugins)开发实用指南 Firefox插件可实现强大功

zhulianhai0927的专栏 876

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

火狐(firefox)浏览器插件开发简明教程

手头有一个抓取页面数据的小项目,之前一直使用 Bookmarklet 书签脚本的方式来实现的。最近发现不能用了,因为涉及到要在抓取页面插入远程 JS 脚本,触发了最新浏览器的内容保护策略(Content Security Policy)。无奈之下,只能寻找其他的替代方法,尝试了一下,发现只能用浏览器扩展的方式来实现了。 一个极简的插件 一个最简单的火狐插件只需要两个文件: 插件说明文件和脚本文件。 说明文件是插件的入口,内容为 JSON 格式,对插件进行了一些说明和配置。命名必须为 manifest.jso

码农鲜橙 5681

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

了解Firefox插件的开发知识的时候,找到了这篇文章。的确让我少走了弯路,比如,我的NP插件的DLL,之前不是NP开头的,在此非常感谢原作者,您文章让我节约了不少时间。转载传播此文章,希望对准备研究和学习Firefox插件开发的朋友有所帮助。Firefox插件可实现强大功能,但其中麻烦事情不少。写这个实用指南首先是为了方便自己记忆,免得以后再次栽倒一些坑里面,如果能帮助其他人,则是更好。这个指南...

weixin_42447681的博客 994

Firefox和Chrome谁的插件生态系统更完善

在选择时,用户可以根据自己的需求和偏好来决定,比如注重隐私和定制化的用户可能会倾向于Firefox,而追求广泛兼容和便捷同步的用户则可能更喜欢Chrome。Firefox还支持拖放式安装(即将下载的.crx或.xpi文件直接拖放到地址栏),并允许用户自由调整插件的顺序、启用或禁用特定站点的插件,以及查看插件的版本信息和权限要求,这些细节设计提升了用户体验。Chrome的Web Store拥有海量插件,数量上远超Firefox,这得益于Google庞大的用户基础和早期对插件生态的重视。

2403_86768603的博客 2000

FlashTracer开发flash必备的firefox插件

<br />FlashTracer 是一个firefox插件,它可以直接在firefox中输出页面上flash中trace的内容。<br />对于那些需要上传到网上,或者需要跟页面进行交互的项目,我们曾经为了调试flash程序而在代码中临时添加一个textField来输出trace内容,有时候为了一个简单的功能,而不得不在eclipse中部署一个复杂的开发调试环境。<br /> 现在有了这个小插件,如果我们的目的只是需要查看trace内容,它将使我们的调试工作变得很方便,很快捷。<br />如何安装:<

知否 1702

Firefox成为渗透测试工具的18个插件

Firefox是一个出自Mozilla组织的流行的web浏览器。Firefox的流行并不仅仅是因为它是一个好的浏览器,而是因为它能够支持插件进而加强它自身的功能。Mozilla有一个插件站点,在那里面有成千上万的,非常有用的,不同种类的插件。一些插件对于渗透测试人员和安全分析人员来说是相当有用的。这些渗透测试插件帮助我们执行不同类型的攻击,并能直接从浏览器中更改请求头部。对于渗透测试中涉及到的相关工作,使用插件方式可以减少我们对独立工具的使用。在这篇简明的文章中,我们列举了一些流行的和有趣的Firefox插

baigoocn的专栏 5016

Firefox扩展插件开发extension代码调试方法

Firefox扩展必须打包给火狐的插件中心,才能获得签名,才能安装,否则只能作为本地临时扩展。两者的调试方法是: 本地临时扩展 点击“远程调试”“about:debugging”窗口中对应扩展右上角的“检查”。 已安装扩展 可以直接用开发者工具devtools中的调试器中查看和调试js代码。但是默认是不调试扩展代码的,需要在开发者工具的设置界面中勾选“启用浏览器界面及附加组件的调试工具箱”。设置界面在开发者工具右上角省略号中的“设置”。 按F12,打开devtools。点击设置。

顺其自然~专栏 2462
上一篇: 转:架构设计:生产者/消费者模式[3]:环形缓冲区
下一篇: uafxcwd.lib(dllmodul.obj) : error LNK2005: DllMain 已经在 中定义
code09
博客等级 码龄18年 31粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值