Skip to content

Commit e562491

Browse files
Sky MaliceChromium LUCI CQ
authored andcommitted
Create TabWindowManager#getTabAndWindowIdByTabId.
Bug: None Change-Id: Id9ab6eb3e8b732d4c4fae8941646681d31773c5c Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7049688 Commit-Queue: Sky Malice <skym@chromium.org> Reviewed-by: Aishwarya Rajesh <aishwaryarj@google.com> Cr-Commit-Position: refs/heads/main@{#1532364}
1 parent 226dcfe commit e562491

File tree

5 files changed

+104
-0
lines changed

5 files changed

+104
-0
lines changed

chrome/browser/tabwindow/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import("//chrome/android/features/android_library_factory_tmpl.gni")
88
android_library("java") {
99
sources = [
1010
"android/java/src/org/chromium/chrome/browser/tabwindow/TabModelSelectorFactory.java",
11+
"android/java/src/org/chromium/chrome/browser/tabwindow/TabWindowInfo.java",
1112
"android/java/src/org/chromium/chrome/browser/tabwindow/TabWindowManager.java",
1213
"android/java/src/org/chromium/chrome/browser/tabwindow/TabWindowManagerUtils.java",
1314
"android/java/src/org/chromium/chrome/browser/tabwindow/WindowId.java",
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright 2025 The Chromium Authors
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
package org.chromium.chrome.browser.tabwindow;
6+
7+
import org.chromium.build.annotations.NullMarked;
8+
import org.chromium.chrome.browser.tab.Tab;
9+
import org.chromium.chrome.browser.tabmodel.TabModel;
10+
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
11+
12+
/** Holds objects related to a tab and where it lives. */
13+
@NullMarked
14+
public class TabWindowInfo {
15+
public final @WindowId int windowId;
16+
public final TabModelSelector tabModelSelector;
17+
public final TabModel tabModel;
18+
public final Tab tab;
19+
20+
public TabWindowInfo(
21+
@WindowId int windowId, TabModelSelector tabModelSelector, TabModel tabModel, Tab tab) {
22+
this.tab = tab;
23+
this.tabModel = tabModel;
24+
this.tabModelSelector = tabModelSelector;
25+
this.windowId = windowId;
26+
}
27+
}

chrome/browser/tabwindow/android/java/src/org/chromium/chrome/browser/tabwindow/TabWindowManager.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,15 @@ interface Observer {
156156
*/
157157
@Nullable Tab getTabById(@TabId int tabId, @WindowId int windowId);
158158

159+
/**
160+
* Similar to {@link #getTabById(int)} but returns a {@link TabWindowInfo}. Does not check the
161+
* non-window sources for the tab.
162+
*
163+
* @param tabId The id of the tab to look for.
164+
* @return The tab and related parents, null if it cannot be found.
165+
*/
166+
@Nullable TabWindowInfo getTabWindowInfoById(@TabId int tabId);
167+
159168
/**
160169
* @param windowId The ID of the window that holds the tab group.
161170
* @param tabGroupId The tab group ID of the tab group.

chrome/browser/tabwindow/internal/android/java/src/org/chromium/chrome/browser/tabwindow/TabWindowManagerImpl.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,21 @@ public int getIncognitoTabCount() {
518518
return getTabFromOtherSource(tabId);
519519
}
520520

521+
@Override
522+
public @Nullable TabWindowInfo getTabWindowInfoById(@TabId int tabId) {
523+
for (Map.Entry<@WindowId Integer, TabModelSelector> entry :
524+
mWindowIdToSelectors.entrySet()) {
525+
TabModelSelector selector = entry.getValue();
526+
for (TabModel tabModel : selector.getModels()) {
527+
@Nullable final Tab tab = tabModel.getTabById(tabId);
528+
if (tab != null) {
529+
return new TabWindowInfo(entry.getKey(), selector, tabModel, tab);
530+
}
531+
}
532+
}
533+
return null;
534+
}
535+
521536
@Override
522537
public @Nullable List<Tab> getGroupedTabsByWindow(
523538
@WindowId int windowId, Token tabGroupId, boolean isIncognito) {

chrome/browser/tabwindow/internal/android/java/src/org/chromium/chrome/browser/tabwindow/TabWindowManagerImplUnitTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,4 +1246,56 @@ public void testFindWindowIdForTabGroup_found() {
12461246
public void testFindWindowIdForTabGroup_notFound() {
12471247
assertEquals(INVALID_WINDOW_ID, mSubject.findWindowIdForTabGroup(GROUP_ID));
12481248
}
1249+
1250+
@Test
1251+
public void testGetTabWindowInfoById() {
1252+
ActivityController<Activity> activityController0 = createActivity();
1253+
Activity activity0 = activityController0.get();
1254+
ActivityController<Activity> activityController1 = createActivity();
1255+
Activity activity1 = activityController1.get();
1256+
@WindowId int window0 = 0;
1257+
@WindowId int window1 = 1;
1258+
Pair<@WindowId Integer, TabModelSelector> assignment0 =
1259+
mSubject.requestSelector(
1260+
activity0,
1261+
mModalDialogManager,
1262+
mProfileProviderSupplier,
1263+
mTabCreatorManager,
1264+
mNextTabPolicySupplier,
1265+
mMultiInstanceManager,
1266+
mMismatchedIndicesHandler0,
1267+
window0);
1268+
Pair<@WindowId Integer, TabModelSelector> assignment1 =
1269+
mSubject.requestSelector(
1270+
activity1,
1271+
mModalDialogManager,
1272+
mProfileProviderSupplier,
1273+
mTabCreatorManager,
1274+
mNextTabPolicySupplier,
1275+
mMultiInstanceManager,
1276+
mMismatchedIndicesHandler1,
1277+
window1);
1278+
MockTabModelSelector selector0 = (MockTabModelSelector) assignment0.second;
1279+
MockTabModelSelector selector1 = (MockTabModelSelector) assignment1.second;
1280+
Tab tab1 = selector0.addMockTab();
1281+
Tab tab2 = selector1.addMockIncognitoTab();
1282+
1283+
TabWindowInfo info = mSubject.getTabWindowInfoById(tab1.getId() - 1);
1284+
assertNull(info);
1285+
1286+
info = mSubject.getTabWindowInfoById(tab1.getId());
1287+
assertNotNull(info);
1288+
assertEquals(tab1, info.tab);
1289+
assertEquals(selector0, info.tabModelSelector);
1290+
assertEquals(window0, info.windowId);
1291+
1292+
info = mSubject.getTabWindowInfoById(tab2.getId());
1293+
assertNotNull(info);
1294+
assertEquals(tab2, info.tab);
1295+
assertEquals(selector1, info.tabModelSelector);
1296+
assertEquals(window1, info.windowId);
1297+
1298+
info = mSubject.getTabWindowInfoById(tab2.getId() + 1);
1299+
assertNull(info);
1300+
}
12491301
}

0 commit comments

Comments
 (0)