// 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 CHROME_TEST_BASE_JAVASCRIPT_TEST_OBSERVER_H_
#define CHROME_TEST_BASE_JAVASCRIPT_TEST_OBSERVER_H_
#include <string>
#include "base/compiler_specific.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
namespace base {
class DictionaryValue;
}
namespace content {
class RenderViewHost;
}
// Base class for handling a stream of automation messages produced by a
// JavascriptTestObserver.
class TestMessageHandler {
public:
enum MessageResponse {
// Reset the timeout and keep running.
CONTINUE,
// Stop runnning.
DONE
};
TestMessageHandler();
virtual ~TestMessageHandler();
// Called when a message is received from the DOM automation controller.
virtual MessageResponse HandleMessage(const std::string& json) = 0;
void SetError(const std::string& message);
bool ok() const {
return ok_;
}
const std::string& error_message() const {
return error_message_;
}
// Prepare the handler to be used or reused.
virtual void Reset();
private:
bool ok_;
std::string error_message_;
};
// This class captures a stream of automation messages coming from a Javascript
// test and dispatches them to a message handler.
class JavascriptTestObserver : public content::NotificationObserver {
public:
// The observer does not own any arguments passed to it. It is assumed that
// the arguments will outlive all uses of the observer.
JavascriptTestObserver(
content::RenderViewHost* render_view_host,
TestMessageHandler* handler);
virtual ~JavascriptTestObserver();
// Pump the message loop until the message handler indicates the Javascript
// test is done running. Return true if the test jig functioned correctly and
// nothing timed out.
bool Run();
// Prepare the observer to be used again. This method should NOT be called
// while Run() is pumping the message loop.
void Reset();
virtual void Observe(
int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
private:
// This message did not signal the end of a test, keep going.
void Continue();
// This was the last message we care about, stop listening for more messages.
void EndTest();
TestMessageHandler* handler_;
bool running_;
bool finished_;
content::NotificationRegistrar registrar_;
DISALLOW_COPY_AND_ASSIGN(JavascriptTestObserver);
};
#endif // CHROME_TEST_BASE_JAVASCRIPT_TEST_OBSERVER_H_