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 --- .../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 | 106 ++++++++++++++++++ .../bromite_content_settings/popups.grdp | 12 ++ .../bromite_content_settings/popups.inc | 7 ++ .../core/browser/content_settings_registry.cc | 2 +- 8 files changed, 151 insertions(+), 3 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/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,106 @@ +/* + 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.ContentSettingValues; +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*/ ContentSettingValues.ALLOW, + /*defaultDisabledValue*/ ContentSettingValues.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 @ContentSettingValues int value) { + switch (value) { + case ContentSettingValues.ALLOW: + return R.string.website_settings_category_popup_allowed; + case ContentSettingValues.BLOCK: + return R.string.website_settings_category_popup_blocked; + case ContentSettingValues.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 boolean showOnlyDescriptions() { + return true; + } + + @Override + public int getAddExceptionDialogMessage() { + return R.string.website_settings_category_popup_allowed; + } + + @Override + public @Nullable Boolean considerException(SiteSettingsCategory category, @ContentSettingValues int value) { + return ContentSettingValues.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,12 @@ + + + + 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,7 @@ + content_settings::WebsiteSettingsRegistry::GetInstance() + ->GetMutable(ContentSettingsType::POPUPS) + ->set_show_into_info_page() + .set_desktop_ui() + .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); 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 @@ -131,7 +131,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, --