Changeset 282483 in webkit
- Timestamp:
- Sep 15, 2021, 6:02:18 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/WebProcess/WebCoreSupport/WebBroadcastChannelRegistry.cpp (modified) (1 diff)
-
Source/WebKit/WebProcess/WebCoreSupport/WebBroadcastChannelRegistry.h (modified) (1 diff)
-
Source/WebKit/WebProcess/WebProcess.cpp (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/NetworkProcess.mm (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r282464 r282483 1 2021-09-15 Chris Dumez <cdumez@apple.com> 2 3 Implement network process crash recovery for BroadcastChannel 4 https://bugs.webkit.org/show_bug.cgi?id=230236 5 6 Reviewed by Alex Christensen. 7 8 Have the WebBroadcastChannelRegistry register its BroadcastChannels with the network 9 process after a network process crash. This is useful so that cross-WebProcess 10 communication can keep happening via existing BroadcastChannel after a network process 11 crash. 12 13 * WebProcess/WebCoreSupport/WebBroadcastChannelRegistry.cpp: 14 (WebKit::WebBroadcastChannelRegistry::networkProcessCrashed): 15 * WebProcess/WebCoreSupport/WebBroadcastChannelRegistry.h: 16 * WebProcess/WebProcess.cpp: 17 (WebKit::WebProcess::networkProcessConnectionClosed): 18 1 19 2021-09-15 Devin Rousso <drousso@apple.com> 2 20 -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebBroadcastChannelRegistry.cpp
r282377 r282483 107 107 } 108 108 109 void WebBroadcastChannelRegistry::networkProcessCrashed() 110 { 111 for (auto& [origin, channelsForOrigin] : m_channelsPerOrigin) { 112 for (auto& name : channelsForOrigin.keys()) 113 networkProcessConnection().send(Messages::NetworkBroadcastChannelRegistry::RegisterChannel { origin, name }, 0); 114 } 115 } 116 109 117 } // namespace WebKit -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebBroadcastChannelRegistry.h
r282377 r282483 53 53 void postMessage(const WebCore::ClientOrigin&, const String& name, WebCore::BroadcastChannelIdentifier source, Ref<WebCore::SerializedScriptValue>&&, CompletionHandler<void()>&&) final; 54 54 55 void networkProcessCrashed(); 56 55 57 void didReceiveMessage(IPC::Connection&, IPC::Decoder&); 56 58 -
trunk/Source/WebKit/WebProcess/WebProcess.cpp
r282429 r282483 1196 1196 WebSocketStream::networkProcessCrashed(); 1197 1197 m_webSocketChannelManager.networkProcessCrashed(); 1198 m_broadcastChannelRegistry->networkProcessCrashed(); 1198 1199 1199 1200 if (m_libWebRTCNetwork) -
trunk/Tools/ChangeLog
r282482 r282483 1 2021-09-15 Chris Dumez <cdumez@apple.com> 2 3 Implement network process crash recovery for BroadcastChannel 4 https://bugs.webkit.org/show_bug.cgi?id=230236 5 6 Reviewed by Alex Christensen. 7 8 Add API test coverage. 9 10 * TestWebKitAPI/Tests/WebKitCocoa/NetworkProcess.mm: 11 (-[BroadcastChannelMessageHandler userContentController:didReceiveScriptMessage:]): 12 (TEST): 13 1 14 2021-09-15 Tim Horton <timothy_horton@apple.com> 2 15 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/NetworkProcess.mm
r280081 r282483 27 27 28 28 #import "HTTPServer.h" 29 #import "PlatformUtilities.h" 29 30 #import "TestWKWebView.h" 30 31 #import "Utilities.h" 31 32 #import <WebKit/WKProcessPoolPrivate.h> 33 #import <WebKit/WKScriptMessageHandler.h> 32 34 #import <WebKit/WKWebViewPrivate.h> 33 35 #import <WebKit/WKWebsiteDataStorePrivate.h> … … 193 195 TestWebKitAPI::Util::spinRunLoop(); 194 196 } 197 198 199 static Vector<RetainPtr<WKScriptMessage>> receivedMessages; 200 static bool receivedMessage = false; 201 202 @interface BroadcastChannelMessageHandler : NSObject <WKScriptMessageHandler> 203 @end 204 205 @implementation BroadcastChannelMessageHandler 206 - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message 207 { 208 receivedMessages.append(message); 209 receivedMessage = true; 210 } 211 @end 212 213 TEST(NetworkProcess, BroadcastChannelCrashRecovery) 214 { 215 auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]); 216 auto messageHandler = adoptNS([[BroadcastChannelMessageHandler alloc] init]); 217 [[webViewConfiguration userContentController] addScriptMessageHandler:messageHandler.get() name:@"test"]; 218 219 auto webView1 = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]); 220 auto webView2 = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]); 221 222 receivedMessage = false; 223 receivedMessages.clear(); 224 225 NSString *html = [NSString stringWithFormat:@"<script>let bc = new BroadcastChannel('test'); bc.onmessage = (msg) => { webkit.messageHandlers.test.postMessage(msg.data); };</script>"]; 226 NSURL *baseURL = [NSURL URLWithString:@"http://example.com/"]; 227 228 [webView1 synchronouslyLoadHTMLString:html baseURL:baseURL]; 229 [webView2 synchronouslyLoadHTMLString:html baseURL:baseURL]; 230 231 auto webPID1 = [webView1 _webProcessIdentifier]; 232 auto webPID2 = [webView2 _webProcessIdentifier]; 233 EXPECT_NE(webPID1, 0); 234 EXPECT_NE(webPID2, 0); 235 EXPECT_NE(webPID1, webPID2); 236 237 auto networkPID = [[WKWebsiteDataStore defaultDataStore] _networkProcessIdentifier]; 238 EXPECT_NE(networkPID, 0); 239 240 EXPECT_FALSE(receivedMessage); 241 EXPECT_TRUE(receivedMessages.isEmpty()); 242 243 // Test that initial communication from webView1 to webView2 works. 244 receivedMessage = false; 245 receivedMessages.clear(); 246 bool finishedRunningScript = false; 247 [webView1 evaluateJavaScript:@"bc.postMessage('foo')" completionHandler: [&] (id result, NSError *error) { 248 EXPECT_TRUE(!error); 249 finishedRunningScript = true; 250 }]; 251 TestWebKitAPI::Util::run(&finishedRunningScript); 252 253 TestWebKitAPI::Util::run(&receivedMessage); 254 TestWebKitAPI::Util::spinRunLoop(10); 255 256 EXPECT_EQ(receivedMessages.size(), 1U); 257 EXPECT_EQ([receivedMessages[0] webView], webView2); 258 EXPECT_WK_STREQ([receivedMessages[0] body], @"foo"); 259 260 // Test that initial communication from webView2 to webView1 works. 261 receivedMessage = false; 262 receivedMessages.clear(); 263 finishedRunningScript = false; 264 [webView2 evaluateJavaScript:@"bc.postMessage('bar')" completionHandler: [&] (id result, NSError *error) { 265 EXPECT_TRUE(!error); 266 finishedRunningScript = true; 267 }]; 268 TestWebKitAPI::Util::run(&finishedRunningScript); 269 270 TestWebKitAPI::Util::run(&receivedMessage); 271 TestWebKitAPI::Util::spinRunLoop(10); 272 273 EXPECT_EQ(receivedMessages.size(), 1U); 274 EXPECT_EQ([receivedMessages[0] webView], webView1); 275 EXPECT_WK_STREQ([receivedMessages[0] body], @"bar"); 276 277 // Kill the network process. 278 kill(networkPID, 9); 279 while ([[WKWebsiteDataStore defaultDataStore] _networkProcessIdentifier] == networkPID) 280 TestWebKitAPI::Util::spinRunLoop(10); 281 282 // Test that initial communication from webView1 to webView2 works. 283 receivedMessage = false; 284 receivedMessages.clear(); 285 finishedRunningScript = false; 286 [webView1 evaluateJavaScript:@"bc.postMessage('foo2')" completionHandler: [&] (id result, NSError *error) { 287 EXPECT_TRUE(!error); 288 finishedRunningScript = true; 289 }]; 290 TestWebKitAPI::Util::run(&finishedRunningScript); 291 292 TestWebKitAPI::Util::run(&receivedMessage); 293 TestWebKitAPI::Util::spinRunLoop(10); 294 295 EXPECT_EQ(receivedMessages.size(), 1U); 296 EXPECT_EQ([receivedMessages[0] webView], webView2); 297 EXPECT_WK_STREQ([receivedMessages[0] body], @"foo2"); 298 299 // Test that initial communication from webView2 to webView1 works. 300 receivedMessage = false; 301 receivedMessages.clear(); 302 finishedRunningScript = false; 303 [webView2 evaluateJavaScript:@"bc.postMessage('bar2')" completionHandler: [&] (id result, NSError *error) { 304 EXPECT_TRUE(!error); 305 finishedRunningScript = true; 306 }]; 307 TestWebKitAPI::Util::run(&finishedRunningScript); 308 309 TestWebKitAPI::Util::run(&receivedMessage); 310 TestWebKitAPI::Util::spinRunLoop(10); 311 312 EXPECT_EQ(receivedMessages.size(), 1U); 313 EXPECT_EQ([receivedMessages[0] webView], webView1); 314 EXPECT_WK_STREQ([receivedMessages[0] body], @"bar2"); 315 316 auto networkPID2 = [[WKWebsiteDataStore defaultDataStore] _networkProcessIdentifier]; 317 EXPECT_NE(networkPID2, 0); 318 EXPECT_NE(networkPID, networkPID2); 319 320 EXPECT_EQ(webPID1, [webView1 _webProcessIdentifier]); 321 EXPECT_EQ(webPID2, [webView2 _webProcessIdentifier]); 322 }
Note:
See TracChangeset
for help on using the changeset viewer.