123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- // Copyright 2021 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.
- #ifndef COMPONENTS_ACCURACY_TIPS_ACCURACY_SERVICE_H_
- #define COMPONENTS_ACCURACY_TIPS_ACCURACY_SERVICE_H_
- #include <map>
- #include <memory>
- #include "base/callback_forward.h"
- #include "base/memory/raw_ptr.h"
- #include "base/memory/weak_ptr.h"
- #include "base/observer_list.h"
- #include "base/scoped_observation.h"
- #include "base/time/clock.h"
- #include "base/time/default_clock.h"
- #include "base/time/time.h"
- #include "components/accuracy_tips/accuracy_tip_interaction.h"
- #include "components/accuracy_tips/accuracy_tip_status.h"
- #include "components/history/core/browser/history_service.h"
- #include "components/history/core/browser/history_service_observer.h"
- #include "components/keyed_service/core/keyed_service.h"
- #include "services/metrics/public/cpp/ukm_source_id.h"
- #include "url/gurl.h"
- namespace base {
- class TimeTicks;
- }
- namespace content {
- class WebContents;
- }
- namespace safe_browsing {
- class SafeBrowsingDatabaseManager;
- }
- namespace user_prefs {
- class PrefRegistrySyncable;
- }
- class PrefService;
- namespace accuracy_tips {
- class AccuracyTipSafeBrowsingClient;
- // Checks if URL is news-related for AccuracyTips.
- // Handles rate-limiting and feature checks.
- class AccuracyService : public KeyedService, history::HistoryServiceObserver {
- public:
- static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
- // The site_engagement_service is currently not available on iOS
- // (crbug.com/775390), so it is supplied through a delegate.
- class Delegate {
- public:
- // Returns true if the engagement of this site is too high to show an
- // accuracy tip.
- virtual bool IsEngagementHigh(const GURL& url) = 0;
- // Shows AccuracyTip UI using the specified information if it is not already
- // showing. |close_callback| will be called when the dialog is closed.
- // The argument indicates the action that the user took to close the dialog.
- virtual void ShowAccuracyTip(
- content::WebContents* web_contents,
- AccuracyTipStatus type,
- bool show_opt_out,
- base::OnceCallback<void(AccuracyTipInteraction)> close_callback) = 0;
- // Launches accuracy tips survey with the product specific data.
- virtual void ShowSurvey(
- const std::map<std::string, bool>& product_specific_bits_data,
- const std::map<std::string, std::string>&
- product_specific_string_data) = 0;
- // Returns whether the security level of |web_contents| is secure.
- virtual bool IsSecureConnection(content::WebContents* web_contents) = 0;
- virtual ~Delegate() = default;
- };
- class Observer {
- public:
- // Called when an accuracy tip was shown.
- virtual void OnAccuracyTipShown() = 0;
- // Called when an accuracy tip was closed.
- virtual void OnAccuracyTipClosed() = 0;
- virtual ~Observer() = default;
- };
- AccuracyService(
- std::unique_ptr<Delegate> delegate,
- PrefService* pref_service,
- scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> sb_database,
- history::HistoryService* history_service,
- scoped_refptr<base::SequencedTaskRunner> ui_task_runner,
- scoped_refptr<base::SequencedTaskRunner> io_task_runner);
- ~AccuracyService() override;
- AccuracyService(const AccuracyService&) = delete;
- AccuracyService& operator=(const AccuracyService&) = delete;
- // Callback for accuracy check result.
- using AccuracyCheckCallback = base::OnceCallback<void(AccuracyTipStatus)>;
- // Returns the accuracy status for |url|. Virtual for testing purposes.
- virtual void CheckAccuracyStatus(const GURL& url,
- AccuracyCheckCallback callback);
- // Shows an accuracy tip UI for web_contents after checking rate limits.
- // Virtual for testing purposes.
- virtual void MaybeShowAccuracyTip(content::WebContents* web_contents);
- // Shows a HaTS survey after checking features states and pre-conditions
- // configured by feature params in `CanShowSurvey`.
- void MaybeShowSurvey();
- // TODO(olesiamarukhno): Figure out how to remove content dependencies if we
- // want to use this service on iOS.
- // Returns is the security level of |web_contents| is secure.
- virtual bool IsSecureConnection(content::WebContents* web_contents);
- bool IsShowingAccuracyTip(content::WebContents* web_contents);
- // KeyedService:
- void Shutdown() override;
- // history::HistoryServiceObserver:
- void OnURLsDeleted(history::HistoryService* history_service,
- const history::DeletionInfo& deletion_info) override;
- // Adds/Removes an Observer.
- void AddObserver(Observer* observer);
- void RemoveObserver(Observer* observer);
- void SetClockForTesting(base::Clock* clock) { clock_ = clock; }
- private:
- void OnAccuracyStatusReceived(const GURL& url,
- AccuracyCheckCallback callback,
- AccuracyTipStatus status);
- void OnAccuracyTipClosed(base::TimeTicks time_opened,
- ukm::SourceId ukm_source_id,
- AccuracyTipInteraction interaction);
- // Returns if a HaTS survey for accuracy tips can be shown based on feature
- // state and feature params.
- bool CanShowSurvey();
- std::unique_ptr<Delegate> delegate_;
- raw_ptr<PrefService> pref_service_ = nullptr;
- scoped_refptr<AccuracyTipSafeBrowsingClient> sb_client_;
- scoped_refptr<base::SequencedTaskRunner> ui_task_runner_;
- GURL url_for_last_shown_tip_;
- // Feature params:
- const GURL sample_url_;
- const base::TimeDelta time_between_prompts_;
- const bool disable_ui_ = false;
- raw_ptr<base::Clock> clock_ = base::DefaultClock::GetInstance();
- raw_ptr<content::WebContents> web_contents_showing_accuracy_tip_ = nullptr;
- base::ObserverList<Observer>::Unchecked observers_;
- base::ScopedObservation<history::HistoryService,
- history::HistoryServiceObserver>
- history_service_observation_{this};
- base::WeakPtrFactory<AccuracyService> weak_factory_{this};
- };
- } // namespace accuracy_tips
- #endif // COMPONENTS_ACCURACY_TIPS_ACCURACY_SERVICE_H_
|