Index: third_party/WebKit/Source/web/WebFrameSerializer.cpp |
diff --git a/third_party/WebKit/Source/web/WebFrameSerializer.cpp b/third_party/WebKit/Source/web/WebFrameSerializer.cpp |
index 0846f86f77f11b4daefaf05dc49e5fa6c851caff..9453334f098c10fd614de419721184b629ededeb 100644 |
--- a/third_party/WebKit/Source/web/WebFrameSerializer.cpp |
+++ b/third_party/WebKit/Source/web/WebFrameSerializer.cpp |
@@ -47,6 +47,7 @@ |
#include "platform/SharedBuffer.h" |
#include "platform/mhtml/MHTMLArchive.h" |
#include "platform/mhtml/MHTMLParser.h" |
+#include "platform/network/ResourceRequest.h" |
#include "platform/network/ResourceResponse.h" |
#include "platform/weborigin/KURL.h" |
#include "public/platform/WebString.h" |
@@ -78,10 +79,12 @@ public: |
explicit MHTMLFrameSerializerDelegate(WebFrameSerializer::MHTMLPartsGenerationDelegate&); |
bool shouldIgnoreAttribute(const Attribute&) override; |
bool rewriteLink(const Element&, String& rewrittenLink) override; |
- bool shouldSkipResource(const KURL&) override; |
+ bool shouldSkipURL(const KURL&) override; |
+ bool shouldSkipResource(Resource*) override; |
private: |
WebFrameSerializer::MHTMLPartsGenerationDelegate& m_webDelegate; |
+ WebFrameSerializerCacheControlPolicy m_cacheControlPolicy = WebFrameSerializerCacheControlPolicy::None; |
}; |
MHTMLFrameSerializerDelegate::MHTMLFrameSerializerDelegate( |
@@ -135,25 +138,58 @@ bool MHTMLFrameSerializerDelegate::rewriteLink( |
return false; |
} |
-bool MHTMLFrameSerializerDelegate::shouldSkipResource(const KURL& url) |
+bool MHTMLFrameSerializerDelegate::shouldSkipURL(const KURL& url) |
{ |
return m_webDelegate.shouldSkipResource(url); |
} |
+bool MHTMLFrameSerializerDelegate::shouldSkipResource(Resource* resource) |
+{ |
+ DCHECK(resource); |
+ return m_cacheControlPolicy == WebFrameSerializerCacheControlPolicy::SkipAnyFrameOrResourceMarkedNoStore && resource->hasCacheControlNoStoreHeader(); |
+} |
+ |
+bool cacheControlNoStoreHeaderPresent(WebLocalFrameImpl* webLocalFrameImpl) |
+{ |
+ const ResourceResponse& response = webLocalFrameImpl->dataSource()->response().toResourceResponse(); |
+ if (response.cacheControlContainsNoStore()) |
+ return true; |
+ |
+ const ResourceRequest& request = webLocalFrameImpl->dataSource()->request().toResourceRequest(); |
+ return request.cacheControlContainsNoStore(); |
+} |
+ |
} // namespace |
-bool WebFrameSerializer::generateMHTMLHeader( |
- const WebString& boundary, WebFrameSerializerCacheControlPolicy cacheControlPolicy, |
- WebLocalFrame* frame, WebData* data) |
+bool WebFrameSerializer::frameShouldBeSerializedAsMHTML( |
+ WebLocalFrame* frame, MHTMLPartsGenerationDelegate* delegate) |
{ |
+ DCHECK(delegate); |
+ DCHECK(frame); |
+ |
WebLocalFrameImpl* webLocalFrameImpl = toWebLocalFrameImpl(frame); |
DCHECK(webLocalFrameImpl); |
- if (cacheControlPolicy == WebFrameSerializerCacheControlPolicy::FailForNoStoreMainFrame) { |
- const ResourceResponse& response = webLocalFrameImpl->dataSource()->response().toResourceResponse(); |
- if (response.cacheControlContainsNoStore()) |
- return false; |
- } |
+ WebFrameSerializerCacheControlPolicy cacheControlPolicy = delegate->cacheControlPolicy(); |
+ if (cacheControlPolicy == WebFrameSerializerCacheControlPolicy::None) |
+ return true; |
+ |
+ bool checkNoStore = cacheControlPolicy == WebFrameSerializerCacheControlPolicy::SkipAnyFrameOrResourceMarkedNoStore |
Dmitry Titov
2016/05/17 22:47:11
nit: 'needToCheckNoStore'?
dewittj
2016/05/17 23:43:27
Done.
|
+ || (!frame->parent() && cacheControlPolicy == WebFrameSerializerCacheControlPolicy::FailForNoStoreMainFrame); |
+ |
+ if (!checkNoStore) |
+ return true; |
+ |
+ return !cacheControlNoStoreHeaderPresent(webLocalFrameImpl); |
+} |
+ |
+WebData WebFrameSerializer::generateMHTMLHeader( |
+ const WebString& boundary, WebLocalFrame* frame, MHTMLPartsGenerationDelegate* delegate) |
+{ |
+ DCHECK(frameShouldBeSerializedAsMHTML(frame, delegate)); |
+ |
+ WebLocalFrameImpl* webLocalFrameImpl = toWebLocalFrameImpl(frame); |
+ DCHECK(webLocalFrameImpl); |
Document* document = webLocalFrameImpl->frame()->document(); |
@@ -161,20 +197,19 @@ bool WebFrameSerializer::generateMHTMLHeader( |
MHTMLArchive::generateMHTMLHeader( |
boundary, document->title(), document->suggestedMIMEType(), |
*buffer); |
- *data = buffer.release(); |
- return true; |
+ return buffer.release(); |
} |
WebData WebFrameSerializer::generateMHTMLParts( |
- const WebString& boundary, WebLocalFrame* webFrame, bool useBinaryEncoding, |
- MHTMLPartsGenerationDelegate* webDelegate) |
+ const WebString& boundary, WebLocalFrame* webFrame, MHTMLPartsGenerationDelegate* webDelegate) |
{ |
DCHECK(webFrame); |
DCHECK(webDelegate); |
+ DCHECK(frameShouldBeSerializedAsMHTML(webFrame, webDelegate)); |
// Translate arguments from public to internal blink APIs. |
LocalFrame* frame = toWebLocalFrameImpl(webFrame)->frame(); |
- MHTMLArchive::EncodingPolicy encodingPolicy = useBinaryEncoding |
+ MHTMLArchive::EncodingPolicy encodingPolicy = webDelegate->useBinaryEncoding() |
? MHTMLArchive::EncodingPolicy::UseBinaryEncoding |
: MHTMLArchive::EncodingPolicy::UseDefaultEncoding; |