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

Side by Side 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: 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) 2010 Google Inc. All rights reserved. 2 * Copyright (C) 2010 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 22 matching lines...) Expand all
33 #include "core/page/Performance.h" 33 #include "core/page/Performance.h"
34 34
35 #include "core/dom/Document.h" 35 #include "core/dom/Document.h"
36 #include "core/loader/DocumentLoader.h" 36 #include "core/loader/DocumentLoader.h"
37 #include "core/page/MemoryInfo.h" 37 #include "core/page/MemoryInfo.h"
38 #include "core/page/PerformanceEntry.h" 38 #include "core/page/PerformanceEntry.h"
39 #include "core/page/PerformanceNavigation.h" 39 #include "core/page/PerformanceNavigation.h"
40 #include "core/page/PerformanceResourceTiming.h" 40 #include "core/page/PerformanceResourceTiming.h"
41 #include "core/page/PerformanceTiming.h" 41 #include "core/page/PerformanceTiming.h"
42 #include "core/page/PerformanceUserTiming.h" 42 #include "core/page/PerformanceUserTiming.h"
43 #include "core/page/ResourceTimingInfo.h"
43 #include "core/platform/network/ResourceResponse.h" 44 #include "core/platform/network/ResourceResponse.h"
45 #include "weborigin/SecurityOrigin.h"
44 #include <wtf/CurrentTime.h> 46 #include <wtf/CurrentTime.h>
45 47
46 #include "core/page/Frame.h" 48 #include "core/page/Frame.h"
47 49
48 namespace WebCore { 50 namespace WebCore {
49 51
50 static const size_t defaultResourceTimingBufferSize = 150; 52 static const size_t defaultResourceTimingBufferSize = 150;
51 53
52 Performance::Performance(Frame* frame) 54 Performance::Performance(Frame* frame)
53 : DOMWindowProperty(frame) 55 : DOMWindowProperty(frame)
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 m_resourceTimingBuffer.clear(); 155 m_resourceTimingBuffer.clear();
154 } 156 }
155 157
156 void Performance::webkitSetResourceTimingBufferSize(unsigned size) 158 void Performance::webkitSetResourceTimingBufferSize(unsigned size)
157 { 159 {
158 m_resourceTimingBufferSize = size; 160 m_resourceTimingBufferSize = size;
159 if (isResourceTimingBufferFull()) 161 if (isResourceTimingBufferFull())
160 dispatchEvent(Event::create(eventNames().webkitresourcetimingbufferfullE vent, false, false)); 162 dispatchEvent(Event::create(eventNames().webkitresourcetimingbufferfullE vent, false, false));
161 } 163 }
162 164
163 void Performance::addResourceTiming(const String& initiatorName, Document* initi atorDocument, const ResourceRequest& request, const ResourceResponse& response, double initiationTime, double finishTime) 165 static bool passesTimingAllowCheck(const ResourceResponse& response, Document* r equestingDocument)
166 {
167 AtomicallyInitializedStatic(AtomicString&, timingAllowOrigin = *new AtomicSt ring("timing-allow-origin"));
168
169 RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url( ));
170 if (resourceOrigin->isSameSchemeHostPort(requestingDocument->securityOrigin( )))
171 return true;
172
173 const String& timingAllowOriginString = response.httpHeaderField(timingAllow Origin);
174 if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOrigin String, "null"))
175 return false;
176
177 if (timingAllowOriginString == "*")
178 return true;
179
180 const String& securityOrigin = requestingDocument->securityOrigin()->toStrin g();
181 Vector<String> timingAllowOrigins;
182 timingAllowOriginString.split(" ", timingAllowOrigins);
183 for (size_t i = 0; i < timingAllowOrigins.size(); ++i)
184 if (timingAllowOrigins[i] == securityOrigin)
185 return true;
186
187 return false;
188 }
189
190 static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain, const ResourceResponse& finalResponse, Document* initiatorDocument)
191 {
192 if (!passesTimingAllowCheck(finalResponse, initiatorDocument))
193 return false;
194
195 for (size_t i = 0; i < redirectChain.size(); i++)
196 if (!passesTimingAllowCheck(redirectChain[i], initiatorDocument))
197 return false;
198
199 return true;
200 }
201
202 void Performance::addResourceTiming(const ResourceTimingInfo& info, Document* in itiatorDocument)
164 { 203 {
165 if (isResourceTimingBufferFull()) 204 if (isResourceTimingBufferFull())
166 return; 205 return;
167 206
168 RefPtr<PerformanceEntry> entry = PerformanceResourceTiming::create(initiator Name, request, response, initiationTime, finishTime, initiatorDocument); 207 const ResourceResponse& finalResponse = info.finalResponse();
208 bool allowTimingFetch = passesTimingAllowCheck(finalResponse, initiatorDocum ent);
209 double startTime = info.initialTime();
169 210
211 if (info.redirectChain().isEmpty()) {
212 RefPtr<PerformanceEntry> entry = PerformanceResourceTiming::create(info, initiatorDocument, startTime, allowTimingFetch);
James Simonsen 2013/06/04 01:13:04 Why not move this to populateResourceTimingEntry?
Pan 2013/06/04 02:48:34 they are overload functions to distinguish non-red
213 populateResourceTimingEntry(entry);
214 return;
215 }
216
217 const Vector<ResourceResponse>& redirectChain = info.redirectChain();
218 bool allowTimingRedirect = allowsTimingRedirect(redirectChain, finalResponse , initiatorDocument);
219
220 if (!allowTimingRedirect) {
221 ResourceLoadTiming* finalTiming = finalResponse.resourceLoadTiming();
222 ASSERT(finalTiming);
223 startTime = finalTiming->requestTime;
224 }
225
226 ResourceLoadTiming* lastRedirectTiming = redirectChain.last().resourceLoadTi ming();
227 ASSERT(lastRedirectTiming);
228 double lastRedirectEndTime = lastRedirectTiming->receiveHeadersEnd;
229
230 RefPtr<PerformanceEntry> entry = PerformanceResourceTiming::create(info, ini tiatorDocument, startTime, lastRedirectEndTime, allowTimingFetch, allowTimingRed irect);
231 populateResourceTimingEntry(entry);
232 }
233
234 void Performance::populateResourceTimingEntry(PassRefPtr<PerformanceEntry> entry )
James Simonsen 2013/06/04 01:13:04 Maybe call this addResourceTimingToBuffer()?
Pan 2013/06/04 02:48:34 yes, thanks!
235 {
170 m_resourceTimingBuffer.append(entry); 236 m_resourceTimingBuffer.append(entry);
171 237
172 if (isResourceTimingBufferFull()) 238 if (isResourceTimingBufferFull())
173 dispatchEvent(Event::create(eventNames().webkitresourcetimingbufferfullE vent, false, false)); 239 dispatchEvent(Event::create(eventNames().webkitresourcetimingbufferfullE vent, false, false));
174 } 240 }
175 241
176 bool Performance::isResourceTimingBufferFull() 242 bool Performance::isResourceTimingBufferFull()
177 { 243 {
178 return m_resourceTimingBuffer.size() >= m_resourceTimingBufferSize; 244 return m_resourceTimingBuffer.size() >= m_resourceTimingBufferSize;
179 } 245 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 m_userTiming = UserTiming::create(this); 283 m_userTiming = UserTiming::create(this);
218 m_userTiming->clearMeasures(measureName); 284 m_userTiming->clearMeasures(measureName);
219 } 285 }
220 286
221 double Performance::now() const 287 double Performance::now() const
222 { 288 {
223 return 1000.0 * m_frame->document()->loader()->timing()->monotonicTimeToZero BasedDocumentTime(monotonicallyIncreasingTime()); 289 return 1000.0 * m_frame->document()->loader()->timing()->monotonicTimeToZero BasedDocumentTime(monotonicallyIncreasingTime());
224 } 290 }
225 291
226 } // namespace WebCore 292 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698