Index: Source/core/timing/PerformanceBase.cpp |
diff --git a/Source/core/timing/PerformanceBase.cpp b/Source/core/timing/PerformanceBase.cpp |
index 64aa79f34122e08432732127cfa94f4184382808..344a36de26fd8fe4a314712f96d2e4655e45afa2 100644 |
--- a/Source/core/timing/PerformanceBase.cpp |
+++ b/Source/core/timing/PerformanceBase.cpp |
@@ -170,12 +170,12 @@ void PerformanceBase::setFrameTimingBufferSize(unsigned size) |
dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); |
} |
-static bool passesTimingAllowCheck(const ResourceResponse& response, Document* requestingDocument, const AtomicString& originalTimingAllowOrigin) |
+static bool passesTimingAllowCheck(const ResourceResponse& response, const SecurityOrigin& initiatorSecurityOrigin, const AtomicString& originalTimingAllowOrigin) |
{ |
AtomicallyInitializedStaticReference(AtomicString, timingAllowOrigin, new AtomicString("timing-allow-origin")); |
RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url()); |
- if (resourceOrigin->isSameSchemeHostPort(requestingDocument->securityOrigin())) |
+ if (resourceOrigin->isSameSchemeHostPort(&initiatorSecurityOrigin)) |
return true; |
const AtomicString& timingAllowOriginString = originalTimingAllowOrigin.isEmpty() ? response.httpHeaderField(timingAllowOrigin) : originalTimingAllowOrigin; |
@@ -185,7 +185,7 @@ static bool passesTimingAllowCheck(const ResourceResponse& response, Document* r |
if (timingAllowOriginString == starAtom) |
return true; |
- const String& securityOrigin = requestingDocument->securityOrigin()->toString(); |
+ const String& securityOrigin = initiatorSecurityOrigin.toString(); |
Vector<String> timingAllowOrigins; |
timingAllowOriginString.string().split(' ', timingAllowOrigins); |
for (const String& allowOrigin : timingAllowOrigins) { |
@@ -196,36 +196,41 @@ static bool passesTimingAllowCheck(const ResourceResponse& response, Document* r |
return false; |
} |
-static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain, const ResourceResponse& finalResponse, Document* initiatorDocument) |
+static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain, const ResourceResponse& finalResponse, const SecurityOrigin& initiatorSecurityOrigin) |
{ |
- if (!passesTimingAllowCheck(finalResponse, initiatorDocument, emptyAtom)) |
+ if (!passesTimingAllowCheck(finalResponse, initiatorSecurityOrigin, emptyAtom)) |
return false; |
for (const ResourceResponse& response : redirectChain) { |
- if (!passesTimingAllowCheck(response, initiatorDocument, emptyAtom)) |
+ if (!passesTimingAllowCheck(response, initiatorSecurityOrigin, emptyAtom)) |
return false; |
} |
return true; |
} |
-void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info, Document* initiatorDocument) |
+void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info) |
{ |
if (isResourceTimingBufferFull()) |
return; |
+ SecurityOrigin* securityOrigin = nullptr; |
+ if (ExecutionContext* context = executionContext()) |
+ securityOrigin = context->securityOrigin(); |
+ if (!securityOrigin) |
+ return; |
const ResourceResponse& finalResponse = info.finalResponse(); |
- bool allowTimingDetails = passesTimingAllowCheck(finalResponse, initiatorDocument, info.originalTimingAllowOrigin()); |
+ bool allowTimingDetails = passesTimingAllowCheck(finalResponse, *securityOrigin, info.originalTimingAllowOrigin()); |
double startTime = info.initialTime(); |
if (info.redirectChain().isEmpty()) { |
- PerformanceEntry* entry = PerformanceResourceTiming::create(info, initiatorDocument, startTime, allowTimingDetails); |
+ PerformanceEntry* entry = PerformanceResourceTiming::create(info, timeOrigin(), startTime, allowTimingDetails); |
addResourceTimingBuffer(entry); |
return; |
} |
const Vector<ResourceResponse>& redirectChain = info.redirectChain(); |
- bool allowRedirectDetails = allowsTimingRedirect(redirectChain, finalResponse, initiatorDocument); |
+ bool allowRedirectDetails = allowsTimingRedirect(redirectChain, finalResponse, *securityOrigin); |
if (!allowRedirectDetails) { |
ResourceLoadTiming* finalTiming = finalResponse.resourceLoadTiming(); |
@@ -238,7 +243,7 @@ void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info, Document |
ASSERT(lastRedirectTiming); |
double lastRedirectEndTime = lastRedirectTiming->receiveHeadersEnd(); |
- PerformanceEntry* entry = PerformanceResourceTiming::create(info, initiatorDocument, startTime, lastRedirectEndTime, allowTimingDetails, allowRedirectDetails); |
+ PerformanceEntry* entry = PerformanceResourceTiming::create(info, timeOrigin(), startTime, lastRedirectEndTime, allowTimingDetails, allowRedirectDetails); |
addResourceTimingBuffer(entry); |
} |