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

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

Issue 15265004: Fix ResourceLoadTiming resolution lose issue. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 7 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) 2010 Google Inc. All rights reserved. 2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 119
120 return monotonicTimeToIntegerMilliseconds(timing->fetchStart()); 120 return monotonicTimeToIntegerMilliseconds(timing->fetchStart());
121 } 121 }
122 122
123 unsigned long long PerformanceTiming::domainLookupStart() const 123 unsigned long long PerformanceTiming::domainLookupStart() const
124 { 124 {
125 ResourceLoadTiming* timing = resourceLoadTiming(); 125 ResourceLoadTiming* timing = resourceLoadTiming();
126 if (!timing) 126 if (!timing)
127 return fetchStart(); 127 return fetchStart();
128 128
129 // This will be -1 when a DNS request is not performed. 129 // This will be zero when a DNS request is not performed.
130 // Rather than exposing a special value that indicates no DNS, we "backfill" with fetchStart. 130 // Rather than exposing a special value that indicates no DNS, we "backfill" with fetchStart.
131 int dnsStart = timing->dnsStart; 131 double dnsStart = timing->dnsStart;
132 if (dnsStart < 0) 132 if (dnsStart == 0.0)
133 return fetchStart(); 133 return fetchStart();
134 134
135 return resourceLoadTimeRelativeToAbsolute(dnsStart); 135 return monotonicTimeToIntegerMilliseconds(dnsStart);
136 } 136 }
137 137
138 unsigned long long PerformanceTiming::domainLookupEnd() const 138 unsigned long long PerformanceTiming::domainLookupEnd() const
139 { 139 {
140 ResourceLoadTiming* timing = resourceLoadTiming(); 140 ResourceLoadTiming* timing = resourceLoadTiming();
141 if (!timing) 141 if (!timing)
142 return domainLookupStart(); 142 return domainLookupStart();
143 143
144 // This will be -1 when a DNS request is not performed. 144 // This will be zero when a DNS request is not performed.
145 // Rather than exposing a special value that indicates no DNS, we "backfill" with domainLookupStart. 145 // Rather than exposing a special value that indicates no DNS, we "backfill" with domainLookupStart.
146 int dnsEnd = timing->dnsEnd; 146 double dnsEnd = timing->dnsEnd;
147 if (dnsEnd < 0) 147 if (dnsEnd == 0.0)
148 return domainLookupStart(); 148 return domainLookupStart();
149 149
150 return resourceLoadTimeRelativeToAbsolute(dnsEnd); 150 return monotonicTimeToIntegerMilliseconds(dnsEnd);
151 } 151 }
152 152
153 unsigned long long PerformanceTiming::connectStart() const 153 unsigned long long PerformanceTiming::connectStart() const
154 { 154 {
155 DocumentLoader* loader = documentLoader(); 155 DocumentLoader* loader = documentLoader();
156 if (!loader) 156 if (!loader)
157 return domainLookupEnd(); 157 return domainLookupEnd();
158 158
159 ResourceLoadTiming* timing = loader->response().resourceLoadTiming(); 159 ResourceLoadTiming* timing = loader->response().resourceLoadTiming();
160 if (!timing) 160 if (!timing)
161 return domainLookupEnd(); 161 return domainLookupEnd();
162 162
163 // connectStart will be -1 when a network request is not made. 163 // connectStart will be -1 when a network request is not made.
164 // Rather than exposing a special value that indicates no new connection, we "backfill" with domainLookupEnd. 164 // Rather than exposing a special value that indicates no new connection, we "backfill" with domainLookupEnd.
165 int connectStart = timing->connectStart; 165 double connectStart = timing->connectStart;
166 if (connectStart < 0 || loader->response().connectionReused()) 166 if (connectStart == 0.0 || loader->response().connectionReused())
167 return domainLookupEnd(); 167 return domainLookupEnd();
168 168
169 // ResourceLoadTiming's connect phase includes DNS, however Navigation Timin g's 169 // ResourceLoadTiming's connect phase includes DNS, however Navigation Timin g's
170 // connect phase should not. So if there is DNS time, trim it from the start . 170 // connect phase should not. So if there is DNS time, trim it from the start .
171 if (timing->dnsEnd >= 0 && timing->dnsEnd > connectStart) 171 if (timing->dnsEnd > 0.0 && timing->dnsEnd > connectStart)
172 connectStart = timing->dnsEnd; 172 connectStart = timing->dnsEnd;
173 173
174 return resourceLoadTimeRelativeToAbsolute(connectStart); 174 return monotonicTimeToIntegerMilliseconds(connectStart);
175 } 175 }
176 176
177 unsigned long long PerformanceTiming::connectEnd() const 177 unsigned long long PerformanceTiming::connectEnd() const
178 { 178 {
179 DocumentLoader* loader = documentLoader(); 179 DocumentLoader* loader = documentLoader();
180 if (!loader) 180 if (!loader)
181 return connectStart(); 181 return connectStart();
182 182
183 ResourceLoadTiming* timing = loader->response().resourceLoadTiming(); 183 ResourceLoadTiming* timing = loader->response().resourceLoadTiming();
184 if (!timing) 184 if (!timing)
185 return connectStart(); 185 return connectStart();
186 186
187 // connectEnd will be -1 when a network request is not made. 187 // connectEnd will be zero when a network request is not made.
188 // Rather than exposing a special value that indicates no new connection, we "backfill" with connectStart. 188 // Rather than exposing a special value that indicates no new connection, we "backfill" with connectStart.
189 int connectEnd = timing->connectEnd; 189 double connectEnd = timing->connectEnd;
190 if (connectEnd < 0 || loader->response().connectionReused()) 190 if (connectEnd == 0.0 || loader->response().connectionReused())
191 return connectStart(); 191 return connectStart();
192 192
193 return resourceLoadTimeRelativeToAbsolute(connectEnd); 193 return monotonicTimeToIntegerMilliseconds(connectEnd);
194 } 194 }
195 195
196 unsigned long long PerformanceTiming::secureConnectionStart() const 196 unsigned long long PerformanceTiming::secureConnectionStart() const
197 { 197 {
198 DocumentLoader* loader = documentLoader(); 198 DocumentLoader* loader = documentLoader();
199 if (!loader) 199 if (!loader)
200 return 0; 200 return 0;
201 201
202 ResourceLoadTiming* timing = loader->response().resourceLoadTiming(); 202 ResourceLoadTiming* timing = loader->response().resourceLoadTiming();
203 if (!timing) 203 if (!timing)
204 return 0; 204 return 0;
205 205
206 int sslStart = timing->sslStart; 206 double sslStart = timing->sslStart;
207 if (sslStart < 0) 207 if (sslStart == 0.0)
208 return 0; 208 return 0;
209 209
210 return resourceLoadTimeRelativeToAbsolute(sslStart); 210 return monotonicTimeToIntegerMilliseconds(sslStart);
211 } 211 }
212 212
213 unsigned long long PerformanceTiming::requestStart() const 213 unsigned long long PerformanceTiming::requestStart() const
214 { 214 {
215 ResourceLoadTiming* timing = resourceLoadTiming(); 215 ResourceLoadTiming* timing = resourceLoadTiming();
216 if (!timing || timing->sendStart < 0) 216 if (!timing || timing->sendStart == 0.0)
217 return connectEnd(); 217 return connectEnd();
218 218
219 return resourceLoadTimeRelativeToAbsolute(timing->sendStart); 219 return monotonicTimeToIntegerMilliseconds(timing->sendStart);
220 } 220 }
221 221
222 unsigned long long PerformanceTiming::responseStart() const 222 unsigned long long PerformanceTiming::responseStart() const
223 { 223 {
224 ResourceLoadTiming* timing = resourceLoadTiming(); 224 ResourceLoadTiming* timing = resourceLoadTiming();
225 if (!timing || timing->receiveHeadersEnd < 0) 225 if (!timing || timing->receiveHeadersEnd == 0.0)
226 return requestStart(); 226 return requestStart();
227 227
228 // FIXME: Response start needs to be the time of the first received byte. 228 // FIXME: Response start needs to be the time of the first received byte.
229 // However, the ResourceLoadTiming API currently only supports the time 229 // However, the ResourceLoadTiming API currently only supports the time
230 // the last header byte was received. For many responses with reasonable 230 // the last header byte was received. For many responses with reasonable
231 // sized cookies, the HTTP headers fit into a single packet so this time 231 // sized cookies, the HTTP headers fit into a single packet so this time
232 // is basically equivalent. But for some responses, particularly those with 232 // is basically equivalent. But for some responses, particularly those with
233 // headers larger than a single packet, this time will be too late. 233 // headers larger than a single packet, this time will be too late.
234 return resourceLoadTimeRelativeToAbsolute(timing->receiveHeadersEnd); 234 return monotonicTimeToIntegerMilliseconds(timing->receiveHeadersEnd);
235 } 235 }
236 236
237 unsigned long long PerformanceTiming::responseEnd() const 237 unsigned long long PerformanceTiming::responseEnd() const
238 { 238 {
239 DocumentLoadTiming* timing = documentLoadTiming(); 239 DocumentLoadTiming* timing = documentLoadTiming();
240 if (!timing) 240 if (!timing)
241 return 0; 241 return 0;
242 242
243 return monotonicTimeToIntegerMilliseconds(timing->responseEnd()); 243 return monotonicTimeToIntegerMilliseconds(timing->responseEnd());
244 } 244 }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 337
338 ResourceLoadTiming* PerformanceTiming::resourceLoadTiming() const 338 ResourceLoadTiming* PerformanceTiming::resourceLoadTiming() const
339 { 339 {
340 DocumentLoader* loader = documentLoader(); 340 DocumentLoader* loader = documentLoader();
341 if (!loader) 341 if (!loader)
342 return 0; 342 return 0;
343 343
344 return loader->response().resourceLoadTiming(); 344 return loader->response().resourceLoadTiming();
345 } 345 }
346 346
347 unsigned long long PerformanceTiming::resourceLoadTimeRelativeToAbsolute(int rel ativeMilliseconds) const
348 {
349 ASSERT(relativeMilliseconds >= 0);
350 ResourceLoadTiming* resourceTiming = resourceLoadTiming();
351 ASSERT(resourceTiming);
352 return monotonicTimeToIntegerMilliseconds(resourceTiming->convertResourceLoa dTimeToMonotonicTime(relativeMilliseconds));
353 }
354
355 unsigned long long PerformanceTiming::monotonicTimeToIntegerMilliseconds(double monotonicSeconds) const 347 unsigned long long PerformanceTiming::monotonicTimeToIntegerMilliseconds(double monotonicSeconds) const
356 { 348 {
357 ASSERT(monotonicSeconds >= 0); 349 ASSERT(monotonicSeconds >= 0);
358 const DocumentLoadTiming* timing = documentLoadTiming(); 350 const DocumentLoadTiming* timing = documentLoadTiming();
359 ASSERT(timing); 351 ASSERT(timing);
360 return toIntegerMilliseconds(timing->monotonicTimeToPseudoWallTime(monotonic Seconds)); 352 return toIntegerMilliseconds(timing->monotonicTimeToPseudoWallTime(monotonic Seconds));
361 } 353 }
362 354
363 } // namespace WebCore 355 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698