firefox插件firefoxpluginsmozillawindowslinux

目录(?)[+]

  1. Firefox插件plugins开发实用指南

    1. 如何对于plugin进行调试

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

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

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

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

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

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

  • plugins基础概念
  • 写第一个插件(只需要关注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就是<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代码就是
view plaincopy to clipboardprint?
  1. void FireHTMLEvent(NPP npp, const string & name)
  2. {
  3. NPVariant result;
  4. NPObject *window;
  5. NPVariant vDoc;
  6. NPN_GetValue(npp, NPNVWindowNPObject, &window);
  7. // 也许页面已经跳转了……
  8. if (!window) {
  9. return;
  10. }
  11. NPIdentifier sDocument = NPN_GetStringIdentifier("document");
  12. NPN_GetProperty(npp, window, sDocument, &vDoc);
  13. NPN_ReleaseObject(window);
  14. // evt = document.createEvent("KeyboardEvent");
  15. NPVariant evt;
  16. NPObject* npDoc = NPVARIANT_TO_OBJECT(vDoc);
  17. NPIdentifier createEvent = NPN_GetStringIdentifier("createEvent");
  18. NPVariant eventArgs[1];
  19. STRINGZ_TO_NPVARIANT("HTMLEvents", eventArgs[0]);
  20. NPN_Invoke(npp, npDoc, createEvent, eventArgs, 1, &evt);
  21. NPN_ReleaseObject(npDoc);
  22. // evt.initKeyEvent(
  23. //    "blur",      //  in DOMString typeArg,
  24. //    false,            //  in boolean canBubbleArg,
  25. //    false);            //  in boolean cancelableArg,
  26. NPObject * npEvt = NPVARIANT_TO_OBJECT(evt);
  27. NPIdentifier initKeyEvent = NPN_GetStringIdentifier("initEvent");
  28. NPVariant initArgs[3];
  29. STRINGZ_TO_NPVARIANT(name.c_str(), initArgs[0]);
  30. BOOLEAN_TO_NPVARIANT(false, initArgs[1]);
  31. BOOLEAN_TO_NPVARIANT(false, initArgs[2]);
  32. NPN_Invoke(npp, npEvt, initKeyEvent, initArgs, 3, &result);
  33. NPN_ReleaseVariantValue(&result);
  34. // this.dispatchEvent(evt);
  35. NPObject * self;
  36. NPN_GetValue(npp, NPNVPluginElementNPObject, &self);
  37. NPIdentifier dispatchEvent = NPN_GetStringIdentifier("dispatchEvent");
  38. NPVariant dispatchArgs[1];
  39. dispatchArgs[0] = evt;
  40. NPN_Invoke(npp, self, dispatchEvent, dispatchArgs, 1, &result);
  41. NPN_ReleaseVariantValue(&result);
  42. NPN_ReleaseObject(npEvt);
  43. NPN_ReleaseObject(self);
  44. }

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


如何对于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插件开发和调试相关推荐

  1. Firefox插件开发-入门篇

    今天尝试开发一个Firefox的扩展,把自己开发过程记录下来,以备不时之需,同时也为初学者提供一个参考.我是根据Mozilla官方教程开发的,有兴趣的朋友可以自己去看看:https://develop ...

  2. NodeJS C++插件开发(三) - 调试概述

    NodeJS C++插件开发(三) - 调试概述 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录 NodeJS C++插件开 ...

  3. Firefox(火狐浏览器) 调试js设置

    Firefox(火狐浏览器)  调试js设置 步骤1: 安装插件 在Firefox(火狐浏览器)  的菜单栏目中点"工具"->"附加组件"->找到& ...

  4. kettle转换和作业插件开发及调试

    这是一篇几年前写下的文档,最近打算根据这篇文档重写一下kettle插件的教程.结果各种理由,一推再推.今天索性将这篇文档发布出来,分享给大家,例子等有空再补上.这是一篇基于kettle3.2基础上完成 ...

  5. firefox调试html5程序,用 Firefox 开发者工具调试现代 Web 应用程序

    原文作者:Jason Laster,Harald Kirschner 译者:_小生_ (译者注:Jason Laster 是 Firefox 的开发者,文章发表于https://hacks.mozil ...

  6. FireFox火狐浏览器调试响应式页面

    对于不同分辨率页面可能出现不同的样式,可以用CSS3的媒体查询来针对不同浏览器设置不同样式来解决问题,那么如何在浏览器中进行不同分辨率的调试,现在整理下在火狐浏览器调试的方法. 1.打开FireFox ...

  7. sonarqube插件开发(三) 调试插件

    环境 windows + eclipse +sonarqube server 5.6.4 准备 新建一个maven项目,其中加入了一些插件所用的jar <project xmlns=" ...

  8. 三、K3 Cloud 开发插件《K3 Cloud插件开发新手指导 + K3 Cloud插件开发代码调试》

    案例需求:在销售订单上新增一个按钮,在订单明细中新增一个字段,命名[即时库存]. 点击按钮,弹出"Hello World!",并获取订单明细物料的即时库存,填入字段[即时库存]. ...

  9. 使用VSLinux插件开发和调试

    一.写在前面 从事Windows平台C++开发的时候顺其自然的一直使用visual studio进行开发和调试,对VS的强大并没有太大的感觉.从事Linux平台的开发工作后,折腾Vim配置,安装YCM ...

  10. 关于selenium调用firefox浏览器的调试

    本来在使用selenium调用谷歌浏览器的时候,因为一个网站的原因,一直会自动弹出网页的通知,如下: 由于本人是菜鸟级别的,又不会处理,所以想尝试用firefox来打开网站(因为用firefox打开没 ...

最新文章

  1. GNN教程:GraghSAGE算法细节详解!
  2. 在虚拟主机中无法实现缩放等交互
  3. 利用qq账号查询所绑定的手机号码_如何更改社保绑定手机号?
  4. java输出image_java如何生成imagecode
  5. 「SVN」svn:将服务器关闭后报错Unable to connect to a repository at URL xxx
  6. Java JDBC篇3——JDBC事务
  7. 手机定位App从想法到上线运营(1)--介绍
  8. 计算机参评高校168所,168所大学排行榜单!计算机科学与技术专业哪些高校专业实力最强!...
  9. python——Web服务开发(二)分布式缓存
  10. Inondb中的checkpoint
  11. Java入门 - 循环结构基础
  12. 小型局域网环境下搭建的文件中转系统
  13. gridviewnbsp;enableviewstate
  14. windows下面NTP服务器配置,局域网
  15. Cortex-M3 (NXP LPC1788)之启动代码分析
  16. 2022年版中国电子信息产业趋势预测及投资战略规划分析报告
  17. 配置Oracle VM Manager服务器虚拟化软件
  18. 全新版大学英语综合教程第一册学习笔记(原文及全文翻译)——7 - Kids On The Track(生死时刻)
  19. 串口通信 数据采集软件 上位机 数据采集软件,可以采集plc,串口通信设备,tcp通信设备的数据
  20. AT89S52的看门狗定时器

热门文章

  1. hive —— 分区表
  2. translate函数的用法
  3. 关于“男孩出剪刀,女孩出布”,你怎么看,你又会怎么选择?
  4. android 跳转oppo应用中心_Android唤起应用商店并跳转到应用详情页
  5. CeoMax总裁WordPress模板3.8.1免受权版本
  6. oracle revoke 列_oracle受权与回收权限grant和revoke
  7. html文字溢出用省列号,关于文字内容溢出用点点点(...)省略号表示
  8. 计算机前沿应用,计算机前沿技术总结范文
  9. Redis 安装说明
  10. 24考研数学复习方法、全年规划