Title: [272326] trunk
Revision
272326
Author
[email protected]
Date
2021-02-03 10:34:36 -0800 (Wed, 03 Feb 2021)

Log Message

[iOS] delay `+[BKSMousePointerService sharedInstance]` so that it doesn't impact launch perf
https://bugs.webkit.org/show_bug.cgi?id=221298

Reviewed by Geoffrey Garen.

Source/WebKit:

* UIProcess/ios/WKMouseDeviceObserver.h:
* UIProcess/ios/WKMouseDeviceObserver.mm:
(-[WKMouseDeviceObserver init]): Added.
(-[WKMouseDeviceObserver startWithCompletionHandler:]): Added.
(-[WKMouseDeviceObserver start]):
(-[WKMouseDeviceObserver stop]):
(-[WKMouseDeviceObserver stopWithCompletionHandler:]): Added.

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/iOSMouseSupport.mm:
(iOSMouseSupport.MouseInitiallyDisconnected):
(iOSMouseSupport.MouseInitiallyConnected):
(iOSMouseSupport.MouseLaterDisconnected):
(iOSMouseSupport.MouseLaterConnected):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (272325 => 272326)


--- trunk/Source/WebKit/ChangeLog	2021-02-03 18:26:19 UTC (rev 272325)
+++ trunk/Source/WebKit/ChangeLog	2021-02-03 18:34:36 UTC (rev 272326)
@@ -1,3 +1,18 @@
+2021-02-03  Devin Rousso  <[email protected]>
+
+        [iOS] delay `+[BKSMousePointerService sharedInstance]` so that it doesn't impact launch perf
+        https://bugs.webkit.org/show_bug.cgi?id=221298
+
+        Reviewed by Geoffrey Garen.
+
+        * UIProcess/ios/WKMouseDeviceObserver.h:
+        * UIProcess/ios/WKMouseDeviceObserver.mm:
+        (-[WKMouseDeviceObserver init]): Added.
+        (-[WKMouseDeviceObserver startWithCompletionHandler:]): Added.
+        (-[WKMouseDeviceObserver start]):
+        (-[WKMouseDeviceObserver stop]):
+        (-[WKMouseDeviceObserver stopWithCompletionHandler:]): Added.
+
 2021-02-03  Youenn Fablet  <[email protected]>
 
         Make sure GPUProcess MediaRecorder handles correctly muted tracks

Modified: trunk/Source/WebKit/UIProcess/ios/WKMouseDeviceObserver.h (272325 => 272326)


--- trunk/Source/WebKit/UIProcess/ios/WKMouseDeviceObserver.h	2021-02-03 18:26:19 UTC (rev 272325)
+++ trunk/Source/WebKit/UIProcess/ios/WKMouseDeviceObserver.h	2021-02-03 18:34:36 UTC (rev 272326)
@@ -38,7 +38,9 @@
 - (instancetype)init NS_UNAVAILABLE;
 
 - (void)start;
+- (void)startWithCompletionHandler:(void (^)(void))completionHandler;
 - (void)stop;
+- (void)stopWithCompletionHandler:(void (^)(void))completionHandler;
 
 @property (nonatomic, readonly) BOOL hasMouseDevice;
 

Modified: trunk/Source/WebKit/UIProcess/ios/WKMouseDeviceObserver.mm (272325 => 272326)


--- trunk/Source/WebKit/UIProcess/ios/WKMouseDeviceObserver.mm	2021-02-03 18:26:19 UTC (rev 272325)
+++ trunk/Source/WebKit/UIProcess/ios/WKMouseDeviceObserver.mm	2021-02-03 18:34:36 UTC (rev 272326)
@@ -29,6 +29,8 @@
 #if HAVE(UIKIT_WITH_MOUSE_SUPPORT) && PLATFORM(IOS)
 
 #import "WebProcessProxy.h"
+#import <wtf/BlockPtr.h>
+#import <wtf/OSObjectPtr.h>
 #import <wtf/RetainPtr.h>
 
 @implementation WKMouseDeviceObserver {
@@ -35,6 +37,7 @@
     BOOL _hasMouseDevice;
     size_t _startCount;
     RetainPtr<id<BSInvalidatable>> _token;
+    OSObjectPtr<dispatch_queue_t> _deviceObserverTokenQueue;
 }
 
 + (WKMouseDeviceObserver *)sharedInstance
@@ -45,26 +48,54 @@
     return instance;
 }
 
