// Copyright 2011 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/net/referrer.h" #include <limits.h> #include <stddef.h> #include <memory> #include <optional> #include <utility> #include "base/check_op.h" #include "base/compiler_specific.h" #include "base/values.h" namespace chrome_browser_net { //------------------------------------------------------------------------------ // Smoothing parameter for updating subresource_use_rate_. // We always combine our old expected value, weighted by some factor W (we use // kWeightingForOldConnectsExpectedValue), with the new expected value Enew. // The new "expected value" is the number of actual connections made due to the // current navigations. // That means that IF we end up needing to connect, we should apply the formula: // Eupdated = Eold * W + Enew * (1 - W) // If we visit the containing url, but don't end up needing a connection, then // Enew == 0, so we use the formula: // Eupdated = Eold * W // To achieve the above updating algorithm, we end up doing the multiplication // by W every time we contemplate doing a preconnection (i.e., when we navigate // to the containing URL, and consider doing a preconnection), and then IFF we // learn that we really needed a connection to the subresource, we complete the // above algorithm by adding the (1 - W) for each connection we make. // We weight the new expected value by a factor which is in the range of 0.0 to // 1.0. static const double kWeightingForOldConnectsExpectedValue = …; // To estimate the expected value of the number of connections that we'll need // when a referrer is navigated to, we start with the following low initial // value. // Each time we do indeed (again) need the subresource, this value will get // increased. // Each time we navigate to the refererrer but never end up needing this // subresource, the value will decrease. // Very conservative is 0.0, which will mean that we have to wait for a while // before doing much speculative acvtivity. We do persist results, so we'll // save the asymptotic (correct?) learned answer in the long run. // Some browsers blindly make 2 connections all the time, so we'll use that as // a starting point. static const double kInitialConnectsExpectedValue = …; Referrer::Referrer() : … { … } void Referrer::SuggestHost(const GURL& url) { … } void Referrer::DeleteLeastUseful() { … } void Referrer::Deserialize(const base::Value& value) { … } std::unique_ptr<base::Value::List> Referrer::Serialize() const { … } //------------------------------------------------------------------------------ ReferrerValue::ReferrerValue() : … { … } void ReferrerValue::SubresourceIsNeeded() { … } void ReferrerValue::ReferrerWasObserved() { … } } // namespace chrome_browser_net