Index: content/shell/shell_render_process_observer.cc |
diff --git a/content/shell/shell_render_process_observer.cc b/content/shell/shell_render_process_observer.cc |
index 25f4f95536620ba891c1011bfa733a820c639b81..250c91165d73cf6b428154c3cb7480b00547bc68 100644 |
--- a/content/shell/shell_render_process_observer.cc |
+++ b/content/shell/shell_render_process_observer.cc |
@@ -5,19 +5,63 @@ |
#include "content/shell/shell_render_process_observer.h" |
#include "base/command_line.h" |
+#include "content/public/renderer/render_view.h" |
#include "content/public/renderer/render_thread.h" |
+#include "content/shell/shell_messages.h" |
#include "content/shell/shell_switches.h" |
#include "content/shell/webkit_test_runner_bindings.h" |
#include "webkit/glue/webkit_glue.h" |
#include "webkit/support/gc_extension.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebTestingSupport.h" |
+#include "third_party/WebKit/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h" |
+ |
+using WebKit::WebFrame; |
+using WebKit::WebTestingSupport; |
+using WebTestRunner::WebTestDelegate; |
+using WebTestRunner::WebTestInterfaces; |
namespace content { |
-ShellRenderProcessObserver::ShellRenderProcessObserver() { |
+namespace { |
+ShellRenderProcessObserver* g_instance = NULL; |
+} |
+ |
+// static |
+ShellRenderProcessObserver* ShellRenderProcessObserver::GetInstance() { |
+ return g_instance; |
+} |
+ |
+ShellRenderProcessObserver::ShellRenderProcessObserver() |
+ : test_delegate_(NULL) { |
+ CHECK(!g_instance); |
+ g_instance = this; |
RenderThread::Get()->AddObserver(this); |
} |
ShellRenderProcessObserver::~ShellRenderProcessObserver() { |
+ CHECK(g_instance == this); |
+ g_instance = NULL; |
+} |
+ |
+void ShellRenderProcessObserver::SetMainWindow( |
+ RenderView* view, |
+ WebTestDelegate* delegate) { |
+ if (view == NULL) { |
+ if (delegate == test_delegate_) { |
+ test_interfaces_->setDelegate(NULL); |
+ test_interfaces_->setWebView(NULL); |
+ test_delegate_ = NULL; |
+ } |
+ } else { |
+ test_interfaces_->setDelegate(delegate); |
+ test_interfaces_->setWebView(view->GetWebView()); |
+ test_delegate_ = delegate; |
+ } |
+} |
+ |
+void ShellRenderProcessObserver::BindTestRunnersToWindow(WebFrame* frame) { |
+ WebTestingSupport::injectInternalsObject(frame); |
+ test_interfaces_->bindTo(frame); |
} |
void ShellRenderProcessObserver::WebKitInitialized() { |
@@ -31,6 +75,24 @@ void ShellRenderProcessObserver::WebKitInitialized() { |
// We always expose GC to layout tests. |
webkit_glue::SetJavaScriptFlags(" --expose-gc"); |
RenderThread::Get()->RegisterExtension(extensions_v8::GCExtension::Get()); |
+ |
+ test_interfaces_.reset(new WebTestInterfaces); |
+} |
+ |
+bool ShellRenderProcessObserver::OnControlMessageReceived( |
+ const IPC::Message& message) { |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(ShellRenderProcessObserver, message) |
+ IPC_MESSAGE_HANDLER(ShellViewMsg_ResetAll, OnResetAll) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ |
+ return handled; |
+} |
+ |
+void ShellRenderProcessObserver::OnResetAll() { |
+ test_interfaces_->resetAll(); |
+ // We don't reset the WebTestingSupport objects, as we don't reuse WebViews. |
} |
} // namespace content |