Add Startup.BrowserView.FirstPaint / .CompositingEnded histograms.

Startup.BrowserView.FirstPaint measures how long does it take from browser
startup until BrowserView finished the initial paint of all its children.

Startup.BrowserView.CompositingEnded measures the time from browser startup
to the time the GPU has finished compositing after BrowserView has finished
painting its children. At this point the Browser interface is visible on
screen. Measures how much time does it take for GPU to actually paint the
first time.

BUG=704945,589118

Review-Url: https://codereview.chromium.org/2773973002
Cr-Commit-Position: refs/heads/master@{#466009}
diff --git a/chrome/browser/metrics/browser_window_histogram_helper.h b/chrome/browser/metrics/browser_window_histogram_helper.h
new file mode 100644
index 0000000..ab305264
--- /dev/null
+++ b/chrome/browser/metrics/browser_window_histogram_helper.h
@@ -0,0 +1,49 @@
+// Copyright 2017 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_BROWSER_METRICS_BROWSER_WINDOW_HISTOGRAM_HELPER_H_
+#define CHROME_BROWSER_METRICS_BROWSER_WINDOW_HISTOGRAM_HELPER_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/scoped_observer.h"
+#include "base/time/time.h"
+#include "ui/compositor/compositor_observer.h"
+
+// Class that encapsulates logic of recording
+// Startup.BrowserWindow.FirstPaint* histograms.
+//
+// There's a dependency on ui/compositor therefore it can't be moved to
+// components/startup_metrics_utils.
+class BrowserWindowHistogramHelper : public ui::CompositorObserver {
+ public:
+  ~BrowserWindowHistogramHelper() override;
+
+  // Call this when the Browser finishes painting its UI, and the user will see
+  // it after next Compositor frame swap.
+  // |compositor| is the compositor that composites the just-painted Browser
+  // widget, or nullptr in Cocoa (we're using CoreAnimation's compositor there).
+  // Returned object should stay alive until next |OnCompositingStarted|
+  // callback.
+  static std::unique_ptr<BrowserWindowHistogramHelper>
+  MaybeRecordValueAndCreateInstanceOnBrowserPaint(ui::Compositor* compositor);
+
+ private:
+  explicit BrowserWindowHistogramHelper(ui::Compositor* compositor);
+
+  // ui::CompositorObserver:
+  void OnCompositingDidCommit(ui::Compositor* compositor) override {}
+  void OnCompositingStarted(ui::Compositor* compositor,
+                            base::TimeTicks start_time) override {}
+  void OnCompositingEnded(ui::Compositor* compositor) override;
+  void OnCompositingLockStateChanged(ui::Compositor* compositor) override {}
+  void OnCompositingShuttingDown(ui::Compositor* compositor) override;
+
+  ScopedObserver<ui::Compositor, ui::CompositorObserver> scoped_observer_;
+
+  DISALLOW_COPY_AND_ASSIGN(BrowserWindowHistogramHelper);
+};
+
+#endif  // CHROME_BROWSER_METRICS_BROWSER_WINDOW_HISTOGRAM_HELPER_H_