| Index: content/shell/browser/blink_test_controller.cc
|
| diff --git a/content/shell/browser/blink_test_controller.cc b/content/shell/browser/blink_test_controller.cc
|
| index 623a6677e64e862ee15d86d44ad20b58e96cc2ee..61b3ac1bdbf3c585b6bc00d22590d55341ac1894 100644
|
| --- a/content/shell/browser/blink_test_controller.cc
|
| +++ b/content/shell/browser/blink_test_controller.cc
|
| @@ -7,11 +7,13 @@
|
| #include <stddef.h>
|
|
|
| #include <iostream>
|
| +#include <utility>
|
|
|
| #include "base/base64.h"
|
| #include "base/callback.h"
|
| #include "base/command_line.h"
|
| #include "base/location.h"
|
| +#include "base/logging.h"
|
| #include "base/run_loop.h"
|
| #include "base/single_thread_task_runner.h"
|
| #include "base/strings/string_number_conversions.h"
|
| @@ -25,6 +27,7 @@
|
| #include "content/public/browser/navigation_entry.h"
|
| #include "content/public/browser/notification_service.h"
|
| #include "content/public/browser/notification_types.h"
|
| +#include "content/public/browser/render_frame_host.h"
|
| #include "content/public/browser/render_process_host.h"
|
| #include "content/public/browser/render_view_host.h"
|
| #include "content/public/browser/render_widget_host.h"
|
| @@ -47,9 +50,27 @@
|
|
|
| namespace content {
|
|
|
| +namespace {
|
| +
|
| const int kTestSVGWindowWidthDip = 480;
|
| const int kTestSVGWindowHeightDip = 360;
|
|
|
| +void AppendLayoutDumpForFrame(
|
| + const std::map<int, std::string>& frame_to_layout_dump_map,
|
| + std::string* stitched_layout_dump,
|
| + RenderFrameHost* target) {
|
| + auto it = frame_to_layout_dump_map.find(target->GetFrameTreeNodeId());
|
| +
|
| + // No match will happen if frames have been added since OnInitiateLayoutDump.
|
| + if (it == frame_to_layout_dump_map.end())
|
| + return;
|
| +
|
| + const std::string& dump = it->second;
|
| + stitched_layout_dump->append(dump);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| // BlinkTestResultPrinter ----------------------------------------------------
|
|
|
| BlinkTestResultPrinter::BlinkTestResultPrinter(std::ostream* output,
|
| @@ -257,6 +278,7 @@ bool BlinkTestController::PrepareForLayoutTest(
|
| expected_pixel_hash_ = expected_pixel_hash;
|
| test_url_ = test_url;
|
| printer_->reset();
|
| + frame_to_layout_dump_map_.clear();
|
| ShellBrowserContext* browser_context =
|
| ShellContentBrowserClient::Get()->browser_context();
|
| if (test_url.spec().find("compositing/") != std::string::npos)
|
| @@ -392,6 +414,8 @@ bool BlinkTestController::OnMessageReceived(const IPC::Message& message) {
|
| IPC_BEGIN_MESSAGE_MAP(BlinkTestController, message)
|
| IPC_MESSAGE_HANDLER(ShellViewHostMsg_PrintMessage, OnPrintMessage)
|
| IPC_MESSAGE_HANDLER(ShellViewHostMsg_TextDump, OnTextDump)
|
| + IPC_MESSAGE_HANDLER(ShellViewHostMsg_InitiateLayoutDump,
|
| + OnInitiateLayoutDump)
|
| IPC_MESSAGE_HANDLER(ShellViewHostMsg_ImageDump, OnImageDump)
|
| IPC_MESSAGE_HANDLER(ShellViewHostMsg_AudioDump, OnAudioDump)
|
| IPC_MESSAGE_HANDLER(ShellViewHostMsg_OverridePreferences,
|
| @@ -422,6 +446,19 @@ bool BlinkTestController::OnMessageReceived(const IPC::Message& message) {
|
| return handled;
|
| }
|
|
|
| +bool BlinkTestController::OnMessageReceived(
|
| + const IPC::Message& message,
|
| + RenderFrameHost* render_frame_host) {
|
| + bool handled = true;
|
| + IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(BlinkTestController, message,
|
| + render_frame_host)
|
| + IPC_MESSAGE_HANDLER(ShellViewHostMsg_LayoutDumpResponse,
|
| + OnLayoutDumpResponse)
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| + IPC_END_MESSAGE_MAP()
|
| + return handled;
|
| +}
|
| +
|
| void BlinkTestController::PluginCrashed(const base::FilePath& plugin_path,
|
| base::ProcessId plugin_pid) {
|
| DCHECK(CalledOnValidThread());
|
| @@ -597,6 +634,42 @@ void BlinkTestController::OnTextDump(const std::string& dump) {
|
| printer_->PrintTextFooter();
|
| }
|
|
|
| +void BlinkTestController::OnInitiateLayoutDump(
|
| + test_runner::LayoutDumpFlags layout_dump_flags) {
|
| + DCHECK(layout_dump_flags.dump_child_frames);
|
| + pending_layout_dumps_ = main_window_->web_contents()->SendToAllFrames(
|
| + new ShellViewMsg_LayoutDumpRequest(MSG_ROUTING_NONE, layout_dump_flags));
|
| +}
|
| +
|
| +void BlinkTestController::OnLayoutDumpResponse(RenderFrameHost* sender,
|
| + const std::string& dump) {
|
| + // Store the result.
|
| + auto pair = frame_to_layout_dump_map_.insert(
|
| + std::make_pair(sender->GetFrameTreeNodeId(), dump));
|
| + bool insertion_took_place = pair.second;
|
| + DCHECK(insertion_took_place);
|
| +
|
| + // See if we need to wait for more responses.
|
| + pending_layout_dumps_--;
|
| + DCHECK_LE(0, pending_layout_dumps_);
|
| + if (pending_layout_dumps_ > 0)
|
| + return;
|
| +
|
| + // Stitch the frame-specific results in the right order.
|
| + // TODO(lukasza): Replace with a for loop similar to crrev.com/1612503003.
|
| + std::string stitched_layout_dump;
|
| + main_window_->web_contents()->ForEachFrame(base::Bind(
|
| + &AppendLayoutDumpForFrame,
|
| + base::ConstRef(frame_to_layout_dump_map_),
|
| + &stitched_layout_dump));
|
| +
|
| + // Continue finishing the test.
|
| + RenderViewHost* render_view_host =
|
| + main_window_->web_contents()->GetRenderViewHost();
|
| + render_view_host->Send(new ShellViewMsg_LayoutDumpCompleted(
|
| + render_view_host->GetRoutingID(), stitched_layout_dump));
|
| +}
|
| +
|
| void BlinkTestController::OnPrintMessage(const std::string& message) {
|
| printer_->AddMessageRaw(message);
|
| }
|
|
|