Commit 0531535a authored by sdefresne's avatar sdefresne Committed by Commit bot

[ios] Remove TabModel cleanup from -dealloc to -browserStateDestroyed.

As the -dealloc is called at a later time with ARC, move the cleanup
from -dealloc to -browserStateDestroyed to ensure it is determinically
called even if ARC decide to -autorelease TabModel.

Cleanup some of Tab ivar when the WebState is destroyed so that the
corresponding Tab helpers -dealloc is called sooner.

BUG=None

Review-Url: https://codereview.chromium.org/2885803002
Cr-Commit-Position: refs/heads/master@{#473892}
parent d57a7aca
...@@ -1012,7 +1012,9 @@ void TabInfoBarObserver::OnInfoBarReplaced(infobars::InfoBar* old_infobar, ...@@ -1012,7 +1012,9 @@ void TabInfoBarObserver::OnInfoBarReplaced(infobars::InfoBar* old_infobar,
[_openInController detachFromWebController]; [_openInController detachFromWebController];
_openInController = nil; _openInController = nil;
[_autofillController detachFromWebState]; [_autofillController detachFromWebState];
_autofillController = nil;
[_suggestionController detachFromWebState]; [_suggestionController detachFromWebState];
_suggestionController = nil;
if (_fullScreenController) if (_fullScreenController)
[self.webController removeObserver:_fullScreenController]; [self.webController removeObserver:_fullScreenController];
[_fullScreenController invalidate]; [_fullScreenController invalidate];
......
...@@ -204,36 +204,11 @@ std::unique_ptr<web::WebState> CreateWebState( ...@@ -204,36 +204,11 @@ std::unique_ptr<web::WebState> CreateWebState(
#pragma mark - Overriden #pragma mark - Overriden
- (void)dealloc { - (void)dealloc {
// Make sure the tabs do clean after themselves. It is important for
// removeObserver: to be called first otherwise a lot of unecessary work will
// happen on -closeAllTabs.
DCHECK([_observers empty]);
// browserStateDestroyed should always have been called before destruction. // browserStateDestroyed should always have been called before destruction.
DCHECK(!_browserState); DCHECK(!_browserState);
[[NSNotificationCenter defaultCenter] removeObserver:self]; // Make sure the observers do clean after themselves.
DCHECK([_observers empty]);
// Clear weak pointer to WebStateListMetricsObserver before destroying it.
_webStateListMetricsObserver = nullptr;
// Close all tabs. Do this in an @autoreleasepool as WebStateList observers
// will be notified (they are unregistered later). As some of them may be
// implemented in Objective-C and unregister themselves in their -dealloc
// method, ensure they -autorelease introduced by ARC are processed before
// the WebStateList destructor is called.
@autoreleasepool {
[self closeAllTabs];
}
// Unregister all observers after closing all the tabs as some of them are
// required to properly clean up the Tabs.
for (const auto& webStateListObserver : _webStateListObservers)
_webStateList->RemoveObserver(webStateListObserver.get());
_webStateListObservers.clear();
_retainedWebStateListObservers = nil;
_clearPoliciesTaskTracker.TryCancelAll();
} }
#pragma mark - Public methods #pragma mark - Public methods
...@@ -644,11 +619,33 @@ std::unique_ptr<web::WebState> CreateWebState( ...@@ -644,11 +619,33 @@ std::unique_ptr<web::WebState> CreateWebState(
// NOTE: This can be called multiple times, so must be robust against that. // NOTE: This can be called multiple times, so must be robust against that.
- (void)browserStateDestroyed { - (void)browserStateDestroyed {
if (!_browserState)
return;
[[NSNotificationCenter defaultCenter] removeObserver:self]; [[NSNotificationCenter defaultCenter] removeObserver:self];
if (_browserState) { UnregisterTabModelFromChromeBrowserState(_browserState, self);
UnregisterTabModelFromChromeBrowserState(_browserState, self);
}
_browserState = nullptr; _browserState = nullptr;
// Clear weak pointer to WebStateListMetricsObserver before destroying it.
_webStateListMetricsObserver = nullptr;
// Close all tabs. Do this in an @autoreleasepool as WebStateList observers
// will be notified (they are unregistered later). As some of them may be
// implemented in Objective-C and unregister themselves in their -dealloc
// method, ensure they -autorelease introduced by ARC are processed before
// the WebStateList destructor is called.
@autoreleasepool {
[self closeAllTabs];
}
// Unregister all observers after closing all the tabs as some of them are
// required to properly clean up the Tabs.
for (const auto& webStateListObserver : _webStateListObservers)
_webStateList->RemoveObserver(webStateListObserver.get());
_webStateListObservers.clear();
_retainedWebStateListObservers = nil;
_clearPoliciesTaskTracker.TryCancelAll();
} }
- (void)navigationCommittedInTab:(Tab*)tab - (void)navigationCommittedInTab:(Tab*)tab
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment