| Index: ios/shared/chrome/browser/tabs/web_state_list_order_controller.mm
|
| diff --git a/ios/shared/chrome/browser/tabs/web_state_list_order_controller.mm b/ios/shared/chrome/browser/tabs/web_state_list_order_controller.mm
|
| index cafb8a4a86b9f1fd5e5d38f0df681f429a54a3aa..479224619fed6401e87a2324b73f5f604660b639 100644
|
| --- a/ios/shared/chrome/browser/tabs/web_state_list_order_controller.mm
|
| +++ b/ios/shared/chrome/browser/tabs/web_state_list_order_controller.mm
|
| @@ -40,3 +40,50 @@ int WebStateListOrderController::DetermineInsertionIndex(
|
| DCHECK_LT(reference_index, INT_MAX);
|
| return reference_index + 1;
|
| }
|
| +
|
| +int WebStateListOrderController::DetermineNewActiveIndex(
|
| + int removing_index) const {
|
| + DCHECK(web_state_list_->ContainsIndex(removing_index));
|
| + // First see if the index being removed has any "child" WebState. If it does,
|
| + // select the first WebState in that child group, not the next in the removed
|
| + // index group.
|
| + int index = web_state_list_->GetIndexOfNextWebStateOpenedBy(
|
| + web_state_list_->GetWebStateAt(removing_index), removing_index, false);
|
| +
|
| + if (index != WebStateList::kInvalidIndex)
|
| + return GetValidIndex(index, removing_index);
|
| +
|
| + web::WebState* opener =
|
| + web_state_list_->GetOpenerOfWebStateAt(removing_index);
|
| + if (opener) {
|
| + // If the WebState was in a group, shift selection to the next WebState in
|
| + // the group.
|
| + int index = web_state_list_->GetIndexOfNextWebStateOpenedBy(
|
| + opener, removing_index, false);
|
| +
|
| + if (index != WebStateList::kInvalidIndex)
|
| + return GetValidIndex(index, removing_index);
|
| +
|
| + // If there is no subsequent group member, just fall back to opener itself.
|
| + index = web_state_list_->GetIndexOfWebState(opener);
|
| + return GetValidIndex(index, removing_index);
|
| + }
|
| +
|
| + // If this is the last WebState in the WebStateList, clear the selection.
|
| + if (web_state_list_->count() == 1)
|
| + return WebStateList::kInvalidIndex;
|
| +
|
| + // No opener, fall through to the default handler, i.e. returning the previous
|
| + // WebState if the removed one is the last, otherwise returning the next one.
|
| + if (removing_index >= web_state_list_->count() - 1)
|
| + return removing_index - 1;
|
| +
|
| + return removing_index;
|
| +}
|
| +
|
| +int WebStateListOrderController::GetValidIndex(int index,
|
| + int removing_index) const {
|
| + if (removing_index < index)
|
| + return std::min(0, index - 1);
|
| + return index;
|
| +}
|
|
|