QtWebkit中浏览器插件的设计-2

简介: 前一节介绍的插件设计方式中虽然方便,但是其Mime类型只能是application/x-qt-plugin或者application/x-qt-styled-widget,这个有时候可能满足不了实际应用需求,那么另一种就没有这种限制,那可以是任意Mime类型的。

    前一节介绍的插件设计方式中虽然方便,但是其Mime类型只能是application/x-qt-plugin或者application/x-qt-styled-widget,这个有时候可能满足不了实际应用需求,那么另一种就没有这种限制,那可以是任意Mime类型的。这种设计需要重新实现QWebPluginFactory这个纯虚基类。先看看他的声明:

前一节介绍的插件设计方式中虽然方便,但是其Mime类型只能是application/x-qt-plugin或者application/x-qt-styled-widget,这个有时候可能满足不了实际应用需求,那么另一种就没有这种限制,那可以是任意Mime类型的。这种设计需要重新实现QWebPluginFactory这个纯虚基类。先看看他的声明:

class QWEBKIT_EXPORT QWebPluginFactory : public QObject {

……

public:

struct Plugin {

QString name;

QString description;

QList<MimeType> mimeTypes;

};

explicit QWebPluginFactory(QObject* parent = 0);

virtual ~QWebPluginFactory();

 

virtual QList<Plugin> plugins() const = 0;

virtual void refreshPlugins();

 

virtual QObject *create(const QString& mimeType,

const QUrl&,

const QStringList& argumentNames,

const QStringList& argumentValues) const = 0;

 

 

virtual bool extension(Extension extension, const ExtensionOption* option = 0, ExtensionReturn* output = 0);

virtual bool supportsExtension(Extension extension) const;

……

};

 

重点要实现的接口是plugins,用于获取plugin的列表,用于webkit内部判断该mime类型是否被支持,如果可以支持,那么就会调用create来创建这个插件,而具体打开哪个文件以及参数都会传递进来。

后两个extensionsupportsExtension接口暂时没有发现有什么用处,暂不考虑。

因此重新实现的WebPluginFactory如下:

class WebPluginFactory: public QWebPluginFactory

{

    public:

        WebPluginFactory(QObject *parent = 0);

        ~WebPluginFactory(){};

        QList<QWebPluginFactory::Plugin> plugins()const ;

        void refreshPlugins();

        QObject *create(const QString &mimeType,

                const QUrl &url,

                const QStringList &argumentNames,

                const QStringList &argumentValues) const ;

        bool extension(QWebPluginFactory::Extension extension, const QWebPluginFactory::ExtensionOption *option = 0, QWebPluginFactory::ExtensionReturn *output = 0);

        bool supportsExtension(QWebPluginFactory::Extension extension) const;

    private:

        // 用于将载入的插件记录下来

        mutable QList<QList<QWebPluginFactory::Plugin> > pluginslist;

        mutable QList<WebKitPluginInteface *> interfaces;

};

 

具体实现主要是create和plugins两个函数:

QList<QWebPluginFactory::Plugin> WebPluginFactory::plugins() const

{

    const char * s=getenv("BROWSER_PLUGIN_DIR");

    static bool isFirst=true;

    if(!isFirst)

    {

        return pluginslist;

    }

    isFirst=false;

    QString spath;

    if(s)

    spath=s;

    else

{

spath=".";

}

    QDir dir(spath);

    QStringList filters;

    QString abspath=dir.absolutePath();

filters<<"libqtweb*.so"; //查找下面的扩张,linux下是so,windows下则应该是dll,

    QStringList files=dir.entryList(filters);

    foreach(QString file,files)

    {

        file=dir.filePath(file);

        QPluginLoader loader(file,0);

        QObject * obj= loader.instance();

//下面是载入自定义的接口,只有这样才能支持动态插件创建,如果固定死了,将不利于扩展,后一节会介绍这部分内容

        WebKitPluginInteface * interface= qobject_cast<WebKitPluginInteface*> (obj);

        if(interface==0)

        {

            //ignore error when loading so ;

            continue;

        }

        interface->plugins();

        plugins.append(interface->plugins());

        pluginslist.append(interface->plugins());

        interfaces.append(interface);

    }

    return plugins;

}

void WebPluginFactory::refreshPlugins()

{

    Reload();

}

