Log Message
Merged r142936. <rdar://problem/13210723>
Modified Paths
- tags/Safari-537.31.3/Source/WebCore/ChangeLog
- tags/Safari-537.31.3/Source/WebCore/loader/DocumentThreadableLoader.cpp
- tags/Safari-537.31.3/Source/WebCore/loader/DocumentThreadableLoader.h
- tags/Safari-537.31.3/Source/WebCore/loader/ResourceLoader.cpp
- tags/Safari-537.31.3/Source/WebCore/loader/TextTrackLoader.cpp
- tags/Safari-537.31.3/Source/WebCore/loader/TextTrackLoader.h
- tags/Safari-537.31.3/Source/WebCore/loader/cache/CachedResourceClient.h
- tags/Safari-537.31.3/Source/WebCore/loader/cache/CachedTextTrack.cpp
Diff
Modified: tags/Safari-537.31.3/Source/WebCore/ChangeLog (143250 => 143251)
--- tags/Safari-537.31.3/Source/WebCore/ChangeLog 2013-02-18 20:08:40 UTC (rev 143250)
+++ tags/Safari-537.31.3/Source/WebCore/ChangeLog 2013-02-18 20:15:56 UTC (rev 143251)
@@ -1,3 +1,45 @@
+2013-02-18 Lucas Forschler <lforsch...@apple.com>
+
+ Merge r142936
+
+ 2013-02-14 Alexey Proskuryakov <a...@apple.com>
+
+ <rdar://problem/13210723> CORS preflight broken with NetworkProcess
+ https://bugs.webkit.org/show_bug.cgi?id=109753
+
+ Reviewed by Brady Eidson.
+
+ * loader/DocumentThreadableLoader.h:
+ * loader/DocumentThreadableLoader.cpp:
+ (WebCore::DocumentThreadableLoader::DocumentThreadableLoader):
+ (WebCore::DocumentThreadableLoader::cancel):
+ (WebCore::DocumentThreadableLoader::didReceiveResponse):
+ (WebCore::DocumentThreadableLoader::dataReceived):
+ (WebCore::DocumentThreadableLoader::didReceiveData):
+ (WebCore::DocumentThreadableLoader::notifyFinished):
+ (WebCore::DocumentThreadableLoader::didFinishLoading):
+ (WebCore::DocumentThreadableLoader::didFail):
+ (WebCore::DocumentThreadableLoader::preflightFailure): Notify InspectorInstrumentation
+ immediately. In addition to keeping up eith other changes, this means that an accurate
+ error will be passed now, not a cancellation.
+ (WebCore::DocumentThreadableLoader::loadRequest):
+ Get rid of m_preflightRequestIdentifier. Every loader has an identifier, and tracking
+ identifiers twice is wrong.
+ Pass identifier explicitly to more internal functions, so that they would not have to
+ second-guess callers.
+
+ * loader/ResourceLoader.cpp: (WebCore::ResourceLoader::willSendRequest):
+ Create an identifier for all loaders, not just those that we expect to have client
+ callbacks about. Both Inspector and NetworkProcess need identifiers everywhere.
+
+ * loader/TextTrackLoader.cpp: (WebCore::TextTrackLoader::deprecatedDidReceiveCachedResource):
+ * loader/TextTrackLoader.h:
+ * loader/cache/CachedResourceClient.h:
+ (WebCore::CachedResourceClient::deprecatedDidReceiveCachedResource):
+ * loader/cache/CachedTextTrack.cpp: (WebCore::CachedTextTrack::data):
+ Renamed didReceiveData to avoid conflict with the new DocumentThreadableLoader::didReceiveData.
+ And we should really get rid of this CachedResourceClient function anyway.
+
2013-02-12 Takashi Sakamoto <ta...@google.com>
[Refactoring] Make SelectorChecker::mode a constructor parameter.
Modified: tags/Safari-537.31.3/Source/WebCore/loader/DocumentThreadableLoader.cpp (143250 => 143251)
--- tags/Safari-537.31.3/Source/WebCore/loader/DocumentThreadableLoader.cpp 2013-02-18 20:08:40 UTC (rev 143250)
+++ tags/Safari-537.31.3/Source/WebCore/loader/DocumentThreadableLoader.cpp 2013-02-18 20:15:56 UTC (rev 143251)
@@ -78,9 +78,6 @@
, m_sameOriginRequest(securityOrigin()->canRequest(request.url()))
, m_simpleRequest(true)
, m_async(blockingBehavior == LoadAsynchronously)
-#if ENABLE(INSPECTOR)
- , m_preflightRequestIdentifier(0)
-#endif
{
ASSERT(document);
ASSERT(client);
@@ -152,9 +149,10 @@
// Cancel can re-enter and m_resource might be null here as a result.
if (m_client && m_resource) {
+ // FIXME: This error is sent to the client in didFail(), so it should not be an internal one. Use FrameLoaderClient::cancelledError() instead.
ResourceError error(errorDomainWebKitInternal, 0, m_resource->url(), "Load cancelled");
error.setIsCancellation(true);
- didFail(error);
+ didFail(m_resource->identifier(), error);
}
clearResource();
m_client = 0;
@@ -247,18 +245,16 @@
{
ASSERT(m_client);
+ String accessControlErrorDescription;
+ if (m_actualRequest) {
#if ENABLE(INSPECTOR)
- if (m_preflightRequestIdentifier) {
DocumentLoader* loader = m_document->frame()->loader()->documentLoader();
- InspectorInstrumentationCookie cookie = InspectorInstrumentation::willReceiveResourceResponse(m_document->frame(), m_preflightRequestIdentifier, response);
- InspectorInstrumentation::didReceiveResourceResponse(cookie, m_preflightRequestIdentifier, loader, response, 0);
- }
+ InspectorInstrumentationCookie cookie = InspectorInstrumentation::willReceiveResourceResponse(m_document->frame(), identifier, response);
+ InspectorInstrumentation::didReceiveResourceResponse(cookie, identifier, loader, response, 0);
#endif
- String accessControlErrorDescription;
- if (m_actualRequest) {
if (!passesAccessControlCheck(response, m_options.allowCredentials, securityOrigin(), accessControlErrorDescription)) {
- preflightFailure(response.url(), accessControlErrorDescription);
+ preflightFailure(identifier, response.url(), accessControlErrorDescription);
return;
}
@@ -266,7 +262,7 @@
if (!preflightResult->parse(response, accessControlErrorDescription)
|| !preflightResult->allowsCrossOriginMethod(m_actualRequest->httpMethod(), accessControlErrorDescription)
|| !preflightResult->allowsCrossOriginHeaders(m_actualRequest->httpHeaderFields(), accessControlErrorDescription)) {
- preflightFailure(response.url(), accessControlErrorDescription);
+ preflightFailure(identifier, response.url(), accessControlErrorDescription);
return;
}
@@ -285,17 +281,21 @@
void DocumentThreadableLoader::dataReceived(CachedResource* resource, const char* data, int dataLength)
{
- ASSERT(m_client);
ASSERT_UNUSED(resource, resource == m_resource);
+ didReceiveData(m_resource->identifier(), data, dataLength);
+}
-#if ENABLE(INSPECTOR)
- if (m_preflightRequestIdentifier)
- InspectorInstrumentation::didReceiveData(m_document->frame(), m_preflightRequestIdentifier, 0, 0, dataLength);
-#endif
+void DocumentThreadableLoader::didReceiveData(unsigned long identifier, const char* data, int dataLength)
+{
+ ASSERT(m_client);
// Preflight data should be invisible to clients.
- if (m_actualRequest)
+ if (m_actualRequest) {
+#if ENABLE(INSPECTOR)
+ InspectorInstrumentation::didReceiveData(m_document->frame(), identifier, 0, 0, dataLength);
+#endif
return;
+ }
m_client->didReceiveData(data, dataLength);
}
@@ -305,20 +305,18 @@
ASSERT(m_client);
ASSERT_UNUSED(resource, resource == m_resource);
- if (m_resource && m_resource->errorOccurred())
- didFail(m_resource->resourceError());
+ if (m_resource->errorOccurred())
+ didFail(m_resource->identifier(), m_resource->resourceError());
else
didFinishLoading(m_resource->identifier(), m_resource->loadFinishTime());
}
void DocumentThreadableLoader::didFinishLoading(unsigned long identifier, double finishTime)
{
+ if (m_actualRequest) {
#if ENABLE(INSPECTOR)
- if (m_preflightRequestIdentifier)
- InspectorInstrumentation::didFinishLoading(m_document->frame(), m_document->frame()->loader()->documentLoader(), m_preflightRequestIdentifier, finishTime);
+ InspectorInstrumentation::didFinishLoading(m_document->frame(), m_document->frame()->loader()->documentLoader(), identifier, finishTime);
#endif
-
- if (m_actualRequest) {
ASSERT(!m_sameOriginRequest);
ASSERT(m_options.crossOriginRequestPolicy == UseAccessControl);
preflightSuccess();
@@ -326,11 +324,11 @@
m_client->didFinishLoading(identifier, finishTime);
}
-void DocumentThreadableLoader::didFail(const ResourceError& error)
+void DocumentThreadableLoader::didFail(unsigned long identifier, const ResourceError& error)
{
#if ENABLE(INSPECTOR)
- if (m_preflightRequestIdentifier)
- InspectorInstrumentation::didFailLoading(m_document->frame(), m_document->frame()->loader()->documentLoader(), m_preflightRequestIdentifier, error);
+ if (m_actualRequest)
+ InspectorInstrumentation::didFailLoading(m_document->frame(), m_document->frame()->loader()->documentLoader(), identifier, error);
#endif
m_client->didFail(error);
@@ -349,10 +347,15 @@
loadRequest(*actualRequest, SkipSecurityCheck);
}
-void DocumentThreadableLoader::preflightFailure(const String& url, const String& errorDescription)
+void DocumentThreadableLoader::preflightFailure(unsigned long identifier, const String& url, const String& errorDescription)
{
+ ResourceError error(errorDomainWebKitInternal, 0, url, errorDescription);
+#if ENABLE(INSPECTOR)
+ if (m_actualRequest)
+ InspectorInstrumentation::didFailLoading(m_document->frame(), m_document->frame()->loader()->documentLoader(), identifier, error);
+#endif
m_actualRequest = nullptr; // Prevent didFinishLoading() from bypassing access check.
- m_client->didFailAccessControlCheck(ResourceError(errorDomainWebKitInternal, 0, url, errorDescription));
+ m_client->didFailAccessControlCheck(error);
}
void DocumentThreadableLoader::loadRequest(const ResourceRequest& request, SecurityCheckPolicy securityCheck)
@@ -378,20 +381,12 @@
#if ENABLE(RESOURCE_TIMING)
newRequest.setInitiator(m_options.initiator);
#endif
-#if ENABLE(INSPECTOR)
- if (m_actualRequest) {
- // Because willSendRequest only gets called during redirects, we initialize the identifier and the first willSendRequest here.
- m_preflightRequestIdentifier = m_document->frame()->page()->progress()->createUniqueIdentifier();
- ResourceResponse redirectResponse = ResourceResponse();
- InspectorInstrumentation::willSendRequest(m_document->frame(), m_preflightRequestIdentifier, m_document->frame()->loader()->documentLoader(), newRequest.mutableResourceRequest(), redirectResponse);
- }
-#endif
ASSERT(!m_resource);
m_resource = m_document->cachedResourceLoader()->requestRawResource(newRequest);
if (m_resource) {
#if ENABLE(INSPECTOR)
if (m_resource->loader()) {
- unsigned long identifier = m_actualRequest ? m_preflightRequestIdentifier : m_resource->loader()->identifier();
+ unsigned long identifier = m_resource->loader()->identifier();
InspectorInstrumentation::documentThreadableLoaderStartedLoadingForClient(m_document, identifier, m_client);
}
#endif
@@ -429,7 +424,7 @@
const char* bytes = static_cast<const char*>(data.data());
int len = static_cast<int>(data.size());
- dataReceived(0, bytes, len);
+ didReceiveData(identifier, bytes, len);
didFinishLoading(identifier, 0.0);
}
Modified: tags/Safari-537.31.3/Source/WebCore/loader/DocumentThreadableLoader.h (143250 => 143251)
--- tags/Safari-537.31.3/Source/WebCore/loader/DocumentThreadableLoader.h 2013-02-18 20:08:40 UTC (rev 143250)
+++ tags/Safari-537.31.3/Source/WebCore/loader/DocumentThreadableLoader.h 2013-02-18 20:15:56 UTC (rev 143251)
@@ -87,13 +87,14 @@
#endif
void didReceiveResponse(unsigned long identifier, const ResourceResponse&);
+ void didReceiveData(unsigned long identifier, const char* data, int dataLength);
void didFinishLoading(unsigned long identifier, double finishTime);
- void didFail(const ResourceError&);
+ void didFail(unsigned long identifier, const ResourceError&);
void makeCrossOriginAccessRequest(const ResourceRequest&);
void makeSimpleCrossOriginAccessRequest(const ResourceRequest& request);
void makeCrossOriginAccessRequestWithPreflight(const ResourceRequest& request);
void preflightSuccess();
- void preflightFailure(const String& url, const String& errorDescription);
+ void preflightFailure(unsigned long identifier, const String& url, const String& errorDescription);
void loadRequest(const ResourceRequest&, SecurityCheckPolicy);
bool isAllowedRedirect(const KURL&);
@@ -108,10 +109,6 @@
bool m_simpleRequest;
bool m_async;
OwnPtr<ResourceRequest> m_actualRequest; // non-null during Access Control preflight checks
-
-#if ENABLE(INSPECTOR)
- unsigned long m_preflightRequestIdentifier;
-#endif
};
} // namespace WebCore
Modified: tags/Safari-537.31.3/Source/WebCore/loader/ResourceLoader.cpp (143250 => 143251)
--- tags/Safari-537.31.3/Source/WebCore/loader/ResourceLoader.cpp 2013-02-18 20:08:40 UTC (rev 143250)
+++ tags/Safari-537.31.3/Source/WebCore/loader/ResourceLoader.cpp 2013-02-18 20:15:56 UTC (rev 143251)
@@ -235,14 +235,23 @@
ASSERT(!m_reachedTerminalState);
+ // We need a resource identifier for all requests, even if FrameLoader is never going to see it (such as with CORS preflight requests).
+ bool createdResourceIdentifier = false;
+ if (!m_identifier) {
+ m_identifier = m_frame->page()->progress()->createUniqueIdentifier();
+ createdResourceIdentifier = true;
+ }
+
if (m_options.sendLoadCallbacks == SendCallbacks) {
- if (!m_identifier) {
- m_identifier = m_frame->page()->progress()->createUniqueIdentifier();
+ if (createdResourceIdentifier)
frameLoader()->notifier()->assignIdentifierToInitialRequest(m_identifier, documentLoader(), request);
- }
frameLoader()->notifier()->willSendRequest(this, request, redirectResponse);
}
+#if ENABLE(INSPECTOR)
+ else
+ InspectorInstrumentation::willSendRequest(m_frame.get(), m_identifier, m_frame->loader()->documentLoader(), request, redirectResponse);
+#endif
if (!redirectResponse.isNull()) {
#if USE(PLATFORM_STRATEGIES)
Modified: tags/Safari-537.31.3/Source/WebCore/loader/TextTrackLoader.cpp (143250 => 143251)
--- tags/Safari-537.31.3/Source/WebCore/loader/TextTrackLoader.cpp 2013-02-18 20:08:40 UTC (rev 143250)
+++ tags/Safari-537.31.3/Source/WebCore/loader/TextTrackLoader.cpp 2013-02-18 20:15:56 UTC (rev 143251)
@@ -103,7 +103,8 @@
}
}
-void TextTrackLoader::didReceiveData(CachedResource* resource)
+// FIXME: This is a very unusual pattern, no other CachedResourceClient does this. Refactor to use notifyFinished() instead.
+void TextTrackLoader::deprecatedDidReceiveCachedResource(CachedResource* resource)
{
ASSERT(m_cachedCueData == resource);
Modified: tags/Safari-537.31.3/Source/WebCore/loader/TextTrackLoader.h (143250 => 143251)
--- tags/Safari-537.31.3/Source/WebCore/loader/TextTrackLoader.h 2013-02-18 20:08:40 UTC (rev 143250)
+++ tags/Safari-537.31.3/Source/WebCore/loader/TextTrackLoader.h 2013-02-18 20:15:56 UTC (rev 143251)
@@ -69,7 +69,7 @@
// CachedResourceClient
virtual void notifyFinished(CachedResource*);
- virtual void didReceiveData(CachedResource*);
+ virtual void deprecatedDidReceiveCachedResource(CachedResource*);
// WebVTTParserClient
virtual void newCuesParsed();
Modified: tags/Safari-537.31.3/Source/WebCore/loader/cache/CachedResourceClient.h (143250 => 143251)
--- tags/Safari-537.31.3/Source/WebCore/loader/cache/CachedResourceClient.h 2013-02-18 20:08:40 UTC (rev 143250)
+++ tags/Safari-537.31.3/Source/WebCore/loader/cache/CachedResourceClient.h 2013-02-18 20:15:56 UTC (rev 143251)
@@ -47,7 +47,7 @@
virtual ~CachedResourceClient() { }
virtual void notifyFinished(CachedResource*) { }
- virtual void didReceiveData(CachedResource*) { };
+ virtual void deprecatedDidReceiveCachedResource(CachedResource*) { }
static CachedResourceClientType expectedType() { return BaseResourceType; }
virtual CachedResourceClientType resourceClientType() const { return expectedType(); }
Modified: tags/Safari-537.31.3/Source/WebCore/loader/cache/CachedTextTrack.cpp (143250 => 143251)
--- tags/Safari-537.31.3/Source/WebCore/loader/cache/CachedTextTrack.cpp 2013-02-18 20:08:40 UTC (rev 143250)
+++ tags/Safari-537.31.3/Source/WebCore/loader/cache/CachedTextTrack.cpp 2013-02-18 20:15:56 UTC (rev 143251)
@@ -55,7 +55,7 @@
CachedResourceClientWalker<CachedResourceClient> walker(m_clients);
while (CachedResourceClient *client = walker.next())
- client->didReceiveData(this);
+ client->deprecatedDidReceiveCachedResource(this);
if (!allDataReceived)
return;
_______________________________________________ webkit-changes mailing list webkit-changes@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-changes