Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(28)

Side by Side Diff: Source/core/page/PerformanceResourceTiming.cpp

Issue 13912021: [Resource Timing] Expose redirect timing information (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * Copyright (C) 2012 Intel Inc. All rights reserved. 3 * Copyright (C) 2012 Intel Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 18 matching lines...) Expand all
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */ 30 */
31 31
32 #include "config.h" 32 #include "config.h"
33 #include "core/page/PerformanceResourceTiming.h" 33 #include "core/page/PerformanceResourceTiming.h"
34 34
35 #include <wtf/Vector.h> 35 #include <wtf/Vector.h>
36 #include "core/dom/Document.h" 36 #include "core/dom/Document.h"
37 #include "core/loader/DocumentLoadTiming.h" 37 #include "core/loader/DocumentLoadTiming.h"
38 #include "core/loader/DocumentLoader.h" 38 #include "core/loader/DocumentLoader.h"
39 #include "core/page/ResourceTimingInfo.h"
39 #include "core/platform/KURL.h" 40 #include "core/platform/KURL.h"
40 #include "core/platform/network/ResourceRequest.h" 41 #include "core/platform/network/ResourceRequest.h"
41 #include "core/platform/network/ResourceResponse.h" 42 #include "core/platform/network/ResourceResponse.h"
42 #include "weborigin/SecurityOrigin.h"
43 43
44 namespace WebCore { 44 namespace WebCore {
45 45
46 static double monotonicTimeToDocumentMilliseconds(Document* document, double sec onds) 46 static double monotonicTimeToDocumentMilliseconds(Document* document, double sec onds)
47 { 47 {
48 ASSERT(seconds >= 0.0); 48 ASSERT(seconds >= 0.0);
49 return document->loader()->timing()->monotonicTimeToZeroBasedDocumentTime(se conds) * 1000.0; 49 return document->loader()->timing()->monotonicTimeToZeroBasedDocumentTime(se conds) * 1000.0;
50 } 50 }
51 51
52 static bool passesTimingAllowCheck(const ResourceResponse& response, Document* r equestingDocument) 52 PerformanceResourceTiming::PerformanceResourceTiming(const ResourceTimingInfo& i nfo, Document* requestingDocument, double startTime, double lastRedirectEndTime, bool allowTimingFetch, bool allowTimingRedirect)
53 { 53 : PerformanceEntry(info.initialRequest().url().string(), "resource", monoton icTimeToDocumentMilliseconds(requestingDocument, startTime), monotonicTimeToDocu mentMilliseconds(requestingDocument, info.loadFinishTime()))
54 AtomicallyInitializedStatic(AtomicString&, timingAllowOrigin = *new AtomicSt ring("timing-allow-origin")); 54 , m_initiatorType(info.initiatorType())
55 55 , m_timing(info.finalResponse().resourceLoadTiming())
56 RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url( )); 56 , m_lastRedirectEndTime(lastRedirectEndTime)
57 if (resourceOrigin->isSameSchemeHostPort(requestingDocument->securityOrigin( ))) 57 , m_finishTime(info.loadFinishTime())
58 return true; 58 , m_didReuseConnection(info.finalResponse().connectionReused())
59 59 , m_allowTimingFetch(allowTimingFetch)
60 const String& timingAllowOriginString = response.httpHeaderField(timingAllow Origin); 60 , m_allowTimingRedirect(allowTimingRedirect)
61 if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOrigin String, "null"))
62 return false;
63
64 if (timingAllowOriginString == "*")
65 return true;
66
67 const String& securityOrigin = requestingDocument->securityOrigin()->toStrin g();
68 Vector<String> timingAllowOrigins;
69 timingAllowOriginString.split(" ", timingAllowOrigins);
70 for (size_t i = 0; i < timingAllowOrigins.size(); ++i)
71 if (timingAllowOrigins[i] == securityOrigin)
72 return true;
73
74 return false;
75 }
76
77 PerformanceResourceTiming::PerformanceResourceTiming(const AtomicString& initiat orType, const ResourceRequest& request, const ResourceResponse& response, double initiationTime, double finishTime, Document* requestingDocument)
78 : PerformanceEntry(request.url().string(), "resource", monotonicTimeToDocume ntMilliseconds(requestingDocument, initiationTime), monotonicTimeToDocumentMilli seconds(requestingDocument, finishTime))
79 , m_initiatorType(initiatorType)
80 , m_timing(response.resourceLoadTiming())
81 , m_finishTime(finishTime)
82 , m_didReuseConnection(response.connectionReused())
83 , m_shouldReportDetails(passesTimingAllowCheck(response, requestingDocument) )
84 , m_requestingDocument(requestingDocument) 61 , m_requestingDocument(requestingDocument)
85 { 62 {
63 ASSERT(m_timing);
86 ScriptWrappable::init(this); 64 ScriptWrappable::init(this);
87 } 65 }
88 66
89 PerformanceResourceTiming::~PerformanceResourceTiming() 67 PerformanceResourceTiming::~PerformanceResourceTiming()
90 { 68 {
91 } 69 }
92 70
93 AtomicString PerformanceResourceTiming::initiatorType() const 71 AtomicString PerformanceResourceTiming::initiatorType() const
94 { 72 {
95 return m_initiatorType; 73 return m_initiatorType;
96 } 74 }
97 75
98 double PerformanceResourceTiming::redirectStart() const 76 double PerformanceResourceTiming::redirectStart() const
99 { 77 {
100 // FIXME: Need to track and report redirects for resources. 78 if (!m_lastRedirectEndTime || !m_allowTimingRedirect)
James Simonsen 2013/06/04 01:13:04 m_allowRedirectDetails sounds better.
Pan 2013/06/04 02:48:34 yep, thanks!
101 if (!m_shouldReportDetails)
102 return 0.0; 79 return 0.0;
103 return 0; 80
81 return PerformanceEntry::startTime();
104 } 82 }
105 83
106 double PerformanceResourceTiming::redirectEnd() const 84 double PerformanceResourceTiming::redirectEnd() const
107 { 85 {
108 if (!m_shouldReportDetails) 86 if (!m_lastRedirectEndTime || !m_allowTimingRedirect)
109 return 0.0; 87 return 0.0;
110 return 0; 88
89 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_las tRedirectEndTime);
111 } 90 }
112 91
113 double PerformanceResourceTiming::fetchStart() const 92 double PerformanceResourceTiming::fetchStart() const
114 { 93 {
115 // FIXME: This should be different depending on redirects. 94 if (m_lastRedirectEndTime)
116 return (startTime()); 95 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m _timing->requestTime);
96
97 return PerformanceEntry::startTime();
117 } 98 }
118 99
119 double PerformanceResourceTiming::domainLookupStart() const 100 double PerformanceResourceTiming::domainLookupStart() const
120 { 101 {
121 if (!m_shouldReportDetails) 102 if (!m_allowTimingFetch)
James Simonsen 2013/06/04 01:13:04 m_allowTimingDetails sounds better.
Pan 2013/06/04 02:48:34 yep, thanks!
122 return 0.0; 103 return 0.0;
123 104
124 if (!m_timing || m_timing->dnsStart == 0.0) 105 if (!m_timing || m_timing->dnsStart == 0.0)
125 return fetchStart(); 106 return fetchStart();
126 107
127 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->dnsStart); 108 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->dnsStart);
128 } 109 }
129 110
130 double PerformanceResourceTiming::domainLookupEnd() const 111 double PerformanceResourceTiming::domainLookupEnd() const
131 { 112 {
132 if (!m_shouldReportDetails) 113 if (!m_allowTimingFetch)
133 return 0.0; 114 return 0.0;
134 115
135 if (!m_timing || m_timing->dnsEnd == 0.0) 116 if (!m_timing || m_timing->dnsEnd == 0.0)
136 return domainLookupStart(); 117 return domainLookupStart();
137 118
138 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->dnsEnd); 119 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->dnsEnd);
139 } 120 }
140 121
141 double PerformanceResourceTiming::connectStart() const 122 double PerformanceResourceTiming::connectStart() const
142 { 123 {
143 if (!m_shouldReportDetails) 124 if (!m_allowTimingFetch)
144 return 0.0; 125 return 0.0;
145 126
146 // connectStart will be zero when a network request is not made. 127 // connectStart will be zero when a network request is not made.
147 if (!m_timing || m_timing->connectStart == 0.0 || m_didReuseConnection) 128 if (!m_timing || m_timing->connectStart == 0.0 || m_didReuseConnection)
148 return domainLookupEnd(); 129 return domainLookupEnd();
149 130
150 // connectStart includes any DNS time, so we may need to trim that off. 131 // connectStart includes any DNS time, so we may need to trim that off.
151 double connectStart = m_timing->connectStart; 132 double connectStart = m_timing->connectStart;
152 if (m_timing->dnsEnd > 0.0) 133 if (m_timing->dnsEnd > 0.0)
153 connectStart = m_timing->dnsEnd; 134 connectStart = m_timing->dnsEnd;
154 135
155 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), conne ctStart); 136 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), conne ctStart);
156 } 137 }
157 138
158 double PerformanceResourceTiming::connectEnd() const 139 double PerformanceResourceTiming::connectEnd() const
159 { 140 {
160 if (!m_shouldReportDetails) 141 if (!m_allowTimingFetch)
161 return 0.0; 142 return 0.0;
162 143
163 // connectStart will be zero when a network request is not made. 144 // connectStart will be zero when a network request is not made.
164 if (!m_timing || m_timing->connectEnd == 0.0 || m_didReuseConnection) 145 if (!m_timing || m_timing->connectEnd == 0.0 || m_didReuseConnection)
165 return connectStart(); 146 return connectStart();
166 147
167 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->connectEnd); 148 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->connectEnd);
168 } 149 }
169 150
170 double PerformanceResourceTiming::secureConnectionStart() const 151 double PerformanceResourceTiming::secureConnectionStart() const
171 { 152 {
172 if (!m_shouldReportDetails) 153 if (!m_allowTimingFetch)
173 return 0.0; 154 return 0.0;
174 155
175 if (!m_timing || m_timing->sslStart == 0.0) // Secure connection not negotia ted. 156 if (!m_timing || m_timing->sslStart == 0.0) // Secure connection not negotia ted.
176 return 0.0; 157 return 0.0;
177 158
178 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->sslStart); 159 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->sslStart);
179 } 160 }
180 161
181 double PerformanceResourceTiming::requestStart() const 162 double PerformanceResourceTiming::requestStart() const
182 { 163 {
183 if (!m_shouldReportDetails) 164 if (!m_allowTimingFetch)
184 return 0.0; 165 return 0.0;
185 166
186 if (!m_timing) 167 if (!m_timing)
187 return connectEnd(); 168 return connectEnd();
188 169
189 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->sendStart); 170 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->sendStart);
190 } 171 }
191 172
192 double PerformanceResourceTiming::responseStart() const 173 double PerformanceResourceTiming::responseStart() const
193 { 174 {
194 if (!m_shouldReportDetails) 175 if (!m_allowTimingFetch)
195 return 0.0; 176 return 0.0;
196 177
197 if (!m_timing) 178 if (!m_timing)
198 return requestStart(); 179 return requestStart();
199 180
200 // FIXME: This number isn't exactly correct. See the notes in PerformanceTim ing::responseStart(). 181 // FIXME: This number isn't exactly correct. See the notes in PerformanceTim ing::responseStart().
201 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->receiveHeadersEnd); 182 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_tim ing->receiveHeadersEnd);
202 } 183 }
203 184
204 double PerformanceResourceTiming::responseEnd() const 185 double PerformanceResourceTiming::responseEnd() const
205 { 186 {
206 if (!m_finishTime) 187 if (!m_finishTime)
207 return responseStart(); 188 return responseStart();
208 189
209 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_fin ishTime); 190 return monotonicTimeToDocumentMilliseconds(m_requestingDocument.get(), m_fin ishTime);
210 } 191 }
211 192
212 } // namespace WebCore 193 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698