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/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)]);
//