blob: c98b603e53ef2d99affff29916e4b04b86084a2f [file] [log] [blame]
// Copyright 2019 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 CHROME_BROWSER_LOOKALIKES_LOOKALIKE_URL_INTERSTITIAL_PAGE_H_
#define CHROME_BROWSER_LOOKALIKES_LOOKALIKE_URL_INTERSTITIAL_PAGE_H_
#include <memory>
#include <string>
#include "base/macros.h"
#include "base/time/time.h"
#include "components/security_interstitials/content/security_interstitial_page.h"
#include "content/public/browser/interstitial_page_delegate.h"
#include "services/metrics/public/cpp/ukm_source_id.h"
class GURL;
// This class is responsible for showing/hiding the interstitial page that
// occurs when a new domain is visited and it looks suspiciously like another
// more popular domain.
class LookalikeUrlInterstitialPage
: public security_interstitials::SecurityInterstitialPage {
public:
// Interstitial type, used in tests.
static const content::InterstitialPageDelegate::TypeID kTypeForTesting;
// Used for UKM. There is only a single MatchType per navigation.
enum class MatchType {
kNone = 0,
kTopSite = 1,
kSiteEngagement = 2,
kEditDistance = 3,
kEditDistanceSiteEngagement = 4,
// Append new items to the end of the list above; do not modify or replace
// existing values. Comment out obsolete items.
kMaxValue = kEditDistanceSiteEngagement,
};
// Used for UKM. There is only a single UserAction per navigation.
enum class UserAction {
kInterstitialNotShown = 0,
kClickThrough = 1,
kAcceptSuggestion = 2,
kCloseOrBack = 3,
// Append new items to the end of the list above; do not modify or replace
// existing values. Comment out obsolete items.
kMaxValue = kCloseOrBack,
};
LookalikeUrlInterstitialPage(
content::WebContents* web_contents,
const GURL& request_url,
ukm::SourceId source_id,
MatchType match_type,
std::unique_ptr<
security_interstitials::SecurityInterstitialControllerClient>
controller);
~LookalikeUrlInterstitialPage() override;
// InterstitialPageDelegate method:
InterstitialPageDelegate::TypeID GetTypeForTesting() const override;
// Allow easier reporting of UKM when no interstitial is shown.
static void RecordUkmEvent(ukm::SourceId source_id,
MatchType match_type,
UserAction user_action);
protected:
// InterstitialPageDelegate implementation:
void CommandReceived(const std::string& command) override;
// SecurityInterstitialPage implementation:
bool ShouldCreateNewNavigation() const override;
void PopulateInterstitialStrings(
base::DictionaryValue* load_time_data) override;
void OnInterstitialClosing() override;
bool ShouldDisplayURL() const override;
int GetHTMLTemplateId() override;
private:
friend class LookalikeUrlNavigationThrottleBrowserTest;
// Values added to get our shared interstitial HTML to play nice.
void PopulateStringsForSharedHTML(base::DictionaryValue* load_time_data);
// Record UKM iff we haven't already reported for this page.
void ReportUkmIfNeeded(UserAction action);
ukm::SourceId source_id_;
MatchType match_type_;
DISALLOW_COPY_AND_ASSIGN(LookalikeUrlInterstitialPage);
};
#endif // CHROME_BROWSER_LOOKALIKES_LOOKALIKE_URL_INTERSTITIAL_PAGE_H_