chromium/chrome/browser/offline_pages/offline_page_navigation_throttle.cc

// 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.

#include "chrome/browser/offline_pages/offline_page_navigation_throttle.h"

#include "base/metrics/histogram_functions.h"
#include "components/offline_pages/core/request_header/offline_page_header.h"
#include "content/public/browser/navigation_handle.h"
#include "net/http/http_request_headers.h"

namespace offline_pages {

const char kOfflinePagesDidNavigationThrottleCancelNavigation[] =
    "OfflinePages.DidNavigationThrottleCancelNavigation";

namespace {
void RecordWhetherNavigationWasCanceled(bool was_navigation_canceled) {
  base::UmaHistogramBoolean(kOfflinePagesDidNavigationThrottleCancelNavigation,
                            was_navigation_canceled);
}
}  // namespace

OfflinePageNavigationThrottle::OfflinePageNavigationThrottle(
    content::NavigationHandle* navigation_handle)
    : content::NavigationThrottle(navigation_handle) {}

OfflinePageNavigationThrottle::~OfflinePageNavigationThrottle() = default;

content::NavigationThrottle::ThrottleCheckResult
OfflinePageNavigationThrottle::WillStartRequest() {
  return CANCEL_AND_IGNORE;
}

const char* OfflinePageNavigationThrottle::GetNameForLogging() {
  return "OfflinePageNavigationThrottle";
}

// static
std::unique_ptr<content::NavigationThrottle>
OfflinePageNavigationThrottle::MaybeCreateThrottleFor(
    content::NavigationHandle* navigation_handle) {
  // Checks if the request was initiated by the renderer and if it contains the
  // "X-Chrome-offline" header. There is no legitimate reason for a renderer to
  // make a request with this header, so we can cancel these types of requests.
  if (navigation_handle->IsRendererInitiated() &&
      navigation_handle->GetRequestHeaders().HasHeader(kOfflinePageHeader)) {
    RecordWhetherNavigationWasCanceled(true);
    return std::make_unique<OfflinePageNavigationThrottle>(navigation_handle);
  }
  RecordWhetherNavigationWasCanceled(false);
  return nullptr;
}

}  // namespace offline_pages