OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 #import "ios/chrome/browser/tabs/tab_model.h" | 5 #import "ios/chrome/browser/tabs/tab_model.h" |
6 | 6 |
7 #include <cstdint> | 7 #include <cstdint> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 | 156 |
157 // Helper providing NSFastEnumeration implementation over the WebStateList. | 157 // Helper providing NSFastEnumeration implementation over the WebStateList. |
158 base::scoped_nsobject<WebStateListFastEnumerationHelper> | 158 base::scoped_nsobject<WebStateListFastEnumerationHelper> |
159 _fastEnumerationHelper; | 159 _fastEnumerationHelper; |
160 | 160 |
161 // Used to keep the Tabs alive while the corresponding WebStates are stored | 161 // Used to keep the Tabs alive while the corresponding WebStates are stored |
162 // in the WebStateList (as Tabs currently own their WebState). Remove once | 162 // in the WebStateList (as Tabs currently own their WebState). Remove once |
163 // WebState owns the associated Tab. | 163 // WebState owns the associated Tab. |
164 base::scoped_nsobject<NSMutableSet<Tab*>> _tabRetainer; | 164 base::scoped_nsobject<NSMutableSet<Tab*>> _tabRetainer; |
165 | 165 |
166 // WebStateListObserver bridges to react to modifications of the model (may | 166 // WebStateListObservers reacting to modifications of the model (may send |
167 // send notification, translate and forward events, update metrics, ...). | 167 // notification, translate and forward events, update metrics, ...). |
168 std::vector<std::unique_ptr<WebStateListObserver>> _observerBridges; | 168 std::vector<std::unique_ptr<WebStateListObserver>> _webStateListObservers; |
169 | 169 |
170 // The delegate for sync. | 170 // The delegate for sync. |
171 std::unique_ptr<TabModelSyncedWindowDelegate> _syncedWindowDelegate; | 171 std::unique_ptr<TabModelSyncedWindowDelegate> _syncedWindowDelegate; |
172 | 172 |
173 // Counters for metrics. | 173 // Counters for metrics. |
174 WebStateListMetricsObserver* _webStateListMetricsObserver; | 174 WebStateListMetricsObserver* _webStateListMetricsObserver; |
175 | 175 |
176 // Backs up property with the same name. | 176 // Backs up property with the same name. |
177 std::unique_ptr<TabUsageRecorder> _tabUsageRecorder; | 177 std::unique_ptr<TabUsageRecorder> _tabUsageRecorder; |
178 // Backs up property with the same name. | 178 // Backs up property with the same name. |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 - (void)dealloc { | 230 - (void)dealloc { |
231 DCHECK([_observers empty]); | 231 DCHECK([_observers empty]); |
232 // browserStateDestroyed should always have been called before destruction. | 232 // browserStateDestroyed should always have been called before destruction. |
233 DCHECK(!_browserState); | 233 DCHECK(!_browserState); |
234 | 234 |
235 [[NSNotificationCenter defaultCenter] removeObserver:self]; | 235 [[NSNotificationCenter defaultCenter] removeObserver:self]; |
236 | 236 |
237 // Clear weak pointer to WebStateListMetricsObserver before destroying it. | 237 // Clear weak pointer to WebStateListMetricsObserver before destroying it. |
238 _webStateListMetricsObserver = nullptr; | 238 _webStateListMetricsObserver = nullptr; |
239 | 239 |
240 // Unregister all listeners before closing all the tabs. | 240 // Unregister all observers before closing all the tabs. |
241 for (const auto& observerBridge : _observerBridges) | 241 for (const auto& webStateListObserver : _webStateListObservers) |
242 _webStateList->RemoveObserver(observerBridge.get()); | 242 _webStateList->RemoveObserver(webStateListObserver.get()); |
243 _observerBridges.clear(); | 243 _webStateListObservers.clear(); |
244 | 244 |
245 // Make sure the tabs do clean after themselves. It is important for | 245 // Make sure the tabs do clean after themselves. It is important for |
246 // removeObserver: to be called first otherwise a lot of unecessary work will | 246 // removeObserver: to be called first otherwise a lot of unecessary work will |
247 // happen on -closeAllTabs. | 247 // happen on -closeAllTabs. |
248 [self closeAllTabs]; | 248 [self closeAllTabs]; |
249 | 249 |
250 _clearPoliciesTaskTracker.TryCancelAll(); | 250 _clearPoliciesTaskTracker.TryCancelAll(); |
251 | 251 |
252 [super dealloc]; | 252 [super dealloc]; |
253 } | 253 } |
(...skipping 25 matching lines...) Expand all Loading... |
279 | 279 |
280 - (BOOL)isEmpty { | 280 - (BOOL)isEmpty { |
281 return _webStateList->empty(); | 281 return _webStateList->empty(); |
282 } | 282 } |
283 | 283 |
284 - (NSUInteger)count { | 284 - (NSUInteger)count { |
285 DCHECK_GE(_webStateList->count(), 0); | 285 DCHECK_GE(_webStateList->count(), 0); |
286 return static_cast<NSUInteger>(_webStateList->count()); | 286 return static_cast<NSUInteger>(_webStateList->count()); |
287 } | 287 } |
288 | 288 |
| 289 - (WebStateList*)webStateList { |
| 290 return _webStateList.get(); |
| 291 } |
| 292 |
289 - (instancetype)initWithSessionWindow:(SessionWindowIOS*)window | 293 - (instancetype)initWithSessionWindow:(SessionWindowIOS*)window |
290 sessionService:(SessionServiceIOS*)service | 294 sessionService:(SessionServiceIOS*)service |
291 browserState:(ios::ChromeBrowserState*)browserState { | 295 browserState:(ios::ChromeBrowserState*)browserState { |
292 if ((self = [super init])) { | 296 if ((self = [super init])) { |
293 _tabRetainer.reset([[NSMutableSet alloc] init]); | 297 _tabRetainer.reset([[NSMutableSet alloc] init]); |
294 _observers.reset([[TabModelObservers observers] retain]); | 298 _observers.reset([[TabModelObservers observers] retain]); |
295 | 299 |
296 _webStateListDelegate = | 300 _webStateListDelegate = |
297 base::MakeUnique<TabModelWebStateListDelegate>(self); | 301 base::MakeUnique<TabModelWebStateListDelegate>(self); |
298 _webStateList = base::MakeUnique<WebStateList>( | 302 _webStateList = base::MakeUnique<WebStateList>( |
(...skipping 13 matching lines...) Expand all Loading... |
312 // Set up the usage recorder before tabs are created. | 316 // Set up the usage recorder before tabs are created. |
313 _tabUsageRecorder = base::MakeUnique<TabUsageRecorder>(self); | 317 _tabUsageRecorder = base::MakeUnique<TabUsageRecorder>(self); |
314 } | 318 } |
315 _syncedWindowDelegate = | 319 _syncedWindowDelegate = |
316 base::MakeUnique<TabModelSyncedWindowDelegate>(self); | 320 base::MakeUnique<TabModelSyncedWindowDelegate>(self); |
317 | 321 |
318 // There must be a valid session service defined to consume session windows. | 322 // There must be a valid session service defined to consume session windows. |
319 DCHECK(service); | 323 DCHECK(service); |
320 _sessionService.reset([service retain]); | 324 _sessionService.reset([service retain]); |
321 | 325 |
322 _observerBridges.push_back( | 326 _webStateListObservers.push_back( |
323 base::MakeUnique<SnapshotCacheWebStateListObserver>( | 327 base::MakeUnique<SnapshotCacheWebStateListObserver>( |
324 [SnapshotCache sharedInstance])); | 328 [SnapshotCache sharedInstance])); |
325 if (_tabUsageRecorder) { | 329 if (_tabUsageRecorder) { |
326 _observerBridges.push_back( | 330 _webStateListObservers.push_back( |
327 base::MakeUnique<TabUsageRecorderWebStateListObserver>( | 331 base::MakeUnique<TabUsageRecorderWebStateListObserver>( |
328 _tabUsageRecorder.get())); | 332 _tabUsageRecorder.get())); |
329 } | 333 } |
330 _observerBridges.push_back(base::MakeUnique<TabParentingObserver>()); | 334 _webStateListObservers.push_back(base::MakeUnique<TabParentingObserver>()); |
331 _observerBridges.push_back(base::MakeUnique<WebStateListObserverBridge>( | 335 _webStateListObservers.push_back( |
332 [[TabModelSelectedTabObserver alloc] initWithTabModel:self])); | 336 base::MakeUnique<WebStateListObserverBridge>( |
333 _observerBridges.push_back(base::MakeUnique<WebStateListObserverBridge>( | 337 [[TabModelSelectedTabObserver alloc] initWithTabModel:self])); |
334 [[TabModelObserversBridge alloc] initWithTabModel:self | 338 _webStateListObservers.push_back( |
335 tabModelObservers:_observers.get()])); | 339 base::MakeUnique<WebStateListObserverBridge>( |
| 340 [[TabModelObserversBridge alloc] |
| 341 initWithTabModel:self |
| 342 tabModelObservers:_observers.get()])); |
336 | 343 |
337 auto webStateListMetricsObserver = | 344 auto webStateListMetricsObserver = |
338 base::MakeUnique<WebStateListMetricsObserver>(); | 345 base::MakeUnique<WebStateListMetricsObserver>(); |
339 _webStateListMetricsObserver = webStateListMetricsObserver.get(); | 346 _webStateListMetricsObserver = webStateListMetricsObserver.get(); |
340 _observerBridges.push_back(std::move(webStateListMetricsObserver)); | 347 _webStateListObservers.push_back(std::move(webStateListMetricsObserver)); |
341 | 348 |
342 for (const auto& observerBridge : _observerBridges) | 349 for (const auto& webStateListObserver : _webStateListObservers) |
343 _webStateList->AddObserver(observerBridge.get()); | 350 _webStateList->AddObserver(webStateListObserver.get()); |
344 | 351 |
345 if (window) { | 352 if (window) { |
346 DCHECK([_observers empty]); | 353 DCHECK([_observers empty]); |
347 // Restore the session and reset the session metrics (as the event have | 354 // Restore the session and reset the session metrics (as the event have |
348 // not been generated by the user but by a cold start cycle). | 355 // not been generated by the user but by a cold start cycle). |
349 [self restoreSessionWindow:window persistState:NO]; | 356 [self restoreSessionWindow:window persistState:NO]; |
350 [self resetSessionMetrics]; | 357 [self resetSessionMetrics]; |
351 } | 358 } |
352 | 359 |
353 // Register for resign active notification. | 360 // Register for resign active notification. |
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
959 } | 966 } |
960 | 967 |
961 // Called when UIApplicationWillEnterForegroundNotification is received. | 968 // Called when UIApplicationWillEnterForegroundNotification is received. |
962 - (void)applicationWillEnterForeground:(NSNotification*)notify { | 969 - (void)applicationWillEnterForeground:(NSNotification*)notify { |
963 if (_tabUsageRecorder) { | 970 if (_tabUsageRecorder) { |
964 _tabUsageRecorder->AppWillEnterForeground(); | 971 _tabUsageRecorder->AppWillEnterForeground(); |
965 } | 972 } |
966 } | 973 } |
967 | 974 |
968 @end | 975 @end |
OLD | NEW |