Firefox插件开发概述


Firefox插件开发概述
2011年02月15日
  本文译自MDN: https://developer.mozilla.org/en/Gecko_Plugin_API_ Reference/Plug-in_Development_Overview
  最近在学习Mozilla开发,这方面的中文文档甚少,第一次尝试发表译文。本人Mozilla开发知识和翻译水平有限,不当之处请留言指正。
  当确定了插件的功能,编写插件将是一件简单的事情。以下步骤是插件开发过程的基本要点。
  1.插件设计:确定插件程序提供的服务和插件与浏览器之间的交互规则以及插件处理的特殊媒体类型。
  2.确定插件处理的MIME类型和文件扩展名。(译注:MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。)
  3.设置正确的开发环境。你可以通过多种开发环境来创建插件,但必须确保包含了来自mozilla source或者plug-in SDK的文件。(译注:mozilla source)
  4.创建插件项目:你可以在mozilla source提供的相应操作系统(Windows/Unix/Mac OS)的插件示例代码基础上开始编写插件;或者在你自己的开发环境中使用SDK提供的文件创建新的插件项目。关于plug-in SDK和示例使用的更多信息参阅pulg-in SDK目录的README文件。(译注: README文件)
  5.编写插件程序代码,实现插件基本操作所必须的Plug-in API函数。在本章中将看到一些Plug-in API函数。
  6.构建插件。
  7.将插件安装到操作系统特定的插件目录下。
  8.测试和调试插件。
  9.创建HTML页面并嵌入插件对象。要查看插件的行为,可以在浏览器中打开调用了该插件的页面。更多关于HTML元素的使用参阅Using HTML to Display Plug-ins Gecko通过插件所支持的MIME类型来识别不同的插件。当要显示某个特殊MIME类型的数据时,浏览器查找并调用支持此类型的插件对象。这些数据可以是来自HTML文件中的某个object元素(这些object或embed元素直接指定了MIME类型或该类型的文件),或是某个MIME类型的非HTML的单独文件,也可以是服务器上的文件。
  服务器根据传送文件的扩展名查找相应插件所注册的MIME类型(译注:这里的插件应该是指在服务器上的应用程序),然后将该文件传送到浏览器(译注:一般服务器会将MIME标识放入传送数据中以供浏览器识别)。浏览器如果查找到了某插件注册了该MIME类型,就加载该插件程序来处理数据。
  当浏览器启动时,浏览器检测插件系统并安装插件。浏览器综合用户参数和插件目录的内容或windows注册表信息来决定安装哪些插件和确定支持的文件类型。
  一个MIME类型由type(如application和image)和subtype两部分组成。例如image/jpeg。如果要给插件定义一个新的MIME类型,你需要在IETF(Internet工程任务组)进行注册。尚未注册的MIME类型可以在其subtype名称前加上"-x",例如image/x-nwim。有关MIME类型的更多信息,参见以下MIME RFCs: 在不同的操作系统平台上注册插件有所区别。下面各节讲述了特定平台上插件的查找与注册方式。 在Windows上,插件的查找方式参阅 How Gecko Finds Plug-ins
  浏览器通常利用插件在注册表中的信息来确定插件处理的MIME类型及文件扩展名。
  但是,当加载的插件位于一个常规的路径下时必须采用另一种方法。这种情况下,为确保插件文件被加载,其名称必须为"np*.dll"的形式。同时,插件DLL文件的版本信息中包含MIME类型,文件扩展名,文件打开模板名称(file open template),插件名称以及文件描述信息。
  插件DLL内置的版本信息需要包含如下string/value: 在MIME类型和文件扩展名字符串中,用"|"分隔不同类型,例如:
  video/quicktime|audio/aiff|image/jpeg
  只有设置为"US English"语言,并且你的开发环境设置为Windows多语言字符集时,创建的版本信息才会被加载。 暂略 暂略 插件在页面中自绘之前,必须提供这些信息:设置目标窗口,重绘时机和所处理的事件信息。
  一个无窗口插件(windowless plug-in)可以调用以下Netscape函数来自绘: NPN_ForceRedraw:  浏览器主动发送绘制消息给插件?(Force a paint message for windowless plug-ins. ) 
  NPN_InvalidateRect: 在重绘和刷新之前使插件的一块矩形区域变为无效。 
  NPN_InvalidateRegion: 在重绘和刷新之前使插件的一块区域变为无效。 
  浏览器调用以下插件函数: NPP_GetValue: 查询插件信息。 
  NPP_Print: 为插件实例请求特定平台的打印操作。 
  NPP_SetValue: 设置浏览器信息。 
  NPP_SetWindow: 设置插件绘制的目标窗口。 
  NPP_HandleEvent:  发送特定事件给插件实例。
  插件可以调用以下Netscape函数来查询和设置信息: NPN_GetValue: 获取浏览器信息。 
  NPN_SetValue: 设置浏览器信息。
  更多插件绘制内容参阅: Drawing and Event Handling 插件开发者可以利用Plug-in API提供的内存特性来分配和释放内存。 使用 NPN_MemAlloc从浏览器分配内存。
  使用 NPN_MemFree释放NPN_MemAlloc分配的内存。
  使用 NPN_MemFlush Mac OS平台释放内存专用。
  流是一种呈现URLs和数据的对象。一个流对象可以与某个特定的插件实例相关联,而一个插件实例可以拥有超过一个流对象。流可以由浏览器产生供插件实例使用,也可以由插件实例产生供浏览器使用。每个流对象关联一种MIME类型用来识别流对象中的数据类型。
  浏览器产生的流对象可以自动的发送到插件实例或是被插件实例请求。插件可以选择以下几种流传输模式: 普通模式:当流数据可用时浏览器将流数据连续的发送给插件。
  随机存取模式:浏览器允许插件请求流数据中任意的字节段。此模式需要服务器支持。
  文件模式:浏览器保存流数据到本地缓存文件并将文件路径传给插件。
  插件产生的流发送到浏览器与普通模式中浏览器产生的流传输模式输相反。在浏览器普通模式流传输中,浏览器调用插件并通知它流对象已经创建并且将发送更多的流数据。相反的,在插件产生的流中,插件调用Netscape函数创建流,放入数据,最后释放流。 Plug-in API提供了相应函数给插件用于收发网络中任意一个URL的数据,提供跨文档超链接,使用HTTP发送表单数据到CGI脚本,或用FTP上传文件到远程服务器。 使用 NPN_GetURL请求浏览器加载URL到某个浏览器窗口或框架中显示,或者通过一个新的流对象将该URL的数据发送到插件实例。
  NPN_GetURLNotify函数与NPN_GetURL的操作类似,此外在操作结束时告知插件处理结果信息。
  使用 NPN_PostURL将数据发送到内存或文件中的某个URL。服务器处理的结果可以传送到浏览器窗口或框架中显示,或者通过一个新的流对象传给插件实例。
  NPN_PostURLNotify函数与NPN_PostURL的操作类似,此外在操作结束时告知插件处理结果信息。
  Netscape组中的Plug-in API函数提供了一些插件的基本服务。你可以使用以下NetScape函数: 识别显示插件的浏览器信息:使用 NPN_UserAgent可以读取此信息。
  确定插件和浏览器版本是否兼容,同时可能提供不同版本的替代处理:使用 NPN_Version函数检查主要版本和次要版本的变化。
  相关函数的使用信息参阅:Version, UI, and Status Information 插件可以作为浏览器功能的补充无缝集成在浏览器中。为了使插件看上去是浏览器UI的一部分,插件可以通过提供状态栏消息来模拟浏览器的行为。利用 NPN_Status函数将信息显示到状态栏。
  相关函数的使用信息参阅:Version, UI, and Status Information 支持脚本的插件(scriptable plug-ins)是一种扩展插件,提供了可从JavaScript和DOM通过object和embed元素调用的函数。下面的例子演示了一个媒体播放插件在script元素中通过调用advanceToNextSong()来控制歌曲播放。    var thePlugin = document.getElementById('myPlugin'); if (thePlugin && thePlugin.advanceToNextSong) thePlugin.advanceToNextSong(); else alert("Plugin not installed correctly");  过去使用LiveConnect以及后来的XPConnect来使插件支持脚本。参阅 the Wikipedia article查看历史使用记录。这两种技术已经过时,应该被跨浏览器的npruntime API所取代。
  更多细节内容参阅 Scripting plugins 当你添加了如前所述的扩展代码和附加文件来使插件支持脚本时,插件的构建过程是十分简单的。将插件DLL添加到plugins文件夹,同时将类型库文件和头文件放入application路径的正确位置。下面更详细的讲述实现脚本支持的步骤。 所有主要平台上的构建资源随SDK一起提供。包括Unix平台的makefiles,Windows平台的项目文件和Mac OS X平台的IDEs,definition files, resources files,还有其他用来构建SDK中的示例的资源文件以及你自己的项目文件。Gecko插件可以通过各主要平台上的常用编译器来编译--如何使用这些编译器显然超出了本手册的范围。 所有你需要的资源,包括definition files,source files,resource files,都可以从Plug-in SDK中找到。Plug-in SDK可从mozilla source tree获取或者单独下载可编译的软件包。在mozilla source的modules/plugin/tools/sdk/samples/basic路径下的插件基础例子中包含了在主要平台上构建一个简单插件所需要的所有文件。 暂略 插件不能安装在Firefox目录中。可以将插件打包成扩展并按扩展的方式安装,或者将插件安装到系统标准安装路径。 Windows上插件应该安装在特定插件目录如C:\Program Files\Plugin Name\nppluginname.dll。然后将下面的值添加到注册表。 在Linux和Mac中,插件安装到常规目录下: Linux: /usr/lib/mozilla/plugins or /usr/lib64/mozilla/plugins Mac: /Library/Internet Plug-Ins or ~/Library/Internet Plug-Ins

猜你喜欢

转载自ijj72ijj.iteye.com/blog/1361200