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") { ...@@ -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/TabFavicon.java",
"java/src/org/chromium/chrome/browser/tab/TabImpl.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/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/TabModelJniBridge.java",
"java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java", "java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java",
"java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java", "java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java",
......
...@@ -441,6 +441,7 @@ chrome_java_sources = [ ...@@ -441,6 +441,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelper.java", "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/CustomTabTaskDescriptionIconGenerator.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabTopBarDelegate.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/CustomTabsClientFileProcessor.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java", "java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionServiceImpl.java", "java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionServiceImpl.java",
...@@ -1374,8 +1375,6 @@ chrome_java_sources = [ ...@@ -1374,8 +1375,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/tab/TabViewManagerImpl.java", "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/TabWebContentsDelegateAndroidImpl.java",
"java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.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/TabbedAppMenuPropertiesDelegate.java",
"java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java", "java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java",
"java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java", "java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java",
......
...@@ -1028,13 +1028,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1028,13 +1028,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
|| getActivityType() == ActivityType.TRUSTED_WEB_ACTIVITY; || 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 * 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. * startup path here. This method will be called automatically.
......
...@@ -38,13 +38,11 @@ import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigatio ...@@ -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.content.CustomTabActivityTabProvider;
import org.chromium.chrome.browser.customtabs.features.CustomTabNavigationBarController; import org.chromium.chrome.browser.customtabs.features.CustomTabNavigationBarController;
import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor; 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.infobar.InfoBarContainer;
import org.chromium.chrome.browser.night_mode.NightModeStateProvider; import org.chromium.chrome.browser.night_mode.NightModeStateProvider;
import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
import org.chromium.chrome.browser.page_info.ChromePageInfoControllerDelegate; import org.chromium.chrome.browser.page_info.ChromePageInfoControllerDelegate;
import org.chromium.chrome.browser.page_info.ChromePermissionParamsListBuilderDelegate; 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.chrome.browser.tab.Tab;
import org.chromium.components.page_info.PageInfoController; import org.chromium.components.page_info.PageInfoController;
import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.LoadUrlParams;
...@@ -135,6 +133,14 @@ public class CustomTabActivity extends BaseCustomTabActivity { ...@@ -135,6 +133,14 @@ public class CustomTabActivity extends BaseCustomTabActivity {
mConnection.showSignInToastIfNecessary(mSession, getIntent()); mConnection.showSignInToastIfNecessary(mSession, getIntent());
new CustomTabTrustedCdnPublisherUrlVisibility(
getWindowAndroid(), getLifecycleDispatcher(), () -> {
String urlPackage = mConnection.getTrustedCdnPublisherUrlPackage();
return urlPackage != null
&& urlPackage.equals(
mConnection.getClientPackageNameForSession(mSession));
});
super.finishNativeInitialization(); super.finishNativeInitialization();
// We start the Autofill Assistant after the call to super.finishNativeInitialization() as // We start the Autofill Assistant after the call to super.finishNativeInitialization() as
...@@ -275,19 +281,6 @@ public class CustomTabActivity extends BaseCustomTabActivity { ...@@ -275,19 +281,6 @@ public class CustomTabActivity extends BaseCustomTabActivity {
return super.requiresFirstRunToBeCompleted(intent); 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 * @return The package name of the Trusted Web Activity, if the activity is a TWA; null
* otherwise. * 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 @@ ...@@ -4,14 +4,13 @@
package org.chromium.chrome.browser.toolbar; package org.chromium.chrome.browser.toolbar;
import static org.chromium.chrome.browser.incognito.IncognitoUtils.getNonPrimaryOTRProfileFromWindowAndroid;
import android.content.Context; import android.content.Context;
import android.text.SpannableStringBuilder; import android.text.SpannableStringBuilder;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.ColorRes; import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes; import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
...@@ -20,10 +19,8 @@ import org.chromium.base.ObserverList; ...@@ -20,10 +19,8 @@ import org.chromium.base.ObserverList;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.NativeMethods; import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.R; 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.LayoutStateProvider;
import org.chromium.chrome.browser.layouts.LayoutType; 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.ChromeAutocompleteSchemeClassifier;
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider; import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
import org.chromium.chrome.browser.omnibox.SearchEngineLogoUtils; import org.chromium.chrome.browser.omnibox.SearchEngineLogoUtils;
...@@ -55,8 +52,46 @@ import java.net.URISyntaxException; ...@@ -55,8 +52,46 @@ import java.net.URISyntaxException;
* Provides a way of accessing toolbar data and state. * Provides a way of accessing toolbar data and state.
*/ */
public class LocationBarModel implements ToolbarDataProvider, LocationBarDataProvider { 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 Context mContext;
private final NewTabPageDelegate mNtpDelegate; private final NewTabPageDelegate mNtpDelegate;
private final @NonNull UrlFormatter mUrlFormatter;
private final @NonNull ProfileProvider mProfileProvider;
private final @NonNull OfflineStatus mOfflineStatus;
private Tab mTab; private Tab mTab;
private int mPrimaryColor; private int mPrimaryColor;
...@@ -73,10 +108,20 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro ...@@ -73,10 +108,20 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro
/** /**
* Default constructor for this class. * Default constructor for this class.
* @param context The Context used for styling the toolbar visuals. * @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; mContext = context;
mNtpDelegate = newTabPageDelegate; mNtpDelegate = newTabPageDelegate;
mUrlFormatter = urlFormatter;
mProfileProvider = profileProvider;
mOfflineStatus = offlineStatus;
mPrimaryColor = ChromeColors.getDefaultThemeColor(context.getResources(), false); mPrimaryColor = ChromeColors.getDefaultThemeColor(context.getResources(), false);
} }
...@@ -195,8 +240,7 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro ...@@ -195,8 +240,7 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro
if (DomDistillerUrlUtils.isDistilledPage(url)) { if (DomDistillerUrlUtils.isDistilledPage(url)) {
String originalUrl = DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(url); String originalUrl = DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(url);
if (originalUrl != null) { if (originalUrl != null) {
return buildUrlBarData( return buildUrlBarData(mUrlFormatter.format(originalUrl));
DomDistillerTabUtils.getFormattedUrlFromOriginalDistillerUrl(originalUrl));
} }
return buildUrlBarData(url, formattedUrl); return buildUrlBarData(url, formattedUrl);
} }
...@@ -208,11 +252,10 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro ...@@ -208,11 +252,10 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro
if (isOfflinePage()) { if (isOfflinePage()) {
String originalUrl = mTab.getOriginalUrl(); String originalUrl = mTab.getOriginalUrl();
formattedUrl = UrlUtilities.stripScheme( formattedUrl = UrlUtilities.stripScheme(mUrlFormatter.format(originalUrl));
DomDistillerTabUtils.getFormattedUrlFromOriginalDistillerUrl(originalUrl));
// Clear the editing text for untrusted offline pages. // Clear the editing text for untrusted offline pages.
if (!OfflinePageUtils.isShowingTrustedOfflinePage(mTab.getWebContents())) { if (!mOfflineStatus.isShowingTrustedOfflinePage(mTab.getWebContents())) {
return buildUrlBarData(url, formattedUrl, ""); return buildUrlBarData(url, formattedUrl, "");
} }
...@@ -330,8 +373,8 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro ...@@ -330,8 +373,8 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro
WindowAndroid windowAndroid = (mTab != null) ? mTab.getWindowAndroid() : null; WindowAndroid windowAndroid = (mTab != null) ? mTab.getWindowAndroid() : null;
// If the mTab belongs to a CustomTabActivity then we return the non-primary OTR profile // 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. // which is associated with it. For all other cases we return the primary OTR profile.
Profile nonPrimaryOTRProfile = getNonPrimaryOTRProfileFromWindowAndroid(windowAndroid); Profile nonPrimaryOtrProfile = mProfileProvider.getNonPrimaryOtrProfile(windowAndroid);
if (nonPrimaryOTRProfile != null) return nonPrimaryOTRProfile; if (nonPrimaryOtrProfile != null) return nonPrimaryOtrProfile;
// When in overview mode with no open tabs, there has not been created an // When in overview mode with no open tabs, there has not been created an
// OTR profile yet. #getOffTheRecordProfile will create a profile if none // OTR profile yet. #getOffTheRecordProfile will create a profile if none
...@@ -393,7 +436,7 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro ...@@ -393,7 +436,7 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro
@Override @Override
public boolean isOfflinePage() { public boolean isOfflinePage() {
return hasTab() && OfflinePageUtils.isOfflinePage(mTab); return hasTab() && mOfflineStatus.isOfflinePage(mTab);
} }
@Override @Override
...@@ -409,7 +452,8 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro ...@@ -409,7 +452,8 @@ public class LocationBarModel implements ToolbarDataProvider, LocationBarDataPro
@Override @Override
public int getSecurityLevel() { public int getSecurityLevel() {
Tab tab = getTab(); Tab tab = getTab();
return getSecurityLevel(tab, isOfflinePage(), TrustedCdn.getPublisherUrl(tab)); String publisherUrl = tab != null ? TrustedCdn.getPublisherUrl(tab) : null;
return getSecurityLevel(tab, isOfflinePage(), publisherUrl);
} }
@Override @Override
......
...@@ -49,6 +49,7 @@ import org.chromium.chrome.browser.compositor.layouts.Layout; ...@@ -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.LayoutManagerImpl;
import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver; import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver;
import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbar; 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.feature_engagement.TrackerFactory;
import org.chromium.chrome.browser.findinpage.FindToolbarManager; import org.chromium.chrome.browser.findinpage.FindToolbarManager;
import org.chromium.chrome.browser.findinpage.FindToolbarObserver; import org.chromium.chrome.browser.findinpage.FindToolbarObserver;
...@@ -58,6 +59,7 @@ import org.chromium.chrome.browser.fullscreen.FullscreenOptions; ...@@ -58,6 +59,7 @@ import org.chromium.chrome.browser.fullscreen.FullscreenOptions;
import org.chromium.chrome.browser.homepage.HomepageManager; import org.chromium.chrome.browser.homepage.HomepageManager;
import org.chromium.chrome.browser.homepage.HomepagePolicyManager; import org.chromium.chrome.browser.homepage.HomepagePolicyManager;
import org.chromium.chrome.browser.identity_disc.IdentityDiscController; 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.intent.IntentMetadata;
import org.chromium.chrome.browser.layouts.LayoutStateProvider; import org.chromium.chrome.browser.layouts.LayoutStateProvider;
import org.chromium.chrome.browser.layouts.LayoutType; import org.chromium.chrome.browser.layouts.LayoutType;
...@@ -65,6 +67,7 @@ import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; ...@@ -65,6 +67,7 @@ import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.ntp.FakeboxDelegate; import org.chromium.chrome.browser.ntp.FakeboxDelegate;
import org.chromium.chrome.browser.ntp.IncognitoNewTabPage; import org.chromium.chrome.browser.ntp.IncognitoNewTabPage;
import org.chromium.chrome.browser.ntp.NewTabPage; 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.LocationBar;
import org.chromium.chrome.browser.omnibox.LocationBarCoordinator; import org.chromium.chrome.browser.omnibox.LocationBarCoordinator;
import org.chromium.chrome.browser.omnibox.OmniboxFocusReason; import org.chromium.chrome.browser.omnibox.OmniboxFocusReason;
...@@ -359,7 +362,20 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve ...@@ -359,7 +362,20 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
ToolbarLayout toolbarLayout = mActivity.findViewById(R.id.toolbar); ToolbarLayout toolbarLayout = mActivity.findViewById(R.id.toolbar);
NewTabPageDelegate ntpDelegate = createNewTabPageDelegate(toolbarLayout); 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; mControlContainer = controlContainer;
assert mControlContainer != null; assert mControlContainer != null;
......
...@@ -41,6 +41,7 @@ import org.chromium.base.test.util.Feature; ...@@ -41,6 +41,7 @@ import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.Matchers; import org.chromium.base.test.util.Matchers;
import org.chromium.base.test.util.Restriction; import org.chromium.base.test.util.Restriction;
import org.chromium.chrome.R; 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.ChromeFeatureList;
import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
...@@ -53,6 +54,7 @@ import org.chromium.chrome.test.util.browser.Features.EnableFeatures; ...@@ -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.embedder_support.util.UrlConstants;
import org.chromium.components.security_state.ConnectionSecurityLevel; import org.chromium.components.security_state.ConnectionSecurityLevel;
import org.chromium.content_public.browser.LoadUrlParams; 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.ClickUtils;
import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.ui.test.util.UiRestriction; import org.chromium.ui.test.util.UiRestriction;
...@@ -81,6 +83,18 @@ public class LocationBarLayoutTest { ...@@ -81,6 +83,18 @@ public class LocationBarLayoutTest {
private TestLocationBarModel mTestLocationBarModel; 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 class TestLocationBarModel extends LocationBarModel {
private String mCurrentUrl; private String mCurrentUrl;
private String mEditingText; private String mEditingText;
...@@ -88,7 +102,9 @@ public class LocationBarLayoutTest { ...@@ -88,7 +102,9 @@ public class LocationBarLayoutTest {
private Integer mSecurityLevel; private Integer mSecurityLevel;
public TestLocationBarModel() { public TestLocationBarModel() {
super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY); super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY,
DomDistillerTabUtils::getFormattedUrlFromOriginalDistillerUrl,
window -> null, OFFLINE_STATUS);
initializeWithNative(); initializeWithNative();
} }
......
...@@ -24,6 +24,7 @@ import org.chromium.chrome.browser.toolbar.LocationBarModel; ...@@ -24,6 +24,7 @@ import org.chromium.chrome.browser.toolbar.LocationBarModel;
import org.chromium.chrome.browser.toolbar.NewTabPageDelegate; import org.chromium.chrome.browser.toolbar.NewTabPageDelegate;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.util.ChromeRenderTestRule; 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.components.browser_ui.widget.CompositeTouchDelegate;
import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor; import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
...@@ -73,7 +74,8 @@ public class StatusViewRenderTest extends DummyUiActivityTestCase { ...@@ -73,7 +74,8 @@ public class StatusViewRenderTest extends DummyUiActivityTestCase {
.findViewById(org.chromium.chrome.R.id.location_bar_status); .findViewById(org.chromium.chrome.R.id.location_bar_status);
mStatusView.setCompositeTouchDelegate(new CompositeTouchDelegate(view)); mStatusView.setCompositeTouchDelegate(new CompositeTouchDelegate(view));
mStatusView.setLocationBarDataProvider( 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(); mStatusModel = new PropertyModel.Builder(StatusProperties.ALL_KEYS).build();
PropertyModelChangeProcessor.create(mStatusModel, mStatusView, new StatusViewBinder()); PropertyModelChangeProcessor.create(mStatusModel, mStatusView, new StatusViewBinder());
}); });
......
...@@ -38,6 +38,7 @@ import org.chromium.chrome.browser.omnibox.status.StatusProperties.StatusIconRes ...@@ -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.LocationBarModel;
import org.chromium.chrome.browser.toolbar.NewTabPageDelegate; import org.chromium.chrome.browser.toolbar.NewTabPageDelegate;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; 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.chrome.test.util.browser.Features.EnableFeatures;
import org.chromium.components.browser_ui.widget.CompositeTouchDelegate; import org.chromium.components.browser_ui.widget.CompositeTouchDelegate;
import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel;
...@@ -77,7 +78,8 @@ public class StatusViewTest extends DummyUiActivityTestCase { ...@@ -77,7 +78,8 @@ public class StatusViewTest extends DummyUiActivityTestCase {
mStatusView.setDelegateForTesting(mStatusViewDelegate); mStatusView.setDelegateForTesting(mStatusViewDelegate);
mStatusView.setCompositeTouchDelegate(new CompositeTouchDelegate(view)); mStatusView.setCompositeTouchDelegate(new CompositeTouchDelegate(view));
mStatusView.setLocationBarDataProvider( 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(); mStatusModel = new PropertyModel.Builder(StatusProperties.ALL_KEYS).build();
mStatusMCP = PropertyModelChangeProcessor.create( mStatusMCP = PropertyModelChangeProcessor.create(
mStatusModel, mStatusView, new StatusViewBinder()); mStatusModel, mStatusView, new StatusViewBinder());
......
...@@ -30,6 +30,7 @@ import org.chromium.base.test.util.CommandLineFlags; ...@@ -30,6 +30,7 @@ import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeTabbedActivity; 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.flags.ChromeSwitches;
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider; import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
import org.chromium.chrome.browser.omnibox.UrlBarData; import org.chromium.chrome.browser.omnibox.UrlBarData;
...@@ -227,7 +228,9 @@ public class LocationBarModelTest { ...@@ -227,7 +228,9 @@ public class LocationBarModelTest {
private String mUrl; private String mUrl;
public TestLocationBarModel() { public TestLocationBarModel() {
super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY); super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY,
DomDistillerTabUtils::getFormattedUrlFromOriginalDistillerUrl,
window -> null, new LocationBarModel.OfflineStatus() {});
initializeWithNative(); initializeWithNative();
Tab tab = new MockTab(0, false) { Tab tab = new MockTab(0, false) {
......
...@@ -25,6 +25,7 @@ import org.chromium.base.test.util.JniMocker; ...@@ -25,6 +25,7 @@ import org.chromium.base.test.util.JniMocker;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.omnibox.LocationBarLayout; import org.chromium.chrome.browser.omnibox.LocationBarLayout;
import org.chromium.chrome.browser.tab.TabImpl; 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.ConnectionSecurityLevel;
import org.chromium.components.security_state.SecurityStateModel; import org.chromium.components.security_state.SecurityStateModel;
import org.chromium.components.security_state.SecurityStateModelJni; import org.chromium.components.security_state.SecurityStateModelJni;
...@@ -62,8 +63,9 @@ public final class ToolbarSecurityIconTest { ...@@ -62,8 +63,9 @@ public final class ToolbarSecurityIconTest {
NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess(); NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess();
mocker.mock(SecurityStateModelJni.TEST_HOOKS, mSecurityStateMocks); mocker.mock(SecurityStateModelJni.TEST_HOOKS, mSecurityStateMocks);
mLocationBarModel = spy(new LocationBarModel( mLocationBarModel = spy(
ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY)); new LocationBarModel(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY,
url -> url, window -> null, ToolbarTestUtils.OFFLINE_STATUS));
mLocationBarModel.initializeWithNative(); mLocationBarModel.initializeWithNative();
} }
......
...@@ -22,9 +22,11 @@ import org.mockito.MockitoAnnotations; ...@@ -22,9 +22,11 @@ import org.mockito.MockitoAnnotations;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.browser.customtabs.CustomTabIncognitoManager; 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.omnibox.LocationBarDataProvider;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
/** /**
...@@ -75,19 +77,36 @@ public class LocationBarModelUnitTest { ...@@ -75,19 +77,36 @@ public class LocationBarModelUnitTest {
CustomTabIncognitoManager.setCustomTabIncognitoManagerUsedForTesting(null); 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 { private static class TestIncognitoLocationBarModel extends LocationBarModel {
public TestIncognitoLocationBarModel(Tab tab) { public TestIncognitoLocationBarModel(Tab tab) {
super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY); super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY, url -> url,
IncognitoUtils::getNonPrimaryOTRProfileFromWindowAndroid, OFFLINE_STATUS);
setTab(tab, /*incognito=*/true); setTab(tab, /*incognito=*/true);
} }
} }
private static class TestRegularLocationBarModel extends LocationBarModel { private static class TestRegularLocationBarModel extends LocationBarModel {
public TestRegularLocationBarModel(Tab tab) { public TestRegularLocationBarModel(Tab tab) {
super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY); super(ContextUtils.getApplicationContext(), NewTabPageDelegate.EMPTY, url -> url,
IncognitoUtils::getNonPrimaryOTRProfileFromWindowAndroid, OFFLINE_STATUS);
setTab(tab, /*incognito=*/false); setTab(tab, /*incognito=*/false);
} }
} }
// clang-format on
@Test @Test
@MediumTest @MediumTest
......
...@@ -8,9 +8,9 @@ ...@@ -8,9 +8,9 @@
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "base/android/jni_string.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/android/tab_android.h"
#include "chrome/browser/offline_pages/offline_page_utils.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 "components/embedder_support/android/util/cdn_utils.h"
#include "content/public/browser/navigation_handle.h" #include "content/public/browser/navigation_handle.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
......
...@@ -22,6 +22,8 @@ android_library("java") { ...@@ -22,6 +22,8 @@ android_library("java") {
"java/src/org/chromium/chrome/browser/tab/TabViewManager.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/TabViewProvider.java",
"java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.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/WebContentsState.java",
"java/src/org/chromium/chrome/browser/tab/WebContentsStateBridge.java", "java/src/org/chromium/chrome/browser/tab/WebContentsStateBridge.java",
"java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java", "java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java",
...@@ -61,6 +63,8 @@ android_library("java") { ...@@ -61,6 +63,8 @@ android_library("java") {
"//components/find_in_page/android:java", "//components/find_in_page/android:java",
"//components/navigation_interception/android:navigation_interception_java", "//components/navigation_interception/android:navigation_interception_java",
"//components/payments/content/android: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", "//content/public/android:content_java",
"//net/android:net_java", "//net/android:net_java",
"//third_party/android_deps:androidx_annotation_annotation_java", "//third_party/android_deps:androidx_annotation_annotation_java",
...@@ -76,6 +80,7 @@ android_library("java") { ...@@ -76,6 +80,7 @@ android_library("java") {
generate_jni("jni_headers") { generate_jni("jni_headers") {
sources = [ 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/WebContentsStateBridge.java",
"java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorage.java", "java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorage.java",
] ]
......
...@@ -14,6 +14,7 @@ include_rules = [ ...@@ -14,6 +14,7 @@ include_rules = [
"+components/external_intents/android/java", "+components/external_intents/android/java",
"+components/find_in_page/android/java", "+components/find_in_page/android/java",
"+components/navigation_interception/android/java", "+components/navigation_interception/android/java",
"+components/security_state/content/android/java",
"+content/public/android/java/src/org/chromium/content_public", "+content/public/android/java/src/org/chromium/content_public",
"+ui/android/java/src/org/chromium/ui/base", "+ui/android/java/src/org/chromium/ui/base",
"+ui/android/java/src/org/chromium/ui/util", "+ui/android/java/src/org/chromium/ui/util",
......
...@@ -4,14 +4,17 @@ ...@@ -4,14 +4,17 @@
package org.chromium.chrome.browser.tab; package org.chromium.chrome.browser.tab;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable; 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.CalledByNative;
import org.chromium.base.annotations.NativeMethods; 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.ConnectionSecurityLevel;
import org.chromium.components.security_state.SecurityStateModel; import org.chromium.components.security_state.SecurityStateModel;
import org.chromium.content_public.browser.WebContents; 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. * 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; ...@@ -19,9 +22,56 @@ import org.chromium.content_public.browser.WebContents;
public class TrustedCdn extends TabWebContentsUserData { public class TrustedCdn extends TabWebContentsUserData {
private static final Class<TrustedCdn> USER_DATA_KEY = TrustedCdn.class; private static final Class<TrustedCdn> USER_DATA_KEY = TrustedCdn.class;
private final TabImpl mTab; private final Tab mTab;
private final long mNativeTrustedCdn; 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. * The publisher URL for pages hosted on a trusted CDN, or null otherwise.
*/ */
...@@ -31,12 +81,12 @@ public class TrustedCdn extends TabWebContentsUserData { ...@@ -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 * @return The publisher URL if the current page is hosted on a trusted CDN, or null otherwise
*/ */
@Nullable @Nullable
public static String getPublisherUrl(Tab tab) { public static String getPublisherUrl(@Nullable Tab tab) {
TrustedCdn cdn = get(tab); TrustedCdn cdn = get(tab);
return cdn != null ? cdn.getPublisherUrl() : null; return cdn != null ? cdn.getPublisherUrl() : null;
} }
static TrustedCdn from(Tab tab) { static TrustedCdn from(@NonNull Tab tab) {
TrustedCdn trustedCdn = get(tab); TrustedCdn trustedCdn = get(tab);
if (trustedCdn == null) { if (trustedCdn == null) {
trustedCdn = tab.getUserDataHost().setUserData(USER_DATA_KEY, new TrustedCdn(tab)); trustedCdn = tab.getUserDataHost().setUserData(USER_DATA_KEY, new TrustedCdn(tab));
...@@ -44,14 +94,30 @@ public class TrustedCdn extends TabWebContentsUserData { ...@@ -44,14 +94,30 @@ public class TrustedCdn extends TabWebContentsUserData {
return trustedCdn; 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; return tab != null ? tab.getUserDataHost().getUserData(USER_DATA_KEY) : null;
} }
private TrustedCdn(Tab tab) { private TrustedCdn(Tab tab) {
super(tab); super(tab);
mTab = (TabImpl) tab; mTab = tab;
mNativeTrustedCdn = TrustedCdnJni.get().init(TrustedCdn.this); 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 @Override
...@@ -72,17 +138,11 @@ public class TrustedCdn extends TabWebContentsUserData { ...@@ -72,17 +138,11 @@ public class TrustedCdn extends TabWebContentsUserData {
@Nullable @Nullable
private String getPublisherUrl() { private String getPublisherUrl() {
ChromeActivity activity = mTab.getActivity(); if (mPublisherUrlVisibility == null || !mPublisherUrlVisibility.canShowPublisherUrl(mTab)) {
if (activity == null) return null; return null;
if (!activity.canShowTrustedCdnPublisherUrl()) return null;
if (getSecurityLevel() == ConnectionSecurityLevel.DANGEROUS) return null;
return mPublisherUrl;
} }
int level = SecurityStateModel.getSecurityLevelForWebContents(mTab.getWebContents());
private int getSecurityLevel() { return level != ConnectionSecurityLevel.DANGEROUS ? mPublisherUrl : null;
int securityLevel =
SecurityStateModel.getSecurityLevelForWebContents(mTab.getWebContents());
return securityLevel;
} }
@CalledByNative @CalledByNative
......
...@@ -16,6 +16,9 @@ import static org.hamcrest.core.IsNot.not; ...@@ -16,6 +16,9 @@ import static org.hamcrest.core.IsNot.not;
import androidx.annotation.IdRes; import androidx.annotation.IdRes;
import org.chromium.chrome.R; 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, * A utility class that contains methods generic to both the top toolbar and bottom toolbar,
...@@ -36,6 +39,18 @@ public class ToolbarTestUtils { ...@@ -36,6 +39,18 @@ public class ToolbarTestUtils {
public static final @IdRes int TAB_SWITCHER_TOOLBAR_TAB_SWITCHER_BUTTON = public static final @IdRes int TAB_SWITCHER_TOOLBAR_TAB_SWITCHER_BUTTON =
R.id.tab_switcher_mode_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) { public static void checkToolbarVisibility(@IdRes int toolbarId, boolean isVisible) {
onView(withId(toolbarId)).check(matches(isVisible ? isDisplayed() : not(isDisplayed()))); 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