Commit 048fbfbf authored by Mugdha Lakhani's avatar Mugdha Lakhani Committed by Commit Bot

[WebLayer] Previews code moves to PageInfoControllerDelegate.

Previews/Lite Mode is a series of optimizations that Chrome may use to
optimize webpages that load slowly. It is only enabled for Lite Mode
users (see Settings > Lite Mode) which is only supported on Chrome
Android. This is a Chrome-specific feature which WebLayer doesn't intend
to support for now.

The overlap with Page Info UI is that in lite mode/Previews, we change
the security strings in the Page Info Dialog to convey that the page is
a Google-served preview/lite version of the actual page.

Moving this change to a Chrome-specific delegate implementation allows
PageInfoController to not depend on this, and eventually be
componentized for reuse by WebLayer.

Bug: 1052375
Change-Id: Ice09ed10af2358c5a943fe6e05e15caa0533b185
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2144015
Commit-Queue: Mugdha Lakhani <nator@chromium.org>
Reviewed-by: default avatarRobert Ogden <robertogden@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarColin Blundell <blundell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#759352}
parent 70198be3
...@@ -4,37 +4,80 @@ ...@@ -4,37 +4,80 @@
package org.chromium.chrome.browser.page_info; package org.chromium.chrome.browser.page_info;
import android.text.SpannableString;
import androidx.annotation.IntDef;
import org.chromium.base.Consumer;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
import org.chromium.chrome.browser.omnibox.ChromeAutocompleteSchemeClassifier; import org.chromium.chrome.browser.omnibox.ChromeAutocompleteSchemeClassifier;
import org.chromium.chrome.browser.previews.PreviewsAndroidBridge;
import org.chromium.chrome.browser.previews.PreviewsUma;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.site_settings.CookieControlsBridge; import org.chromium.chrome.browser.site_settings.CookieControlsBridge;
import org.chromium.components.feature_engagement.Tracker; import org.chromium.components.feature_engagement.EventConstants;
import org.chromium.components.omnibox.AutocompleteSchemeClassifier; import org.chromium.components.omnibox.AutocompleteSchemeClassifier;
import org.chromium.components.page_info.PageInfoControllerDelegate; import org.chromium.components.page_info.PageInfoControllerDelegate;
import org.chromium.components.page_info.PageInfoView.PageInfoViewParams;
import org.chromium.components.security_state.ConnectionSecurityLevel;
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.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogManager;
import org.chromium.ui.text.NoUnderlineClickableSpan;
import org.chromium.ui.text.SpanApplier;
import org.chromium.ui.text.SpanApplier.SpanInfo;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/** /**
* Chrome's implementation of PageInfoControllerDelegate, that provides * Chrome's implementation of PageInfoControllerDelegate, that provides Chrome-specific info to
* Chrome-specific info to PageInfoController. * PageInfoController. It also contains logic for Chrome-specific features, like {@link Previews}
*/ */
public class ChromePageInfoControllerDelegate implements PageInfoControllerDelegate { public class ChromePageInfoControllerDelegate implements PageInfoControllerDelegate {
@IntDef({PreviewPageState.NOT_PREVIEW, PreviewPageState.SECURE_PAGE_PREVIEW,
PreviewPageState.INSECURE_PAGE_PREVIEW})
@Retention(RetentionPolicy.SOURCE)
public @interface PreviewPageState {
int NOT_PREVIEW = 1;
int SECURE_PAGE_PREVIEW = 2;
int INSECURE_PAGE_PREVIEW = 3;
}
private final WebContents mWebContents; private final WebContents mWebContents;
private final ChromeActivity mActivity; private final ChromeActivity mActivity;
private final @PreviewPageState int mPreviewPageState;
public ChromePageInfoControllerDelegate(ChromeActivity activity, WebContents webContents) { public ChromePageInfoControllerDelegate(ChromeActivity activity, WebContents webContents) {
mWebContents = webContents; mWebContents = webContents;
mActivity = activity; mActivity = activity;
mPreviewPageState = getPreviewPageStateAndRecordUma();
} }
private Profile profile() { private Profile profile() {
return Profile.fromWebContents(mWebContents); return Profile.fromWebContents(mWebContents);
} }
@Override /**
public Tracker getTracker() { * Return the state of the webcontents showing the preview.
return TrackerFactory.getTrackerForProfile(profile()); */
private @PreviewPageState int getPreviewPageStateAndRecordUma() {
final int securityLevel = SecurityStateModel.getSecurityLevelForWebContents(mWebContents);
@PreviewPageState
int previewPageState = PreviewPageState.NOT_PREVIEW;
final PreviewsAndroidBridge bridge = PreviewsAndroidBridge.getInstance();
if (bridge.shouldShowPreviewUI(mWebContents)) {
previewPageState = securityLevel == ConnectionSecurityLevel.SECURE
? PreviewPageState.SECURE_PAGE_PREVIEW
: PreviewPageState.INSECURE_PAGE_PREVIEW;
PreviewsUma.recordPageInfoOpened(bridge.getPreviewsType(mWebContents));
TrackerFactory.getTrackerForProfile(profile()).notifyEvent(
EventConstants.PREVIEWS_VERBOSE_STATUS_OPENED);
}
return previewPageState;
} }
@Override @Override
...@@ -56,4 +99,47 @@ public class ChromePageInfoControllerDelegate implements PageInfoControllerDeleg ...@@ -56,4 +99,47 @@ public class ChromePageInfoControllerDelegate implements PageInfoControllerDeleg
public boolean useDarkColors() { public boolean useDarkColors() {
return !mActivity.getNightModeStateProvider().isInNightMode(); return !mActivity.getNightModeStateProvider().isInNightMode();
} }
}
\ No newline at end of file @Override
public void initPreviewUiParams(
PageInfoViewParams viewParams, Consumer<Runnable> runAfterDismiss) {
final PreviewsAndroidBridge bridge = PreviewsAndroidBridge.getInstance();
viewParams.previewSeparatorShown =
mPreviewPageState == PreviewPageState.INSECURE_PAGE_PREVIEW;
viewParams.previewUIShown = isShowingPreview();
if (isShowingPreview()) {
viewParams.urlTitleShown = false;
viewParams.connectionMessageShown = false;
viewParams.previewShowOriginalClickCallback = () -> {
runAfterDismiss.accept(() -> {
PreviewsUma.recordOptOut(bridge.getPreviewsType(mWebContents));
bridge.loadOriginal(mWebContents);
});
};
final String previewOriginalHost =
bridge.getOriginalHost(mWebContents.getVisibleUrlString());
final String loadOriginalText = mActivity.getString(
R.string.page_info_preview_load_original, previewOriginalHost);
final SpannableString loadOriginalSpan = SpanApplier.applySpans(loadOriginalText,
new SpanInfo("<link>", "</link>",
// The callback given to NoUnderlineClickableSpan is overridden in
// PageInfoView so use previewShowOriginalClickCallback (above) instead
// because the entire TextView will be clickable.
new NoUnderlineClickableSpan(mActivity.getResources(), (view) -> {})));
viewParams.previewLoadOriginalMessage = loadOriginalSpan;
viewParams.previewStaleTimestamp = bridge.getStalePreviewTimestamp(mWebContents);
}
}
@Override
public boolean isShowingPreview() {
return mPreviewPageState != PreviewPageState.NOT_PREVIEW;
}
@Override
public boolean isPreviewPageInsecure() {
return mPreviewPageState == PreviewPageState.INSECURE_PAGE_PREVIEW;
}
}
...@@ -89,8 +89,7 @@ public class PageInfoControllerTest { ...@@ -89,8 +89,7 @@ public class PageInfoControllerTest {
PageInfoController pageInfo = new PageInfoController(mActivityTestRule.getActivity(), PageInfoController pageInfo = new PageInfoController(mActivityTestRule.getActivity(),
tab.getWebContents(), ConnectionSecurityLevel.NONE, /*offlinePageUrl=*/null, tab.getWebContents(), ConnectionSecurityLevel.NONE, /*offlinePageUrl=*/null,
/*offlinePageCreationDate=*/null, /*offlinePageCreationDate=*/null,
PageInfoController.OfflinePageState.NOT_OFFLINE_PAGE, PageInfoController.OfflinePageState.NOT_OFFLINE_PAGE, /*publisher=*/null,
PageInfoController.PreviewPageState.NOT_PREVIEW, /*publisher=*/null,
/*offlinePageLoadUrlDelegate=*/ /*offlinePageLoadUrlDelegate=*/
new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(tab), new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(tab),
new ChromePageInfoControllerDelegate( new ChromePageInfoControllerDelegate(
......
...@@ -4,26 +4,49 @@ ...@@ -4,26 +4,49 @@
package org.chromium.components.page_info; package org.chromium.components.page_info;
import org.chromium.components.feature_engagement.Tracker; import org.chromium.base.Consumer;
import org.chromium.components.omnibox.AutocompleteSchemeClassifier; import org.chromium.components.omnibox.AutocompleteSchemeClassifier;
import org.chromium.components.page_info.PageInfoView.PageInfoViewParams;
import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogManager;
/** /**
* Interface that provides embedder-level information to PageInfoController. * Interface that provides embedder-level information to PageInfoController.
*/ */
public interface PageInfoControllerDelegate { public interface PageInfoControllerDelegate {
// Returns the tracker. /**
Tracker getTracker(); * Creates an AutoCompleteClassifier.
*/
// Create an AutoCompleteClassifier.
AutocompleteSchemeClassifier createAutocompleteSchemeClassifier(); AutocompleteSchemeClassifier createAutocompleteSchemeClassifier();
// Whether cookie controls should be shown in Page Info UI. /**
* Whether cookie controls should be shown in Page Info UI.
*/
boolean cookieControlsShown(); boolean cookieControlsShown();
// Return the ModalDialogManager to be used. /**
* Return the ModalDialogManager to be used.
*/
ModalDialogManager getModalDialogManager(); ModalDialogManager getModalDialogManager();
// Whether Page Info UI should use dark colors. /**
* Whether Page Info UI should use dark colors.
*/
boolean useDarkColors(); boolean useDarkColors();
/**
* Initialize viewParams with Preview UI info, if any.
* @param viewParams The params to be initialized with Preview UI info.
* @param runAfterDismiss Used to set "show original" callback on Previews UI.
*/
void initPreviewUiParams(PageInfoViewParams viewParams, Consumer<Runnable> runAfterDismiss);
/**
* Whether website dialog is displayed for a preview.
*/
boolean isShowingPreview();
/**
* Whether Preview page state is INSECURE.
*/
boolean isPreviewPageInsecure();
} }
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