
WebKit on iOS
研究WebKit在iOS上的实现和应用,包括Safari、UIWebView、WebView、WebCore等类或框架的私有API等。
心CC
我不会告诉你他是一只葵鼠哒 O(∩_∩)O
展开
-
识别浏览器的JavaScript引擎的方法
答案来自StackOverflow,打开这个网页http://jsbin.com/opuvas即可,这个网页也是答题者自己写的。二维码是这个网址。网页内有统计访问量,作者想知道对多少人有用,建议尊重原创,不要复制这个网页。对PC浏览器和移动浏览器都可用。其原理是这段js:window.onload = function() { var v8string = 'fun原创 2013-10-19 10:58:05 · 3830 阅读 · 0 评论 -
利用javascript和canvas获取UIWebView网页里的图片(不用再下载)
在UIWebView网页里要获取img标签的图片,网上的方法都是通过获取到URL然后自己再下载一遍,耗流量、耗时间、不能通过验证。这里是利用UIWebView的stringByEvaluatingJavaScriptFromString函数,执行一段js,返回图片数据。具体的方式有两种:原创 2013-10-19 09:54:28 · 14270 阅读 · 20 评论 -
网页在Safari快速滚动和回弹的原理: -webkit-overflow-scrolling : touch;的实现
现在很多for Mobile的H5网页内都有快速滚动和回弹的效果,看上去和原生app的效率都有得一拼。要实现这个效果很简单,只需要加一行css代码即可:-webkit-overflow-scrolling : touch;可用以下网页测试: scroll .container {原创 2013-06-27 13:50:04 · 110096 阅读 · 2 评论 -
Mac10.9和iOS7新公开的框架JavaScriptCore.framework
官网的介绍:The JavaScript Core framework (JavaScriptCore.framework) provides Objective-C wrapper classes for many standard JavaScript objects. Use this framework to evaluate JavaScript code and p原创 2013-06-18 17:48:30 · 6592 阅读 · 1 评论 -
iOS WebCore的WebEvent和EventHandler
WebEvent是iOS专有的类,负责封装和携带从UIKit得到的系统事件信息,并由WebKit层的WAKResponder子类传递到WebCore的EventHandler。UIKit层的逻辑可参考《iOS私有API(三) UIWebView下的手势识别器gestureRecognizer》,WebKit层的相关类可参考《WebCore::Widget浅探》。开源码中WebEvent的声原创 2013-06-18 16:22:30 · 4177 阅读 · 0 评论 -
查找MobileSafari WebKit revision number的方法
Mobile Safari是开源的Mac Safari的iOS版本,然而iOS WebKit并不完全开源,只公开了部分的WebCore和JavaScriptCore。有时需要知道iOS Safari的WebKit revision number是对应www.webkit.org上的哪个,可以这么看。用Mobile Safari打开http://www.whatsmyuseragent.原创 2013-06-17 12:58:02 · 4890 阅读 · 0 评论 -
iOS调用WebView私有API的方法
WebView的私有API请查看《UIWebView体系结构(七)WebView》。先上代码吧- (void)modifyUA{ id webView = [uiWebViewInstance valueForKeyPath:@"_internal.browserView._webView"]; [webView performSelector:@selector(set原创 2013-06-14 17:04:22 · 10039 阅读 · 3 评论 -
UIWebView体系结构(八)各个Client综述
各种Clients会有些共性:1.WebCore会声明抽象基类,各Controller持有基类类型的指针2.由第三方创建Client并传递指针给Controller,Controller析构时会通知Client,Client此时删除自身。例如void WebChromeClient::chromeDestroyed(){ delete this;}3.自身脱离W原创 2013-06-14 16:41:05 · 4107 阅读 · 0 评论 -
iOS Safari/WebKit对DeviceMotionEvent的实现
请先阅读《iOS Safari/WebKit对DeviceOrientationEvent的实现》,本文是姐妹篇。简单地描述一下区别,后面会更详细对比:DeviceOrientationEvent是获取方向,得到device静止时的绝对值;DeviceMotionEvent是获取移动速度,得到device移动时相对之前某个时间的差值比。背景知识:Apple官方依然只原创 2013-06-09 14:40:06 · 12674 阅读 · 0 评论 -
iOS Safari/WebKit对DeviceOrientationEvent的实现
背景知识:Apple官方只发现一个文档:https://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/DeviceOrientationEventClassRef/DeviceOrientationEvent/DeviceOrientationEvent.html连个例子都没原创 2013-06-08 18:00:28 · 15196 阅读 · 0 评论 -
iOS Safari和UIWebView对orientationchange事件的实现
背景知识:Safari Web Content Guide中关于orientationchange的文档:http://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_re原创 2013-06-07 19:56:40 · 6389 阅读 · 1 评论 -
UIWebView体系结构(七)WebView
在《iOS WebCore的wak目录》中证实了iOS的WebKit是想尽可能复用Mac上的代码,所以WebView在iOS和Mac上差不多。Mac WebView的参考文档:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/WebKit/Classes/WebView_Class/Referenc原创 2013-06-06 12:21:59 · 7992 阅读 · 0 评论 -
cloc统计WebKit的代码量
2013年 6月 5日 星期三 16时52分43秒 CST 最新完整update的webkit代码。cloc是开源的,下载地址 http://sourceforge.net/projects/cloc/下载了perl版。结果:Cyan:Downloads liuhx$ perl cloc-1.58.pl /Users/liuhx/Desktop/webkit 135856 te原创 2013-06-05 18:03:34 · 3178 阅读 · 1 评论 -
iOS WebCore的wak目录
《iOS的WebThread》中提到:iOS的WebCore开源码,6.1版本的下载地址为:http://opensource.apple.com/release/ios-61/比起webkit.org上的Mac开源码,会多了个wak目录,内有21个文件。今天认真看了下全目录,还果然挖掘出好多信息。这21个文件的文件名,8个以WAK开头,6个以WebCoreThre原创 2013-05-10 15:12:28 · 3979 阅读 · 0 评论 -
谈谈iOS的Safari和UIWebView
打开iOS4.3上的iPad Safari,再跟iOS6.1上的对比,也许你会觉得4.3没有标签栏,不够好用,但那个多窗口的设计却又非常酷。iPhone上的Safari 4.3也和iPad差不多。这个多窗口的设计,影响了那个年代的第三方浏览器,UC啊,QQ啊都这么学。可是后来呢,iPad上的诸多第三方浏览器都是有标签栏的,Safari估计是被骂多了,在iOS5开始也这么干。可是其实原创 2013-05-09 10:56:54 · 8479 阅读 · 0 评论 -
iOS的WebThread
当用到UIWebView、UITextField、UITextView等类时,就会看到WebThread线程:在lldb中搜索(lldb) image lookup -r -s [wW]ebThread会有超过一百个结果。对于普通开发者而言,WebThread最有意义的东西恐怕是UIWebView的私有API- (void)_setDrawInWebThread:(BO原创 2013-05-08 11:23:45 · 11995 阅读 · 2 评论 -
iOS的QuickTime Plugin
当UIWebView播放视频时,可以看到view hierarchy里有FigPluginView的身影。这个类来自于QuickTime Plugin,plugin的路径为:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1原创 2013-05-07 18:13:57 · 6468 阅读 · 9 评论 -
利用IDA和LLDB探索WebCore的C++类的继承关系
开刀的类名叫 PluginWidgetIOS,利用lldb可以得到:(lldb) image lookup -r -s PluginWidgetIOS7 symbols match the regular expression 'PluginWidgetIOS' in /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSim原创 2013-05-02 17:54:57 · 4695 阅读 · 0 评论 -
UIWebView体系结构(六)UIWebView
UIWebView的实际成员变量都由UIWebViewInternal保存,UIWebViewInternal的声明如下:@interface UIWebViewInternal : NSObject{ UIScrollView *scroller; UIWebBrowserView *browserView; UICheckeredPatternView *ch原创 2013-04-16 16:28:49 · 10308 阅读 · 0 评论 -
UIWebView体系结构(五)_UIWebViewScrollView和UIWebScrollView
_UIWebViewScrollView的继承链为:_UIWebViewScrollView->UIWebScrollView->UIScrollView。通过反编译可以得到实现。_UIWebViewScrollView和UIWebScrollView的实现为:(代码好长,点此跳过)@interface UIWebScrollView : UIScrollView- (void)d原创 2013-04-10 17:43:46 · 9026 阅读 · 0 评论 -
UIWebView体系结构(四)UIWebBrowserView
UIWebBrowserView的声明如下:(代码好长,点此跳过)@interface UIWebBrowserView : UIWebDocumentView { UIWebFormAccessory *_accessory; NSObject *_input; DOMNode *_currentAssistedNode; DOMNode *_assis原创 2013-04-10 11:13:52 · 14876 阅读 · 0 评论 -
UIWebView体系结构(三)UIWebDocumentView和WebView
WebView是UIWebDocumentView最重要的组合对象,先讲WebView吧。WebView的声明如下:(代码好长,点此跳过)@interface WebView : WAKView{ WebViewPrivate *_private;}+ (void)registerViewClass:(Class)arg1 representationClass:(Cl原创 2013-04-10 10:07:47 · 11164 阅读 · 1 评论 -
UIWebView结构体系(二)UIWebTiledView和WAKWindow
UIWebTiledView是UIWebBrowserView->UIWebDocumentView->UIWebTiledView继承链中的老爷子,但这三个类的职能却是MVC的关系,UIWebBrowserView是Controller,UIWebDocumentView是Model,UIWebTiledView是View。(这也是我第一次见到这样的设计,很有意思)它的声明为: (代码好长,原创 2013-04-09 10:52:23 · 5260 阅读 · 0 评论 -
UIWebView体系结构(一)概貌
UIWebView属于UIKit,封装了WebKit.framework的WebView;WebView组合管理了WebCore.framework的Page,并提供了各种Clients;Page管理了Main Frame,Main Frame管理了sub Frame(FrameTree)。UIWebView层(点击图片查看全图):WebView层(点击图片查看全图原创 2013-04-08 12:49:27 · 9344 阅读 · 1 评论 -
xcode使用lldb的python脚本查看WebKit的WTF::String和Vector等基础类
webkit关于gdb的wiki:http://trac.webkit.org/wiki/GDB它是自带了gdb和lldb的python脚本的,路径分别在webkit workingcopy/Tools/gdb/webkit.py 直接看脚本内容http://trac.webkit.org/browser/trunk/Tools/gdb/webkit.pywebkit workingc原创 2013-03-28 11:24:04 · 3931 阅读 · 0 评论 -
Mac Safari VS Mobile Safari开启的宏
宏Mac OS X 10.7 Safari Mobile Safari iOS6.1模拟器版Mobile Safari开了Mac Safari没开的声明位置原创 2013-03-26 13:49:39 · 3095 阅读 · 0 评论 -
WebCore::Widget浅探
研究方法:WebKit的xcode工程里以Widget为关键字全局搜索,查看相关函数名与注释新建一个使用了UIWebView的工程,运行时lldb里image lookup与Widget有关的类探寻:Widget.h里有以下注释:// The Widget class serves as a base class for three kinds of objects: //原创 2013-03-18 20:31:00 · 4661 阅读 · 0 评论 -
UIWebView下各种手势识别器的协作处理方案
前置阅读:1. iOS私有API(二) UIGestureRecognizerDelegate的两个函数2. iOS私有API(三) UIWebView下的手势识别器gestureRecognizerUIWebView下有很多的手势,它是怎么管理的呢?主要是两种途径:自管理和委托,即1. 继承自UIGestureRecognizer或其子类,重载以下两个函数// same beha原创 2013-03-18 20:30:56 · 6873 阅读 · 1 评论 -
iOS私有API(三) UIWebView下的手势识别器gestureRecognizer
首先,UIWebView本身之上并没有手势识别器(gesture recognizer,下面简称手势),而是其子view有。通过gdb或lldb,我们很容易看到UIWebView的subviews层级关系,下面是使用一个UIWebView打开百度首页时的情况:(lldb) po [g_webView recursiveDescription] $0 = 0x0ab202e0 >原创 2013-03-18 20:30:54 · 13765 阅读 · 1 评论 -
WebKit的ManualTests & PerformanceTests
ManualTests即手工测试,大概包括:1. 动画类的,如CSS3动画,JS动画2. 音视频的支持3. Drag&Drop (这个只有Mac Safari支持) http://trac.webkit.org/wiki/Manual%20Testing4. SVG5. webkit开发者用来重现和验证bug的页面。 https://bugs.wekit.org共541原创 2013-03-18 20:30:50 · 1783 阅读 · 0 评论 -
iOS私有API(二) UIGestureRecognizerDelegate的两个函数
UIGestureRecognizerDelegate有两个没公开的函数,只要重载了就会被调用。即所有的UIGestureRecognizer子类.delegate = someInstance; 经过set以后,只要这个delegate实例里有这两个函数,就会被调用进入。经过验证,这两个api是可以通过apple审查上app store的。- (BOOL)gestureRecognize原创 2013-03-18 20:30:48 · 13067 阅读 · 0 评论 -
Mac OS X编译最新webkit(2013-03-15)
安装Xcode,4.5版本或以上。必须要安装的方式,不能copy。xcode菜单Xcode->Preferences...->Downloads->Components栏选择Command Line Tools的Install。不做这步的话,可能会出现warning:“The specified SDK “Current OS X” does not appear to have all原创 2013-03-18 20:30:35 · 5839 阅读 · 2 评论