blob: 63ef959a507e5327737018e7278a9e0dc170ab2a [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/history/content/browser/visited_link_navigation_throttle.h"
#include "components/history/core/browser/history_service.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/navigation_throttle.h"
#include "url/origin.h"
VisitedLinkNavigationThrottle::VisitedLinkNavigationThrottle(
content::NavigationHandle* navigation_handle,
history::HistoryService* history_service)
: content::NavigationThrottle(navigation_handle),
history_service_(history_service) {}
VisitedLinkNavigationThrottle::~VisitedLinkNavigationThrottle() = default;
content::NavigationThrottle::ThrottleCheckResult
VisitedLinkNavigationThrottle::WillProcessResponse() {
// If we cannot obtain the origin to be committed, we cannot determine the
// salt. The commit params are constructed with an std::nullopt value for salt
// by default. This should only occur in cases that do not actually commit a
// navigation (e.g. downloads), so sending a salt value is not necessary.
std::optional<url::Origin> origin_to_commit =
navigation_handle()->GetOriginToCommit();
if (!origin_to_commit.has_value()) {
return PROCEED;
}
// Obtain the origin's corresponding salt and assign it in `commit_params`. If
// this origin is not already in the VisitedLinkDatabase, we will add a new
// <origin, salt> pair to the map, and assign that new salt value to
// 'commit_params`. If the visited link hashtable is in the middle of being
// built on the DB thread at the time of our request, `salt` will be set to
// std::nullopt. In this case, VisitedLinkWriter will handle sending the
// correct salt value after hashtable initialization is complete.
const std::optional<uint64_t> salt =
history_service_->GetOrAddOriginSalt(origin_to_commit.value());
if (salt.has_value()) {
navigation_handle()->SetVisitedLinkSalt(salt.value());
}
return PROCEED;
}
const char* VisitedLinkNavigationThrottle::GetNameForLogging() {
return "VisitedLinkNavigationThrottle";
}
void VisitedLinkNavigationThrottle::HistoryServiceBeingDeleted(
history::HistoryService* history_service) {
// In the unexpected event of the HistoryService being deleted, this CHECK
// helps us avoid dereferencing the now null raw_pointer, and helps us
// identify potential lifetime issues.
CHECK(false)
<< "The HistoryService owned by VisitedLinkNavigationThrottle is "
"being deleted";
}