本文为Safari阅读模式分析过程记录,没有做很好的整理。最终的输出见另一篇iOS Safari阅读模式研究。
1. Break on evaluate
b JSC::evaluate(JSC::ExecState*, JSC::ScopeChainNode*, JSC::SourceCode const&, JSC::JSValue, JSC::JSValue*)
dump the source content from JSC::SourceCode
Printing description of source.m_provider.m_ptr->m_url:
(WTF::String) m_url = { length = 0, contents = '' } {
m_impl = {
m_ptr = 0x0000000000000000 { length = 0, is8bit = 0, contents = '' }
}
}
Printing description of source.m_provider.m_ptr->m_source:
(WTF::String) m_source = { length = 66370, contents = '/*
* Copyright © 2010 Apple Inc. All rights reserved.
*/
……
2. Call Stack
3. (lldb) image list
[ 0] 396DF4E9-18D6-3C39-B1FB-E783D7F9B947 0x00001000 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/Applications/MobileSafari.app/MobileSafari
-> JSEvaluateScript
0x70224(0x702a5) ->
0x6fdc8(0x6fe19) ->
0x6fd9a(0x6fdb5) -> XREF:-[ReaderTestProcessor _processReaderTestResult:tabDocument:] & -[ReaderContext isReaderAvailable]
0x6eac5(0x6eae5) -> -[ReaderContext isReaderAvailable]
0xa3d84(0xa3dd3) -> XREF:-[TabDocument _detectReaderAvailabilityOnWebThread]
HandleRunSource
i. 查找起点
3483 -> 0xa3d15 -[TabDocument _detectReaderAvailabilityOnWebThread]
3490 -> 0xa3f56(0xa404b) -[TabDocument _detectReaderAvailabilityNow]
ii. 谁发起了_detectReaderAvailabilityNow
-[BrowserController stopFromAddressView:]
-[TabDocument _progressDidStall]
-[TabDocument webView:didFinishLoadForFrame:]
-> -[TabDocument detectReaderAvailabilitySoon]
3496->0xa4279 -[TabDocument detectReaderAvailabilitySoon]
3274-> 0x9c16b (0x9c1ad) -[TabDocument webView:didFinishLoadForFrame:]
4. (FAILED)
b -[UIView setHidden:]
(lldb) showParameters 3
$56 = 0x09a43aa0 <ReaderButtonView: 0x1a39ca50; baseClass = UIButton; frame = (276 2; 49 27); alpha = 0; opaque = NO; layer = <CALayer: 0x1a398610>>
0x08d60840: "setHidden:"
5.
b -[UIView setFrame:]
(lldb) showParameters 3
$26 = 0x0a984730 <ReaderButtonView: 0x9af39d0; baseClass = UIButton; frame = (276 2; 49 27); alpha = 0; opaque = NO; layer = <CALayer: 0x9a6fb60>>
0x07b37881: "setFrame:"
0x07b3788b: "addSubview:"
96 -> 0x6d38 (0x6f9d): -[AddressView _layoutReloadButtonForProgressViewFrame:forEditing:textField:showInactiveFieldWhileEditing:]
257 -> 0x126a4 (0x1288a): -[AddressView layoutReaderButton]
3482 -> 0xa3927 (0xa3caf): -[TabDocument _didDetectReaderAvailability:]
3485 -> 0xa3e3f (0xa3e6b): (MEM:didDetectReaderAvailability)
-[AddressViewaccessibility(SafeCategory) layoutReaderButton]
6. (FAILED)
根据WebKit Objective-C Programming Guide, 获取JS数据需要先获取window对象:
id win = [webview windowScriptObject];
前且所有的JS对象是使用WebScriptObject包装起来的。
Summary: WebCore`-[WebScriptObject valueForKey:] Address: WebCore[0x00d35b30] (WebCore.__TEXT.__text + 13843984)
(lldb) b WebCore`-[WebScriptObject valueForKey:]
Breakpoint 14: where = WebCore`-[WebScriptObject valueForKey:], address = 0x03581700
7.
TabDocument::
- (void)_detectReaderAvailabilityNow; // IMP=0x000a3f56
- (void)_detectReaderAvailabilityOnWebThread; // IMP=0x000a3d15
- (void)_didDetectReaderAvailability:(BOOL)arg1; // IMP=0x000a3927
8.
var ReaderArticleFinderJS = new ReaderArticleFinder(document);
6fdc8(6fe24) -> 1b3ba(1b3d6) -> isReaderModeAvailable
9. break at JSObjectGetProperty
(lldb) p/x `*(int*)($ebp+16)`
(int) $33 = 0x000debdf
(lldb) mem read `$33`
0x000debdf: 69 73 52 65 61 64 65 72 4d 6f 64 65 41 76 61 69 isReaderModeAvai
0x000debef: 6c 61 62 6c 65 00 70 72 65 70 61 72 65 54 6f 54 lable.prepareToT
10. 还需要再获取对象
450 -> 0x1b774(0x1b777) -> return ReaderArticleFinderJS
1656 -> 0x5a70c (0x5a76e) ->
2193 -> 0x70224 (0x70315) ->
2186 -> 0x6fdc8 (0x6fe19) ->
2185 ->0x6fd9a(0x6fdb5) -> XREF:-[ReaderTestProcessor _processReaderTestResult:tabDocument:] & -[ReaderContext isReaderAvailable]
2125 ->0x6eac5(0x6eae5) -> -[ReaderContext isReaderAvailable]
3484 -> 0xa3d84(0xa3dd3) -> XREF:-[TabDocument _detectReaderAvailabilityOnWebThread]
11. click the "Reader" button
0.
a.再次确认Reader Mode
2193->0x70224 (0x702a5)
2186->0x6fdc8(0x6fe19)
2195->0x70372(0x70387) WebThreadLock, call 6fdc8.
2146->0x6f3cd(0x6f3f1) -> -[ReaderContext createArticleFinder]
978-> 0x38445(0x384f5) [BrowserController setShowingReader:animated]
122 -> 0x995c(0x99bc) ->
bShowing = [[BrowserController sharedBrowserController] isShowingReader];
[[BrowserController sharedBrowserController] setShowingReader:bShowing animated:YES]
b. 显示出内容
i.加载html文件
-> loadRequest (Reader~ipad.html)
2132 ->0x6ee1e (0x6ee96) [ReaderContext loadReaderDocument]
2118 ->0x6e85b (0x6e959) [ReaderContext createWebViewIfNeeded]
3491->0xa4053 (0xa4097) [TabDocument createBrowserReaderViewIfNeeded]
979 ->0x38549 (0x38610) [BrowserController showReaderForTabDocument]
978-> 0x38445(0x38526) [BrowserController setShowingReader:animated]
122 ->0x995c(0x99bc)
bShowing = [[BrowserController sharedBrowserController] isShowingReader];
[[BrowserController sharedBrowserController] setShowingReader:bShowing animated:YES]
ii. 在WebView允许修改window object时,执行阅读模式处理脚本
2205 -> 0x705ce (0x7066f)
2127 -> 0x6eb17 (0x6eb62) -[ReaderContext initReaderJSController:]
1296 -> 0x4952c (0x49588) [BrowserReaderView uiWebView:didClearWindowObject:forFrame]
iii. 页面加载后会执行JS:
<body class="preloading" οnlοad="ReaderJS.loaded();" οnscrοll="articleHasScrolled();">
iOS Safari阅读模式分析过程相关推荐
- iOS Safari阅读模式研究
这是一篇在2013年准备的资料,现在分享出来,供有需要的同学参考. 要点 (1) 阅读模式的检测 在frame加载完成后,触发一个timer来检测是否可以使用阅读模式.检测的方式是使用JavaScri ...
- iOS程序的Build过程
原文地址:http://beyondvincent.com/2013/11/21/2013-11-23-123-build-process/#1 声明: 1.本文是我在看完破船的文章之后进行的转载,内 ...
- python如何制作脚本_用python给自己做一款小说阅读器过程详解
前言 前一段时间书荒的时候,在喜马拉雅APP发现一个主播播讲的小说-大王饶命.听起来感觉很好笑,挺有意思的,但是只有前200张是免费的,后面就要收费.一章两毛钱,本来是想要买一下,发现说的进度比较慢而 ...
- ios html5 录音功能,HTML5 Audio 在 iOS Safari 上的有关问题
HTML5 Audio 在 iOS Safari 上的问题 最近接触一个移动短项目,做摇一摇的功能,然后摇的时候要有声音,摇中奖的时候也有声音,问题来了,iOS 5 不能用代码去触发播放声音,其实 A ...
- safari阅读模式_如何在Safari的阅读器模式下自动打开文章
safari阅读模式 Apple just made one of Safari's best features even better. Whether you're using an iPhone ...
- iOS App 的编译过程
在 iOS 开发的过程中,Xcode 为我们提供了非常完善的编译能力,正常情况下,我们只需要 Command + R 就可以将应用运行到设备上,即使打包也是一个相对愉快的过程. 但正如我们写代码无法避 ...
- safari阅读模式 html,safari浏览器阅读模式在哪里
在iPhone.iPad等中,Safari是浏览器是iOS自带的一款优秀浏览器,相比什么UC.QQ浏览器等体验更为出色,正是因为如此,果粉们基本很少使用第三方浏览器.今天,小编主要分享一个Safari ...
- safari阅读模式 html,safari浏览器阅读模式如何开启
Safari是浏览器是iOS中自带的一款优秀浏览器,相比其它UC.QQ浏览器等体验更为出色,因此果粉们基本很少使用第三方浏览器.今天,小编就为大家分享一个Safari浏览器小技巧,教大家开启Safar ...
- safari阅读模式 html,Safari阅读模式在哪?Safari阅读模式使用教程【详解】
在iPhone.iPad等中,Safari是浏览器是iOS自带的一款优秀浏览器,相比什么UC.QQ浏览器等体验更为出色,正是因为如此,果粉们基本很少使用第三方浏览器. 今天给大家分享一个Safari浏 ...
最新文章
- java gui 怎么添加背景图片_三分钟教你学会用java写客户端程序!!速进!!
- Java 10个调试技巧
- 如何用最短时间搞定酷炫可视化大屏?这款工具值得一看
- 团队作业9——第二次项目冲刺2(Beta阶段)
- JavaScript --- this
- java网络编程 个人心得
- Matlab线性规划(Linear Programming)
- python大作业外星人入侵_【python3小白上路系列】外星人入侵——开始
- iframe懒加载_懒加载是如何实现的?
- Java 集合List、Set、HashMap操作一(Array转List、Set排序、HashMap遍历、Set遍历、List遍历、HashMap大小长度、List打乱顺序)
- xUtils项目框架
- 小程序引发的深层思考
- CNN图像处理常用损失函数对比评测
- LWIP协议 | 理论基础知识解析
- Padavan安装使用ZeroTier实现组建虚拟局域网的方法
- html简介百度百科,outerHTML
- Vue-cli配置代理服务器,解决跨域请求问题
- Open Explorer Plugin for Eclipse (eclipse 插件 在ecli
- 万分之二用百分之怎么表示_百分比表示什么 什么是百分之多少是怎么算的?...
- DDR5内存条容量计算
热门文章
- 迷你世界箱子里物品无限取
- 在虚幻引擎4中播放视频文件超详细教程
- 请问深圳的准生证在哪办理?
- AcWing2279 网络战争 (01分数规划+网络流 最小割模型)
- Sqoop 实际应用及样例
- 社交电商如何运营推广?
- str_replace替换多个字符串
- python车牌识别系统抬杆_昆明车牌识别自动抬杆系统
- C# Winform画图
- 2019河南省第十二届ACM省赛原题题目及省赛榜单