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

Side by Side Diff: ios/chrome/browser/tabs/tab_model.mm

Issue 2854133002: [ios] ARCMigrate ios/chrome/browser/tabs/tab_model.mm to ARC. (Closed)
Patch Set: Address comments. Created 3 years, 7 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
« no previous file with comments | « ios/chrome/browser/tabs/BUILD.gn ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #import "base/mac/foundation_util.h" 13 #import "base/mac/foundation_util.h"
14 #import "base/mac/scoped_nsobject.h"
15 #include "base/metrics/histogram_macros.h" 14 #include "base/metrics/histogram_macros.h"
16 #include "base/metrics/user_metrics_action.h" 15 #include "base/metrics/user_metrics_action.h"
17 #include "base/strings/sys_string_conversions.h" 16 #include "base/strings/sys_string_conversions.h"
18 #include "base/task/cancelable_task_tracker.h" 17 #include "base/task/cancelable_task_tracker.h"
19 #include "components/sessions/core/serialized_navigation_entry.h" 18 #include "components/sessions/core/serialized_navigation_entry.h"
20 #include "components/sessions/core/session_id.h" 19 #include "components/sessions/core/session_id.h"
21 #include "components/sessions/core/tab_restore_service.h" 20 #include "components/sessions/core/tab_restore_service.h"
22 #include "components/sessions/ios/ios_live_tab.h" 21 #include "components/sessions/ios/ios_live_tab.h"
23 #include "ios/chrome/browser/browser_state/chrome_browser_state.h" 22 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
24 #include "ios/chrome/browser/chrome_url_constants.h" 23 #include "ios/chrome/browser/chrome_url_constants.h"
(...skipping 28 matching lines...) Expand all
53 #include "ios/web/public/certificate_policy_cache.h" 52 #include "ios/web/public/certificate_policy_cache.h"
54 #include "ios/web/public/navigation_item.h" 53 #include "ios/web/public/navigation_item.h"
55 #import "ios/web/public/navigation_manager.h" 54 #import "ios/web/public/navigation_manager.h"
56 #import "ios/web/public/serializable_user_data_manager.h" 55 #import "ios/web/public/serializable_user_data_manager.h"
57 #include "ios/web/public/web_state/session_certificate_policy_cache.h" 56 #include "ios/web/public/web_state/session_certificate_policy_cache.h"
58 #include "ios/web/public/web_thread.h" 57 #include "ios/web/public/web_thread.h"
59 #import "ios/web/web_state/ui/crw_web_controller.h" 58 #import "ios/web/web_state/ui/crw_web_controller.h"
60 #import "ios/web/web_state/web_state_impl.h" 59 #import "ios/web/web_state/web_state_impl.h"
61 #include "url/gurl.h" 60 #include "url/gurl.h"
62 61
62 #if !defined(__has_feature) || !__has_feature(objc_arc)
63 #error "This file requires ARC support."
64 #endif
65
63 NSString* const kTabModelTabWillStartLoadingNotification = 66 NSString* const kTabModelTabWillStartLoadingNotification =
64 @"kTabModelTabWillStartLoadingNotification"; 67 @"kTabModelTabWillStartLoadingNotification";
65 NSString* const kTabModelTabDidStartLoadingNotification = 68 NSString* const kTabModelTabDidStartLoadingNotification =
66 @"kTabModelTabDidStartLoadingNotification"; 69 @"kTabModelTabDidStartLoadingNotification";
67 NSString* const kTabModelTabDidFinishLoadingNotification = 70 NSString* const kTabModelTabDidFinishLoadingNotification =
68 @"kTabModelTabDidFinishLoadingNotification"; 71 @"kTabModelTabDidFinishLoadingNotification";
69 NSString* const kTabModelAllTabsDidCloseNotification = 72 NSString* const kTabModelAllTabsDidCloseNotification =
70 @"kTabModelAllTabsDidCloseNotification"; 73 @"kTabModelAllTabsDidCloseNotification";
71 NSString* const kTabModelTabDeselectedNotification = 74 NSString* const kTabModelTabDeselectedNotification =
72 @"kTabModelTabDeselectedNotification"; 75 @"kTabModelTabDeselectedNotification";
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 143
141 // Helper providing NSFastEnumeration implementation over the WebStateList. 144 // Helper providing NSFastEnumeration implementation over the WebStateList.
142 std::unique_ptr<WebStateListFastEnumerationHelper> _fastEnumerationHelper; 145 std::unique_ptr<WebStateListFastEnumerationHelper> _fastEnumerationHelper;
143 146
144 // WebStateListObservers reacting to modifications of the model (may send 147 // WebStateListObservers reacting to modifications of the model (may send
145 // notification, translate and forward events, update metrics, ...). 148 // notification, translate and forward events, update metrics, ...).
146 std::vector<std::unique_ptr<WebStateListObserver>> _webStateListObservers; 149 std::vector<std::unique_ptr<WebStateListObserver>> _webStateListObservers;
147 150
148 // Strong references to id<WebStateListObserving> wrapped by non-owning 151 // Strong references to id<WebStateListObserving> wrapped by non-owning
149 // WebStateListObserverBridges. 152 // WebStateListObserverBridges.
150 base::scoped_nsobject<NSArray<id<WebStateListObserving>>> 153 NSArray<id<WebStateListObserving>>* _retainedWebStateListObservers;
151 _retainedWebStateListObservers;
152 154
153 // The delegate for sync. 155 // The delegate for sync.
154 std::unique_ptr<TabModelSyncedWindowDelegate> _syncedWindowDelegate; 156 std::unique_ptr<TabModelSyncedWindowDelegate> _syncedWindowDelegate;
155 157
156 // Counters for metrics. 158 // Counters for metrics.
157 WebStateListMetricsObserver* _webStateListMetricsObserver; 159 WebStateListMetricsObserver* _webStateListMetricsObserver;
158 160
159 // Backs up property with the same name. 161 // Backs up property with the same name.
160 std::unique_ptr<TabUsageRecorder> _tabUsageRecorder; 162 std::unique_ptr<TabUsageRecorder> _tabUsageRecorder;
161 // Backs up property with the same name. 163 // Backs up property with the same name.
162 const SessionID _sessionID; 164 const SessionID _sessionID;
163 // Saves session's state. 165 // Saves session's state.
164 base::scoped_nsobject<SessionServiceIOS> _sessionService; 166 SessionServiceIOS* _sessionService;
165 // List of TabModelObservers. 167 // List of TabModelObservers.
166 base::scoped_nsobject<TabModelObservers> _observers; 168 TabModelObservers* _observers;
167 169
168 // Used to ensure thread-safety of the certificate policy management code. 170 // Used to ensure thread-safety of the certificate policy management code.
169 base::CancelableTaskTracker _clearPoliciesTaskTracker; 171 base::CancelableTaskTracker _clearPoliciesTaskTracker;
170 } 172 }
171 173
172 // Session window for the contents of the tab model. 174 // Session window for the contents of the tab model.
173 @property(nonatomic, readonly) SessionIOS* sessionForSaving; 175 @property(nonatomic, readonly) SessionIOS* sessionForSaving;
174 176
175 // Helper method that posts a notification with the given name with |tab|
176 // in the userInfo dictionary under the kTabModelTabKey.
177 - (void)postNotificationName:(NSString*)notificationName withTab:(Tab*)tab;
178
179 // Helper method to restore a saved session and control if the state should 177 // Helper method to restore a saved session and control if the state should
180 // be persisted or not. Used to implement the public -restoreSessionWindow: 178 // be persisted or not. Used to implement the public -restoreSessionWindow:
181 // method and restoring session in the initialiser. 179 // method and restoring session in the initialiser.
182 - (BOOL)restoreSessionWindow:(SessionWindowIOS*)window 180 - (BOOL)restoreSessionWindow:(SessionWindowIOS*)window
183 persistState:(BOOL)persistState; 181 persistState:(BOOL)persistState;
184 182
185 @end 183 @end
186 184
187 @implementation TabModel 185 @implementation TabModel
188 186
(...skipping 24 matching lines...) Expand all
213 // the WebStateList destructor is called. 211 // the WebStateList destructor is called.
214 @autoreleasepool { 212 @autoreleasepool {
215 [self closeAllTabs]; 213 [self closeAllTabs];
216 } 214 }
217 215
218 // Unregister all observers after closing all the tabs as some of them are 216 // Unregister all observers after closing all the tabs as some of them are
219 // required to properly clean up the Tabs. 217 // required to properly clean up the Tabs.
220 for (const auto& webStateListObserver : _webStateListObservers) 218 for (const auto& webStateListObserver : _webStateListObservers)
221 _webStateList->RemoveObserver(webStateListObserver.get()); 219 _webStateList->RemoveObserver(webStateListObserver.get());
222 _webStateListObservers.clear(); 220 _webStateListObservers.clear();
223 _retainedWebStateListObservers.reset(); 221 _retainedWebStateListObservers = nil;
224 222
225 _clearPoliciesTaskTracker.TryCancelAll(); 223 _clearPoliciesTaskTracker.TryCancelAll();
226
227 [super dealloc];
228 } 224 }
229 225
230 #pragma mark - Public methods 226 #pragma mark - Public methods
231 227
232 - (Tab*)currentTab { 228 - (Tab*)currentTab {
233 web::WebState* webState = _webStateList->GetActiveWebState(); 229 web::WebState* webState = _webStateList->GetActiveWebState();
234 return webState ? LegacyTabHelper::GetTabForWebState(webState) : nil; 230 return webState ? LegacyTabHelper::GetTabForWebState(webState) : nil;
235 } 231 }
236 232
237 - (void)setCurrentTab:(Tab*)newTab { 233 - (void)setCurrentTab:(Tab*)newTab {
(...skipping 24 matching lines...) Expand all
262 } 258 }
263 259
264 - (WebStateList*)webStateList { 260 - (WebStateList*)webStateList {
265 return _webStateList.get(); 261 return _webStateList.get();
266 } 262 }
267 263
268 - (instancetype)initWithSessionWindow:(SessionWindowIOS*)window 264 - (instancetype)initWithSessionWindow:(SessionWindowIOS*)window
269 sessionService:(SessionServiceIOS*)service 265 sessionService:(SessionServiceIOS*)service
270 browserState:(ios::ChromeBrowserState*)browserState { 266 browserState:(ios::ChromeBrowserState*)browserState {
271 if ((self = [super init])) { 267 if ((self = [super init])) {
272 _observers.reset([[TabModelObservers observers] retain]); 268 _observers = [TabModelObservers observers];
273 269
274 _webStateListDelegate = 270 _webStateListDelegate =
275 base::MakeUnique<TabModelWebStateListDelegate>(self); 271 base::MakeUnique<TabModelWebStateListDelegate>(self);
276 _webStateList = base::MakeUnique<WebStateList>(_webStateListDelegate.get()); 272 _webStateList = base::MakeUnique<WebStateList>(_webStateListDelegate.get());
277 273
278 _fastEnumerationHelper = 274 _fastEnumerationHelper =
279 base::MakeUnique<WebStateListFastEnumerationHelper>( 275 base::MakeUnique<WebStateListFastEnumerationHelper>(
280 _webStateList.get(), [[TabModelWebStateProxyFactory alloc] init]); 276 _webStateList.get(), [[TabModelWebStateProxyFactory alloc] init]);
281 277
282 _browserState = browserState; 278 _browserState = browserState;
283 DCHECK(_browserState); 279 DCHECK(_browserState);
284 280
285 // Normal browser states are the only ones to get tab restore. Tab sync 281 // Normal browser states are the only ones to get tab restore. Tab sync
286 // handles incognito browser states by filtering on profile, so it's 282 // handles incognito browser states by filtering on profile, so it's
287 // important to the backend code to always have a sync window delegate. 283 // important to the backend code to always have a sync window delegate.
288 if (!_browserState->IsOffTheRecord()) { 284 if (!_browserState->IsOffTheRecord()) {
289 // Set up the usage recorder before tabs are created. 285 // Set up the usage recorder before tabs are created.
290 _tabUsageRecorder = base::MakeUnique<TabUsageRecorder>(self); 286 _tabUsageRecorder = base::MakeUnique<TabUsageRecorder>(self);
291 } 287 }
292 _syncedWindowDelegate = base::MakeUnique<TabModelSyncedWindowDelegate>( 288 _syncedWindowDelegate = base::MakeUnique<TabModelSyncedWindowDelegate>(
293 _webStateList.get(), _sessionID); 289 _webStateList.get(), _sessionID);
294 290
295 // There must be a valid session service defined to consume session windows. 291 // There must be a valid session service defined to consume session windows.
296 DCHECK(service); 292 DCHECK(service);
297 _sessionService.reset([service retain]); 293 _sessionService = service;
298 294
299 base::scoped_nsobject<NSMutableArray<id<WebStateListObserving>>> 295 NSMutableArray<id<WebStateListObserving>>* retainedWebStateListObservers =
300 retainedWebStateListObservers([[NSMutableArray alloc] init]); 296 [[NSMutableArray alloc] init];
301 297
302 base::scoped_nsobject<TabModelClosingWebStateObserver> 298 TabModelClosingWebStateObserver* tabModelClosingWebStateObserver = [
303 tabModelClosingWebStateObserver([[TabModelClosingWebStateObserver alloc] 299 [TabModelClosingWebStateObserver alloc]
304 initWithTabModel:self 300 initWithTabModel:self
305 restoreService:IOSChromeTabRestoreServiceFactory:: 301 restoreService:IOSChromeTabRestoreServiceFactory::GetForBrowserState(
306 GetForBrowserState(_browserState)]); 302 _browserState)];
307 [retainedWebStateListObservers addObject:tabModelClosingWebStateObserver]; 303 [retainedWebStateListObservers addObject:tabModelClosingWebStateObserver];
308 304
309 _webStateListObservers.push_back( 305 _webStateListObservers.push_back(
310 base::MakeUnique<WebStateListObserverBridge>( 306 base::MakeUnique<WebStateListObserverBridge>(
311 tabModelClosingWebStateObserver)); 307 tabModelClosingWebStateObserver));
312 308
313 _webStateListObservers.push_back( 309 _webStateListObservers.push_back(
314 base::MakeUnique<SnapshotCacheWebStateListObserver>( 310 base::MakeUnique<SnapshotCacheWebStateListObserver>(
315 [SnapshotCache sharedInstance])); 311 [SnapshotCache sharedInstance]));
316 if (_tabUsageRecorder) { 312 if (_tabUsageRecorder) {
317 _webStateListObservers.push_back( 313 _webStateListObservers.push_back(
318 base::MakeUnique<TabUsageRecorderWebStateListObserver>( 314 base::MakeUnique<TabUsageRecorderWebStateListObserver>(
319 _tabUsageRecorder.get())); 315 _tabUsageRecorder.get()));
320 } 316 }
321 _webStateListObservers.push_back(base::MakeUnique<TabParentingObserver>()); 317 _webStateListObservers.push_back(base::MakeUnique<TabParentingObserver>());
322 318
323 base::scoped_nsobject<TabModelSelectedTabObserver> 319 TabModelSelectedTabObserver* tabModelSelectedTabObserver =
324 tabModelSelectedTabObserver( 320 [[TabModelSelectedTabObserver alloc] initWithTabModel:self];
325 [[TabModelSelectedTabObserver alloc] initWithTabModel:self]);
326 [retainedWebStateListObservers addObject:tabModelSelectedTabObserver]; 321 [retainedWebStateListObservers addObject:tabModelSelectedTabObserver];
327 _webStateListObservers.push_back( 322 _webStateListObservers.push_back(
328 base::MakeUnique<WebStateListObserverBridge>( 323 base::MakeUnique<WebStateListObserverBridge>(
329 tabModelSelectedTabObserver)); 324 tabModelSelectedTabObserver));
330 325
331 base::scoped_nsobject<TabModelObserversBridge> tabModelObserversBridge( 326 TabModelObserversBridge* tabModelObserversBridge =
332 [[TabModelObserversBridge alloc] initWithTabModel:self 327 [[TabModelObserversBridge alloc] initWithTabModel:self
333 tabModelObservers:_observers.get()]); 328 tabModelObservers:_observers];
334 [retainedWebStateListObservers addObject:tabModelObserversBridge]; 329 [retainedWebStateListObservers addObject:tabModelObserversBridge];
335 _webStateListObservers.push_back( 330 _webStateListObservers.push_back(
336 base::MakeUnique<WebStateListObserverBridge>(tabModelObserversBridge)); 331 base::MakeUnique<WebStateListObserverBridge>(tabModelObserversBridge));
337 332
338 auto webStateListMetricsObserver = 333 auto webStateListMetricsObserver =
339 base::MakeUnique<WebStateListMetricsObserver>(); 334 base::MakeUnique<WebStateListMetricsObserver>();
340 _webStateListMetricsObserver = webStateListMetricsObserver.get(); 335 _webStateListMetricsObserver = webStateListMetricsObserver.get();
341 _webStateListObservers.push_back(std::move(webStateListMetricsObserver)); 336 _webStateListObservers.push_back(std::move(webStateListMetricsObserver));
342 337
343 for (const auto& webStateListObserver : _webStateListObservers) 338 for (const auto& webStateListObserver : _webStateListObservers)
344 _webStateList->AddObserver(webStateListObserver.get()); 339 _webStateList->AddObserver(webStateListObserver.get());
345 _retainedWebStateListObservers.reset([retainedWebStateListObservers copy]); 340 _retainedWebStateListObservers = [retainedWebStateListObservers copy];
346 341
347 if (window) { 342 if (window) {
348 DCHECK([_observers empty]); 343 DCHECK([_observers empty]);
349 // Restore the session and reset the session metrics (as the event have 344 // Restore the session and reset the session metrics (as the event have
350 // not been generated by the user but by a cold start cycle). 345 // not been generated by the user but by a cold start cycle).
351 [self restoreSessionWindow:window persistState:NO]; 346 [self restoreSessionWindow:window persistState:NO];
352 [self resetSessionMetrics]; 347 [self resetSessionMetrics];
353 } 348 }
354 349
355 // Register for resign active notification. 350 // Register for resign active notification.
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 } 658 }
664 } 659 }
665 660
666 int tabCount = static_cast<int>(self.count); 661 int tabCount = static_cast<int>(self.count);
667 UMA_HISTOGRAM_CUSTOM_COUNTS("Tabs.TabCountPerLoad", tabCount, 1, 200, 50); 662 UMA_HISTOGRAM_CUSTOM_COUNTS("Tabs.TabCountPerLoad", tabCount, 1, 200, 50);
668 } 663 }
669 664
670 #pragma mark - NSFastEnumeration 665 #pragma mark - NSFastEnumeration
671 666
672 - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState*)state 667 - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState*)state
673 objects:(id*)objects 668 objects:(id __unsafe_unretained*)objects
rohitrao (ping after 24h) 2017/05/09 15:06:41 Why is this change necessary?
674 count:(NSUInteger)count { 669 count:(NSUInteger)count {
675 return [_fastEnumerationHelper->GetFastEnumeration() 670 return [_fastEnumerationHelper->GetFastEnumeration()
676 countByEnumeratingWithState:state 671 countByEnumeratingWithState:state
677 objects:objects 672 objects:objects
678 count:count]; 673 count:count];
679 } 674 }
680 675
681 #pragma mark - TabUsageRecorderDelegate 676 #pragma mark - TabUsageRecorderDelegate
682 677
683 - (NSUInteger)liveTabsCount { 678 - (NSUInteger)liveTabsCount {
684 NSUInteger count = 0; 679 NSUInteger count = 0;
685 for (Tab* tab in self) { 680 for (Tab* tab in self) {
686 if ([tab.webController isViewAlive]) 681 if ([tab.webController isViewAlive])
687 count++; 682 count++;
688 } 683 }
689 return count; 684 return count;
690 } 685 }
691 686
692 #pragma mark - Private methods 687 #pragma mark - Private methods
693 688
694 - (SessionIOS*)sessionForSaving { 689 - (SessionIOS*)sessionForSaving {
695 // Build the array of sessions. Copy the session objects as the saving will 690 // Build the array of sessions. Copy the session objects as the saving will
696 // be done on a separate thread. 691 // be done on a separate thread.
697 // TODO(crbug.com/661986): This could get expensive especially since this 692 // TODO(crbug.com/661986): This could get expensive especially since this
698 // window may never be saved (if another call comes in before the delay). 693 // window may never be saved (if another call comes in before the delay).
699 return [[SessionIOS alloc] 694 return [[SessionIOS alloc]
700 initWithWindows:@[ SerializeWebStateList(_webStateList.get()) ]]; 695 initWithWindows:@[ SerializeWebStateList(_webStateList.get()) ]];
701 } 696 }
702 697
703 - (void)postNotificationName:(NSString*)notificationName withTab:(Tab*)tab {
704 // A scoped_nsobject is used rather than an NSDictionary with static
705 // initializer dictionaryWithObject, because that approach adds the dictionary
706 // to the autorelease pool, which in turn holds Tab alive longer than
707 // necessary.
708 base::scoped_nsobject<NSDictionary> userInfo(
709 [[NSDictionary alloc] initWithObjectsAndKeys:tab, kTabModelTabKey, nil]);
710 [[NSNotificationCenter defaultCenter] postNotificationName:notificationName
711 object:self
712 userInfo:userInfo];
713 }
714
715 - (BOOL)restoreSessionWindow:(SessionWindowIOS*)window 698 - (BOOL)restoreSessionWindow:(SessionWindowIOS*)window
716 persistState:(BOOL)persistState { 699 persistState:(BOOL)persistState {
717 DCHECK(_browserState); 700 DCHECK(_browserState);
718 DCHECK(window); 701 DCHECK(window);
719 702
720 if (!window.sessions.count) 703 if (!window.sessions.count)
721 return NO; 704 return NO;
722 705
723 int oldCount = _webStateList->count(); 706 int oldCount = _webStateList->count();
724 DCHECK_GE(oldCount, 0); 707 DCHECK_GE(oldCount, 0);
725 708
726 web::WebState::CreateParams createParams(_browserState); 709 web::WebState::CreateParams createParams(_browserState);
727 DeserializeWebStateList( 710 DeserializeWebStateList(
728 _webStateList.get(), window, 711 _webStateList.get(), window,
729 base::BindRepeating(&web::WebState::CreateWithStorageSession, 712 base::BindRepeating(&web::WebState::CreateWithStorageSession,
730 createParams)); 713 createParams));
731 714
732 DCHECK_GT(_webStateList->count(), oldCount); 715 DCHECK_GT(_webStateList->count(), oldCount);
733 int restoredCount = _webStateList->count() - oldCount; 716 int restoredCount = _webStateList->count() - oldCount;
734 DCHECK_EQ(window.sessions.count, static_cast<NSUInteger>(restoredCount)); 717 DCHECK_EQ(window.sessions.count, static_cast<NSUInteger>(restoredCount));
735 718
736 scoped_refptr<web::CertificatePolicyCache> policyCache = 719 scoped_refptr<web::CertificatePolicyCache> policyCache =
737 web::BrowserState::GetCertificatePolicyCache(_browserState); 720 web::BrowserState::GetCertificatePolicyCache(_browserState);
738 721
739 base::scoped_nsobject<NSMutableArray<Tab*>> restoredTabs( 722 NSMutableArray<Tab*>* restoredTabs =
740 [[NSMutableArray alloc] initWithCapacity:window.sessions.count]); 723 [[NSMutableArray alloc] initWithCapacity:window.sessions.count];
741 724
742 for (int index = oldCount; index < _webStateList->count(); ++index) { 725 for (int index = oldCount; index < _webStateList->count(); ++index) {
743 web::WebState* webState = _webStateList->GetWebStateAt(index); 726 web::WebState* webState = _webStateList->GetWebStateAt(index);
744 Tab* tab = LegacyTabHelper::GetTabForWebState(webState); 727 Tab* tab = LegacyTabHelper::GetTabForWebState(webState);
745 728
746 webState->SetWebUsageEnabled(webUsageEnabled_ ? true : false); 729 webState->SetWebUsageEnabled(webUsageEnabled_ ? true : false);
747 tab.webController.usePlaceholderOverlay = YES; 730 tab.webController.usePlaceholderOverlay = YES;
748 731
749 // Restore the CertificatePolicyCache (note that webState is invalid after 732 // Restore the CertificatePolicyCache (note that webState is invalid after
750 // passing it via move semantic to -initWithWebState:model:). 733 // passing it via move semantic to -initWithWebState:model:).
751 UpdateCertificatePolicyCacheFromWebState(policyCache, [tab webState]); 734 UpdateCertificatePolicyCacheFromWebState(policyCache, [tab webState]);
752 [restoredTabs addObject:tab]; 735 [restoredTabs addObject:tab];
753 } 736 }
754 737
755 // If there was only one tab and it was the new tab page, clobber it. 738 // If there was only one tab and it was the new tab page, clobber it.
756 BOOL closedNTPTab = NO; 739 BOOL closedNTPTab = NO;
757 if (oldCount == 1) { 740 if (oldCount == 1) {
758 Tab* tab = [self tabAtIndex:0]; 741 Tab* tab = [self tabAtIndex:0];
759 if (tab.url == GURL(kChromeUINewTabURL)) { 742 if (tab.url == GURL(kChromeUINewTabURL)) {
760 [self closeTab:tab]; 743 [self closeTab:tab];
761 closedNTPTab = YES; 744 closedNTPTab = YES;
762 oldCount = 0; 745 oldCount = 0;
763 } 746 }
764 } 747 }
765 if (_tabUsageRecorder) 748 if (_tabUsageRecorder)
766 _tabUsageRecorder->InitialRestoredTabs(self.currentTab, restoredTabs.get()); 749 _tabUsageRecorder->InitialRestoredTabs(self.currentTab, restoredTabs);
767 return closedNTPTab; 750 return closedNTPTab;
768 } 751 }
769 752
770 #pragma mark - Notification Handlers 753 #pragma mark - Notification Handlers
771 754
772 // Called when UIApplicationWillResignActiveNotification is received. 755 // Called when UIApplicationWillResignActiveNotification is received.
773 - (void)willResignActive:(NSNotification*)notify { 756 - (void)willResignActive:(NSNotification*)notify {
774 if (webUsageEnabled_ && self.currentTab) { 757 if (webUsageEnabled_ && self.currentTab) {
775 [[SnapshotCache sharedInstance] 758 [[SnapshotCache sharedInstance]
776 willBeSavedGreyWhenBackgrounding:self.currentTab.tabId]; 759 willBeSavedGreyWhenBackgrounding:self.currentTab.tabId];
(...skipping 28 matching lines...) Expand all
805 } 788 }
806 789
807 // Called when UIApplicationWillEnterForegroundNotification is received. 790 // Called when UIApplicationWillEnterForegroundNotification is received.
808 - (void)applicationWillEnterForeground:(NSNotification*)notify { 791 - (void)applicationWillEnterForeground:(NSNotification*)notify {
809 if (_tabUsageRecorder) { 792 if (_tabUsageRecorder) {
810 _tabUsageRecorder->AppWillEnterForeground(); 793 _tabUsageRecorder->AppWillEnterForeground();
811 } 794 }
812 } 795 }
813 796
814 @end 797 @end
OLDNEW
« no previous file with comments | « ios/chrome/browser/tabs/BUILD.gn ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698