Index: ios/clean/chrome/browser/browser_coordinator.mm |
diff --git a/ios/clean/chrome/browser/browser_coordinator.mm b/ios/clean/chrome/browser/browser_coordinator.mm |
index 37c7928a0141b5260ea46b93fc05151e187a4a9e..42cd8a10d56ac280684d7b001e0ef18b6638f3da 100644 |
--- a/ios/clean/chrome/browser/browser_coordinator.mm |
+++ b/ios/clean/chrome/browser/browser_coordinator.mm |
@@ -63,9 +63,12 @@ |
} |
- (void)addChildCoordinator:(BrowserCoordinator*)coordinator { |
+ CHECK([self respondsToSelector:@selector(viewController)]) |
+ << "BrowserCoordinator implementations must provide a viewController " |
+ "property."; |
[self.childCoordinators addObject:coordinator]; |
- coordinator.browserState = self.browserState; |
coordinator.parentCoordinator = self; |
+ coordinator.browserState = self.browserState; |
coordinator.rootViewController = self.viewController; |
} |
@@ -89,25 +92,36 @@ |
} else if (self.childCoordinators.count == 1) { |
[[self.childCoordinators anyObject] |
addOverlayCoordinator:overlayCoordinator]; |
- } else { |
+ } else if (self.childCoordinators.count > 1) { |
CHECK(NO) << "Coordinators with multiple children must explicitly " |
<< "handle -addOverlayCoordinator: or return NO to " |
<< "-canAddOverlayCoordinator:"; |
} |
+ // If control reaches here, the terminal child of the coordinator hierarchy |
+ // has returned NO to -canAddOverlayCoordinator, so no overlay can be added. |
+ // This is by default a silent no-op. |
} |
- (void)removeOverlayCoordinator { |
BrowserCoordinator* overlay = self.overlayCoordinator; |
[overlay.parentCoordinator removeChildCoordinator:overlay]; |
+ overlay.overlaying = NO; |
} |
- (BOOL)canAddOverlayCoordinator:(BrowserCoordinator*)overlayCoordinator { |
+ // By default, a hierarchy with an overlay can't add a new one. |
+ // By default, coordinators with parents can't be added as overlays. |
// By default, coordinators with no other children can add an overlay. |
- return self.childCoordinators.count == 0; |
+ return self.overlayCoordinator == nil && |
+ overlayCoordinator.parentCoordinator == nil && |
+ self.childCoordinators.count == 0; |
} |
- (void)removeChildCoordinator:(BrowserCoordinator*)coordinator { |
+ if (![self.childCoordinators containsObject:coordinator]) |
+ return; |
[self.childCoordinators removeObject:coordinator]; |
+ coordinator.parentCoordinator = nil; |
} |
@end |