Title: [143251] tags/Safari-537.31.3/Source/WebCore

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

Reply via email to