[iOS Debug] Assertion failure in NSComparisonResult UIContentSizeCategoryCompareToCat...
authorwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 19 Nov 2018 21:37:00 +0000 (21:37 +0000)
committerwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 19 Nov 2018 21:37:00 +0000 (21:37 +0000)
https://bugs.webkit.org/show_bug.cgi?id=190401
<rdar://problem/45195285>

Reviewed by Dean Jackson.

Work around sporadic UIKit assertions when running API tests that may present a UICalloutBar. Currently, UIKit
asks for the `UIApp`’s `-preferredContentSizeCategory` when showing or laying out the callout bar. However,
TestWebKitAPI lacks a UIApp altogether, and forcing one to be initialized via `UIApplicationInstantiateSingleton`
causes numerous other UIKit and WebKit assertions to be hit.

In lieu of TestWebKitAPI becoming a real UI application (see https://webkit.org/b/175204), simply don't allow
the callout bar to be initialized in TestWKWebView-based API tests. This encompasses all API tests which
have some chance of causing the callout bar to be shown by making a ranged text selections during the test.

* TestWebKitAPI/cocoa/TestWKWebView.mm:
(suppressUICalloutBar):
(-[TestWKWebView initWithFrame:configuration:addToWindow:]):
* TestWebKitAPI/ios/UIKitSPI.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@238380 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/TestWebKitAPI/cocoa/TestWKWebView.mm
Tools/TestWebKitAPI/ios/UIKitSPI.h

index 4e51d24..464d918 100644 (file)
@@ -1,3 +1,25 @@
+2018-11-19  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        [iOS Debug] Assertion failure in NSComparisonResult UIContentSizeCategoryCompareToCategory()
+        https://bugs.webkit.org/show_bug.cgi?id=190401
+        <rdar://problem/45195285>
+
+        Reviewed by Dean Jackson.
+
+        Work around sporadic UIKit assertions when running API tests that may present a UICalloutBar. Currently, UIKit
+        asks for the `UIApp`’s `-preferredContentSizeCategory` when showing or laying out the callout bar. However,
+        TestWebKitAPI lacks a UIApp altogether, and forcing one to be initialized via `UIApplicationInstantiateSingleton`
+        causes numerous other UIKit and WebKit assertions to be hit.
+
+        In lieu of TestWebKitAPI becoming a real UI application (see https://webkit.org/b/175204), simply don't allow
+        the callout bar to be initialized in TestWKWebView-based API tests. This encompasses all API tests which
+        have some chance of causing the callout bar to be shown by making a ranged text selections during the test.
+
+        * TestWebKitAPI/cocoa/TestWKWebView.mm:
+        (suppressUICalloutBar):
+        (-[TestWKWebView initWithFrame:configuration:addToWindow:]):
+        * TestWebKitAPI/ios/UIKitSPI.h:
+
 2018-11-19  Fujii Hironori  <Hironori.Fujii@sony.com>
 
         REGRESSION(r238016)[GTK][TestWebKitAPI][Ninja] TestJSC can't compile "Bytecodes.h: No such file or directory"
 2018-11-19  Fujii Hironori  <Hironori.Fujii@sony.com>
 
         REGRESSION(r238016)[GTK][TestWebKitAPI][Ninja] TestJSC can't compile "Bytecodes.h: No such file or directory"
index 6294de1..288153e 100644 (file)
@@ -28,6 +28,7 @@
 
 #if WK_API_ENABLED
 
 
 #if WK_API_ENABLED
 
+#import "ClassMethodSwizzler.h"
 #import "TestNavigationDelegate.h"
 #import "Utilities.h"
 
 #import "TestNavigationDelegate.h"
 #import "Utilities.h"
 
@@ -185,6 +186,9 @@ NSEventMask __simulated_forceClickAssociatedEventsMask(id self, SEL _cmd)
 @implementation TestWKWebView {
     RetainPtr<TestWKWebViewHostWindow> _hostWindow;
     RetainPtr<TestMessageHandler> _testHandler;
 @implementation TestWKWebView {
     RetainPtr<TestWKWebViewHostWindow> _hostWindow;
     RetainPtr<TestMessageHandler> _testHandler;
+#if PLATFORM(IOS_FAMILY)
+    std::unique_ptr<TestWebKitAPI::ClassMethodSwizzler> _sharedCalloutBarSwizzler;
+#endif
 }
 
 - (instancetype)initWithFrame:(CGRect)frame
 }
 
 - (instancetype)initWithFrame:(CGRect)frame
@@ -198,6 +202,15 @@ NSEventMask __simulated_forceClickAssociatedEventsMask(id self, SEL _cmd)
     return [self initWithFrame:frame configuration:configuration addToWindow:YES];
 }
 
     return [self initWithFrame:frame configuration:configuration addToWindow:YES];
 }
 
