diff options
Diffstat (limited to 'chromium/components/page_info')
19 files changed, 581 insertions, 125 deletions
diff --git a/chromium/components/page_info/BUILD.gn b/chromium/components/page_info/BUILD.gn index 83d25b8e4f5..8f6fbc29e08 100644 --- a/chromium/components/page_info/BUILD.gn +++ b/chromium/components/page_info/BUILD.gn @@ -19,6 +19,7 @@ static_library("page_info") { "//components/content_settings/core/browser", "//components/password_manager/core/browser", "//components/permissions", + "//components/prefs", "//components/safe_browsing:buildflags", "//components/safe_browsing/content/password_protection", "//components/safe_browsing/content/password_protection:password_protection_metrics_util", diff --git a/chromium/components/page_info/android/BUILD.gn b/chromium/components/page_info/android/BUILD.gn index e456e5e9320..e5095d6182c 100644 --- a/chromium/components/page_info/android/BUILD.gn +++ b/chromium/components/page_info/android/BUILD.gn @@ -54,6 +54,7 @@ android_resources("java_resources") { "java/res/layout/page_info.xml", "java/res/layout/page_info_permission_row.xml", "java/res/layout/page_info_row.xml", + "java/res/layout/page_info_subpage.xml", "java/res/layout/page_info_v2.xml", "java/res/values/colors.xml", "java/res/values/dimens.xml", @@ -75,11 +76,16 @@ android_library("java") { "java/src/org/chromium/components/page_info/CertificateViewer.java", "java/src/org/chromium/components/page_info/ConnectionInfoPopup.java", "java/src/org/chromium/components/page_info/CookieControlsView.java", + "java/src/org/chromium/components/page_info/PageInfoConnectionController.java", "java/src/org/chromium/components/page_info/PageInfoController.java", "java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java", + "java/src/org/chromium/components/page_info/PageInfoCookiesController.java", "java/src/org/chromium/components/page_info/PageInfoDialog.java", "java/src/org/chromium/components/page_info/PageInfoFeatureList.java", + "java/src/org/chromium/components/page_info/PageInfoPermissionsController.java", "java/src/org/chromium/components/page_info/PageInfoRowView.java", + "java/src/org/chromium/components/page_info/PageInfoSubpage.java", + "java/src/org/chromium/components/page_info/PageInfoSubpageController.java", "java/src/org/chromium/components/page_info/PageInfoView.java", "java/src/org/chromium/components/page_info/PageInfoViewV2.java", "java/src/org/chromium/components/page_info/PermissionParamsListBuilder.java", @@ -100,6 +106,7 @@ android_library("java") { "//components/embedder_support/android:browser_context_java", "//components/embedder_support/android:util_java", "//components/feature_engagement/public:public_java", + "//components/location/android:location_java", "//components/omnibox/browser:browser_java", "//components/permissions/android:java", "//components/security_state/content/android:java", diff --git a/chromium/components/page_info/android/java/res/layout/page_info.xml b/chromium/components/page_info/android/java/res/layout/page_info.xml index cbccdab2ff0..c10820608f5 100644 --- a/chromium/components/page_info/android/java/res/layout/page_info.xml +++ b/chromium/components/page_info/android/java/res/layout/page_info.xml @@ -99,6 +99,15 @@ android:paddingTop="12dp" android:textAppearance="@style/TextAppearance.TextLarge.Primary" android:visibility="gone" /> + + <TextView + android:id="@+id/page_info_lite_mode_https_image_compression_message" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingTop="12dp" + android:textAppearance="@style/TextAppearance.TextMedium.Primary" + android:text="@string/page_info_lite_mode_https_image_compression" + android:visibility="gone" /> </LinearLayout> <org.chromium.ui.widget.ButtonCompat diff --git a/chromium/components/page_info/android/java/res/layout/page_info_subpage.xml b/chromium/components/page_info/android/java/res/layout/page_info_subpage.xml new file mode 100644 index 00000000000..66fdbf0a9cb --- /dev/null +++ b/chromium/components/page_info/android/java/res/layout/page_info_subpage.xml @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + 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. +--> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingBottom="8dp" + android:orientation="vertical" + android:background="@color/sheet_bg_color"> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingBottom="12dp" + android:paddingEnd="@dimen/page_info_popup_padding_sides" + android:paddingStart="@dimen/page_info_popup_padding_sides" > + + <view class="org.chromium.components.page_info.PageInfoView$ElidedUrlTextView" + android:id="@+id/subpage_url" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ellipsize="end" + android:lineSpacingExtra="6dp" + android:paddingTop="16dp" + android:paddingBottom="16dp" + android:textAlignment="center" + android:textAppearance="@style/TextAppearance.TextLarge.Primary" /> + + <ImageView + android:id="@+id/subpage_back_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/subpage_url" + tools:ignore="ContentDescription" + android:layout_marginEnd="16dp" + android:layout_centerVertical="true" + android:layout_alignParentStart="true" + android:src="@drawable/ic_arrow_back_white_24dp" + app:tint="@color/default_icon_color" /> + + <TextView + android:id="@+id/subpage_title" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/subpage_url" + android:layout_toEndOf="@id/subpage_back_button" + android:gravity="center_vertical" + android:paddingBottom="12dp" + app:chromeDrawableTint="@color/default_icon_color" + android:textAppearance="@style/TextAppearance.TextLarge.Primary"/> + + </RelativeLayout> + + <!-- Programmatically add page specific inner view here --> + <FrameLayout + android:id="@+id/placeholder" + android:layout_width="match_parent" + android:layout_height="match_parent"/> + +</LinearLayout> diff --git a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoConnectionController.java b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoConnectionController.java new file mode 100644 index 00000000000..63c9428e1fc --- /dev/null +++ b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoConnectionController.java @@ -0,0 +1,50 @@ +// 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.components.page_info; + +import android.view.View; +import android.view.ViewGroup; + +/** + * Class for controlling the page info connection section. + */ +public class PageInfoConnectionController implements PageInfoSubpageController { + private PageInfoController mMainController; + private PageInfoViewV2 mView; + private String mTitle; + + public PageInfoConnectionController(PageInfoController mainController, PageInfoViewV2 view) { + mMainController = mainController; + mView = view; + } + + private void launchSubpage() { + mMainController.launchSubpage(this); + } + + @Override + public String getSubpageTitle() { + return mTitle; + } + + @Override + public View createViewForSubpage(ViewGroup parent) { + // TODO(crbug.com/1077766): Create and set the connection specific view. + return null; + } + + @Override + public void willRemoveSubpage() {} + + public void setConnectionInfo(PageInfoView.ConnectionInfoParams params) { + mTitle = params.summary != null ? params.summary.toString() : null; + PageInfoRowView.ViewParams rowParams = new PageInfoRowView.ViewParams(); + rowParams.title = mTitle; + rowParams.subtitle = params.message != null ? params.message.toString() : null; + rowParams.visible = rowParams.title != null || rowParams.subtitle != null; + rowParams.clickCallback = this::launchSubpage; + mView.getConnectionRowView().setParams(rowParams); + } +} diff --git a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java index f11697ffe0a..52fbd50b098 100644 --- a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java +++ b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java @@ -17,7 +17,10 @@ import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.text.style.TextAppearanceSpan; +import android.view.View; +import android.view.ViewGroup; import android.view.Window; +import android.widget.FrameLayout; import androidx.annotation.IntDef; import androidx.annotation.VisibleForTesting; @@ -29,6 +32,7 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.NativeMethods; import org.chromium.base.metrics.RecordUserAction; import org.chromium.components.content_settings.ContentSettingValues; +import org.chromium.components.content_settings.CookieControlsBridge; import org.chromium.components.content_settings.CookieControlsEnforcement; import org.chromium.components.content_settings.CookieControlsObserver; import org.chromium.components.content_settings.CookieControlsStatus; @@ -90,6 +94,12 @@ public class PageInfoController implements ModalDialogProperties.Controller, // URL'. private String mFullUrl; + // The URL to be shown at the top of the page info views. + private SpannableStringBuilder mDisplayUrlBuilder; + + // The length of the URL's origin in number of characters. + private int mUrlOriginLength; + // Whether or not this page is an internal chrome page (e.g. the // chrome://settings page). private boolean mIsInternalPage; @@ -120,6 +130,24 @@ public class PageInfoController implements ModalDialogProperties.Controller, // Delegate used by PermissionParamsListBuilder. private final PermissionParamsListBuilderDelegate mPermissionParamsListBuilderDelegate; + // The specific subpage being shown at any time, if any. + private PageInfoSubpage mSubpage; + + // The current page info subpage controller, if any. + private PageInfoSubpageController mSubpageController; + + // The controller for the connection section of the page info. + private PageInfoConnectionController mConnectionController; + + // The controller for the permissions section of the page info. + private PageInfoPermissionsController mPermissionsController; + + // The controller for the cookies section of the page info. + private PageInfoCookiesController mCookiesController; + + // Bridge updating the CookieControlsView when cookie settings change. + private CookieControlsBridge mCookieBridge; + /** * Creates the PageInfoController, but does not display it. Also initializes the corresponding * C++ object and saves a pointer to it. @@ -131,12 +159,12 @@ public class PageInfoController implements ModalDialogProperties.Controller, */ @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) public PageInfoController(WebContents webContents, int securityLevel, String publisher, - PageInfoControllerDelegate delegate, boolean isV2Enabled, + PageInfoControllerDelegate delegate, PermissionParamsListBuilderDelegate permissionParamsListBuilderDelegate) { mWebContents = webContents; mSecurityLevel = securityLevel; mDelegate = delegate; - mIsV2Enabled = isV2Enabled; + mIsV2Enabled = PageInfoFeatureList.isEnabled(PageInfoFeatureList.PAGE_INFO_V2); mPermissionParamsListBuilderDelegate = permissionParamsListBuilderDelegate; mRunAfterDismissConsumer = new Consumer<Runnable>() { @Override @@ -179,27 +207,28 @@ public class PageInfoController implements ModalDialogProperties.Controller, if (mDelegate.isShowingOfflinePage()) { displayUrl = UrlUtilities.stripScheme(mFullUrl); } - SpannableStringBuilder displayUrlBuilder = new SpannableStringBuilder(displayUrl); + mDisplayUrlBuilder = new SpannableStringBuilder(displayUrl); AutocompleteSchemeClassifier autocompleteSchemeClassifier = delegate.createAutocompleteSchemeClassifier(); if (mSecurityLevel == ConnectionSecurityLevel.SECURE) { OmniboxUrlEmphasizer.EmphasizeComponentsResponse emphasizeResponse = OmniboxUrlEmphasizer.parseForEmphasizeComponents( - displayUrlBuilder.toString(), autocompleteSchemeClassifier); + mDisplayUrlBuilder.toString(), autocompleteSchemeClassifier); if (emphasizeResponse.schemeLength > 0) { - displayUrlBuilder.setSpan( + mDisplayUrlBuilder.setSpan( new TextAppearanceSpan(mContext, R.style.TextAppearance_RobotoMediumStyle), 0, emphasizeResponse.schemeLength, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); } } - boolean useDarkText = ColorUtils.useDarkColors(mContext); - OmniboxUrlEmphasizer.emphasizeUrl(displayUrlBuilder, mContext.getResources(), + boolean useDarkText = !ColorUtils.inNightMode(mContext); + OmniboxUrlEmphasizer.emphasizeUrl(mDisplayUrlBuilder, mContext.getResources(), autocompleteSchemeClassifier, mSecurityLevel, mIsInternalPage, useDarkText, /*emphasizeScheme=*/true); - viewParams.url = displayUrlBuilder; - viewParams.urlOriginLength = OmniboxUrlEmphasizer.getOriginEndIndex( - displayUrlBuilder.toString(), autocompleteSchemeClassifier); + viewParams.url = mDisplayUrlBuilder; + mUrlOriginLength = OmniboxUrlEmphasizer.getOriginEndIndex( + mDisplayUrlBuilder.toString(), autocompleteSchemeClassifier); + viewParams.urlOriginLength = mUrlOriginLength; autocompleteSchemeClassifier.destroy(); if (mDelegate.isSiteSettingsAvailable()) { @@ -215,7 +244,10 @@ public class PageInfoController implements ModalDialogProperties.Controller, viewParams.siteSettingsButtonShown = false; viewParams.cookieControlsShown = false; } - viewParams.onUiClosingCallback = mDelegate::onUiClosing; + viewParams.onUiClosingCallback = () -> { + // |this| may have already been destroyed by the time this is called. + if (mCookieBridge != null) mCookieBridge.onUiClosing(); + }; mDelegate.initPreviewUiParams(viewParams, mRunAfterDismissConsumer); mDelegate.initOfflinePageUiParams(viewParams, mRunAfterDismissConsumer); @@ -239,42 +271,33 @@ public class PageInfoController implements ModalDialogProperties.Controller, mView = mIsV2Enabled ? new PageInfoViewV2(mContext, viewParams) : new PageInfoView(mContext, viewParams); if (isSheet(mContext)) mView.setBackgroundColor(Color.WHITE); - // TODO(crbug.com/1040091): Remove when cookie controls are launched. - boolean showTitle = viewParams.cookieControlsShown; - mPermissionParamsListBuilder = - new PermissionParamsListBuilder(mContext, mWindowAndroid, mFullUrl, showTitle, this, - mView::setPermissions, mPermissionParamsListBuilderDelegate); - - mNativePageInfoController = PageInfoControllerJni.get().init(this, mWebContents); if (mIsV2Enabled) { - PageInfoRowView.ViewParams cookieControlsParams = new PageInfoRowView.ViewParams(); - cookieControlsParams.visible = viewParams.cookieControlsShown; - cookieControlsParams.title = - mView.getContext().getResources().getString(R.string.cookies_title); - ((PageInfoViewV2) mView).getCookiesRowView().setParams(cookieControlsParams); + PageInfoViewV2 view2 = (PageInfoViewV2) mView; + mConnectionController = new PageInfoConnectionController(this, view2); + mPermissionsController = new PageInfoPermissionsController(this, view2); + mCookiesController = + new PageInfoCookiesController(this, view2, viewParams.cookieControlsShown); } else { + mView.showPerformanceInfo(mDelegate.shouldShowPerformanceBadge(mFullUrl)); + mView.showHttpsImageCompressionInfo(mDelegate.isHttpsImageCompressionApplied()); + CookieControlsView.CookieControlsParams cookieControlsParams = new CookieControlsView.CookieControlsParams(); cookieControlsParams.onCheckedChangedCallback = (Boolean blockCookies) -> { recordAction(blockCookies ? PageInfoAction.PAGE_INFO_COOKIE_BLOCKED_FOR_SITE : PageInfoAction.PAGE_INFO_COOKIE_ALLOWED_FOR_SITE); - mDelegate.setThirdPartyCookieBlockingEnabledForSite(blockCookies); + mCookieBridge.setThirdPartyCookieBlockingEnabledForSite(blockCookies); }; mView.getCookieControlsView().setParams(cookieControlsParams); } - mDelegate.createCookieControlsBridge(this); - if (mIsV2Enabled) { - PageInfoRowView.ViewParams performanceParams = new PageInfoRowView.ViewParams(); - performanceParams.visible = mDelegate.shouldShowPerformanceBadge(mFullUrl); - performanceParams.title = mView.getContext().getResources().getString( - R.string.page_info_fast_site_summary); - performanceParams.subtitle = mView.getContext().getResources().getString( - R.string.page_info_fast_site_message); - ((PageInfoViewV2) mView).getPerformanceRowView().setParams(performanceParams); - } else { - mView.showPerformanceInfo(mDelegate.shouldShowPerformanceBadge(mFullUrl)); - } + // TODO(crbug.com/1040091): Remove when cookie controls are launched. + boolean showTitle = viewParams.cookieControlsShown; + mPermissionParamsListBuilder = + new PermissionParamsListBuilder(mContext, mWindowAndroid, mFullUrl, showTitle, this, + mView::setPermissions, mPermissionParamsListBuilderDelegate); + mNativePageInfoController = PageInfoControllerJni.get().init(this, mWebContents); + mCookieBridge = mDelegate.createCookieControlsBridge(this); mWebContentsObserver = new WebContentsObserver(webContents) { @Override @@ -317,6 +340,10 @@ public class PageInfoController implements ModalDialogProperties.Controller, mDialog.destroy(); mDialog = null; } + if (mCookieBridge != null) { + mCookieBridge.destroy(); + mCookieBridge = null; + } } /** @@ -346,7 +373,12 @@ public class PageInfoController implements ModalDialogProperties.Controller, @CalledByNative private void updatePermissionDisplay() { assert (mPermissionParamsListBuilder != null); - mView.setPermissions(mPermissionParamsListBuilder.build()); + PageInfoView.PermissionParams params = mPermissionParamsListBuilder.build(); + if (mIsV2Enabled) { + mPermissionsController.setPermissions(params); + } else { + mView.setPermissions(params); + } } /** @@ -404,16 +436,7 @@ public class PageInfoController implements ModalDialogProperties.Controller, } if (mIsV2Enabled) { - PageInfoRowView.ViewParams connectionRowParams = new PageInfoRowView.ViewParams(); - connectionRowParams.title = connectionInfoParams.summary != null - ? connectionInfoParams.summary.toString() - : null; - connectionRowParams.subtitle = connectionInfoParams.message != null - ? connectionInfoParams.message.toString() - : null; - connectionRowParams.visible = - connectionRowParams.title != null || connectionRowParams.subtitle != null; - ((PageInfoViewV2) mView).getConnectionRowView().setParams(connectionRowParams); + mConnectionController.setConnectionInfo(connectionInfoParams); } else { mView.setConnectionInfo(connectionInfoParams); } @@ -509,8 +532,7 @@ public class PageInfoController implements ModalDialogProperties.Controller, sLastPageInfoControllerForTesting = new WeakReference<>(new PageInfoController(webContents, SecurityStateModel.getSecurityLevelForWebContents(webContents), contentPublisher, - delegate, PageInfoFeatureList.isEnabled(PageInfoFeatureList.PAGE_INFO_V2), - permissionParamsListBuilderDelegate)); + delegate, permissionParamsListBuilderDelegate)); } @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) @@ -531,9 +553,7 @@ public class PageInfoController implements ModalDialogProperties.Controller, @Override public void onBlockedCookiesCountChanged(int blockedCookies) { if (mIsV2Enabled) { - String subtitle = mContext.getResources().getQuantityString( - R.plurals.cookie_controls_blocked_cookies, blockedCookies, blockedCookies); - ((PageInfoViewV2) mView).getCookiesRowView().updateSubtitle(subtitle); + mCookiesController.onBlockedCookiesCountChanged(blockedCookies); } else { mView.getCookieControlsView().setBlockedCookiesCount(blockedCookies); } @@ -546,4 +566,58 @@ public class PageInfoController implements ModalDialogProperties.Controller, void recordPageInfoAction( long nativePageInfoControllerAndroid, PageInfoController caller, int action); } + + PageInfoControllerDelegate getDelegate() { + return mDelegate; + } + + /** + * Launches a subpage with the specified params. + */ + void launchSubpage(PageInfoSubpageController controller) { + mSubpageController = controller; + PageInfoSubpage.Params subpageParams = new PageInfoSubpage.Params(); + subpageParams.url = mDisplayUrlBuilder; + subpageParams.urlOriginLength = mUrlOriginLength; + subpageParams.subpageTitle = mSubpageController.getSubpageTitle(); + mSubpage = new PageInfoSubpage(mContext, subpageParams); + mSubpage.setBackButtonOnClickListener(view -> exitSubpage()); + View subview = mSubpageController.createViewForSubpage(mSubpage); + if (subview != null) { + ((FrameLayout) mSubpage.findViewById(R.id.placeholder)).addView(subview); + } + replaceView(mView, mSubpage); + } + + private ViewGroup getParent(View view) { + return (ViewGroup) view.getParent(); + } + + private void removeView(View view) { + ViewGroup parent = getParent(view); + if (parent != null) { + parent.removeView(view); + } + } + + private void replaceView(View currentView, View newView) { + ViewGroup parent = getParent(currentView); + if (parent == null) { + return; + } + final int index = parent.indexOfChild(currentView); + removeView(currentView); + removeView(newView); + parent.addView(newView, index); + } + + /** + * Switches back to the main page info view. + */ + private void exitSubpage() { + mSubpageController.willRemoveSubpage(); + replaceView(mSubpage, mView); + mSubpage = null; + mSubpageController = null; + } } diff --git a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java index ddf0cad4904..a7ce7132acf 100644 --- a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java +++ b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java @@ -7,10 +7,12 @@ package org.chromium.components.page_info; import android.content.Intent; import androidx.annotation.IntDef; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.chromium.base.Consumer; import org.chromium.base.supplier.Supplier; +import org.chromium.components.content_settings.CookieControlsBridge; import org.chromium.components.content_settings.CookieControlsObserver; import org.chromium.components.omnibox.AutocompleteSchemeClassifier; import org.chromium.components.page_info.PageInfoView.PageInfoViewParams; @@ -22,7 +24,7 @@ import java.lang.annotation.RetentionPolicy; /** * Provides embedder-level information to PageInfoController. */ -public class PageInfoControllerDelegate { +public abstract class PageInfoControllerDelegate { @IntDef({OfflinePageState.NOT_OFFLINE_PAGE, OfflinePageState.TRUSTED_OFFLINE_PAGE, OfflinePageState.UNTRUSTED_OFFLINE_PAGE}) @Retention(RetentionPolicy.SOURCE) @@ -48,6 +50,7 @@ public class PageInfoControllerDelegate { private final boolean mCookieControlsShown; protected @PreviewPageState int mPreviewPageState; protected @OfflinePageState int mOfflinePageState; + protected boolean mIsHttpsImageCompressionApplied; protected String mOfflinePageUrl; public PageInfoControllerDelegate(Supplier<ModalDialogManager> modalDialogManager, @@ -58,6 +61,7 @@ public class PageInfoControllerDelegate { mVrHandler = vrHandler; mIsSiteSettingsAvailable = isSiteSettingsAvailable; mCookieControlsShown = cookieControlsShown; + mIsHttpsImageCompressionApplied = false; // These sometimes get overwritten by derived classes. mPreviewPageState = PreviewPageState.NOT_PREVIEW; @@ -119,6 +123,13 @@ public class PageInfoControllerDelegate { } /** + * Returns whether LiteMode https image compression was applied on this page + */ + public boolean isHttpsImageCompressionApplied() { + return mIsHttpsImageCompressionApplied; + } + + /** * Gets the instant app intent for the given URL if one exists. */ public Intent getInstantAppIntentForUrl(String url) { @@ -184,25 +195,14 @@ public class PageInfoControllerDelegate { * Show site settings for the URL passed in. * @param url The URL to show site settings for. */ - public void showSiteSettings(String url) { - // TODO(crbug.com/1058595): Override for WebLayer once SiteSettingsHelper is componentized. - } + public abstract void showSiteSettings(String url); - // TODO(crbug.com/1052375): Remove the next three methods when cookie controls UI - // has been componentized. /** * Creates Cookie Controls Bridge. - * @param The CookieControlsObserver to create the bridge with. - */ - public void createCookieControlsBridge(CookieControlsObserver observer) {} - - /** - * Called when cookie controls UI is closed. - */ - public void onUiClosing() {} - - /** - * Notes whether third party cookies should be blocked for the site. + * @param observer The CookieControlsObserver to create the bridge with. + * @return the object that facilitates interfacing with native code. */ - public void setThirdPartyCookieBlockingEnabledForSite(boolean blockCookies) {} + @NonNull + public abstract CookieControlsBridge createCookieControlsBridge( + CookieControlsObserver observer); } diff --git a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java new file mode 100644 index 00000000000..9fa99d0790a --- /dev/null +++ b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java @@ -0,0 +1,53 @@ +// 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.components.page_info; + +import android.view.View; +import android.view.ViewGroup; + +/** + * Class for controlling the page info cookies section. + */ +public class PageInfoCookiesController implements PageInfoSubpageController { + private PageInfoController mMainController; + private PageInfoViewV2 mView; + private String mTitle; + + public PageInfoCookiesController( + PageInfoController mainController, PageInfoViewV2 view, boolean isVisible) { + mMainController = mainController; + mView = view; + mTitle = mView.getContext().getResources().getString(R.string.cookies_title); + PageInfoRowView.ViewParams rowParams = new PageInfoRowView.ViewParams(); + rowParams.visible = isVisible; + rowParams.title = mTitle; + rowParams.clickCallback = this::launchSubpage; + mView.getCookiesRowView().setParams(rowParams); + } + + private void launchSubpage() { + mMainController.launchSubpage(this); + } + + @Override + public String getSubpageTitle() { + return mTitle; + } + + @Override + public View createViewForSubpage(ViewGroup parent) { + // TODO(crbug.com/1077766): Create and set the cookie specific view. + return null; + } + + @Override + public void willRemoveSubpage() {} + + public void onBlockedCookiesCountChanged(int blockedCookies) { + String subtitle = mView.getContext().getResources().getQuantityString( + R.plurals.cookie_controls_blocked_cookies, blockedCookies, blockedCookies); + mView.getCookiesRowView().updateSubtitle(subtitle); + } +} diff --git a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoPermissionsController.java b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoPermissionsController.java new file mode 100644 index 00000000000..e791c7da1f2 --- /dev/null +++ b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoPermissionsController.java @@ -0,0 +1,51 @@ +// 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.components.page_info; + +import android.view.View; +import android.view.ViewGroup; + +/** + * Class for controlling the page info permissions section. + */ +public class PageInfoPermissionsController implements PageInfoSubpageController { + private PageInfoController mMainController; + private PageInfoViewV2 mView; + private String mTitle; + + public PageInfoPermissionsController(PageInfoController mainController, PageInfoViewV2 view) { + mMainController = mainController; + mView = view; + } + + private void launchSubpage() { + mMainController.launchSubpage(this); + } + + @Override + public String getSubpageTitle() { + return mTitle; + } + + @Override + public View createViewForSubpage(ViewGroup parent) { + // TODO(crbug.com/1077766): Create and set the permissions specific view. + return null; + } + + @Override + public void willRemoveSubpage() {} + + public void setPermissions(PageInfoView.PermissionParams params) { + mTitle = mView.getContext().getResources().getString(R.string.page_info_permissions_title); + PageInfoRowView.ViewParams rowParams = new PageInfoRowView.ViewParams(); + rowParams.visible = true; + rowParams.title = mTitle; + // TODO(crbug.com/1077766): Create a permissions subtitle string that represents + // the state, using the PageInfoView.PermissionParams and potentially R.plurals. + rowParams.clickCallback = this::launchSubpage; + mView.getPermissionsRowView().setParams(rowParams); + } +} diff --git a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoRowView.java b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoRowView.java index a81ddd58599..fd857692db9 100644 --- a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoRowView.java +++ b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoRowView.java @@ -49,6 +49,7 @@ public class PageInfoRowView extends RelativeLayout implements OnClickListener { mTitle.setText(params.title); updateSubtitle(params.subtitle); mClickCallback = params.clickCallback; + setOnClickListener(this); } public void updateSubtitle(String subtitle) { diff --git a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoSubpage.java b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoSubpage.java new file mode 100644 index 00000000000..5341738665b --- /dev/null +++ b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoSubpage.java @@ -0,0 +1,48 @@ +// 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.components.page_info; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; + +/** + * Represents a particular page info subpage. + */ +public class PageInfoSubpage extends FrameLayout { + /** Parameters to configure the view of page info subpage. */ + public static class Params { + // The URL to be shown at the top of the page. + public CharSequence url; + // The length of the URL's origin in number of characters. + public int urlOriginLength; + // The name of the subpage to be displayed. + public String subpageTitle; + } + + private PageInfoView.ElidedUrlTextView mUrlTitle; + private ImageView mBackButton; + private TextView mSubpageTitle; + + public PageInfoSubpage(Context context, Params params) { + super(context); + LayoutInflater.from(context).inflate(R.layout.page_info_subpage, this, true); + // Set the url title. + mUrlTitle = findViewById(R.id.subpage_url); + mUrlTitle.setUrl(params.url, params.urlOriginLength); + // Set the back button. + mBackButton = findViewById(R.id.subpage_back_button); + // Set the page title. + mSubpageTitle = findViewById(R.id.subpage_title); + mSubpageTitle.setText(params.subpageTitle); + } + + public void setBackButtonOnClickListener(View.OnClickListener listener) { + mBackButton.setOnClickListener(listener); + } +} diff --git a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoSubpageController.java b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoSubpageController.java new file mode 100644 index 00000000000..de1620f8064 --- /dev/null +++ b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoSubpageController.java @@ -0,0 +1,28 @@ +// 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.components.page_info; + +import android.view.View; +import android.view.ViewGroup; + +/** + * Interface for a page info subpage controller. + */ +public interface PageInfoSubpageController { + /** + * Returns a title string for the page info subpage. + */ + String getSubpageTitle(); + + /** + * Returns a personalized subview to be used inside of the page info subpage. + */ + View createViewForSubpage(ViewGroup parent); + + /** + * Called before the subpage closes in order to perform any necessary cleanup. + */ + void willRemoveSubpage(); +} diff --git a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoView.java b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoView.java index 6783c5a29d6..0dc58e2a503 100644 --- a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoView.java +++ b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoView.java @@ -225,6 +225,7 @@ public class PageInfoView extends FrameLayout implements OnClickListener, OnLong private TextView mPermissionsTitle; private View mPermissionsSeparator; private LinearLayout mPermissionsList; + private TextView mHttpsImageCompressionMessage; private View mCookieControlsSeparator; private CookieControlsView mCookieControlsView; @@ -243,6 +244,7 @@ public class PageInfoView extends FrameLayout implements OnClickListener, OnLong initPreview(params); initConnection(params); initPerformance(params); + initHttpsImageCompression(params); initPermissions(params); initCookies(params); initInstantApp(params); @@ -294,6 +296,12 @@ public class PageInfoView extends FrameLayout implements OnClickListener, OnLong initializePageInfoViewChild(mPerformanceMessage, false, 0f, null); } + protected void initHttpsImageCompression(PageInfoViewParams params) { + mHttpsImageCompressionMessage = + findViewById(R.id.page_info_lite_mode_https_image_compression_message); + initializePageInfoViewChild(mHttpsImageCompressionMessage, false, 0f, null); + } + protected void initPermissions(PageInfoViewParams params) { mPermissionsTitle = findViewById(R.id.page_info_permissions_list_title); mPermissionsSeparator = findViewById(R.id.page_info_permissions_separator); @@ -378,6 +386,14 @@ public class PageInfoView extends FrameLayout implements OnClickListener, OnLong } } + public void showHttpsImageCompressionInfo(boolean show) { + if (show) { + mHttpsImageCompressionMessage.setVisibility(View.VISIBLE); + } else { + mHttpsImageCompressionMessage.setVisibility(View.GONE); + } + } + public Animator createEnterExitAnimation(boolean isEnter) { return createFadeAnimations(isEnter); } @@ -462,19 +478,20 @@ public class PageInfoView extends FrameLayout implements OnClickListener, OnLong animatableViews.add(mConnectionMessage); animatableViews.add(mPerformanceSummary); animatableViews.add(mPerformanceMessage); + animatableViews.add(mPreviewSeparator); animatableViews.add(mPreviewMessage); animatableViews.add(mPreviewStaleTimestamp); animatableViews.add(mPreviewLoadOriginal); - animatableViews.add(mPreviewSeparator); + animatableViews.add(mHttpsImageCompressionMessage); animatableViews.add(mInstantAppButton); - animatableViews.add(mPermissionsTitle); + animatableViews.add(mCookieControlsSeparator); + animatableViews.add(mCookieControlsView); animatableViews.add(mPermissionsSeparator); + animatableViews.add(mPermissionsTitle); for (int i = 0; i < mPermissionsList.getChildCount(); i++) { animatableViews.add(mPermissionsList.getChildAt(i)); } animatableViews.add(mSiteSettingsButton); - animatableViews.add(mCookieControlsSeparator); - animatableViews.add(mCookieControlsView); return animatableViews; } diff --git a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoViewV2.java b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoViewV2.java index 9b580ffaf46..3da71ab8d0a 100644 --- a/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoViewV2.java +++ b/chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoViewV2.java @@ -64,6 +64,11 @@ public class PageInfoViewV2 extends PageInfoView { mOnUiClosingCallback = params.onUiClosingCallback; } + @Override + protected void initHttpsImageCompression(PageInfoViewParams params) { + // TODO(crbug.com/1077766): Migrate image compression UI. + } + public PageInfoRowView getConnectionRowView() { return mConnectionRow; } diff --git a/chromium/components/page_info/android/page_info_controller_android.cc b/chromium/components/page_info/android/page_info_controller_android.cc index a662c37a87c..c092cbe5a07 100644 --- a/chromium/components/page_info/android/page_info_controller_android.cc +++ b/chromium/components/page_info/android/page_info_controller_android.cc @@ -126,10 +126,8 @@ void PageInfoControllerAndroid::SetPermissionInfo( base::CommandLine* cmd = base::CommandLine::ForCurrentProcess(); if (cmd->HasSwitch(switches::kEnableExperimentalWebPlatformFeatures)) permissions_to_display.push_back(ContentSettingsType::BLUETOOTH_SCANNING); - if (base::FeatureList::IsEnabled(features::kWebXrPermissionsApi)) { - permissions_to_display.push_back(ContentSettingsType::VR); - permissions_to_display.push_back(ContentSettingsType::AR); - } + permissions_to_display.push_back(ContentSettingsType::VR); + permissions_to_display.push_back(ContentSettingsType::AR); std::map<ContentSettingsType, ContentSetting> user_specified_settings_to_display; diff --git a/chromium/components/page_info/android/page_info_feature_list.cc b/chromium/components/page_info/android/page_info_feature_list.cc index 3e1e0a8890e..b0e82e76246 100644 --- a/chromium/components/page_info/android/page_info_feature_list.cc +++ b/chromium/components/page_info/android/page_info_feature_list.cc @@ -4,6 +4,7 @@ #include "base/android/jni_string.h" #include "base/feature_list.h" +#include "base/notreached.h" #include "base/stl_util.h" #include "components/page_info/android/features.h" #include "components/page_info/android/jni_headers/PageInfoFeatureList_jni.h" @@ -43,4 +44,4 @@ static jboolean JNI_PageInfoFeatureList_IsEnabled( return base::FeatureList::IsEnabled(*feature); } -} // namespace page_info
\ No newline at end of file +} // namespace page_info diff --git a/chromium/components/page_info/page_info.cc b/chromium/components/page_info/page_info.cc index 906fc1b79ef..60441eb91e1 100644 --- a/chromium/components/page_info/page_info.cc +++ b/chromium/components/page_info/page_info.cc @@ -113,6 +113,7 @@ ContentSettingsType kPermissionType[] = { #endif ContentSettingsType::USB_GUARD, #if !defined(OS_ANDROID) + ContentSettingsType::HID_GUARD, ContentSettingsType::SERIAL_GUARD, ContentSettingsType::NATIVE_FILE_SYSTEM_WRITE_GUARD, #endif @@ -135,9 +136,16 @@ bool IsPermissionFactoryDefault(HostContentSettingsMap* content_settings, content_settings::ContentSettingsRegistry::GetInstance() ->Get(info.type) ->GetInitialDefaultSetting(); - return (info.source == content_settings::SETTING_SOURCE_USER && - factory_default_setting == info.default_setting && - info.setting == CONTENT_SETTING_DEFAULT); + + // Settings that are granted in regular mode get reduced to ASK in incognito + // mode. These settings should not be displayed either. + const bool is_incognito_default = + info.is_incognito && info.setting == CONTENT_SETTING_ASK && + factory_default_setting == CONTENT_SETTING_ASK; + + return info.source == content_settings::SETTING_SOURCE_USER && + factory_default_setting == info.default_setting && + (info.setting == CONTENT_SETTING_DEFAULT || is_incognito_default); } // Determines whether to show permission |type| in the Page Info UI. Only @@ -172,16 +180,13 @@ bool ShouldShowPermission(const PageInfoUI::PermissionInfo& info, #if defined(OS_ANDROID) // Special geolocation DSE settings apply only on Android, so make sure it // gets checked there regardless of default setting on Desktop. - if (info.type == ContentSettingsType::GEOLOCATION) + // DSE settings don't apply to incognito mode. + if (info.type == ContentSettingsType::GEOLOCATION && !info.is_incognito) return true; // The Native File System write permission is desktop only at the moment. if (info.type == ContentSettingsType::NATIVE_FILE_SYSTEM_WRITE_GUARD) return false; - - // Camera PTZ is desktop only at the moment. - if (info.type == ContentSettingsType::CAMERA_PAN_TILT_ZOOM) - return false; #else // Flash is shown if the user has ever changed its setting for |site_url|. if (info.type == ContentSettingsType::PLUGINS && @@ -208,6 +213,21 @@ bool ShouldShowPermission(const PageInfoUI::PermissionInfo& info, !cmd->HasSwitch(switches::kEnableExperimentalWebPlatformFeatures)) { return false; } + + // Hide camera if camera PTZ is granted or blocked. + if (info.type == ContentSettingsType::MEDIASTREAM_CAMERA && + cmd->HasSwitch(switches::kEnableExperimentalWebPlatformFeatures)) { + std::unique_ptr<base::Value> value = content_settings->GetWebsiteSetting( + site_url, site_url, ContentSettingsType::CAMERA_PAN_TILT_ZOOM, + std::string(), nullptr); + DCHECK(value.get()); + ContentSetting camera_ptz_setting = + content_settings::ValueToContentSetting(value.get()); + if (camera_ptz_setting == CONTENT_SETTING_ALLOW || + camera_ptz_setting == CONTENT_SETTING_BLOCK) { + return false; + } + } #endif // Show the content setting if it has been changed by the user since the last @@ -296,6 +316,10 @@ const PageInfo::ChooserUIInfo kChooserUIInfo[] = { IDS_PAGE_INFO_USB_DEVICE_ALLOWED_BY_POLICY_LABEL, IDS_PAGE_INFO_DELETE_USB_DEVICE}, #if !defined(OS_ANDROID) + {ContentSettingsType::HID_CHOOSER_DATA, + IDS_PAGE_INFO_HID_DEVICE_SECONDARY_LABEL, + /*allowed_by_policy_description_string_id=*/-1, + IDS_PAGE_INFO_DELETE_HID_DEVICE}, {ContentSettingsType::SERIAL_CHOOSER_DATA, IDS_PAGE_INFO_SERIAL_PORT_SECONDARY_LABEL, /*allowed_by_policy_description_string_id=*/-1, @@ -409,6 +433,8 @@ PageInfo::~PageInfo() { void PageInfo::InitializeUiState(PageInfoUI* ui) { ui_ = ui; DCHECK(ui_); + // TabSpecificContentSetting needs to be created before page load. + DCHECK(GetTabSpecificContentSettings()); ComputeUIInputs(site_url_); PresentSitePermissions(); @@ -456,11 +482,15 @@ void PageInfo::RecordPageInfoAction(PageInfoAction action) { std::string histogram_name; if (site_url_.SchemeIsCryptographic()) { if (security_level_ == security_state::SECURE) { - UMA_HISTOGRAM_ENUMERATION("Security.PageInfo.Action.HttpsUrl.ValidNonEV", - action, PAGE_INFO_COUNT); - } else if (security_level_ == security_state::EV_SECURE) { - UMA_HISTOGRAM_ENUMERATION("Security.PageInfo.Action.HttpsUrl.ValidEV", - action, PAGE_INFO_COUNT); + if (visible_security_state_for_metrics_.cert_status & + net::CERT_STATUS_IS_EV) { + UMA_HISTOGRAM_ENUMERATION("Security.PageInfo.Action.HttpsUrl.ValidEV", + action, PAGE_INFO_COUNT); + } else { + UMA_HISTOGRAM_ENUMERATION( + "Security.PageInfo.Action.HttpsUrl.ValidNonEV", action, + PAGE_INFO_COUNT); + } } else if (security_level_ == security_state::NONE) { UMA_HISTOGRAM_ENUMERATION("Security.PageInfo.Action.HttpsUrl.Downgraded", action, PAGE_INFO_COUNT); @@ -889,8 +919,8 @@ void PageInfo::PresentSitePermissions() { PageInfoUI::PermissionInfo permission_info; HostContentSettingsMap* content_settings = GetContentSettings(); - for (size_t i = 0; i < base::size(kPermissionType); ++i) { - permission_info.type = kPermissionType[i]; + for (const ContentSettingsType type : kPermissionType) { + permission_info.type = type; content_settings::SettingInfo info; @@ -917,7 +947,7 @@ void PageInfo::PresentSitePermissions() { } else { permission_info.default_setting = content_settings->GetDefaultContentSetting(permission_info.type, - NULL); + nullptr); } // For permissions that are still prompting the user and haven't been @@ -1040,8 +1070,8 @@ HostContentSettingsMap* PageInfo::GetContentSettings() const { std::vector<ContentSettingsType> PageInfo::GetAllPermissionsForTesting() { std::vector<ContentSettingsType> permission_list; - for (size_t i = 0; i < base::size(kPermissionType); ++i) - permission_list.push_back(kPermissionType[i]); + for (const ContentSettingsType type : kPermissionType) + permission_list.push_back(type); return permission_list; } @@ -1108,38 +1138,52 @@ PageInfo::GetTabSpecificContentSettings() const { } bool PageInfo::HasContentSettingChangedViaPageInfo(ContentSettingsType type) { - return GetTabSpecificContentSettings()->HasContentSettingChangedViaPageInfo( - type); -} + auto* settings = GetTabSpecificContentSettings(); + if (!settings) + return false; -void PageInfo::ContentSettingChangedViaPageInfo(ContentSettingsType type) { - GetTabSpecificContentSettings()->ContentSettingChangedViaPageInfo(type); + return settings->HasContentSettingChangedViaPageInfo(type); } -const browsing_data::LocalSharedObjectsContainer& PageInfo::GetAllowedObjects( - const GURL& site_url) { - return GetTabSpecificContentSettings()->allowed_local_shared_objects(); -} +void PageInfo::ContentSettingChangedViaPageInfo(ContentSettingsType type) { + auto* settings = GetTabSpecificContentSettings(); + if (!settings) + return; -const browsing_data::LocalSharedObjectsContainer& PageInfo::GetBlockedObjects( - const GURL& site_url) { - return GetTabSpecificContentSettings()->blocked_local_shared_objects(); + return settings->ContentSettingChangedViaPageInfo(type); } int PageInfo::GetFirstPartyAllowedCookiesCount(const GURL& site_url) { - return GetAllowedObjects(site_url).GetObjectCountForDomain(site_url); + auto* settings = GetTabSpecificContentSettings(); + if (!settings) + return 0; + return settings->allowed_local_shared_objects().GetObjectCountForDomain( + site_url); } int PageInfo::GetFirstPartyBlockedCookiesCount(const GURL& site_url) { - return GetBlockedObjects(site_url).GetObjectCountForDomain(site_url); + auto* settings = GetTabSpecificContentSettings(); + if (!settings) + return 0; + + return settings->blocked_local_shared_objects().GetObjectCountForDomain( + site_url); } int PageInfo::GetThirdPartyAllowedCookiesCount(const GURL& site_url) { - return GetAllowedObjects(site_url).GetObjectCount() - + auto* settings = GetTabSpecificContentSettings(); + if (!settings) + return 0; + + return settings->allowed_local_shared_objects().GetObjectCount() - GetFirstPartyAllowedCookiesCount(site_url); } int PageInfo::GetThirdPartyBlockedCookiesCount(const GURL& site_url) { - return GetBlockedObjects(site_url).GetObjectCount() - + auto* settings = GetTabSpecificContentSettings(); + if (!settings) + return 0; + + return settings->blocked_local_shared_objects().GetObjectCount() - GetFirstPartyBlockedCookiesCount(site_url); } diff --git a/chromium/components/page_info/page_info.h b/chromium/components/page_info/page_info.h index 1fcd8ba0906..8acef48c93f 100644 --- a/chromium/components/page_info/page_info.h +++ b/chromium/components/page_info/page_info.h @@ -217,6 +217,8 @@ class PageInfo : public content::WebContentsObserver { private: FRIEND_TEST_ALL_PREFIXES(PageInfoTest, NonFactoryDefaultAndRecentlyChangedPermissionsShown); + FRIEND_TEST_ALL_PREFIXES(PageInfoTest, IncognitoPermissionsEmptyByDefault); + FRIEND_TEST_ALL_PREFIXES(PageInfoTest, IncognitoPermissionsDontShowAsk); friend class PageInfoBubbleViewBrowserTest; // Populates this object's UI state with provided security context. This // function does not update visible UI-- that's part of Present*(). @@ -258,8 +260,8 @@ class PageInfo : public content::WebContentsObserver { // Exposed for testing. static std::vector<ContentSettingsType> GetAllPermissionsForTesting(); - // Creates if necessary, and returns TabSpecificContentSettings - // for the observed WebContents. + // Returns TabSpecificContentSettings for the observed WebContents if present, + // nullptr otherwise. content_settings::TabSpecificContentSettings* GetTabSpecificContentSettings() const; @@ -270,13 +272,6 @@ class PageInfo : public content::WebContentsObserver { // via Page Info UI. void ContentSettingChangedViaPageInfo(ContentSettingsType type); - // Get allowed and blocked shared objects like cookies, local storage, etc for - // |site_url|. - const browsing_data::LocalSharedObjectsContainer& GetAllowedObjects( - const GURL& site_url); - const browsing_data::LocalSharedObjectsContainer& GetBlockedObjects( - const GURL& site_url); - // Get counts of allowed and blocked cookies. int GetFirstPartyAllowedCookiesCount(const GURL& site_url); int GetFirstPartyBlockedCookiesCount(const GURL& site_url); diff --git a/chromium/components/page_info/page_info_ui.cc b/chromium/components/page_info/page_info_ui.cc index c5af741586f..a37312090ef 100644 --- a/chromium/components/page_info/page_info_ui.cc +++ b/chromium/components/page_info/page_info_ui.cc @@ -184,6 +184,9 @@ base::span<const PermissionsUIInfo> GetContentSettingsUIInfo() { IDS_PAGE_INFO_TYPE_CAMERA_PAN_TILT_ZOOM}, {ContentSettingsType::WINDOW_PLACEMENT, IDS_PAGE_INFO_TYPE_WINDOW_PLACEMENT}, +#if !defined(OS_ANDROID) + {ContentSettingsType::HID_GUARD, IDS_PAGE_INFO_TYPE_HID}, +#endif }; return kPermissionsUIInfo; } @@ -578,6 +581,7 @@ const gfx::ImageSkia PageInfoUI::GetPermissionIcon(const PermissionInfo& info, icon = &vector_icons::kMicIcon; break; case ContentSettingsType::MEDIASTREAM_CAMERA: + case ContentSettingsType::CAMERA_PAN_TILT_ZOOM: icon = &vector_icons::kVideocamIcon; break; case ContentSettingsType::AUTOMATIC_DOWNLOADS: @@ -625,12 +629,12 @@ const gfx::ImageSkia PageInfoUI::GetPermissionIcon(const PermissionInfo& info, case ContentSettingsType::AR: icon = &vector_icons::kVrHeadsetIcon; break; - case ContentSettingsType::CAMERA_PAN_TILT_ZOOM: - icon = &vector_icons::kCameraPanTiltZoomIcon; - break; case ContentSettingsType::WINDOW_PLACEMENT: icon = &vector_icons::kWindowPlacementIcon; break; + case ContentSettingsType::HID_GUARD: + icon = &vector_icons::kVideogameAssetIcon; + break; default: // All other |ContentSettingsType|s do not have icons on desktop or are // not shown in the Page Info bubble. @@ -672,6 +676,9 @@ const gfx::ImageSkia PageInfoUI::GetChosenObjectIcon( case ContentSettingsType::BLUETOOTH_CHOOSER_DATA: icon = &vector_icons::kBluetoothIcon; break; + case ContentSettingsType::HID_CHOOSER_DATA: + icon = &vector_icons::kVideogameAssetIcon; + break; default: // All other content settings types do not represent chosen object // permissions. |