`
wangminshe89
  • 浏览: 702375 次
文章分类
社区版块
存档分类
最新评论

Firefox插件开发(6)——FF插件的一些基础知识

 
阅读更多

上篇文章学习了npruntime的例子程序,接下来迫不及待地想实现自己的一个插件了。我决定使用VS 2005来做。

新建了一个名为npgnet的工程,按照npruntime例子,新建了np_entry.cpp、npn_gate.cpp、npp_gate.cpp、npgnet.def四个文件,然后新建了一个类CGnetFFPlugin,并且把例子中的关键代码添加了进来(我删除了一些cplugin类中的函数实体代码,因为我实现的功能和例子中的无关)。编译后,将生成的npgnet.dll放到FF的plugins目录下,然后在地址栏键入about:plugins,我靠,竟然没有我的插件!怎么回事?三个导出函数我都按照标准写了啊?比较了一下文件,我的工程没有添加.rc和resource.h,可能是这个原因。

回到VS 2005,在资源面板添加了一个VERSION资源项,修改ProductName等资源项以后,和npruntime例子比较了一下,还差MIMEType。这个东东很重要,这个给我的感觉就是FF插件的身份证,FF就是靠这个东东来匹配和识别你的插件的。但是我不知道VS 2005中怎么添加一个VERSION的键值,所以我只好用EditPlus打开npgnet.rc,手动添加了MIMEType:application/mozilla-npgnet-scriptable-plugin。OK,现在.rc和resource.h都欧了,再编译,将生成的npgnet.dll放到FF的plugins目录下,然后在地址栏键入about:plugins,我靠,竟然还是没有我的插件!真费解啊!

头大……接下来我进行了一系列的代码比较和尝试,失败了N多次,这里就省略不说了。最后发现原因原来在这个.rc上面。我的这个.rc是在VS 2005中使用菜单命令添加的,默认语言是简体中文,而npruntime例子是英文,用文件比较工具比较了一下,codepage和部分代码的位置都不太一样。其实只要把npruntime的这个.rc文件替换我的这个,然后编译输出的dll,FF就可以识别了!究竟是什么原因呢?是我的.rc缺少了些什么东西?还是FF只能识别英文的.rc?先不打算研究那么多了,至少我的插件的关键点不在这个上面,后面我还有很多事情需要去做。只要能让FF认出来,那就好。

既然决定要写插件,就要先理解插件的概念,在这个页面上有很详细的介绍:https://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Plug-in_Basics

下面的文字是我的一些阅读笔记和体会:

一、插件的加载过程

当一个页面打开时,如果该页面上有嵌入一个插件,浏览器将会做以下事情:

  • 通过MIMEType检查是否有匹配插件
  • 加载插件代码到内存
  • 初始化插件
  • 创建一个新的插件实例

插件可以在一个页面上被实例多个对象,也可以在同一时刻在不同的窗口中被实例化。当页面被关闭时,插件的实例就会被销毁。当最后一个实例被删除后,插件代码就会从内存中被卸载掉。

下面是插件内的函数调用过程:

  • 如果插件是首次被载入内存,浏览器会调用插件的NP_Initialize方法。为了方便起见,所有的插件定义函数以“NPP”开头,所有的浏览器定义函数以“NPN”开头。
  • 当浏览器创建插件实例时,会调用NPP_New方法。
  • 当插件实例被删除时(如关闭页面、关闭窗口),会调用NPP_Destroy方法。
  • 当最后一个实例被删除,插件从内存中卸载时,会调用NP_Shutdown方法。

二、插件检测

可以使用Javascript来检测一个插件是不是已经安装了,下面是测试代码:
function DetectFFPlugin()
{
var mimetype = navigator.mimeTypes["application/mozilla-npgnet-scriptable-plugin"];
if(mimetype)
{
var plugin = mimetype.enabledPlugin;
if(plugin)
{
document.writeln("Plugin had been installed and be enabled.");
}
}
else
{
document.writeln("Sorry, Plugin has NOT been installed.");
}
}

嗯,看到这里,觉得这个检测很有用。当检测用户尚未安装时,可以指导用户到哪哪哪去下载安装(转向一个漂亮点儿的页面),当检测已经安装了,就动态加载插件代码。不错。:)

三、插件结构概述

一个插件中的方法分为插件方法(Plug-in Methods)和浏览器方法(Browser Methods)。插件方法是你在插件中自己去执行的那些方法,以NPP为前缀命名。浏览器方法是被Gecko所执行的那些方法,以NPN为前缀命名。数据结构(Data Structures)以NP开头。

插件可分为有窗口和无窗口两种,不过文章中建议使用有窗口的,说这样会更稳定和易于控制。另外文中提到了可以将插件作为页面的一部分,并且可以使用HTML代码来控制插件的显示与否。

有两种方式可以使一个插件不可见:

1、如果你使用embed标签,可以使用其hidden属性,例如:<embed src="audiplay.aiff" type="audio/x-aiff" hidden="true">
2、如果你是用object标签,由于它没有hidden属性,你可以用CSS来完成隐藏:

object
{
visibility: visible;
}
object.hiddenObject
{
visibility: hidden !important;
width: 0px !important;
height: 0px !important;
margin: 0px !important;
padding: 0px !important;
border-style: none !important;
border-width: 0px !important;
max-width: 0px !important;
max-height: 0px !important;
}

<object data="audiplay.aiff" type="audio/x-aiff" class="hiddenObject"></object>

接下来文中介绍了object这个标签的使用。并且给了一个例子来说明ActiveX和插件如何融为一体来使用。

最后面的部分是对object和embed两种标签的各种属性的说明和举例。

值得一提的是,对于object和embed两种标签都可以在页面上嵌入一个插件。如何取舍呢?文章中有这么一段话:

Though the object element is the preferred way to invoke plug-ins, the embed element can be used for backward compatibility with Netscape 4.x browsers, and in cases where you specifically want to prompt the user to install a plug-in, because the default plug-in is only automatically invoked when you use the embed element.

意思是说:尽管object是推荐使用的调用插件的方式,embed也可嵌入插件(Netscape 4.x以上的浏览器),但如果你想在用户没有安装插件时,提示他进行安装,那么就应该选择用embed,因为FF的默认插件系统仅仅在你使用embed标签的时候,才会自动帮助你完成这种提示用户安装的效果。

我看过以后的感觉是,object使用起来似乎比embed要复杂,起码针对FF这个浏览器是这样,虽然他是HTML W3C的标准。多数情况下使用embed就可以了,何况现在谁还在用Netscape 4.x以下版本的浏览器啊,您说是不是?:)

OK,通过这几天的学习,终于对FF的插件编写有了一个初步的感性认识。到目前为之一切还比较顺利。

分享到:
评论

相关推荐

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

    知识点一:Firefox插件开发入门 作者在本篇文章中介绍了他的Firefox插件开发之旅,这是他首次尝试开发Firefox扩展,之前在IE浏览器中使用ActiveX技术实现了类似功能。作者开始时对于Firefox插件开发一无所知,因此在...

    火狐的淘宝插件FIREFOX——WW

    "火狐的淘宝插件FIREFOX——WW"就是针对这一需求开发的,旨在为火狐用户提供便捷的淘宝旺旺(WANGWANG)集成服务。 该插件的主要功能是将淘宝旺旺的聊天功能无缝嵌入到火狐浏览器中,使用户无需离开网页就能直接与...

    firefox插件开发,firefox plugin 开发 firefox 扩展 开发

    火狐浏览器(Firefox)插件开发涉及一系列技术与步骤,主要目标是创建增强或定制浏览器功能的软件组件。以下是对标题和描述中提及知识点的详细解释: 1. **开发环境搭建**: - 使用`-no-remote -P develop`参数...

    firefox插件开发文档

    1. **XUL(XML User Interface)**: XUL是Firefox插件开发的基础,是一种基于XML的语言,用于构建用户界面。开发者用XUL来定义扩展的UI元素,如按钮、菜单、对话框等。 2. **JavaScript**: JavaScript是实现插件...

    firefox插件开发教程

    本教程旨在深入探讨Firefox插件开发的核心——XUL(XML User Interface Language)及其在图形用户界面(GUI)设计中的应用。 XUL是一种专为Firefox设计的接口语言,它基于XML语法,为创建和修改浏览器内的图形元素...

    Firefox(火狐)浏览器 插件开发 DEMO VC6

    总之,这个“Firefox(火狐)浏览器 插件开发 DEMO VC6”项目涵盖了从基础的编程语言到高级的浏览器交互技术,对于想要深入学习Firefox插件开发的开发者来说,是一个宝贵的实践资源。通过研究这个DEMO,开发者可以学习...

    firefox插件开发

    Firefox插件开发是一个涵盖多个技术领域的话题,主要涉及如何为Mozilla Firefox浏览器创建和定制功能增强的扩展。在本文中,我们将深入探讨Firefox插件开发的关键概念、工具和步骤,以便帮助开发者构建自己的Firefox...

    firefox 插件开发sdk

    Firefox插件开发SDK,全称为Firefox Add-on SDK,是一个用于创建Firefox浏览器扩展的强大工具集。这个SDK基于JavaScript和C++,使得开发者可以使用高级语言来编写插件,同时也能利用C++进行性能关键部分的优化。在...

    adguard-firefox浏览器插件

    adguard_firefox浏览器插件 20230618

    Firefox插件开发Demo

    Firefox插件Demo #include "npapi.h" #include "npruntime.h" typedef int int16; class CPlugin { private: NPP m_pNPInstance; #ifdef XP_WIN HWND m_hWnd; #endif NPWindow * m_Window; NPStream *...

    Firefox 火狐 插件大全

    "Firefox 插件大全"是一个集合了众多实用插件资源的压缩包,旨在帮助用户丰富他们的火狐浏览器体验。 在这个压缩包中,我们看到的文件名称列表可能代表了一些与火狐插件相关的组件或库: 1. NPSWF32.dll:这是一个...

    Firefox插件例子源码

    【Firefox插件例子源码】是一个关于Firefox浏览器插件开发的学习资源,包含了示例代码,可供开发者参考和学习。这个压缩包中包含了多个文件,它们各自在插件开发过程中扮演着不同的角色。以下是对这些文件及其相关的...

    Firefox 插件开发指南

    ### Firefox 插件开发指南知识点概述 #### 一、开发概览 本教程专为希望为 Mozilla Firefox 浏览器开发全面扩展功能的个人而设计。教程构建为一个循序渐进的指导过程,提供了丰富的示例、解释及外部参考资料,帮助...

    火狐工具 web插件

    火狐工具Web插件是Firefox浏览器中用于增强和定制浏览体验的一种重要资源。这些插件是由开发者创建的,可以提供各种功能,从提高生产力到增强安全性,甚至改变浏览器的整个界面。以下是一些关于火狐工具Web插件的...

    firefox插件

    综上所述,这个主题涵盖了Firefox插件的基本概念、开发和使用,包括阅读和修改源码、利用开发工具进行插件制作,以及具体插件——Web Developer的安装和应用。对于那些想要深入了解Firefox插件开发或提升网页设计和...

    adblock for macOS firefox xpi插件火狐firefox

    火狐firefox adblock xpi插件,adblock for macOS firefox,解决火狐浏览器安装adblock显示此页面在您的地区不可用问题,解压拖动到火狐浏览器即可安装,完美解决无法从插件市场安装的问题

    基于QT的firefox插件

    ### 基于QT的Firefox插件开发指南 #### 一、引言 随着Web技术的发展,用户对浏览器的功能需求日益增长。为了满足这些需求,许多开发者选择开发浏览器插件来增强浏览器的功能性。其中,Qt作为一个跨平台的应用程序...

    firefox浏览器插件

    firefox浏览器插件firefox浏览器插件firefox浏览器插件firefox浏览器插件firefox浏览器插件firefox浏览器插件firefox浏览器插件

Global site tag (gtag.js) - Google Analytics