Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(271)

Side by Side Diff: ios/clean/chrome/browser/browser_coordinator.mm

Issue 2626033002: [Clean] Add unittest target and BrowserCoordinator tests. (Closed)
Patch Set: Cleanup Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // ====== New Architecture ===== 5 // ====== New Architecture =====
6 // = This code is only used in the new iOS Chrome architecture. = 6 // = This code is only used in the new iOS Chrome architecture. =
7 // ============================================================================ 7 // ============================================================================
8 8
9 #import "base/logging.h" 9 #import "base/logging.h"
10 #import "ios/clean/chrome/browser/browser_coordinator+internal.h" 10 #import "ios/clean/chrome/browser/browser_coordinator+internal.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 56
57 @implementation BrowserCoordinator (Internal) 57 @implementation BrowserCoordinator (Internal)
58 // Concrete implementations must implement a |viewController| property. 58 // Concrete implementations must implement a |viewController| property.
59 @dynamic viewController; 59 @dynamic viewController;
60 60
61 - (NSSet*)children { 61 - (NSSet*)children {
62 return [self.childCoordinators copy]; 62 return [self.childCoordinators copy];
63 } 63 }
64 64
65 - (void)addChildCoordinator:(BrowserCoordinator*)coordinator { 65 - (void)addChildCoordinator:(BrowserCoordinator*)coordinator {
66 CHECK([self respondsToSelector:@selector(viewController)])
67 << "BrowserCoordinator implementations must provide a viewController "
68 "property.";
66 [self.childCoordinators addObject:coordinator]; 69 [self.childCoordinators addObject:coordinator];
70 coordinator.parentCoordinator = self;
67 coordinator.browserState = self.browserState; 71 coordinator.browserState = self.browserState;
68 coordinator.parentCoordinator = self;
69 coordinator.rootViewController = self.viewController; 72 coordinator.rootViewController = self.viewController;
70 } 73 }
71 74
72 - (BrowserCoordinator*)overlayCoordinator { 75 - (BrowserCoordinator*)overlayCoordinator {
73 if (self.overlaying) 76 if (self.overlaying)
74 return self; 77 return self;
75 for (BrowserCoordinator* child in self.children) { 78 for (BrowserCoordinator* child in self.children) {
76 BrowserCoordinator* overlay = child.overlayCoordinator; 79 BrowserCoordinator* overlay = child.overlayCoordinator;
77 if (overlay) 80 if (overlay)
78 return overlay; 81 return overlay;
79 } 82 }
80 return nil; 83 return nil;
81 } 84 }
82 85
83 - (void)addOverlayCoordinator:(BrowserCoordinator*)overlayCoordinator { 86 - (void)addOverlayCoordinator:(BrowserCoordinator*)overlayCoordinator {
84 // If this object has no children, then add |overlayCoordinator| as a child 87 // If this object has no children, then add |overlayCoordinator| as a child
85 // and mark it as such. 88 // and mark it as such.
86 if ([self canAddOverlayCoordinator:overlayCoordinator]) { 89 if ([self canAddOverlayCoordinator:overlayCoordinator]) {
87 [self addChildCoordinator:overlayCoordinator]; 90 [self addChildCoordinator:overlayCoordinator];
88 overlayCoordinator.overlaying = YES; 91 overlayCoordinator.overlaying = YES;
89 } else if (self.childCoordinators.count == 1) { 92 } else if (self.childCoordinators.count == 1) {
90 [[self.childCoordinators anyObject] 93 [[self.childCoordinators anyObject]
91 addOverlayCoordinator:overlayCoordinator]; 94 addOverlayCoordinator:overlayCoordinator];
92 } else { 95 } else if (self.childCoordinators.count > 1) {
93 CHECK(NO) << "Coordinators with multiple children must explicitly " 96 CHECK(NO) << "Coordinators with multiple children must explicitly "
94 << "handle -addOverlayCoordinator: or return NO to " 97 << "handle -addOverlayCoordinator: or return NO to "
95 << "-canAddOverlayCoordinator:"; 98 << "-canAddOverlayCoordinator:";
96 } 99 }
100 // If control reaches here, the terminal child of the coordinator hierarchy
101 // has returned NO to -canAddOverlayCoordinator, so no overlay can be added.
102 // This is by default a silent no-op.
97 } 103 }
98 104
99 - (void)removeOverlayCoordinator { 105 - (void)removeOverlayCoordinator {
100 BrowserCoordinator* overlay = self.overlayCoordinator; 106 BrowserCoordinator* overlay = self.overlayCoordinator;
101 [overlay.parentCoordinator removeChildCoordinator:overlay]; 107 [overlay.parentCoordinator removeChildCoordinator:overlay];
108 overlay.overlaying = NO;
102 } 109 }
103 110
104 - (BOOL)canAddOverlayCoordinator:(BrowserCoordinator*)overlayCoordinator { 111 - (BOOL)canAddOverlayCoordinator:(BrowserCoordinator*)overlayCoordinator {
112 // By default, a hierarchy with an overlay can't add a new one.
113 // By default, coordinators with parents can't be added as overlays.
105 // By default, coordinators with no other children can add an overlay. 114 // By default, coordinators with no other children can add an overlay.
lpromero 2017/01/11 13:29:25 All this logic should be documented in a header or
marq (ping after 24h) 2017/01/11 14:06:25 I'll update the header.
106 return self.childCoordinators.count == 0; 115 return self.overlayCoordinator == nil &&
116 overlayCoordinator.parentCoordinator == nil &&
117 self.childCoordinators.count == 0;
107 } 118 }
108 119
109 - (void)removeChildCoordinator:(BrowserCoordinator*)coordinator { 120 - (void)removeChildCoordinator:(BrowserCoordinator*)coordinator {
121 if (![self.childCoordinators containsObject:coordinator])
122 return;
110 [self.childCoordinators removeObject:coordinator]; 123 [self.childCoordinators removeObject:coordinator];
124 coordinator.parentCoordinator = nil;
111 } 125 }
112 126
113 @end 127 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698