Commit 08fd1ef0 authored by Jinsuk Kim's avatar Jinsuk Kim Committed by Chromium LUCI CQ

Toolbar: Removes LocationBarModel's dependency on //chrome_java

LocationBarModel has several dependencies on classes in //chrome_java
target that provide public static utils methods. This CL injects
them as functional interfaces through the constructor.

Bug: 1127732
Change-Id: Ia502e2d43bc140c1a6e5efa735e93a30a4b61e2f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2543725Reviewed-by: default avatarPatrick Noland <pnoland@chromium.org>
Reviewed-by: default avatarChris Thompson <cthomp@chromium.org>
Reviewed-by: default avatarFilip Gorski <fgorski@chromium.org>
Commit-Queue: Jinsuk Kim <jinsukkim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#835115}
parent 24ffc7e8
......@@ -3418,7 +3418,6 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/tab/TabFavicon.java",
"java/src/org/chromium/chrome/browser/tab/TabImpl.java",
"java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java",
"java/src/org/chromium/chrome/browser/tab/TrustedCdn.java",
"java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java",
"java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java",
"java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java",
......
......@@ -441,6 +441,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelper.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionIconGenerator.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabTopBarDelegate.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabTrustedCdnPublisherUrlVisibility.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabsClientFileProcessor.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionServiceImpl.java",
......@@ -1374,8 +1375,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/tab/TabViewManagerImpl.java",
"java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java",
"java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java",
"java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java",
"java/src/org/chromium/chrome/browser/tab/TrustedCdn.java",
"java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java",
"java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java",
"java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java",
......
......@@ -1028,13 +1028,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
|| getActivityType() == ActivityType.TRUSTED_WEB_ACTIVITY;
}
/**
* @return Whether the given activity can show the publisher URL from a trusted CDN.
*/
public boolean canShowTrustedCdnPublisherUrl() {
return false;
}
/**
* Actions that may be run at some point after startup. Place tasks that are not critical to the
* startup path here. This method will be called automatically.
......
......@@ -38,13 +38,11 @@ import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigatio
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvider;
import org.chromium.chrome.browser.customtabs.features.CustomTabNavigationBarController;
import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.infobar.InfoBarContainer;
import org.chromium.chrome.browser.night_mode.NightModeStateProvider;
import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
import org.chromium.chrome.browser.page_info.ChromePageInfoControllerDelegate;
import org.chromium.chrome.browser.page_info.ChromePermissionParamsListBuilderDelegate;
import org.chromium.chrome.browser.previews.Previews;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.components.page_info.PageInfoController;
import org.chromium.content_public.browser.LoadUrlParams;
......@@ -135,6 +133,14 @@ public class CustomTabActivity extends BaseCustomTabActivity {
mConnection.showSignInToastIfNecessary(mSession, getIntent());
new CustomTabTrustedCdnPublisherUrlVisibility(
getWindowAndroid(), getLifecycleDispatcher(), () -> {
String urlPackage = mConnection.getTrustedCdnPublisherUrlPackage();
return urlPackage != null
&& urlPackage.equals(
mConnection.getClientPackageNameForSession(mSession));
});
super.finishNativeInitialization();
// We start the Autofill Assistant after the call to super.finishNativeInitialization() as
......@@ -275,19 +281,6 @@ public class CustomTabActivity extends BaseCustomTabActivity {
return super.requiresFirstRunToBeCompleted(intent);
}
@Override
public boolean canShowTrustedCdnPublisherUrl() {
if (!ChromeFeatureList.isEnabled(ChromeFeatureList.SHOW_TRUSTED_PUBLISHER_URL)) {
return false;
}
if (Previews.isPreview(mTabProvider.getTab())) return false;
String publisherUrlPackage = mConnection.getTrustedCdnPublisherUrlPackage();
return publisherUrlPackage != null
&& publisherUrlPackage.equals(mConnection.getClientPackageNameForSession(mSession));
}
/**
* @return The package name of the Trusted Web Activity, if the activity is a TWA; null
* otherwise.
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.customtabs;
import org.chromium.base.UnownedUserData;
import org.chromium.base.supplier.BooleanSupplier;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.lifecycle.Destroyable;
import org.chromium.chrome.browser.previews.Previews;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TrustedCdn.PublisherUrlVisibility;
import org.chromium.ui.base.WindowAndroid;
/**
* Implementation of {@link TrustedCdn.PublisherUrlVisibility} to provide Tab with
* the availability of publisher URL of trusted CDN when attached to a custom tab activity.
*/
class CustomTabTrustedCdnPublisherUrlVisibility
implements PublisherUrlVisibility, Destroyable, UnownedUserData {
private WindowAndroid mWindowAndroid;
private BooleanSupplier mIsPublisherPackageForSession;
CustomTabTrustedCdnPublisherUrlVisibility(WindowAndroid windowAndroid,
ActivityLifecycleDispatcher lifecycleDispatcher,
BooleanSupplier isPublisherPackageForSession) {
mWindowAndroid = windowAndroid;
mIsPublisherPackageForSession = isPublisherPackageForSession;
lifecycleDispatcher.register(this);
PublisherUrlVisibility.attach(mWindowAndroid, this);
}
@Override
public boolean canShowPublisherUrl(Tab tab) {
if (!ChromeFeatureList.isEnabled(ChromeFeatureList.SHOW_TRUSTED_PUBLISHER_URL)) {
return false;
}
if (Previews.isPreview(tab)) return false;
return mIsPublisherPackageForSession.getAsBoolean();
}
@Override
public void destroy() {
PublisherUrlVisibility.detach(this);
mWindowAndroid = null;
mIsPublisherPackageForSession = null;
}
}
......@@ -4,14 +4,13 @@
package org.chromium.chrome.browser.toolbar;
import static org.chromium.chrome.browser.incognito.IncognitoUtils.getNonPrimaryOTRProfileFromWindowAndroid;
import android.content.Context;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.annotation.VisibleForTesting;
......@@ -20,10 +19,8 @@ import org.chromium.base.ObserverList;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.dom_distiller.DomDistillerTabUtils;
import org.chromium.chrome.browser.layouts.LayoutStateProvider;
import org.chromium.chrome.browser.layouts.LayoutType;
import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
import org.chromium.chrome.browser.omnibox.ChromeAutocompleteSchemeClassifier;
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
import org.chromium.chrome.browser.omnibox.SearchEngineLogoUtils;
......@@ -55,8 +52,46 @@ import java.net.URISyntaxException;
* Provides a way of accessing toolbar data and state.
*/
public class LocationBarModel implements ToolbarDataProvider, LocationBarDataProvider {
/**
* Formats the given URL to the original one of a distillation.
*/
@FunctionalInterface
public interface UrlFormatter {
String format(String url);
}
/**
* Provides non-primary incognito profile.
*/
@FunctionalInterface
public interface ProfileProvider {
Profile getNonPrimaryOtrProfile(WindowAndroid window);
}
/**
* Offline-related status of a given content.
*/
public interface OfflineStatus {
/**
* Returns whether the WebContents is showing trusted offline page.
*/
default boolean isShowingTrustedOfflinePage(WebContents webContents) {
return false;
}
/**
* Checks if an offline page is shown for the tab.
*/
default boolean isOfflinePage(Tab tab) {
return false;
}
}
private final Context mContext;
private final NewTabPageDelegate mNtpDelegate;
private final @NonNull UrlFormatter mUrlFormatter;
private final @NonNull ProfileProvider mProfileProvider;
private final @NonNull OfflineStatus mOfflineStatus;
private Tab mTab;
private int mPrimaryColor;
......@@ -73,10 +108,20 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro
/**
* Default constructor for this class.
* @param context The Context used for styling the toolbar visuals.
* @param newTabPageDelegate Delegate used to access NTP.
* @param urlFormatter Formatter returning the formatted version of the original version
* of URL of a distillation.
* @param profileProvider Interface returning non-primary OTR profile.
* @param offlineStatus Offline-related status provider.
*/
public LocationBarModel(Context context, NewTabPageDelegate newTabPageDelegate) {
public LocationBarModel(Context context, NewTabPageDelegate newTabPageDelegate,
@NonNull UrlFormatter urlFormatter, @NonNull ProfileProvider profileProvider,
@NonNull OfflineStatus offlineStatus) {
mContext = context;
mNtpDelegate = newTabPageDelegate;
mUrlFormatter = urlFormatter;
mProfileProvider = profileProvider;
mOfflineStatus = offlineStatus;
mPrimaryColor = ChromeColors.getDefaultThemeColor(context.getResources(), false);
}
......@@ -195,8 +240,7 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro
if (DomDistillerUrlUtils.isDistilledPage(url)) {
String originalUrl = DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(url);
if (originalUrl != null) {
return buildUrlBarData(
DomDistillerTabUtils.getFormattedUrlFromOriginalDistillerUrl(originalUrl));
return buildUrlBarData(mUrlFormatter.format(originalUrl));
}
return buildUrlBarData(url, formattedUrl);
}
......@@ -208,11 +252,10 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro
if (isOfflinePage()) {
String originalUrl = mTab.getOriginalUrl();
formattedUrl = UrlUtilities.stripScheme(
DomDistillerTabUtils.getFormattedUrlFromOriginalDistillerUrl(originalUrl));
formattedUrl = UrlUtilities.stripScheme(mUrlFormatter.format(originalUrl));
// Clear the editing text for untrusted offline pages.
if (!OfflinePageUtils.isShowingTrustedOfflinePage(mTab.getWebContents())) {
if (!mOfflineStatus.isShowingTrustedOfflinePage(mTab.getWebContents())) {
return buildUrlBarData(url, formattedUrl, "");
}
......@@ -330,8 +373,8 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro
WindowAndroid windowAndroid = (mTab != null) ? mTab.getWindowAndroid() : null;
// If the mTab belongs to a CustomTabActivity then we return the non-primary OTR profile
// which is associated with it. For all other cases we return the primary OTR profile.
Profile nonPrimaryOTRProfile = getNonPrimaryOTRProfileFromWindowAndroid(windowAndroid);
if (nonPrimaryOTRProfile != null) return nonPrimaryOTRProfile;
Profile nonPrimaryOtrProfile = mProfileProvider.getNonPrimaryOtrProfile(windowAndroid);
if (nonPrimaryOtrProfile != null) return nonPrimaryOtrProfile;
// When in overview mode with no open tabs, there has not been created an
// OTR profile yet. #getOffTheRecordProfile will create a profile if none
......@@ -393,7 +436,7 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro
@Override
public boolean isOfflinePage() {
return hasTab() && OfflinePageUtils.isOfflinePage(mTab);
return hasTab() && mOfflineStatus.isOfflinePage(mTab);
}
@Override
......@@ -409,7 +452,8 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro
@Override
public int getSecurityLevel() {
Tab tab = getTab();
return getSecurityLevel(tab, isOfflinePage(), TrustedCdn.getPublisherUrl(tab));
String publisherUrl = tab != null ? TrustedCdn.getPublisherUrl(tab) : null;
return getSecurityLevel(tab, isOfflinePage(), publisherUrl);
}
@Override
......
......@@ -49,6 +49,7 @@ import org.chromium.chrome.browser.compositor.layouts.Layout;
import org.chromium.chrome.browser.compositor.layouts.LayoutManagerImpl;
import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver;
import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbar;
import org.chromium.chrome.browser.dom_distiller.DomDistillerTabUtils;
import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
import org.chromium.chrome.browser.findinpage.FindToolbarManager;
import org.chromium.chrome.browser.findinpage.FindToolbarObserver;
......@@ -58,6 +59,7 @@ import org.chromium.chrome.browser.fullscreen.FullscreenOptions;
import org.chromium.chrome.browser.homepage.HomepageManager;
import org.chromium.chrome.browser.homepage.HomepagePolicyManager;
import org.chromium.chrome.browser.identity_disc.IdentityDiscController;
import org.chromium.chrome.browser.incognito.IncognitoUtils;
import org.chromium.chrome.browser.intent.IntentMetadata;
import org.chromium.chrome.browser.layouts.LayoutStateProvider;
import org.chromium.chrome.browser.layouts.LayoutType;
......@@ -65,6 +67,7 @@ import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.ntp.FakeboxDelegate;
import org.chromium.chrome.browser.ntp.IncognitoNewTabPage;
import org.chromium.chrome.browser.ntp.NewTabPage;
import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
import org.chromium.chrome.browser.omnibox.LocationBar;
import org.chromium.chrome.browser.omnibox.LocationBarCoordinator;
import org.chromium.chrome.browser.omnibox.OmniboxFocusReason;
......@@ -359,7 +362,20 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
ToolbarLayout toolbarLayout = mActivity.findViewById(R.id.toolbar);
NewTabPageDelegate ntpDelegate = createNewTabPageDelegate(toolbarLayout);
mLocationBarModel = new LocationBarModel(activity, ntpDelegate);
mLocationBarModel = new LocationBarModel(activity, ntpDelegate,
DomDistillerTabUtils::getFormattedUrlFromOriginalDistillerUrl,
IncognitoUtils::getNonPrimaryOTRProfileFromWindowAndroid,
new LocationBarModel.OfflineStatus() {
@Override
public boolean isShowingTrustedOfflinePage(WebContents webContents) {
return OfflinePageUtils.isShowingTrustedOfflinePage(webContents);
}
@Override
public boolean isOfflinePage(Tab tab) {
return OfflinePageUtils.isOfflinePage(tab);
}
});
mControlContainer = controlContainer;
assert mControlContainer != null;
......
......@@ -41,6 +41,7 @@ import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.Matchers;
import org.chromium.base.test.util.Restriction;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.dom_distiller.DomDistillerTabUtils;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.tab.Tab;
......@@ -53,6 +54,7 @@ import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.components.security_state.ConnectionSecurityLevel;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.test.util.ClickUtils;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.ui.test.util.UiRestriction;
......@@ -81,6 +83,18 @@ public class LocationBarLayoutTest {
private TestLocationBarModel mTestLocationBarModel;
public static final LocationBarModel.OfflineStatus OFFLINE_STATUS =
new LocationBarModel.OfflineStatus() {
@Override
public boolean isShowingTrustedOfflinePage(WebContents webContents) {
return false;
}
@Override
public boolean isOfflinePage(Tab tab) {
return false;
}
};
private class TestLocationBarModel extends LocationBarModel {
private String mCurrentUrl;
private String mEditingText;
......@@ -88,7 +102,9 @@ public class LocationBarLayoutTest {
private Integer mSecurityLevel;
public TestLocationBarModel() {
super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY);
super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY,
DomDistillerTabUtils::getFormattedUrlFromOriginalDistillerUrl,
window -> null, OFFLINE_STATUS);
initializeWithNative();
}
......
......@@ -24,6 +24,7 @@ import org.chromium.chrome.browser.toolbar.LocationBarModel;
import org.chromium.chrome.browser.toolbar.NewTabPageDelegate;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.util.ChromeRenderTestRule;
import org.chromium.chrome.test.util.ToolbarTestUtils;
import org.chromium.components.browser_ui.widget.CompositeTouchDelegate;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
......@@ -73,7 +74,8 @@ public class StatusViewRenderTest extends DummyUiActivityTestCase {
.findViewById(org.chromium.chrome.R.id.location_bar_status);
mStatusView.setCompositeTouchDelegate(new CompositeTouchDelegate(view));
mStatusView.setLocationBarDataProvider(
new LocationBarModel(mStatusView.getContext(), NewTabPageDelegate.EMPTY));
new LocationBarModel(mStatusView.getContext(), NewTabPageDelegate.EMPTY,
url -> url, window -> null, ToolbarTestUtils.OFFLINE_STATUS));
mStatusModel = new PropertyModel.Builder(StatusProperties.ALL_KEYS).build();
PropertyModelChangeProcessor.create(mStatusModel, mStatusView, new StatusViewBinder());
});
......
......@@ -38,6 +38,7 @@ import org.chromium.chrome.browser.omnibox.status.StatusProperties.StatusIconRes
import org.chromium.chrome.browser.toolbar.LocationBarModel;
import org.chromium.chrome.browser.toolbar.NewTabPageDelegate;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.util.ToolbarTestUtils;
import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
import org.chromium.components.browser_ui.widget.CompositeTouchDelegate;
import org.chromium.ui.modelutil.PropertyModel;
......@@ -77,7 +78,8 @@ public class StatusViewTest extends DummyUiActivityTestCase {
mStatusView.setDelegateForTesting(mStatusViewDelegate);
mStatusView.setCompositeTouchDelegate(new CompositeTouchDelegate(view));
mStatusView.setLocationBarDataProvider(
new LocationBarModel(mStatusView.getContext(), NewTabPageDelegate.EMPTY));
new LocationBarModel(mStatusView.getContext(), NewTabPageDelegate.EMPTY,
url -> url, window -> null, ToolbarTestUtils.OFFLINE_STATUS));
mStatusModel = new PropertyModel.Builder(StatusProperties.ALL_KEYS).build();
mStatusMCP = PropertyModelChangeProcessor.create(
mStatusModel, mStatusView, new StatusViewBinder());
......
......@@ -30,6 +30,7 @@ import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.Feature;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.dom_distiller.DomDistillerTabUtils;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
import org.chromium.chrome.browser.omnibox.UrlBarData;
......@@ -227,7 +228,9 @@ public class LocationBarModelTest {
private String mUrl;
public TestLocationBarModel() {
super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY);
super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY,
DomDistillerTabUtils::getFormattedUrlFromOriginalDistillerUrl,
window -> null, new LocationBarModel.OfflineStatus() {});
initializeWithNative();
Tab tab = new MockTab(0, false) {
......
......@@ -25,6 +25,7 @@ import org.chromium.base.test.util.JniMocker;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.omnibox.LocationBarLayout;
import org.chromium.chrome.browser.tab.TabImpl;
import org.chromium.chrome.test.util.ToolbarTestUtils;
import org.chromium.components.security_state.ConnectionSecurityLevel;
import org.chromium.components.security_state.SecurityStateModel;
import org.chromium.components.security_state.SecurityStateModelJni;
......@@ -62,8 +63,9 @@ public final class ToolbarSecurityIconTest {
NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess();
mocker.mock(SecurityStateModelJni.TEST_HOOKS, mSecurityStateMocks);
mLocationBarModel = spy(new LocationBarModel(
ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY));
mLocationBarModel = spy(
new LocationBarModel(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY,
url -> url, window -> null, ToolbarTestUtils.OFFLINE_STATUS));
mLocationBarModel.initializeWithNative();
}
......
......@@ -22,9 +22,11 @@ import org.mockito.MockitoAnnotations;
import org.chromium.base.ContextUtils;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.browser.customtabs.CustomTabIncognitoManager;
import org.chromium.chrome.browser.incognito.IncognitoUtils;
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.WindowAndroid;
/**
......@@ -75,19 +77,36 @@ public class LocationBarModelUnitTest {
CustomTabIncognitoManager.setCustomTabIncognitoManagerUsedForTesting(null);
}
public static final LocationBarModel.OfflineStatus OFFLINE_STATUS =
new LocationBarModel.OfflineStatus() {
@Override
public boolean isShowingTrustedOfflinePage(WebContents webContents) {
return true;
}
@Override
public boolean isOfflinePage(Tab tab) {
return true;
}
};
// clang-format off
private static class TestIncognitoLocationBarModel extends LocationBarModel {
public TestIncognitoLocationBarModel(Tab tab) {
super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY);
super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY, url -> url,
IncognitoUtils::getNonPrimaryOTRProfileFromWindowAndroid, OFFLINE_STATUS);
setTab(tab, /*incognito=*/true);
}
}
private static class TestRegularLocationBarModel extends LocationBarModel {
public TestRegularLocationBarModel(Tab tab) {
super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY);
super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY, url -> url,
IncognitoUtils::getNonPrimaryOTRProfileFromWindowAndroid, OFFLINE_STATUS);
setTab(tab, /*incognito=*/false);
}
}
// clang-format on
@Test
@MediumTest
......
......@@ -8,9 +8,9 @@
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "chrome/android/chrome_jni_headers/TrustedCdn_jni.h"
#include "chrome/browser/android/tab_android.h"
#include "chrome/browser/offline_pages/offline_page_utils.h"
#include "chrome/browser/tab/jni_headers/TrustedCdn_jni.h"
#include "components/embedder_support/android/util/cdn_utils.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/web_contents.h"
......
......@@ -22,6 +22,8 @@ android_library("java") {
"java/src/org/chromium/chrome/browser/tab/TabViewManager.java",
"java/src/org/chromium/chrome/browser/tab/TabViewProvider.java",
"java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java",
"java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java",
"java/src/org/chromium/chrome/browser/tab/TrustedCdn.java",
"java/src/org/chromium/chrome/browser/tab/WebContentsState.java",
"java/src/org/chromium/chrome/browser/tab/WebContentsStateBridge.java",
"java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java",
......@@ -61,6 +63,8 @@ android_library("java") {
"//components/find_in_page/android:java",
"//components/navigation_interception/android:navigation_interception_java",
"//components/payments/content/android:java",
"//components/security_state/content/android:java",
"//components/security_state/core:security_state_enums_java",
"//content/public/android:content_java",
"//net/android:net_java",
"//third_party/android_deps:androidx_annotation_annotation_java",
......@@ -76,6 +80,7 @@ android_library("java") {
generate_jni("jni_headers") {
sources = [
"java/src/org/chromium/chrome/browser/tab/TrustedCdn.java",
"java/src/org/chromium/chrome/browser/tab/WebContentsStateBridge.java",
"java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorage.java",
]
......
......@@ -14,6 +14,7 @@ include_rules = [
"+components/external_intents/android/java",
"+components/find_in_page/android/java",
"+components/navigation_interception/android/java",
"+components/security_state/content/android/java",
"+content/public/android/java/src/org/chromium/content_public",
"+ui/android/java/src/org/chromium/ui/base",
"+ui/android/java/src/org/chromium/ui/util",
......
......@@ -4,14 +4,17 @@
package org.chromium.chrome.browser.tab;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.chromium.base.UnownedUserData;
import org.chromium.base.UnownedUserDataKey;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.browser.app.ChromeActivity;
import org.chromium.components.security_state.ConnectionSecurityLevel;
import org.chromium.components.security_state.SecurityStateModel;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.WindowAndroid;
/**
* Provides a trusted CDN publisher URL for the current web contents in a Tab.
......@@ -19,9 +22,56 @@ import org.chromium.content_public.browser.WebContents;
public class TrustedCdn extends TabWebContentsUserData {
private static final Class<TrustedCdn> USER_DATA_KEY = TrustedCdn.class;
private final TabImpl mTab;
private final Tab mTab;
private final long mNativeTrustedCdn;
/**
* UnownedUserData shared across all tabs to get the publisher url visibility.
* This hangs off of an activity via WindowAndroid.
*/
public static interface PublisherUrlVisibility extends UnownedUserData {
/** The key for accessing this object on an {@link UnownedUserDataHost}. */
public static final UnownedUserDataKey<PublisherUrlVisibility> KEY =
new UnownedUserDataKey<>(PublisherUrlVisibility.class);
/**
* Get the Activity's {@link PublisherUrlVisibility} from the provided
* {@link WindowAndroid}.
* @param window The window to get the validator from.
* @return The Activity's {@link PublisherUrlVisibility}.
*/
public static @Nullable PublisherUrlVisibility from(WindowAndroid window) {
return KEY.retrieveDataFromHost(window.getUnownedUserDataHost());
}
/**
* Make this instance of PublisherUrlVisibility available through the activity's window.
* @param window A {@link WindowAndroid} to attach to.
* @param validator The {@link PublisherUrlVisibility} to attach.
*/
public static void attach(WindowAndroid window, PublisherUrlVisibility validator) {
KEY.attachToHost(window.getUnownedUserDataHost(), validator);
}
/**
* Detach the provided PublisherUrlVisibility from any host it is associated with.
* @param validator The {@link PublisherUrlVisibility} to detach.
*/
public static void detach(PublisherUrlVisibility validator) {
KEY.detachFromAllHosts(validator);
}
/**
* Whether the encomapssing activity can show the publisher URL from a trusted CDN.
* @param tab Tab object currently being shown.
* @return {@code true} if the publisher URL from a trusted CDN can be shown.
*/
boolean canShowPublisherUrl(Tab tab);
}
@Nullable
private PublisherUrlVisibility mPublisherUrlVisibility;
/**
* The publisher URL for pages hosted on a trusted CDN, or null otherwise.
*/
......@@ -31,12 +81,12 @@ public class TrustedCdn extends TabWebContentsUserData {
* @return The publisher URL if the current page is hosted on a trusted CDN, or null otherwise
*/
@Nullable
public static String getPublisherUrl(Tab tab) {
public static String getPublisherUrl(@Nullable Tab tab) {
TrustedCdn cdn = get(tab);
return cdn != null ? cdn.getPublisherUrl() : null;
}
static TrustedCdn from(Tab tab) {
static TrustedCdn from(@NonNull Tab tab) {
TrustedCdn trustedCdn = get(tab);
if (trustedCdn == null) {
trustedCdn = tab.getUserDataHost().setUserData(USER_DATA_KEY, new TrustedCdn(tab));
......@@ -44,14 +94,30 @@ public class TrustedCdn extends TabWebContentsUserData {
return trustedCdn;
}
private static TrustedCdn get(Tab tab) {
private static TrustedCdn get(@Nullable Tab tab) {
return tab != null ? tab.getUserDataHost().getUserData(USER_DATA_KEY) : null;
}
private TrustedCdn(Tab tab) {
super(tab);
mTab = (TabImpl) tab;
mTab = tab;
mNativeTrustedCdn = TrustedCdnJni.get().init(TrustedCdn.this);
updatePublisherUrlVisibility(tab.getWindowAndroid());
mTab.addObserver(new EmptyTabObserver() {
@Override
public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) {
updatePublisherUrlVisibility(window);
}
@Override
public void onDestroyed(Tab tab) {
tab.removeObserver(this);
}
});
}
private void updatePublisherUrlVisibility(WindowAndroid window) {
mPublisherUrlVisibility = window != null ? PublisherUrlVisibility.from(window) : null;
}
@Override
......@@ -72,17 +138,11 @@ public class TrustedCdn extends TabWebContentsUserData {
@Nullable
private String getPublisherUrl() {
ChromeActivity activity = mTab.getActivity();
if (activity == null) return null;
if (!activity.canShowTrustedCdnPublisherUrl()) return null;
if (getSecurityLevel() == ConnectionSecurityLevel.DANGEROUS) return null;
return mPublisherUrl;
}
private int getSecurityLevel() {
int securityLevel =
SecurityStateModel.getSecurityLevelForWebContents(mTab.getWebContents());
return securityLevel;
if (mPublisherUrlVisibility == null || !mPublisherUrlVisibility.canShowPublisherUrl(mTab)) {
return null;
}
int level = SecurityStateModel.getSecurityLevelForWebContents(mTab.getWebContents());
return level != ConnectionSecurityLevel.DANGEROUS ? mPublisherUrl : null;
}
@CalledByNative
......
......@@ -16,6 +16,9 @@ import static org.hamcrest.core.IsNot.not;
import androidx.annotation.IdRes;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.toolbar.LocationBarModel;
import org.chromium.content_public.browser.WebContents;
/**
* A utility class that contains methods generic to both the top toolbar and bottom toolbar,
......@@ -36,6 +39,18 @@ public class ToolbarTestUtils {
public static final @IdRes int TAB_SWITCHER_TOOLBAR_TAB_SWITCHER_BUTTON =
R.id.tab_switcher_mode_tab_switcher_button;
public static final LocationBarModel.OfflineStatus OFFLINE_STATUS =
new LocationBarModel.OfflineStatus() {
@Override
public boolean isShowingTrustedOfflinePage(WebContents webContents) {
return true;
}
@Override
public boolean isOfflinePage(Tab tab) {
return true;
}
};
public static void checkToolbarVisibility(@IdRes int toolbarId, boolean isVisible) {
onView(withId(toolbarId)).check(matches(isVisible ? isDisplayed() : not(isDisplayed())));
}
......
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