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

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

Issue 2809543003: [ios] Change WebStateListObserverBridge to use weak reference. (Closed)
Patch Set: Rebase. Created 3 years, 8 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 | « no previous file | ios/chrome/browser/web_state_list/web_state_list_fast_enumeration_helper.mm » ('j') | 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
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 std::unique_ptr<WebStateList> _webStateList; 138 std::unique_ptr<WebStateList> _webStateList;
139 139
140 // Helper providing NSFastEnumeration implementation over the WebStateList. 140 // Helper providing NSFastEnumeration implementation over the WebStateList.
141 base::scoped_nsobject<WebStateListFastEnumerationHelper> 141 base::scoped_nsobject<WebStateListFastEnumerationHelper>
142 _fastEnumerationHelper; 142 _fastEnumerationHelper;
143 143
144 // WebStateListObservers reacting to modifications of the model (may send 144 // WebStateListObservers reacting to modifications of the model (may send
145 // notification, translate and forward events, update metrics, ...). 145 // notification, translate and forward events, update metrics, ...).
146 std::vector<std::unique_ptr<WebStateListObserver>> _webStateListObservers; 146 std::vector<std::unique_ptr<WebStateListObserver>> _webStateListObservers;
147 147
148 // Strong references to id<WebStateListObserving> wrapped by non-owning
149 // WebStateListObserverBridges.
150 base::scoped_nsobject<NSArray<id<WebStateListObserving>>>
151 _retainedWebStateListObservers;
152
148 // The delegate for sync. 153 // The delegate for sync.
149 std::unique_ptr<TabModelSyncedWindowDelegate> _syncedWindowDelegate; 154 std::unique_ptr<TabModelSyncedWindowDelegate> _syncedWindowDelegate;
150 155
151 // Counters for metrics. 156 // Counters for metrics.
152 WebStateListMetricsObserver* _webStateListMetricsObserver; 157 WebStateListMetricsObserver* _webStateListMetricsObserver;
153 158
154 // Backs up property with the same name. 159 // Backs up property with the same name.
155 std::unique_ptr<TabUsageRecorder> _tabUsageRecorder; 160 std::unique_ptr<TabUsageRecorder> _tabUsageRecorder;
156 // Backs up property with the same name. 161 // Backs up property with the same name.
157 const SessionID _sessionID; 162 const SessionID _sessionID;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 // Clear weak pointer to WebStateListMetricsObserver before destroying it. 206 // Clear weak pointer to WebStateListMetricsObserver before destroying it.
202 _webStateListMetricsObserver = nullptr; 207 _webStateListMetricsObserver = nullptr;
203 208
204 [self closeAllTabs]; 209 [self closeAllTabs];
205 210
206 // Unregister all observers after closing all the tabs as some of them are 211 // Unregister all observers after closing all the tabs as some of them are
207 // required to properly clean up the Tabs. 212 // required to properly clean up the Tabs.
208 for (const auto& webStateListObserver : _webStateListObservers) 213 for (const auto& webStateListObserver : _webStateListObservers)
209 _webStateList->RemoveObserver(webStateListObserver.get()); 214 _webStateList->RemoveObserver(webStateListObserver.get());
210 _webStateListObservers.clear(); 215 _webStateListObservers.clear();
216 _retainedWebStateListObservers.reset();
211 217
212 _clearPoliciesTaskTracker.TryCancelAll(); 218 _clearPoliciesTaskTracker.TryCancelAll();
213 219
214 [super dealloc]; 220 [super dealloc];
215 } 221 }
216 222
217 #pragma mark - Public methods 223 #pragma mark - Public methods
218 224
219 - (Tab*)currentTab { 225 - (Tab*)currentTab {
220 web::WebState* webState = _webStateList->GetActiveWebState(); 226 web::WebState* webState = _webStateList->GetActiveWebState();
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 // Set up the usage recorder before tabs are created. 282 // Set up the usage recorder before tabs are created.
277 _tabUsageRecorder = base::MakeUnique<TabUsageRecorder>(self); 283 _tabUsageRecorder = base::MakeUnique<TabUsageRecorder>(self);
278 } 284 }
279 _syncedWindowDelegate = 285 _syncedWindowDelegate =
280 base::MakeUnique<TabModelSyncedWindowDelegate>(self); 286 base::MakeUnique<TabModelSyncedWindowDelegate>(self);
281 287
282 // There must be a valid session service defined to consume session windows. 288 // There must be a valid session service defined to consume session windows.
283 DCHECK(service); 289 DCHECK(service);
284 _sessionService.reset([service retain]); 290 _sessionService.reset([service retain]);
285 291
286 _webStateListObservers.push_back(base::MakeUnique< 292 base::scoped_nsobject<NSMutableArray<id<WebStateListObserving>>>
287 WebStateListObserverBridge>([ 293 retainedWebStateListObservers([[NSMutableArray alloc] init]);
288 [TabModelClosingWebStateObserver alloc] 294
289 initWithTabModel:self 295 base::scoped_nsobject<TabModelClosingWebStateObserver>
rohitrao (ping after 24h) 2017/04/11 12:51:42 Should we just have individual ivars for the three
sdefresne 2017/04/12 11:19:47 They are never (and should never) be accessed as i
290 restoreService:IOSChromeTabRestoreServiceFactory::GetForBrowserState( 296 tabModelClosingWebStateObserver([[TabModelClosingWebStateObserver alloc]
291 _browserState)])); 297 initWithTabModel:self
298 restoreService:IOSChromeTabRestoreServiceFactory::
299 GetForBrowserState(_browserState)]);
300 [retainedWebStateListObservers addObject:tabModelClosingWebStateObserver];
301
302 _webStateListObservers.push_back(
303 base::MakeUnique<WebStateListObserverBridge>(
304 tabModelClosingWebStateObserver));
305
292 _webStateListObservers.push_back( 306 _webStateListObservers.push_back(
293 base::MakeUnique<SnapshotCacheWebStateListObserver>( 307 base::MakeUnique<SnapshotCacheWebStateListObserver>(
294 [SnapshotCache sharedInstance])); 308 [SnapshotCache sharedInstance]));
295 if (_tabUsageRecorder) { 309 if (_tabUsageRecorder) {
296 _webStateListObservers.push_back( 310 _webStateListObservers.push_back(
297 base::MakeUnique<TabUsageRecorderWebStateListObserver>( 311 base::MakeUnique<TabUsageRecorderWebStateListObserver>(
298 _tabUsageRecorder.get())); 312 _tabUsageRecorder.get()));
299 } 313 }
300 _webStateListObservers.push_back(base::MakeUnique<TabParentingObserver>()); 314 _webStateListObservers.push_back(base::MakeUnique<TabParentingObserver>());
315
316 base::scoped_nsobject<TabModelSelectedTabObserver>
317 tabModelSelectedTabObserver(
318 [[TabModelSelectedTabObserver alloc] initWithTabModel:self]);
319 [retainedWebStateListObservers addObject:tabModelSelectedTabObserver];
301 _webStateListObservers.push_back( 320 _webStateListObservers.push_back(
302 base::MakeUnique<WebStateListObserverBridge>( 321 base::MakeUnique<WebStateListObserverBridge>(
303 [[TabModelSelectedTabObserver alloc] initWithTabModel:self])); 322 tabModelSelectedTabObserver));
323
324 base::scoped_nsobject<TabModelObserversBridge> tabModelObserversBridge(
325 [[TabModelObserversBridge alloc] initWithTabModel:self
326 tabModelObservers:_observers.get()]);
327 [retainedWebStateListObservers addObject:tabModelObserversBridge];
304 _webStateListObservers.push_back( 328 _webStateListObservers.push_back(
305 base::MakeUnique<WebStateListObserverBridge>( 329 base::MakeUnique<WebStateListObserverBridge>(tabModelObserversBridge));
306 [[TabModelObserversBridge alloc]
307 initWithTabModel:self
308 tabModelObservers:_observers.get()]));
309 330
310 auto webStateListMetricsObserver = 331 auto webStateListMetricsObserver =
311 base::MakeUnique<WebStateListMetricsObserver>(); 332 base::MakeUnique<WebStateListMetricsObserver>();
312 _webStateListMetricsObserver = webStateListMetricsObserver.get(); 333 _webStateListMetricsObserver = webStateListMetricsObserver.get();
313 _webStateListObservers.push_back(std::move(webStateListMetricsObserver)); 334 _webStateListObservers.push_back(std::move(webStateListMetricsObserver));
314 335
315 for (const auto& webStateListObserver : _webStateListObservers) 336 for (const auto& webStateListObserver : _webStateListObservers)
316 _webStateList->AddObserver(webStateListObserver.get()); 337 _webStateList->AddObserver(webStateListObserver.get());
338 _retainedWebStateListObservers.reset([retainedWebStateListObservers copy]);
317 339
318 if (window) { 340 if (window) {
319 DCHECK([_observers empty]); 341 DCHECK([_observers empty]);
320 // Restore the session and reset the session metrics (as the event have 342 // Restore the session and reset the session metrics (as the event have
321 // not been generated by the user but by a cold start cycle). 343 // not been generated by the user but by a cold start cycle).
322 [self restoreSessionWindow:window persistState:NO]; 344 [self restoreSessionWindow:window persistState:NO];
323 [self resetSessionMetrics]; 345 [self resetSessionMetrics];
324 } 346 }
325 347
326 // Register for resign active notification. 348 // Register for resign active notification.
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 } 816 }
795 817
796 // Called when UIApplicationWillEnterForegroundNotification is received. 818 // Called when UIApplicationWillEnterForegroundNotification is received.
797 - (void)applicationWillEnterForeground:(NSNotification*)notify { 819 - (void)applicationWillEnterForeground:(NSNotification*)notify {
798 if (_tabUsageRecorder) { 820 if (_tabUsageRecorder) {
799 _tabUsageRecorder->AppWillEnterForeground(); 821 _tabUsageRecorder->AppWillEnterForeground();
800 } 822 }
801 } 823 }
802 824
803 @end 825 @end
OLDNEW
« no previous file with comments | « no previous file | ios/chrome/browser/web_state_list/web_state_list_fast_enumeration_helper.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698