Index: content/shell/webkit_test_controller.cc |
diff --git a/content/shell/webkit_test_controller.cc b/content/shell/webkit_test_controller.cc |
index 7b282765d8500fae63f59b2aee2f807b86fcc367..f12c4a42e1959ae4abf3fe6e0bf3a070ddb86b01 100644 |
--- a/content/shell/webkit_test_controller.cc |
+++ b/content/shell/webkit_test_controller.cc |
@@ -9,8 +9,13 @@ |
#include "base/command_line.h" |
#include "base/file_util.h" |
#include "base/message_loop.h" |
+#include "base/process_util.h" |
#include "base/run_loop.h" |
+#include "base/string_number_conversions.h" |
#include "content/public/browser/navigation_controller.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/web_contents.h" |
#include "content/shell/shell.h" |
@@ -130,6 +135,9 @@ WebKitTestController::WebKitTestController() { |
CHECK(!instance_); |
instance_ = this; |
printer_.reset(new WebKitTestResultPrinter(&std::cout, &std::cerr)); |
+ registrar_.Add(this, |
+ NOTIFICATION_RENDERER_PROCESS_CREATED, |
+ NotificationService::AllSources()); |
ResetAfterLayoutTest(); |
} |
@@ -161,7 +169,7 @@ bool WebKitTestController::PrepareForLayoutTest( |
NULL, |
MSG_ROUTING_NONE, |
NULL); |
- Observe(main_window_->web_contents()); |
+ WebContentsObserver::Observe(main_window_->web_contents()); |
main_window_->LoadURL(test_url); |
if (test_url.spec().find("/dumpAsText/") != std::string::npos || |
test_url.spec().find("\\dumpAsText\\") != std::string::npos) { |
@@ -198,11 +206,12 @@ bool WebKitTestController::ResetAfterLayoutTest() { |
} |
watchdog_.Cancel(); |
if (main_window_) { |
- Observe(NULL); |
+ WebContentsObserver::Observe(NULL); |
main_window_ = NULL; |
} |
Shell::CloseAllWindows(); |
Send(new ShellViewMsg_ResetAll); |
+ current_pid_ = base::kNullProcessId; |
return true; |
} |
@@ -264,14 +273,19 @@ void WebKitTestController::PluginCrashed(const FilePath& plugin_path) { |
void WebKitTestController::RenderViewCreated(RenderViewHost* render_view_host) { |
DCHECK(CalledOnValidThread()); |
+ // Might be kNullProcessId, in which case we will receive a notification later |
+ // when the RenderProcessHost was created. |
+ current_pid_ = base::GetProcId(render_view_host->GetProcess()->GetHandle()); |
render_view_host->Send(new ShellViewMsg_SetCurrentWorkingDirectory( |
render_view_host->GetRoutingID(), current_working_directory_)); |
} |
void WebKitTestController::RenderViewGone(base::TerminationStatus status) { |
DCHECK(CalledOnValidThread()); |
- if (status == base::TERMINATION_STATUS_PROCESS_CRASHED || |
- status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { |
+ if (current_pid_ != base::kNullProcessId) { |
+ printer_->AddErrorMessage(std::string("#CRASHED - renderer (pid ") + |
+ base::IntToString(current_pid_) + ")"); |
+ } else { |
printer_->AddErrorMessage("#CRASHED - renderer"); |
} |
} |
@@ -282,6 +296,30 @@ void WebKitTestController::WebContentsDestroyed(WebContents* web_contents) { |
printer_->AddErrorMessage("FAIL: main window was destroyed"); |
} |
+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::CaptureDump() { |
if (captured_dump_ || !main_window_ || !printer_->in_text_block()) |
return; |