Chromium Code Reviews| Index: content/renderer/render_frame_impl.cc |
| diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
| index 2f79ac027a3144ba9006282e9f8b529ea2d58d43..bc93cada2b64056e13b20825015578eb91d583d1 100644 |
| --- a/content/renderer/render_frame_impl.cc |
| +++ b/content/renderer/render_frame_impl.cc |
| @@ -28,6 +28,7 @@ |
| #include "base/process/process.h" |
| #include "base/stl_util.h" |
| #include "base/strings/string16.h" |
| +#include "base/strings/stringprintf.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/task_runner_util.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| @@ -801,24 +802,24 @@ bool IsHttpPost(const blink::WebURLRequest& request) { |
| // Writes to file the serialized and encoded MHTML data from WebThreadSafeData |
| // instances. |
| -bool WriteMHTMLToDisk(std::vector<WebThreadSafeData> mhtml_contents, |
| - base::File file) { |
| +MhtmlSaveStatus WriteMHTMLToDisk(std::vector<WebThreadSafeData> mhtml_contents, |
| + base::File file) { |
| TRACE_EVENT0("page-serialization", "WriteMHTMLToDisk (RenderFrameImpl)"); |
| SCOPED_UMA_HISTOGRAM_TIMER( |
| "PageSerialization.MhtmlGeneration.WriteToDiskTime.SingleFrame"); |
| DCHECK(!RenderThread::Get()) << "Should not run in the main renderer thread"; |
| - bool success = true; |
| + MhtmlSaveStatus save_status = MhtmlSaveStatus::SUCCESS; |
| for (const WebThreadSafeData& data : mhtml_contents) { |
| if (!data.isEmpty() && |
| file.WriteAtCurrentPos(data.data(), data.size()) < 0) { |
| - success = false; |
| + save_status = MhtmlSaveStatus::FILE_WRITTING_ERROR; |
| break; |
| } |
| } |
| // Explicitly close |file| here to make sure to include any flush operations |
| // in the UMA metric. |
| file.Close(); |
| - return success; |
| + return save_status; |
| } |
| #if defined(OS_ANDROID) |
| @@ -5381,7 +5382,7 @@ void RenderFrameImpl::OnSerializeAsMHTML( |
| MHTMLPartsGenerationDelegate delegate(params, |
| &serialized_resources_uri_digests); |
| - bool success = true; |
| + MhtmlSaveStatus save_status = MhtmlSaveStatus::SUCCESS; |
| bool has_some_data = false; |
| // Generate MHTML header if needed. |
| @@ -5392,14 +5393,16 @@ void RenderFrameImpl::OnSerializeAsMHTML( |
| // the main frame is skipped, then the whole archive is bad. |
| mhtml_contents.emplace_back(WebFrameSerializer::generateMHTMLHeader( |
| mhtml_boundary, GetWebFrame(), &delegate)); |
| - has_some_data = !mhtml_contents.back().isEmpty(); |
| - success = has_some_data; |
| + if (mhtml_contents.back().isEmpty()) |
| + save_status = MhtmlSaveStatus::FRAME_SERIALIZATION_FORBIDDEN; |
| + else |
| + has_some_data = true; |
| } |
| // Generate MHTML parts. Note that if this is not the main frame, then even |
| // skipping the whole parts generation step is not an error - it simply |
| // results in an omitted resource in the final file. |
| - if (success) { |
| + if (save_status == MhtmlSaveStatus::SUCCESS) { |
| TRACE_EVENT0("page-serialization", |
| "RenderFrameImpl::OnSerializeAsMHTML parts serialization"); |
| // The returned data can be empty if the frame should be skipped, but this |
| @@ -5410,7 +5413,7 @@ void RenderFrameImpl::OnSerializeAsMHTML( |
| } |
| // Generate MHTML footer if needed. |
| - if (success && params.is_last_frame) { |
| + if (save_status == MhtmlSaveStatus::SUCCESS && params.is_last_frame) { |
| TRACE_EVENT0("page-serialization", |
| "RenderFrameImpl::OnSerializeAsMHTML footer"); |
| mhtml_contents.emplace_back( |
| @@ -5426,7 +5429,7 @@ void RenderFrameImpl::OnSerializeAsMHTML( |
| "PageSerialization.MhtmlGeneration.RendererMainThreadTime.SingleFrame", |
| main_thread_use_time); |
| - if (success && has_some_data) { |
| + if (save_status == MhtmlSaveStatus::SUCCESS && has_some_data) { |
| base::PostTaskAndReplyWithResult( |
| RenderThreadImpl::current()->GetFileThreadTaskRunner().get(), FROM_HERE, |
| base::Bind(&WriteMHTMLToDisk, base::Passed(&mhtml_contents), |
| @@ -5438,7 +5441,7 @@ void RenderFrameImpl::OnSerializeAsMHTML( |
| } else { |
| file.Close(); |
| OnWriteMHTMLToDiskComplete(params.job_id, serialized_resources_uri_digests, |
| - main_thread_use_time, success); |
| + main_thread_use_time, save_status); |
| } |
| } |
| @@ -5446,16 +5449,19 @@ void RenderFrameImpl::OnWriteMHTMLToDiskComplete( |
| int job_id, |
| std::set<std::string> serialized_resources_uri_digests, |
| base::TimeDelta main_thread_use_time, |
| - bool success) { |
| - TRACE_EVENT1("page-serialization", |
| - "RenderFrameImpl::OnWriteMHTMLToDiskComplete", |
| - "frame serialization was successful", success); |
| + MhtmlSaveStatus save_status) { |
| + TRACE_EVENT1( |
| + "page-serialization", "RenderFrameImpl::OnWriteMHTMLToDiskComplete", |
| + "frame save status", |
| + save_status == MhtmlSaveStatus::SUCCESS |
| + ? "success" |
| + : base::StringPrintf("failure (%d)", static_cast<int>(save_status))); |
|
Łukasz Anforowicz
2016/11/22 19:22:13
I wonder if it would make sense to introduce a hel
carlosk
2016/11/22 23:26:24
Done.
|
| DCHECK(RenderThread::Get()) << "Must run in the main renderer thread"; |
| // Notify the browser process about completion. |
| // Note: we assume this method is fast enough to not need to be accounted for |
| // in PageSerialization.MhtmlGeneration.RendererMainThreadTime.SingleFrame. |
| Send(new FrameHostMsg_SerializeAsMHTMLResponse( |
| - routing_id_, job_id, success, serialized_resources_uri_digests, |
| + routing_id_, job_id, save_status, serialized_resources_uri_digests, |
| main_thread_use_time)); |
| } |