Chromium Code Reviews| Index: ios/chrome/browser/tabs/tab_model.mm |
| diff --git a/ios/chrome/browser/tabs/tab_model.mm b/ios/chrome/browser/tabs/tab_model.mm |
| index 4d76abffa82bd541c0a2b5a7bcfb76cdc2659865..e14b377526a92e671ec7ec4b6dffb164a29b784f 100644 |
| --- a/ios/chrome/browser/tabs/tab_model.mm |
| +++ b/ios/chrome/browser/tabs/tab_model.mm |
| @@ -145,6 +145,11 @@ void CleanCertificatePolicyCache( |
| // notification, translate and forward events, update metrics, ...). |
| std::vector<std::unique_ptr<WebStateListObserver>> _webStateListObservers; |
| + // Strong references to id<WebStateListObserving> wrapped by non-owning |
| + // WebStateListObserverBridges. |
| + base::scoped_nsobject<NSArray<id<WebStateListObserving>>> |
| + _retainedWebStateListObservers; |
| + |
| // The delegate for sync. |
| std::unique_ptr<TabModelSyncedWindowDelegate> _syncedWindowDelegate; |
| @@ -208,6 +213,7 @@ void CleanCertificatePolicyCache( |
| for (const auto& webStateListObserver : _webStateListObservers) |
| _webStateList->RemoveObserver(webStateListObserver.get()); |
| _webStateListObservers.clear(); |
| + _retainedWebStateListObservers.reset(); |
| _clearPoliciesTaskTracker.TryCancelAll(); |
| @@ -283,12 +289,20 @@ void CleanCertificatePolicyCache( |
| DCHECK(service); |
| _sessionService.reset([service retain]); |
| - _webStateListObservers.push_back(base::MakeUnique< |
| - WebStateListObserverBridge>([ |
| - [TabModelClosingWebStateObserver alloc] |
| - initWithTabModel:self |
| - restoreService:IOSChromeTabRestoreServiceFactory::GetForBrowserState( |
| - _browserState)])); |
| + base::scoped_nsobject<NSMutableArray<id<WebStateListObserving>>> |
| + retainedWebStateListObservers([[NSMutableArray alloc] init]); |
| + |
| + 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
|
| + tabModelClosingWebStateObserver([[TabModelClosingWebStateObserver alloc] |
| + initWithTabModel:self |
| + restoreService:IOSChromeTabRestoreServiceFactory:: |
| + GetForBrowserState(_browserState)]); |
| + [retainedWebStateListObservers addObject:tabModelClosingWebStateObserver]; |
| + |
| + _webStateListObservers.push_back( |
| + base::MakeUnique<WebStateListObserverBridge>( |
| + tabModelClosingWebStateObserver)); |
| + |
| _webStateListObservers.push_back( |
| base::MakeUnique<SnapshotCacheWebStateListObserver>( |
| [SnapshotCache sharedInstance])); |
| @@ -298,14 +312,21 @@ void CleanCertificatePolicyCache( |
| _tabUsageRecorder.get())); |
| } |
| _webStateListObservers.push_back(base::MakeUnique<TabParentingObserver>()); |
| + |
| + base::scoped_nsobject<TabModelSelectedTabObserver> |
| + tabModelSelectedTabObserver( |
| + [[TabModelSelectedTabObserver alloc] initWithTabModel:self]); |
| + [retainedWebStateListObservers addObject:tabModelSelectedTabObserver]; |
| _webStateListObservers.push_back( |
| base::MakeUnique<WebStateListObserverBridge>( |
| - [[TabModelSelectedTabObserver alloc] initWithTabModel:self])); |
| + tabModelSelectedTabObserver)); |
| + |
| + base::scoped_nsobject<TabModelObserversBridge> tabModelObserversBridge( |
| + [[TabModelObserversBridge alloc] initWithTabModel:self |
| + tabModelObservers:_observers.get()]); |
| + [retainedWebStateListObservers addObject:tabModelObserversBridge]; |
| _webStateListObservers.push_back( |
| - base::MakeUnique<WebStateListObserverBridge>( |
| - [[TabModelObserversBridge alloc] |
| - initWithTabModel:self |
| - tabModelObservers:_observers.get()])); |
| + base::MakeUnique<WebStateListObserverBridge>(tabModelObserversBridge)); |
| auto webStateListMetricsObserver = |
| base::MakeUnique<WebStateListMetricsObserver>(); |
| @@ -314,6 +335,7 @@ void CleanCertificatePolicyCache( |
| for (const auto& webStateListObserver : _webStateListObservers) |
| _webStateList->AddObserver(webStateListObserver.get()); |
| + _retainedWebStateListObservers.reset([retainedWebStateListObservers copy]); |
| if (window) { |
| DCHECK([_observers empty]); |