[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

japhet at chromium.org japhet at chromium.org
Wed Dec 22 15:46:44 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 8fb63c9f75ece1a620fc150ae061cc0548ee9bfd
Author: japhet at chromium.org <japhet at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Fri Nov 12 05:17:14 2010 +0000

    2010-11-11  Nate Chapin  <japhet at chromium.org>
    
            Reviewed by Antti Koivisto.
    
            Test update for https://bugs.webkit.org/show_bug.cgi?id=49351,
            the timing of willSendRequest() calls will be slightly different.
    
            * platform/mac/security/block-test-expected.txt:
    2010-11-11  Nate Chapin  <japhet at chromium.org>
    
            Reviewed by Antti Koivisto.
    
            Cleanup after http://trac.webkit.org/changeset/71562, namely:
            Make deferred request handle simpler.
            Don't perform callbacks associated with network load starting
            (e.g., willSendRequest) until the load is in fact sent to the network.
            Make ResourceLoadScheduler a friend of ResourceLoader and make
            ResourceLoader::start() protected to try to ensure loads actually
            go through the scheduler.
            https://bugs.webkit.org/show_bug.cgi?id=49351
    
            Behavior should be covered by existing tests.
    
            * loader/NetscapePlugInStreamLoader.cpp:
            (WebCore::NetscapePlugInStreamLoader::create):
            * loader/ResourceLoadScheduler.cpp:
            (WebCore::ResourceLoadScheduler::servePendingRequests):
            * loader/ResourceLoadScheduler.h:
            (WebCore::ResourceLoadScheduler::HostInformation::limitRequests):
            * loader/ResourceLoader.cpp:
            (WebCore::ResourceLoader::init):
            (WebCore::ResourceLoader::start):
            (WebCore::ResourceLoader::setDefersLoading):
            (WebCore::ResourceLoader::didCancel):
            * loader/ResourceLoader.h:
            (WebCore::ResourceLoader::reachedTerminalState):
            (WebCore::ResourceLoader::request):
            * loader/SubresourceLoader.cpp:
            (WebCore::SubresourceLoader::create):
            * loader/loader.cpp:
            (WebCore::Loader::load):
            (WebCore::Loader::willSendRequest):
            * loader/loader.h:
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@71884 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 0a4fc1e..4ff2aae 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,12 @@
+2010-11-11  Nate Chapin  <japhet at chromium.org>
+
+        Reviewed by Antti Koivisto.
+
+        Test update for https://bugs.webkit.org/show_bug.cgi?id=49351,
+        the timing of willSendRequest() calls will be slightly different.
+
+        * platform/mac/security/block-test-expected.txt:
+
 2010-11-11  Carol Szabo <carol.szabo at nokia.com>
 
         Reviewed by Kent Tamura.
diff --git a/LayoutTests/platform/mac/security/block-test-expected.txt b/LayoutTests/platform/mac/security/block-test-expected.txt
index 56a5de2..14f074e 100644
--- a/LayoutTests/platform/mac/security/block-test-expected.txt
+++ b/LayoutTests/platform/mac/security/block-test-expected.txt
@@ -1,7 +1,7 @@
 http://255.255.255.255:1/test.jpg - willSendRequest <NSURLRequest URL http://255.255.255.255:1/test.jpg, main document URL block-test.html, http method GET> redirectResponse (null)
 <unknown> - didFinishLoading
-http://255.255.255.255:7/test.jpg - willSendRequest <NSURLRequest URL http://255.255.255.255:7/test.jpg, main document URL block-test.html, http method GET> redirectResponse (null)
 http://255.255.255.255:1/test.jpg - didFailLoadingWithError: <NSError domain WebKitErrorDomain, code 103, failing URL "http://255.255.255.255:1/test.jpg">
+http://255.255.255.255:7/test.jpg - willSendRequest <NSURLRequest URL http://255.255.255.255:7/test.jpg, main document URL block-test.html, http method GET> redirectResponse (null)
 http://255.255.255.255:7/test.jpg - didFailLoadingWithError: <NSError domain WebKitErrorDomain, code 103, failing URL "http://255.255.255.255:7/test.jpg">
 http://255.255.255.255:9/test.jpg - willSendRequest <NSURLRequest URL http://255.255.255.255:9/test.jpg, main document URL block-test.html, http method GET> redirectResponse (null)
 http://255.255.255.255:9/test.jpg - didFailLoadingWithError: <NSError domain WebKitErrorDomain, code 103, failing URL "http://255.255.255.255:9/test.jpg">
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 4318125..f58b0dc 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,39 @@
+2010-11-11  Nate Chapin  <japhet at chromium.org>
+
+        Reviewed by Antti Koivisto.
+
+        Cleanup after http://trac.webkit.org/changeset/71562, namely:
+        Make deferred request handle simpler.
+        Don't perform callbacks associated with network load starting
+        (e.g., willSendRequest) until the load is in fact sent to the network.
+        Make ResourceLoadScheduler a friend of ResourceLoader and make
+        ResourceLoader::start() protected to try to ensure loads actually
+        go through the scheduler.
+        https://bugs.webkit.org/show_bug.cgi?id=49351
+
+        Behavior should be covered by existing tests.
+
+        * loader/NetscapePlugInStreamLoader.cpp:
+        (WebCore::NetscapePlugInStreamLoader::create):
+        * loader/ResourceLoadScheduler.cpp:
+        (WebCore::ResourceLoadScheduler::servePendingRequests):
+        * loader/ResourceLoadScheduler.h:
+        (WebCore::ResourceLoadScheduler::HostInformation::limitRequests):
+        * loader/ResourceLoader.cpp:
+        (WebCore::ResourceLoader::init):
+        (WebCore::ResourceLoader::start):
+        (WebCore::ResourceLoader::setDefersLoading):
+        (WebCore::ResourceLoader::didCancel):
+        * loader/ResourceLoader.h:
+        (WebCore::ResourceLoader::reachedTerminalState):
+        (WebCore::ResourceLoader::request):
+        * loader/SubresourceLoader.cpp:
+        (WebCore::SubresourceLoader::create):
+        * loader/loader.cpp:
+        (WebCore::Loader::load):
+        (WebCore::Loader::willSendRequest):
+        * loader/loader.h:
+
 2010-11-11  Carol Szabo <carol.szabo at nokia.com>
 
         Reviewed by Kent Tamura.
diff --git a/WebCore/loader/NetscapePlugInStreamLoader.cpp b/WebCore/loader/NetscapePlugInStreamLoader.cpp
index c9725e9..8c2a426 100644
--- a/WebCore/loader/NetscapePlugInStreamLoader.cpp
+++ b/WebCore/loader/NetscapePlugInStreamLoader.cpp
@@ -49,7 +49,8 @@ PassRefPtr<NetscapePlugInStreamLoader> NetscapePlugInStreamLoader::create(Frame*
     RefPtr<NetscapePlugInStreamLoader> loader(adoptRef(new NetscapePlugInStreamLoader(frame, client)));
     loader->setShouldBufferData(false);
     loader->documentLoader()->addPlugInStreamLoader(loader.get());
-    return loader->load(request) ? loader.release() : 0;
+    loader->init(request);
+    return loader.release();
 }
 
 bool NetscapePlugInStreamLoader::isDone() const
diff --git a/WebCore/loader/ResourceLoadScheduler.cpp b/WebCore/loader/ResourceLoadScheduler.cpp
index ad04f12..f2bb0b5 100644
--- a/WebCore/loader/ResourceLoadScheduler.cpp
+++ b/WebCore/loader/ResourceLoadScheduler.cpp
@@ -179,7 +179,6 @@ void ResourceLoadScheduler::servePendingRequests(HostInformation* host, Priority
 
     for (int priority = High; priority >= minimumPriority; --priority) {
         HostInformation::RequestQueue& requestsPending = host->requestsPending((Priority) priority);
-        HostInformation::RequestQueue deferredRequests;
 
         while (!requestsPending.isEmpty()) {
             RefPtr<ResourceLoader> resourceLoader = requestsPending.first();
@@ -189,20 +188,14 @@ void ResourceLoadScheduler::servePendingRequests(HostInformation* host, Priority
             // and we don't know all stylesheets yet.
             Document* document = resourceLoader->frameLoader() ? resourceLoader->frameLoader()->frame()->document() : 0;
             bool shouldLimitRequests = !host->name().isNull() || (document && (document->parsing() || !document->haveStylesheetsLoaded()));
-            if (shouldLimitRequests && host->limitRequests()) {
-                while (!deferredRequests.isEmpty())
-                    requestsPending.append(deferredRequests.takeFirst());
+            if (shouldLimitRequests && host->limitRequests())
                 return;
-            }
 
-            if (resourceLoader->start())
+            resourceLoader->start();
+            if (!resourceLoader->reachedTerminalState())
                 host->addLoadInProgress(resourceLoader.get());
-            else
-                deferredRequests.append(resourceLoader);
             requestsPending.removeFirst();
         }
-
-        requestsPending.swap(deferredRequests);
     }
 }
 
@@ -233,29 +226,6 @@ void ResourceLoadScheduler::requestTimerFired(Timer<ResourceLoadScheduler>*)
     servePendingRequests();
 }
 
-#ifndef NDEBUG
-void ResourceLoadScheduler::assertLoaderBeingCounted(ResourceLoader* resourceLoader)
-{
-    HostInformation* host = hostForURL(resourceLoader->url());
-    ASSERT(host);
-    host->assertLoaderBeingCounted(resourceLoader);
-}
-
-void ResourceLoadScheduler::HostInformation::assertLoaderBeingCounted(ResourceLoader* resourceLoader)
-{
-    // If a load is being started, it should be at the front of the highest priority queue
-    // that actually contains a request.
-    for (int priority = High; priority >= VeryLow; --priority) {  
-        if (!m_requestsPending[priority].isEmpty()) {
-            ASSERT(m_requestsPending[priority].first().get() == resourceLoader);
-            return;
-        }
-    }
-
-    ASSERT_NOT_REACHED();
-}
-#endif
-
 ResourceLoadScheduler::HostInformation::HostInformation(const String& name, unsigned maxRequestsInFlight)
     : m_name(name)
     , m_maxRequestsInFlight(maxRequestsInFlight)
diff --git a/WebCore/loader/ResourceLoadScheduler.h b/WebCore/loader/ResourceLoadScheduler.h
index 511c1a1..11951b4 100644
--- a/WebCore/loader/ResourceLoadScheduler.h
+++ b/WebCore/loader/ResourceLoadScheduler.h
@@ -57,10 +57,6 @@ public:
     void servePendingRequests(Priority minimumPriority = VeryLow);
     void suspendPendingRequests();
     void resumePendingRequests();
-    
-#ifndef NDEBUG
-    void assertLoaderBeingCounted(ResourceLoader*);
-#endif
 
 private:
     ResourceLoadScheduler();
@@ -81,10 +77,6 @@ private:
         void remove(ResourceLoader*);
         bool hasRequests() const;
         bool limitRequests() const { return m_requestsLoading.size() >= m_maxRequestsInFlight; }
-        
-#ifndef NDEBUG
-        void assertLoaderBeingCounted(ResourceLoader*);
-#endif
 
         typedef Deque<RefPtr<ResourceLoader> > RequestQueue;
         RequestQueue& requestsPending(Priority priority) { return m_requestsPending[priority]; }
diff --git a/WebCore/loader/ResourceLoader.cpp b/WebCore/loader/ResourceLoader.cpp
index 56a169b..39288bd 100644
--- a/WebCore/loader/ResourceLoader.cpp
+++ b/WebCore/loader/ResourceLoader.cpp
@@ -110,9 +110,10 @@ void ResourceLoader::releaseResources()
     m_deferredRequest = ResourceRequest();
 }
 
