Index: content/shell/browser/layout_test/blink_test_controller.cc |
diff --git a/content/shell/browser/layout_test/blink_test_controller.cc b/content/shell/browser/layout_test/blink_test_controller.cc |
index 03ed2f2d83f2d19ff90896d60f88efa7633db529..f99b93c14dcee364c8964ccaffa5f7cdaab0eaae 100644 |
--- a/content/shell/browser/layout_test/blink_test_controller.cc |
+++ b/content/shell/browser/layout_test/blink_test_controller.cc |
@@ -492,6 +492,8 @@ bool BlinkTestController::OnMessageReceived(const IPC::Message& message) { |
IPC_MESSAGE_HANDLER(ShellViewHostMsg_TextDump, OnTextDump) |
IPC_MESSAGE_HANDLER(ShellViewHostMsg_InitiateLayoutDump, |
OnInitiateLayoutDump) |
+ IPC_MESSAGE_HANDLER(ShellViewHostMsg_InitiatePixelsDump, |
+ OnInitiatePixelsDump) |
IPC_MESSAGE_HANDLER(ShellViewHostMsg_ImageDump, OnImageDump) |
IPC_MESSAGE_HANDLER(ShellViewHostMsg_AudioDump, OnAudioDump) |
IPC_MESSAGE_HANDLER(ShellViewHostMsg_OverridePreferences, |
@@ -786,6 +788,77 @@ void BlinkTestController::OnInitiateLayoutDump() { |
pending_layout_dumps_ = number_of_messages; |
} |
+void BlinkTestController::OnInitiatePixelsDump() { |
+ // DO NOT SUBMIT - remove ad-hoc logs. |
+ LOG(ERROR) << "OnInitiatePixelsDump"; |
+ composited_frames_.clear(); |
+ TriggerCompositingIfAllChildrenHaveBeenComposited(); |
+} |
+ |
+void BlinkTestController::TriggerCompositingIfAllChildrenHaveBeenComposited() { |
+ for (RenderFrameHost* rfh : main_window_->web_contents()->GetAllFrames()) { |
+ // Skip the frame if it already was composited. |
+ if (0 != composited_frames_.count(rfh->GetFrameTreeNodeId())) |
+ continue; |
+ |
+ // Ignore non-live frames / pretend that they are ready for a pixel dump. |
+ if (!rfh->IsRenderFrameLive()) { |
+ composited_frames_.insert(rfh->GetFrameTreeNodeId()); |
+ continue; |
+ } |
+ |
+ // Check if all child frames of |rfh| have been composited. |
+ bool are_all_children_composited = true; |
+ for (RenderFrameHost* child : |
+ main_window_->web_contents()->GetAllFrames()) { |
+ if (child->GetParent() != rfh) |
+ continue; |
+ if (0 == composited_frames_.count(child->GetFrameTreeNodeId())) { |
+ are_all_children_composited = false; |
+ break; |
+ } |
+ } |
+ if (!are_all_children_composited) |
+ continue; |
+ |
+ // At this point we know that |rfh| is ready for compositing. |
+ TriggerCompositing(rfh); |
+ } |
+} |
+ |
+void BlinkTestController::TriggerCompositing(RenderFrameHost* frame) { |
+ LOG(ERROR) << "TriggerCompositing" |
+ << "; frame->GetLastCommittedURL() = " |
+ << frame->GetLastCommittedURL(); |
+ |
+ GetLayoutTestControlPtr(frame)->TriggerCompositing( |
+ base::Bind(&BlinkTestController::OnTriggerCompositingResponse, |
+ base::Unretained(this), frame->GetFrameTreeNodeId(), |
+ frame->GetProcess()->GetID())); |
+} |
+ |
+void BlinkTestController::OnTriggerCompositingResponse( |
+ int frame_tree_node_id, |
+ // DO NOT SUBMIT - use |process_id|? |
+ int process_id) { |
+ LOG(ERROR) << "OnTriggerCompositingResponse"; |
+ composited_frames_.insert(frame_tree_node_id); |
+ |
+ if (0 == |
+ composited_frames_.count( |
+ main_window_->web_contents()->GetMainFrame()->GetFrameTreeNodeId())) { |
+ TriggerCompositingIfAllChildrenHaveBeenComposited(); |
+ return; |
+ } |
+ |
+ LOG(ERROR) << "OnTriggerCompositingResponse - all frames were composited"; |
+ main_window_->web_contents()->GetRenderWidgetHostView()->CopyFromSurface( |
+ gfx::Rect(), gfx::Size(), |
+ base::Bind(&BlinkTestController::OnPixelsDumpCaptured, |
+ base::Unretained(this)), |
+ kN32_SkColorType); |
+} |
+ |
void BlinkTestController::OnLayoutTestRuntimeFlagsChanged( |
int sender_process_host_id, |
const base::DictionaryValue& changed_layout_test_runtime_flags) { |
@@ -838,6 +911,15 @@ void BlinkTestController::OnDumpFrameLayoutResponse(int frame_tree_node_id, |
render_view_host->GetRoutingID(), stitched_layout_dump)); |
} |
+void BlinkTestController::OnPixelsDumpCaptured(const SkBitmap& dump, |
+ ReadbackResponse response) { |
+ DCHECK_EQ(READBACK_SUCCESS, response); |
+ RenderViewHost* render_view_host = |
+ main_window_->web_contents()->GetRenderViewHost(); |
+ render_view_host->Send(new ShellViewMsg_PixelsDumpResult( |
+ render_view_host->GetRoutingID(), dump)); |
+} |
+ |
void BlinkTestController::OnPrintMessage(const std::string& message) { |
printer_->AddMessageRaw(message); |
} |