Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 2364923004: Add UMA histograms to MHTML save operations. (Closed)
Patch Set: Reverted accidental histogram removal. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/render_frame_impl.h" 5 #include "content/renderer/render_frame_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 5173 matching lines...) Expand 10 before | Expand all | Expand 10 after
5184 5184
5185 // Serialize the frame (without recursing into subframes). 5185 // Serialize the frame (without recursing into subframes).
5186 WebFrameSerializer::serialize(GetWebFrame(), 5186 WebFrameSerializer::serialize(GetWebFrame(),
5187 this, // WebFrameSerializerClient. 5187 this, // WebFrameSerializerClient.
5188 &delegate); 5188 &delegate);
5189 } 5189 }
5190 5190
5191 void RenderFrameImpl::OnSerializeAsMHTML( 5191 void RenderFrameImpl::OnSerializeAsMHTML(
5192 const FrameMsg_SerializeAsMHTML_Params& params) { 5192 const FrameMsg_SerializeAsMHTML_Params& params) {
5193 TRACE_EVENT0("page-serialization", "RenderFrameImpl::OnSerializeAsMHTML"); 5193 TRACE_EVENT0("page-serialization", "RenderFrameImpl::OnSerializeAsMHTML");
5194 base::TimeTicks start_time = base::TimeTicks::Now();
5194 // Unpack IPC payload. 5195 // Unpack IPC payload.
5195 base::File file = IPC::PlatformFileForTransitToFile(params.destination_file); 5196 base::File file = IPC::PlatformFileForTransitToFile(params.destination_file);
5196 const WebString mhtml_boundary = 5197 const WebString mhtml_boundary =
5197 WebString::fromUTF8(params.mhtml_boundary_marker); 5198 WebString::fromUTF8(params.mhtml_boundary_marker);
5198 DCHECK(!mhtml_boundary.isEmpty()); 5199 DCHECK(!mhtml_boundary.isEmpty());
5199 5200
5200 WebData data; 5201 // Three WebData instances for header, parts and footer.
5202 WebData mhtml_contents[3];
5201 std::set<std::string> digests_of_uris_of_serialized_resources; 5203 std::set<std::string> digests_of_uris_of_serialized_resources;
5202 MHTMLPartsGenerationDelegate delegate( 5204 MHTMLPartsGenerationDelegate delegate(
5203 params, &digests_of_uris_of_serialized_resources); 5205 params, &digests_of_uris_of_serialized_resources);
5204 5206
5205 bool success = true; 5207 bool success = true;
5206 5208
5207 // Generate MHTML header if needed. 5209 // Generate MHTML header if needed.
5208 if (IsMainFrame()) { 5210 if (IsMainFrame()) {
5209 TRACE_EVENT0("page-serialization", 5211 TRACE_EVENT0("page-serialization",
5210 "RenderFrameImpl::OnSerializeAsMHTML header"); 5212 "RenderFrameImpl::OnSerializeAsMHTML header");
5211 // |data| can be empty if the main frame should be skipped. If the main 5213 // |data| can be empty if the main frame should be skipped. If the main
5212 // frame is skipped, then the whole archive is bad, so bail to the error 5214 // frame is skipped, then the whole archive is bad, so bail to the error
5213 // condition. 5215 // condition.
5214 WebData data = WebFrameSerializer::generateMHTMLHeader( 5216 mhtml_contents[0] = WebFrameSerializer::generateMHTMLHeader(
5215 mhtml_boundary, GetWebFrame(), &delegate); 5217 mhtml_boundary, GetWebFrame(), &delegate);
5216 if (data.isEmpty() || 5218 success = !mhtml_contents[0].isEmpty();
5217 file.WriteAtCurrentPos(data.data(), data.size()) < 0) {
5218 success = false;
5219 }
5220 } 5219 }
5221 5220
5222 // Generate MHTML parts. Note that if this is not the main frame, then even 5221 // Generate MHTML parts. Note that if this is not the main frame, then even
5223 // skipping the whole parts generation step is not an error - it simply 5222 // skipping the whole parts generation step is not an error - it simply
5224 // results in an omitted resource in the final file. 5223 // results in an omitted resource in the final file.
5225 if (success) { 5224 if (success) {
5226 TRACE_EVENT0("page-serialization", 5225 TRACE_EVENT0("page-serialization",
5227 "RenderFrameImpl::OnSerializeAsMHTML parts serialization"); 5226 "RenderFrameImpl::OnSerializeAsMHTML parts serialization");
5228 // |data| can be empty if the frame should be skipped, but this is OK. 5227 // |data| can be empty if the frame should be skipped, but this is OK.
5229 data = WebFrameSerializer::generateMHTMLParts(mhtml_boundary, GetWebFrame(), 5228 mhtml_contents[1] = WebFrameSerializer::generateMHTMLParts(
5230 &delegate); 5229 mhtml_boundary, GetWebFrame(), &delegate);
5231 // TODO(jcivelli): write the chunks in deferred tasks to give a chance to
5232 // the message loop to process other events.
5233 TRACE_EVENT0("page-serialization",
5234 "RenderFrameImpl::OnSerializeAsMHTML parts file writing");
5235 if (!data.isEmpty() &&
5236 file.WriteAtCurrentPos(data.data(), data.size()) < 0) {
5237 success = false;
5238 }
5239 } 5230 }
5240 5231
5241 // Generate MHTML footer if needed. 5232 // Generate MHTML footer if needed.
5242 if (success && params.is_last_frame) { 5233 if (success && params.is_last_frame) {
5243 TRACE_EVENT0("page-serialization", 5234 TRACE_EVENT0("page-serialization",
5244 "RenderFrameImpl::OnSerializeAsMHTML footer"); 5235 "RenderFrameImpl::OnSerializeAsMHTML footer");
5245 data = WebFrameSerializer::generateMHTMLFooter(mhtml_boundary); 5236 mhtml_contents[2] = WebFrameSerializer::generateMHTMLFooter(mhtml_boundary);
5246 if (file.WriteAtCurrentPos(data.data(), data.size()) < 0) { 5237 }
5247 success = false; 5238
5239 // Writes all serialized data to file.
5240 // TODO(jcivelli): write the chunks in deferred tasks to give a chance to
5241 // the message loop to process other events.
5242 if (success) {
5243 TRACE_EVENT0("page-serialization",
5244 "RenderFrameImpl::OnSerializeAsMHTML writing to file");
5245 SCOPED_UMA_HISTOGRAM_TIMER(
5246 "PageSerialization.MhtmlGeneration.WriteToDiskTime.SingleFrame");
5247 for (WebData& data : mhtml_contents) {
Łukasz Anforowicz 2016/09/28 19:38:40 nit: const WebData&
carlosk 2016/09/28 21:07:49 Done.
5248 if (file.WriteAtCurrentPos(data.data(), data.size()) < 0) {
5249 success = false;
5250 break;
5251 }
5248 } 5252 }
5249 } 5253 }
5250 5254
5251 // Cleanup and notify the browser process about completion. 5255 // Cleanup and notify the browser process about completion.
5252 file.Close(); // Need to flush file contents before sending IPC response. 5256 file.Close(); // Need to flush file contents before sending IPC response.
5257 base::TimeDelta main_thread_use_time = base::TimeTicks::Now() - start_time;
5253 Send(new FrameHostMsg_SerializeAsMHTMLResponse( 5258 Send(new FrameHostMsg_SerializeAsMHTMLResponse(
5254 routing_id_, params.job_id, success, 5259 routing_id_, params.job_id, success,
5255 digests_of_uris_of_serialized_resources)); 5260 digests_of_uris_of_serialized_resources, main_thread_use_time));
5261 UMA_HISTOGRAM_TIMES(
5262 "PageSerialization.MhtmlGeneration.RendererMainThreadTime.SingleFrame",
5263 main_thread_use_time);
5256 } 5264 }
5257 5265
5258 void RenderFrameImpl::OnFind(int request_id, 5266 void RenderFrameImpl::OnFind(int request_id,
5259 const base::string16& search_text, 5267 const base::string16& search_text,
5260 const WebFindOptions& options) { 5268 const WebFindOptions& options) {
5261 DCHECK(!search_text.empty()); 5269 DCHECK(!search_text.empty());
5262 5270
5263 blink::WebPlugin* plugin = GetWebPluginForFind(); 5271 blink::WebPlugin* plugin = GetWebPluginForFind();
5264 // Check if the plugin still exists in the document. 5272 // Check if the plugin still exists in the document.
5265 if (plugin) { 5273 if (plugin) {
(...skipping 1165 matching lines...) Expand 10 before | Expand all | Expand 10 after
6431 // event target. Potentially a Pepper plugin will receive the event. 6439 // event target. Potentially a Pepper plugin will receive the event.
6432 // In order to tell whether a plugin gets the last mouse event and which it 6440 // In order to tell whether a plugin gets the last mouse event and which it
6433 // is, we set |pepper_last_mouse_event_target_| to null here. If a plugin gets 6441 // is, we set |pepper_last_mouse_event_target_| to null here. If a plugin gets
6434 // the event, it will notify us via DidReceiveMouseEvent() and set itself as 6442 // the event, it will notify us via DidReceiveMouseEvent() and set itself as
6435 // |pepper_last_mouse_event_target_|. 6443 // |pepper_last_mouse_event_target_|.
6436 pepper_last_mouse_event_target_ = nullptr; 6444 pepper_last_mouse_event_target_ = nullptr;
6437 #endif 6445 #endif
6438 } 6446 }
6439 6447
6440 } // namespace content 6448 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698