diff options
Diffstat (limited to 'WebCore/loader/archive/cf/LegacyWebArchive.cpp')
-rw-r--r-- | WebCore/loader/archive/cf/LegacyWebArchive.cpp | 562 |
1 files changed, 0 insertions, 562 deletions
diff --git a/WebCore/loader/archive/cf/LegacyWebArchive.cpp b/WebCore/loader/archive/cf/LegacyWebArchive.cpp deleted file mode 100644 index 9d99588..0000000 --- a/WebCore/loader/archive/cf/LegacyWebArchive.cpp +++ /dev/null @@ -1,562 +0,0 @@ -/* - * Copyright (C) 2008 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "LegacyWebArchive.h" - -#include "CString.h" -#include "Document.h" -#include "DocumentLoader.h" -#include "Frame.h" -#include "FrameLoader.h" -#include "FrameTree.h" -#include "HTMLFrameOwnerElement.h" -#include "HTMLNames.h" -#include "KURL.h" -#include "Logging.h" -#include "markup.h" -#include "Node.h" -#include "Range.h" -#include "SelectionController.h" -#include "SharedBuffer.h" - -#include <wtf/RetainPtr.h> - -namespace WebCore { - -static const CFStringRef LegacyWebArchiveMainResourceKey = CFSTR("WebMainResource"); -static const CFStringRef LegacyWebArchiveSubresourcesKey = CFSTR("WebSubresources"); -static const CFStringRef LegacyWebArchiveSubframeArchivesKey = CFSTR("WebSubframeArchives"); -static const CFStringRef LegacyWebArchiveResourceDataKey = CFSTR("WebResourceData"); -static const CFStringRef LegacyWebArchiveResourceFrameNameKey = CFSTR("WebResourceFrameName"); -static const CFStringRef LegacyWebArchiveResourceMIMETypeKey = CFSTR("WebResourceMIMEType"); -static const CFStringRef LegacyWebArchiveResourceURLKey = CFSTR("WebResourceURL"); -static const CFStringRef LegacyWebArchiveResourceTextEncodingNameKey = CFSTR("WebResourceTextEncodingName"); -static const CFStringRef LegacyWebArchiveResourceResponseKey = CFSTR("WebResourceResponse"); -static const CFStringRef LegacyWebArchiveResourceResponseVersionKey = CFSTR("WebResourceResponseVersion"); - -static RetainPtr<CFDictionaryRef> createPropertyListRepresentationFromResource(ArchiveResource* resource, bool mainResource) -{ - if (!resource) { - // The property list representation of a null/empty WebResource has the following 3 objects stored as nil - RetainPtr<CFMutableDictionaryRef> propertyList(AdoptCF, CFDictionaryCreateMutable(0, 3, 0, 0)); - CFDictionarySetValue(propertyList.get(), LegacyWebArchiveResourceDataKey, 0); - CFDictionarySetValue(propertyList.get(), LegacyWebArchiveResourceURLKey, 0); - CFDictionarySetValue(propertyList.get(), LegacyWebArchiveResourceMIMETypeKey, 0); - - return propertyList; - } - - RetainPtr<CFMutableDictionaryRef> propertyList(AdoptCF, CFDictionaryCreateMutable(0, 6, 0, &kCFTypeDictionaryValueCallBacks)); - - // Resource data can be empty, but must be represented by an empty CFDataRef - SharedBuffer* data = resource->data(); - RetainPtr<CFDataRef> cfData; - if (data) - cfData.adoptCF(data->createCFData()); - else - cfData.adoptCF(CFDataCreate(0, 0, 0)); - CFDictionarySetValue(propertyList.get(), LegacyWebArchiveResourceDataKey, cfData.get()); - - // Resource URL cannot be null - RetainPtr<CFStringRef> cfURL(AdoptCF, resource->url().string().createCFString()); - if (cfURL) - CFDictionarySetValue(propertyList.get(), LegacyWebArchiveResourceURLKey, cfURL.get()); - else { - LOG(Archives, "LegacyWebArchive - NULL resource URL is invalid - returning null property list"); - return 0; - } - - // FrameName should be left out if empty for subresources, but always included for main resources - const String& frameName(resource->frameName()); - if (!frameName.isEmpty() || mainResource) { - RetainPtr<CFStringRef> cfFrameName(AdoptCF, frameName.createCFString()); - CFDictionarySetValue(propertyList.get(), LegacyWebArchiveResourceFrameNameKey, cfFrameName.get()); - } - - // Set MIMEType, TextEncodingName, and ResourceResponse only if they actually exist - const String& mimeType(resource->mimeType()); - if (!mimeType.isEmpty()) { - RetainPtr<CFStringRef> cfMIMEType(AdoptCF, mimeType.createCFString()); - CFDictionarySetValue(propertyList.get(), LegacyWebArchiveResourceMIMETypeKey, cfMIMEType.get()); - } - - const String& textEncoding(resource->textEncoding()); - if (!textEncoding.isEmpty()) { - RetainPtr<CFStringRef> cfTextEncoding(AdoptCF, textEncoding.createCFString()); - CFDictionarySetValue(propertyList.get(), LegacyWebArchiveResourceTextEncodingNameKey, cfTextEncoding.get()); - } - - // Don't include the resource response for the main resource - if (!mainResource) { - RetainPtr<CFDataRef> resourceResponseData = propertyListDataFromResourceResponse(resource->response()); - if (resourceResponseData) - CFDictionarySetValue(propertyList.get(), LegacyWebArchiveResourceResponseKey, resourceResponseData.get()); - } - - return propertyList; -} - -static RetainPtr<CFDictionaryRef> createPropertyListRep(Archive* archive) -{ - RetainPtr<CFMutableDictionaryRef> propertyList(AdoptCF, CFDictionaryCreateMutable(0, 3, 0, &kCFTypeDictionaryValueCallBacks)); - - RetainPtr<CFDictionaryRef> mainResourceDict = createPropertyListRepresentationFromResource(archive->mainResource(), true); - if (!mainResourceDict) - return 0; - CFDictionarySetValue(propertyList.get(), LegacyWebArchiveMainResourceKey, mainResourceDict.get()); - - RetainPtr<CFMutableArrayRef> subresourcesArray(AdoptCF, CFArrayCreateMutable(0, archive->subresources().size(), &kCFTypeArrayCallBacks)); - const Vector<RefPtr<ArchiveResource> >& subresources(archive->subresources()); - for (unsigned i = 0; i < subresources.size(); ++i) { - RetainPtr<CFDictionaryRef> subresource = createPropertyListRepresentationFromResource(subresources[i].get(), false); - if (subresource) - CFArrayAppendValue(subresourcesArray.get(), subresource.get()); - else - LOG(Archives, "LegacyWebArchive - Failed to create property list for subresource"); - } - if (CFArrayGetCount(subresourcesArray.get())) - CFDictionarySetValue(propertyList.get(), LegacyWebArchiveSubresourcesKey, subresourcesArray.get()); - - RetainPtr<CFMutableArrayRef> subframesArray(AdoptCF, CFArrayCreateMutable(0, archive->subframeArchives().size(), &kCFTypeArrayCallBacks)); - const Vector<RefPtr<Archive> >& subframeArchives(archive->subframeArchives()); - for (unsigned i = 0; i < subframeArchives.size(); ++i) { - RetainPtr<CFDictionaryRef> subframeArchive = createPropertyListRep(subframeArchives[i].get()); - if (subframeArchive) - CFArrayAppendValue(subframesArray.get(), subframeArchive.get()); - else - LOG(Archives, "LegacyWebArchive - Failed to create property list for subframe archive"); - } - if (CFArrayGetCount(subframesArray.get())) - CFDictionarySetValue(propertyList.get(), LegacyWebArchiveSubframeArchivesKey, subframesArray.get()); - - return propertyList; -} - -static ResourceResponse createResourceResponseFromPropertyListData(CFDataRef data, CFStringRef responseDataType) -{ - ASSERT(data); - if (!data) - return ResourceResponse(); - - // If the ResourceResponseVersion (passed in as responseDataType) exists at all, this is a "new" webarchive that we can parse well in a cross platform manner - // If it doesn't exist, we will assume this is an "old" Cocoa-based WebArchive, and parse the ResourceResponse as such - if (!responseDataType) - return createResourceResponseFromMacArchivedData(data); - - // FIXME: Parse the "new" format that the above comment references here - return ResourceResponse(); -} - -static PassRefPtr<ArchiveResource> createResource(CFDictionaryRef dictionary) -{ - ASSERT(dictionary); - if (!dictionary) - return 0; - - CFDataRef resourceData = static_cast<CFDataRef>(CFDictionaryGetValue(dictionary, LegacyWebArchiveResourceDataKey)); - if (resourceData && CFGetTypeID(resourceData) != CFDataGetTypeID()) { - LOG(Archives, "LegacyWebArchive - Resource data is not of type CFData, cannot create invalid resource"); - return 0; - } - - CFStringRef frameName = static_cast<CFStringRef>(CFDictionaryGetValue(dictionary, LegacyWebArchiveResourceFrameNameKey)); - if (frameName && CFGetTypeID(frameName) != CFStringGetTypeID()) { - LOG(Archives, "LegacyWebArchive - Frame name is not of type CFString, cannot create invalid resource"); - return 0; - } - - CFStringRef mimeType = static_cast<CFStringRef>(CFDictionaryGetValue(dictionary, LegacyWebArchiveResourceMIMETypeKey)); - if (mimeType && CFGetTypeID(mimeType) != CFStringGetTypeID()) { - LOG(Archives, "LegacyWebArchive - MIME type is not of type CFString, cannot create invalid resource"); - return 0; - } - - CFStringRef url = static_cast<CFStringRef>(CFDictionaryGetValue(dictionary, LegacyWebArchiveResourceURLKey)); - if (url && CFGetTypeID(url) != CFStringGetTypeID()) { - LOG(Archives, "LegacyWebArchive - URL is not of type CFString, cannot create invalid resource"); - return 0; - } - - CFStringRef textEncoding = static_cast<CFStringRef>(CFDictionaryGetValue(dictionary, LegacyWebArchiveResourceTextEncodingNameKey)); - if (textEncoding && CFGetTypeID(textEncoding) != CFStringGetTypeID()) { - LOG(Archives, "LegacyWebArchive - Text encoding is not of type CFString, cannot create invalid resource"); - return 0; - } - - ResourceResponse response; - - CFDataRef resourceResponseData = static_cast<CFDataRef>(CFDictionaryGetValue(dictionary, LegacyWebArchiveResourceResponseKey)); - if (resourceResponseData) { - if (CFGetTypeID(resourceResponseData) != CFDataGetTypeID()) { - LOG(Archives, "LegacyWebArchive - Resource response data is not of type CFData, cannot create invalid resource"); - return 0; - } - - CFStringRef resourceResponseVersion = static_cast<CFStringRef>(CFDictionaryGetValue(dictionary, LegacyWebArchiveResourceResponseVersionKey)); - if (resourceResponseVersion && CFGetTypeID(resourceResponseVersion) != CFStringGetTypeID()) { - LOG(Archives, "LegacyWebArchive - Resource response version is not of type CFString, cannot create invalid resource"); - return 0; - } - - response = createResourceResponseFromPropertyListData(resourceResponseData, resourceResponseVersion); - } - - return ArchiveResource::create(SharedBuffer::create(CFDataGetBytePtr(resourceData), CFDataGetLength(resourceData)), KURL(url), mimeType, textEncoding, frameName, response); -} - -PassRefPtr<LegacyWebArchive> LegacyWebArchive::create() -{ - return adoptRef(new LegacyWebArchive); -} - -PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(SharedBuffer* data) -{ - LOG(Archives, "LegacyWebArchive - Creating from raw data"); - - RefPtr<LegacyWebArchive> archive = create(); - if (!archive->init(data)) - return 0; - - return archive.release(); -} - -PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(PassRefPtr<ArchiveResource> mainResource, Vector<PassRefPtr<ArchiveResource> >& subresources, Vector<PassRefPtr<LegacyWebArchive> >& subframeArchives) -{ - ASSERT(mainResource); - if (!mainResource) - return 0; - - RefPtr<LegacyWebArchive> archive = create(); - archive->setMainResource(mainResource); - - for (unsigned i = 0; i < subresources.size(); ++i) - archive->addSubresource(subresources[i]); - - for (unsigned i = 0; i < subframeArchives.size(); ++i) - archive->addSubframeArchive(subframeArchives[i]); - - return archive.release(); -} - -LegacyWebArchive::LegacyWebArchive() -{ -} - -bool LegacyWebArchive::init(SharedBuffer* data) -{ - ASSERT(data); - if (!data) - return false; - - RetainPtr<CFDataRef> cfData(AdoptCF, data->createCFData()); - if (!cfData) - return false; - - CFStringRef errorString = 0; - - RetainPtr<CFDictionaryRef> plist(AdoptCF, static_cast<CFDictionaryRef>(CFPropertyListCreateFromXMLData(0, cfData.get(), kCFPropertyListImmutable, &errorString))); - if (!plist) { -#ifndef NDEBUG - const char* cError = errorString ? CFStringGetCStringPtr(errorString, kCFStringEncodingUTF8) : "unknown error"; - LOG(Archives, "LegacyWebArchive - Error parsing PropertyList from archive data - %s", cError); -#endif - if (errorString) - CFRelease(errorString); - return false; - } - - if (CFGetTypeID(plist.get()) != CFDictionaryGetTypeID()) { - LOG(Archives, "LegacyWebArchive - Archive property list is not the expected CFDictionary, aborting invalid WebArchive"); - return false; - } - - return extract(plist.get()); -} - -bool LegacyWebArchive::extract(CFDictionaryRef dictionary) -{ - ASSERT(dictionary); - if (!dictionary) { - LOG(Archives, "LegacyWebArchive - Null root CFDictionary, aborting invalid WebArchive"); - return false; - } - - CFDictionaryRef mainResourceDict = static_cast<CFDictionaryRef>(CFDictionaryGetValue(dictionary, LegacyWebArchiveMainResourceKey)); - if (!mainResourceDict) { - LOG(Archives, "LegacyWebArchive - No main resource in archive, aborting invalid WebArchive"); - return false; - } - if (CFGetTypeID(mainResourceDict) != CFDictionaryGetTypeID()) { - LOG(Archives, "LegacyWebArchive - Main resource is not the expected CFDictionary, aborting invalid WebArchive"); - return false; - } - - setMainResource(createResource(mainResourceDict)); - if (!mainResource()) { - LOG(Archives, "LegacyWebArchive - Failed to parse main resource from CFDictionary or main resource does not exist, aborting invalid WebArchive"); - return false; - } - - CFArrayRef subresourceArray = static_cast<CFArrayRef>(CFDictionaryGetValue(dictionary, LegacyWebArchiveSubresourcesKey)); - if (subresourceArray && CFGetTypeID(subresourceArray) != CFArrayGetTypeID()) { - LOG(Archives, "LegacyWebArchive - Subresources is not the expected Array, aborting invalid WebArchive"); - return false; - } - - if (subresourceArray) { - CFIndex count = CFArrayGetCount(subresourceArray); - for (CFIndex i = 0; i < count; ++i) { - CFDictionaryRef subresourceDict = static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(subresourceArray, i)); - if (CFGetTypeID(subresourceDict) != CFDictionaryGetTypeID()) { - LOG(Archives, "LegacyWebArchive - Subresource is not expected CFDictionary, aborting invalid WebArchive"); - return false; - } - addSubresource(createResource(subresourceDict)); - } - } - - CFArrayRef subframeArray = static_cast<CFArrayRef>(CFDictionaryGetValue(dictionary, LegacyWebArchiveSubframeArchivesKey)); - if (subframeArray && CFGetTypeID(subframeArray) != CFArrayGetTypeID()) { - LOG(Archives, "LegacyWebArchive - Subframe archives is not the expected Array, aborting invalid WebArchive"); - return false; - } - - if (subframeArray) { - CFIndex count = CFArrayGetCount(subframeArray); - for (CFIndex i = 0; i < count; ++i) { - CFDictionaryRef subframeDict = static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(subframeArray, i)); - if (CFGetTypeID(subframeDict) != CFDictionaryGetTypeID()) { - LOG(Archives, "LegacyWebArchive - Subframe array is not expected CFDictionary, aborting invalid WebArchive"); - return false; - } - - RefPtr<LegacyWebArchive> subframeArchive = create(); - if (subframeArchive->extract(subframeDict)) - addSubframeArchive(subframeArchive.release()); - else - LOG(Archives, "LegacyWebArchive - Invalid subframe archive skipped"); - } - } - - return true; -} - -RetainPtr<CFDataRef> LegacyWebArchive::rawDataRepresentation() -{ - RetainPtr<CFDictionaryRef> propertyList = createPropertyListRep(this); - if (!propertyList) { - LOG(Archives, "LegacyWebArchive - Failed to create property list for archive, returning no data"); - return 0; - } - - // FIXME: On Mac, WebArchives have been written out as Binary Property Lists until this change. - // Unless we jump through CFWriteStream hoops, they'll now be textual XML data. Is this okay? - RetainPtr<CFDataRef> plistData(AdoptCF, CFPropertyListCreateXMLData(0, propertyList.get())); - if (!plistData) { - LOG(Archives, "LegacyWebArchive - Failed to convert property list into raw data, returning no data"); - return 0; - } - - return plistData; -} - -#if !PLATFORM(MAC) -// FIXME: Is it possible to parse in a Cocoa-style resource response manually, -// without NSKeyed(Un)Archiver, manipulating plists directly? -// If so, the code that does it will go here. -// In the meantime, Mac will continue to NSKeyed(Un)Archive the response as it always has -ResourceResponse createResourceResponseFromMacArchivedData(CFDataRef responseData) -{ - return ResourceResponse(); -} - -RetainPtr<CFDataRef> propertyListDataFromResourceResponse(const ResourceResponse& response) -{ - // FIXME: Write out the "new" format described in ::createResourceResponseFromPropertyListData() up above - return 0; -} -#endif - -PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(Node* node) -{ - ASSERT(node); - if (!node) - return create(); - - Document* document = node->document(); - Frame* frame = document ? document->frame() : 0; - if (!frame) - return create(); - - Vector<Node*> nodeList; - String markupString = createMarkup(node, IncludeNode, &nodeList); - Node::NodeType nodeType = node->nodeType(); - if (nodeType != Node::DOCUMENT_NODE && nodeType != Node::DOCUMENT_TYPE_NODE) - markupString = frame->documentTypeString() + markupString; - - return create(markupString, frame, nodeList); -} - -PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(Frame* frame) -{ - ASSERT(frame); - - DocumentLoader* documentLoader = frame->loader()->documentLoader(); - - if (!documentLoader) - return 0; - - Vector<PassRefPtr<LegacyWebArchive> > subframeArchives; - - unsigned children = frame->tree()->childCount(); - for (unsigned i = 0; i < children; ++i) { - RefPtr<LegacyWebArchive> childFrameArchive = create(frame->tree()->child(i)); - if (childFrameArchive) - subframeArchives.append(childFrameArchive.release()); - } - - Vector<PassRefPtr<ArchiveResource> > subresources; - documentLoader->getSubresources(subresources); - - return LegacyWebArchive::create(documentLoader->mainResource(), subresources, subframeArchives); -} - -PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(Range* range) -{ - if (!range) - return 0; - - Node* startContainer = range->startContainer(); - if (!startContainer) - return 0; - - Document* document = startContainer->document(); - if (!document) - return 0; - - Frame* frame = document->frame(); - if (!frame) - return 0; - - Vector<Node*> nodeList; - - // FIXME: This is always "for interchange". Is that right? See the previous method. - String markupString = frame->documentTypeString() + createMarkup(range, &nodeList, AnnotateForInterchange); - - return create(markupString, frame, nodeList); -} - -PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(const String& markupString, Frame* frame, Vector<Node*>& nodes) -{ - ASSERT(frame); - - const ResourceResponse& response = frame->loader()->documentLoader()->response(); - KURL responseURL = response.url(); - - // it's possible to have a response without a URL here - // <rdar://problem/5454935> - if (responseURL.isNull()) - responseURL = KURL(""); - - PassRefPtr<ArchiveResource> mainResource = ArchiveResource::create(utf8Buffer(markupString), responseURL, response.mimeType(), "UTF-8", frame->tree()->name()); - - Vector<PassRefPtr<LegacyWebArchive> > subframeArchives; - Vector<PassRefPtr<ArchiveResource> > subresources; - HashSet<String> uniqueSubresources; - - Vector<Node*>::iterator it = nodes.begin(); - Vector<Node*>::iterator end = nodes.end(); - - for (; it != end; ++it) { - Frame* childFrame; - if (((*it)->hasTagName(HTMLNames::frameTag) || (*it)->hasTagName(HTMLNames::iframeTag) || (*it)->hasTagName(HTMLNames::objectTag)) && - (childFrame = static_cast<HTMLFrameOwnerElement*>(*it)->contentFrame())) { - RefPtr<LegacyWebArchive> subframeArchive; - if (Document* document = childFrame->document()) - subframeArchive = LegacyWebArchive::create(document); - else - subframeArchive = create(childFrame); - - if (subframeArchive) - subframeArchives.append(subframeArchive); - else - LOG_ERROR("Unabled to archive subframe %s", childFrame->tree()->name().string().utf8().data()); - } else { - Vector<KURL> subresourceURLs; - (*it)->getSubresourceURLs(subresourceURLs); - - DocumentLoader* documentLoader = frame->loader()->documentLoader(); - for (unsigned i = 0; i < subresourceURLs.size(); ++i) { - if (uniqueSubresources.contains(subresourceURLs[i].string())) - continue; - uniqueSubresources.add(subresourceURLs[i].string()); - RefPtr<ArchiveResource> resource = documentLoader->subresource(subresourceURLs[i]); - if (resource) - subresources.append(resource.release()); - else - // FIXME: should do something better than spew to console here - LOG_ERROR("Failed to archive subresource for %s", subresourceURLs[i].string().utf8().data()); - } - } - } - - return create(mainResource, subresources, subframeArchives); -} - -PassRefPtr<LegacyWebArchive> LegacyWebArchive::createFromSelection(Frame* frame) -{ - if (!frame) - return 0; - - RefPtr<Range> selectionRange = frame->selection()->toRange(); - Vector<Node*> nodeList; - String markupString = frame->documentTypeString() + createMarkup(selectionRange.get(), &nodeList, AnnotateForInterchange); - - RefPtr<LegacyWebArchive> archive = create(markupString, frame, nodeList); - - if (!frame->isFrameSet()) - return archive.release(); - - // Wrap the frameset document in an iframe so it can be pasted into - // another document (which will have a body or frameset of its own). - String iframeMarkup = String::format("<iframe frameborder=\"no\" marginwidth=\"0\" marginheight=\"0\" width=\"98%%\" height=\"98%%\" src=\"%s\"></iframe>", - frame->loader()->documentLoader()->response().url().string().utf8().data()); - RefPtr<ArchiveResource> iframeResource = ArchiveResource::create(utf8Buffer(iframeMarkup), blankURL(), "text/html", "UTF-8", String()); - - Vector<PassRefPtr<ArchiveResource> > subresources; - - Vector<PassRefPtr<LegacyWebArchive> > subframeArchives; - subframeArchives.append(archive); - - archive = LegacyWebArchive::create(iframeResource.release(), subresources, subframeArchives); - - return archive.release(); -} - -} |