Title: [215598] trunk
Revision
215598
Author
[email protected]
Date
2017-04-20 18:02:47 -0700 (Thu, 20 Apr 2017)

Log Message

WebContent process becomes unresponsive after returning nil from async version of -webView:createWebViewWithConfiguration:...
<rdar://problem/31739023> and https://bugs.webkit.org/show_bug.cgi?id=171090

Reviewed by Andy Estes.

Source/WebKit2:

* UIProcess/Cocoa/UIDelegate.mm:
(WebKit::UIDelegate::UIClient::createNewPageCommon): Handle the perfectly valid "nil webView" case correctly.

Tools:

* TestWebKitAPI/Tests/WebKit2/open-and-close-window.html:
* TestWebKitAPI/Tests/WebKit2Cocoa/OpenAndCloseWindow.mm:
(resetToConsistentState):
(-[OpenAndCloseWindowUIDelegate webViewDidClose:]):
(-[OpenAndCloseWindowUIDelegate webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:]):
(TEST):
(-[OpenAndCloseWindowUIDelegateAsync _webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:completionHandler:]):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (215597 => 215598)


--- trunk/Source/WebKit2/ChangeLog	2017-04-21 01:00:46 UTC (rev 215597)
+++ trunk/Source/WebKit2/ChangeLog	2017-04-21 01:02:47 UTC (rev 215598)
@@ -1,3 +1,13 @@
+2017-04-20  Brady Eidson  <[email protected]>
+
+        WebContent process becomes unresponsive after returning nil from async version of -webView:createWebViewWithConfiguration:...
+        <rdar://problem/31739023> and https://bugs.webkit.org/show_bug.cgi?id=171090
+
+        Reviewed by Andy Estes.
+
+        * UIProcess/Cocoa/UIDelegate.mm:
+        (WebKit::UIDelegate::UIClient::createNewPageCommon): Handle the perfectly valid "nil webView" case correctly.
+
 2017-04-20  Dan Bernstein  <[email protected]>
 
         Disable header postprocessing when building for Sierra

Modified: trunk/Source/WebKit2/UIProcess/Cocoa/UIDelegate.mm (215597 => 215598)


--- trunk/Source/WebKit2/UIProcess/Cocoa/UIDelegate.mm	2017-04-21 01:00:46 UTC (rev 215597)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/UIDelegate.mm	2017-04-21 01:02:47 UTC (rev 215598)
@@ -194,14 +194,15 @@
                 return;
             checker->didCallCompletionHandler();
 
-            if (!webView)
+            if (!webView) {
+                completionHandler(nullptr);
                 return;
+            }
 
             if ([webView->_configuration _relatedWebView] != relatedWebView.get())
                 [NSException raise:NSInternalInconsistencyException format:@"Returned WKWebView was not created with the given configuration."];
 
             completionHandler(webView->_page.get());
-
         }).get()];
 
         return nullptr;

Modified: trunk/Tools/ChangeLog (215597 => 215598)


--- trunk/Tools/ChangeLog	2017-04-21 01:00:46 UTC (rev 215597)
+++ trunk/Tools/ChangeLog	2017-04-21 01:02:47 UTC (rev 215598)
@@ -1,3 +1,18 @@
+2017-04-20  Brady Eidson  <[email protected]>
+
+        WebContent process becomes unresponsive after returning nil from async version of -webView:createWebViewWithConfiguration:...
+        <rdar://problem/31739023> and https://bugs.webkit.org/show_bug.cgi?id=171090
+
+        Reviewed by Andy Estes.
+
+        * TestWebKitAPI/Tests/WebKit2/open-and-close-window.html:
+        * TestWebKitAPI/Tests/WebKit2Cocoa/OpenAndCloseWindow.mm:
+        (resetToConsistentState):
+        (-[OpenAndCloseWindowUIDelegate webViewDidClose:]):
+        (-[OpenAndCloseWindowUIDelegate webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:]):
+        (TEST):
+        (-[OpenAndCloseWindowUIDelegateAsync _webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:completionHandler:]):
+
 2017-04-20  Wenson Hsieh  <[email protected]>
 
         [ios-simulator] PositionInformationTests API tests are timing out

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2/open-and-close-window.html (215597 => 215598)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit2/open-and-close-window.html	2017-04-21 01:00:46 UTC (rev 215597)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2/open-and-close-window.html	2017-04-21 01:02:47 UTC (rev 215598)
@@ -4,8 +4,10 @@
 <script>
 if (document.location.search === "?close-window")
     window.close();
