| 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 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 m_frameTimingBuffer.clear(); | 163 m_frameTimingBuffer.clear(); |
| 164 } | 164 } |
| 165 | 165 |
| 166 void PerformanceBase::setFrameTimingBufferSize(unsigned size) | 166 void PerformanceBase::setFrameTimingBufferSize(unsigned size) |
| 167 { | 167 { |
| 168 m_frameTimingBufferSize = size; | 168 m_frameTimingBufferSize = size; |
| 169 if (isFrameTimingBufferFull()) | 169 if (isFrameTimingBufferFull()) |
| 170 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); | 170 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); |
| 171 } | 171 } |
| 172 | 172 |
| 173 static bool passesTimingAllowCheck(const ResourceResponse& response, Document* r
equestingDocument, const AtomicString& originalTimingAllowOrigin) | 173 static bool passesTimingAllowCheck(const ResourceResponse& response, const Secur
ityOrigin& initiatorSecurityOrigin, const AtomicString& originalTimingAllowOrigi
n) |
| 174 { | 174 { |
| 175 AtomicallyInitializedStaticReference(AtomicString, timingAllowOrigin, new At
omicString("timing-allow-origin")); | 175 AtomicallyInitializedStaticReference(AtomicString, timingAllowOrigin, new At
omicString("timing-allow-origin")); |
| 176 | 176 |
| 177 RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url(
)); | 177 RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url(
)); |
| 178 if (resourceOrigin->isSameSchemeHostPort(requestingDocument->securityOrigin(
))) | 178 if (resourceOrigin->isSameSchemeHostPort(&initiatorSecurityOrigin)) |
| 179 return true; | 179 return true; |
| 180 | 180 |
| 181 const AtomicString& timingAllowOriginString = originalTimingAllowOrigin.isEm
pty() ? response.httpHeaderField(timingAllowOrigin) : originalTimingAllowOrigin; | 181 const AtomicString& timingAllowOriginString = originalTimingAllowOrigin.isEm
pty() ? response.httpHeaderField(timingAllowOrigin) : originalTimingAllowOrigin; |
| 182 if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOrigin
String, "null")) | 182 if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOrigin
String, "null")) |
| 183 return false; | 183 return false; |
| 184 | 184 |
| 185 if (timingAllowOriginString == starAtom) | 185 if (timingAllowOriginString == starAtom) |
| 186 return true; | 186 return true; |
| 187 | 187 |
| 188 const String& securityOrigin = requestingDocument->securityOrigin()->toStrin
g(); | 188 const String& securityOrigin = initiatorSecurityOrigin.toString(); |
| 189 Vector<String> timingAllowOrigins; | 189 Vector<String> timingAllowOrigins; |
| 190 timingAllowOriginString.string().split(' ', timingAllowOrigins); | 190 timingAllowOriginString.string().split(' ', timingAllowOrigins); |
| 191 for (const String& allowOrigin : timingAllowOrigins) { | 191 for (const String& allowOrigin : timingAllowOrigins) { |
| 192 if (allowOrigin == securityOrigin) | 192 if (allowOrigin == securityOrigin) |
| 193 return true; | 193 return true; |
| 194 } | 194 } |
| 195 | 195 |
| 196 return false; | 196 return false; |
| 197 } | 197 } |
| 198 | 198 |
| 199 static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain,
const ResourceResponse& finalResponse, Document* initiatorDocument) | 199 static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain,
const ResourceResponse& finalResponse, const SecurityOrigin& initiatorSecurityOr
igin) |
| 200 { | 200 { |
| 201 if (!passesTimingAllowCheck(finalResponse, initiatorDocument, emptyAtom)) | 201 if (!passesTimingAllowCheck(finalResponse, initiatorSecurityOrigin, emptyAto
m)) |
| 202 return false; | 202 return false; |
| 203 | 203 |
| 204 for (const ResourceResponse& response : redirectChain) { | 204 for (const ResourceResponse& response : redirectChain) { |
| 205 if (!passesTimingAllowCheck(response, initiatorDocument, emptyAtom)) | 205 if (!passesTimingAllowCheck(response, initiatorSecurityOrigin, emptyAtom
)) |
| 206 return false; | 206 return false; |
| 207 } | 207 } |
| 208 | 208 |
| 209 return true; | 209 return true; |
| 210 } | 210 } |
| 211 | 211 |
| 212 void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info, Document
* initiatorDocument) | 212 void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info) |
| 213 { | 213 { |
| 214 if (isResourceTimingBufferFull()) | 214 if (isResourceTimingBufferFull()) |
| 215 return; | 215 return; |
| 216 SecurityOrigin* securityOrigin = nullptr; |
| 217 if (ExecutionContext* context = executionContext()) |
| 218 securityOrigin = context->securityOrigin(); |
| 219 if (!securityOrigin) |
| 220 return; |
| 216 | 221 |
| 217 const ResourceResponse& finalResponse = info.finalResponse(); | 222 const ResourceResponse& finalResponse = info.finalResponse(); |
| 218 bool allowTimingDetails = passesTimingAllowCheck(finalResponse, initiatorDoc
ument, info.originalTimingAllowOrigin()); | 223 bool allowTimingDetails = passesTimingAllowCheck(finalResponse, *securityOri
gin, info.originalTimingAllowOrigin()); |
| 219 double startTime = info.initialTime(); | 224 double startTime = info.initialTime(); |
| 220 | 225 |
| 221 if (info.redirectChain().isEmpty()) { | 226 if (info.redirectChain().isEmpty()) { |
| 222 PerformanceEntry* entry = PerformanceResourceTiming::create(info, initia
torDocument, startTime, allowTimingDetails); | 227 PerformanceEntry* entry = PerformanceResourceTiming::create(info, timeOr
igin(), startTime, allowTimingDetails); |
| 223 addResourceTimingBuffer(entry); | 228 addResourceTimingBuffer(entry); |
| 224 return; | 229 return; |
| 225 } | 230 } |
| 226 | 231 |
| 227 const Vector<ResourceResponse>& redirectChain = info.redirectChain(); | 232 const Vector<ResourceResponse>& redirectChain = info.redirectChain(); |
| 228 bool allowRedirectDetails = allowsTimingRedirect(redirectChain, finalRespons
e, initiatorDocument); | 233 bool allowRedirectDetails = allowsTimingRedirect(redirectChain, finalRespons
e, *securityOrigin); |
| 229 | 234 |
| 230 if (!allowRedirectDetails) { | 235 if (!allowRedirectDetails) { |
| 231 ResourceLoadTiming* finalTiming = finalResponse.resourceLoadTiming(); | 236 ResourceLoadTiming* finalTiming = finalResponse.resourceLoadTiming(); |
| 232 ASSERT(finalTiming); | 237 ASSERT(finalTiming); |
| 233 if (finalTiming) | 238 if (finalTiming) |
| 234 startTime = finalTiming->requestTime(); | 239 startTime = finalTiming->requestTime(); |
| 235 } | 240 } |
| 236 | 241 |
| 237 ResourceLoadTiming* lastRedirectTiming = redirectChain.last().resourceLoadTi
ming(); | 242 ResourceLoadTiming* lastRedirectTiming = redirectChain.last().resourceLoadTi
ming(); |
| 238 ASSERT(lastRedirectTiming); | 243 ASSERT(lastRedirectTiming); |
| 239 double lastRedirectEndTime = lastRedirectTiming->receiveHeadersEnd(); | 244 double lastRedirectEndTime = lastRedirectTiming->receiveHeadersEnd(); |
| 240 | 245 |
| 241 PerformanceEntry* entry = PerformanceResourceTiming::create(info, initiatorD
ocument, startTime, lastRedirectEndTime, allowTimingDetails, allowRedirectDetail
s); | 246 PerformanceEntry* entry = PerformanceResourceTiming::create(info, timeOrigin
(), startTime, lastRedirectEndTime, allowTimingDetails, allowRedirectDetails); |
| 242 addResourceTimingBuffer(entry); | 247 addResourceTimingBuffer(entry); |
| 243 } | 248 } |
| 244 | 249 |
| 245 void PerformanceBase::addResourceTimingBuffer(PerformanceEntry* entry) | 250 void PerformanceBase::addResourceTimingBuffer(PerformanceEntry* entry) |
| 246 { | 251 { |
| 247 m_resourceTimingBuffer.append(entry); | 252 m_resourceTimingBuffer.append(entry); |
| 248 | 253 |
| 249 if (isResourceTimingBufferFull()) | 254 if (isResourceTimingBufferFull()) |
| 250 dispatchEvent(Event::create(EventTypeNames::webkitresourcetimingbufferfu
ll)); | 255 dispatchEvent(Event::create(EventTypeNames::webkitresourcetimingbufferfu
ll)); |
| 251 } | 256 } |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 | 326 |
| 322 DEFINE_TRACE(PerformanceBase) | 327 DEFINE_TRACE(PerformanceBase) |
| 323 { | 328 { |
| 324 visitor->trace(m_frameTimingBuffer); | 329 visitor->trace(m_frameTimingBuffer); |
| 325 visitor->trace(m_resourceTimingBuffer); | 330 visitor->trace(m_resourceTimingBuffer); |
| 326 visitor->trace(m_userTiming); | 331 visitor->trace(m_userTiming); |
| 327 EventTargetWithInlineData::trace(visitor); | 332 EventTargetWithInlineData::trace(visitor); |
| 328 } | 333 } |
| 329 | 334 |
| 330 } // namespace blink | 335 } // namespace blink |
| OLD | NEW |