From: uazo Date: Sun, 4 Feb 2024 16:02:48 +0000 Subject: Change popup site setting In site settings added ability to block all popups per site License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html --- .../settings/site_settings/popups_page.html | 2 + .../tab_under_navigation_throttle.cc | 11 +- .../android/popup_blocked_message_delegate.cc | 20 ++- .../android/popup_blocked_message_delegate.h | 1 + components/blocked_content/popup_blocker.cc | 3 + components/blocked_content_strings.grdp | 3 + .../impl/BromitePopupContentSetting.java | 115 ++++++++++++++++++ .../bromite_content_settings/popups.grdp | 18 +++ .../bromite_content_settings/popups.inc | 13 ++ .../core/browser/content_settings_registry.cc | 2 +- 10 files changed, 182 insertions(+), 6 deletions(-) create mode 100644 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromitePopupContentSetting.java create mode 100644 components/browser_ui/strings/bromite_content_settings/popups.grdp create mode 100644 components/content_settings/core/browser/bromite_content_settings/popups.inc diff --git a/chrome/browser/resources/settings/site_settings/popups_page.html b/chrome/browser/resources/settings/site_settings/popups_page.html --- a/chrome/browser/resources/settings/site_settings/popups_page.html +++ b/chrome/browser/resources/settings/site_settings/popups_page.html @@ -10,6 +10,8 @@ category="[[contentSettingsTypesEnum_.POPUPS]]" allow-option-label="$i18n{siteSettingsPopupsAllowed}" allow-option-icon="cr:open-in-new" + ask-option-label="$i18n{brSiteSettingspopupsAsk}" + ask-option-icon="privacy:open-in-new-off" block-option-label="$i18n{siteSettingsPopupsBlocked}" block-option-icon="privacy:open-in-new-off"> diff --git a/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.cc b/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.cc --- a/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.cc +++ b/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.cc @@ -143,9 +143,14 @@ TabUnderNavigationThrottle::MaybeBlockNavigation() { LogTabUnderAttempt(navigation_handle()); - // We unconditionally proceed. There used to be a tab-under blocking - // experiment, but it never launched. - return content::NavigationThrottle::PROCEED; + content::WebContents* web_contents = navigation_handle()->GetWebContents(); + const std::string error = + base::StringPrintf(kBlockTabUnderFormatMessage, + navigation_handle()->GetURL().spec().c_str()); + web_contents->GetPrimaryMainFrame()->AddMessageToConsole( + blink::mojom::ConsoleMessageLevel::kError, error.c_str()); + ShowUI(); + return content::NavigationThrottle::CANCEL; } void TabUnderNavigationThrottle::ShowUI() { diff --git a/components/blocked_content/android/popup_blocked_message_delegate.cc b/components/blocked_content/android/popup_blocked_message_delegate.cc --- a/components/blocked_content/android/popup_blocked_message_delegate.cc +++ b/components/blocked_content/android/popup_blocked_message_delegate.cc @@ -32,7 +32,7 @@ bool PopupBlockedMessageDelegate::ShowMessage( // the callback. auto message = std::make_unique( messages::MessageIdentifier::POPUP_BLOCKED, - base::BindOnce(&PopupBlockedMessageDelegate::HandleClick, + base::BindOnce(&PopupBlockedMessageDelegate::HandleOpenLink, base::Unretained(this)), base::BindOnce(&PopupBlockedMessageDelegate::HandleDismissCallback, base::Unretained(this))); @@ -46,7 +46,7 @@ bool PopupBlockedMessageDelegate::ShowMessage( // Don't allow the user to configure the setting in the UI if the setting // is managed by policy. int button_text_id = - allow_settings_changes_ ? IDS_POPUPS_BLOCKED_INFOBAR_BUTTON_SHOW : IDS_OK; + allow_settings_changes_ ? IDS_POPUPS_BLOCKED_INFOBAR_BUTTON_SHOW_THIS_TIME : IDS_OK; message->SetPrimaryButtonText(l10n_util::GetStringUTF16(button_text_id)); messages::MessageDispatcherBridge* message_dispatcher_bridge = messages::MessageDispatcherBridge::Get(); @@ -54,6 +54,14 @@ bool PopupBlockedMessageDelegate::ShowMessage( message->SetIconResourceId(message_dispatcher_bridge->MapToJavaDrawableId( IDR_ANDROID_INFOBAR_BLOCKED_POPUPS)); + message->SetSecondaryIconResourceId( + message_dispatcher_bridge->MapToJavaDrawableId( + IDR_ANDROID_SETTINGS)); + message->SetSecondaryButtonMenuText( + l10n_util::GetStringUTF16(IDS_POPUPS_BLOCKED_INFOBAR_BUTTON_SHOW)); + message->SetSecondaryActionCallback( + base::BindRepeating(&PopupBlockedMessageDelegate::HandleClick, + base::Unretained(this))); // On rare occasions, such as the moment when activity is being recreated // or destroyed, popup blocked message will not be displayed and the // method will return false. @@ -102,6 +110,14 @@ void PopupBlockedMessageDelegate::HandleClick() { std::move(on_show_popups_callback_).Run(); } +void PopupBlockedMessageDelegate::HandleOpenLink() { + // Launch popups. + ShowBlockedPopups(&GetWebContents()); + + if (on_show_popups_callback_) + std::move(on_show_popups_callback_).Run(); +} + WEB_CONTENTS_USER_DATA_KEY_IMPL(PopupBlockedMessageDelegate); } // namespace blocked_content diff --git a/components/blocked_content/android/popup_blocked_message_delegate.h b/components/blocked_content/android/popup_blocked_message_delegate.h --- a/components/blocked_content/android/popup_blocked_message_delegate.h +++ b/components/blocked_content/android/popup_blocked_message_delegate.h @@ -41,6 +41,7 @@ class PopupBlockedMessageDelegate explicit PopupBlockedMessageDelegate(content::WebContents* web_contents); void HandleClick(); + void HandleOpenLink(); void HandleDismissCallback(messages::DismissReason dismiss_reason); raw_ptr map_ = nullptr; diff --git a/components/blocked_content/popup_blocker.cc b/components/blocked_content/popup_blocker.cc --- a/components/blocked_content/popup_blocker.cc +++ b/components/blocked_content/popup_blocker.cc @@ -70,6 +70,9 @@ PopupBlockType ShouldBlockPopup(content::WebContents* web_contents, if (cs == CONTENT_SETTING_ALLOW) return PopupBlockType::kNotBlocked; + if (cs == CONTENT_SETTING_ASK) + return PopupBlockType::kAbusive; + if (!user_gesture) return PopupBlockType::kNoGesture; diff --git a/components/blocked_content_strings.grdp b/components/blocked_content_strings.grdp --- a/components/blocked_content_strings.grdp +++ b/components/blocked_content_strings.grdp @@ -4,6 +4,9 @@ Always show + + Open this time + {NUM_POPUPS,plural,=1{Pop-up blocked} other{# pop-ups blocked}} diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromitePopupContentSetting.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromitePopupContentSetting.java new file mode 100644 --- /dev/null +++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromitePopupContentSetting.java @@ -0,0 +1,115 @@ +/* + This file is part of Bromite. + + Bromite is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Bromite is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bromite. If not, see . +*/ + +package org.chromium.components.browser_ui.site_settings.impl; + +import android.content.Context; + +import org.chromium.components.browser_ui.site_settings.R; + +import org.chromium.components.browser_ui.site_settings.BromiteCustomContentSetting; +import org.chromium.components.browser_ui.site_settings.ContentSettingsResources; +import org.chromium.components.browser_ui.site_settings.SiteSettingsCategory; +import org.chromium.components.content_settings.ContentSetting; +import org.chromium.components.content_settings.ContentSettingsType; +import org.chromium.content_public.browser.BrowserContextHandle; + +import androidx.annotation.Nullable; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import java.util.ArrayList; + +public class BromitePopupContentSetting extends BromiteCustomContentSetting { + public BromitePopupContentSetting() { + super(/*contentSettingsType*/ ContentSettingsType.POPUPS, + /*defaultEnabledValue*/ ContentSetting.ALLOW, + /*defaultDisabledValue*/ ContentSetting.BLOCK, + /*allowException*/ true, + /*preferenceKey*/ "popups", + /*profilePrefKey*/ "popups"); + } + + @Override + public ContentSettingsResources.ResourceItem getResourceItem() { + return new ContentSettingsResources.ResourceItem( + /*icon*/ R.drawable.permission_popups, + /*title*/ R.string.popup_permission_title, + /*defaultEnabledValue*/ getDefaultEnabledValue(), + /*defaultDisabledValue*/ getDefaultDisabledValue(), + /*enabledSummary*/ R.string.website_settings_category_popup_allowed, + /*disabledSummary*/ R.string.website_settings_category_popup_blocked, + /*summaryOverrideForScreenReader*/ 0); + } + + @Override + public int getCategorySummary(@Nullable @ContentSetting int value) { + switch (value) { + case ContentSetting.ALLOW: + return R.string.website_settings_category_popup_allowed; + case ContentSetting.BLOCK: + return R.string.website_settings_category_popup_blocked; + case ContentSetting.ASK: + return R.string.website_settings_category_popup_block_all; + default: + return 0; + } + } + + @Override + public int getCategoryDescription() { + return 0; + } + + @Override + public boolean requiresTriStateContentSetting() { + return true; + } + + @Override + public int[] getTriStateSettingDescriptionIDs() { + int[] descriptionIDs = { + R.string.website_settings_category_popup_allowed, // ALLOWED + R.string.website_settings_category_popup_block_all, // ASK + R.string.website_settings_category_popup_blocked}; // BLOCKED + return descriptionIDs; + } + + @Override + public int[] getTriStateSettingIconIDs() { + return new int[] { + R.drawable.permission_popups, + R.drawable.permission_popups, + R.drawable.sensors_off_24px + }; + } + + @Override + public boolean showOnlyDescriptions() { + return true; + } + + @Override + public int getAddExceptionDialogMessage() { + return R.string.website_settings_category_popup_allowed; + } + + @Override + public @Nullable Boolean considerException(SiteSettingsCategory category, @ContentSetting int value) { + return ContentSetting.ALLOW != value; + } +} diff --git a/components/browser_ui/strings/bromite_content_settings/popups.grdp b/components/browser_ui/strings/bromite_content_settings/popups.grdp new file mode 100644 --- /dev/null +++ b/components/browser_ui/strings/bromite_content_settings/popups.grdp @@ -0,0 +1,18 @@ + + + + Block sites from showing pop-ups and redirects + + + When on, sites can use pop-ups and redirects. When off, sites can’t use pop-ups and redirects. + + + Block all popups + + + Allows popups + + + Block some popups + + diff --git a/components/content_settings/core/browser/bromite_content_settings/popups.inc b/components/content_settings/core/browser/bromite_content_settings/popups.inc new file mode 100644 --- /dev/null +++ b/components/content_settings/core/browser/bromite_content_settings/popups.inc @@ -0,0 +1,13 @@ + content_settings::WebsiteSettingsRegistry::GetInstance() + ->GetMutable(ContentSettingsType::POPUPS) + ->set_show_into_info_page() + .set_desktop_ui() + .set_is_renderer_content_setting() + .set_title_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP) + .set_description_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_DESCRIPTION) + .set_allowed_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_ALLOWED) + .set_ask_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_BLOCK_ALL) + .set_blocked_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_BLOCKED) + .set_allowed_exceptions_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_ALLOWED) + .set_blocked_exceptions_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_BLOCKED) + .set_mid_sentence_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP); diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc --- a/components/content_settings/core/browser/content_settings_registry.cc +++ b/components/content_settings/core/browser/content_settings_registry.cc @@ -139,7 +139,7 @@ void ContentSettingsRegistry::Init() { WebsiteSettingsInfo::SYNCABLE, /*allowlisted_primary_schemes=*/ {kChromeUIScheme, kChromeDevToolsScheme, kExtensionScheme}, - /*valid_settings=*/{CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK}, + /*valid_settings=*/{CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, CONTENT_SETTING_ASK}, WebsiteSettingsInfo::TOP_ORIGIN_ONLY_SCOPE, WebsiteSettingsRegistry::ALL_PLATFORMS, ContentSettingsInfo::INHERIT_IN_INCOGNITO, --