| 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 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 m_resourceTimingBuffer.clear(); | 150 m_resourceTimingBuffer.clear(); |
| 151 } | 151 } |
| 152 | 152 |
| 153 void Performance::webkitSetResourceTimingBufferSize(unsigned size) | 153 void Performance::webkitSetResourceTimingBufferSize(unsigned size) |
| 154 { | 154 { |
| 155 m_resourceTimingBufferSize = size; | 155 m_resourceTimingBufferSize = size; |
| 156 if (isResourceTimingBufferFull()) | 156 if (isResourceTimingBufferFull()) |
| 157 dispatchEvent(Event::create(EventTypeNames::webkitresourcetimingbufferfu
ll)); | 157 dispatchEvent(Event::create(EventTypeNames::webkitresourcetimingbufferfu
ll)); |
| 158 } | 158 } |
| 159 | 159 |
| 160 static bool passesTimingAllowCheck(const ResourceResponse& response, Document* r
equestingDocument) | 160 static bool passesTimingAllowCheck(const ResourceResponse& response, Document* r
equestingDocument, const AtomicString& originalTimingAllowOrigin) |
| 161 { | 161 { |
| 162 AtomicallyInitializedStatic(AtomicString&, timingAllowOrigin = *new AtomicSt
ring("timing-allow-origin")); | 162 AtomicallyInitializedStatic(AtomicString&, timingAllowOrigin = *new AtomicSt
ring("timing-allow-origin")); |
| 163 | 163 |
| 164 RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url(
)); | 164 RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url(
)); |
| 165 if (resourceOrigin->isSameSchemeHostPort(requestingDocument->securityOrigin(
))) | 165 if (resourceOrigin->isSameSchemeHostPort(requestingDocument->securityOrigin(
))) |
| 166 return true; | 166 return true; |
| 167 | 167 |
| 168 const AtomicString& timingAllowOriginString = response.httpHeaderField(timin
gAllowOrigin); | 168 const AtomicString& timingAllowOriginString = originalTimingAllowOrigin.isEm
pty() ? response.httpHeaderField(timingAllowOrigin) : originalTimingAllowOrigin; |
| 169 if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOrigin
String, "null")) | 169 if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOrigin
String, "null")) |
| 170 return false; | 170 return false; |
| 171 | 171 |
| 172 if (timingAllowOriginString == starAtom) | 172 if (timingAllowOriginString == starAtom) |
| 173 return true; | 173 return true; |
| 174 | 174 |
| 175 const String& securityOrigin = requestingDocument->securityOrigin()->toStrin
g(); | 175 const String& securityOrigin = requestingDocument->securityOrigin()->toStrin
g(); |
| 176 Vector<String> timingAllowOrigins; | 176 Vector<String> timingAllowOrigins; |
| 177 timingAllowOriginString.string().split(" ", timingAllowOrigins); | 177 timingAllowOriginString.string().split(" ", timingAllowOrigins); |
| 178 for (size_t i = 0; i < timingAllowOrigins.size(); ++i) { | 178 for (size_t i = 0; i < timingAllowOrigins.size(); ++i) { |
| 179 if (timingAllowOrigins[i] == securityOrigin) | 179 if (timingAllowOrigins[i] == securityOrigin) |
| 180 return true; | 180 return true; |
| 181 } | 181 } |
| 182 | 182 |
| 183 return false; | 183 return false; |
| 184 } | 184 } |
| 185 | 185 |
| 186 static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain,
const ResourceResponse& finalResponse, Document* initiatorDocument) | 186 static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain,
const ResourceResponse& finalResponse, Document* initiatorDocument) |
| 187 { | 187 { |
| 188 if (!passesTimingAllowCheck(finalResponse, initiatorDocument)) | 188 if (!passesTimingAllowCheck(finalResponse, initiatorDocument, emptyAtom)) |
| 189 return false; | 189 return false; |
| 190 | 190 |
| 191 for (size_t i = 0; i < redirectChain.size(); i++) { | 191 for (size_t i = 0; i < redirectChain.size(); i++) { |
| 192 if (!passesTimingAllowCheck(redirectChain[i], initiatorDocument)) | 192 if (!passesTimingAllowCheck(redirectChain[i], initiatorDocument, emptyAt
om)) |
| 193 return false; | 193 return false; |
| 194 } | 194 } |
| 195 | 195 |
| 196 return true; | 196 return true; |
| 197 } | 197 } |
| 198 | 198 |
| 199 void Performance::addResourceTiming(const ResourceTimingInfo& info, Document* in
itiatorDocument) | 199 void Performance::addResourceTiming(const ResourceTimingInfo& info, Document* in
itiatorDocument) |
| 200 { | 200 { |
| 201 if (isResourceTimingBufferFull()) | 201 if (isResourceTimingBufferFull()) |
| 202 return; | 202 return; |
| 203 | 203 |
| 204 const ResourceResponse& finalResponse = info.finalResponse(); | 204 const ResourceResponse& finalResponse = info.finalResponse(); |
| 205 bool allowTimingDetails = passesTimingAllowCheck(finalResponse, initiatorDoc
ument); | 205 bool allowTimingDetails = passesTimingAllowCheck(finalResponse, initiatorDoc
ument, info.originalTimingAllowOrigin()); |
| 206 double startTime = info.initialTime(); | 206 double startTime = info.initialTime(); |
| 207 | 207 |
| 208 if (info.redirectChain().isEmpty()) { | 208 if (info.redirectChain().isEmpty()) { |
| 209 RefPtrWillBeRawPtr<PerformanceEntry> entry = PerformanceResourceTiming::
create(info, initiatorDocument, startTime, allowTimingDetails); | 209 RefPtrWillBeRawPtr<PerformanceEntry> entry = PerformanceResourceTiming::
create(info, initiatorDocument, startTime, allowTimingDetails); |
| 210 addResourceTimingBuffer(entry); | 210 addResourceTimingBuffer(entry); |
| 211 return; | 211 return; |
| 212 } | 212 } |
| 213 | 213 |
| 214 const Vector<ResourceResponse>& redirectChain = info.redirectChain(); | 214 const Vector<ResourceResponse>& redirectChain = info.redirectChain(); |
| 215 bool allowRedirectDetails = allowsTimingRedirect(redirectChain, finalRespons
e, initiatorDocument); | 215 bool allowRedirectDetails = allowsTimingRedirect(redirectChain, finalRespons
e, initiatorDocument); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 | 277 |
| 278 void Performance::trace(Visitor* visitor) | 278 void Performance::trace(Visitor* visitor) |
| 279 { | 279 { |
| 280 visitor->trace(m_navigation); | 280 visitor->trace(m_navigation); |
| 281 visitor->trace(m_timing); | 281 visitor->trace(m_timing); |
| 282 visitor->trace(m_resourceTimingBuffer); | 282 visitor->trace(m_resourceTimingBuffer); |
| 283 visitor->trace(m_userTiming); | 283 visitor->trace(m_userTiming); |
| 284 } | 284 } |
| 285 | 285 |
| 286 } // namespace WebCore | 286 } // namespace WebCore |
| OLD | NEW |