Firefox插件开发初体验

2024-04-27 10:08

本文主要是介绍Firefox插件开发初体验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Firefox插件开发

写在开头

因为某些原因,想删除所有Qzone的心情,从同事那边得出并没有提供该批量删除的功能接口,于是想到使用firefox写一个插件,于是就有了一个称之为forgot1.0的小东西,把从零开始学习firefox插件开发(其实也不算,JS和css我还是会的,虽然因为做后台开发已经很久没有碰过了)的过程记录下来,也重拾写blog的习惯。

1       插件结构

Firefox的插件,其实就是一个以xpi为后缀名的zip压缩文件,当我们利用winrar解压xpi文件后,目录结构如下:

 

/install.rdf
/components/*
/components/cmdline.js
/defaults/
/defaults/preferences/*.js
/plugins/*
/chrome.manifest
/chrome/icons/default/*
/chrome/
/chrome/content/

 

1.1         install.rdf

从名字可以看出,这个文件描述了扩展安装所需要的信息,包括了扩展的标识、版本、适用的应用程序、作者等等。

基本的install.rdf示例:

<?xmlversion="1.0"?>

<RDFxmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

   xmlns:em="http://www.mozilla.org/2004/em-rdf#">

 

<!-- 标识和版本 -->

<Descriptionabout="urn:mozilla:install-manifest">

    <em:id>coreymylife@163.com</em:id>

    <em:version>1.0</em:version>

    <em:type>2</em:type>

 

    <!-- 针对的应用程序 -->

    <em:targetApplication>

    <Description>

       <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>

        <em:minVersion>1.5</em:minVersion>

        <em:maxVersion>*</em:maxVersion>

    </Description>

    </em:targetApplication>

 

    <!-- 名称、介绍、作者和网站地址 -->

    <em:name>forgot</em:name>

    <em:description>空间签名删除器</em:description>

    <em:creator>corey</em:creator>

    <em:homepageURL>http://blog.csdn.net/turkeyzhou</em:homepageURL>

</Description>

</RDF>

 

em:id段是此软件包唯一的标识,可以是作者的email,目的是唯一标识此软件包。

em:type值为2代表"我是扩展",4代表"我是主题",这里是扩展,所以值为2

em:targetApplication段描述了软件包针对的应用程序,其中em:id表明此扩展是针对firefox的,而不是thunderbird、sunbird,所以,只要是针对firefox的扩展,此id的值都不变。

minVersion,maxVersion分别表示插件支持的最小和最大的firefox版本,如果无上限,则一般将maxVersion设置为*。

最后的em:name,em:description,em:creator,em:homepageURL描述了扩展的基本信息,从标签的名称上就可以看出意思,扩展管理器中显示的扩展信息,就是来源于这里。

 

1.2         chrome

chrome一般包括3类文件,content、locale、skin:

content:描述扩展界面、外观的定义文件,比如按钮布局,对话框,通过XUL文件和js文件来设定,后面我们可以看到XUL的介绍。
locale: 描述多语言信息的文件,一般是xml的dtd文件。
skin: 定义界面样式的css文件和所需要的图片文件。

 

1.3         chrome.manifest文件

首先,我们必须明白chrome://是什么,chrome://其实相当于http一样,是firefox定位扩展文件的一种链接方式。

如果我们在firefox地址栏中输入chrome://browser/content/browser.xul,你则会发现窗口中有嵌套了一个窗口,而这个窗口本身可以认为是一个xul,所以,chrome://可以认为是一种定位资源文件的方式(如同http:// file://等scheme等)。

在文件开头,你首先得定义一个chrome资源,如:

              content         forgot        chrome/content/

分别为:

              context          domain               path

则chrome完整的引用路径为:

              chrome://domain/context/filename

 

另外我们必须了解一下overlay,从字面上来说,overlay是覆盖的意思,下面这一行:

         overlay chrome://browser/content/browser.xul chrome://forgot/content/forgot.xul

表示浏览器在加载的时候,将自动加载forgot.xul。

 

2       XUL

在Firefox中,所有的界面都是基于XUL文件描述的,XUL本身是一个XML文件。就连Firefox本身,也是基于XUL的。

如:

    <?xml version="1.0"?>

<?xml-stylesheethref="chrome://global/skin/" type="text/css"?>

<window>

    id="test-window"

    title="窗口"

   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

</window>

我们可以在firefox中直接打开这个文件,并能看到该文件所代表的窗口。XUL中的空间和HTML的控件几乎是一一对应的,可以参考更多的XUL的资料了解,如下是一个iframe的空间的使用。

    <?xml version="1.0"?>

<?xml-stylesheethref="chrome://global/skin/" type="text/css"?>

<window>

    id="test-window"

    title="窗口"

   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

        <iframe id="content"src="http://blog.csdn.net/tyurkeyzhou" flex="1"/>

</window>

 

可以通过XUL在浏览器的status bar中添加一个按钮:

       <?xmlversion="1.0"?>

<overlayid="forgot"xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

            <script type="application/x-javascript"src="chrome://forgot/content/jquery-1.7.2.min.js"/>

            <scripttype="application/x-javascript"src="chrome://forgot/content/forgot.js"/>

            <statusbarid="status-bar">

                        <statusbarpanelid="forgot" label="forgot" οnclick="Man.forgot()"   />

            </statusbar>

</overlay>

 

也可以通过XML在浏览器的菜单栏中新增一个菜单项:

<?xmlversion="1.0"?>
<!DOCTYPE overlay SYSTEM"chrome://meetmeplus/locale/overlay.dtd">
<?xml-stylesheet href="chrome://meetmeplus/skin/default.css"type="text/css"?>

<overlay id="mmp-overlay"xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <!-- Firefox toolbar -->
    <toolbarpalette id="BrowserToolbarPalette">
        <toolbarbuttonid="meetmeplus-button" type="menu-button" 
           class="toolbarbutton-1 chromeclass-toolbar-additional">
           <menupopup>
               <menuitem label="&mmp.gotohome;"tooltiptext="&mmp.gotohome.tooltip;" image="chrome://meetmeplus/skin/option_16.png"class="menuitem-iconic"/>
               <menuseparator/>
               <menuitem label="&mmp.option;"tooltiptext="&mmp.option.tooltip;"image="chrome://meetmeplus/skin/option_16.png" class="menuitem-iconic"/>
            </menupopup>
        </toolbarbutton>
    </toolbarpalette>
</overlay>

 

弹出菜单XUL如下:

<?xml version="1.0"?>
<overlay id="sample"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script type="application/x-javascript" src="overlay.js"/>
  <menupopup id="menu_ToolsPopup">
    <menuitem id="getcurrenturl" label="CurrentURL" oncommand="getURL();"/>
  </menupopup>
</overlay>

 

3       事件点击响应与JS

下面是XUL定义的一个按钮:

<buttonlabel="普通的按钮"oncommand="alert('onclick')"/>

或者在XUL开头引入JS文件

       <script type="application/x-javascript"src="chrome://forgot/content/jquery-1.7.2.min.js"/>

<scripttype="application/x-javascript"src="chrome://forgot/content/forgot.js"/>

<statusbarid="status-bar">

<statusbarpanelid="forgot" label="forgot"οnclick="Man.forgot()"   />

</statusbar>

 

其中event参数可以获取事件源的相关信息,clientX、clientY、screenX、screenY,分别是事件触发时,鼠标相对文档的xy坐标值和相对整个屏幕的xy坐标值,第21行在hbox上设置了onmousemove的事件属性,每当鼠标在这个hbox上移动,就会触发函数显示当前鼠标的位置。如event.target.tagName 获得被激活的控件的标签名称:

    oncommand="alert(event.target.tagName );
也可以在代码中绑定:

               /*

 * 参数1为事件名称,oncommand即为command

 * 参数2为事件处理函数

 * 参数3为true 表示不捕捉冒泡消息

 */

