OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |