Chromium Code Reviews| 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; |