unsigned long long PerformanceTiming::redirectEnd() const { DocumentLoadTiming* timing = documentLoadTiming(); if (!timing) return 0; if (timing->hasCrossOriginRedirect()) return 0; return monotonicTimeToIntegerMilliseconds(timing->redirectEnd()); }
unsigned long long PerformanceTiming::unloadEventEnd() const { DocumentLoadTiming* timing = documentLoadTiming(); if (!timing) return 0; if (timing->hasCrossOriginRedirect() || !timing->hasSameOriginAsPreviousDocument()) return 0; return monotonicTimeToIntegerMilliseconds(timing->unloadEventEnd()); }
unsigned long long PerformanceTiming::redirectStart() const { DocumentLoadTiming* timing = documentLoadTiming(); if (!timing) return 0; if (timing->hasCrossOriginRedirect) return 0; return toIntegerMilliseconds(timing->redirectStart); }
unsigned long long PerformanceTiming::unloadEventStart() const { DocumentLoadTiming* timing = documentLoadTiming(); if (!timing) return 0; if (timing->hasCrossOriginRedirect || !timing->hasSameOriginAsPreviousDocument) return 0; return toIntegerMilliseconds(timing->unloadEventStart); }
unsigned long long PerformanceTiming::resourceLoadTimeRelativeToAbsolute(int relativeSeconds) const { ASSERT(relativeSeconds >= 0); ResourceLoadTiming* resourceTiming = resourceLoadTiming(); ASSERT(resourceTiming); DocumentLoadTiming* documentTiming = documentLoadTiming(); ASSERT(documentTiming); // The ResourceLoadTiming API's requestTime is the base time to which all // other marks are relative. So to get an absolute time, we must add it to // the relative marks. // // Since ResourceLoadTimings came from the network platform layer, we must // check them for skew because they may be from another thread/process. double baseTime = getPossiblySkewedTimeInKnownRange(resourceTiming->requestTime, documentTiming->fetchStart, documentTiming->responseEnd); return toIntegerMilliseconds(baseTime) + relativeSeconds; }