Index: third_party/WebKit/Source/web/WebPageSerializer.cpp |
diff --git a/third_party/WebKit/Source/web/WebPageSerializer.cpp b/third_party/WebKit/Source/web/WebPageSerializer.cpp |
index afb89bc0bf9c1c59589b03690e56e74bd743be7f..bb9d48ba94294c59a73165cb88c323d288f41cee 100644 |
--- a/third_party/WebKit/Source/web/WebPageSerializer.cpp |
+++ b/third_party/WebKit/Source/web/WebPageSerializer.cpp |
@@ -69,28 +69,21 @@ namespace blink { |
namespace { |
-using ContentIDMap = WillBeHeapHashMap<RawPtrWillBeMember<Frame>, String>; |
- |
-class MHTMLPageSerializerDelegate final : |
- public NoBaseWillBeGarbageCollected<MHTMLPageSerializerDelegate>, |
- public PageSerializer::Delegate { |
+class MHTMLPageSerializerDelegate final : public PageSerializer::Delegate { |
WTF_MAKE_NONCOPYABLE(MHTMLPageSerializerDelegate); |
public: |
- MHTMLPageSerializerDelegate(const ContentIDMap& frameToContentID); |
+ explicit MHTMLPageSerializerDelegate(WebPageSerializer::MHTMLPartsGenerationDelegate&); |
bool shouldIgnoreAttribute(const Attribute&) override; |
bool rewriteLink(const Element&, String& rewrittenLink) override; |
- |
-#if ENABLE(OILPAN) |
- void trace(Visitor* visitor) { visitor->trace(m_frameToContentID); } |
-#endif |
+ bool shouldSkipResource(const KURL&) override; |
private: |
- const ContentIDMap& m_frameToContentID; |
+ WebPageSerializer::MHTMLPartsGenerationDelegate& m_webDelegate; |
}; |
MHTMLPageSerializerDelegate::MHTMLPageSerializerDelegate( |
- const ContentIDMap& frameToContentID) |
- : m_frameToContentID(frameToContentID) |
+ WebPageSerializer::MHTMLPartsGenerationDelegate& webDelegate) |
+ : m_webDelegate(webDelegate) |
{ |
} |
@@ -114,7 +107,8 @@ bool MHTMLPageSerializerDelegate::rewriteLink( |
if (!frame) |
return false; |
- KURL cidURI = MHTMLParser::convertContentIDToURI(m_frameToContentID.get(frame)); |
+ WebString contentID = m_webDelegate.getContentID(*WebFrame::fromFrame(frame)); |
+ KURL cidURI = MHTMLParser::convertContentIDToURI(contentID); |
ASSERT(cidURI.isValid()); |
if (isHTMLFrameElementBase(&element)) { |
@@ -135,20 +129,9 @@ bool MHTMLPageSerializerDelegate::rewriteLink( |
return false; |
} |
-ContentIDMap createFrameToContentIDMap( |
- const WebVector<std::pair<WebFrame*, WebString>>& webFrameToContentID) |
+bool MHTMLPageSerializerDelegate::shouldSkipResource(const KURL& url) |
{ |
- ContentIDMap result; |
- for (const auto& it : webFrameToContentID) { |
- WebFrame* webFrame = it.first; |
- const WebString& webContentID = it.second; |
- |
- Frame* frame = webFrame->toImplBase()->frame(); |
- String contentID(webContentID); |
- |
- result.add(frame, contentID); |
- } |
- return result; |
+ return m_webDelegate.shouldSkipResource(url); |
} |
} // namespace |
@@ -167,28 +150,34 @@ WebData WebPageSerializer::generateMHTMLHeader( |
WebData WebPageSerializer::generateMHTMLParts( |
const WebString& boundary, WebLocalFrame* webFrame, bool useBinaryEncoding, |
- const WebVector<std::pair<WebFrame*, WebString>>& webFrameToContentID) |
+ MHTMLPartsGenerationDelegate* webDelegate) |
{ |
+ ASSERT(webFrame); |
+ ASSERT(webDelegate); |
+ |
// Translate arguments from public to internal blink APIs. |
LocalFrame* frame = toWebLocalFrameImpl(webFrame)->frame(); |
MHTMLArchive::EncodingPolicy encodingPolicy = useBinaryEncoding |
? MHTMLArchive::EncodingPolicy::UseBinaryEncoding |
: MHTMLArchive::EncodingPolicy::UseDefaultEncoding; |
- ContentIDMap frameToContentID = createFrameToContentIDMap(webFrameToContentID); |
// Serialize. |
Vector<SerializedResource> resources; |
- MHTMLPageSerializerDelegate delegate(frameToContentID); |
- PageSerializer serializer(resources, &delegate); |
+ MHTMLPageSerializerDelegate coreDelegate(*webDelegate); |
+ PageSerializer serializer(resources, coreDelegate); |
serializer.serializeFrame(*frame); |
+ // Get Content-ID for the frame being serialized. |
+ String frameContentID = webDelegate->getContentID(*webFrame); |
+ ASSERT(!frameContentID.isEmpty()); |
+ |
// Encode serializer's output as MHTML. |
RefPtr<SharedBuffer> output = SharedBuffer::create(); |
bool isFirstResource = true; |
for (const SerializedResource& resource : resources) { |
// Frame is the 1st resource (see PageSerializer::serializeFrame doc |
- // comment). Frames need a Content-ID header. |
- String contentID = isFirstResource ? frameToContentID.get(frame) : String(); |
+ // comment). Frames get a Content-ID header. |
+ String contentID = isFirstResource ? frameContentID : String(); |
MHTMLArchive::generateMHTMLPart( |
boundary, contentID, encodingPolicy, resource, *output); |