-bool ResourceLoader::load(const ResourceRequest& r)
+void ResourceLoader::init(const ResourceRequest& r)
 {
     ASSERT(!m_handle);
+    ASSERT(m_request.isNull());
     ASSERT(m_deferredRequest.isNull());
     ASSERT(!m_documentLoader->isSubstituteLoadPending(this));
     
@@ -128,39 +129,36 @@ bool ResourceLoader::load(const ResourceRequest& r)
             clientRequest.setFirstPartyForCookies(document->firstPartyForCookies());
     }
 
-    willSendRequest(clientRequest, ResourceResponse());
-    if (clientRequest.isNull()) {
-        didFail(frameLoader()->cancelledError(r));
-        return false;
-    }
-
-    if (m_defersLoading)
-        m_deferredRequest = clientRequest;
-
-    return true;
+    m_request = clientRequest;
 }
 
-bool ResourceLoader::start()
+void ResourceLoader::start()
 {
     ASSERT(!m_handle);
-#ifndef NDEBUG
-    resourceLoadScheduler()->assertLoaderBeingCounted(this);
-#endif
+    ASSERT(!m_request.isNull());
+    ASSERT(m_deferredRequest.isNull());
+
+    willSendRequest(m_request, ResourceResponse());
+    if (m_request.isNull()) {
+        didFail(frameLoader()->cancelledError(m_request));
+        return;
+    }    
     
     if (m_documentLoader->scheduleArchiveLoad(this, m_request, m_request.url()))
-        return true;
+        return;
     
 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
     if (m_documentLoader->applicationCacheHost()->maybeLoadResource(this, m_request, m_request.url()))
-        return true;
+        return;
 #endif
 
-    if (m_defersLoading)
-        return false;
+    if (m_defersLoading) {
+        m_deferredRequest = m_request;
+        return;
+    }
 
     if (!m_reachedTerminalState)
         m_handle = ResourceHandle::create(m_frame->loader()->networkingContext(), m_request, this, m_defersLoading, m_shouldContentSniff);
-    return true;
 }
 
 void ResourceLoader::setDefersLoading(bool defers)
