Safari插件机制研究(二) 插件的视图管理

简介: Note:首先相对于WebKit官网的代码,iOS上的版本使用WAKView代替了NSView。 比如Mac OS中将PlatformWidget定义为 NSView*, 而在iOS中则是WAKView *. 详细的内容可以参考Hursing的博客。

Note:首先相对于WebKit官网的代码,iOS上的版本使用WAKView代替了NSView。 比如Mac OS中将PlatformWidget定义为 NSView*, 而在iOS中则是WAKView *. 详细的内容可以参考Hursing的博客


Overview

观察一份含有视频的页面的视图结构:

Hierarchy of UIWebView

<UIWebView: 0x8d8c160; frame = (0 78; 768 926);

   | <_UIWebViewScrollView: 0x8d95310; frame = (0 0; 768 926);

   |    | <UIImageView: 0x8d96eb0; frame = (0 0; 10 10);

   |    | ...

   |    | <UIWebBrowserView: 0xa2a3c00; frame = (0 0; 768 926);

   |    |    | <TileHostLayer: 0x8d8d4a0> (layer)

   |    |    |    | <TileLayer: 0x8a81e20> (layer)

   |    |    | <CALayer: 0x7579a70> (layer)

   |    |    |    | <WebLayer: 0x71ab2b0> (layer)

   |    |    |    |    | <WebLayer: 0x8ea80f0> (layer)

   |    |    |    |    |    | <WebLayer: 0x71848c0> (layer)

   |    |    |    |    |    |    | <CALayer: 0x88a0650> (layer)

   |    |    |    |    |    |    |    | <FigPluginView: 0xb1d6670; frame = (0 0; 631 278);

   |    | <UIImageView: 0x8c650d0; frame = (0 919; 768 7);

   |    | <UIImageView: 0x8c7d760; frame = (761 0; 7 926);


Hierarchy of WebView

UIWebBrowserView (UIView)

   | _webView <WebView: WAK: 0x7541e70 (WK: 0x7541ee0)>

   |    | <WebFrameView: WAK: 0x75428c0 (WK: 0x7542910)>

   |    |    |<WAKScrollView: WAK: 0x7542c90 (WK: 0x7542cf0)>

   |    |    |    |<WAKClipView: WAK: 0x7542e80 (WK: 0x7542ed0)>

   |    |    |    |    |<WebHTMLView:WAK: 0x8e226e0 (WK: 0x8e2c5a0)>

   |    |    |    |    |    |<UIWebPlugInView:WAK: 0x8e31a60 (WK: 0x8e31ad0)>

*这里不是直接的子视图的关系,而是由UIWebBrowserView的成员变量_webView所管理的一个WAKView树。


在从UIWebView向下展开,在视图层次上有播件的视图FigPluginView。下面的树是从WebView层展开会看到UIWebPlugInView(注意第二个大写的i)。而FigPluginView是由UIWebPluginView管理的(见前一篇)。


UIWebPluginView只关心plugin视图、layer和交互,所以通过下图可以看到它除了提供4个WebKit Plugin的接口函数,一些绘制操作的接口(setFrame,layout….), 剩下的基本都和layer有关了。Widget中的m_widget指向一个WAKView, 在WebFrameView创建WebHTMLView会将它指定给一个Widget。而Widget会由RenderWidget在加载插件时添加到FrameView上。


关于Widget可以参考这里:WebCore::Widget浅探


UIPlugInView - 初始化视图 (视频插件)

这个创建过程是建立好插件视图FigPluginView、UIWebPlugInViiew和WebPluginController的关系。




UIPlugInView - 添加插件视图到页面视图

UIWebPlugInView接收到setFrame来设置大小时会将插件视图FigPluginView添加到UIBrowserView中,然后将视频插件的layer关联进来。




UIPlugInView - attach/detach视图

在排版过程中,会通过RenderBox (Step 1)触发UIWebPlugInView attach插件视图。当视图移除时(Step 4)将插件的layer detach出去。




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


目录
相关文章
|
6月前
|
Web App开发 存储 安全
大师学SwiftUI第17章Part1 - Web内容访问及自定义Safari视图控制器
App可以让用户访问网页,但实现的方式有不止一种。我们可以让用户通过链接在浏览器中打开文档、在应用界面中内嵌一个预定义的浏览器或是在后台下载并处理数据。
47 0
|
Web App开发 移动开发 iOS开发
|
Web App开发 iOS开发
chrome 和 safari 广告插件拦截了我的div
1,现象 美工童鞋,开发了页面。 发现特别奇怪的现象,有一个div不显示了。 开始还以为是浏览器兼容的问题。 找啊找,重写了样式也不行,而且根本没有找到那个div。 2,原因 是因为我安装了广告拦截插件。 美工童鞋在div的样式命名的时候写了一个 xxxxx-ad的class。 结果直接被插件拦截了。 我的那个div就消失了,折腾1 天多才找到的问题。
990 0
|
Web App开发 JavaScript Android开发
iOS Safari阅读模式研究
这是一篇在2013年准备的资料,现在分享出来,供有需要的同学参考。 要点 (1) 阅读模式的检测 在frame加载完成后,触发一个timer来检测是否可以使用阅读模式。
1426 0
|
Web App开发 iOS开发 JavaScript
Safari插件机制研究(一)
Overview 在Safari里有一个单例对象WebPluginDatabase负责管理本地的插件,每个plugin对应一个WebBasePluginPackage,存放在plugins里。
965 0
|
Web App开发 移动开发 iOS开发
Webkit中HTML5 Video的实现分析(六) - Safari视频机制分析
Safari中的视频相关操作封装在QuickTime Plugin里面,存放于/Library/Internet Plugin目录下。   下图是相关类的class diagram: 其中的QuickTime Plugin是通过已淘汰的Apple之前定义的Webkit Plugin协议来实现的,而不是现在支持的Netscape API的机制。
1238 0
|
2月前
|
Web App开发 编解码 JavaScript
Safari浏览器不支持……
Safari浏览器不支持……
20 0
|
2月前
|
Web App开发 编解码 JavaScript
Safari浏览器不支持let声明的解决方式
Safari浏览器不支持let声明的解决方式
18 0
|
5月前
|
Web App开发 移动开发 Android开发
解决IOS Safari浏览器H5页面上下滑动时卡顿、页面缺失的问题
解决IOS Safari浏览器H5页面上下滑动时卡顿、页面缺失的问题

热门文章

最新文章