PassRefPtr<LegacyWebArchive> LegacyWebArchive::createFromSelection(Frame* frame) { if (!frame) return 0; RefPtr<Range> selectionRange = frame->selection()->toNormalizedRange(); Vector<Node*> nodeList; String markupString = frame->documentTypeString() + createMarkup(selectionRange.get(), &nodeList, AnnotateForInterchange); RefPtr<LegacyWebArchive> archive = create(markupString, frame, nodeList); if (!frame->document() || !frame->document()->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 = "<iframe frameborder=\"no\" marginwidth=\"0\" marginheight=\"0\" width=\"98%%\" height=\"98%%\" src=\"" + frame->loader()->documentLoader()->response().url().string() + "\"></iframe>"; 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 = create(iframeResource.release(), subresources, subframeArchives); return archive.release(); }
RefPtr<LegacyWebArchive> LegacyWebArchive::createFromSelection(Frame* frame) { if (!frame) return nullptr; Document* document = frame->document(); if (!document) return nullptr; StringBuilder builder; builder.append(documentTypeString(*document)); Vector<Node*> nodeList; RefPtr<Range> selectionRange = frame->selection().toNormalizedRange(); if (selectionRange) builder.append(createMarkup(*selectionRange, &nodeList, AnnotateForInterchange)); String markupString = builder.toString(); RefPtr<LegacyWebArchive> archive = create(markupString, *frame, nodeList, nullptr); if (!document->isFrameSet()) return archive; // 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 = "<iframe frameborder=\"no\" marginwidth=\"0\" marginheight=\"0\" width=\"98%%\" height=\"98%%\" src=\"" + frame->loader().documentLoader()->response().url().string() + "\"></iframe>"; RefPtr<ArchiveResource> iframeResource = ArchiveResource::create(utf8Buffer(iframeMarkup), blankURL(), "text/html", "UTF-8", String()); return create(iframeResource.release(), Vector<RefPtr<ArchiveResource>>(), Vector<RefPtr<LegacyWebArchive>> { archive }); }
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); }
void FrameLoaderClientBlackBerry::dispatchDidFailProvisionalLoad(const ResourceError& error) { if (isMainFrame()) { m_loadError = error; m_webPagePrivate->setLoadState(WebPagePrivate::Failed); if (error.domain() == ResourceError::platformErrorDomain && (error.errorCode() == BlackBerry::Platform::FilterStream::StatusErrorAlreadyHandled)) { // Error has already been displayed by client. return; } if (error.domain().isEmpty() && !error.errorCode() && error.failingURL().isEmpty() && error.localizedDescription().isEmpty()) { // Don't try to display empty errors returned from the unimplemented error functions in FrameLoaderClientBlackBerry - there's nothing to display anyway. return; } } if (m_webPagePrivate->m_dumpRenderTree) m_webPagePrivate->m_dumpRenderTree->didFailProvisionalLoadForFrame(m_frame); if (!isMainFrame()) return; String errorPage = m_webPagePrivate->m_client->getErrorPage(error.errorCode() , error.localizedDescription().isEmpty() ? "" : error.localizedDescription().utf8().data() , error.failingURL().isEmpty() ? "" : error.failingURL().utf8().data()); // Make sure we're still in the provisionalLoad state - getErrorPage runs a // nested event loop while it's waiting for client resources to load so // there's a small window for the user to hit stop. if (m_frame->loader()->provisionalDocumentLoader()) { SubstituteData errorData(utf8Buffer(errorPage), "text/html", "utf-8", KURL(KURL(), error.failingURL())); ResourceRequest originalRequest = m_frame->loader()->provisionalDocumentLoader()->originalRequest(); // Loading using SubstituteData will replace the original request with our // error data. This must be done within dispatchDidFailProvisionalLoad, // and do NOT call stopAllLoaders first, because the loader checks the // provisionalDocumentLoader to decide the load type; if called any other // way, the error page is added to the end of the history instead of // replacing the failed load. // // If this comes from a back/forward navigation, we need to save the current viewstate // to original historyitem, and prevent the restore of view state to the error page. if (isBackForwardLoadType(m_frame->loader()->loadType())) { m_frame->loader()->history()->saveScrollPositionAndViewStateToItem(m_frame->loader()->history()->currentItem()); ASSERT(m_frame->loader()->history()->provisionalItem()); m_frame->loader()->history()->provisionalItem()->viewState().shouldSaveViewState = false; } m_loadingErrorPage = true; m_frame->loader()->load(originalRequest, errorData, false); } }
PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(const String& markupString, Frame* frame, const 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(ParsedURLString, ""); PassRefPtr<ArchiveResource> mainResource = ArchiveResource::create(utf8Buffer(markupString), responseURL, response.mimeType(), "UTF-8", frame->tree()->uniqueName()); Vector<PassRefPtr<LegacyWebArchive> > subframeArchives; Vector<PassRefPtr<ArchiveResource> > subresources; HashSet<KURL> uniqueSubresources; size_t nodesSize = nodes.size(); for (size_t i = 0; i < nodesSize; ++i) { Node* node = nodes[i]; Frame* childFrame; if ((node->hasTagName(HTMLNames::frameTag) || node->hasTagName(HTMLNames::iframeTag) || node->hasTagName(HTMLNames::objectTag)) && (childFrame = static_cast<HTMLFrameOwnerElement*>(node)->contentFrame())) { RefPtr<LegacyWebArchive> subframeArchive = create(childFrame->document()); if (subframeArchive) subframeArchives.append(subframeArchive); else LOG_ERROR("Unabled to archive subframe %s", childFrame->tree()->uniqueName().string().utf8().data()); } else { ListHashSet<KURL> subresourceURLs; node->getSubresourceURLs(subresourceURLs); DocumentLoader* documentLoader = frame->loader()->documentLoader(); ListHashSet<KURL>::iterator iterEnd = subresourceURLs.end(); for (ListHashSet<KURL>::iterator iter = subresourceURLs.begin(); iter != iterEnd; ++iter) { const KURL& subresourceURL = *iter; if (uniqueSubresources.contains(subresourceURL)) continue; uniqueSubresources.add(subresourceURL); RefPtr<ArchiveResource> resource = documentLoader->subresource(subresourceURL); if (resource) { subresources.append(resource.release()); continue; } CachedResource* cachedResource = memoryCache()->resourceForURL(subresourceURL); if (cachedResource) { resource = ArchiveResource::create(cachedResource->data(), subresourceURL, cachedResource->response()); if (resource) { subresources.append(resource.release()); continue; } } // FIXME: should do something better than spew to console here LOG_ERROR("Failed to archive subresource for %s", subresourceURL.string().utf8().data()); } } } // Add favicon if one exists for this page, if we are archiving the entire page. if (nodesSize && nodes[0]->isDocumentNode() && iconDatabase().isEnabled()) { const String& iconURL = iconDatabase().synchronousIconURLForPageURL(responseURL); if (!iconURL.isEmpty() && iconDatabase().synchronousIconDataKnownForIconURL(iconURL)) { if (Image* iconImage = iconDatabase().synchronousIconForPageURL(responseURL, IntSize(16, 16))) { if (RefPtr<ArchiveResource> resource = ArchiveResource::create(iconImage->data(), KURL(ParsedURLString, iconURL), "image/x-icon", "", "")) subresources.append(resource.release()); } } } return create(mainResource, subresources, subframeArchives); }
PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(const String& markupString, Frame* frame, const Vector<Node*>& nodes, FrameFilter* frameFilter) { ASSERT(frame); const ResourceResponse& response = frame->loader().documentLoader()->response(); URL responseURL = response.url(); // it's possible to have a response without a URL here // <rdar://problem/5454935> if (responseURL.isNull()) responseURL = URL(ParsedURLString, emptyString()); RefPtr<ArchiveResource> mainResource = ArchiveResource::create(utf8Buffer(markupString), responseURL, response.mimeType(), "UTF-8", frame->tree().uniqueName()); Vector<PassRefPtr<LegacyWebArchive>> subframeArchives; Vector<PassRefPtr<ArchiveResource>> subresources; HashSet<URL> uniqueSubresources; size_t nodesSize = nodes.size(); for (size_t i = 0; i < nodesSize; ++i) { Node& node = *nodes[i]; Frame* childFrame; if ((isHTMLFrameElement(node) || isHTMLIFrameElement(node) || isHTMLObjectElement(node)) && (childFrame = toHTMLFrameOwnerElement(node).contentFrame())) { if (frameFilter && !frameFilter->shouldIncludeSubframe(childFrame)) continue; RefPtr<LegacyWebArchive> subframeArchive = create(childFrame->document(), frameFilter); if (subframeArchive) subframeArchives.append(subframeArchive); else LOG_ERROR("Unabled to archive subframe %s", childFrame->tree().uniqueName().string().utf8().data()); } else { ListHashSet<URL> subresourceURLs; node.getSubresourceURLs(subresourceURLs); DocumentLoader* documentLoader = frame->loader().documentLoader(); ListHashSet<URL>::iterator iterEnd = subresourceURLs.end(); for (ListHashSet<URL>::iterator iter = subresourceURLs.begin(); iter != iterEnd; ++iter) { const URL& subresourceURL = *iter; if (uniqueSubresources.contains(subresourceURL)) continue; uniqueSubresources.add(subresourceURL); RefPtr<ArchiveResource> resource = documentLoader->subresource(subresourceURL); if (resource) { subresources.append(resource.release()); continue; } ResourceRequest request(subresourceURL); #if ENABLE(CACHE_PARTITIONING) request.setCachePartition(frame->document()->topOrigin()->cachePartition()); #endif CachedResource* cachedResource = memoryCache()->resourceForRequest(request); if (cachedResource) { ResourceBuffer* data = cachedResource->resourceBuffer(); resource = ArchiveResource::create(data ? data->sharedBuffer() : 0, subresourceURL, cachedResource->response()); if (resource) { subresources.append(resource.release()); continue; } } // FIXME: should do something better than spew to console here LOG_ERROR("Failed to archive subresource for %s", subresourceURL.string().utf8().data()); } } } // Add favicon if one exists for this page, if we are archiving the entire page. if (nodesSize && nodes[0]->isDocumentNode() && iconDatabase().isEnabled()) { const String& iconURL = iconDatabase().synchronousIconURLForPageURL(responseURL); if (!iconURL.isEmpty() && iconDatabase().synchronousIconDataKnownForIconURL(iconURL)) { if (Image* iconImage = iconDatabase().synchronousIconForPageURL(responseURL, IntSize(16, 16))) { if (RefPtr<ArchiveResource> resource = ArchiveResource::create(iconImage->data(), URL(ParsedURLString, iconURL), "image/x-icon", "", "")) subresources.append(resource.release()); } } } return create(mainResource.release(), subresources, subframeArchives); }
nsresult nsIndexedToHTML::FormatInputStream(nsIRequest* aRequest, nsISupports *aContext, const nsAString &aBuffer) { nsresult rv = NS_OK; // set up unicode encoder if (!mUnicodeEncoder) { nsXPIDLCString encoding; rv = mParser->GetEncoding(getter_Copies(encoding)); if (NS_SUCCEEDED(rv)) { nsCOMPtr<nsICharsetConverterManager> charsetConverterManager; charsetConverterManager = do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID, &rv); rv = charsetConverterManager->GetUnicodeEncoder(encoding.get(), getter_AddRefs(mUnicodeEncoder)); if (NS_SUCCEEDED(rv)) rv = mUnicodeEncoder->SetOutputErrorBehavior(nsIUnicodeEncoder::kOnError_Replace, nsnull, (PRUnichar)'?'); } } // convert the data with unicode encoder char *buffer = nsnull; PRInt32 dstLength; if (NS_SUCCEEDED(rv)) { PRInt32 unicharLength = aBuffer.Length(); rv = mUnicodeEncoder->GetMaxLength(PromiseFlatString(aBuffer).get(), unicharLength, &dstLength); if (NS_SUCCEEDED(rv)) { buffer = (char *) nsMemory::Alloc(dstLength); NS_ENSURE_TRUE(buffer, NS_ERROR_OUT_OF_MEMORY); rv = mUnicodeEncoder->Convert(PromiseFlatString(aBuffer).get(), &unicharLength, buffer, &dstLength); if (NS_SUCCEEDED(rv)) { PRInt32 finLen = 0; rv = mUnicodeEncoder->Finish(buffer + dstLength, &finLen); if (NS_SUCCEEDED(rv)) dstLength += finLen; } } } // if conversion error then fallback to UTF-8 if (NS_FAILED(rv)) { rv = NS_OK; if (buffer) { nsMemory::Free(buffer); buffer = nsnull; } } nsCOMPtr<nsIInputStream> inputData; if (buffer) { rv = NS_NewCStringInputStream(getter_AddRefs(inputData), Substring(buffer, buffer + dstLength)); nsMemory::Free(buffer); NS_ENSURE_SUCCESS(rv, rv); rv = mListener->OnDataAvailable(aRequest, aContext, inputData, 0, dstLength); } else { NS_ConvertUTF16toUTF8 utf8Buffer(aBuffer); rv = NS_NewCStringInputStream(getter_AddRefs(inputData), utf8Buffer); NS_ENSURE_SUCCESS(rv, rv); rv = mListener->OnDataAvailable(aRequest, aContext, inputData, 0, utf8Buffer.Length()); } return (rv); }
//---------------------------------------------------------------------------- // NAME: ConvertUTF16ToUTF8 // DESC: Converts Unicode UTF-16 (Windows default) text to Unicode UTF-8 //---------------------------------------------------------------------------- std::string CStringToStdString( IN const wchar_t * utf16 ) { // // Check input pointer // ATLASSERT( utf16 != NULL ); if ( utf16 == NULL ) AtlThrow( E_POINTER ); // // Handle special case of empty string // if ( *utf16 == L'\0' ) { return ""; } // // Consider wchar_t's count corresponding to total string length, // including end-of-string (L'\0') character. // const int utf16Length = wcslen( utf16 ) + 1; // // Get size of destination UTF-8 buffer, in chars (= bytes) // int utf8Size = ::WideCharToMultiByte( CP_UTF8, // convert to UTF-8 0, // default flags utf16, // source UTF-16 string utf16Length, // total source string length, in wchar_t's, // including end-of-string \0 NULL, // unused - no conversion required in this step 0, // request buffer size NULL, NULL // unused ); ATLASSERT( utf8Size != 0 ); if ( utf8Size == 0 ) { AtlThrowLastWin32(); } // // Allocate destination buffer for UTF-8 string // std::vector< char > utf8Buffer( utf8Size ); // // Do the conversion from UTF-16 to UTF-8 // int result = ::WideCharToMultiByte( CP_UTF8, // convert to UTF-8 0, // default flags utf16, // source UTF-16 string utf16Length, // total source string length, in wchar_t's, // including end-of-string \0 &utf8Buffer[0], // destination buffer utf8Size, // destination buffer size, in bytes NULL, NULL // unused ); ATLASSERT( result != 0 ); if ( result == 0 ) { AtlThrowLastWin32(); } // // Build UTF-8 string from conversion buffer // return std::string( &utf8Buffer[0] ); }
nsresult nsINIParser::InitFromFILE(FILE *fd) { /* get file size */ if (fseek(fd, 0, SEEK_END) != 0) return NS_ERROR_FAILURE; long flen = ftell(fd); if (flen == 0) return NS_ERROR_FAILURE; /* malloc an internal buf the size of the file */ mFileContents = new char[flen + 2]; if (!mFileContents) return NS_ERROR_OUT_OF_MEMORY; /* read the file in one swoop */ if (fseek(fd, 0, SEEK_SET) != 0) return NS_BASE_STREAM_OSERROR; int rd = fread(mFileContents, sizeof(char), flen, fd); if (rd != flen) return NS_BASE_STREAM_OSERROR; // We write a UTF16 null so that the file is easier to convert to UTF8 mFileContents[flen] = mFileContents[flen + 1] = '\0'; char *buffer = &mFileContents[0]; if (flen >= 3 && mFileContents[0] == static_cast<char>(0xEF) && mFileContents[1] == static_cast<char>(0xBB) && mFileContents[2] == static_cast<char>(0xBF)) { // Someone set us up the Utf-8 BOM // This case is easy, since we assume that BOM-less // files are Utf-8 anyway. Just skip the BOM and process as usual. buffer = &mFileContents[3]; } #ifdef XP_WIN if (flen >= 2 && mFileContents[0] == static_cast<char>(0xFF) && mFileContents[1] == static_cast<char>(0xFE)) { // Someone set us up the Utf-16LE BOM buffer = &mFileContents[2]; // Get the size required for our Utf8 buffer flen = WideCharToMultiByte(CP_UTF8, 0, reinterpret_cast<LPWSTR>(buffer), -1, NULL, 0, NULL, NULL); if (0 == flen) { return NS_ERROR_FAILURE; } nsAutoArrayPtr<char> utf8Buffer(new char[flen]); if (0 == WideCharToMultiByte(CP_UTF8, 0, reinterpret_cast<LPWSTR>(buffer), -1, utf8Buffer, flen, NULL, NULL)) { return NS_ERROR_FAILURE; } mFileContents = utf8Buffer.forget(); buffer = mFileContents; } #endif char *currSection = nullptr; // outer loop tokenizes into lines while (char *token = NS_strtok(kNL, &buffer)) { if (token[0] == '#' || token[0] == ';') // it's a comment continue; token = (char*) NS_strspnp(kWhitespace, token); if (!*token) // empty line continue; if (token[0] == '[') { // section header! ++token; currSection = token; char *rb = NS_strtok(kRBracket, &token); if (!rb || NS_strtok(kWhitespace, &token)) { // there's either an unclosed [Section or a [Section]Moretext! // we could frankly decide that this INI file is malformed right // here and stop, but we won't... keep going, looking for // a well-formed [section] to continue working with currSection = nullptr; } continue; } if (!currSection) { // If we haven't found a section header (or we found a malformed // section header), don't bother parsing this line. continue; } char *key = token; char *e = NS_strtok(kEquals, &token); if (!e || !token) continue; INIValue *v; if (!mSections.Get(currSection, &v)) { v = new INIValue(key, token); if (!v) return NS_ERROR_OUT_OF_MEMORY; mSections.Put(currSection, v); continue; } // Check whether this key has already been specified; overwrite // if so, or append if not. while (v) { if (!strcmp(key, v->key)) { v->value = token; break; } if (!v->next) { v->next = new INIValue(key, token); if (!v->next) return NS_ERROR_OUT_OF_MEMORY; break; } v = v->next; } NS_ASSERTION(v, "v should never be null coming out of this loop"); } return NS_OK; }
RefPtr<LegacyWebArchive> LegacyWebArchive::create(const String& markupString, Frame& frame, const Vector<Node*>& nodes, std::function<bool (Frame&)> frameFilter) { const ResourceResponse& response = frame.loader().documentLoader()->response(); URL responseURL = response.url(); // it's possible to have a response without a URL here // <rdar://problem/5454935> if (responseURL.isNull()) responseURL = URL(ParsedURLString, emptyString()); RefPtr<ArchiveResource> mainResource = ArchiveResource::create(utf8Buffer(markupString), responseURL, response.mimeType(), "UTF-8", frame.tree().uniqueName()); if (!mainResource) return nullptr; Vector<RefPtr<LegacyWebArchive>> subframeArchives; Vector<RefPtr<ArchiveResource>> subresources; HashSet<URL> uniqueSubresources; size_t nodesSize = nodes.size(); for (size_t i = 0; i < nodesSize; ++i) { Node& node = *nodes[i]; Frame* childFrame; if ((is<HTMLFrameElementBase>(node) || is<HTMLObjectElement>(node)) && (childFrame = downcast<HTMLFrameOwnerElement>(node).contentFrame())) { if (frameFilter && !frameFilter(*childFrame)) continue; if (RefPtr<LegacyWebArchive> subframeArchive = create(*childFrame->document(), frameFilter)) subframeArchives.append(WTFMove(subframeArchive)); else LOG_ERROR("Unabled to archive subframe %s", childFrame->tree().uniqueName().string().utf8().data()); } else { ListHashSet<URL> subresourceURLs; node.getSubresourceURLs(subresourceURLs); DocumentLoader* documentLoader = frame.loader().documentLoader(); for (const auto& subresourceURL : subresourceURLs) { if (uniqueSubresources.contains(subresourceURL)) continue; uniqueSubresources.add(subresourceURL); if (RefPtr<ArchiveResource> resource = documentLoader->subresource(subresourceURL)) { subresources.append(WTFMove(resource)); continue; } ResourceRequest request(subresourceURL); #if ENABLE(CACHE_PARTITIONING) request.setDomainForCachePartition(frame.document()->topOrigin()->domainForCachePartition()); #endif CachedResource* cachedResource = MemoryCache::singleton().resourceForRequest(request, frame.page()->sessionID()); if (cachedResource) { if (RefPtr<ArchiveResource> resource = ArchiveResource::create(cachedResource->resourceBuffer(), subresourceURL, cachedResource->response())) { subresources.append(WTFMove(resource)); continue; } } // FIXME: should do something better than spew to console here LOG_ERROR("Failed to archive subresource for %s", subresourceURL.string().utf8().data()); } } } // Add favicon if one exists for this page, if we are archiving the entire page. if (nodesSize && nodes[0]->isDocumentNode() && iconDatabase().isEnabled()) { const String& iconURL = iconDatabase().synchronousIconURLForPageURL(responseURL); if (!iconURL.isEmpty() && iconDatabase().synchronousIconDataKnownForIconURL(iconURL)) { if (Image* iconImage = iconDatabase().synchronousIconForPageURL(responseURL, IntSize(16, 16))) { if (RefPtr<ArchiveResource> resource = ArchiveResource::create(iconImage->data(), URL(ParsedURLString, iconURL), "image/x-icon", "", "")) subresources.append(resource.release()); } } } return create(WTFMove(mainResource), WTFMove(subresources), WTFMove(subframeArchives)); }