QObject * WebPluginFactory::create(const QString &mimeType,

        const QUrl &url,

        const QStringList &argumentNames,

        const QStringList &argumentValues) const

{

    for(int i=0;i<pluginslist.size();i++)

    {

        for( int j=0;j< pluginslist[i].size();j++)

        {

            foreach(WebPluginFactory::MimeType mt, pluginslist[i][j].mimeTypes)

            {

                if(mt.name == mimeType) //查找到,创建实例

                    return interfaces[i]->create( mimeType, url, argumentNames, argumentValues);

            }

        }

    }

    return NULL; //如果没有,直接返回NULL,webkit会进行处理的

}

 

这两个最主要的接口都是围绕着mimetype进行的,通过返回的列表告诉webkit插件支持什么类型的文件,而create则根据mimetype来识别文件类型,然后创建相应的插件。

下一节会简单的创建一个插件来演示如何创建一个插件。

目录
相关文章
|
8月前
|
开发者
查看edge浏览器插件的安装位置并将插件安装到别的浏览器
查看edge浏览器插件的安装位置并将插件安装到别的浏览器
683 1
|
8月前
|
文字识别 安全 JavaScript
6款超实用的Edge浏览器插件,让你的浏览器瞬间开挂!
Microsoft Edge是由微软开发的一款网页浏览器,致力于提供一个现代化、高效率、安全可靠的网络浏览器,以满足用户对于网络浏览的各种需求。
360 1
|
8月前
|
JavaScript
浏览器插件crx文件--JS混淆与解密
浏览器插件crx文件--JS混淆与解密
199 0
|
4月前
|
数据可视化 Java Windows
Elasticsearch入门-环境安装ES和Kibana以及ES-Head可视化插件和浏览器插件es-client
本文介绍了如何在Windows环境下安装Elasticsearch(ES)、Elasticsearch Head可视化插件和Kibana,以及如何配置ES的跨域问题,确保Kibana能够连接到ES集群,并提供了安装过程中可能遇到的问题及其解决方案。
Elasticsearch入门-环境安装ES和Kibana以及ES-Head可视化插件和浏览器插件es-client
|
2天前
|
Web App开发 搜索推荐 开发者
浏览器插件上架指南:如何把你的产品搬上浏览器插件市场
在实践了 Chrone、Firefox、Edge、Opera 等 几个主要的插件平台的上架发布工作后,我觉得很有必要把这个过程和思考记录下来,分享给大家,希望能提供一些参考和避坑的经验。我想通过这篇文章,和大家聊聊「为什么我要做这件事」,以及「这个系列文章会包含哪些内容」。我想用一个系列的文章,记录我是如何把 EmojiClick 搬到浏览器插件市场的,也给大家提供一些借鉴经验。
43 19
|
4月前
|
安全 Oracle Java
edge浏览器加载java插件
edge浏览器加载java插件
299 1
|
5月前
|
编解码 JavaScript 前端开发
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
157 1
|
5月前
|
Web App开发 JavaScript 前端开发
如何在浏览器中安装使用Vue开发者工具?Vue开发者工具的安装使用?可直接提取插件安装使用
这篇文章介绍了如何在浏览器中安装和使用Vue开发者工具,提供了两种下载方式,包括直接下载编译好的插件和从GitHub上下载源代码后进行打包。文章还详细说明了在Chrome浏览器中加载插件的步骤,以及插件在Vue项目和非Vue项目中的不同表现。
如何在浏览器中安装使用Vue开发者工具?Vue开发者工具的安装使用?可直接提取插件安装使用
|
5月前
|
Web App开发 前端开发 JavaScript
手摸手教你,从0到1开发一个Chrome浏览器插件
开发 Chrome 插件既有趣又具成就感。本教程将引导你从零开始,逐步创建一个简单的 Chrome 插件。首先了解 Chrome 插件是可增强浏览器功能的小程序。以一个基础示例开始,你将学习如何设置开发环境,包括安装 Chrome 和准备文本编辑器,并掌握 HTML、CSS 和 JavaScript 的基础知识。接着,我们将构建插件的基本结构,涉及 `manifest.json` 配置文件、`background.js` 后台脚本、`popup.html` 用户界面以及 `style.css` 样式表。
401 8
|
5月前
|
数据采集 JSON JavaScript