Dead lock in WebCore/WebThreadLock

Originator:plu
Number:rdar://31955525 Date Originated:2017-05-03
Status:Open Resolved:
Product:WebKit on iOS Product Version:iOS 10.3
Classification: Reproducible:Always
 
Area:
WebKit

Summary:
When UIWebView is executing some JavaScript it can run in a dead lock on the main thread, causing the whole application to hang. In the real world this is caused by some CPU intensive JavaScript. In the attached example project a simple while (true) { ... } loop in JavaScript is used to demonstrate the issue.

Steps to Reproduce:
1. Open attached project in Xcode 8.3.2
2. Run it on iPhone 7 10.3 Simulator
3. Tap on the "Open WebView" button
4. Wait 10 seconds
5. Tap on the back button
6. Wait 10 seconds
7. Tap again on the "Open WebView" button

Expected Results:
Open the WebView a second time.

Actual Results:
It does not open the WebView a second time. Instead the application hangs and is unresponsive.

You can pause the application at this point and get a stack trace of the main thread:

* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
  * frame #0: 0x0000000107ba0c22 libsystem_kernel.dylib`__psynch_mutexwait + 10
    frame #1: 0x0000000107bd5e6e libsystem_pthread.dylib`_pthread_mutex_lock_wait + 100
    frame #2: 0x0000000107bd358d libsystem_pthread.dylib`_pthread_mutex_lock_slow + 285
    frame #3: 0x000000010af466d2 WebCore`_WebTryThreadLock(bool) + 34
    frame #4: 0x000000010af47508 WebCore`WebThreadLock + 88
    frame #5: 0x00000001043fb58a UIKit`-[UIWebDocumentView viewportHandler:didChangeViewportSize:] + 56
    frame #6: 0x000000010444c083 UIKit`-[_UIWebViewportHandler update:] + 394
    frame #7: 0x00000001043fd991 UIKit`-[UIWebDocumentView setMinimumSize:updateCurrentViewportConfigurationSize:] + 105
    frame #8: 0x0000000104446133 UIKit`-[UIWebView _updateViewSettings] + 723
    frame #9: 0x0000000104445a9b UIKit`-[_UIWebViewScrollView setContentInset:] + 241
    frame #10: 0x000000010425c644 UIKit`-[UIViewController _setNavigationControllerContentInsetAdjustment:] + 573
    frame #11: 0x00000001042a1450 UIKit`-[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] + 804
    frame #12: 0x0000000104296f84 UIKit`__49-[UINavigationController _startCustomTransition:]_block_invoke + 246
    frame #13: 0x0000000104bf1dac UIKit`-[_UIViewControllerTransitionContext completeTransition:] + 102
    frame #14: 0x00000001040ab360 UIKit`__53-[_UINavigationParallaxTransition animateTransition:]_block_invoke.99 + 803
    frame #15: 0x000000010417bcd4 UIKit`-[UIViewAnimationBlockDelegate _didEndBlockAnimation:finished:context:] + 527
    frame #16: 0x000000010414ef07 UIKit`-[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 222
    frame #17: 0x000000010414f446 UIKit`-[UIViewAnimationState animationDidStop:finished:] + 136
    frame #18: 0x00000001096af68e QuartzCore`CA::Layer::run_animation_callbacks(void*) + 306
    frame #19: 0x000000010784305c libdispatch.dylib`_dispatch_client_callout + 8
    frame #20: 0x000000010782440b libdispatch.dylib`_dispatch_main_queue_callback_4CF + 411
    frame #21: 0x00000001069a0909 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    frame #22: 0x0000000106966ae4 CoreFoundation`__CFRunLoopRun + 2164
    frame #23: 0x0000000106966016 CoreFoundation`CFRunLoopRunSpecific + 406
    frame #24: 0x00000001087f5a24 GraphicsServices`GSEventRunModal + 62
    frame #25: 0x00000001040c30d4 UIKit`UIApplicationMain + 159
    frame #26: 0x000000010361e1a7 WebThreadDeadLock`main at AppDelegate.swift:12
    frame #27: 0x000000010788f65d libdyld.dylib`start + 1
    frame #28: 0x000000010788f65d libdyld.dylib`start + 1

Version:
Xcode 8.3.2, Mac OS 10.12.4

Notes:


Configuration:
iPhone 7 Simulator, iOS 10.3

Attachments:
'WebThreadDeadLock-master.zip' was successfully uploaded.
(see here: https://github.com/technology-ebay-de/WebThreadDeadLock)

Comments


Please note: Reports posted here will not necessarily be seen by Apple. All problems should be submitted at bugreport.apple.com before they are posted here. Please only post information for Radars that you have filed yourself, and please do not include Apple confidential information in your posts. Thank you!