+#if PLATFORM(IOS_FAMILY)
+
+static UICalloutBar *suppressUICalloutBar()
+{
+    return nil;
+}
+
+#endif
+
 - (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration addToWindow:(BOOL)addToWindow
 {
     self = [super initWithFrame:frame configuration:configuration];
 - (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration addToWindow:(BOOL)addToWindow
 {
     self = [super initWithFrame:frame configuration:configuration];
@@ -207,6 +220,11 @@ NSEventMask __simulated_forceClickAssociatedEventsMask(id self, SEL _cmd)
     if (addToWindow)
         [self _setUpTestWindow:frame];
 
     if (addToWindow)
         [self _setUpTestWindow:frame];
 
+#if PLATFORM(IOS_FAMILY)
+    // FIXME: Remove this workaround once <https://webkit.org/b/175204> is fixed.
+    _sharedCalloutBarSwizzler = std::make_unique<TestWebKitAPI::ClassMethodSwizzler>([UICalloutBar class], @selector(sharedCalloutBar), reinterpret_cast<IMP>(suppressUICalloutBar));
+#endif
+
     return self;
 }
 
     return self;
 }
 
index daa29a0..984559e 100644 (file)
@@ -30,6 +30,7 @@
 #if USE(APPLE_INTERNAL_SDK)
 
 #import <UIKit/UIApplication_Private.h>
 #if USE(APPLE_INTERNAL_SDK)
 
 #import <UIKit/UIApplication_Private.h>
+#import <UIKit/UICalloutBar.h>
 #import <UIKit/UIKeyboard_Private.h>
 #import <UIKit/UIResponder_Private.h>
 #import <UIKit/UITextInputMultiDocument.h>
 #import <UIKit/UIKeyboard_Private.h>
 #import <UIKit/UIResponder_Private.h>
 #import <UIKit/UITextInputMultiDocument.h>
@@ -97,6 +98,10 @@ WTF_EXTERN_C_END
 - (NSDictionary *)_autofillContext;
 @end
 
 - (NSDictionary *)_autofillContext;
 @end
 
+@interface UICalloutBar : UIView
++ (UICalloutBar *)sharedCalloutBar;
+@end
+
 #if ENABLE(DRAG_SUPPORT)
 @protocol UIDragInteractionDelegate_Proposed_SPI_33146803 <UIDragInteractionDelegate>
 - (void)_dragInteraction:(UIDragInteraction *)interaction itemsForAddingToSession:(id <UIDragSession>)session withTouchAtPoint:(CGPoint)point completion:(void(^)(NSArray<UIDragItem *> *))completion;
 #if ENABLE(DRAG_SUPPORT)
 @protocol UIDragInteractionDelegate_Proposed_SPI_33146803 <UIDragInteractionDelegate>
 - (void)_dragInteraction:(UIDragInteraction *)interaction itemsForAddingToSession:(id <UIDragSession>)session withTouchAtPoint:(CGPoint)point completion:(void(^)(NSArray<UIDragItem *> *))completion;