Added |-cancelJavaScriptDialogsForWebController:| to UI delegate.

This is necessary to cancel enqueued JavaScript dialogs before their
associated web view is deallocated.

BUG=564916

Review URL: https://codereview.chromium.org/1504493002

Cr-Commit-Position: refs/heads/master@{#364268}
diff --git a/ios/web/public/web_state/crw_web_user_interface_delegate.h b/ios/web/public/web_state/crw_web_user_interface_delegate.h
index f293b2d..47cfa3e 100644
--- a/ios/web/public/web_state/crw_web_user_interface_delegate.h
+++ b/ios/web/public/web_state/crw_web_user_interface_delegate.h
@@ -49,6 +49,10 @@
                         completionHandler:
                             (void (^)(NSString* input))completionHandler;
 
+// Cancels any outstanding JavaScript dialogs requested by the functions above.
+- (void)cancelJavaScriptDialogsForWebController:
+    (CRWWebController*)webController;
+
 // Displays a context menu for DOM element. |point| and |view| represent the
 // location and UIView where the context menu was triggered by a user gesture.
 // |menuInfo| keys are defined in crw_context_menu_provider.h.
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 43b1f97..9d14095 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -691,6 +691,11 @@
   if (!self.webView)
     return;
 
+  SEL cancelDialogsSelector =
+      @selector(cancelJavaScriptDialogsForWebController:);
+  if ([self.UIDelegate respondsToSelector:cancelDialogsSelector])
+    [self.UIDelegate cancelJavaScriptDialogsForWebController:self];
+
   if (allowCache)
     _expectedReconstructionURL = [self currentNavigationURL];
   else
diff --git a/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm b/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm
index 6e5e4d7..3d0fcc6 100644
--- a/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm
+++ b/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm
@@ -943,10 +943,13 @@
 
 - (void)webViewWebProcessDidCrash {
   _webProcessIsDead = YES;
-  if ([self.delegate respondsToSelector:
-          @selector(webControllerWebProcessDidCrash:)]) {
+  SEL cancelDialogsSelector =
+      @selector(cancelJavaScriptDialogsForWebController:);
+  if ([self.UIDelegate respondsToSelector:cancelDialogsSelector])
+    [self.UIDelegate cancelJavaScriptDialogsForWebController:self];
+  SEL rendererCrashSelector = @selector(webControllerWebProcessDidCrash:);
+  if ([self.delegate respondsToSelector:rendererCrashSelector])
     [self.delegate webControllerWebProcessDidCrash:self];
-  }
 }
 
 - (void)queryPageReferrerPolicy:(void(^)(NSString*))responseHandler {