| Index: ios/chrome/browser/tabs/tab.mm
|
| diff --git a/ios/chrome/browser/tabs/tab.mm b/ios/chrome/browser/tabs/tab.mm
|
| index f669f1bfbc80ababda2f0e9c34eae5e1e1b9fb05..eb22c9ba6bb60c95a0413dea86f9821b108d9bd1 100644
|
| --- a/ios/chrome/browser/tabs/tab.mm
|
| +++ b/ios/chrome/browser/tabs/tab.mm
|
| @@ -178,6 +178,14 @@ class TabInfoBarObserver;
|
| // data.
|
| NSString* const kTabIDKey = @"TabID";
|
|
|
| +// The key under which the opener Tab ID is stored in the WebState's
|
| +// serializable user data.
|
| +NSString* const kOpenerIDKey = @"OpenerID";
|
| +
|
| +// The key under which the opener navigation index is stored in the WebState's
|
| +// serializable user data.
|
| +NSString* const kOpenerNavigationIndexKey = @"OpenerNavigationIndex";
|
| +
|
| // Name of histogram for recording the state of the tab when the renderer is
|
| // terminated.
|
| const char kRendererTerminationStateHistogram[] =
|
| @@ -497,15 +505,18 @@ void TabInfoBarObserver::OnInfoBarReplaced(infobars::InfoBar* old_infobar,
|
| openedByDOM:(BOOL)openedByDOM
|
| model:(TabModel*)parentModel
|
| browserState:(ios::ChromeBrowserState*)browserState {
|
| - NSInteger openerIndex = -1;
|
| - if ([opener navigationManager]) {
|
| - NavigationManagerImpl* openerNavManager = [opener navigationManager];
|
| - openerIndex = openerNavManager->GetLastCommittedItemIndex();
|
| - }
|
| std::unique_ptr<web::WebStateImpl> webState(
|
| new web::WebStateImpl(browserState));
|
| - webState->GetNavigationManagerImpl().InitializeSession(
|
| - windowName, opener.tabId, openedByDOM, openerIndex);
|
| + webState->GetNavigationManagerImpl().InitializeSession(windowName,
|
| + openedByDOM);
|
| + if ([opener navigationManager]) {
|
| + web::SerializableUserDataManager* userDataManager =
|
| + web::SerializableUserDataManager::FromWebState(webState.get());
|
| + userDataManager->AddSerializableData(opener.tabId, kOpenerIDKey);
|
| + userDataManager->AddSerializableData(
|
| + @([opener navigationManager]->GetLastCommittedItemIndex()),
|
| + kOpenerNavigationIndexKey);
|
| + }
|
|
|
| return [self initWithWebState:std::move(webState) model:parentModel];
|
| }
|
| @@ -799,6 +810,27 @@ void TabInfoBarObserver::OnInfoBarReplaced(infobars::InfoBar* old_infobar,
|
| return base::mac::ObjCCastStrict<NSString>(tabID);
|
| }
|
|
|
| +- (NSString*)openerID {
|
| + DCHECK(self.webState);
|
| + web::SerializableUserDataManager* userDataManager =
|
| + web::SerializableUserDataManager::FromWebState(self.webState);
|
| + id<NSCoding> openerID =
|
| + userDataManager->GetValueForSerializationKey(kOpenerIDKey);
|
| + return base::mac::ObjCCastStrict<NSString>(openerID);
|
| +}
|
| +
|
| +- (NSInteger)openerNavigationIndex {
|
| + DCHECK(self.webState);
|
| + web::SerializableUserDataManager* userDataManager =
|
| + web::SerializableUserDataManager::FromWebState(self.webState);
|
| + id<NSCoding> openerNavigationIndex =
|
| + userDataManager->GetValueForSerializationKey(kOpenerNavigationIndexKey);
|
| + if (!openerNavigationIndex)
|
| + return -1;
|
| + return base::mac::ObjCCastStrict<NSNumber>(openerNavigationIndex)
|
| + .integerValue;
|
| +}
|
| +
|
| - (web::WebState*)webState {
|
| return webStateImpl_.get();
|
| }
|
|
|