2007-03-27 Oliver Hunt <oliver@apple.com>
authoroliver <oliver@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Mar 2007 10:02:45 +0000 (10:02 +0000)
committeroliver <oliver@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Mar 2007 10:02:45 +0000 (10:02 +0000)
        Reviewed by Maciej.

        The WebArchiver needs all the subresources of a document to be accessible
        through the DocLoader, so we can't remove a CachedResource simultaneously
        from the global Cache and all DocLoaders, just because it needs to be
        reloaded in one.

        Fixes rdar://problem/5044366

        * loader/Cache.cpp:
        (WebCore::Cache::remove):
           Don't evict the resource from all DocLoaders
        * manual-tests/test-iframes-loading-the-same-resource.html: Added.
           Alas it wasn't possible to make a nice layout test, even this manual test
           is not entirely deterministic

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@20511 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/loader/Cache.cpp
WebCore/manual-tests/test-iframes-loading-the-same-resource.html [new file with mode: 0644]

index 50c2977b99d1f99da47c636b0c5f6a3a31003536..9cf31264fc93f61e83f3139b48b71e7be8d3de74 100644 (file)
@@ -1,3 +1,21 @@
+2007-03-27  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Maciej.
+
+        The WebArchiver needs all the subresources of a document to be accessible
+        through the DocLoader, so we can't remove a CachedResource simultaneously
+        from the global Cache and all DocLoaders, just because it needs to be 
+        reloaded in one.
+
+        Fixes rdar://problem/5044366
+
+        * loader/Cache.cpp:
+        (WebCore::Cache::remove):
+           Don't evict the resource from all DocLoaders
+        * manual-tests/test-iframes-loading-the-same-resource.html: Added.
+           Alas it wasn't possible to make a nice layout test, even this manual test
+           is not entirely deterministic
+
 2007-03-27  Mark Rowe  <mrowe@apple.com>
 
         Build fix.
index 20a9e3475f625c892ed637680da01515a0786edd..0e222aae0a44fc65be6d5cc74e9f178f3d35371a 100644 (file)
@@ -233,12 +233,9 @@ void Cache::remove(CachedResource* resource)
         if (resource->referenced())
             removeFromLiveResourcesList(resource);
         
-        // Notify all doc loaders that might be observing this object still that it has been
-        // extracted from the set of resources.
-        HashSet<DocLoader*>::iterator end = m_docLoaders.end();
-        for (HashSet<DocLoader*>::iterator itr = m_docLoaders.begin(); itr != end; ++itr)
-            (*itr)->removeCachedResource(resource);
-
+        // FIXME: Multiple DocLoaders may still be holding the resource at this point
+        // effectively resulting in an invisible CachedResource
+        
         // Subtract from our size totals.
         int delta = -resource->size();
         if (delta)
diff --git a/WebCore/manual-tests/test-iframes-loading-the-same-resource.html b/WebCore/manual-tests/test-iframes-loading-the-same-resource.html
new file mode 100644 (file)
index 0000000..462db02
--- /dev/null
@@ -0,0 +1,19 @@
+<html>
+<head>
+<script>
+    setTimeout('document.getElementById("frame2").src = "resources/test-frame.html";', 100);
+    loadCount = 0
+    function frame2Loaded() {
+        if (loadCount < 40) {
+            setTimeout('document.getElementById("frame2").src = "resources/test-frame.html?'+loadCount+'";', 100);
+            loadCount++;
+        } 
+    }
+</script>
+</head>
+<body>
+    To perform this test attempt to drag one of the apple images in the left frame while the right frame is doing loads.  This test is not entirely deterministic so it should be attempted a number of times. <br />
+<iframe id="frame1" src="resources/test-frame.html"></iframe>
+<iframe id="frame2" onload="frame2Loaded();"></iframe>
+</body>
+</html>