-else
-    window.open("open-and-close-window.html?close-window");
+else {
+    if (!window.open("open-and-close-window.html?close-window"))
+        window.close();
+}
 </script>
 </head>
 </html>

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/OpenAndCloseWindow.mm (215597 => 215598)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/OpenAndCloseWindow.mm	2017-04-21 01:00:46 UTC (rev 215597)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/OpenAndCloseWindow.mm	2017-04-21 01:02:47 UTC (rev 215598)
@@ -42,7 +42,16 @@
 static RetainPtr<OpenAndCloseWindowUIDelegate> sharedUIDelegate;
 static RetainPtr<OpenAndCloseWindowUIDelegateAsync> sharedUIDelegateAsync;
 
+static void resetToConsistentState()
+{
+    isDone = false;
+    openedWebView = nil;
+    sharedUIDelegate = nil;
+    sharedUIDelegateAsync = nil;
+}
+
 @interface OpenAndCloseWindowUIDelegate : NSObject <WKUIDelegate>
+@property (nonatomic, assign) WKWebView *expectedClosingView;
 @end
 
 @implementation OpenAndCloseWindowUIDelegate
@@ -49,7 +58,7 @@
 
 - (void)webViewDidClose:(WKWebView *)webView
 {
-    EXPECT_EQ(openedWebView, webView);
+    EXPECT_EQ(_expectedClosingView, webView);
     isDone = true;
 }
 
@@ -57,6 +66,7 @@
 {
     openedWebView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration]);
     [openedWebView setUIDelegate:sharedUIDelegate.get()];
+    _expectedClosingView = openedWebView.get();
     return openedWebView.get();
 }
 
@@ -64,8 +74,7 @@
 
 TEST(WebKit2, OpenAndCloseWindow)
 {
-    openedWebView = nullptr;
-    isDone = false;
+    resetToConsistentState();
 
     RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
 
@@ -83,7 +92,7 @@
 @interface OpenAndCloseWindowUIDelegateAsync : OpenAndCloseWindowUIDelegate
 @property (nonatomic) BOOL shouldCallback;
 @property (nonatomic, assign) id savedCompletionHandler;
-
+@property (nonatomic) BOOL shouldCallbackWithNil;
 @end
 
 @implementation OpenAndCloseWindowUIDelegateAsync
@@ -103,11 +112,19 @@
 - (void)_webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures completionHandler:(void (^)(WKWebView *webView))completionHandler
 {
     if (_shouldCallback) {
-        dispatch_async(dispatch_get_main_queue(), ^ {
-            openedWebView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration]);
-            [openedWebView setUIDelegate:sharedUIDelegateAsync.get()];
-            completionHandler(openedWebView.get());
-        });
+        if (!_shouldCallbackWithNil) {
+            dispatch_async(dispatch_get_main_queue(), ^ {
+                openedWebView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration]);
+                [openedWebView setUIDelegate:sharedUIDelegateAsync.get()];
+                self.expectedClosingView = openedWebView.get();
+                completionHandler(openedWebView.get());
+            });
+        } else {
+            dispatch_async(dispatch_get_main_queue(), ^ {
+                self.expectedClosingView = webView;
+                completionHandler(nil);
+            });
+        }
         return;
     }
 
@@ -119,8 +136,7 @@
 
 TEST(WebKit2, OpenAndCloseWindowAsync)
 {
-    openedWebView = nullptr;
-    isDone = false;
+    resetToConsistentState();
 
     RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
 
@@ -136,11 +152,29 @@
     TestWebKitAPI::Util::run(&isDone);
 }
 
+TEST(WebKit2, OpenAsyncWithNil)
+{
+    resetToConsistentState();
+
+    RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+
+    sharedUIDelegateAsync = adoptNS([[OpenAndCloseWindowUIDelegateAsync alloc] init]);
+    sharedUIDelegateAsync.get().shouldCallback = YES;
+    sharedUIDelegateAsync.get().shouldCallbackWithNil = YES;
+    [webView setUIDelegate:sharedUIDelegateAsync.get()];
+
+    [webView configuration].preferences._javascript_CanOpenWindowsAutomatically = YES;
+
+    NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"open-and-close-window" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
+    [webView loadRequest:request];
+
+    TestWebKitAPI::Util::run(&isDone);
+}
+
 // https://bugs.webkit.org/show_bug.cgi?id=171083 - Try to figure out why this fails for some configs but not others, and resolve.
 //TEST(WebKit2, OpenAndCloseWindowAsyncCallbackException)
 //{
-//    openedWebView = nullptr;
-//    isDone = false;
+//    resetToConsistentState();
 //
 //    RetainPtr<WKWebView> webView = adoptNS([[WKWebView 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