Safari插件机制研究(一)

Overview

在Safari里有一个单例对象WebPluginDatabase负责管理本地的插件,每个plugin对应一个WebBasePluginPackage,存放在plugins里。

在第一次调用sharedDatabase()会遍历当前系统有哪些可用的插件,并加到列表中管理。每个插件有其支持的MIME types和文件扩展名(Extension),在加载完成后,还会向WebView注册这些信息,以便在需要时加载对应的plugin。

当一个页面文档(WebDocumentView/WebHTMLView)决定要显示一个plugin时,与插件的交互管理主要集中在WebPluginController中。根据plugin的类型,执行初始化(webPluginInitialize)、释放(webPluginDestroy)、启动(webPluginStart)、停止(webPluginStop)等操作
(括号内的函数只是WebKit Plugin定义的函数)。

插件数据库的初始化

WebPluginDatabase是在需要时初始化,下面的序列图显示的是由视频页面创建视频时触发的WebPluginDatabase流程:

在WebFrameLoaderClient通过_videoProxyPluginForMIMEType获得一个WebPluginPackage,就会调用自身的pluginView函数创建一个插件对应的视图出来(在iOS里会创建一个UIWebPluginView封装起来)。再交由WebPluginController管理。

WebPluginPackage - 加载一个插件

如何从plugin中加载出一个视图?对应的就是下面这个流程。

1. 先在是初始化plugin database时就会使用获得的path让WebPluginPackage初始化一个NSBundle并存在成员变量中。

2. 在开始加载插件时,WebPluginController会操作WebPluginPackage执行[NSBundle load]并返回它的principalClass, 之后拿着这个class就可创建视图了(在iOS里会创建一个UIWebPluginView封装起来),再由WebPluginController管理(addPlugin
& addPlugInView)。

看一眼Plugin在info.plist定义了什么(QuickTime Plugin):

        

WebPluginController - 添加新的插件

下面的序列图包含三个主要过程(并非完整的call stack):

 1. 在DocumentLoader发出finishedLoading()完成主文档加载时,会创建WebHTMLView, 在初始化时也会初始化一个WebPluginController对象。

 2. 同样在finishedLoading()处理过程中,在为WebHTMLView指定WebDataSource的同时,也会为WebPluginController指定相同的data source.

 3. 当一个有效的url被指定后(指定media element的src属性), 就开始了一系列的初始化行为。 WebPluginController仅是记录的作用。实际的视图管理是由RenderWidget和Widget来处理的。

 *关于WebHTMLView看这里,关于WebDataSource看这里

WebPluginController - 释放操作

下面说明两种时机下的释放时序图:

  1. 当页面关闭时。由WebHTMLView的关闭操作发起释放操作。

  2.当使用JS删除视频节点时。由JS Binding的JSNode发起操作。

WebPluginController - 与插件交互

根据WebKit Plugin Protocol的定义,一个WebKit插件主要提供以下实例接口函数:

    

因为已经获取plugin bundle里的视图的实例,就可以像一般的视图操作一样来与plugin交互了。WebPluginController使用下面的方式来调用这些函数:

if([aViewrespondsToSelector:@selector(webPlugInStart)])
{

           JSC::JSLock::DropAllLocksdropAllLocks(JSDOMWindowBase::commonJSGlobalData());

            [aViewwebPlugInStart];

        } 

转载请注明出处:http://blog.csdn.net/horkychen

时间: 2024-10-29 21:09:36

Safari插件机制研究(一)的相关文章

sftp-elipse插件机制咨询。

问题描述 elipse插件机制咨询. 一直在eclipse-php中使用esftp插件进行传输文件到linux系统, 早几天由于连续按键同时进行上传文件.编译导致eclipse卡死了一次. 现在我只要一使用这个插件eclipse就卡死了,关闭也无法正常关闭. 几天了,没有找到原因.已经尝试的方法: 0.使用微软的监测工具看使用此插件时读取.写入的文件情况 -- 无可用价值文件 1.换一个磁盘重装原始eclipse -- 无效 2.搜索系统内所有esftp关键字相关的文件并进行删除 -- 无效 3

