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

Unified Diff: Source/core/page/Performance.cpp

Issue 13912021: [Resource Timing] Expose redirect timing information (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: 2nd Created 7 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: Source/core/page/Performance.cpp
diff --git a/Source/core/page/Performance.cpp b/Source/core/page/Performance.cpp
index 4ca0392514287bc9b252ef01db408026726ddc56..b2ca540e7c8bfd4021ef729933c270df4ed48d87 100644
--- a/Source/core/page/Performance.cpp
+++ b/Source/core/page/Performance.cpp
@@ -41,6 +41,7 @@
#include "PerformanceTiming.h"
#include "PerformanceUserTiming.h"
#include "ResourceResponse.h"
+#include "ResourceTimingInfo.h"
#include <wtf/CurrentTime.h>
#include "Frame.h"
@@ -160,13 +161,62 @@ void Performance::webkitSetResourceTimingBufferSize(unsigned size)
dispatchEvent(Event::create(eventNames().webkitresourcetimingbufferfullEvent, false, false));
}
-void Performance::addResourceTiming(const String& initiatorName, Document* initiatorDocument, const ResourceRequest& request, const ResourceResponse& response, double initiationTime, double finishTime)
+static bool passesTimingAllowCheck(const ResourceResponse& response, Document* requestingDocument)
+{
+ AtomicallyInitializedStatic(AtomicString&, timingAllowOrigin = *new AtomicString("timing-allow-origin"));
+
+ RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url());
+ if (resourceOrigin->isSameSchemeHostPort(requestingDocument->securityOrigin()))
+ return true;
+
+ const String& timingAllowOriginString = response.httpHeaderField(timingAllowOrigin);
+ if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOriginString, "null"))
+ return false;
+
+ if (timingAllowOriginString == "*")
+ return true;
+
+ const String& securityOrigin = requestingDocument->securityOrigin()->toString();
+ Vector<String> timingAllowOrigins;
+ timingAllowOriginString.split(" ", timingAllowOrigins);
+ for (size_t i = 0; i < timingAllowOrigins.size(); ++i)
+ if (timingAllowOrigins[i] == securityOrigin)
+ return true;
+
+ return false;
+}
+
+void Performance::addResourceTiming(const ResourceTimingInfo& info, Document* initiatorDocument)
{
if (isResourceTimingBufferFull())
return;
- RefPtr<PerformanceEntry> entry = PerformanceResourceTiming::create(initiatorName, request, response, initiationTime, finishTime, initiatorDocument);
+ bool shouldReportDetails = true;
James Simonsen 2013/05/20 23:31:37 For me, this function would read much easier if th
Pan 2013/06/03 10:17:34 I seperated the non-redirect case and redirect-cas
+ Vector<ResourceResponse> redirectChain = info.redirectChain();
James Simonsen 2013/05/20 23:31:37 const&
Pan 2013/06/03 10:17:34 yep done.
+
+ for (size_t i = 0; i < redirectChain.size(); i++)
+ if (false == (shouldReportDetails = passesTimingAllowCheck(redirectChain[i], initiatorDocument)))
James Simonsen 2013/05/20 23:31:37 Separate lines please.
+ break;
+
+ if (shouldReportDetails)
+ shouldReportDetails = passesTimingAllowCheck(info.finalResponse(), initiatorDocument);
+
+ double lastRedirectEndTime = 0.0;
+ if (redirectChain.size() != 0) {
+ ResourceLoadTiming* loadTiming = redirectChain.last().resourceLoadTiming();
James Simonsen 2013/05/20 23:31:37 loadTiming -> lastRedirectTiming
Pan 2013/06/03 10:17:34 done.
+ ASSERT(loadTiming);
+ if (loadTiming->receiveHeadersEnd > 0)
+ lastRedirectEndTime = loadTiming->convertResourceLoadTimeToMonotonicTime(loadTiming->receiveHeadersEnd);
+ else
+ // Redirect response may be cached in network layer.
+ lastRedirectEndTime = loadTiming->requestTime;
James Simonsen 2013/05/20 23:31:37 Isn't it a bug if receiveHeadersEnd isn't set? We'
Pan 2013/06/03 10:17:34 Not a bug, this should be removed once after mmenk
+ }
+
+ double startTime = info.initialTime();
+ if (!shouldReportDetails && lastRedirectEndTime)
+ startTime = info.finalResponse().resourceLoadTiming()->requestTime;
+ RefPtr<PerformanceEntry> entry = PerformanceResourceTiming::create(info, initiatorDocument, startTime, lastRedirectEndTime, shouldReportDetails);
m_resourceTimingBuffer.append(entry);
if (isResourceTimingBufferFull())

Powered by Google App Engine
This is Rietveld 408576698