| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // This class helps to remember what domains may be needed to be resolved when a | 5 // This class helps to remember what domains may be needed to be resolved when a |
| 6 // navigation takes place to a given URL. This information is gathered when a | 6 // navigation takes place to a given URL. This information is gathered when a |
| 7 // navigation to a subresource identifies a referring URL. | 7 // navigation to a subresource identifies a referring URL. |
| 8 // When future navigations take place to known referrer sites, then we | 8 // When future navigations take place to known referrer sites, then we |
| 9 // speculatively either pre-warm a TCP/IP conneciton, or at a minimum, resolve | 9 // speculatively either pre-warm a TCP/IP conneciton, or at a minimum, resolve |
| 10 // the host name via DNS. | 10 // the host name via DNS. |
| 11 | 11 |
| 12 // All access to this class is performed via the Predictor class, which only | 12 // All access to this class is performed via the Predictor class, which only |
| 13 // operates on the IO thread. | 13 // operates on the IO thread. |
| 14 | 14 |
| 15 #ifndef CHROME_BROWSER_NET_REFERRER_H_ | 15 #ifndef CHROME_BROWSER_NET_REFERRER_H_ |
| 16 #define CHROME_BROWSER_NET_REFERRER_H_ | 16 #define CHROME_BROWSER_NET_REFERRER_H_ |
| 17 | 17 |
| 18 #include <map> | 18 #include <map> |
| 19 | 19 |
| 20 #include "base/basictypes.h" | 20 #include <stdint.h> |
| 21 |
| 22 #include "base/macros.h" |
| 21 #include "base/time/time.h" | 23 #include "base/time/time.h" |
| 22 #include "net/base/host_port_pair.h" | 24 #include "net/base/host_port_pair.h" |
| 23 #include "url/gurl.h" | 25 #include "url/gurl.h" |
| 24 | 26 |
| 25 namespace base { | 27 namespace base { |
| 26 class Value; | 28 class Value; |
| 27 } | 29 } |
| 28 | 30 |
| 29 namespace chrome_browser_net { | 31 namespace chrome_browser_net { |
| 30 | 32 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 44 // Record the fact that we navigated to the associated subresource URL. This | 46 // Record the fact that we navigated to the associated subresource URL. This |
| 45 // will increase the value of the expected subresource_use_rate_ | 47 // will increase the value of the expected subresource_use_rate_ |
| 46 void SubresourceIsNeeded(); | 48 void SubresourceIsNeeded(); |
| 47 | 49 |
| 48 // Record the fact that the referrer of this subresource was observed. This | 50 // Record the fact that the referrer of this subresource was observed. This |
| 49 // will diminish the expected subresource_use_rate_ (and will only be | 51 // will diminish the expected subresource_use_rate_ (and will only be |
| 50 // counteracted later if we really needed this subresource as a consequence | 52 // counteracted later if we really needed this subresource as a consequence |
| 51 // of our associated referrer.) | 53 // of our associated referrer.) |
| 52 void ReferrerWasObserved(); | 54 void ReferrerWasObserved(); |
| 53 | 55 |
| 54 int64 navigation_count() const { return navigation_count_; } | 56 int64_t navigation_count() const { return navigation_count_; } |
| 55 double subresource_use_rate() const { return subresource_use_rate_; } | 57 double subresource_use_rate() const { return subresource_use_rate_; } |
| 56 | 58 |
| 57 int64 preconnection_count() const { return preconnection_count_; } | 59 int64_t preconnection_count() const { return preconnection_count_; } |
| 58 void IncrementPreconnectionCount() { ++preconnection_count_; } | 60 void IncrementPreconnectionCount() { ++preconnection_count_; } |
| 59 | 61 |
| 60 int64 preresolution_count() const { return preresolution_count_; } | 62 int64_t preresolution_count() const { return preresolution_count_; } |
| 61 void preresolution_increment() { ++preresolution_count_; } | 63 void preresolution_increment() { ++preresolution_count_; } |
| 62 | 64 |
| 63 // Reduce the subresource_use_rate_ by the supplied factor, and return true | 65 // Reduce the subresource_use_rate_ by the supplied factor, and return true |
| 64 // if the result is still greater than the given threshold. | 66 // if the result is still greater than the given threshold. |
| 65 bool Trim(double reduce_rate, double threshold); | 67 bool Trim(double reduce_rate, double threshold); |
| 66 | 68 |
| 67 private: | 69 private: |
| 68 const base::Time birth_time_; | 70 const base::Time birth_time_; |
| 69 | 71 |
| 70 // The number of times this item was navigated to with the fixed referrer. | 72 // The number of times this item was navigated to with the fixed referrer. |
| 71 int64 navigation_count_; | 73 int64_t navigation_count_; |
| 72 | 74 |
| 73 // The number of times this item was preconnected as a consequence of its | 75 // The number of times this item was preconnected as a consequence of its |
| 74 // referrer. | 76 // referrer. |
| 75 int64 preconnection_count_; | 77 int64_t preconnection_count_; |
| 76 | 78 |
| 77 // The number of times this item was pre-resolved (via DNS) as a consequence | 79 // The number of times this item was pre-resolved (via DNS) as a consequence |
| 78 // of its referrer. | 80 // of its referrer. |
| 79 int64 preresolution_count_; | 81 int64_t preresolution_count_; |
| 80 | 82 |
| 81 // A smoothed estimate of the expected number of connections that will be made | 83 // A smoothed estimate of the expected number of connections that will be made |
| 82 // to this subresource. | 84 // to this subresource. |
| 83 double subresource_use_rate_; | 85 double subresource_use_rate_; |
| 84 }; | 86 }; |
| 85 | 87 |
| 86 //------------------------------------------------------------------------------ | 88 //------------------------------------------------------------------------------ |
| 87 // A list of domain names to pre-resolve. The names are the keys to this map, | 89 // A list of domain names to pre-resolve. The names are the keys to this map, |
| 88 // and the values indicate the amount of benefit derived from having each name | 90 // and the values indicate the amount of benefit derived from having each name |
| 89 // around. | 91 // around. |
| 90 typedef std::map<GURL, ReferrerValue> SubresourceMap; | 92 typedef std::map<GURL, ReferrerValue> SubresourceMap; |
| 91 | 93 |
| 92 //------------------------------------------------------------------------------ | 94 //------------------------------------------------------------------------------ |
| 93 // There is one Referrer instance for each hostname that has acted as an HTTP | 95 // There is one Referrer instance for each hostname that has acted as an HTTP |
| 94 // referer (note mispelling is intentional) for a hostname that was otherwise | 96 // referer (note mispelling is intentional) for a hostname that was otherwise |
| 95 // unexpectedly navgated towards ("unexpected" in the sense that the hostname | 97 // unexpectedly navgated towards ("unexpected" in the sense that the hostname |
| 96 // was probably needed as a subresource of a page, and was not otherwise | 98 // was probably needed as a subresource of a page, and was not otherwise |
| 97 // predictable until the content with the reference arrived). Most typically, | 99 // predictable until the content with the reference arrived). Most typically, |
| 98 // an outer page was a page fetched by the user, and this instance lists names | 100 // an outer page was a page fetched by the user, and this instance lists names |
| 99 // in SubresourceMap which are subresources and that were needed to complete the | 101 // in SubresourceMap which are subresources and that were needed to complete the |
| 100 // rendering of the outer page. | 102 // rendering of the outer page. |
| 101 class Referrer : public SubresourceMap { | 103 class Referrer : public SubresourceMap { |
| 102 public: | 104 public: |
| 103 Referrer(); | 105 Referrer(); |
| 104 void IncrementUseCount() { ++use_count_; } | 106 void IncrementUseCount() { ++use_count_; } |
| 105 int64 use_count() const { return use_count_; } | 107 int64_t use_count() const { return use_count_; } |
| 106 | 108 |
| 107 // Add the indicated url to the list that are resolved via DNS when the user | 109 // Add the indicated url to the list that are resolved via DNS when the user |
| 108 // navigates to this referrer. Note that if the list is long, an entry may be | 110 // navigates to this referrer. Note that if the list is long, an entry may be |
| 109 // discarded to make room for this insertion. | 111 // discarded to make room for this insertion. |
| 110 void SuggestHost(const GURL& url); | 112 void SuggestHost(const GURL& url); |
| 111 | 113 |
| 112 // Trim the Referrer, by first diminishing (scaling down) the subresource | 114 // Trim the Referrer, by first diminishing (scaling down) the subresource |
| 113 // use expectation for each ReferredValue. | 115 // use expectation for each ReferredValue. |
| 114 // Returns true if expected use rate is greater than the threshold. | 116 // Returns true if expected use rate is greater than the threshold. |
| 115 bool Trim(double reduce_rate, double threshold); | 117 bool Trim(double reduce_rate, double threshold); |
| 116 | 118 |
| 117 // Provide methods for persisting, and restoring contents into a Value class. | 119 // Provide methods for persisting, and restoring contents into a Value class. |
| 118 base::Value* Serialize() const; | 120 base::Value* Serialize() const; |
| 119 void Deserialize(const base::Value& referrers); | 121 void Deserialize(const base::Value& referrers); |
| 120 | 122 |
| 121 private: | 123 private: |
| 122 // Helper function for pruning list. Metric for usefulness is "large accrued | 124 // Helper function for pruning list. Metric for usefulness is "large accrued |
| 123 // value," in the form of latency_ savings associated with a host name. We | 125 // value," in the form of latency_ savings associated with a host name. We |
| 124 // also give credit for a name being newly added, by scalling latency per | 126 // also give credit for a name being newly added, by scalling latency per |
| 125 // lifetime (time since birth). For instance, when two names have accrued | 127 // lifetime (time since birth). For instance, when two names have accrued |
| 126 // the same latency_ savings, the older one is less valuable as it didn't | 128 // the same latency_ savings, the older one is less valuable as it didn't |
| 127 // accrue savings as quickly. | 129 // accrue savings as quickly. |
| 128 void DeleteLeastUseful(); | 130 void DeleteLeastUseful(); |
| 129 | 131 |
| 130 // The number of times this referer had its subresources scanned for possible | 132 // The number of times this referer had its subresources scanned for possible |
| 131 // preconnection or DNS preresolution. | 133 // preconnection or DNS preresolution. |
| 132 int64 use_count_; | 134 int64_t use_count_; |
| 133 | 135 |
| 134 // We put these into a std::map<>, so we need copy constructors. | 136 // We put these into a std::map<>, so we need copy constructors. |
| 135 // DISALLOW_COPY_AND_ASSIGN(Referrer); | 137 // DISALLOW_COPY_AND_ASSIGN(Referrer); |
| 136 // TODO(jar): Consider optimization to use pointers to these instances, and | 138 // TODO(jar): Consider optimization to use pointers to these instances, and |
| 137 // avoid deep copies during re-alloc of the containing map. | 139 // avoid deep copies during re-alloc of the containing map. |
| 138 }; | 140 }; |
| 139 | 141 |
| 140 } // namespace chrome_browser_net | 142 } // namespace chrome_browser_net |
| 141 | 143 |
| 142 #endif // CHROME_BROWSER_NET_REFERRER_H_ | 144 #endif // CHROME_BROWSER_NET_REFERRER_H_ |
| OLD | NEW |