Index: ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm |
diff --git a/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm b/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm |
index 6198cab7d5b55770b97724151373fdd9f7165066..af3bc51138c33c1dc6d9161b1cfc9f89a3b3fa68 100644 |
--- a/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm |
+++ b/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm |
@@ -7,8 +7,10 @@ |
#include "base/mac/foundation_util.h" |
#include "base/memory/ptr_util.h" |
#import "ios/clean/chrome/browser/ui/commands/context_menu_commands.h" |
+#import "ios/clean/chrome/browser/ui/commands/web_overlay_commands.h" |
#import "ios/clean/chrome/browser/ui/context_menu/context_menu_context_impl.h" |
#import "ios/clean/chrome/browser/ui/context_menu/web_context_menu_coordinator.h" |
+#import "ios/clean/chrome/browser/ui/web_contents/overlays/web_overlay_queue.h" |
#import "ios/clean/chrome/browser/ui/web_contents/web_contents_mediator.h" |
#import "ios/clean/chrome/browser/ui/web_contents/web_contents_view_controller.h" |
#import "ios/shared/chrome/browser/ui/browser_list/browser.h" |
@@ -22,11 +24,21 @@ |
#error "This file requires ARC support." |
#endif |
-@interface WebCoordinator ()<ContextMenuCommands, CRWWebStateDelegate> { |
+@interface WebCoordinator ()<ContextMenuCommands, |
+ CRWWebStateDelegate, |
+ WebOverlayPresentationCommands> { |
std::unique_ptr<web::WebStateDelegateBridge> _webStateDelegate; |
} |
@property(nonatomic, strong) WebContentsViewController* viewController; |
@property(nonatomic, strong) WebContentsMediator* mediator; |
+ |
+// Lazily creates a WebJavaScriptDialogPresenter and WebOverlayQueue for the |
+// WebState. |
+- (void)createDialogHelpers; |
+ |
+// Starts the next overlay in |webState|'s WebOverlayQueue. |
+- (void)startNextWebOverlay; |
+ |
@end |
@implementation WebCoordinator |
@@ -50,13 +62,21 @@ - (void)setWebState:(web::WebState*)webState { |
} |
- (void)start { |
+ // Create the view controller and start it. |
self.viewController = [[WebContentsViewController alloc] init]; |
self.mediator.consumer = self.viewController; |
self.mediator.webStateList = &self.browser->web_state_list(); |
[super start]; |
+ // Register for overlay commands and start the next overlay. |
+ [self.browser->dispatcher() |
+ startDispatchingToTarget:self |
+ forProtocol:@protocol(WebOverlayPresentationCommands)]; |
+ [self createDialogHelpers]; |
+ [self startNextWebOverlay]; |
} |
- (void)stop { |
+ [self.browser->dispatcher() stopDispatchingToTarget:self]; |
[super stop]; |
[self.mediator disconnect]; |
} |
@@ -114,4 +134,25 @@ - (BOOL)webState:(web::WebState*)webState |
return YES; |
} |
+#pragma mark - WebOverlayPresentationCommands |
+ |
+- (void)startNextWebOverlayForWebState:(web::WebState*)webState { |
+ DCHECK_EQ(self.webState, webState); |
+ [self startNextWebOverlay]; |
+} |
+ |
+#pragma mark - |
+ |
+- (void)createDialogHelpers { |
+ id<WebOverlaySchedulerCommands> overlayDispatcher = |
+ static_cast<id<WebOverlaySchedulerCommands>>(self.browser->dispatcher()); |
+ WebOverlayQueue::CreateForWebState(self.webState, overlayDispatcher); |
+} |
+ |
+- (void)startNextWebOverlay { |
+ WebOverlayQueue* queue = WebOverlayQueue::FromWebState(self.webState); |
+ if (queue->HasQueuedOverlays() && !queue->IsShowingOverlay()) |
+ queue->StartNextOverlay(self); |
+} |
+ |
@end |