iOS Safari阅读模式分析过程

简介: 本文为Safari阅读模式分析过程记录,没有做很好的整理。最终的输出见另一篇iOS Safari阅读模式研究。1. Break on evaluate  b JSC::evaluate(JSC::ExecState*, JSC::ScopeCh...
本文为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" onload="ReaderJS.loaded();" onscroll="articleHasScrolled();">  


目录
相关文章
|
20天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
2月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
51 2
|
2月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
141 3
|
1月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。
|
2月前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
3月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
【8月更文挑战第20天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据着重要的位置。本文将深入探讨这两种操作系统的开发环境,从编程语言到开发工具,从用户界面设计到性能优化,以及市场趋势对开发者选择的影响。我们旨在为读者提供一个全面的比较视角,帮助理解不同平台的优势与挑战,并为那些站在选择十字路口的开发者提供有价值的参考信息。
|
2月前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比分析
本文将探讨安卓和iOS这两大移动操作系统在开发环境上的差异,从工具、语言、框架到生态系统等多个角度进行比较。我们将深入了解各自的优势和劣势,并尝试为开发者提供一些实用的建议,以帮助他们根据自己的需求选择最适合的开发平台。
49 1
|
3月前
|
开发框架 Android开发 Swift
安卓与iOS应用开发对比分析
【8月更文挑战第20天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文将深入探讨这两大操作系统在开发环境、编程语言、用户界面设计、性能优化及市场分布等方面的差异和特点。通过比较分析,旨在为开发者提供一个宏观的视角,帮助他们根据项目需求和目标受众选择最合适的开发平台。同时,文章还将讨论跨平台开发框架的利与弊,以及它们如何影响着移动应用的开发趋势。
|
3月前
|
安全 搜索推荐 Android开发
安卓与iOS应用开发的对比分析
【8月更文挑战第20天】在移动应用开发领域,安卓和iOS两大平台各领风骚。本文通过深入探讨两者的开发环境、编程语言、用户界面设计、应用市场及分发机制等方面的差异,揭示了各自的优势和挑战。旨在为开发者提供决策支持,同时帮助理解为何某些应用可能优先选择在一个平台上发布。
48 2
|
3月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的大舞台上,安卓与iOS两大操作系统各占半壁江山。本文将深入浅出地比较两者的开发环境,从开发工具、编程语言到用户界面设计等多个维度进行剖析,旨在为初入行的开发者们提供一盏明灯,帮助他们选择适合自己的开发路径。通过实例分析和数据支持,我们将揭示这两个平台的独特优势和潜在挑战,以及它们如何影响应用的性能和用户体验。
69 1