@@ -169,9 +167,9 @@ void ResourceLoader::setDefersLoading(bool defers)
     if (m_handle)
         m_handle->setDefersLoading(defers);
     if (!defers && !m_deferredRequest.isNull()) {
-        ResourceRequest request(m_deferredRequest);
+        m_request = m_deferredRequest;
         m_deferredRequest = ResourceRequest();
-        load(request);
+        start();
     }
 }
 
@@ -359,7 +357,7 @@ void ResourceLoader::didCancel(const ResourceError& error)
         m_handle->cancel();
         m_handle = 0;
     }
-    if (m_sendResourceLoadCallbacks && !m_calledDidFinishLoad)
+    if (m_sendResourceLoadCallbacks && m_identifier && !m_calledDidFinishLoad)
         frameLoader()->notifier()->didFailToLoad(this, error);
 
     releaseResources();
diff --git a/WebCore/loader/ResourceLoader.h b/WebCore/loader/ResourceLoader.h
index 9b69ccd..34cdd97 100644
--- a/WebCore/loader/ResourceLoader.h
+++ b/WebCore/loader/ResourceLoader.h
@@ -54,7 +54,7 @@ namespace WebCore {
 
         void cancel();
 
-        virtual bool load(const ResourceRequest&);
+        virtual void init(const ResourceRequest&);
 
         FrameLoader* frameLoader() const;
         DocumentLoader* documentLoader() const { return m_documentLoader.get(); }
@@ -126,8 +126,7 @@ namespace WebCore {
         ResourceHandle* handle() const { return m_handle.get(); }
         bool sendResourceLoadCallbacks() const { return m_sendResourceLoadCallbacks; }
 
-        // Called by ResourceLoadScheduler to create a ResourceHandle and actually begin the load.
-        bool start();
+        bool reachedTerminalState() const { return m_reachedTerminalState; }
 
         void setShouldBufferData(bool shouldBufferData);
 
@@ -137,12 +136,15 @@ namespace WebCore {
 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
         friend class ApplicationCacheHost;  // for access to request()
 #endif
-
+        friend class ResourceLoadScheduler; // for access to start()
+        // start() actually sends the load to the network (unless the load is being 
+        // deferred) and should only be called by ResourceLoadScheduler or setDefersLoading().
+        void start();
+        
         virtual void didCancel(const ResourceError&);
         void didFinishLoadingOnePart(double finishTime);
 
         const ResourceRequest& request() const { return m_request; }
-        bool reachedTerminalState() const { return m_reachedTerminalState; }
         bool cancelled() const { return m_cancelled; }
         bool defersLoading() const { return m_defersLoading; }
 
diff --git a/WebCore/loader/SubresourceLoader.cpp b/WebCore/loader/SubresourceLoader.cpp
index 7e1ea8b..e99e0e6 100644
--- a/WebCore/loader/SubresourceLoader.cpp
+++ b/WebCore/loader/SubresourceLoader.cpp
@@ -86,8 +86,7 @@ PassRefPtr<SubresourceLoader> SubresourceLoader::create(Frame* frame, Subresourc
 
     RefPtr<SubresourceLoader> subloader(adoptRef(new SubresourceLoader(frame, client, sendResourceLoadCallbacks, shouldContentSniff)));
     subloader->documentLoader()->addSubresourceLoader(subloader.get());
-    if (!subloader->load(newRequest))
-        return 0;
+    subloader->init(newRequest);
 
     return subloader.release();
 }
diff --git a/WebCore/loader/loader.cpp b/WebCore/loader/loader.cpp
index 05ad7db..3b9af7a 100644
--- a/WebCore/loader/loader.cpp
+++ b/WebCore/loader/loader.cpp
@@ -130,11 +130,10 @@ void Loader::load(CachedResourceLoader* cachedResourceLoader, CachedResource* re
 
     RefPtr<SubresourceLoader> loader = resourceLoadScheduler()->scheduleSubresourceLoad(cachedResourceLoader->document()->frame(),
         this, resourceRequest, determinePriority(resource), request->shouldDoSecurityCheck(), request->sendResourceLoadCallbacks());
-    if (loader) {
+    if (loader && !loader->reachedTerminalState())
         m_requestsLoading.add(loader.release(), request);
-        request->cachedResource()->setRequestedFromNetworkingLayer();
-    } else {
-        // FIXME: What if resources in other frames were waiting for this revalidation? 
+    else {
+        // FIXME: What if resources in other frames were waiting for this revalidation?
         LOG(ResourceLoading, "Cannot start loading '%s'", request->cachedResource()->url().latin1().data());             
         cachedResourceLoader->decrementRequestCount(request->cachedResource());
         cachedResourceLoader->setLoadInProgress(true);
@@ -164,6 +163,16 @@ void Loader::cancelRequests(CachedResourceLoader* cachedResourceLoader)
     }
 }
 
+void Loader::willSendRequest(SubresourceLoader* loader, ResourceRequest&, const ResourceResponse&)
+{
+    RequestMap::iterator i = m_requestsLoading.find(loader);
+    if (i == m_requestsLoading.end())
+        return;
+    
+    Request* request = i->second;
+    request->cachedResource()->setRequestedFromNetworkingLayer();
+}
+
 void Loader::didFinishLoading(SubresourceLoader* loader)
 {
     RequestMap::iterator i = m_requestsLoading.find(loader);
diff --git a/WebCore/loader/loader.h b/WebCore/loader/loader.h
index 36c8ed3..818f56f 100644
--- a/WebCore/loader/loader.h
+++ b/WebCore/loader/loader.h
@@ -43,6 +43,7 @@ namespace WebCore {
         void cancelRequests(CachedResourceLoader*);
 
     private:
+        virtual void willSendRequest(SubresourceLoader*, ResourceRequest&, const ResourceResponse&);
         virtual void didReceiveResponse(SubresourceLoader*, const ResourceResponse&);
         virtual void didReceiveData(SubresourceLoader*, const char*, int);
         virtual void didReceiveCachedMetadata(SubresourceLoader*, const char*, int);

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list