12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/shell/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"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_manager.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/gpu_data_manager.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_controller.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_entry.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_types.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_contents_view.h"
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/common/content_switches.h"
27b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/shell_messages.h"
28b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/shell_switches.h"
29b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/webkit_test_helpers.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/shell/shell.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/shell/shell_browser_context.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/shell/shell_content_browser_client.h"
332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "ui/gfx/codec/png_codec.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kTestSVGWindowWidthDip = 480;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kTestSVGWindowHeightDip = 360;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebKitTestResultPrinter ----------------------------------------------------
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKitTestResultPrinter::WebKitTestResultPrinter(
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::ostream* output, std::ostream* error)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : state_(DURING_TEST),
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      capture_text_only_(false),
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      encode_binary_data_(false),
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      output_(output),
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      error_(error) {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKitTestResultPrinter::~WebKitTestResultPrinter() {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintTextHeader() {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != DURING_TEST)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!capture_text_only_)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *output_ << "Content-Type: text/plain\n";
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = IN_TEXT_BLOCK;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintTextBlock(const std::string& block) {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != IN_TEXT_BLOCK)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_ << block;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintTextFooter() {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != IN_TEXT_BLOCK)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!capture_text_only_) {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *output_ << "#EOF\n";
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    output_->flush();
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = IN_IMAGE_BLOCK;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintImageHeader(
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& actual_hash,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& expected_hash) {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != IN_IMAGE_BLOCK || capture_text_only_)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_ << "\nActualHash: " << actual_hash << "\n";
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!expected_hash.empty())
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *output_ << "\nExpectedHash: " << expected_hash << "\n";
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintImageBlock(
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<unsigned char>& png_image) {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != IN_IMAGE_BLOCK || capture_text_only_)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_ << "Content-Type: image/png\n";
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (encode_binary_data_) {
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PrintEncodedBinaryData(png_image);
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_ << "Content-Length: " << png_image.size() << "\n";
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  output_->write(
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reinterpret_cast<const char*>(&png_image[0]), png_image.size());
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintImageFooter() {
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != IN_IMAGE_BLOCK)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!capture_text_only_) {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *output_ << "#EOF\n";
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *error_ << "#EOF\n";
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    output_->flush();
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    error_->flush();
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = AFTER_TEST;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintAudioHeader() {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(state_, DURING_TEST);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!capture_text_only_)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *output_ << "Content-Type: audio/wav\n";
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = IN_AUDIO_BLOCK;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintAudioBlock(
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<unsigned char>& audio_data) {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != IN_AUDIO_BLOCK || capture_text_only_)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (encode_binary_data_) {
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PrintEncodedBinaryData(audio_data);
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_ << "Content-Length: " << audio_data.size() << "\n";
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  output_->write(
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reinterpret_cast<const char*>(&audio_data[0]), audio_data.size());
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::PrintAudioFooter() {
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != IN_AUDIO_BLOCK)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!capture_text_only_) {
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *output_ << "#EOF\n";
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *error_ << "#EOF\n";
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    output_->flush();
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    error_->flush();
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = IN_IMAGE_BLOCK;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::AddMessage(const std::string& message) {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddMessageRaw(message + "\n");
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::AddMessageRaw(const std::string& message) {
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != DURING_TEST)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_ << message;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestResultPrinter::AddErrorMessage(const std::string& message) {
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!capture_text_only_)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *error_ << message << "\n";
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_ != DURING_TEST)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintTextHeader();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *output_ << message << "\n";
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintTextFooter();
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintImageFooter();
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WebKitTestResultPrinter::PrintEncodedBinaryData(
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::vector<unsigned char>& data) {
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  *output_ << "Content-Transfer-Encoding: base64\n";
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string data_base64;
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const bool success = base::Base64Encode(
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::StringPiece(reinterpret_cast<const char*>(&data[0]), data.size()),
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &data_base64);
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(success);
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  *output_ << "Content-Length: " << data_base64.length() << "\n";
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  output_->write(data_base64.c_str(), data_base64.length());
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebKitTestController -------------------------------------------------------
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKitTestController* WebKitTestController::instance_ = NULL;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKitTestController* WebKitTestController::Get() {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(instance_);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return instance_;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKitTestController::WebKitTestController()
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : main_window_(NULL),
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      test_phase_(BETWEEN_TESTS) {
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(!instance_);
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  instance_ = this;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_.reset(new WebKitTestResultPrinter(&std::cout, &std::cerr));
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEncodeBinary))
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    printer_->set_encode_binary_data(true);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this,
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 NOTIFICATION_RENDERER_PROCESS_CREATED,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 NotificationService::AllSources());
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GpuDataManager::GetInstance()->AddObserver(this);
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetAfterLayoutTest();
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKitTestController::~WebKitTestController() {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(instance_ == this);
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CHECK(test_phase_ == BETWEEN_TESTS);
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GpuDataManager::GetInstance()->RemoveObserver(this);
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DiscardMainWindow();
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  instance_ = NULL;
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebKitTestController::PrepareForLayoutTest(
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& test_url,
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& current_working_directory,
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool enable_pixel_dumping,
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& expected_pixel_hash) {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  test_phase_ = DURING_TEST;
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  current_working_directory_ = current_working_directory;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enable_pixel_dumping_ = enable_pixel_dumping;
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_pixel_hash_ = expected_pixel_hash;
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_url_ = test_url;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->reset();
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ShellBrowserContext* browser_context =
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ShellContentBrowserClient::Get()->browser_context();
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (test_url.spec().find("compositing/") != std::string::npos)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    is_compositing_test_ = true;
23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  initial_size_ = gfx::Size(
23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      Shell::kDefaultTestWindowWidthDip, Shell::kDefaultTestWindowHeightDip);
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The W3C SVG layout tests use a different size than the other layout tests.
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (test_url.spec().find("W3C-SVG-1.1") != std::string::npos)
238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    initial_size_ = gfx::Size(kTestSVGWindowWidthDip, kTestSVGWindowHeightDip);
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!main_window_) {
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    main_window_ = content::Shell::CreateNewWindow(
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser_context,
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GURL(),
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NULL,
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        MSG_ROUTING_NONE,
245b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        initial_size_);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContentsObserver::Observe(main_window_->web_contents());
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    send_configuration_to_next_host_ = true;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_pid_ = base::kNullProcessId;
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    main_window_->LoadURL(test_url);
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
251fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#if (defined(OS_WIN) && !defined(USE_AURA)) || \
252fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    defined(TOOLKIT_GTK) || defined(OS_MACOSX)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Shell::SizeTo is not implemented on all platforms.
254b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    main_window_->SizeTo(initial_size_.width(), initial_size_.height());
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    main_window_->web_contents()->GetRenderViewHost()->GetView()
257b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        ->SetSize(initial_size_);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    main_window_->web_contents()->GetRenderViewHost()->WasResized();
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderViewHost* render_view_host =
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        main_window_->web_contents()->GetRenderViewHost();
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WebPreferences prefs = render_view_host->GetWebkitPreferences();
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OverrideWebkitPrefs(&prefs);
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_view_host->UpdateWebkitPreferences(prefs);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendTestConfiguration();
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NavigationController::LoadURLParams params(test_url);
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    params.transition_type = PageTransitionFromInt(
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PAGE_TRANSITION_TYPED | PAGE_TRANSITION_FROM_ADDRESS_BAR);
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    params.should_clear_history_list = true;
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    main_window_->web_contents()->GetController().LoadURLWithParams(params);
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    main_window_->web_contents()->GetView()->Focus();
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_->web_contents()->GetRenderViewHost()->SetActive(true);
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_->web_contents()->GetRenderViewHost()->Focus();
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebKitTestController::ResetAfterLayoutTest() {
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintTextFooter();
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintImageFooter();
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  send_configuration_to_next_host_ = false;
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  test_phase_ = BETWEEN_TESTS;
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_compositing_test_ = false;
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enable_pixel_dumping_ = false;
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_pixel_hash_.clear();
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_url_ = GURL();
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs_ = WebPreferences();
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  should_override_prefs_ = false;
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::SetTempPath(const base::FilePath& temp_path) {
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  temp_path_ = temp_path;
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::RendererUnresponsive() {
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LOG(WARNING) << "renderer unresponsive";
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid WebKitTestController::WorkerCrashed() {
303a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  DCHECK(CalledOnValidThread());
304a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  printer_->AddErrorMessage("#CRASHED - worker");
305a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  DiscardMainWindow();
306a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
307a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebKitTestController::OverrideWebkitPrefs(WebPreferences* prefs) {
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (should_override_prefs_) {
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *prefs = prefs_;
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ApplyLayoutTestDefaultPreferences(prefs);
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (is_compositing_test_) {
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CommandLine& command_line = *CommandLine::ForCurrentProcess();
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!command_line.HasSwitch(switches::kEnableSoftwareCompositing))
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        prefs->accelerated_2d_canvas_enabled = true;
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs->accelerated_compositing_for_video_enabled = true;
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs->mock_scrollbars_enabled = true;
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OpenURL(const GURL& url) {
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (test_phase_ != DURING_TEST)
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::CreateNewWindow(main_window_->web_contents()->GetBrowserContext(),
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         url,
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         main_window_->web_contents()->GetSiteInstance(),
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         MSG_ROUTING_NONE,
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         gfx::Size());
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebKitTestController::TestFinishedInSecondaryWindow() {
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderViewHost* render_view_host =
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      main_window_->web_contents()->GetRenderViewHost();
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  render_view_host->Send(
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new ShellViewMsg_NotifyDone(render_view_host->GetRoutingID()));
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
341a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool WebKitTestController::IsMainWindow(WebContents* web_contents) const {
342a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return main_window_ && web_contents == main_window_->web_contents();
343a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
344a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebKitTestController::OnMessageReceived(const IPC::Message& message) {
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool handled = true;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_PrintMessage, OnPrintMessage)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_TextDump, OnTextDump)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_ImageDump, OnImageDump)
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_AudioDump, OnAudioDump)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_OverridePreferences,
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnOverridePreferences)
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_TestFinished, OnTestFinished)
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_ShowDevTools, OnShowDevTools)
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_CloseDevTools, OnCloseDevTools)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_GoToOffset, OnGoToOffset)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_Reload, OnReload)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_LoadURLForFrame, OnLoadURLForFrame)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_CaptureSessionHistory,
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnCaptureSessionHistory)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_CloseRemainingWindows,
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnCloseRemainingWindows)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewHostMsg_ResetDone, OnResetDone)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPC_END_MESSAGE_MAP()
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return handled;
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::PluginCrashed(const base::FilePath& plugin_path,
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         base::ProcessId plugin_pid) {
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->AddErrorMessage(
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::StringPrintf("#CRASHED - plugin (pid %d)", plugin_pid));
377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::MessageLoop::current()->PostTask(
378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      FROM_HERE,
379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::Bind(base::IgnoreResult(&WebKitTestController::DiscardMainWindow),
380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this)));
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::RenderViewCreated(RenderViewHost* render_view_host) {
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Might be kNullProcessHandle, in which case we will receive a notification
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // later when the RenderProcessHost was created.
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_view_host->GetProcess()->GetHandle() != base::kNullProcessHandle)
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_pid_ = base::GetProcId(render_view_host->GetProcess()->GetHandle());
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!send_configuration_to_next_host_)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  send_configuration_to_next_host_ = false;
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendTestConfiguration();
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid WebKitTestController::RenderProcessGone(base::TerminationStatus status) {
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_pid_ != base::kNullProcessId) {
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    printer_->AddErrorMessage(std::string("#CRASHED - renderer (pid ") +
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              base::IntToString(current_pid_) + ")");
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    printer_->AddErrorMessage("#CRASHED - renderer");
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DiscardMainWindow();
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::WebContentsDestroyed(WebContents* web_contents) {
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->AddErrorMessage("FAIL: main window was destroyed");
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DiscardMainWindow();
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::Observe(int type,
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   const NotificationSource& source,
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   const NotificationDetails& details) {
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type) {
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NOTIFICATION_RENDERER_PROCESS_CREATED: {
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!main_window_)
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderViewHost* render_view_host =
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          main_window_->web_contents()->GetRenderViewHost();
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!render_view_host)
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderProcessHost* render_process_host =
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          Source<RenderProcessHost>(source).ptr();
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (render_process_host != render_view_host->GetProcess())
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_pid_ = base::GetProcId(render_process_host->GetHandle());
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnGpuProcessCrashed(
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TerminationStatus exit_code) {
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->AddErrorMessage("#CRASHED - gpu");
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DiscardMainWindow();
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::TimeoutHandler() {
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->AddErrorMessage(
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "FAIL: Timed out waiting for notifyDone to be called");
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DiscardMainWindow();
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::DiscardMainWindow() {
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we're running a test, we need to close all windows and exit the message
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // loop. Otherwise, we're already outside of the message loop, and we just
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // discard the main window.
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsObserver::Observe(NULL);
45590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (test_phase_ != BETWEEN_TESTS) {
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Shell::CloseAllWindows();
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::MessageLoop::QuitClosure());
45990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    test_phase_ = CLEAN_UP;
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (main_window_) {
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    main_window_->Close();
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_ = NULL;
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  current_pid_ = base::kNullProcessId;
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::SendTestConfiguration() {
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHost* render_view_host =
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      main_window_->web_contents()->GetRenderViewHost();
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShellTestConfiguration params;
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.current_working_directory = current_working_directory_;
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.temp_path = temp_path_;
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.test_url = test_url_;
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.enable_pixel_dumping = enable_pixel_dumping_;
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.allow_external_pages = CommandLine::ForCurrentProcess()->HasSwitch(
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      switches::kAllowExternalPages);
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.expected_pixel_hash = expected_pixel_hash_;
478b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  params.initial_size = initial_size_;
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view_host->Send(new ShellViewMsg_SetTestConfiguration(
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_host->GetRoutingID(), params));
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebKitTestController::OnTestFinished() {
48490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  test_phase_ = CLEAN_UP;
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!printer_->output_finished())
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    printer_->PrintImageFooter();
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHost* render_view_host =
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      main_window_->web_contents()->GetRenderViewHost();
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE,
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(base::IgnoreResult(&WebKitTestController::Send),
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this),
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 new ShellViewMsg_Reset(render_view_host->GetRoutingID())));
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnImageDump(
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& actual_pixel_hash,
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const SkBitmap& image) {
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkAutoLockPixels image_lock(image);
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintImageHeader(actual_pixel_hash, expected_pixel_hash_);
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Only encode and dump the png if the hashes don't match. Encoding the
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // image is really expensive.
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (actual_pixel_hash != expected_pixel_hash_) {
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<unsigned char> png;
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Only the expected PNGs for Mac have a valid alpha channel.
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX)
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool discard_transparency = false;
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool discard_transparency = true;
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    std::vector<gfx::PNGCodec::Comment> comments;
5162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    comments.push_back(gfx::PNGCodec::Comment("checksum", actual_pixel_hash));
5172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    bool success = gfx::PNGCodec::Encode(
5182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        static_cast<const unsigned char*>(image.getPixels()),
5192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        gfx::PNGCodec::FORMAT_BGRA,
5202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        gfx::Size(image.width(), image.height()),
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<int>(image.rowBytes()),
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        discard_transparency,
5232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        comments,
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &png);
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (success)
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printer_->PrintImageBlock(png);
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintImageFooter();
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnAudioDump(const std::vector<unsigned char>& dump) {
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintAudioHeader();
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintAudioBlock(dump);
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintAudioFooter();
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnTextDump(const std::string& dump) {
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintTextHeader();
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintTextBlock(dump);
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->PrintTextFooter();
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnPrintMessage(const std::string& message) {
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printer_->AddMessageRaw(message);
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebKitTestController::OnOverridePreferences(const WebPreferences& prefs) {
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  should_override_prefs_ = true;
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_ = prefs;
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnShowDevTools() {
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_->ShowDevTools();
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnCloseDevTools() {
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_->CloseDevTools();
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnGoToOffset(int offset) {
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_->GoBackOrForward(offset);
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnReload() {
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_->Reload();
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnLoadURLForFrame(const GURL& url,
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             const std::string& frame_name) {
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_window_->LoadURLForFrame(url, frame_name);
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnCaptureSessionHistory() {
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<int> routing_ids;
57590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<std::vector<PageState> > session_histories;
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<unsigned> current_entry_indexes;
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHost* render_view_host =
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      main_window_->web_contents()->GetRenderViewHost();
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::vector<Shell*>::iterator window = Shell::windows().begin();
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       window != Shell::windows().end();
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++window) {
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* web_contents = (*window)->web_contents();
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Only capture the history from windows in the same process as the main
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // window. During layout tests, we only use two processes when an
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // devtools window is open. This should not happen during history navigation
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // tests.
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (render_view_host->GetProcess() !=
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_contents->GetRenderViewHost()->GetProcess()) {
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    routing_ids.push_back(web_contents->GetRenderViewHost()->GetRoutingID());
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_entry_indexes.push_back(
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_contents->GetController().GetCurrentEntryIndex());
59790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    std::vector<PageState> history;
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int entry = 0; entry < web_contents->GetController().GetEntryCount();
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ++entry) {
60090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      PageState state = web_contents->GetController().GetEntryAtIndex(entry)->
60190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          GetPageState();
60290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (!state.IsValid()) {
60390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        state = PageState::CreateFromURL(
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            web_contents->GetController().GetEntryAtIndex(entry)->GetURL());
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      history.push_back(state);
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    session_histories.push_back(history);
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Send(new ShellViewMsg_SessionHistory(render_view_host->GetRoutingID(),
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       routing_ids,
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       session_histories,
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       current_entry_indexes));
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnCloseRemainingWindows() {
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DevToolsManager::GetInstance()->CloseAllClientHosts();
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<Shell*> open_windows(Shell::windows());
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < open_windows.size(); ++i) {
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (open_windows[i] != main_window_)
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      open_windows[i]->Close();
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebKitTestController::OnResetDone() {
628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->PostTask(FROM_HERE,
629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         base::MessageLoop::QuitClosure());
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
633