13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/webkit_test_controller.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <iostream>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/base64.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/devtools_agent_host.h"
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/browser/dom_storage_context.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/gpu_data_manager.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_controller.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_entry.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_types.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/common/content_switches.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/url_constants.h"
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell.h"
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_browser_context.h"
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_content_browser_client.h"
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/shell/browser/shell_devtools_frontend.h"
33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/shell_messages.h"
34b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/shell_switches.h"
35b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/webkit_test_helpers.h"
362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "ui/gfx/codec/png_codec.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kTestSVGWindowWidthDip = 480;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kTestSVGWindowHeightDip = 360;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebKitTestResultPrinter ----------------------------------------------------
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKitTestResultPrinter::WebKitTestResultPrinter(
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::ostream* output, std::ostream* error)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : state_(DURING_TEST),
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      capture_text_only_(false),
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      encode_binary_data_(false),
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      output_(output),
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      error_(error) {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKitTestResultPrinter::~WebKitTestResultPrinter() {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintTextHeader() {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != DURING_TEST)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!capture_text_only_)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *output_ << "Content-Type: text/plain\n";
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = IN_TEXT_BLOCK;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintTextBlock(const std::string& block) {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != IN_TEXT_BLOCK)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_ << block;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintTextFooter() {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != IN_TEXT_BLOCK)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!capture_text_only_) {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *output_ << "#EOF\n";
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    output_->flush();
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = IN_IMAGE_BLOCK;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintImageHeader(
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& actual_hash,
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& expected_hash) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != IN_IMAGE_BLOCK || capture_text_only_)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_ << "\nActualHash: " << actual_hash << "\n";
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!expected_hash.empty())
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *output_ << "\nExpectedHash: " << expected_hash << "\n";
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintImageBlock(
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<unsigned char>& png_image) {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != IN_IMAGE_BLOCK || capture_text_only_)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_ << "Content-Type: image/png\n";
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (encode_binary_data_) {
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PrintEncodedBinaryData(png_image);
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_ << "Content-Length: " << png_image.size() << "\n";
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  output_->write(
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reinterpret_cast<const char*>(&png_image[0]), png_image.size());
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintImageFooter() {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != IN_IMAGE_BLOCK)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!capture_text_only_) {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *output_ << "#EOF\n";
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    output_->flush();
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = AFTER_TEST;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintAudioHeader() {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(state_, DURING_TEST);
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!capture_text_only_)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *output_ << "Content-Type: audio/wav\n";
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = IN_AUDIO_BLOCK;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintAudioBlock(
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<unsigned char>& audio_data) {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != IN_AUDIO_BLOCK || capture_text_only_)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (encode_binary_data_) {
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PrintEncodedBinaryData(audio_data);
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_ << "Content-Length: " << audio_data.size() << "\n";
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  output_->write(
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reinterpret_cast<const char*>(&audio_data[0]), audio_data.size());
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintAudioFooter() {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != IN_AUDIO_BLOCK)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!capture_text_only_) {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *output_ << "#EOF\n";
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    output_->flush();
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = IN_IMAGE_BLOCK;
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::AddMessage(const std::string& message) {
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddMessageRaw(message + "\n");
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::AddMessageRaw(const std::string& message) {
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != DURING_TEST)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_ << message;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::AddErrorMessage(const std::string& message) {
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!capture_text_only_)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *error_ << message << "\n";
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != DURING_TEST)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintTextHeader();
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_ << message << "\n";
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintTextFooter();
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintImageFooter();
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WebKitTestResultPrinter::PrintEncodedBinaryData(
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::vector<unsigned char>& data) {
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  *output_ << "Content-Transfer-Encoding: base64\n";
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string data_base64;
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::Base64Encode(
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::StringPiece(reinterpret_cast<const char*>(&data[0]), data.size()),
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &data_base64);
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  *output_ << "Content-Length: " << data_base64.length() << "\n";
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  output_->write(data_base64.c_str(), data_base64.length());
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void WebKitTestResultPrinter::CloseStderr() {
1828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (state_ != AFTER_TEST)
1838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return;
1848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (!capture_text_only_) {
1858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    *error_ << "#EOF\n";
1868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    error_->flush();
1878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebKitTestController -------------------------------------------------------
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKitTestController* WebKitTestController::instance_ = NULL;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKitTestController* WebKitTestController::Get() {
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(instance_);
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return instance_;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKitTestController::WebKitTestController()
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : main_window_(NULL),
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      test_phase_(BETWEEN_TESTS),
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      is_leak_detection_enabled_(CommandLine::ForCurrentProcess()->HasSwitch(
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          switches::kEnableLeakDetection)),
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      crash_when_leak_found_(false) {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(!instance_);
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  instance_ = this;
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (is_leak_detection_enabled_) {
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::string switchValue =
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            switches::kEnableLeakDetection);
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    crash_when_leak_found_ = switchValue == switches::kCrashOnFailure;
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_.reset(new WebKitTestResultPrinter(&std::cout, &std::cerr));
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEncodeBinary))
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    printer_->set_encode_binary_data(true);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this,
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 NOTIFICATION_RENDERER_PROCESS_CREATED,
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 NotificationService::AllSources());
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GpuDataManager::GetInstance()->AddObserver(this);
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetAfterLayoutTest();
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKitTestController::~WebKitTestController() {
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(instance_ == this);
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CHECK(test_phase_ == BETWEEN_TESTS);
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GpuDataManager::GetInstance()->RemoveObserver(this);
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DiscardMainWindow();
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  instance_ = NULL;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebKitTestController::PrepareForLayoutTest(
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& test_url,
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& current_working_directory,
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool enable_pixel_dumping,
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& expected_pixel_hash) {
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  test_phase_ = DURING_TEST;
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  current_working_directory_ = current_working_directory;
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enable_pixel_dumping_ = enable_pixel_dumping;
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_pixel_hash_ = expected_pixel_hash;
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_url_ = test_url;
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->reset();
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ShellBrowserContext* browser_context =
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ShellContentBrowserClient::Get()->browser_context();
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (test_url.spec().find("compositing/") != std::string::npos)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    is_compositing_test_ = true;
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  initial_size_ = gfx::Size(
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      Shell::kDefaultTestWindowWidthDip, Shell::kDefaultTestWindowHeightDip);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The W3C SVG layout tests use a different size than the other layout tests.
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (test_url.spec().find("W3C-SVG-1.1") != std::string::npos)
256b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    initial_size_ = gfx::Size(kTestSVGWindowWidthDip, kTestSVGWindowHeightDip);
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!main_window_) {
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    main_window_ = content::Shell::CreateNewWindow(
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser_context,
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GURL(),
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NULL,
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        MSG_ROUTING_NONE,
263b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        initial_size_);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContentsObserver::Observe(main_window_->web_contents());
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    send_configuration_to_next_host_ = true;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_pid_ = base::kNullProcessId;
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    main_window_->LoadURL(test_url);
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
269a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_MACOSX)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Shell::SizeTo is not implemented on all platforms.
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    main_window_->SizeTo(initial_size_);
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    main_window_->web_contents()->GetRenderViewHost()->GetView()
274b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        ->SetSize(initial_size_);
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    main_window_->web_contents()->GetRenderViewHost()->WasResized();
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderViewHost* render_view_host =
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        main_window_->web_contents()->GetRenderViewHost();
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WebPreferences prefs = render_view_host->GetWebkitPreferences();
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OverrideWebkitPrefs(&prefs);
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_view_host->UpdateWebkitPreferences(prefs);
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendTestConfiguration();
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NavigationController::LoadURLParams params(test_url);
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    params.transition_type = ui::PageTransitionFromInt(
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    params.should_clear_history_list = true;
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    main_window_->web_contents()->GetController().LoadURLWithParams(params);
288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    main_window_->web_contents()->Focus();
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_->web_contents()->GetRenderViewHost()->SetActive(true);
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_->web_contents()->GetRenderViewHost()->Focus();
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebKitTestController::ResetAfterLayoutTest() {
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintTextFooter();
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintImageFooter();
2998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  printer_->CloseStderr();
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  send_configuration_to_next_host_ = false;
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  test_phase_ = BETWEEN_TESTS;
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_compositing_test_ = false;
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enable_pixel_dumping_ = false;
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_pixel_hash_.clear();
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_url_ = GURL();
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs_ = WebPreferences();
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  should_override_prefs_ = false;
308424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
309424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#if defined(OS_ANDROID)
310424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Re-using the shell's main window on Android causes issues with networking
311424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // requests never succeeding. See http://crbug.com/277652.
312424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DiscardMainWindow();
313424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::SetTempPath(const base::FilePath& temp_path) {
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  temp_path_ = temp_path;
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::RendererUnresponsive() {
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LOG(WARNING) << "renderer unresponsive";
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
326a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid WebKitTestController::WorkerCrashed() {
327a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  DCHECK(CalledOnValidThread());
328a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  printer_->AddErrorMessage("#CRASHED - worker");
329a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  DiscardMainWindow();
330a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
331a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebKitTestController::OverrideWebkitPrefs(WebPreferences* prefs) {
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (should_override_prefs_) {
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *prefs = prefs_;
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ApplyLayoutTestDefaultPreferences(prefs);
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (is_compositing_test_) {
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CommandLine& command_line = *CommandLine::ForCurrentProcess();
3390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      if (!command_line.HasSwitch(switches::kDisableGpu))
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        prefs->accelerated_2d_canvas_enabled = true;
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs->mock_scrollbars_enabled = true;
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OpenURL(const GURL& url) {
34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (test_phase_ != DURING_TEST)
34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::CreateNewWindow(main_window_->web_contents()->GetBrowserContext(),
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         url,
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         main_window_->web_contents()->GetSiteInstance(),
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         MSG_ROUTING_NONE,
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         gfx::Size());
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebKitTestController::TestFinishedInSecondaryWindow() {
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderViewHost* render_view_host =
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      main_window_->web_contents()->GetRenderViewHost();
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  render_view_host->Send(
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new ShellViewMsg_NotifyDone(render_view_host->GetRoutingID()));
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
364a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool WebKitTestController::IsMainWindow(WebContents* web_contents) const {
365a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return main_window_ && web_contents == main_window_->web_contents();
366a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
367a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebKitTestController::OnMessageReceived(const IPC::Message& message) {
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool handled = true;
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_PrintMessage, OnPrintMessage)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_TextDump, OnTextDump)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_ImageDump, OnImageDump)
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_AudioDump, OnAudioDump)
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_OverridePreferences,
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnOverridePreferences)
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_TestFinished, OnTestFinished)
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_ClearDevToolsLocalStorage,
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        OnClearDevToolsLocalStorage)
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_ShowDevTools, OnShowDevTools)
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_CloseDevTools, OnCloseDevTools)
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_GoToOffset, OnGoToOffset)
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_Reload, OnReload)
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_LoadURLForFrame, OnLoadURLForFrame)
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_CaptureSessionHistory,
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnCaptureSessionHistory)
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_CloseRemainingWindows,
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnCloseRemainingWindows)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_ResetDone, OnResetDone)
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_LeakDetectionDone, OnLeakDetectionDone)
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPC_END_MESSAGE_MAP()
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return handled;
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::PluginCrashed(const base::FilePath& plugin_path,
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         base::ProcessId plugin_pid) {
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->AddErrorMessage(
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::StringPrintf("#CRASHED - plugin (pid %d)", plugin_pid));
403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::MessageLoop::current()->PostTask(
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      FROM_HERE,
405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::Bind(base::IgnoreResult(&WebKitTestController::DiscardMainWindow),
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this)));
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::RenderViewCreated(RenderViewHost* render_view_host) {
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Might be kNullProcessHandle, in which case we will receive a notification
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // later when the RenderProcessHost was created.
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_view_host->GetProcess()->GetHandle() != base::kNullProcessHandle)
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_pid_ = base::GetProcId(render_view_host->GetProcess()->GetHandle());
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!send_configuration_to_next_host_)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  send_configuration_to_next_host_ = false;
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendTestConfiguration();
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid WebKitTestController::RenderProcessGone(base::TerminationStatus status) {
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_pid_ != base::kNullProcessId) {
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    printer_->AddErrorMessage(std::string("#CRASHED - renderer (pid ") +
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              base::IntToString(current_pid_) + ")");
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    printer_->AddErrorMessage("#CRASHED - renderer");
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DiscardMainWindow();
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WebKitTestController::DevToolsProcessCrashed() {
433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(CalledOnValidThread());
434f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  printer_->AddErrorMessage("#CRASHED - devtools");
435f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DiscardMainWindow();
436f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
437f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebKitTestController::WebContentsDestroyed() {
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->AddErrorMessage("FAIL: main window was destroyed");
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DiscardMainWindow();
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::Observe(int type,
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   const NotificationSource& source,
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   const NotificationDetails& details) {
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type) {
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NOTIFICATION_RENDERER_PROCESS_CREATED: {
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!main_window_)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderViewHost* render_view_host =
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          main_window_->web_contents()->GetRenderViewHost();
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!render_view_host)
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderProcessHost* render_process_host =
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          Source<RenderProcessHost>(source).ptr();
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (render_process_host != render_view_host->GetProcess())
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_pid_ = base::GetProcId(render_process_host->GetHandle());
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnGpuProcessCrashed(
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TerminationStatus exit_code) {
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->AddErrorMessage("#CRASHED - gpu");
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DiscardMainWindow();
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::DiscardMainWindow() {
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we're running a test, we need to close all windows and exit the message
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // loop. Otherwise, we're already outside of the message loop, and we just
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // discard the main window.
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsObserver::Observe(NULL);
48090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (test_phase_ != BETWEEN_TESTS) {
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Shell::CloseAllWindows();
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::MessageLoop::QuitClosure());
48490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    test_phase_ = CLEAN_UP;
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (main_window_) {
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    main_window_->Close();
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_ = NULL;
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  current_pid_ = base::kNullProcessId;
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::SendTestConfiguration() {
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHost* render_view_host =
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      main_window_->web_contents()->GetRenderViewHost();
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShellTestConfiguration params;
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.current_working_directory = current_working_directory_;
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.temp_path = temp_path_;
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.test_url = test_url_;
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.enable_pixel_dumping = enable_pixel_dumping_;
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.allow_external_pages = CommandLine::ForCurrentProcess()->HasSwitch(
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      switches::kAllowExternalPages);
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.expected_pixel_hash = expected_pixel_hash_;
503b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  params.initial_size = initial_size_;
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view_host->Send(new ShellViewMsg_SetTestConfiguration(
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_host->GetRoutingID(), params));
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebKitTestController::OnTestFinished() {
50990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  test_phase_ = CLEAN_UP;
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!printer_->output_finished())
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    printer_->PrintImageFooter();
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHost* render_view_host =
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      main_window_->web_contents()->GetRenderViewHost();
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE,
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(base::IgnoreResult(&WebKitTestController::Send),
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this),
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 new ShellViewMsg_Reset(render_view_host->GetRoutingID())));
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnImageDump(
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& actual_pixel_hash,
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const SkBitmap& image) {
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkAutoLockPixels image_lock(image);
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintImageHeader(actual_pixel_hash, expected_pixel_hash_);
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Only encode and dump the png if the hashes don't match. Encoding the
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // image is really expensive.
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (actual_pixel_hash != expected_pixel_hash_) {
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<unsigned char> png;
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Only the expected PNGs for Mac have a valid alpha channel.
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX)
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool discard_transparency = false;
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool discard_transparency = true;
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (CommandLine::ForCurrentProcess()->HasSwitch(
5404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        switches::kEnableOverlayFullscreenVideo))
5414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      discard_transparency = false;
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    std::vector<gfx::PNGCodec::Comment> comments;
5442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    comments.push_back(gfx::PNGCodec::Comment("checksum", actual_pixel_hash));
5452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    bool success = gfx::PNGCodec::Encode(
5462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        static_cast<const unsigned char*>(image.getPixels()),
5472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        gfx::PNGCodec::FORMAT_BGRA,
5482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        gfx::Size(image.width(), image.height()),
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<int>(image.rowBytes()),
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        discard_transparency,
5512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        comments,
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &png);
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (success)
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printer_->PrintImageBlock(png);
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintImageFooter();
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnAudioDump(const std::vector<unsigned char>& dump) {
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintAudioHeader();
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintAudioBlock(dump);
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintAudioFooter();
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnTextDump(const std::string& dump) {
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintTextHeader();
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintTextBlock(dump);
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintTextFooter();
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnPrintMessage(const std::string& message) {
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->AddMessageRaw(message);
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebKitTestController::OnOverridePreferences(const WebPreferences& prefs) {
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  should_override_prefs_ = true;
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_ = prefs;
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebKitTestController::OnClearDevToolsLocalStorage() {
5811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ShellBrowserContext* browser_context =
5821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ShellContentBrowserClient::Get()->browser_context();
5831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  StoragePartition* storage_partition =
5841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      BrowserContext::GetStoragePartition(browser_context, NULL);
5851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  storage_partition->GetDOMStorageContext()->DeleteLocalStorage(
5860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      content::GetDevToolsPathAsURL("", "").GetOrigin());
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid WebKitTestController::OnShowDevTools(const std::string& settings,
5900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                          const std::string& frontend_url) {
5910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  main_window_->ShowDevToolsForTest(settings, frontend_url);
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnCloseDevTools() {
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_->CloseDevTools();
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnGoToOffset(int offset) {
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_->GoBackOrForward(offset);
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnReload() {
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_->Reload();
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnLoadURLForFrame(const GURL& url,
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             const std::string& frame_name) {
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_->LoadURLForFrame(url, frame_name);
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnCaptureSessionHistory() {
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<int> routing_ids;
61390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<std::vector<PageState> > session_histories;
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<unsigned> current_entry_indexes;
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHost* render_view_host =
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      main_window_->web_contents()->GetRenderViewHost();
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::vector<Shell*>::iterator window = Shell::windows().begin();
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       window != Shell::windows().end();
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++window) {
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* web_contents = (*window)->web_contents();
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Only capture the history from windows in the same process as the main
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // window. During layout tests, we only use two processes when an
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // devtools window is open. This should not happen during history navigation
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // tests.
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (render_view_host->GetProcess() !=
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_contents->GetRenderViewHost()->GetProcess()) {
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    routing_ids.push_back(web_contents->GetRenderViewHost()->GetRoutingID());
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_entry_indexes.push_back(
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_contents->GetController().GetCurrentEntryIndex());
63590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    std::vector<PageState> history;
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int entry = 0; entry < web_contents->GetController().GetEntryCount();
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ++entry) {
63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      PageState state = web_contents->GetController().GetEntryAtIndex(entry)->
63990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          GetPageState();
64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (!state.IsValid()) {
64190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        state = PageState::CreateFromURL(
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            web_contents->GetController().GetEntryAtIndex(entry)->GetURL());
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      history.push_back(state);
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    session_histories.push_back(history);
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Send(new ShellViewMsg_SessionHistory(render_view_host->GetRoutingID(),
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       routing_ids,
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       session_histories,
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       current_entry_indexes));
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnCloseRemainingWindows() {
65603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DevToolsAgentHost::DetachAllClients();
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<Shell*> open_windows(Shell::windows());
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < open_windows.size(); ++i) {
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (open_windows[i] != main_window_)
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      open_windows[i]->Close();
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnResetDone() {
6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (is_leak_detection_enabled_) {
6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (main_window_ && main_window_->web_contents()) {
6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RenderViewHost* render_view_host =
6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          main_window_->web_contents()->GetRenderViewHost();
6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_view_host->Send(
6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          new ShellViewMsg_TryLeakDetection(render_view_host->GetRoutingID()));
6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->PostTask(FROM_HERE,
677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         base::MessageLoop::QuitClosure());
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebKitTestController::OnLeakDetectionDone(
6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const LeakDetectionResult& result) {
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!result.leaked) {
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           base::MessageLoop::QuitClosure());
6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  printer_->AddErrorMessage(
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::StringPrintf("#LEAK - renderer pid %d (%s)", current_pid_,
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         result.detail.c_str()));
691116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CHECK(!crash_when_leak_found_);
692116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DiscardMainWindow();
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
697