Title: [213570] trunk/Source/WebKit2
Revision
213570
Author
[email protected]
Date
2017-03-08 01:15:10 -0800 (Wed, 08 Mar 2017)

Log Message

UIViewController with WKWebView presented modally causes the presented UIViewController to be dismissed.
https://bugs.webkit.org/show_bug.cgi?id=165225

Patch by Brad Wright <[email protected]> on 2017-03-08
Reviewed by Wenson Hsieh.

The problem happens on an iPhone with a WKWebView inside a view controller presented modally. If the user selects an HTML file input
tag button, a UIDocumentMenuViewController will appear. Anything the user does next causes the entire modal view controller to get dismissed.

To fix this problem, I prevent the UIDocumentMenuViewController from being dismissed by not saving a pointer to it. The UIDocumentMenuViewController
always goes away by itself on any user interaction. Trying to dismiss the UIDocumentMenuViewController when it is already dismissed causes the modal view controller
to be dismissed.

* UIProcess/ios/forms/WKFileUploadPanel.mm:
(-[WKFileUploadPanel _cancel]):
(-[WKFileUploadPanel dismiss]):
(-[WKFileUploadPanel _showDocumentPickerMenu]):
(-[WKFileUploadPanel _presentMenuOptionForCurrentInterfaceIdiom:]):
(-[WKFileUploadPanel _presentForCurrentInterfaceIdiom:]): Deleted.

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (213569 => 213570)


--- trunk/Source/WebKit2/ChangeLog	2017-03-08 07:52:12 UTC (rev 213569)
+++ trunk/Source/WebKit2/ChangeLog	2017-03-08 09:15:10 UTC (rev 213570)
@@ -1,3 +1,24 @@
+2017-03-08  Brad Wright  <[email protected]>
+
+        UIViewController with WKWebView presented modally causes the presented UIViewController to be dismissed.
+        https://bugs.webkit.org/show_bug.cgi?id=165225
+        
+        Reviewed by Wenson Hsieh.
+
+        The problem happens on an iPhone with a WKWebView inside a view controller presented modally. If the user selects an HTML file input 
+        tag button, a UIDocumentMenuViewController will appear. Anything the user does next causes the entire modal view controller to get dismissed.
+
+        To fix this problem, I prevent the UIDocumentMenuViewController from being dismissed by not saving a pointer to it. The UIDocumentMenuViewController 
+        always goes away by itself on any user interaction. Trying to dismiss the UIDocumentMenuViewController when it is already dismissed causes the modal view controller
+        to be dismissed.
+
+        * UIProcess/ios/forms/WKFileUploadPanel.mm:
+        (-[WKFileUploadPanel _cancel]):
+        (-[WKFileUploadPanel dismiss]):
+        (-[WKFileUploadPanel _showDocumentPickerMenu]):
+        (-[WKFileUploadPanel _presentMenuOptionForCurrentInterfaceIdiom:]):
+        (-[WKFileUploadPanel _presentForCurrentInterfaceIdiom:]): Deleted.
+
 2017-03-08  Alexey Proskuryakov  <[email protected]>
 
         WebKit should not export dyld install name hints on watchOS and tvOS

Modified: trunk/Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm (213569 => 213570)


--- trunk/Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm	2017-03-08 07:52:12 UTC (rev 213569)
+++ trunk/Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm	2017-03-08 09:15:10 UTC (rev 213570)
@@ -327,7 +327,9 @@
 
 - (void)_cancel
 {
-    _listener->cancel();
+    if (_listener)
+        _listener->cancel();
+    
     [self _dispatchDidDismiss];
 }
 
@@ -386,7 +388,15 @@
 
 - (void)dismiss
 {
-    [self _dismissDisplayAnimated:NO];
+    // Dismiss any view controller that is being presented. This works for all types of view controllers, popovers, etc.
+    // If there is any kind of view controller presented on this view, it will be removed. 
+    
+    [[UIViewController _viewControllerForFullScreenPresentationFromView:_view] dismissViewControllerAnimated:NO completion:nil];
+    
+    [_presentationPopover setDelegate:nil];
+    _presentationPopover = nil;
+    _presentationViewController = nil;
+    
     [self _cancel];
 }
 
@@ -496,7 +506,9 @@
         }
     }
 
-    [self _presentForCurrentInterfaceIdiom:_documentMenuController.get()];
+    [self _presentMenuOptionForCurrentInterfaceIdiom:_documentMenuController.get()];
+    // Clear out the view controller we just presented. Don't save a reference to the UIDocumentMenuViewController as it is self dismissing.
+    _presentationViewController = nil;
 }
 
 #pragma mark - Image Picker
@@ -550,7 +562,7 @@
 
 #pragma mark - Presenting View Controllers
 
-- (void)_presentForCurrentInterfaceIdiom:(UIViewController *)viewController
+- (void)_presentMenuOptionForCurrentInterfaceIdiom:(UIViewController *)viewController
 {
     if (UICurrentUserInterfaceIdiomIsPad())
         [self _presentPopoverWithContentViewController:viewController animated:YES];
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to