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