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 "platform/mhtml/ArchiveResourceCollection.h" 31 32 #include "platform/mhtml/ArchiveResource.h" 33 #include "platform/mhtml/MHTMLArchive.h" 34 #include "platform/weborigin/KURL.h" 35 36 namespace blink { 37 38 ArchiveResourceCollection::ArchiveResourceCollection() 39 { 40 } 41 42 ArchiveResourceCollection::~ArchiveResourceCollection() 43 { 44 } 45 46 void ArchiveResourceCollection::addAllResources(MHTMLArchive* archive) 47 { 48 ASSERT(archive); 49 if (!archive) 50 return; 51 52 const MHTMLArchive::SubArchiveResources& subresources = archive->subresources(); 53 for (MHTMLArchive::SubArchiveResources::const_iterator iterator = subresources.begin(); iterator != subresources.end(); ++iterator) 54 m_subresources.set((*iterator)->url(), iterator->get()); 55 56 const MHTMLArchive::SubFrameArchives& subframes = archive->subframeArchives(); 57 for (MHTMLArchive::SubFrameArchives::const_iterator iterator = subframes.begin(); iterator != subframes.end(); ++iterator) { 58 RefPtrWillBeRawPtr<MHTMLArchive> archive = *iterator; 59 ASSERT(archive->mainResource()); 60 61 const String& frameName = archive->mainResource()->frameName(); 62 if (!frameName.isNull()) { 63 m_subframes.set(frameName, archive.get()); 64 } else { 65 // In the MHTML case, frames don't have a name so we use the URL instead. 66 m_subframes.set(archive->mainResource()->url().string(), archive.get()); 67 } 68 } 69 } 70 71 // FIXME: Adding a resource directly to a DocumentLoader/ArchiveResourceCollection seems like bad design, but is API some apps rely on. 72 // Can we change the design in a manner that will let us deprecate that API without reducing functionality of those apps? 73 void ArchiveResourceCollection::addResource(PassRefPtrWillBeRawPtr<ArchiveResource> resource) 74 { 75 ASSERT(resource); 76 if (!resource) 77 return; 78 79 const KURL& url = resource->url(); // get before passing PassRefPtr (which sets it to 0) 80 m_subresources.set(url, resource); 81 } 82 83 ArchiveResource* ArchiveResourceCollection::archiveResourceForURL(const KURL& url) 84 { 85 ArchiveResource* resource = m_subresources.get(url); 86 if (!resource) 87 return 0; 88 89 return resource; 90 } 91 92 PassRefPtrWillBeRawPtr<MHTMLArchive> ArchiveResourceCollection::popSubframeArchive(const String& frameName, const KURL& url) 93 { 94 RefPtrWillBeRawPtr<MHTMLArchive> archive = m_subframes.take(frameName); 95 if (archive) 96 return archive.release(); 97 98 return m_subframes.take(url.string()); 99 } 100 101 void ArchiveResourceCollection::trace(Visitor* visitor) 102 { 103 #if ENABLE(OILPAN) 104 visitor->trace(m_subresources); 105 visitor->trace(m_subframes); 106 #endif 107 } 108 109 } 110