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