1 /* 2 * Copyright (C) 2008 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include "config.h" 30 #include "ArchiveResourceCollection.h" 31 32 namespace WebCore { 33 34 ArchiveResourceCollection::ArchiveResourceCollection() 35 { 36 } 37 38 void ArchiveResourceCollection::addAllResources(Archive* archive) 39 { 40 ASSERT(archive); 41 if (!archive) 42 return; 43 44 const Vector<RefPtr<ArchiveResource> >& subresources = archive->subresources(); 45 Vector<RefPtr<ArchiveResource> >::const_iterator iRes = subresources.begin(); 46 Vector<RefPtr<ArchiveResource> >::const_iterator endRes = subresources.end(); 47 48 for (; iRes != endRes; ++iRes) 49 m_subresources.set((*iRes)->url(), iRes->get()); 50 51 const Vector<RefPtr<Archive> >& subframes = archive->subframeArchives(); 52 Vector<RefPtr<Archive> >::const_iterator iFrame = subframes.begin(); 53 Vector<RefPtr<Archive> >::const_iterator endFrame = subframes.end(); 54 55 for (; iFrame != endFrame; ++iFrame) { 56 ASSERT((*iFrame)->mainResource()); 57 const String& frameName = (*iFrame)->mainResource()->frameName(); 58 if (!frameName.isNull()) 59 m_subframes.set(frameName, iFrame->get()); 60 } 61 } 62 63 // FIXME: Adding a resource directly to a DocumentLoader/ArchiveResourceCollection seems like bad design, but is API some apps rely on. 64 // Can we change the design in a manner that will let us deprecate that API without reducing functionality of those apps? 65 void ArchiveResourceCollection::addResource(PassRefPtr<ArchiveResource> resource) 66 { 67 ASSERT(resource); 68 if (!resource) 69 return; 70 71 const KURL& url = resource->url(); // get before passing PassRefPtr (which sets it to 0) 72 m_subresources.set(url, resource); 73 } 74 75 ArchiveResource* ArchiveResourceCollection::archiveResourceForURL(const KURL& url) 76 { 77 ArchiveResource* resource = m_subresources.get(url).get(); 78 if (!resource) 79 return 0; 80 81 return resource; 82 } 83 84 PassRefPtr<Archive> ArchiveResourceCollection::popSubframeArchive(const String& frameName) 85 { 86 return m_subframes.take(frameName); 87 } 88 89 } 90