Index: content/shell/browser/webkit_test_controller.cc |
diff --git a/content/shell/browser/webkit_test_controller.cc b/content/shell/browser/webkit_test_controller.cc |
deleted file mode 100644 |
index 4c0fd3203844f962387c0df4f3f03119f3378605..0000000000000000000000000000000000000000 |
--- a/content/shell/browser/webkit_test_controller.cc |
+++ /dev/null |
@@ -1,705 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/shell/browser/webkit_test_controller.h" |
- |
-#include <iostream> |
- |
-#include "base/base64.h" |
-#include "base/command_line.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/run_loop.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/stringprintf.h" |
-#include "content/public/browser/devtools_agent_host.h" |
-#include "content/public/browser/dom_storage_context.h" |
-#include "content/public/browser/gpu_data_manager.h" |
-#include "content/public/browser/navigation_controller.h" |
-#include "content/public/browser/navigation_entry.h" |
-#include "content/public/browser/notification_service.h" |
-#include "content/public/browser/notification_types.h" |
-#include "content/public/browser/render_process_host.h" |
-#include "content/public/browser/render_view_host.h" |
-#include "content/public/browser/render_widget_host_view.h" |
-#include "content/public/browser/storage_partition.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/common/content_switches.h" |
-#include "content/public/common/url_constants.h" |
-#include "content/shell/browser/layout_test/layout_test_devtools_frontend.h" |
-#include "content/shell/browser/shell.h" |
-#include "content/shell/browser/shell_browser_context.h" |
-#include "content/shell/browser/shell_content_browser_client.h" |
-#include "content/shell/browser/shell_devtools_frontend.h" |
-#include "content/shell/common/shell_messages.h" |
-#include "content/shell/common/shell_switches.h" |
-#include "content/shell/common/webkit_test_helpers.h" |
-#include "ui/gfx/codec/png_codec.h" |
- |
-namespace content { |
- |
-const int kTestSVGWindowWidthDip = 480; |
-const int kTestSVGWindowHeightDip = 360; |
- |
-// WebKitTestResultPrinter ---------------------------------------------------- |
- |
-WebKitTestResultPrinter::WebKitTestResultPrinter( |
- std::ostream* output, std::ostream* error) |
- : state_(DURING_TEST), |
- capture_text_only_(false), |
- encode_binary_data_(false), |
- output_(output), |
- error_(error) { |
-} |
- |
-WebKitTestResultPrinter::~WebKitTestResultPrinter() { |
-} |
- |
-void WebKitTestResultPrinter::PrintTextHeader() { |
- if (state_ != DURING_TEST) |
- return; |
- if (!capture_text_only_) |
- *output_ << "Content-Type: text/plain\n"; |
- state_ = IN_TEXT_BLOCK; |
-} |
- |
-void WebKitTestResultPrinter::PrintTextBlock(const std::string& block) { |
- if (state_ != IN_TEXT_BLOCK) |
- return; |
- *output_ << block; |
-} |
- |
-void WebKitTestResultPrinter::PrintTextFooter() { |
- if (state_ != IN_TEXT_BLOCK) |
- return; |
- if (!capture_text_only_) { |
- *output_ << "#EOF\n"; |
- output_->flush(); |
- } |
- state_ = IN_IMAGE_BLOCK; |
-} |
- |
-void WebKitTestResultPrinter::PrintImageHeader( |
- const std::string& actual_hash, |
- const std::string& expected_hash) { |
- if (state_ != IN_IMAGE_BLOCK || capture_text_only_) |
- return; |
- *output_ << "\nActualHash: " << actual_hash << "\n"; |
- if (!expected_hash.empty()) |
- *output_ << "\nExpectedHash: " << expected_hash << "\n"; |
-} |
- |
-void WebKitTestResultPrinter::PrintImageBlock( |
- const std::vector<unsigned char>& png_image) { |
- if (state_ != IN_IMAGE_BLOCK || capture_text_only_) |
- return; |
- *output_ << "Content-Type: image/png\n"; |
- if (encode_binary_data_) { |
- PrintEncodedBinaryData(png_image); |
- return; |
- } |
- |
- *output_ << "Content-Length: " << png_image.size() << "\n"; |
- output_->write( |
- reinterpret_cast<const char*>(&png_image[0]), png_image.size()); |
-} |
- |
-void WebKitTestResultPrinter::PrintImageFooter() { |
- if (state_ != IN_IMAGE_BLOCK) |
- return; |
- if (!capture_text_only_) { |
- *output_ << "#EOF\n"; |
- output_->flush(); |
- } |
- state_ = AFTER_TEST; |
-} |
- |
-void WebKitTestResultPrinter::PrintAudioHeader() { |
- DCHECK_EQ(state_, DURING_TEST); |
- if (!capture_text_only_) |
- *output_ << "Content-Type: audio/wav\n"; |
- state_ = IN_AUDIO_BLOCK; |
-} |
- |
-void WebKitTestResultPrinter::PrintAudioBlock( |
- const std::vector<unsigned char>& audio_data) { |
- if (state_ != IN_AUDIO_BLOCK || capture_text_only_) |
- return; |
- if (encode_binary_data_) { |
- PrintEncodedBinaryData(audio_data); |
- return; |
- } |
- |
- *output_ << "Content-Length: " << audio_data.size() << "\n"; |
- output_->write( |
- reinterpret_cast<const char*>(&audio_data[0]), audio_data.size()); |
-} |
- |
-void WebKitTestResultPrinter::PrintAudioFooter() { |
- if (state_ != IN_AUDIO_BLOCK) |
- return; |
- if (!capture_text_only_) { |
- *output_ << "#EOF\n"; |
- output_->flush(); |
- } |
- state_ = IN_IMAGE_BLOCK; |
-} |
- |
-void WebKitTestResultPrinter::AddMessage(const std::string& message) { |
- AddMessageRaw(message + "\n"); |
-} |
- |
-void WebKitTestResultPrinter::AddMessageRaw(const std::string& message) { |
- if (state_ != DURING_TEST) |
- return; |
- *output_ << message; |
-} |
- |
-void WebKitTestResultPrinter::AddErrorMessage(const std::string& message) { |
- if (!capture_text_only_) |
- *error_ << message << "\n"; |
- if (state_ != DURING_TEST) |
- return; |
- PrintTextHeader(); |
- *output_ << message << "\n"; |
- PrintTextFooter(); |
- PrintImageFooter(); |
-} |
- |
-void WebKitTestResultPrinter::PrintEncodedBinaryData( |
- const std::vector<unsigned char>& data) { |
- *output_ << "Content-Transfer-Encoding: base64\n"; |
- |
- std::string data_base64; |
- base::Base64Encode( |
- base::StringPiece(reinterpret_cast<const char*>(&data[0]), data.size()), |
- &data_base64); |
- |
- *output_ << "Content-Length: " << data_base64.length() << "\n"; |
- output_->write(data_base64.c_str(), data_base64.length()); |
-} |
- |
-void WebKitTestResultPrinter::CloseStderr() { |
- if (state_ != AFTER_TEST) |
- return; |
- if (!capture_text_only_) { |
- *error_ << "#EOF\n"; |
- error_->flush(); |
- } |
-} |
- |
- |
-// WebKitTestController ------------------------------------------------------- |
- |
-WebKitTestController* WebKitTestController::instance_ = NULL; |
- |
-// static |
-WebKitTestController* WebKitTestController::Get() { |
- DCHECK(instance_); |
- return instance_; |
-} |
- |
-WebKitTestController::WebKitTestController() |
- : main_window_(NULL), |
- test_phase_(BETWEEN_TESTS), |
- is_leak_detection_enabled_( |
- base::CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kEnableLeakDetection)), |
- crash_when_leak_found_(false), |
- devtools_frontend_(NULL) { |
- CHECK(!instance_); |
- instance_ = this; |
- |
- if (is_leak_detection_enabled_) { |
- std::string switchValue = |
- base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
- switches::kEnableLeakDetection); |
- crash_when_leak_found_ = switchValue == switches::kCrashOnFailure; |
- } |
- |
- printer_.reset(new WebKitTestResultPrinter(&std::cout, &std::cerr)); |
- if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kEncodeBinary)) |
- printer_->set_encode_binary_data(true); |
- registrar_.Add(this, |
- NOTIFICATION_RENDERER_PROCESS_CREATED, |
- NotificationService::AllSources()); |
- GpuDataManager::GetInstance()->AddObserver(this); |
- ResetAfterLayoutTest(); |
-} |
- |
-WebKitTestController::~WebKitTestController() { |
- DCHECK(CalledOnValidThread()); |
- CHECK(instance_ == this); |
- CHECK(test_phase_ == BETWEEN_TESTS); |
- GpuDataManager::GetInstance()->RemoveObserver(this); |
- DiscardMainWindow(); |
- instance_ = NULL; |
-} |
- |
-bool WebKitTestController::PrepareForLayoutTest( |
- const GURL& test_url, |
- const base::FilePath& current_working_directory, |
- bool enable_pixel_dumping, |
- const std::string& expected_pixel_hash) { |
- DCHECK(CalledOnValidThread()); |
- test_phase_ = DURING_TEST; |
- current_working_directory_ = current_working_directory; |
- enable_pixel_dumping_ = enable_pixel_dumping; |
- expected_pixel_hash_ = expected_pixel_hash; |
- test_url_ = test_url; |
- printer_->reset(); |
- ShellBrowserContext* browser_context = |
- ShellContentBrowserClient::Get()->browser_context(); |
- if (test_url.spec().find("compositing/") != std::string::npos) |
- is_compositing_test_ = true; |
- initial_size_ = Shell::GetShellDefaultSize(); |
- // The W3C SVG layout tests use a different size than the other layout tests. |
- if (test_url.spec().find("W3C-SVG-1.1") != std::string::npos) |
- initial_size_ = gfx::Size(kTestSVGWindowWidthDip, kTestSVGWindowHeightDip); |
- if (!main_window_) { |
- main_window_ = content::Shell::CreateNewWindow( |
- browser_context, |
- GURL(), |
- NULL, |
- initial_size_); |
- WebContentsObserver::Observe(main_window_->web_contents()); |
- send_configuration_to_next_host_ = true; |
- current_pid_ = base::kNullProcessId; |
- main_window_->LoadURL(test_url); |
- } else { |
-#if defined(OS_MACOSX) |
- // Shell::SizeTo is not implemented on all platforms. |
- main_window_->SizeTo(initial_size_); |
-#endif |
- main_window_->web_contents()->GetRenderViewHost()->GetView() |
- ->SetSize(initial_size_); |
- main_window_->web_contents()->GetRenderViewHost()->WasResized(); |
- RenderViewHost* render_view_host = |
- main_window_->web_contents()->GetRenderViewHost(); |
- WebPreferences prefs = render_view_host->GetWebkitPreferences(); |
- OverrideWebkitPrefs(&prefs); |
- render_view_host->UpdateWebkitPreferences(prefs); |
- SendTestConfiguration(); |
- |
- NavigationController::LoadURLParams params(test_url); |
- params.transition_type = ui::PageTransitionFromInt( |
- ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR); |
- params.should_clear_history_list = true; |
- main_window_->web_contents()->GetController().LoadURLWithParams(params); |
- main_window_->web_contents()->Focus(); |
- } |
- main_window_->web_contents()->GetRenderViewHost()->SetActive(true); |
- main_window_->web_contents()->GetRenderViewHost()->Focus(); |
- return true; |
-} |
- |
-bool WebKitTestController::ResetAfterLayoutTest() { |
- DCHECK(CalledOnValidThread()); |
- printer_->PrintTextFooter(); |
- printer_->PrintImageFooter(); |
- printer_->CloseStderr(); |
- send_configuration_to_next_host_ = false; |
- test_phase_ = BETWEEN_TESTS; |
- is_compositing_test_ = false; |
- enable_pixel_dumping_ = false; |
- expected_pixel_hash_.clear(); |
- test_url_ = GURL(); |
- prefs_ = WebPreferences(); |
- should_override_prefs_ = false; |
- |
-#if defined(OS_ANDROID) |
- // Re-using the shell's main window on Android causes issues with networking |
- // requests never succeeding. See http://crbug.com/277652. |
- DiscardMainWindow(); |
-#endif |
- return true; |
-} |
- |
-void WebKitTestController::SetTempPath(const base::FilePath& temp_path) { |
- temp_path_ = temp_path; |
-} |
- |
-void WebKitTestController::RendererUnresponsive() { |
- DCHECK(CalledOnValidThread()); |
- LOG(WARNING) << "renderer unresponsive"; |
-} |
- |
-void WebKitTestController::WorkerCrashed() { |
- DCHECK(CalledOnValidThread()); |
- printer_->AddErrorMessage("#CRASHED - worker"); |
- DiscardMainWindow(); |
-} |
- |
-void WebKitTestController::OverrideWebkitPrefs(WebPreferences* prefs) { |
- if (should_override_prefs_) { |
- *prefs = prefs_; |
- } else { |
- ApplyLayoutTestDefaultPreferences(prefs); |
- if (is_compositing_test_) { |
- base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); |
- if (!command_line.HasSwitch(switches::kDisableGpu)) |
- prefs->accelerated_2d_canvas_enabled = true; |
- prefs->mock_scrollbars_enabled = true; |
- } |
- } |
-} |
- |
-void WebKitTestController::OpenURL(const GURL& url) { |
- if (test_phase_ != DURING_TEST) |
- return; |
- |
- Shell::CreateNewWindow(main_window_->web_contents()->GetBrowserContext(), |
- url, |
- main_window_->web_contents()->GetSiteInstance(), |
- gfx::Size()); |
-} |
- |
-void WebKitTestController::TestFinishedInSecondaryWindow() { |
- RenderViewHost* render_view_host = |
- main_window_->web_contents()->GetRenderViewHost(); |
- render_view_host->Send( |
- new ShellViewMsg_NotifyDone(render_view_host->GetRoutingID())); |
-} |
- |
-bool WebKitTestController::IsMainWindow(WebContents* web_contents) const { |
- return main_window_ && web_contents == main_window_->web_contents(); |
-} |
- |
-bool WebKitTestController::OnMessageReceived(const IPC::Message& message) { |
- DCHECK(CalledOnValidThread()); |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_PrintMessage, OnPrintMessage) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_TextDump, OnTextDump) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_ImageDump, OnImageDump) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_AudioDump, OnAudioDump) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_OverridePreferences, |
- OnOverridePreferences) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_TestFinished, OnTestFinished) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_ClearDevToolsLocalStorage, |
- OnClearDevToolsLocalStorage) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_ShowDevTools, OnShowDevTools) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_CloseDevTools, OnCloseDevTools) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_GoToOffset, OnGoToOffset) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_Reload, OnReload) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_LoadURLForFrame, OnLoadURLForFrame) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_CaptureSessionHistory, |
- OnCaptureSessionHistory) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_CloseRemainingWindows, |
- OnCloseRemainingWindows) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_ResetDone, OnResetDone) |
- IPC_MESSAGE_HANDLER(ShellViewHostMsg_LeakDetectionDone, OnLeakDetectionDone) |
- IPC_MESSAGE_UNHANDLED(handled = false) |
- IPC_END_MESSAGE_MAP() |
- |
- return handled; |
-} |
- |
-void WebKitTestController::PluginCrashed(const base::FilePath& plugin_path, |
- base::ProcessId plugin_pid) { |
- DCHECK(CalledOnValidThread()); |
- printer_->AddErrorMessage( |
- base::StringPrintf("#CRASHED - plugin (pid %d)", plugin_pid)); |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(base::IgnoreResult(&WebKitTestController::DiscardMainWindow), |
- base::Unretained(this))); |
-} |
- |
-void WebKitTestController::RenderViewCreated(RenderViewHost* render_view_host) { |
- DCHECK(CalledOnValidThread()); |
- // Might be kNullProcessHandle, in which case we will receive a notification |
- // later when the RenderProcessHost was created. |
- if (render_view_host->GetProcess()->GetHandle() != base::kNullProcessHandle) |
- current_pid_ = base::GetProcId(render_view_host->GetProcess()->GetHandle()); |
- if (!send_configuration_to_next_host_) |
- return; |
- send_configuration_to_next_host_ = false; |
- SendTestConfiguration(); |
-} |
- |
-void WebKitTestController::RenderProcessGone(base::TerminationStatus status) { |
- DCHECK(CalledOnValidThread()); |
- if (current_pid_ != base::kNullProcessId) { |
- printer_->AddErrorMessage(std::string("#CRASHED - renderer (pid ") + |
- base::IntToString(current_pid_) + ")"); |
- } else { |
- printer_->AddErrorMessage("#CRASHED - renderer"); |
- } |
- DiscardMainWindow(); |
-} |
- |
-void WebKitTestController::DevToolsProcessCrashed() { |
- DCHECK(CalledOnValidThread()); |
- printer_->AddErrorMessage("#CRASHED - devtools"); |
- if (devtools_frontend_) |
- devtools_frontend_->Close(); |
- devtools_frontend_ = NULL; |
-} |
- |
-void WebKitTestController::WebContentsDestroyed() { |
- DCHECK(CalledOnValidThread()); |
- printer_->AddErrorMessage("FAIL: main window was destroyed"); |
- DiscardMainWindow(); |
-} |
- |
-void WebKitTestController::Observe(int type, |
- const NotificationSource& source, |
- const NotificationDetails& details) { |
- DCHECK(CalledOnValidThread()); |
- switch (type) { |
- case NOTIFICATION_RENDERER_PROCESS_CREATED: { |
- if (!main_window_) |
- return; |
- RenderViewHost* render_view_host = |
- main_window_->web_contents()->GetRenderViewHost(); |
- if (!render_view_host) |
- return; |
- RenderProcessHost* render_process_host = |
- Source<RenderProcessHost>(source).ptr(); |
- if (render_process_host != render_view_host->GetProcess()) |
- return; |
- current_pid_ = base::GetProcId(render_process_host->GetHandle()); |
- break; |
- } |
- default: |
- NOTREACHED(); |
- } |
-} |
- |
-void WebKitTestController::OnGpuProcessCrashed( |
- base::TerminationStatus exit_code) { |
- DCHECK(CalledOnValidThread()); |
- printer_->AddErrorMessage("#CRASHED - gpu"); |
- DiscardMainWindow(); |
-} |
- |
-void WebKitTestController::DiscardMainWindow() { |
- // If we're running a test, we need to close all windows and exit the message |
- // loop. Otherwise, we're already outside of the message loop, and we just |
- // discard the main window. |
- WebContentsObserver::Observe(NULL); |
- if (test_phase_ != BETWEEN_TESTS) { |
- Shell::CloseAllWindows(); |
- base::MessageLoop::current()->PostTask(FROM_HERE, |
- base::MessageLoop::QuitClosure()); |
- test_phase_ = CLEAN_UP; |
- } else if (main_window_) { |
- main_window_->Close(); |
- } |
- main_window_ = NULL; |
- current_pid_ = base::kNullProcessId; |
-} |
- |
-void WebKitTestController::SendTestConfiguration() { |
- RenderViewHost* render_view_host = |
- main_window_->web_contents()->GetRenderViewHost(); |
- ShellTestConfiguration params; |
- params.current_working_directory = current_working_directory_; |
- params.temp_path = temp_path_; |
- params.test_url = test_url_; |
- params.enable_pixel_dumping = enable_pixel_dumping_; |
- params.allow_external_pages = |
- base::CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kAllowExternalPages); |
- params.expected_pixel_hash = expected_pixel_hash_; |
- params.initial_size = initial_size_; |
- render_view_host->Send(new ShellViewMsg_SetTestConfiguration( |
- render_view_host->GetRoutingID(), params)); |
-} |
- |
-void WebKitTestController::OnTestFinished() { |
- test_phase_ = CLEAN_UP; |
- if (!printer_->output_finished()) |
- printer_->PrintImageFooter(); |
- RenderViewHost* render_view_host = |
- main_window_->web_contents()->GetRenderViewHost(); |
- main_window_->web_contents()->ExitFullscreen(); |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(base::IgnoreResult(&WebKitTestController::Send), |
- base::Unretained(this), |
- new ShellViewMsg_Reset(render_view_host->GetRoutingID()))); |
-} |
- |
-void WebKitTestController::OnImageDump( |
- const std::string& actual_pixel_hash, |
- const SkBitmap& image) { |
- SkAutoLockPixels image_lock(image); |
- |
- printer_->PrintImageHeader(actual_pixel_hash, expected_pixel_hash_); |
- |
- // Only encode and dump the png if the hashes don't match. Encoding the |
- // image is really expensive. |
- if (actual_pixel_hash != expected_pixel_hash_) { |
- std::vector<unsigned char> png; |
- |
- bool discard_transparency = true; |
- if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kEnableOverlayFullscreenVideo)) |
- discard_transparency = false; |
- |
- std::vector<gfx::PNGCodec::Comment> comments; |
- comments.push_back(gfx::PNGCodec::Comment("checksum", actual_pixel_hash)); |
- bool success = gfx::PNGCodec::Encode( |
- static_cast<const unsigned char*>(image.getPixels()), |
- gfx::PNGCodec::FORMAT_BGRA, |
- gfx::Size(image.width(), image.height()), |
- static_cast<int>(image.rowBytes()), |
- discard_transparency, |
- comments, |
- &png); |
- if (success) |
- printer_->PrintImageBlock(png); |
- } |
- printer_->PrintImageFooter(); |
-} |
- |
-void WebKitTestController::OnAudioDump(const std::vector<unsigned char>& dump) { |
- printer_->PrintAudioHeader(); |
- printer_->PrintAudioBlock(dump); |
- printer_->PrintAudioFooter(); |
-} |
- |
-void WebKitTestController::OnTextDump(const std::string& dump) { |
- printer_->PrintTextHeader(); |
- printer_->PrintTextBlock(dump); |
- printer_->PrintTextFooter(); |
-} |
- |
-void WebKitTestController::OnPrintMessage(const std::string& message) { |
- printer_->AddMessageRaw(message); |
-} |
- |
-void WebKitTestController::OnOverridePreferences(const WebPreferences& prefs) { |
- should_override_prefs_ = true; |
- prefs_ = prefs; |
-} |
- |
-void WebKitTestController::OnClearDevToolsLocalStorage() { |
- ShellBrowserContext* browser_context = |
- ShellContentBrowserClient::Get()->browser_context(); |
- StoragePartition* storage_partition = |
- BrowserContext::GetStoragePartition(browser_context, NULL); |
- storage_partition->GetDOMStorageContext()->DeleteLocalStorage( |
- content::LayoutTestDevToolsFrontend::GetDevToolsPathAsURL("", "") |
- .GetOrigin()); |
-} |
- |
-void WebKitTestController::OnShowDevTools(const std::string& settings, |
- const std::string& frontend_url) { |
- if (!devtools_frontend_) { |
- devtools_frontend_ = LayoutTestDevToolsFrontend::Show( |
- main_window_->web_contents(), settings, frontend_url); |
- } else { |
- devtools_frontend_->ReuseFrontend(settings, frontend_url); |
- } |
- devtools_frontend_->Activate(); |
- devtools_frontend_->Focus(); |
-} |
- |
-void WebKitTestController::OnCloseDevTools() { |
- if (devtools_frontend_) |
- devtools_frontend_->DisconnectFromTarget(); |
-} |
- |
-void WebKitTestController::OnGoToOffset(int offset) { |
- main_window_->GoBackOrForward(offset); |
-} |
- |
-void WebKitTestController::OnReload() { |
- main_window_->Reload(); |
-} |
- |
-void WebKitTestController::OnLoadURLForFrame(const GURL& url, |
- const std::string& frame_name) { |
- main_window_->LoadURLForFrame(url, frame_name); |
-} |
- |
-void WebKitTestController::OnCaptureSessionHistory() { |
- std::vector<int> routing_ids; |
- std::vector<std::vector<PageState> > session_histories; |
- std::vector<unsigned> current_entry_indexes; |
- |
- RenderViewHost* render_view_host = |
- main_window_->web_contents()->GetRenderViewHost(); |
- |
- for (std::vector<Shell*>::iterator window = Shell::windows().begin(); |
- window != Shell::windows().end(); |
- ++window) { |
- WebContents* web_contents = (*window)->web_contents(); |
- // Only capture the history from windows in the same process as the main |
- // window. During layout tests, we only use two processes when an |
- // devtools window is open. |
- if (render_view_host->GetProcess() != |
- web_contents->GetRenderViewHost()->GetProcess()) { |
- continue; |
- } |
- routing_ids.push_back(web_contents->GetRenderViewHost()->GetRoutingID()); |
- current_entry_indexes.push_back( |
- web_contents->GetController().GetCurrentEntryIndex()); |
- std::vector<PageState> history; |
- for (int entry = 0; entry < web_contents->GetController().GetEntryCount(); |
- ++entry) { |
- PageState state = web_contents->GetController().GetEntryAtIndex(entry)-> |
- GetPageState(); |
- if (!state.IsValid()) { |
- state = PageState::CreateFromURL( |
- web_contents->GetController().GetEntryAtIndex(entry)->GetURL()); |
- } |
- history.push_back(state); |
- } |
- session_histories.push_back(history); |
- } |
- |
- Send(new ShellViewMsg_SessionHistory(render_view_host->GetRoutingID(), |
- routing_ids, |
- session_histories, |
- current_entry_indexes)); |
-} |
- |
-void WebKitTestController::OnCloseRemainingWindows() { |
- DevToolsAgentHost::DetachAllClients(); |
- std::vector<Shell*> open_windows(Shell::windows()); |
- Shell* devtools_shell = devtools_frontend_ ? |
- devtools_frontend_->frontend_shell() : NULL; |
- for (size_t i = 0; i < open_windows.size(); ++i) { |
- if (open_windows[i] != main_window_ && open_windows[i] != devtools_shell) |
- open_windows[i]->Close(); |
- } |
- base::MessageLoop::current()->RunUntilIdle(); |
-} |
- |
-void WebKitTestController::OnResetDone() { |
- if (is_leak_detection_enabled_) { |
- if (main_window_ && main_window_->web_contents()) { |
- RenderViewHost* render_view_host = |
- main_window_->web_contents()->GetRenderViewHost(); |
- render_view_host->Send( |
- new ShellViewMsg_TryLeakDetection(render_view_host->GetRoutingID())); |
- } |
- return; |
- } |
- |
- base::MessageLoop::current()->PostTask(FROM_HERE, |
- base::MessageLoop::QuitClosure()); |
-} |
- |
-void WebKitTestController::OnLeakDetectionDone( |
- const LeakDetectionResult& result) { |
- if (!result.leaked) { |
- base::MessageLoop::current()->PostTask(FROM_HERE, |
- base::MessageLoop::QuitClosure()); |
- return; |
- } |
- |
- printer_->AddErrorMessage( |
- base::StringPrintf("#LEAK - renderer pid %d (%s)", current_pid_, |
- result.detail.c_str())); |
- CHECK(!crash_when_leak_found_); |
- |
- DiscardMainWindow(); |
-} |
- |
-} // namespace content |