Partysip的插件技术研究

Partysip的插件技术研究之Partysip框架优化方案   介绍:        本文是<Partysip框架优化计划>的一部分,着重研究Partysip插件技术,并在此基础上尝试优化.        整体上说Partysip虽然没有使用OO的思想去设计,但是还是尽量"封装"独立的函数操作,所以研究和理解还是比较方便,对于每个声明结构体都会有一组相关的函数对其操作,这些操作大部分是名字上的差异,其执行操作是对结构体内变量赋值,修改操作,以及结构体的init和free操

分析支付宝客户端的插件机制

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为"中国PE第一股",市值超1000亿元.  -------------------------------------------------------- 原文地址:http://blog.devt

Android系统实现DroidPlugin插件机制

360手机助手使用的 DroidPlugin,它是360手机助手团队在Android系统上实现了一种插件机制.它可以在无需安装.修改的情况下运行APK文件,此机制对改进大型APP的架构,实现多团队协作开发具有一定的好处. 它是一种新的插件机制,一种免安装的运行机制 github地址:https://github.com/DroidPluginTeam/DroidPlugin 参考博客:http://blog.csdn.net/hejjunlin/article/details/52124397

插件化研究代之dexmaker动态生成Activity

文章首发:插件化研究代之dexmaker动态生成Activity|大利猫 最近在研究Android应用的插件化开发, 插件化都是在解决以下几个问题: 如何把插件apk中的代码和资源加载到当前虚拟机. 如何把插件apk中的四大组件注册到进程中. 如何防止插件apk中的资源和宿主apk中的资源引用冲突. 我们已经解决了如何把apk中的代码和资源加载到当前应用的问题,上一篇文章中使用代理的方式实现了插件Activity的注册,demo完成了插件框架的最简单的雏形.但是我们也说到代理方式实现的缺陷,于是

jQuery的核心:jQuery插件机制

文章简介:学过上一节课的朋友我想都知道了$符号的作用了,那么,今天我们再深入的学习一下jQuery的核心. 学过上一节课的朋友我想都知道了$符号的作用了,那么,今天我们再深入的学习一下jQuery的核心. jQuery对象访问:each(callback) 根据我的理解,each是jQuery中的一种循环机制.一般与this关键字配合使用.学过程序的朋友都知道程序中的循环方式有以下几种do...while().while().for(expression1,expression2,express

NetBeans vs. Eclipse RCP:插件机制比较

NetBeans与Eclipse处理扩展点及扩展的方式是不同的.让我们看看这些不同 之处.请注意,本文仅针对那些对这两个平台的插件机制都具备相当知识的人. NetBeans Platform: 定义扩展点 创建一个接口,并将它置入一个公共模块包中. 创建扩展 创建上述接口的实现,并通过layer.xml文件将它注册到虚拟文件系统 中. 读取可用的扩展 使用org.openide.util.Lookup类去获取上述接口实现的实例. Eclipse RCP: 定义扩展点 创建一个扩展点的描述符方案,

php利用反射实现插件机制的方法

 本文实例讲述了php利用反射实现插件机制的方法.分享给大家供大家参考.具体实现方法如下:   代码如下: <?php /**  * @name    PHP反射API--利用反射技术实现的插件系统架构  */    interface Iplugin{        public static function getName();    }    function findPlugins(){        $plugins = array();        foreach (get_de

你真的了解Docker吗?——Docker插件机制详解

云栖TechDay活动第十八期中,阿里云容器服务团队的核心成员陈萌辉带来了题为<Docker插件机制详解>的分享,分享中,他结合阿里云容器服务实践介绍了Docker插件的基本原理.实现方法以及插件机制未来的演进. 幻灯片下载地址:https://yq.aliyun.com/attachment/download/?filename=bdefe06ba7a14d7604af5a63a4bcc4f3.pdf 以下为现场分享观点整理. 为什么需要Docker插件?   Docker之所以这么火并且有