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

Side by Side Diff: Source/core/timing/PerformanceBase.cpp

Issue 1185553002: ResourceTiming should not depend on Document (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Remove SecurityOrigin parameter Created 5 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
« no previous file with comments | « Source/core/timing/PerformanceBase.h ('k') | Source/core/timing/PerformanceResourceTiming.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
OLDNEW
« no previous file with comments | « Source/core/timing/PerformanceBase.h ('k') | Source/core/timing/PerformanceResourceTiming.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698