Android浏览器的插件原理

来源:互联网 发布:知乎wifi刷不出来图片 编辑:程序博客网 时间:2024/06/03 19:20

1.浏览器与插件的交互

        在webkit/Source/WebCore/bridge/npapi.h中定义了大量函数,其中有两类函数,分别以NPN_和NPP_开头(以下简称NPN函数和NPP函数)。在Android中规定,NPN函数由浏览器实现,提供给插件调用;NPP函数由插件实现,提供给浏览器调用。


例如:如果插件想利用浏览器分配一块内存空间就可利用NPN_MemAlloc函数,以下是此函数的定义:


void* NPN_MemAlloc(uint32_t size){    return malloc(size);}

此函数由浏览器实现,插件只需调用此函数,就可得到分配的内存指针。

2.插件的初始化

     在FrameLoaderClientAndroid中createPlugin()函数负责创建插件,共分为两个过程:
     1---在PluginDatabase中找到mimtype对应的插件,并创建此插件的PluginPackage;
      2---创建此插件对应的PluginView
      插件是如何注册到PluginDatabase中的可以看如下代码:
PluginDatabase* PluginDatabase::installedPlugins(bool populate){    static PluginDatabase* plugins = 0;    if (!plugins) {        plugins = new PluginDatabase;        if (populate) {            plugins->setPluginDirectories(PluginDatabase::defaultPluginDirectories());            plugins->refresh();        }    }    return plugins;}

3.PluginView是什么



        上图是PluginView的继承关系图,可以看出PluginView继承自Widget。Widget实际上是ScrollView、ScrollBars和Plugin的基类,以它为基类的元素并不在webkit解析时生成的树结构中(dom树、render树等),但所有的Widget之间会相互连接为树的结构。
0 0