[GURL] Migrate PseudoTab.
This includes a one-time migration for clients that have string URLs persisted as we convert them to serialized GURLs. Bots shouldn't see this (no persistence) but should cause a temporary blip (and then slow long-tail) reports of early GURL loads. Bug: 783819 Change-Id: I4bade009cff4d698ac3441d1c416fe4b7d251349 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2945815 Reviewed-by: Michael Thiessen <mthiesse@chromium.org> Reviewed-by: Wei-Yin Chen (陳威尹) <wychen@chromium.org> Commit-Queue: Yaron Friedman <yfriedman@chromium.org> Cr-Commit-Position: refs/heads/master@{#893008}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
83e92d5c4f
commit
b106742d25
chrome
android
BUILD.gn
features
start_surface
internal
javatests
src
org
chromium
chrome
features
start_surface
tab_ui
java
src
org
chromium
chrome
junit
src
org
chromium
chrome
browser
android
ui
android
favicon
java
src
org
chromium
chrome
browser
ui
favicon
url/android
@ -1460,6 +1460,7 @@ android_library("chrome_test_java") {
|
|||||||
"//ui/base/mojom:mojom_java",
|
"//ui/base/mojom:mojom_java",
|
||||||
"//url:gurl_java",
|
"//url:gurl_java",
|
||||||
"//url:gurl_javatests",
|
"//url:gurl_javatests",
|
||||||
|
"//url:gurl_junit_test_support",
|
||||||
"//url:origin_java",
|
"//url:origin_java",
|
||||||
"//url/mojom:url_mojom_gurl_java",
|
"//url/mojom:url_mojom_gurl_java",
|
||||||
]
|
]
|
||||||
|
@ -1092,7 +1092,8 @@ public class InstantStartTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void startAndWaitNativeInitialization() {
|
private void startAndWaitNativeInitialization() {
|
||||||
Assert.assertFalse(LibraryLoader.getInstance().isInitialized());
|
Assert.assertFalse(
|
||||||
|
NativeLibraryLoadedStatus.getProviderForTesting().areMainDexNativeMethodsReady());
|
||||||
|
|
||||||
CommandLine.getInstance().removeSwitch(ChromeSwitches.DISABLE_NATIVE_INITIALIZATION);
|
CommandLine.getInstance().removeSwitch(ChromeSwitches.DISABLE_NATIVE_INITIALIZATION);
|
||||||
TestThreadUtils.runOnUiThreadBlocking(
|
TestThreadUtils.runOnUiThreadBlocking(
|
||||||
|
@ -62,6 +62,7 @@ import org.chromium.chrome.test.util.browser.suggestions.mostvisited.FakeMostVis
|
|||||||
import org.chromium.content_public.browser.test.util.TestThreadUtils;
|
import org.chromium.content_public.browser.test.util.TestThreadUtils;
|
||||||
import org.chromium.content_public.browser.test.util.TestTouchUtils;
|
import org.chromium.content_public.browser.test.util.TestTouchUtils;
|
||||||
import org.chromium.url.GURL;
|
import org.chromium.url.GURL;
|
||||||
|
import org.chromium.url.JUnitTestGURLs;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
@ -360,14 +361,18 @@ public class StartSurfaceTestUtils {
|
|||||||
*/
|
*/
|
||||||
public static List<SiteSuggestion> createFakeSiteSuggestions() {
|
public static List<SiteSuggestion> createFakeSiteSuggestions() {
|
||||||
List<SiteSuggestion> siteSuggestions = new ArrayList<>();
|
List<SiteSuggestion> siteSuggestions = new ArrayList<>();
|
||||||
siteSuggestions.add(new SiteSuggestion("0 EXPLORE_SITES", new GURL("https://www.bar.com"),
|
siteSuggestions.add(new SiteSuggestion("0 EXPLORE_SITES",
|
||||||
"", TileTitleSource.UNKNOWN, TileSource.EXPLORE, TileSectionType.PERSONALIZED,
|
// Use pre-serialized GURL to avoid loading native.
|
||||||
new Date()));
|
JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL), "", TileTitleSource.UNKNOWN,
|
||||||
|
TileSource.EXPLORE, TileSectionType.PERSONALIZED, new Date()));
|
||||||
|
|
||||||
|
String urlTemplate = JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1_NUMERAL).serialize();
|
||||||
for (int i = 0; i < 7; i++) {
|
for (int i = 0; i < 7; i++) {
|
||||||
siteSuggestions.add(new SiteSuggestion(String.valueOf(i),
|
siteSuggestions.add(new SiteSuggestion(String.valueOf(i),
|
||||||
new GURL("https://www." + i + ".com"), "", TileTitleSource.TITLE_TAG,
|
// Use pre-serialized GURL to avoid loading native.
|
||||||
TileSource.TOP_SITES, TileSectionType.PERSONALIZED, new Date()));
|
GURL.deserialize(urlTemplate.replace("www.1.com", "www." + i + ".com")), "",
|
||||||
|
TileTitleSource.TITLE_TAG, TileSource.TOP_SITES, TileSectionType.PERSONALIZED,
|
||||||
|
new Date()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return siteSuggestions;
|
return siteSuggestions;
|
||||||
|
@ -133,8 +133,7 @@ public class SingleTabSwitcherMediator implements TabSwitcher.Controller {
|
|||||||
|
|
||||||
private void updateFavicon(Tab tab) {
|
private void updateFavicon(Tab tab) {
|
||||||
assert mTabListFaviconProvider.isInitialized();
|
assert mTabListFaviconProvider.isInitialized();
|
||||||
// TODO(crbug/783819): convert TabListFaviconProvider to GURL
|
mTabListFaviconProvider.getFaviconForUrlAsync(tab.getUrl(), false,
|
||||||
mTabListFaviconProvider.getFaviconForUrlAsync(tab.getUrl().getSpec(), false,
|
|
||||||
(Drawable favicon) -> { mPropertyModel.set(FAVICON, favicon); });
|
(Drawable favicon) -> { mPropertyModel.set(FAVICON, favicon); });
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -253,7 +252,7 @@ public class SingleTabSwitcherMediator implements TabSwitcher.Controller {
|
|||||||
|
|
||||||
private void updateSelectedTab(Tab tab) {
|
private void updateSelectedTab(Tab tab) {
|
||||||
mPropertyModel.set(TITLE, tab.getTitle());
|
mPropertyModel.set(TITLE, tab.getTitle());
|
||||||
mTabListFaviconProvider.getFaviconForUrlAsync(tab.getUrl().getSpec(), false,
|
mTabListFaviconProvider.getFaviconForUrlAsync(tab.getUrl(), false,
|
||||||
(Drawable favicon) -> { mPropertyModel.set(FAVICON, favicon); });
|
(Drawable favicon) -> { mPropertyModel.set(FAVICON, favicon); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
6
chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java
6
chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java
@ -26,6 +26,7 @@ import org.chromium.chrome.browser.tabmodel.TabbedModeTabPersistencePolicy;
|
|||||||
import org.chromium.chrome.browser.tabpersistence.TabStateDirectory;
|
import org.chromium.chrome.browser.tabpersistence.TabStateDirectory;
|
||||||
import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
|
import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
|
||||||
import org.chromium.components.embedder_support.util.UrlUtilities;
|
import org.chromium.components.embedder_support.util.UrlUtilities;
|
||||||
|
import org.chromium.url.GURL;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
@ -179,10 +180,9 @@ public class PseudoTab {
|
|||||||
* Get the URL of the {@link PseudoTab}.
|
* Get the URL of the {@link PseudoTab}.
|
||||||
* @return The URL
|
* @return The URL
|
||||||
*/
|
*/
|
||||||
public String getUrl() {
|
public GURL getUrl() {
|
||||||
// TODO(crbug/783819): Return the GURL directly.
|
|
||||||
if (mTab != null && mTab.get() != null && mTab.get().isInitialized()) {
|
if (mTab != null && mTab.get() != null && mTab.get().isInitialized()) {
|
||||||
return mTab.get().getUrl() != null ? mTab.get().getUrl().getSpec() : null;
|
return mTab.get().getUrl();
|
||||||
}
|
}
|
||||||
assert mTabId != null;
|
assert mTabId != null;
|
||||||
return TabAttributeCache.getUrl(mTabId);
|
return TabAttributeCache.getUrl(mTabId);
|
||||||
|
@ -65,8 +65,7 @@ public class TabAttributeCache {
|
|||||||
@Override
|
@Override
|
||||||
public void onUrlUpdated(Tab tab) {
|
public void onUrlUpdated(Tab tab) {
|
||||||
if (tab.isIncognito()) return;
|
if (tab.isIncognito()) return;
|
||||||
String url = tab.getUrl().getSpec();
|
cacheUrl(tab.getId(), tab.getUrl());
|
||||||
cacheUrl(tab.getId(), url);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -107,6 +106,7 @@ public class TabAttributeCache {
|
|||||||
int id = tab.getId();
|
int id = tab.getId();
|
||||||
getSharedPreferences()
|
getSharedPreferences()
|
||||||
.edit()
|
.edit()
|
||||||
|
.remove(getDeprecatedUrlKey(id))
|
||||||
.remove(getUrlKey(id))
|
.remove(getUrlKey(id))
|
||||||
.remove(getTitleKey(id))
|
.remove(getTitleKey(id))
|
||||||
.remove(getRootIdKey(id))
|
.remove(getRootIdKey(id))
|
||||||
@ -126,7 +126,7 @@ public class TabAttributeCache {
|
|||||||
mTabModelSelector.getTabModelFilterProvider().getTabModelFilter(false);
|
mTabModelSelector.getTabModelFilterProvider().getTabModelFilter(false);
|
||||||
for (int i = 0; i < filter.getCount(); i++) {
|
for (int i = 0; i < filter.getCount(); i++) {
|
||||||
Tab tab = filter.getTabAt(i);
|
Tab tab = filter.getTabAt(i);
|
||||||
cacheUrl(tab.getId(), tab.getUrl().getSpec());
|
cacheUrl(tab.getId(), tab.getUrl());
|
||||||
cacheTitle(tab.getId(), tab.getTitle());
|
cacheTitle(tab.getId(), tab.getTitle());
|
||||||
cacheRootId(tab.getId(), CriticalPersistedTabData.from(tab).getRootId());
|
cacheRootId(tab.getId(), CriticalPersistedTabData.from(tab).getRootId());
|
||||||
cacheTimestampMillis(
|
cacheTimestampMillis(
|
||||||
@ -168,6 +168,11 @@ public class TabAttributeCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static String getUrlKey(int id) {
|
private static String getUrlKey(int id) {
|
||||||
|
return id + "_gurl";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Legacy from when URL was serialized as raw string.
|
||||||
|
private static String getDeprecatedUrlKey(int id) {
|
||||||
return id + "_url";
|
return id + "_url";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,13 +181,16 @@ public class TabAttributeCache {
|
|||||||
* @param id The ID of the {@link PseudoTab}.
|
* @param id The ID of the {@link PseudoTab}.
|
||||||
* @return The URL
|
* @return The URL
|
||||||
*/
|
*/
|
||||||
public static String getUrl(int id) {
|
public static GURL getUrl(int id) {
|
||||||
return getSharedPreferences().getString(getUrlKey(id), "");
|
String url = getSharedPreferences().getString(getUrlKey(id), "");
|
||||||
|
if (!url.isEmpty()) {
|
||||||
|
return GURL.deserialize(url);
|
||||||
|
}
|
||||||
|
return new GURL(getSharedPreferences().getString(getDeprecatedUrlKey(id), ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void cacheUrl(int id, String url) {
|
private static void cacheUrl(int id, GURL url) {
|
||||||
// TODO(crbug/783819): Use GURL directly.
|
getSharedPreferences().edit().putString(getUrlKey(id), url.serialize()).apply();
|
||||||
getSharedPreferences().edit().putString(getUrlKey(id), url).apply();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -190,7 +198,7 @@ public class TabAttributeCache {
|
|||||||
* @param id The ID of the {@link PseudoTab}.
|
* @param id The ID of the {@link PseudoTab}.
|
||||||
* @param url The URL
|
* @param url The URL
|
||||||
*/
|
*/
|
||||||
static void setUrlForTesting(int id, String url) {
|
static void setUrlForTesting(int id, GURL url) {
|
||||||
cacheUrl(id, url);
|
cacheUrl(id, url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
|
|||||||
import org.chromium.chrome.browser.tasks.pseudotab.PseudoTab;
|
import org.chromium.chrome.browser.tasks.pseudotab.PseudoTab;
|
||||||
import org.chromium.chrome.tab_ui.R;
|
import org.chromium.chrome.tab_ui.R;
|
||||||
import org.chromium.content_public.browser.UiThreadTaskTraits;
|
import org.chromium.content_public.browser.UiThreadTaskTraits;
|
||||||
|
import org.chromium.url.GURL;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -115,7 +116,7 @@ public class MultiThumbnailCardProvider implements TabListMediator.ThumbnailProv
|
|||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
if (mTabs.get(i) != null) {
|
if (mTabs.get(i) != null) {
|
||||||
final int index = i;
|
final int index = i;
|
||||||
final String url = mTabs.get(i).getUrl();
|
final GURL url = mTabs.get(i).getUrl();
|
||||||
final boolean isIncognito = mTabs.get(i).isIncognito();
|
final boolean isIncognito = mTabs.get(i).isIncognito();
|
||||||
// getTabThumbnailWithCallback() might call the callback up to twice,
|
// getTabThumbnailWithCallback() might call the callback up to twice,
|
||||||
// so use |lastFavicon| to avoid fetching the favicon the second time.
|
// so use |lastFavicon| to avoid fetching the favicon the second time.
|
||||||
|
@ -23,6 +23,7 @@ import org.chromium.chrome.browser.ui.native_page.NativePage;
|
|||||||
import org.chromium.chrome.tab_ui.R;
|
import org.chromium.chrome.tab_ui.R;
|
||||||
import org.chromium.components.embedder_support.util.UrlUtilities;
|
import org.chromium.components.embedder_support.util.UrlUtilities;
|
||||||
import org.chromium.ui.base.ViewUtils;
|
import org.chromium.ui.base.ViewUtils;
|
||||||
|
import org.chromium.url.GURL;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -153,7 +154,7 @@ public class TabListFaviconProvider {
|
|||||||
* @param faviconCallback The callback that requests for favicon.
|
* @param faviconCallback The callback that requests for favicon.
|
||||||
*/
|
*/
|
||||||
public void getFaviconForUrlAsync(
|
public void getFaviconForUrlAsync(
|
||||||
String url, boolean isIncognito, Callback<Drawable> faviconCallback) {
|
GURL url, boolean isIncognito, Callback<Drawable> faviconCallback) {
|
||||||
if (mFaviconHelper == null || UrlUtilities.isNTPUrl(url)) {
|
if (mFaviconHelper == null || UrlUtilities.isNTPUrl(url)) {
|
||||||
faviconCallback.onResult(getRoundedChromeDrawable(isIncognito));
|
faviconCallback.onResult(getRoundedChromeDrawable(isIncognito));
|
||||||
} else {
|
} else {
|
||||||
@ -175,7 +176,7 @@ public class TabListFaviconProvider {
|
|||||||
* @param icon The favicon that was received.
|
* @param icon The favicon that was received.
|
||||||
* @return The processed favicon.
|
* @return The processed favicon.
|
||||||
*/
|
*/
|
||||||
public Drawable getFaviconForUrlSync(String url, boolean isIncognito, Bitmap icon) {
|
public Drawable getFaviconForUrlSync(GURL url, boolean isIncognito, Bitmap icon) {
|
||||||
if (icon == null) {
|
if (icon == null) {
|
||||||
boolean isNativeUrl = NativePage.isNativePageUrl(url, isIncognito);
|
boolean isNativeUrl = NativePage.isNativePageUrl(url, isIncognito);
|
||||||
return isNativeUrl ? getRoundedChromeDrawable(isIncognito)
|
return isNativeUrl ? getRoundedChromeDrawable(isIncognito)
|
||||||
@ -192,7 +193,7 @@ public class TabListFaviconProvider {
|
|||||||
* @param faviconCallback The callback that requests for the composed favicon.
|
* @param faviconCallback The callback that requests for the composed favicon.
|
||||||
*/
|
*/
|
||||||
public void getComposedFaviconImageAsync(
|
public void getComposedFaviconImageAsync(
|
||||||
List<String> urls, boolean isIncognito, Callback<Drawable> faviconCallback) {
|
List<GURL> urls, boolean isIncognito, Callback<Drawable> faviconCallback) {
|
||||||
assert urls != null && urls.size() > 1 && urls.size() <= 4;
|
assert urls != null && urls.size() > 1 && urls.size() <= 4;
|
||||||
|
|
||||||
mFaviconHelper.getComposedFaviconImage(mProfile, urls, mFaviconSize, (image, iconUrl) -> {
|
mFaviconHelper.getComposedFaviconImage(mProfile, urls, mFaviconSize, (image, iconUrl) -> {
|
||||||
|
@ -1614,11 +1614,11 @@ class TabListMediator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The order of the url list matches the multi-thumbnail.
|
// The order of the url list matches the multi-thumbnail.
|
||||||
List<String> urls = new ArrayList<>();
|
List<GURL> urls = new ArrayList<>();
|
||||||
urls.add(pseudoTab.getUrl());
|
urls.add(pseudoTab.getUrl());
|
||||||
for (int i = 0; urls.size() < 4 && i < relatedTabList.size(); i++) {
|
for (int i = 0; urls.size() < 4 && i < relatedTabList.size(); i++) {
|
||||||
if (pseudoTab.getId() == relatedTabList.get(i).getId()) continue;
|
if (pseudoTab.getId() == relatedTabList.get(i).getId()) continue;
|
||||||
urls.add(relatedTabList.get(i).getUrl().getSpec());
|
urls.add(relatedTabList.get(i).getUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
// For tab group card in grid tab switcher, the favicon is the composed favicon.
|
// For tab group card in grid tab switcher, the favicon is the composed favicon.
|
||||||
|
@ -44,6 +44,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
|
|||||||
import org.chromium.chrome.browser.tasks.tab_management.TabListFaviconProvider;
|
import org.chromium.chrome.browser.tasks.tab_management.TabListFaviconProvider;
|
||||||
import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher;
|
import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher;
|
||||||
import org.chromium.ui.modelutil.PropertyModel;
|
import org.chromium.ui.modelutil.PropertyModel;
|
||||||
|
import org.chromium.url.GURL;
|
||||||
import org.chromium.url.JUnitTestGURLs;
|
import org.chromium.url.JUnitTestGURLs;
|
||||||
|
|
||||||
/** Tests for {@link SingleTabSwitcherMediator}. */
|
/** Tests for {@link SingleTabSwitcherMediator}. */
|
||||||
@ -52,10 +53,10 @@ import org.chromium.url.JUnitTestGURLs;
|
|||||||
public class SingleTabSwitcherMediatorUnitTest {
|
public class SingleTabSwitcherMediatorUnitTest {
|
||||||
private final int mTabId = 1;
|
private final int mTabId = 1;
|
||||||
private final String mTitle = "test";
|
private final String mTitle = "test";
|
||||||
private final String mUrlString = JUnitTestGURLs.URL_1;
|
private final GURL mUrl = JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1);
|
||||||
private final int mTabId2 = 2;
|
private final int mTabId2 = 2;
|
||||||
private final String mTitle2 = "test2";
|
private final String mTitle2 = "test2";
|
||||||
private final String mUrlString2 = JUnitTestGURLs.URL_2;
|
private final GURL mUrl2 = JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_2);
|
||||||
private SingleTabSwitcherMediator mMediator;
|
private SingleTabSwitcherMediator mMediator;
|
||||||
private PropertyModel mPropertyModel;
|
private PropertyModel mPropertyModel;
|
||||||
|
|
||||||
@ -99,10 +100,10 @@ public class SingleTabSwitcherMediatorUnitTest {
|
|||||||
doReturn(0).when(mNormalTabModel).index();
|
doReturn(0).when(mNormalTabModel).index();
|
||||||
doReturn(1).when(mNormalTabModel).getCount();
|
doReturn(1).when(mNormalTabModel).getCount();
|
||||||
doReturn(false).when(mNormalTabModel).isIncognito();
|
doReturn(false).when(mNormalTabModel).isIncognito();
|
||||||
doReturn(JUnitTestGURLs.getGURL(mUrlString)).when(mTab).getUrl();
|
doReturn(mUrl).when(mTab).getUrl();
|
||||||
doReturn(mTabId).when(mTab).getId();
|
doReturn(mTabId).when(mTab).getId();
|
||||||
doReturn(mTitle).when(mTab).getTitle();
|
doReturn(mTitle).when(mTab).getTitle();
|
||||||
doReturn(JUnitTestGURLs.getGURL(mUrlString2)).when(mTab2).getUrl();
|
doReturn(mUrl2).when(mTab2).getUrl();
|
||||||
doReturn(mTabId2).when(mTab2).getId();
|
doReturn(mTabId2).when(mTab2).getId();
|
||||||
doReturn(mTitle2).when(mTab2).getTitle();
|
doReturn(mTitle2).when(mTab2).getTitle();
|
||||||
doReturn(true).when(mIncognitoTabModel).isIncognito();
|
doReturn(true).when(mIncognitoTabModel).isIncognito();
|
||||||
@ -130,7 +131,7 @@ public class SingleTabSwitcherMediatorUnitTest {
|
|||||||
.addTabModelFilterObserver(mTabModelObserverCaptor.capture());
|
.addTabModelFilterObserver(mTabModelObserverCaptor.capture());
|
||||||
verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture());
|
verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture());
|
||||||
verify(mTabListFaviconProvider)
|
verify(mTabListFaviconProvider)
|
||||||
.getFaviconForUrlAsync(eq(mUrlString), eq(false), mFaviconCallbackCaptor.capture());
|
.getFaviconForUrlAsync(eq(mUrl), eq(false), mFaviconCallbackCaptor.capture());
|
||||||
assertTrue(mMediator.overviewVisible());
|
assertTrue(mMediator.overviewVisible());
|
||||||
verify(mOverviewModeObserver).startedShowing();
|
verify(mOverviewModeObserver).startedShowing();
|
||||||
verify(mOverviewModeObserver).finishedShowing();
|
verify(mOverviewModeObserver).finishedShowing();
|
||||||
@ -160,7 +161,7 @@ public class SingleTabSwitcherMediatorUnitTest {
|
|||||||
.addTabModelFilterObserver(mTabModelObserverCaptor.capture());
|
.addTabModelFilterObserver(mTabModelObserverCaptor.capture());
|
||||||
verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture());
|
verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture());
|
||||||
verify(mTabListFaviconProvider)
|
verify(mTabListFaviconProvider)
|
||||||
.getFaviconForUrlAsync(eq(mUrlString), eq(false), mFaviconCallbackCaptor.capture());
|
.getFaviconForUrlAsync(eq(mUrl), eq(false), mFaviconCallbackCaptor.capture());
|
||||||
assertTrue(mMediator.overviewVisible());
|
assertTrue(mMediator.overviewVisible());
|
||||||
verify(mOverviewModeObserver).startedShowing();
|
verify(mOverviewModeObserver).startedShowing();
|
||||||
verify(mOverviewModeObserver).finishedShowing();
|
verify(mOverviewModeObserver).finishedShowing();
|
||||||
@ -199,7 +200,7 @@ public class SingleTabSwitcherMediatorUnitTest {
|
|||||||
.addTabModelFilterObserver(mTabModelObserverCaptor.capture());
|
.addTabModelFilterObserver(mTabModelObserverCaptor.capture());
|
||||||
verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture());
|
verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture());
|
||||||
verify(mTabListFaviconProvider)
|
verify(mTabListFaviconProvider)
|
||||||
.getFaviconForUrlAsync(eq(mUrlString), eq(false), mFaviconCallbackCaptor.capture());
|
.getFaviconForUrlAsync(eq(mUrl), eq(false), mFaviconCallbackCaptor.capture());
|
||||||
assertTrue(mMediator.overviewVisible());
|
assertTrue(mMediator.overviewVisible());
|
||||||
verify(mOverviewModeObserver).startedShowing();
|
verify(mOverviewModeObserver).startedShowing();
|
||||||
verify(mOverviewModeObserver).finishedShowing();
|
verify(mOverviewModeObserver).finishedShowing();
|
||||||
@ -228,7 +229,7 @@ public class SingleTabSwitcherMediatorUnitTest {
|
|||||||
.addTabModelFilterObserver(mTabModelObserverCaptor.capture());
|
.addTabModelFilterObserver(mTabModelObserverCaptor.capture());
|
||||||
verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture());
|
verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture());
|
||||||
verify(mTabListFaviconProvider)
|
verify(mTabListFaviconProvider)
|
||||||
.getFaviconForUrlAsync(eq(mUrlString), eq(false), mFaviconCallbackCaptor.capture());
|
.getFaviconForUrlAsync(eq(mUrl), eq(false), mFaviconCallbackCaptor.capture());
|
||||||
assertEquals(mPropertyModel.get(TITLE), mTitle);
|
assertEquals(mPropertyModel.get(TITLE), mTitle);
|
||||||
|
|
||||||
mTabModelSelectorObserverCaptor.getValue().onTabModelSelected(
|
mTabModelSelectorObserverCaptor.getValue().onTabModelSelected(
|
||||||
|
@ -32,6 +32,7 @@ import org.chromium.chrome.browser.tasks.tab_management.TabUiUnitTestUtils;
|
|||||||
import org.chromium.chrome.test.util.browser.Features;
|
import org.chromium.chrome.test.util.browser.Features;
|
||||||
import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
|
import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
|
||||||
import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
|
import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
|
||||||
|
import org.chromium.url.GURL;
|
||||||
import org.chromium.url.JUnitTestGURLs;
|
import org.chromium.url.JUnitTestGURLs;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -250,11 +251,11 @@ public class PseudoTabUnitTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getUrl_real() {
|
public void getUrl_real() {
|
||||||
String url = JUnitTestGURLs.EXAMPLE_URL;
|
GURL url = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL);
|
||||||
doReturn(JUnitTestGURLs.getGURL(url)).when(mTab1).getUrl();
|
doReturn(url).when(mTab1).getUrl();
|
||||||
|
|
||||||
PseudoTab tab = PseudoTab.fromTabId(TAB1_ID);
|
PseudoTab tab = PseudoTab.fromTabId(TAB1_ID);
|
||||||
Assert.assertEquals("", tab.getUrl());
|
Assert.assertEquals(GURL.emptyGURL(), tab.getUrl());
|
||||||
|
|
||||||
PseudoTab realTab = PseudoTab.fromTab(mTab1);
|
PseudoTab realTab = PseudoTab.fromTab(mTab1);
|
||||||
Assert.assertNotEquals(tab, realTab);
|
Assert.assertNotEquals(tab, realTab);
|
||||||
@ -263,11 +264,11 @@ public class PseudoTabUnitTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getUrl_cache() {
|
public void getUrl_cache() {
|
||||||
String url = "url 1";
|
String url = JUnitTestGURLs.URL_1;
|
||||||
TabAttributeCache.setUrlForTesting(TAB1_ID, url);
|
TabAttributeCache.setUrlForTesting(TAB1_ID, JUnitTestGURLs.getGURL(url));
|
||||||
|
|
||||||
PseudoTab tab = PseudoTab.fromTabId(TAB1_ID);
|
PseudoTab tab = PseudoTab.fromTabId(TAB1_ID);
|
||||||
Assert.assertEquals(url, tab.getUrl());
|
Assert.assertEquals(url, tab.getUrl().getSpec());
|
||||||
|
|
||||||
PseudoTab realTab = PseudoTab.fromTab(mTab1);
|
PseudoTab realTab = PseudoTab.fromTab(mTab1);
|
||||||
Assert.assertNotEquals(tab, realTab);
|
Assert.assertNotEquals(tab, realTab);
|
||||||
@ -466,7 +467,7 @@ public class PseudoTabUnitTest {
|
|||||||
// Url was not set. Without the isInitialized() check,
|
// Url was not set. Without the isInitialized() check,
|
||||||
// pseudoTab.getUrl() would crash here with
|
// pseudoTab.getUrl() would crash here with
|
||||||
// UnsupportedOperationException
|
// UnsupportedOperationException
|
||||||
Assert.assertEquals("", pseudoTab.getUrl());
|
Assert.assertEquals("", pseudoTab.getUrl().getSpec());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -130,8 +130,8 @@ public class TabAttributeCacheUnitTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void updateUrl() {
|
public void updateUrl() {
|
||||||
String url = JUnitTestGURLs.EXAMPLE_URL;
|
GURL url = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL);
|
||||||
doReturn(JUnitTestGURLs.getGURL(url)).when(mTab1).getUrl();
|
doReturn(url).when(mTab1).getUrl();
|
||||||
|
|
||||||
Assert.assertNotEquals(url, TabAttributeCache.getUrl(TAB1_ID));
|
Assert.assertNotEquals(url, TabAttributeCache.getUrl(TAB1_ID));
|
||||||
|
|
||||||
@ -359,8 +359,8 @@ public class TabAttributeCacheUnitTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onTabStateInitialized() {
|
public void onTabStateInitialized() {
|
||||||
String url1 = JUnitTestGURLs.EXAMPLE_URL;
|
GURL url1 = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL);
|
||||||
doReturn(JUnitTestGURLs.getGURL(url1)).when(mTab1).getUrl();
|
doReturn(url1).when(mTab1).getUrl();
|
||||||
String title1 = "title 1";
|
String title1 = "title 1";
|
||||||
doReturn(title1).when(mTab1).getTitle();
|
doReturn(title1).when(mTab1).getTitle();
|
||||||
int rootId1 = 1337;
|
int rootId1 = 1337;
|
||||||
@ -368,8 +368,8 @@ public class TabAttributeCacheUnitTest {
|
|||||||
long timestamp1 = 123456;
|
long timestamp1 = 123456;
|
||||||
doReturn(timestamp1).when(mCriticalPersistedTabData1).getTimestampMillis();
|
doReturn(timestamp1).when(mCriticalPersistedTabData1).getTimestampMillis();
|
||||||
|
|
||||||
String url2 = JUnitTestGURLs.URL_2;
|
GURL url2 = JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_2);
|
||||||
doReturn(JUnitTestGURLs.getGURL(url2)).when(mTab2).getUrl();
|
doReturn(url2).when(mTab2).getUrl();
|
||||||
String title2 = "title 2";
|
String title2 = "title 2";
|
||||||
doReturn(title2).when(mTab2).getTitle();
|
doReturn(title2).when(mTab2).getTitle();
|
||||||
int rootId2 = 42;
|
int rootId2 = 42;
|
||||||
|
@ -36,6 +36,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector;
|
|||||||
import org.chromium.chrome.browser.tasks.tab_management.TabUiUnitTestUtils;
|
import org.chromium.chrome.browser.tasks.tab_management.TabUiUnitTestUtils;
|
||||||
import org.chromium.chrome.test.util.browser.Features;
|
import org.chromium.chrome.test.util.browser.Features;
|
||||||
import org.chromium.testing.local.LocalRobolectricTestRunner;
|
import org.chromium.testing.local.LocalRobolectricTestRunner;
|
||||||
|
import org.chromium.url.GURL;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@ -90,9 +91,9 @@ public class TabGroupUtilsUnitTest {
|
|||||||
|
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
|
|
||||||
mTab1 = TabUiUnitTestUtils.prepareTab(TAB1_ID, TAB1_TITLE, "");
|
mTab1 = TabUiUnitTestUtils.prepareTab(TAB1_ID, TAB1_TITLE, GURL.emptyGURL());
|
||||||
mTab2 = TabUiUnitTestUtils.prepareTab(TAB2_ID, TAB2_TITLE, "");
|
mTab2 = TabUiUnitTestUtils.prepareTab(TAB2_ID, TAB2_TITLE, GURL.emptyGURL());
|
||||||
mTab3 = TabUiUnitTestUtils.prepareTab(TAB3_ID, TAB3_TITLE, "");
|
mTab3 = TabUiUnitTestUtils.prepareTab(TAB3_ID, TAB3_TITLE, GURL.emptyGURL());
|
||||||
|
|
||||||
doReturn(mTabModelFilterProvider).when(mTabModelSelector).getTabModelFilterProvider();
|
doReturn(mTabModelFilterProvider).when(mTabModelSelector).getTabModelFilterProvider();
|
||||||
doReturn(mTabGroupModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter();
|
doReturn(mTabGroupModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter();
|
||||||
|
@ -64,6 +64,7 @@ import org.chromium.chrome.test.util.browser.Features;
|
|||||||
import org.chromium.content_public.browser.LoadUrlParams;
|
import org.chromium.content_public.browser.LoadUrlParams;
|
||||||
import org.chromium.ui.KeyboardVisibilityDelegate;
|
import org.chromium.ui.KeyboardVisibilityDelegate;
|
||||||
import org.chromium.ui.modelutil.PropertyModel;
|
import org.chromium.ui.modelutil.PropertyModel;
|
||||||
|
import org.chromium.url.GURL;
|
||||||
import org.chromium.url.JUnitTestGURLs;
|
import org.chromium.url.JUnitTestGURLs;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -1072,7 +1073,7 @@ public class TabGridDialogMediatorUnitTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private TabImpl prepareTab(int id, String title) {
|
private TabImpl prepareTab(int id, String title) {
|
||||||
TabImpl tab = TabUiUnitTestUtils.prepareTab(id, title, "");
|
TabImpl tab = TabUiUnitTestUtils.prepareTab(id, title, GURL.emptyGURL());
|
||||||
doReturn(true).when(tab).isIncognito();
|
doReturn(true).when(tab).isIncognito();
|
||||||
return tab;
|
return tab;
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ import static org.mockito.ArgumentMatchers.any;
|
|||||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
import static org.mockito.ArgumentMatchers.anyLong;
|
import static org.mockito.ArgumentMatchers.anyLong;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyObject;
|
||||||
import static org.mockito.ArgumentMatchers.anyString;
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
import static org.mockito.ArgumentMatchers.contains;
|
import static org.mockito.ArgumentMatchers.contains;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
@ -177,9 +178,9 @@ public class TabListMediatorUnitTest {
|
|||||||
private static final String NEW_TITLE = "New title";
|
private static final String NEW_TITLE = "New title";
|
||||||
private static final String CUSTOMIZED_DIALOG_TITLE1 = "Cool Tabs";
|
private static final String CUSTOMIZED_DIALOG_TITLE1 = "Cool Tabs";
|
||||||
private static final String TAB_GROUP_TITLES_FILE_NAME = "tab_group_titles";
|
private static final String TAB_GROUP_TITLES_FILE_NAME = "tab_group_titles";
|
||||||
private static final String TAB1_URL = JUnitTestGURLs.URL_1;
|
private static final GURL TAB1_URL = JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1);
|
||||||
private static final String TAB2_URL = JUnitTestGURLs.URL_2;
|
private static final GURL TAB2_URL = JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_2);
|
||||||
private static final String TAB3_URL = JUnitTestGURLs.URL_3;
|
private static final GURL TAB3_URL = JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_3);
|
||||||
private static final String NEW_URL = JUnitTestGURLs.EXAMPLE_URL;
|
private static final String NEW_URL = JUnitTestGURLs.EXAMPLE_URL;
|
||||||
private static final int TAB1_ID = 456;
|
private static final int TAB1_ID = 456;
|
||||||
private static final int TAB2_ID = 789;
|
private static final int TAB2_ID = 789;
|
||||||
@ -315,9 +316,9 @@ public class TabListMediatorUnitTest {
|
|||||||
// Ensure native pointer is initialized
|
// Ensure native pointer is initialized
|
||||||
doReturn(1L).when(mOptimizationGuideBridgeJniMock).init();
|
doReturn(1L).when(mOptimizationGuideBridgeJniMock).init();
|
||||||
|
|
||||||
mTab1Domain = JUnitTestGURLs.getGURL(TAB1_URL).getHost().replace("www.", "");
|
mTab1Domain = TAB1_URL.getHost().replace("www.", "");
|
||||||
mTab2Domain = JUnitTestGURLs.getGURL(TAB2_URL).getHost().replace("www.", "");
|
mTab2Domain = TAB2_URL.getHost().replace("www.", "");
|
||||||
mTab3Domain = JUnitTestGURLs.getGURL(TAB3_URL).getHost().replace("www.", "");
|
mTab3Domain = TAB3_URL.getHost().replace("www.", "");
|
||||||
mNewDomain = JUnitTestGURLs.getGURL(NEW_URL).getHost().replace("www.", "");
|
mNewDomain = JUnitTestGURLs.getGURL(NEW_URL).getHost().replace("www.", "");
|
||||||
|
|
||||||
CachedFeatureFlags.setForTesting(ChromeFeatureList.START_SURFACE_ANDROID, false);
|
CachedFeatureFlags.setForTesting(ChromeFeatureList.START_SURFACE_ANDROID, false);
|
||||||
@ -356,10 +357,10 @@ public class TabListMediatorUnitTest {
|
|||||||
doReturn(2).when(mTabModel).getCount();
|
doReturn(2).when(mTabModel).getCount();
|
||||||
doNothing()
|
doNothing()
|
||||||
.when(mTabListFaviconProvider)
|
.when(mTabListFaviconProvider)
|
||||||
.getFaviconForUrlAsync(anyString(), anyBoolean(), mCallbackCaptor.capture());
|
.getFaviconForUrlAsync(anyObject(), anyBoolean(), mCallbackCaptor.capture());
|
||||||
doReturn(mFaviconDrawable)
|
doReturn(mFaviconDrawable)
|
||||||
.when(mTabListFaviconProvider)
|
.when(mTabListFaviconProvider)
|
||||||
.getFaviconForUrlSync(anyString(), anyBoolean(), any(Bitmap.class));
|
.getFaviconForUrlSync(anyObject(), anyBoolean(), any(Bitmap.class));
|
||||||
doReturn(mTab1).when(mTabModelSelector).getTabById(TAB1_ID);
|
doReturn(mTab1).when(mTabModelSelector).getTabById(TAB1_ID);
|
||||||
doReturn(mTab2).when(mTabModelSelector).getTabById(TAB2_ID);
|
doReturn(mTab2).when(mTabModelSelector).getTabById(TAB2_ID);
|
||||||
doReturn(tabs1).when(mTabGroupModelFilter).getRelatedTabList(TAB1_ID);
|
doReturn(tabs1).when(mTabGroupModelFilter).getRelatedTabList(TAB1_ID);
|
||||||
@ -379,13 +380,13 @@ public class TabListMediatorUnitTest {
|
|||||||
doReturn(mSpanSizeLookup).when(mGridLayoutManager).getSpanSizeLookup();
|
doReturn(mSpanSizeLookup).when(mGridLayoutManager).getSpanSizeLookup();
|
||||||
doReturn(mTab1Domain)
|
doReturn(mTab1Domain)
|
||||||
.when(mUrlUtilitiesJniMock)
|
.when(mUrlUtilitiesJniMock)
|
||||||
.getDomainAndRegistry(eq(TAB1_URL), anyBoolean());
|
.getDomainAndRegistry(eq(TAB1_URL.getSpec()), anyBoolean());
|
||||||
doReturn(mTab2Domain)
|
doReturn(mTab2Domain)
|
||||||
.when(mUrlUtilitiesJniMock)
|
.when(mUrlUtilitiesJniMock)
|
||||||
.getDomainAndRegistry(eq(TAB2_URL), anyBoolean());
|
.getDomainAndRegistry(eq(TAB2_URL.getSpec()), anyBoolean());
|
||||||
doReturn(mTab3Domain)
|
doReturn(mTab3Domain)
|
||||||
.when(mUrlUtilitiesJniMock)
|
.when(mUrlUtilitiesJniMock)
|
||||||
.getDomainAndRegistry(eq(TAB3_URL), anyBoolean());
|
.getDomainAndRegistry(eq(TAB3_URL.getSpec()), anyBoolean());
|
||||||
doNothing().when(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture());
|
doNothing().when(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture());
|
||||||
doReturn(true).when(mTabListFaviconProvider).isInitialized();
|
doReturn(true).when(mTabListFaviconProvider).isInitialized();
|
||||||
|
|
||||||
@ -1919,10 +1920,8 @@ public class TabListMediatorUnitTest {
|
|||||||
PriceTrackingUtilities.TRACK_PRICES_ON_TABS, priceTrackingEnabled);
|
PriceTrackingUtilities.TRACK_PRICES_ON_TABS, priceTrackingEnabled);
|
||||||
Profile.setLastUsedProfileForTesting(mProfile);
|
Profile.setLastUsedProfileForTesting(mProfile);
|
||||||
Map<GURL, Any> responses = new HashMap<>();
|
Map<GURL, Any> responses = new HashMap<>();
|
||||||
GURL gurl1 = JUnitTestGURLs.getGURL(TAB1_URL);
|
responses.put(TAB1_URL, ANY_BUYABLE_PRODUCT_INITIAL);
|
||||||
GURL gurl2 = JUnitTestGURLs.getGURL(TAB2_URL);
|
responses.put(TAB2_URL, ANY_EMPTY);
|
||||||
responses.put(gurl1, ANY_BUYABLE_PRODUCT_INITIAL);
|
|
||||||
responses.put(gurl2, ANY_EMPTY);
|
|
||||||
mockOptimizationGuideResponse(OptimizationGuideDecision.TRUE, responses);
|
mockOptimizationGuideResponse(OptimizationGuideDecision.TRUE, responses);
|
||||||
PersistedTabDataConfiguration.setUseTestConfig(true);
|
PersistedTabDataConfiguration.setUseTestConfig(true);
|
||||||
initAndAssertAllProperties(mMediatorSpy);
|
initAndAssertAllProperties(mMediatorSpy);
|
||||||
@ -2436,7 +2435,7 @@ public class TabListMediatorUnitTest {
|
|||||||
List<Tab> tabs = new ArrayList<>(Arrays.asList(mTab1, mTab2, tab3));
|
List<Tab> tabs = new ArrayList<>(Arrays.asList(mTab1, mTab2, tab3));
|
||||||
createTabGroup(tabs, TAB1_ID);
|
createTabGroup(tabs, TAB1_ID);
|
||||||
mTabObserverCaptor.getValue().onFaviconUpdated(mTab1, mFaviconBitmap);
|
mTabObserverCaptor.getValue().onFaviconUpdated(mTab1, mFaviconBitmap);
|
||||||
List<String> urls = new ArrayList<>(Arrays.asList(TAB1_URL, TAB2_URL, TAB3_URL));
|
List<GURL> urls = new ArrayList<>(Arrays.asList(TAB1_URL, TAB2_URL, TAB3_URL));
|
||||||
verify(mTabListFaviconProvider).getComposedFaviconImageAsync(eq(urls), anyBoolean(), any());
|
verify(mTabListFaviconProvider).getComposedFaviconImageAsync(eq(urls), anyBoolean(), any());
|
||||||
mCallbackCaptor.getValue().onResult(mFaviconDrawable);
|
mCallbackCaptor.getValue().onResult(mFaviconDrawable);
|
||||||
assertThat(mModel.get(0).model.get(TabProperties.FAVICON), equalTo(mFaviconDrawable));
|
assertThat(mModel.get(0).model.get(TabProperties.FAVICON), equalTo(mFaviconDrawable));
|
||||||
@ -2444,11 +2443,12 @@ public class TabListMediatorUnitTest {
|
|||||||
// Test a group of five.
|
// Test a group of five.
|
||||||
mModel.get(1).model.set(TabProperties.FAVICON, null);
|
mModel.get(1).model.set(TabProperties.FAVICON, null);
|
||||||
TabImpl tab4 = prepareTab(0, "tab 4", TAB2_URL);
|
TabImpl tab4 = prepareTab(0, "tab 4", TAB2_URL);
|
||||||
TabImpl tab5 = prepareTab(1, "tab 5", "www.tab5.com");
|
TabImpl tab5 = prepareTab(1, "tab 5", JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL));
|
||||||
tabs.addAll(Arrays.asList(tab4, tab5));
|
tabs.addAll(Arrays.asList(tab4, tab5));
|
||||||
createTabGroup(tabs, TAB2_ID);
|
createTabGroup(tabs, TAB2_ID);
|
||||||
mTabObserverCaptor.getValue().onFaviconUpdated(mTab2, mFaviconBitmap);
|
mTabObserverCaptor.getValue().onFaviconUpdated(mTab2, mFaviconBitmap);
|
||||||
urls = new ArrayList<>(Arrays.asList(TAB2_URL, TAB1_URL, TAB3_URL, TAB2_URL));
|
urls = new ArrayList<>(Arrays.asList(TAB2_URL, TAB1_URL, TAB3_URL, TAB2_URL));
|
||||||
|
|
||||||
verify(mTabListFaviconProvider).getComposedFaviconImageAsync(eq(urls), anyBoolean(), any());
|
verify(mTabListFaviconProvider).getComposedFaviconImageAsync(eq(urls), anyBoolean(), any());
|
||||||
mCallbackCaptor.getValue().onResult(mFaviconDrawable);
|
mCallbackCaptor.getValue().onResult(mFaviconDrawable);
|
||||||
assertThat(mModel.get(1).model.get(TabProperties.FAVICON), equalTo(mFaviconDrawable));
|
assertThat(mModel.get(1).model.get(TabProperties.FAVICON), equalTo(mFaviconDrawable));
|
||||||
@ -2704,7 +2704,7 @@ public class TabListMediatorUnitTest {
|
|||||||
instanceOf(TabListMediator.TabActionListener.class));
|
instanceOf(TabListMediator.TabActionListener.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
private TabImpl prepareTab(int id, String title, String url) {
|
private TabImpl prepareTab(int id, String title, GURL url) {
|
||||||
TabImpl tab = TabUiUnitTestUtils.prepareTab(id, title, url);
|
TabImpl tab = TabUiUnitTestUtils.prepareTab(id, title, url);
|
||||||
when(tab.getView()).thenReturn(mock(View.class));
|
when(tab.getView()).thenReturn(mock(View.class));
|
||||||
doReturn(true).when(tab).isIncognito();
|
doReturn(true).when(tab).isIncognito();
|
||||||
|
@ -53,17 +53,13 @@ public class TabUiUnitTestUtils {
|
|||||||
doReturn(userDataHost).when(tab).getUserDataHost();
|
doReturn(userDataHost).when(tab).getUserDataHost();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TabImpl prepareTab(int id, String title, String urlString) {
|
public static TabImpl prepareTab(int id, String title, GURL url) {
|
||||||
CriticalPersistedTabData criticalPersistedTabData = mock(CriticalPersistedTabData.class);
|
CriticalPersistedTabData criticalPersistedTabData = mock(CriticalPersistedTabData.class);
|
||||||
TabImpl tab = prepareTab(id, criticalPersistedTabData);
|
TabImpl tab = prepareTab(id, criticalPersistedTabData);
|
||||||
doReturn(id).when(criticalPersistedTabData).getRootId();
|
doReturn(id).when(criticalPersistedTabData).getRootId();
|
||||||
doReturn(title).when(tab).getTitle();
|
doReturn(title).when(tab).getTitle();
|
||||||
|
doReturn(url).when(tab).getOriginalUrl();
|
||||||
// TODO(crbug/783819): don't mock GURL here.
|
doReturn(url).when(tab).getUrl();
|
||||||
GURL gurl = mock(GURL.class);
|
|
||||||
doReturn(urlString).when(gurl).getSpec();
|
|
||||||
doReturn(gurl).when(tab).getOriginalUrl();
|
|
||||||
doReturn(gurl).when(tab).getUrl();
|
|
||||||
return tab;
|
return tab;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ class FaviconHelper::Job {
|
|||||||
public:
|
public:
|
||||||
Job(FaviconHelper* favicon_helper,
|
Job(FaviconHelper* favicon_helper,
|
||||||
favicon::FaviconService* favicon_service,
|
favicon::FaviconService* favicon_service,
|
||||||
std::vector<std::string> urls,
|
std::vector<GURL> urls,
|
||||||
int desire_size_in_pixel,
|
int desire_size_in_pixel,
|
||||||
JobFinishedCallback job_finished_callback,
|
JobFinishedCallback job_finished_callback,
|
||||||
favicon_base::FaviconResultsCallback result_callback);
|
favicon_base::FaviconResultsCallback result_callback);
|
||||||
@ -73,7 +73,7 @@ class FaviconHelper::Job {
|
|||||||
const favicon_base::FaviconRawBitmapResult& result);
|
const favicon_base::FaviconRawBitmapResult& result);
|
||||||
FaviconHelper* favicon_helper_;
|
FaviconHelper* favicon_helper_;
|
||||||
favicon::FaviconService* favicon_service_;
|
favicon::FaviconService* favicon_service_;
|
||||||
std::vector<std::string> urls_;
|
std::vector<GURL> urls_;
|
||||||
int desire_size_in_pixel_;
|
int desire_size_in_pixel_;
|
||||||
JobFinishedCallback job_finished_callback_;
|
JobFinishedCallback job_finished_callback_;
|
||||||
favicon_base::FaviconResultsCallback result_callback_;
|
favicon_base::FaviconResultsCallback result_callback_;
|
||||||
@ -86,7 +86,7 @@ class FaviconHelper::Job {
|
|||||||
|
|
||||||
FaviconHelper::Job::Job(FaviconHelper* favicon_helper,
|
FaviconHelper::Job::Job(FaviconHelper* favicon_helper,
|
||||||
favicon::FaviconService* favicon_service,
|
favicon::FaviconService* favicon_service,
|
||||||
std::vector<std::string> urls,
|
std::vector<GURL> urls,
|
||||||
int desire_size_in_pixel,
|
int desire_size_in_pixel,
|
||||||
JobFinishedCallback job_finished_callback,
|
JobFinishedCallback job_finished_callback,
|
||||||
favicon_base::FaviconResultsCallback result_callback)
|
favicon_base::FaviconResultsCallback result_callback)
|
||||||
@ -113,7 +113,7 @@ void FaviconHelper::Job::Start() {
|
|||||||
weak_ptr_factory_.GetWeakPtr(), i);
|
weak_ptr_factory_.GetWeakPtr(), i);
|
||||||
|
|
||||||
favicon_helper_->GetLocalFaviconImageForURLInternal(
|
favicon_helper_->GetLocalFaviconImageForURLInternal(
|
||||||
favicon_service_, GURL(urls_.at(i)), desire_size_in_pixel_,
|
favicon_service_, urls_.at(i), desire_size_in_pixel_,
|
||||||
std::move(callback));
|
std::move(callback));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -180,8 +180,8 @@ jboolean FaviconHelper::GetComposedFaviconImage(
|
|||||||
ScopedJavaGlobalRef<jobject>(j_favicon_image_callback),
|
ScopedJavaGlobalRef<jobject>(j_favicon_image_callback),
|
||||||
desired_size_in_pixel);
|
desired_size_in_pixel);
|
||||||
|
|
||||||
std::vector<std::string> urls;
|
std::vector<GURL> urls;
|
||||||
base::android::AppendJavaStringArrayToStringVector(env, j_urls, &urls);
|
url::GURLAndroid::JavaGURLArrayToGURLVector(env, j_urls, &urls);
|
||||||
|
|
||||||
GetComposedFaviconImageInternal(favicon_service, urls,
|
GetComposedFaviconImageInternal(favicon_service, urls,
|
||||||
static_cast<int>(j_desired_size_in_pixel),
|
static_cast<int>(j_desired_size_in_pixel),
|
||||||
@ -192,7 +192,7 @@ jboolean FaviconHelper::GetComposedFaviconImage(
|
|||||||
|
|
||||||
void FaviconHelper::GetComposedFaviconImageInternal(
|
void FaviconHelper::GetComposedFaviconImageInternal(
|
||||||
favicon::FaviconService* favicon_service,
|
favicon::FaviconService* favicon_service,
|
||||||
std::vector<std::string> urls,
|
std::vector<GURL> urls,
|
||||||
int desired_size_in_pixel,
|
int desired_size_in_pixel,
|
||||||
favicon_base::FaviconResultsCallback callback_runner) {
|
favicon_base::FaviconResultsCallback callback_runner) {
|
||||||
DCHECK(favicon_service);
|
DCHECK(favicon_service);
|
||||||
|
@ -48,7 +48,7 @@ class FaviconHelper {
|
|||||||
favicon_base::FaviconRawBitmapCallback callback_runner);
|
favicon_base::FaviconRawBitmapCallback callback_runner);
|
||||||
void GetComposedFaviconImageInternal(
|
void GetComposedFaviconImageInternal(
|
||||||
favicon::FaviconService* favicon_service,
|
favicon::FaviconService* favicon_service,
|
||||||
std::vector<std::string> urls,
|
std::vector<GURL> urls,
|
||||||
int desired_size_in_pixel,
|
int desired_size_in_pixel,
|
||||||
favicon_base::FaviconResultsCallback callback_runner);
|
favicon_base::FaviconResultsCallback callback_runner);
|
||||||
void OnJobFinished(int job_id);
|
void OnJobFinished(int job_id);
|
||||||
|
@ -89,10 +89,9 @@ TEST_F(FaviconHelperTest, GetLargestSizeIndex) {
|
|||||||
|
|
||||||
TEST_F(FaviconHelperTest, GetComposedFaviconImage) {
|
TEST_F(FaviconHelperTest, GetComposedFaviconImage) {
|
||||||
raw_bitmap_results_.clear();
|
raw_bitmap_results_.clear();
|
||||||
std::vector<std::string> urls = {"http://www.tab1.com",
|
GURL url1 = GURL("http://www.tab1.com");
|
||||||
"http://www.tab2.com"};
|
GURL url2 = GURL("http://www.tab2.com");
|
||||||
GURL url1 = GURL(urls[0]);
|
std::vector<GURL> urls = {url1, url2};
|
||||||
GURL url2 = GURL(urls[1]);
|
|
||||||
|
|
||||||
EXPECT_CALL(mock_favicon_service_,
|
EXPECT_CALL(mock_favicon_service_,
|
||||||
GetRawFaviconForPageURL(url1, _, _, 16, _, _))
|
GetRawFaviconForPageURL(url1, _, _, 16, _, _))
|
||||||
@ -112,11 +111,10 @@ TEST_F(FaviconHelperTest, GetComposedFaviconImage) {
|
|||||||
|
|
||||||
TEST_F(FaviconHelperTest, GetComposedFaviconImageWithOneFaviconFailed) {
|
TEST_F(FaviconHelperTest, GetComposedFaviconImageWithOneFaviconFailed) {
|
||||||
raw_bitmap_results_.clear();
|
raw_bitmap_results_.clear();
|
||||||
std::vector<std::string> urls = {"http://www.tab1.com", "http://www.tab2.com",
|
GURL url1 = GURL("http://www.tab1.com");
|
||||||
"http://www.tab3.com"};
|
GURL url2 = GURL("http://www.tab2.com");
|
||||||
GURL url1 = GURL(urls[0]);
|
GURL url3 = GURL("http://www.tab3.com");
|
||||||
GURL url2 = GURL(urls[1]);
|
std::vector<GURL> urls = {url1, url2, url3};
|
||||||
GURL url3 = GURL(urls[2]);
|
|
||||||
|
|
||||||
EXPECT_CALL(mock_favicon_service_,
|
EXPECT_CALL(mock_favicon_service_,
|
||||||
GetRawFaviconForPageURL(url1, _, _, 16, _, _))
|
GetRawFaviconForPageURL(url1, _, _, 16, _, _))
|
||||||
@ -144,11 +142,10 @@ TEST_F(FaviconHelperTest, GetComposedFaviconImageWithOneFaviconFailed) {
|
|||||||
|
|
||||||
TEST_F(FaviconHelperTest, GetComposedFaviconImageOrderMatchesInput) {
|
TEST_F(FaviconHelperTest, GetComposedFaviconImageOrderMatchesInput) {
|
||||||
raw_bitmap_results_.clear();
|
raw_bitmap_results_.clear();
|
||||||
std::vector<std::string> urls = {"http://www.tab1.com", "http://www.tab2.com",
|
GURL url1 = GURL("http://www.tab1.com");
|
||||||
"http://www.tab3.com"};
|
GURL url2 = GURL("http://www.tab2.com");
|
||||||
GURL url1 = GURL(urls[0]);
|
GURL url3 = GURL("http://www.tab3.com");
|
||||||
GURL url2 = GURL(urls[1]);
|
std::vector<GURL> urls = {url1, url2, url3};
|
||||||
GURL url3 = GURL(urls[2]);
|
|
||||||
|
|
||||||
EXPECT_CALL(mock_favicon_service_,
|
EXPECT_CALL(mock_favicon_service_,
|
||||||
GetRawFaviconForPageURL(url1, _, _, 16, _, _))
|
GetRawFaviconForPageURL(url1, _, _, 16, _, _))
|
||||||
|
6
chrome/browser/ui/android/favicon/java/src/org/chromium/chrome/browser/ui/favicon/FaviconHelper.java
6
chrome/browser/ui/android/favicon/java/src/org/chromium/chrome/browser/ui/favicon/FaviconHelper.java
@ -191,7 +191,7 @@ public class FaviconHelper {
|
|||||||
* that this callback is not called if this method returns false.
|
* that this callback is not called if this method returns false.
|
||||||
* @return True if GetLocalFaviconImageForURL is successfully called.
|
* @return True if GetLocalFaviconImageForURL is successfully called.
|
||||||
*/
|
*/
|
||||||
public boolean getComposedFaviconImage(Profile profile, @NonNull List<String> urls,
|
public boolean getComposedFaviconImage(Profile profile, @NonNull List<GURL> urls,
|
||||||
int desiredSizeInPixel, FaviconImageCallback faviconImageCallback) {
|
int desiredSizeInPixel, FaviconImageCallback faviconImageCallback) {
|
||||||
assert mNativeFaviconHelper != 0;
|
assert mNativeFaviconHelper != 0;
|
||||||
|
|
||||||
@ -201,14 +201,14 @@ public class FaviconHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return FaviconHelperJni.get().getComposedFaviconImage(mNativeFaviconHelper, profile,
|
return FaviconHelperJni.get().getComposedFaviconImage(mNativeFaviconHelper, profile,
|
||||||
urls.toArray(new String[0]), desiredSizeInPixel, faviconImageCallback);
|
urls.toArray(new GURL[0]), desiredSizeInPixel, faviconImageCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NativeMethods
|
@NativeMethods
|
||||||
interface Natives {
|
interface Natives {
|
||||||
long init();
|
long init();
|
||||||
void destroy(long nativeFaviconHelper);
|
void destroy(long nativeFaviconHelper);
|
||||||
boolean getComposedFaviconImage(long nativeFaviconHelper, Profile profile, String[] urls,
|
boolean getComposedFaviconImage(long nativeFaviconHelper, Profile profile, GURL[] urls,
|
||||||
int desiredSizeInDip, FaviconImageCallback faviconImageCallback);
|
int desiredSizeInDip, FaviconImageCallback faviconImageCallback);
|
||||||
boolean getLocalFaviconImageForURL(long nativeFaviconHelper, Profile profile,
|
boolean getLocalFaviconImageForURL(long nativeFaviconHelper, Profile profile,
|
||||||
String pageUrl, int desiredSizeInDip, FaviconImageCallback faviconImageCallback);
|
String pageUrl, int desiredSizeInDip, FaviconImageCallback faviconImageCallback);
|
||||||
|
@ -57,6 +57,17 @@ static void InitFromGURL(JNIEnv* env,
|
|||||||
gurl.parsed_for_possibly_invalid_spec()));
|
gurl.parsed_for_possibly_invalid_spec()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// As |GetArrayLength| makes no guarantees about the returned value (e.g., it
|
||||||
|
// may be -1 if |array| is not a valid Java array), provide a safe wrapper
|
||||||
|
// that always returns a valid, non-negative size.
|
||||||
|
template <typename JavaArrayType>
|
||||||
|
size_t SafeGetArrayLength(JNIEnv* env, const JavaRef<JavaArrayType>& jarray) {
|
||||||
|
DCHECK(jarray);
|
||||||
|
jsize length = env->GetArrayLength(jarray.obj());
|
||||||
|
DCHECK_GE(length, 0) << "Invalid array length: " << length;
|
||||||
|
return static_cast<size_t>(std::max(0, length));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
// static
|
// static
|
||||||
@ -67,6 +78,23 @@ std::unique_ptr<GURL> GURLAndroid::ToNativeGURL(
|
|||||||
reinterpret_cast<GURL*>(Java_GURL_toNativeGURL(env, j_gurl)));
|
reinterpret_cast<GURL*>(Java_GURL_toNativeGURL(env, j_gurl)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GURLAndroid::JavaGURLArrayToGURLVector(
|
||||||
|
JNIEnv* env,
|
||||||
|
const base::android::JavaRef<jobjectArray>& array,
|
||||||
|
std::vector<GURL>* out) {
|
||||||
|
DCHECK(out);
|
||||||
|
DCHECK(out->empty());
|
||||||
|
if (!array)
|
||||||
|
return;
|
||||||
|
size_t len = SafeGetArrayLength(env, array);
|
||||||
|
for (size_t i = 0; i < len; ++i) {
|
||||||
|
ScopedJavaLocalRef<jobject> j_gurl(
|
||||||
|
env, static_cast<jobject>(env->GetObjectArrayElement(array.obj(), i)));
|
||||||
|
out->emplace_back(
|
||||||
|
*reinterpret_cast<GURL*>(Java_GURL_toNativeGURL(env, j_gurl)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
ScopedJavaLocalRef<jobject> GURLAndroid::FromNativeGURL(JNIEnv* env,
|
ScopedJavaLocalRef<jobject> GURLAndroid::FromNativeGURL(JNIEnv* env,
|
||||||
const GURL& gurl) {
|
const GURL& gurl) {
|
||||||
|
@ -25,6 +25,10 @@ class GURLAndroid {
|
|||||||
static base::android::ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfGURLs(
|
static base::android::ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfGURLs(
|
||||||
JNIEnv* env,
|
JNIEnv* env,
|
||||||
base::span<base::android::ScopedJavaLocalRef<jobject>> v);
|
base::span<base::android::ScopedJavaLocalRef<jobject>> v);
|
||||||
|
static void JavaGURLArrayToGURLVector(
|
||||||
|
JNIEnv* env,
|
||||||
|
const base::android::JavaRef<jobjectArray>& gurl_array,
|
||||||
|
std::vector<GURL>* out);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace url
|
} // namespace url
|
||||||
|
@ -25,6 +25,7 @@ public class JUnitTestGURLs {
|
|||||||
// in the map.
|
// in the map.
|
||||||
public static final String EXAMPLE_URL = "https://www.example.com/";
|
public static final String EXAMPLE_URL = "https://www.example.com/";
|
||||||
public static final String URL_1 = "https://www.one.com/";
|
public static final String URL_1 = "https://www.one.com/";
|
||||||
|
public static final String URL_1_NUMERAL = "https://www.1.com/";
|
||||||
public static final String URL_1_WITH_PATH = "https://www.one.com/some_path.html";
|
public static final String URL_1_WITH_PATH = "https://www.one.com/some_path.html";
|
||||||
public static final String URL_2 = "https://www.two.com/";
|
public static final String URL_2 = "https://www.two.com/";
|
||||||
public static final String URL_3 = "https://www.three.com/";
|
public static final String URL_3 = "https://www.three.com/";
|
||||||
@ -56,6 +57,9 @@ public class JUnitTestGURLs {
|
|||||||
map.put(URL_1,
|
map.put(URL_1,
|
||||||
"78,1,true,0,5,0,-1,0,-1,8,11,0,-1,19,1,0,-1,0,-1,"
|
"78,1,true,0,5,0,-1,0,-1,8,11,0,-1,19,1,0,-1,0,-1,"
|
||||||
+ "false,false,https://www.one.com/");
|
+ "false,false,https://www.one.com/");
|
||||||
|
map.put(URL_1_NUMERAL,
|
||||||
|
"75,1,true,0,5,0,-1,0,-1,8,9,0,-1,17,1,0,-1,0,-1,"
|
||||||
|
+ "false,false,https://www.1.com/");
|
||||||
map.put(URL_1_WITH_PATH,
|
map.put(URL_1_WITH_PATH,
|
||||||
"93,1,true,0,5,0,-1,0,-1,8,11,0,-1,19,15,0,-1,0,-1,"
|
"93,1,true,0,5,0,-1,0,-1,8,11,0,-1,19,15,0,-1,0,-1,"
|
||||||
+ "false,false,https://www.one.com/some_path.html");
|
+ "false,false,https://www.one.com/some_path.html");
|
||||||
|
Reference in New Issue
Block a user