#include "chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.h"
#include "base/metrics/histogram_functions.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/sync/sync_service_factory.h"
#include "chrome/browser/ui/browser_finder.h"
#include "components/prefs/pref_service.h"
#include "components/safe_browsing/core/browser/tailored_security_service/tailored_security_notification_result.h"
#include "components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_util.h"
#include "components/safe_browsing/core/common/features.h"
#include "components/safe_browsing/core/common/safe_browsing_policy_handler.h"
#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h"
#if BUILDFLAG(IS_ANDROID)
#include "chrome/browser/ui/android/tab_model/tab_model.h"
#include "chrome/browser/ui/android/tab_model/tab_model_list.h"
#include "chrome/browser/ui/android/tab_model/tab_model_observer.h"
#include "components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h"
#else
#include "chrome/browser/safe_browsing/tailored_security/notification_handler_desktop.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog_manager.h"
#endif
namespace safe_browsing {
#if BUILDFLAG(IS_ANDROID)
const bool kRetryMechanismTriggered = true;
const bool kRetryMechanismNotTriggered = false;
#endif
namespace {
#if BUILDFLAG(IS_ANDROID)
content::WebContents* GetWebContentsForProfile(Profile* profile) {
for (const TabModel* tab_model : TabModelList::models()) {
if (tab_model->GetProfile() != profile) {
continue;
}
int tab_count = tab_model->GetTabCount();
for (int i = 0; i < tab_count; i++) {
content::WebContents* web_contents = tab_model->GetWebContentsAt(i);
if (web_contents) {
return web_contents;
}
}
}
return nullptr;
}
#endif
}
ChromeTailoredSecurityService::ChromeTailoredSecurityService(Profile* profile)
: … { … }
ChromeTailoredSecurityService::~ChromeTailoredSecurityService() { … }
void ChromeTailoredSecurityService::OnSyncNotificationMessageRequest(
bool is_enabled) { … }
#if BUILDFLAG(IS_ANDROID)
void ChromeTailoredSecurityService::DidAddTab(TabAndroid* tab,
TabModel::TabLaunchType type) {
RemoveTabModelObserver();
RemoveTabModelListObserver();
TailoredSecurityTimestampUpdateCallback();
}
void ChromeTailoredSecurityService::OnTabModelAdded() {
if (observed_tab_model_) {
return;
}
AddTabModelObserver();
}
void ChromeTailoredSecurityService::OnTabModelRemoved() {
if (!observed_tab_model_) {
return;
}
for (const TabModel* remaining_model : TabModelList::models()) {
if (observed_tab_model_ == remaining_model) {
return;
}
}
RemoveTabModelObserver();
}
void ChromeTailoredSecurityService::RegisterObserver() {
AddTabModelObserver();
AddTabModelListObserver();
}
void ChromeTailoredSecurityService::AddTabModelListObserver() {
if (observing_tab_model_list_) {
return;
}
TabModelList::AddObserver(this);
observing_tab_model_list_ = true;
}
void ChromeTailoredSecurityService::AddTabModelObserver() {
if (observed_tab_model_) {
return;
}
for (TabModel* tab_model : TabModelList::models()) {
if (tab_model->GetProfile() != profile_) {
continue;
}
tab_model->AddObserver(this);
observed_tab_model_ = tab_model;
return;
}
}
void ChromeTailoredSecurityService::RemoveTabModelListObserver() {
observing_tab_model_list_ = false;
TabModelList::RemoveObserver(this);
}
void ChromeTailoredSecurityService::RemoveTabModelObserver() {
if (!observed_tab_model_) {
return;
}
observed_tab_model_->RemoveObserver(this);
observed_tab_model_ = nullptr;
}
void ChromeTailoredSecurityService::MessageDismissed() {
message_.reset();
}
#endif
#if !BUILDFLAG(IS_ANDROID)
void ChromeTailoredSecurityService::DisplayDesktopDialog(
Browser* browser,
bool show_enable_modal) { … }
#endif
scoped_refptr<network::SharedURLLoaderFactory>
ChromeTailoredSecurityService::GetURLLoaderFactory() { … }
void ChromeTailoredSecurityService::SaveRetryState(
TailoredSecurityRetryState state) { … }
void ChromeTailoredSecurityService::MaybeRetryForSyncUsers() { … }
bool ChromeTailoredSecurityService::ShouldRetryForSyncUsers() { … }
void LogShouldRetryOutcome(
ChromeTailoredSecurityService::TailoredSecurityShouldRetryOutcome outcome) { … }
}