summaryrefslogtreecommitdiff
path: root/chromium/components/page_info
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/page_info')
-rw-r--r--chromium/components/page_info/BUILD.gn1
-rw-r--r--chromium/components/page_info/android/BUILD.gn7
-rw-r--r--chromium/components/page_info/android/java/res/layout/page_info.xml9
-rw-r--r--chromium/components/page_info/android/java/res/layout/page_info_subpage.xml67
-rw-r--r--chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoConnectionController.java50
-rw-r--r--chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java178
-rw-r--r--chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java36
-rw-r--r--chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java53
-rw-r--r--chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoPermissionsController.java51
-rw-r--r--chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoRowView.java1
-rw-r--r--chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoSubpage.java48
-rw-r--r--chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoSubpageController.java28
-rw-r--r--chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoView.java25
-rw-r--r--chromium/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoViewV2.java5
-rw-r--r--chromium/components/page_info/android/page_info_controller_android.cc6
-rw-r--r--chromium/components/page_info/android/page_info_feature_list.cc3
-rw-r--r--chromium/components/page_info/page_info.cc112
-rw-r--r--chromium/components/page_info/page_info.h13
-rw-r--r--chromium/components/page_info/page_info_ui.cc13
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.