+- (instancetype)init
+{
+    if (!(self = [super init]))
+        return nil;
+
+    _deviceObserverTokenQueue = adoptOSObject(dispatch_queue_create("WKMouseDeviceObserver _deviceObserverTokenQueue", DISPATCH_QUEUE_SERIAL));
+
+    return self;
+}
+
 #pragma mark - BKSMousePointerDeviceObserver state
 
 - (void)start
 {
+    [self startWithCompletionHandler:^{ }];
+}
+
+- (void)startWithCompletionHandler:(void (^)(void))completionHandler
+{
     if (++_startCount > 1)
         return;
 
-    ASSERT(!_token);
-    _token = [[BKSMousePointerService sharedInstance] addPointerDeviceObserver:self];
+    dispatch_async(_deviceObserverTokenQueue.get(), [strongSelf = retainPtr(self), completionHandler = makeBlockPtr(completionHandler)] {
+        ASSERT(!strongSelf->_token);
+        strongSelf->_token = [[BKSMousePointerService sharedInstance] addPointerDeviceObserver:strongSelf.get()];
+
+        completionHandler();
+    });
 }
 
 - (void)stop
 {
+    [self stopWithCompletionHandler:^{ }];
+}
+
+- (void)stopWithCompletionHandler:(void (^)(void))completionHandler
+{
     ASSERT(_startCount);
     if (!_startCount || --_startCount)
         return;
 
-    ASSERT(_token);
-    [_token invalidate];
-    _token = nil;
+    dispatch_async(_deviceObserverTokenQueue.get(), [strongSelf = retainPtr(self), completionHandler = makeBlockPtr(completionHandler)] {
+        ASSERT(strongSelf->_token);
+        [strongSelf->_token invalidate];
+        strongSelf->_token = nil;
+
+        completionHandler();
+    });
 }
 
 #pragma mark - BKSMousePointerDeviceObserver handlers

Modified: trunk/Tools/ChangeLog (272325 => 272326)


--- trunk/Tools/ChangeLog	2021-02-03 18:26:19 UTC (rev 272325)
+++ trunk/Tools/ChangeLog	2021-02-03 18:34:36 UTC (rev 272326)
@@ -1,3 +1,16 @@
+2021-02-03  Devin Rousso  <[email protected]>
+
+        [iOS] delay `+[BKSMousePointerService sharedInstance]` so that it doesn't impact launch perf
+        https://bugs.webkit.org/show_bug.cgi?id=221298
+
+        Reviewed by Geoffrey Garen.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/iOSMouseSupport.mm:
+        (iOSMouseSupport.MouseInitiallyDisconnected):
+        (iOSMouseSupport.MouseInitiallyConnected):
+        (iOSMouseSupport.MouseLaterDisconnected):
+        (iOSMouseSupport.MouseLaterConnected):
+
 2021-02-03  Alex Christensen  <[email protected]>
 
         Flaky API Test: TestWebKitAPI.WebKitLegacy.CrossPartitionFileSchemeAccess

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/iOSMouseSupport.mm (272325 => 272326)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/iOSMouseSupport.mm	2021-02-03 18:26:19 UTC (rev 272325)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/iOSMouseSupport.mm	2021-02-03 18:34:36 UTC (rev 272326)
@@ -306,7 +306,7 @@
 
 @interface WKMouseDeviceObserver
 + (WKMouseDeviceObserver *)sharedInstance;
-- (void)start;
+- (void)startWithCompletionHandler:(void (^)(void))completionHandler;
 - (void)_setHasMouseDeviceForTesting:(BOOL)hasMouseDevice;
 @end
 
@@ -313,7 +313,13 @@
 TEST(iOSMouseSupport, MouseInitiallyDisconnected)
 {
     WKMouseDeviceObserver *mouseDeviceObserver = [NSClassFromString(@"WKMouseDeviceObserver") sharedInstance];
-    [mouseDeviceObserver start];
+
+    __block bool didStartMouseDeviceObserver = false;
+    [mouseDeviceObserver startWithCompletionHandler:^{
+        didStartMouseDeviceObserver = true;
+    }];
+    TestWebKitAPI::Util::run(&didStartMouseDeviceObserver);
+
     [mouseDeviceObserver _setHasMouseDeviceForTesting:NO];
 
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
@@ -342,7 +348,13 @@
 TEST(iOSMouseSupport, MouseInitiallyConnected)
 {
     WKMouseDeviceObserver *mouseDeviceObserver = [NSClassFromString(@"WKMouseDeviceObserver") sharedInstance];
-    [mouseDeviceObserver start];
+
+    __block bool didStartMouseDeviceObserver = false;
+    [mouseDeviceObserver startWithCompletionHandler:^{
+        didStartMouseDeviceObserver = true;
+    }];
+    TestWebKitAPI::Util::run(&didStartMouseDeviceObserver);
+
     [mouseDeviceObserver _setHasMouseDeviceForTesting:YES];
 
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
@@ -371,7 +383,13 @@
 TEST(iOSMouseSupport, MouseLaterDisconnected)
 {
     WKMouseDeviceObserver *mouseDeviceObserver = [NSClassFromString(@"WKMouseDeviceObserver") sharedInstance];
-    [mouseDeviceObserver start];
+
+    __block bool didStartMouseDeviceObserver = false;
+    [mouseDeviceObserver startWithCompletionHandler:^{
+        didStartMouseDeviceObserver = true;
+    }];
+    TestWebKitAPI::Util::run(&didStartMouseDeviceObserver);
+
     [mouseDeviceObserver _setHasMouseDeviceForTesting:YES];
 
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
@@ -402,7 +420,13 @@
 TEST(iOSMouseSupport, MouseLaterConnected)
 {
     WKMouseDeviceObserver *mouseDeviceObserver = [NSClassFromString(@"WKMouseDeviceObserver") sharedInstance];
-    [mouseDeviceObserver start];
+
+    __block bool didStartMouseDeviceObserver = false;
+    [mouseDeviceObserver startWithCompletionHandler:^{
+        didStartMouseDeviceObserver = true;
+    }];
+    TestWebKitAPI::Util::run(&didStartMouseDeviceObserver);
+
     [mouseDeviceObserver _setHasMouseDeviceForTesting:NO];
 
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to