| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_ADS_BLOCKED_MESSAGE_DELEGATE_H_ |
| #define COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_ADS_BLOCKED_MESSAGE_DELEGATE_H_ |
| |
| #include <memory> |
| |
| #include "base/functional/callback.h" |
| #include "components/messages/android/message_enums.h" |
| #include "components/messages/android/message_wrapper.h" |
| #include "components/subresource_filter/android/ads_blocked_dialog.h" |
| #include "content/public/browser/visibility.h" |
| #include "content/public/browser/web_contents_observer.h" |
| #include "content/public/browser/web_contents_user_data.h" |
| |
| namespace content { |
| class WebContents; |
| } // namespace content |
| |
| namespace subresource_filter { |
| |
| // An ads blocked delegate responsible for showing message bubbles. |
| // Created when the user proceeds through Safe Browsing warning |
| // interstitials to a site with deceptive embedded content, and matches the |
| // lifetime of WebContents afterwards. |
| // |
| // The message also appears when the site is known to show intrusive ads. |
| class AdsBlockedMessageDelegate |
| : public content::WebContentsUserData<AdsBlockedMessageDelegate>, |
| public content::WebContentsObserver { |
| public: |
| using AdsBlockedDialogFactory = |
| base::RepeatingCallback<std::unique_ptr<AdsBlockedDialogBase>( |
| content::WebContents*, |
| base::OnceClosure, |
| base::OnceClosure, |
| base::OnceClosure)>; |
| |
| ~AdsBlockedMessageDelegate() override; |
| |
| // content::WebContentsObserver implementation. |
| void OnWebContentsFocused( |
| content::RenderWidgetHost* render_widget_host) override; |
| |
| void ShowMessage(); |
| void DismissMessage(messages::DismissReason dismiss_reason); |
| |
| void DismissMessageForTesting(messages::DismissReason dismiss_reason); |
| |
| messages::MessageWrapper* message_for_testing() { return message_.get(); } |
| bool reprompt_required_flag_for_testing() { return reprompt_required_; } |
| |
| private: |
| friend class content::WebContentsUserData<AdsBlockedMessageDelegate>; |
| |
| AdsBlockedMessageDelegate(content::WebContents* web_contents); |
| AdsBlockedMessageDelegate(content::WebContents* web_contents, |
| AdsBlockedDialogFactory ads_blocked_dialog_factory); |
| |
| // Invoked when the user clicks on "OK" as an acknowledgement of the |
| // ads blocked message. This action simply dismisses the message. |
| void HandleMessageOkClicked(); |
| |
| // Invoked when the user clicks on the secondary button (settings icon) |
| // to get more details and manage site ads settings. This action |
| // dismisses the message and opens the ads blocked dialog. |
| void HandleMessageManageClicked(); |
| |
| // Invoked when the message is dismissed, whether by the user, explicitly |
| // in the code or automatically. |
| void HandleMessageDismissed(messages::DismissReason dismiss_reason); |
| |
| // Invoked when the user clicks on the ads blocked dialog button to |
| // update site ads settings. |
| void HandleDialogAllowAdsClicked(); |
| |
| // Invoked when the user clicks on the ads blocked dialog button to |
| // learn more about blocked ads on sites. |
| void HandleDialogLearnMoreClicked(); |
| |
| // Invoked when the dialog is dismissed, whether by user action, |
| // explicitly in the code or automatically. |
| void HandleDialogDismissed(); |
| |
| void ShowDialog(bool should_post_dialog); |
| |
| std::unique_ptr<messages::MessageWrapper> message_; |
| |
| AdsBlockedDialogFactory ads_blocked_dialog_factory_; |
| std::unique_ptr<AdsBlockedDialogBase> ads_blocked_dialog_; |
| |
| // Whether we should re-show the dialog to users when users return to the tab. |
| bool reprompt_required_ = false; |
| |
| WEB_CONTENTS_USER_DATA_KEY_DECL(); |
| }; |
| |
| } // namespace subresource_filter |
| |
| #endif // COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_ADS_BLOCKED_MESSAGE_DELEGATE_H_ |