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 59744b0aeab929bfaacf17af84890c70b2d58437..82135e3dba0d348ce6f5cd607d49678c9106d502 100644 |
| --- a/content/renderer/render_frame_impl.cc |
| +++ b/content/renderer/render_frame_impl.cc |
| @@ -5191,13 +5191,15 @@ void RenderFrameImpl::OnGetSerializedHtmlWithLocalLinks( |
| void RenderFrameImpl::OnSerializeAsMHTML( |
| const FrameMsg_SerializeAsMHTML_Params& params) { |
| TRACE_EVENT0("page-serialization", "RenderFrameImpl::OnSerializeAsMHTML"); |
| + base::TimeTicks start_time = base::TimeTicks::Now(); |
| // Unpack IPC payload. |
| base::File file = IPC::PlatformFileForTransitToFile(params.destination_file); |
| const WebString mhtml_boundary = |
| WebString::fromUTF8(params.mhtml_boundary_marker); |
| DCHECK(!mhtml_boundary.isEmpty()); |
| - WebData data; |
| + // Three WebData instances for header, parts and footer. |
| + WebData mhtml_contents[3]; |
| std::set<std::string> digests_of_uris_of_serialized_resources; |
| MHTMLPartsGenerationDelegate delegate( |
| params, &digests_of_uris_of_serialized_resources); |
| @@ -5211,12 +5213,9 @@ void RenderFrameImpl::OnSerializeAsMHTML( |
| // |data| can be empty if the main frame should be skipped. If the main |
| // frame is skipped, then the whole archive is bad, so bail to the error |
| // condition. |
| - WebData data = WebFrameSerializer::generateMHTMLHeader( |
| + mhtml_contents[0] = WebFrameSerializer::generateMHTMLHeader( |
| mhtml_boundary, GetWebFrame(), &delegate); |
| - if (data.isEmpty() || |
| - file.WriteAtCurrentPos(data.data(), data.size()) < 0) { |
| - success = false; |
| - } |
| + success = !mhtml_contents[0].isEmpty(); |
| } |
| // Generate MHTML parts. Note that if this is not the main frame, then even |
| @@ -5226,33 +5225,42 @@ void RenderFrameImpl::OnSerializeAsMHTML( |
| TRACE_EVENT0("page-serialization", |
| "RenderFrameImpl::OnSerializeAsMHTML parts serialization"); |
| // |data| can be empty if the frame should be skipped, but this is OK. |
| - data = WebFrameSerializer::generateMHTMLParts(mhtml_boundary, GetWebFrame(), |
| - &delegate); |
| - // TODO(jcivelli): write the chunks in deferred tasks to give a chance to |
| - // the message loop to process other events. |
| - TRACE_EVENT0("page-serialization", |
| - "RenderFrameImpl::OnSerializeAsMHTML parts file writing"); |
| - if (!data.isEmpty() && |
| - file.WriteAtCurrentPos(data.data(), data.size()) < 0) { |
| - success = false; |
| - } |
| + mhtml_contents[1] = WebFrameSerializer::generateMHTMLParts( |
| + mhtml_boundary, GetWebFrame(), &delegate); |
| } |
| // Generate MHTML footer if needed. |
| if (success && params.is_last_frame) { |
| TRACE_EVENT0("page-serialization", |
| "RenderFrameImpl::OnSerializeAsMHTML footer"); |
| - data = WebFrameSerializer::generateMHTMLFooter(mhtml_boundary); |
| - if (file.WriteAtCurrentPos(data.data(), data.size()) < 0) { |
| - success = false; |
| + mhtml_contents[2] = WebFrameSerializer::generateMHTMLFooter(mhtml_boundary); |
| + } |
| + |
| + // Writes all serialized data to file. |
| + // TODO(jcivelli): write the chunks in deferred tasks to give a chance to |
| + // the message loop to process other events. |
| + if (success) { |
| + TRACE_EVENT0("page-serialization", |
| + "RenderFrameImpl::OnSerializeAsMHTML writing to file"); |
| + SCOPED_UMA_HISTOGRAM_TIMER( |
| + "PageSerialization.MhtmlGeneration.WriteToDiskTime.SingleFrame"); |
| + for (WebData& data : mhtml_contents) { |
|
Łukasz Anforowicz
2016/09/28 19:38:40
nit: const WebData&
carlosk
2016/09/28 21:07:49
Done.
|
| + if (file.WriteAtCurrentPos(data.data(), data.size()) < 0) { |
| + success = false; |
| + break; |
| + } |
| } |
| } |
| // Cleanup and notify the browser process about completion. |
| file.Close(); // Need to flush file contents before sending IPC response. |
| + base::TimeDelta main_thread_use_time = base::TimeTicks::Now() - start_time; |
| Send(new FrameHostMsg_SerializeAsMHTMLResponse( |
| routing_id_, params.job_id, success, |
| - digests_of_uris_of_serialized_resources)); |
| + digests_of_uris_of_serialized_resources, main_thread_use_time)); |
| + UMA_HISTOGRAM_TIMES( |
| + "PageSerialization.MhtmlGeneration.RendererMainThreadTime.SingleFrame", |
| + main_thread_use_time); |
| } |
| void RenderFrameImpl::OnFind(int request_id, |