Crash in FrameLoader::stopAllLoaders via [WebView dealloc] inside ~ObjCEventListener
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 Apr 2019 19:01:38 +0000 (19:01 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 Apr 2019 19:01:38 +0000 (19:01 +0000)
commit4e267ff4b4de85f8d0e8d0c9979222d9785d966d
tree558bdd33bd96b04af7f3929e3aa2f19758ef1a74
parentb656a914349ee85e9dc04e6d23345986f46e4952
Crash in FrameLoader::stopAllLoaders via [WebView dealloc] inside ~ObjCEventListener
https://bugs.webkit.org/show_bug.cgi?id=197079

Reviewed by Darin Adler.

Source/WebKitLegacy/mac:

The crash was caused by the fact deleting a node could end up deleting Objective-C event listeners
some of which may be the last object holding onto WebView itself in the middle of running GC.

It's not generally safe to delete Objective-C objects defiend by client applications since
dealloc could execute arbitrary code, and for instance, try to execute JavaScript or load new page.

Fixed the bug by delaying the dealloc'ing of Objective event listeners via autorelease pool.

* DOM/ObjCEventListener.mm:
(WebCore::ObjCEventListener::~ObjCEventListener):

Tools:

Added a regression test. It hits a slightly different backtrace but of the same class of issues.

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebKitLegacy/mac/DeallocWebViewInEventListener.mm: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244459 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/WebKitLegacy/mac/ChangeLog
Source/WebKitLegacy/mac/DOM/ObjCEventListener.mm
Tools/ChangeLog
Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
Tools/TestWebKitAPI/Tests/WebKitLegacy/mac/DeallocWebViewInEventListener.mm [new file with mode: 0644]