Index: ios/clean/chrome/browser/ui/web_contents/overlays/web_overlay_queue.mm |
diff --git a/ios/clean/chrome/browser/ui/web_contents/overlays/web_overlay_queue.mm b/ios/clean/chrome/browser/ui/web_contents/overlays/web_overlay_queue.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ba2faa73cc182c79f41ec9db0a46029754701dcb |
--- /dev/null |
+++ b/ios/clean/chrome/browser/ui/web_contents/overlays/web_overlay_queue.mm |
@@ -0,0 +1,85 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#import "ios/clean/chrome/browser/ui/web_contents/overlays/web_overlay_queue.h" |
+ |
+#include "base/logging.h" |
+#import "ios/clean/chrome/browser/ui/commands/web_overlay_commands.h" |
+#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h" |
+ |
+#if !defined(__has_feature) || !__has_feature(objc_arc) |
+#error "This file requires ARC support." |
+#endif |
+ |
+DEFINE_WEB_STATE_USER_DATA_KEY(WebOverlayQueue); |
+ |
+// static |
+void WebOverlayQueue::CreateForWebState( |
+ web::WebState* web_state, |
+ id<WebOverlaySchedulerCommands> dispatcher) { |
+ DCHECK(web_state); |
+ DCHECK(dispatcher); |
+ if (!FromWebState(web_state)) { |
+ std::unique_ptr<WebOverlayQueue> queue = |
+ base::WrapUnique(new WebOverlayQueue(web_state, dispatcher)); |
+ web_state->SetUserData(UserDataKey(), std::move(queue)); |
+ } |
+} |
+ |
+WebOverlayQueue::WebOverlayQueue(web::WebState* web_state, |
+ id<WebOverlaySchedulerCommands> dispatcher) |
+ : web_state_(web_state), |
+ dispatcher_(dispatcher), |
+ overlays_([[NSMutableArray alloc] init]), |
+ showing_overlay_(false) { |
+ DCHECK(web_state); |
+ DCHECK(dispatcher); |
+} |
+ |
+WebOverlayQueue::~WebOverlayQueue() {} |
+ |
+void WebOverlayQueue::AddWebOverlay( |
+ WebOverlayCoordinator* overlay_coordinator) { |
+ // Add the overlay coordinator to the queue, then notify the scheduler. |
+ DCHECK(overlay_coordinator); |
+ [overlays_ addObject:overlay_coordinator]; |
+ [dispatcher_ scheduleWebOverlayForWebState:web_state_]; |
+} |
+ |
+bool WebOverlayQueue::HasQueuedOverlays() const { |
+ return [overlays_ count] > 0U; |
+} |
+ |
+void WebOverlayQueue::StartNextOverlay(BrowserCoordinator* web_coordinator) { |
+ DCHECK(web_coordinator); |
+ DCHECK(HasQueuedOverlays()); |
+ DCHECK(!IsShowingOverlay()); |
+ [[overlays_ firstObject] startOverlayingWebCoordinator:web_coordinator]; |
+ showing_overlay_ = true; |
+} |
+ |
+bool WebOverlayQueue::IsShowingOverlay() const { |
+ return showing_overlay_; |
+} |
+ |
+void WebOverlayQueue::WebOverlayWasStopped( |
+ WebOverlayCoordinator* overlay_coordinator) { |
+ DCHECK(overlay_coordinator); |
+ DCHECK_EQ([overlays_ firstObject], overlay_coordinator); |
+ DCHECK(showing_overlay_); |
+ [overlays_ removeObjectAtIndex:0]; |
+ showing_overlay_ = false; |
+} |
+ |
+void WebOverlayQueue::CancelOverlays() { |
+ // Call the WebKit completion blocks for all queued overlays. |
+ for (WebOverlayCoordinator* overlay_coordinator in overlays_.get()) { |
+ [overlay_coordinator cancelWebKitCompletion]; |
+ } |
+ // Stop the currently visible one, if necessary. |
+ if (showing_overlay_) |
+ [[overlays_ firstObject] stop]; |
+ // Empty the queue. |
+ [overlays_ removeAllObjects]; |
+} |