button.addEventListener('command',show_ok, true);

 

4       快捷键

为XUL元素设置快捷键的方法有多种。

l   元素accessKey属性,如:

       <menuitemid="close-command" label="关闭(X)"accesskey="x"/>

l   全局快捷键Key元素,设置的快捷键是crtl+q,modifiers就是通常所说的修饰键,modifiers可以取control、alt、meta、shift,分别代表了键盘上的ctrl、alt、meta、shift键。设置的快捷键是ctrl+alt+c,演示了如何设置有两个修饰键的情况,只需把他们用空格分开即可。如:

<keyset>

<keyid="key1" modifiers="control" key="Q"oncommand="alert('你按了快捷键crtl+Q')"/>

<keyid="key2" modifiers="control alt" key="C"oncommand="alert('你按了快捷键crtl+alt+C')"/>

<keyid="key3" keycode="VK_F6" oncommand="alert('你按了快捷键F6')"/>

</keyset>

5       事件驱动

我们可以利用元素的addEventListener方法绑定事件

              element.addEventListener(eventType,function,boolean)

而全局函数会将函数绑定到全局的元素上

              addEventListener(eventType,function,boolean)

另外,元素的时间处理逻辑可以通过command元素与页面元素分离,如:

       <command id="cmd_1" oncommand="alert('hello ');"/>

