Title: [271238] trunk
Revision
271238
Author
[email protected]
Date
2021-01-07 09:13:03 -0800 (Thu, 07 Jan 2021)

Log Message

ASSERTION FAILED: !m_messageReceiverMapCount under WebKit::SpeechRecognitionServer::~SpeechRecognitionServer()
https://bugs.webkit.org/show_bug.cgi?id=220404

Patch by Sihui Liu <[email protected]> on 2021-01-07
Reviewed by Youenn Fablet.

Source/WebKit:

API test: WebKit2.SpeechRecognitionPageIsDestroyed

* UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::destroySpeechRecognitionServer):

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm:
(-[SpeechRecognitionPermissionUIDelegate webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:]):
(-[SpeechRecognitionNavigationDelegate webView:decidePolicyForNavigationAction:preferences:decisionHandler:]):
(-[SpeechRecognitionNavigationDelegate webView:didFinishNavigation:]):
(TestWebKitAPI::TEST):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (271237 => 271238)


--- trunk/Source/WebKit/ChangeLog	2021-01-07 17:04:21 UTC (rev 271237)
+++ trunk/Source/WebKit/ChangeLog	2021-01-07 17:13:03 UTC (rev 271238)
@@ -1,3 +1,15 @@
+2021-01-07  Sihui Liu  <[email protected]>
+
+        ASSERTION FAILED: !m_messageReceiverMapCount under WebKit::SpeechRecognitionServer::~SpeechRecognitionServer()
+        https://bugs.webkit.org/show_bug.cgi?id=220404
+
+        Reviewed by Youenn Fablet.
+
+        API test: WebKit2.SpeechRecognitionPageIsDestroyed
+
+        * UIProcess/WebProcessProxy.cpp:
+        (WebKit::WebProcessProxy::destroySpeechRecognitionServer):
+
 2021-01-07  Kimmo Kinnunen  <[email protected]>
 
         WebKit IPC builtin messages should be part of the model

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (271237 => 271238)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2021-01-07 17:04:21 UTC (rev 271237)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2021-01-07 17:13:03 UTC (rev 271238)
@@ -1748,7 +1748,7 @@
 
 void WebProcessProxy::destroySpeechRecognitionServer(SpeechRecognitionServerIdentifier identifier)
 {
-    if (m_speechRecognitionServerMap.remove(identifier))
+    if (auto server = m_speechRecognitionServerMap.take(identifier))
         removeMessageReceiver(Messages::SpeechRecognitionServer::messageReceiverName(), identifier);
 }
 

Modified: trunk/Tools/ChangeLog (271237 => 271238)


--- trunk/Tools/ChangeLog	2021-01-07 17:04:21 UTC (rev 271237)
+++ trunk/Tools/ChangeLog	2021-01-07 17:13:03 UTC (rev 271238)
@@ -1,3 +1,16 @@
+2021-01-07  Sihui Liu  <[email protected]>
+
+        ASSERTION FAILED: !m_messageReceiverMapCount under WebKit::SpeechRecognitionServer::~SpeechRecognitionServer()
+        https://bugs.webkit.org/show_bug.cgi?id=220404
+
+        Reviewed by Youenn Fablet.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm:
+        (-[SpeechRecognitionPermissionUIDelegate webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:]):
+        (-[SpeechRecognitionNavigationDelegate webView:decidePolicyForNavigationAction:preferences:decisionHandler:]):
+        (-[SpeechRecognitionNavigationDelegate webView:didFinishNavigation:]):
+        (TestWebKitAPI::TEST):
+
 2021-01-07  Carlos Garcia Campos  <[email protected]>
 
         [GTK] Build failures with GTK4 3.99.5.1

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm (271237 => 271238)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm	2021-01-07 17:04:21 UTC (rev 271237)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm	2021-01-07 17:13:03 UTC (rev 271238)
@@ -28,6 +28,7 @@
 #import "PlatformUtilities.h"
 #import "TestWKWebView.h"
 #import <WebKit/WKPreferencesPrivate.h>
+#import <WebKit/WKProcessPoolPrivate.h>
 #import <WebKit/WKUIDelegatePrivate.h>
 #import <WebKit/WKWebView.h>
 #import <WebKit/WKWebViewConfigurationPrivate.h>
