PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(Node* node, FrameFilter* filter) { ASSERT(node); if (!node) return create(); Frame* frame = node->document().frame(); if (!frame) return create(); // If the page was loaded with javascript enabled, we don't want to archive <noscript> tags // In practice we don't actually know whether scripting was enabled when the page was originally loaded // but we can approximate that by checking if scripting is enabled right now. OwnPtr<Vector<QualifiedName>> tagNamesToFilter; if (frame->page() && frame->page()->settings().isScriptEnabled()) { tagNamesToFilter = adoptPtr(new Vector<QualifiedName>); tagNamesToFilter->append(HTMLNames::noscriptTag); } Vector<Node*> nodeList; String markupString = createMarkup(*node, IncludeNode, &nodeList, DoNotResolveURLs, tagNamesToFilter.get()); Node::NodeType nodeType = node->nodeType(); if (nodeType != Node::DOCUMENT_NODE && nodeType != Node::DOCUMENT_TYPE_NODE) markupString = documentTypeString(node->document()) + markupString; return create(markupString, frame, nodeList, filter); }
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 }); }
RefPtr<LegacyWebArchive> LegacyWebArchive::create(Range* range) { if (!range) return nullptr; Document& document = range->startContainer().document(); Frame* frame = document.frame(); if (!frame) return nullptr; // FIXME: This is always "for interchange". Is that right? See the previous method. Vector<Node*> nodeList; String markupString = documentTypeString(document) + createMarkup(*range, &nodeList, AnnotateForInterchange); return create(markupString, *frame, nodeList, nullptr); }
RefPtr<LegacyWebArchive> LegacyWebArchive::create(Node& node, std::function<bool (Frame&)> frameFilter) { Frame* frame = node.document().frame(); if (!frame) return create(); // If the page was loaded with javascript enabled, we don't want to archive <noscript> tags // In practice we don't actually know whether scripting was enabled when the page was originally loaded // but we can approximate that by checking if scripting is enabled right now. std::unique_ptr<Vector<QualifiedName>> tagNamesToFilter; if (frame->page() && frame->page()->settings().isScriptEnabled()) { tagNamesToFilter = std::make_unique<Vector<QualifiedName>>(); tagNamesToFilter->append(HTMLNames::noscriptTag); } Vector<Node*> nodeList; String markupString = createMarkup(node, IncludeNode, &nodeList, DoNotResolveURLs, tagNamesToFilter.get()); Node::NodeType nodeType = node.nodeType(); if (nodeType != Node::DOCUMENT_NODE && nodeType != Node::DOCUMENT_TYPE_NODE) markupString = documentTypeString(node.document()) + markupString; return create(markupString, *frame, nodeList, WTFMove(frameFilter)); }