|
21 | 21 | #include "nsReadableUtils.h" |
22 | 22 | #include "nsString.h" |
23 | 23 | #include "nsTArray.h" |
| 24 | +#include "nsIHttpChannelInternal.h" |
24 | 25 | #include "mozilla/Telemetry.h" |
25 | 26 |
|
26 | 27 | using namespace mozilla; |
@@ -117,6 +118,7 @@ nsLoadGroup::nsLoadGroup(nsISupports* outer) |
117 | 118 | , mDefaultLoadIsTimed(false) |
118 | 119 | , mTimedRequests(0) |
119 | 120 | , mCachedRequests(0) |
| 121 | + , mTimedNonCachedRequestsUntilOnEndPageLoad(0) |
120 | 122 | { |
121 | 123 | NS_INIT_AGGREGATED(outer); |
122 | 124 |
|
@@ -155,6 +157,7 @@ nsLoadGroup::~nsLoadGroup() |
155 | 157 | NS_IMPL_AGGREGATED(nsLoadGroup) |
156 | 158 | NS_INTERFACE_MAP_BEGIN_AGGREGATED(nsLoadGroup) |
157 | 159 | NS_INTERFACE_MAP_ENTRY(nsILoadGroup) |
| 160 | + NS_INTERFACE_MAP_ENTRY(nsPILoadGroupInternal) |
158 | 161 | NS_INTERFACE_MAP_ENTRY(nsILoadGroupChild) |
159 | 162 | NS_INTERFACE_MAP_ENTRY(nsIRequest) |
160 | 163 | NS_INTERFACE_MAP_ENTRY(nsISupportsPriority) |
@@ -631,8 +634,12 @@ nsLoadGroup::RemoveRequest(nsIRequest *request, nsISupports* ctxt, |
631 | 634 | ++mTimedRequests; |
632 | 635 | TimeStamp timeStamp; |
633 | 636 | rv = timedChannel->GetCacheReadStart(&timeStamp); |
634 | | - if (NS_SUCCEEDED(rv) && !timeStamp.IsNull()) |
| 637 | + if (NS_SUCCEEDED(rv) && !timeStamp.IsNull()) { |
635 | 638 | ++mCachedRequests; |
| 639 | + } |
| 640 | + else { |
| 641 | + mTimedNonCachedRequestsUntilOnEndPageLoad++; |
| 642 | + } |
636 | 643 |
|
637 | 644 | rv = timedChannel->GetAsyncOpen(&timeStamp); |
638 | 645 | if (NS_SUCCEEDED(rv) && !timeStamp.IsNull()) { |
@@ -812,6 +819,52 @@ nsLoadGroup::GetRootLoadGroup(nsILoadGroup * *aRootLoadGroup) |
812 | 819 | return NS_OK; |
813 | 820 | } |
814 | 821 |
|
| 822 | +//////////////////////////////////////////////////////////////////////////////// |
| 823 | +// nsPILoadGroupInternal methods: |
| 824 | + |
| 825 | +NS_IMETHODIMP |
| 826 | +nsLoadGroup::OnEndPageLoad(nsIChannel *aDefaultChannel) |
| 827 | +{ |
| 828 | + // On page load of a page with at least 32 resources we want to record |
| 829 | + // telemetry on which rate pacing algorithm was used to load the page and |
| 830 | + // the page load time. |
| 831 | + uint32_t requests = mTimedNonCachedRequestsUntilOnEndPageLoad; |
| 832 | + mTimedNonCachedRequestsUntilOnEndPageLoad = 0; |
| 833 | + |
| 834 | + nsCOMPtr<nsITimedChannel> timedChannel = |
| 835 | + do_QueryInterface(aDefaultChannel); |
| 836 | + if (!timedChannel) |
| 837 | + return NS_OK; |
| 838 | + |
| 839 | + nsCOMPtr<nsIHttpChannelInternal> internalHttpChannel = |
| 840 | + do_QueryInterface(timedChannel); |
| 841 | + if (!internalHttpChannel) |
| 842 | + return NS_OK; |
| 843 | + |
| 844 | + TimeStamp cacheReadStart; |
| 845 | + TimeStamp asyncOpen; |
| 846 | + uint32_t telemetryID; |
| 847 | + nsresult rv = timedChannel->GetCacheReadStart(&cacheReadStart); |
| 848 | + if (NS_SUCCEEDED(rv)) |
| 849 | + rv = timedChannel->GetAsyncOpen(&asyncOpen); |
| 850 | + if (NS_SUCCEEDED(rv)) |
| 851 | + rv = internalHttpChannel->GetPacingTelemetryID(&telemetryID); |
| 852 | + if (NS_FAILED(rv)) |
| 853 | + return NS_OK; |
| 854 | + |
| 855 | + // Nothing to do if we don't have a start time or this was |
| 856 | + // from the cache or we don't know what profile was used |
| 857 | + if (asyncOpen.IsNull() || !cacheReadStart.IsNull() || !telemetryID) |
| 858 | + return NS_OK; |
| 859 | + |
| 860 | + if (requests < 32) |
| 861 | + return NS_OK; |
| 862 | + |
| 863 | + Telemetry::AccumulateTimeDelta(static_cast<Telemetry::ID>(telemetryID), |
| 864 | + asyncOpen); |
| 865 | + return NS_OK; |
| 866 | +} |
| 867 | + |
815 | 868 | //////////////////////////////////////////////////////////////////////////////// |
816 | 869 | // nsISupportsPriority methods: |
817 | 870 |
|
|
0 commit comments