@@ -36,12 +37,15 @@
 static bool shouldGrantPermissionRequest = true;
 static bool permissionRequested = false;
 static bool receivedScriptMessage;
+static bool didFinishNavigation;
 static RetainPtr<WKScriptMessage> lastScriptMessage;
+static RetainPtr<WKWebView> createdWebView;
 
 @interface SpeechRecognitionPermissionUIDelegate : NSObject<WKUIDelegatePrivate>
 - (void)_webView:(WKWebView *)webView requestSpeechRecognitionPermissionForOrigin:(WKSecurityOrigin *)origin decisionHandler:(void (^)(BOOL))decisionHandler;
 - (void)_webView:(WKWebView *)webView requestMediaCaptureAuthorization: (_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL))decisionHandler;
 - (void)_webView:(WKWebView *)webView checkUserMediaPermissionForURL:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL frameIdentifier:(NSUInteger)frameIdentifier decisionHandler:(void (^)(NSString *salt, BOOL authorized))decisionHandler;
+- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
 @end
 
 @implementation SpeechRecognitionPermissionUIDelegate
@@ -60,6 +64,12 @@
 {
     decisionHandler(@"0x9876543210", YES);
 }
+
+- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
+{
+    createdWebView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration]);
+    return createdWebView.get();
+}
 @end
 
 @interface SpeechRecognitionMessageHandler : NSObject <WKScriptMessageHandler>
@@ -73,6 +83,23 @@
 }
 @end
 
+@interface SpeechRecognitionNavigationDelegate : NSObject <WKNavigationDelegate>
+- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction preferences:(WKWebpagePreferences *)preferences decisionHandler:(void (^)(WKNavigationActionPolicy, WKWebpagePreferences *))decisionHandler;
+- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
+@end
+
+@implementation SpeechRecognitionNavigationDelegate
+- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction preferences:(WKWebpagePreferences *)preferences decisionHandler:(void (^)(WKNavigationActionPolicy, WKWebpagePreferences *))decisionHandler
+{
+    decisionHandler(WKNavigationActionPolicyAllow, preferences);
+}
+
+- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
+{
+    didFinishNavigation = true;
+}
+@end
+
 namespace TestWebKitAPI {
 
 TEST(WebKit2, SpeechRecognitionUserPermissionPersistence)
@@ -207,6 +234,40 @@
     EXPECT_WK_STREQ(@"Error: not-allowed - Permission check failed", [lastScriptMessage body]);
 }
 
+TEST(WebKit2, SpeechRecognitionPageIsDestroyed)
+{
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    auto preferences = [configuration preferences];
+    preferences._mockCaptureDevicesEnabled = YES;
+    preferences._speechRecognitionEnabled = YES;
+    preferences._javascript_CanOpenWindowsAutomatically = YES;
+    auto delegate = adoptNS([[SpeechRecognitionPermissionUIDelegate alloc] init]);
+    auto navigationDelegate = adoptNS([[SpeechRecognitionNavigationDelegate alloc] init]);
+    shouldGrantPermissionRequest = true;
+    createdWebView = nullptr;
+
+    @autoreleasepool {
+        auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+        [webView setUIDelegate:delegate.get()];
+        [webView setNavigationDelegate:navigationDelegate.get()];
+
+        didFinishNavigation = false;
+        [webView loadHTMLString:@"<script>speechRecognition = new webkitSpeechRecognition(); speechRecognition.start(); speechRecognition = null;</script>" baseURL:[NSURL URLWithString:@"http://webkit.org"]];
+        TestWebKitAPI::Util::run(&didFinishNavigation);
+        [configuration.get().processPool _garbageCollectJavaScriptObjectsForTesting];
+
+        bool finishedRunningScript = false;
+        [webView evaluateJavaScript:@"open('http://webkit.org')" completionHandler: [&] (id result, NSError *error) {
+            finishedRunningScript = true;
+        }];
+        TestWebKitAPI::Util::run(&finishedRunningScript);
+    }
+
+    TestWebKitAPI::Util::sleep(0.5);
+
+    EXPECT_TRUE(!!createdWebView);
+}
+
 #endif
 
 } // namespace TestWebKitAPI
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to