Add extra parameter to BrowserChildProcessCrashed to pass the exit_code at time of crash/termination.

Wire this into all the existing callers.

Add a new child process watcher in chrome to be notified on child process crashes. This will confirm whether users with RESULT_CODE_INVALID_SANDBOX_STATE are crashing on background start (--no-startup-window) or not. This also adds required framework to paint a sad tab UI from this class in the future.

BUG=472324, 453541
TEST=Apply patch in http://pastebin.com/uEDxngBa and verify histogram ChildProcess.InvalidSandboxStateCrash.NoStartupWindow is recorded.

Review URL: https://codereview.chromium.org/1067733006

Cr-Commit-Position: refs/heads/master@{#327380}
diff --git a/chrome/browser/chrome_child_process_watcher.cc b/chrome/browser/chrome_child_process_watcher.cc
new file mode 100644
index 0000000..77367e94
--- /dev/null
+++ b/chrome/browser/chrome_child_process_watcher.cc
@@ -0,0 +1,41 @@
+// Copyright 2015 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 "chrome/browser/chrome_child_process_watcher.h"
+
+#include "base/command_line.h"
+#include "base/metrics/histogram.h"
+#include "chrome/common/chrome_result_codes.h"
+#include "chrome/common/chrome_switches.h"
+#include "content/public/browser/browser_child_process_observer.h"
+#include "content/public/browser/child_process_data.h"
+
+namespace {
+
+void AnalyzeCrash(int exit_code) {
+  if (exit_code == chrome::RESULT_CODE_INVALID_SANDBOX_STATE) {
+    base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+    const bool no_startup_window =
+        command_line->HasSwitch(switches::kNoStartupWindow);
+    UMA_HISTOGRAM_BOOLEAN(
+        "ChildProcess.InvalidSandboxStateCrash.NoStartupWindow",
+        no_startup_window);
+  }
+}
+
+}  // namespace
+
+ChromeChildProcessWatcher::ChromeChildProcessWatcher() {
+  BrowserChildProcessObserver::Add(this);
+}
+
+ChromeChildProcessWatcher::~ChromeChildProcessWatcher() {
+  BrowserChildProcessObserver::Remove(this);
+}
+
+void ChromeChildProcessWatcher::BrowserChildProcessCrashed(
+    const content::ChildProcessData& data,
+    int exit_code) {
+  AnalyzeCrash(exit_code);
+}