元素通过如下方式进行绑定:

       <button label="还是帮助" command=" cmd_1"/>

6       发布

将xpi上传至install.rdf文件所注明的服务器位置,并且修改响应的容易的处理content-type,在httpd.conf或者.htaccess文件中添加:

       AddTypeapplication/x-xpinstall .xpi

如果需要自动更新,则需要如下四部:

n   生成新的xpi文件。

n   Sha1sum xpi文件,将得到的hash写入update.rdf

n   McCoy Sign update.rtf

n   上传update.rdf和xpi文件至服务器

7       结尾语

没有什么好说的,用到了就总结一下,如果需要开发复杂的插件,这些只是远远不够的,但对于程序员而言,一切都是从hello world开始。

参考文献:

https://addons.mozilla.org/en-US/developers/docs/reference
https://developer.mozilla.org/en/Extensions

http://qnet.blog.35.cn/archives/65/Default.aspx?__tencentip=10.20.73.113&__tencentid=1&__tencentrawurl=http://qnet.blog.35.cn/archives/65/

http://www.ibm.com/developerworks/cn/web/wa-lo-firefox-ext/#chrome-sidebar

 

 

 

这篇关于Firefox插件开发初体验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940215

相关文章

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

工作流Activiti初体验—流程撤回【二】

已经玩工作流了,打算还是研究一下撤回的功能。但是流程图里面并不带撤回的组件,所以需要自己动态改造一下,还是延续上一个流程继续试验撤回功能。《工作流Activiti初体验【一】》 完整流程图 我们研究一下分发任务撤回到发起任务,其他环节的撤回类似 撤回的原理大概如下: 将分发任务后面的方向清空,把发起任务拼接到原来的判断网关,然后结束分发任务,这样流程就到发起任务了 此时的流程如上图,

工作流Activiti初体验【一】

在这里记录一下我的Activiti历程:(以下示例不涉及真实业务,所有逻辑均建立在学习的基础上) bpmn图 发起任务我设置了一个权限组user1,只要是这个权限的用户都可以发起任务 分发任务我设置了一个用户组,用户组中每个用户都可以处理这步流程,只要有一个人处理这步任务,分发的流程就算结束了 分发任务这一环节还有个判断,允许任务下发和不允许任务下发 任务分发完成则来到子流程,每个被分

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

WordPress网创自动采集并发布插件

网创教程:WordPress插件网创自动采集并发布 阅读更新:随机添加文章的阅读数量,购买数量,喜欢数量。 使用插件注意事项 如果遇到404错误,请先检查并调整网站的伪静态设置,这是最常见的问题。需要定制化服务,请随时联系我。 本次更新内容 我们进行了多项更新和优化,主要包括: 界面设置:用户现在可以更便捷地设置文章分类和发布金额。代码优化:改进了采集和发布代码,提高了插件的稳定

WDF驱动开发-WDF总线枚举(一)

支持在总线驱动程序中进行 PnP 和电源管理 某些设备永久插入系统,而其他设备可以在系统运行时插入和拔出电源。 总线驱动 必须识别并报告连接到其总线的设备,并且他们必须发现并报告系统中设备的到达和离开情况。 总线驱动程序标识和报告的设备称为总线的 子设备。 标识和报告子设备的过程称为 总线枚举。 在总线枚举期间,总线驱动程序会为其子 设备创建设备对象 。  总线驱动程序本质上是同时处理总线枚

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定义代码 6.element常用标签6.1.下拉列表

JavaWeb系列六: 动态WEB开发核心(Servlet) 上

韩老师学生 官网文档为什么会出现Servlet什么是ServletServlet在JavaWeb项目位置Servlet基本使用Servlet开发方式说明快速入门- 手动开发 servlet浏览器请求Servlet UML分析Servlet生命周期GET和POST请求分发处理通过继承HttpServlet开发ServletIDEA配置ServletServlet注意事项和细节 Servlet注

手把手教你入门vue+springboot开发(五)--docker部署

文章目录 前言一、前端打包二、后端打包三、docker运行总结 前言 前面我们重点介绍了vue+springboot前后端分离开发的过程,本篇我们结合docker容器来研究一下打包部署过程。 一、前端打包 在VSCode的命令行中输入npm run build可以打包前端代码,出现下图提示表示打包完成。 打包成功后会在前端工程目录生成dist目录,如下图所示: 把