blob: 792f0ee82d2e4b9b716a91c6e8ae9dc7983bd360 [file] [log] [blame]
// Copyright (c) 2012 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.
#ifndef CONTENT_SHELL_WEBKIT_TEST_RUNNER_HOST_H_
#define CONTENT_SHELL_WEBKIT_TEST_RUNNER_HOST_H_
#include <ostream>
#include <string>
#include "base/cancelable_callback.h"
#include "base/threading/non_thread_safe.h"
#include "content/public/browser/render_view_host_observer.h"
#include "content/public/browser/web_contents_observer.h"
class SkBitmap;
namespace content {
class Shell;
class WebKitTestResultPrinter {
public:
WebKitTestResultPrinter(std::ostream* output, std::ostream* error);
~WebKitTestResultPrinter();
void reset() {
state_ = BEFORE_TEST;
}
bool in_text_block() const { return state_ == IN_TEXT_BLOCK; }
void set_capture_text_only(bool capture_text_only) {
capture_text_only_ = capture_text_only;
}
void PrintTextHeader();
void PrintTextBlock(const std::string& block);
void PrintTextFooter();
void PrintImageHeader(const std::string& actual_hash,
const std::string& expected_hash);
void PrintImageBlock(const std::vector<unsigned char>& png_image);
void PrintImageFooter();
void AddMessage(const std::string& message);
void AddErrorMessage(const std::string& message);
private:
enum State {
BEFORE_TEST,
IN_TEXT_BLOCK,
IN_IMAGE_BLOCK,
AFTER_TEST
};
State state_;
bool capture_text_only_;
std::ostream* output_;
std::ostream* error_;
DISALLOW_COPY_AND_ASSIGN(WebKitTestResultPrinter);
};
class WebKitTestController : public base::NonThreadSafe,
public WebContentsObserver {
public:
static WebKitTestController* Get();
WebKitTestController();
virtual ~WebKitTestController();
// True if the controller is ready for testing.
bool PrepareForLayoutTest(const GURL& test_url,
bool enable_pixel_dumping,
const std::string& expected_pixel_hash);
// True if the controller was reset successfully.
bool ResetAfterLayoutTest();
void RendererUnresponsive();
WebKitTestResultPrinter* printer() { return printer_.get(); }
void set_printer(WebKitTestResultPrinter* printer) {
printer_.reset(printer);
}
// Interface for WebKitTestRunnerHost.
void NotifyDone();
void WaitUntilDone();
void NotImplemented(const std::string& object_name,
const std::string& method_name);
bool should_stay_on_page_after_handling_before_unload() const {
return should_stay_on_page_after_handling_before_unload_;
}
void set_should_stay_on_page_after_handling_before_unload(
bool should_stay_on_page_after_handling_before_unload) {
should_stay_on_page_after_handling_before_unload_ =
should_stay_on_page_after_handling_before_unload;
}
bool dump_as_text() const { return dump_as_text_; }
void set_dump_as_text(bool dump_as_text) { dump_as_text_ = dump_as_text; }
bool dump_child_frames() const { return dump_child_frames_; }
void set_dump_child_frames(bool dump_child_frames) {
dump_child_frames_ = dump_child_frames;
}
bool is_printing() const { return is_printing_; }
void set_is_printing(bool is_printing) { is_printing_ = is_printing; }
// WebContentsObserver implementation.
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
virtual void PluginCrashed(const FilePath& plugin_path) OVERRIDE;
virtual void RenderViewGone(base::TerminationStatus status) OVERRIDE;
virtual void WebContentsDestroyed(WebContents* web_contents) OVERRIDE;
private:
static WebKitTestController* instance_;
void CaptureDump();
void TimeoutHandler();
// Message handlers.
void OnDidFinishLoad();
void OnImageDump(const std::string& actual_pixel_hash, const SkBitmap& image);
void OnTextDump(const std::string& dump);
scoped_ptr<WebKitTestResultPrinter> printer_;
Shell* main_window_;
bool pumping_messages_;
bool renderer_crashed_;
bool enable_pixel_dumping_;
std::string expected_pixel_hash_;
bool captured_dump_;
bool dump_as_text_;
bool dump_child_frames_;
bool is_printing_;
bool should_stay_on_page_after_handling_before_unload_;
bool wait_until_done_;
base::CancelableClosure watchdog_;
DISALLOW_COPY_AND_ASSIGN(WebKitTestController);
};
class WebKitTestRunnerHost : public RenderViewHostObserver {
public:
explicit WebKitTestRunnerHost(RenderViewHost* render_view_host);
virtual ~WebKitTestRunnerHost();
// RenderViewHostObserver implementation.
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
private:
// testRunner handlers.
void OnNotifyDone();
void OnDumpAsText();
void OnDumpChildFramesAsText();
void OnSetPrinting();
void OnSetShouldStayOnPageAfterHandlingBeforeUnload(bool should_stay_on_page);
void OnWaitUntilDone();
void OnNotImplemented(const std::string& object_name,
const std::string& method_name);
DISALLOW_COPY_AND_ASSIGN(WebKitTestRunnerHost);
};
} // namespace content
#endif // CONTENT_SHELL_WEBKIT_TEST_RUNNER_HOST_H_