Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/metrics/PageLoadMetrics.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/PageLoadMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/PageLoadMetrics.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..baedce9c764513ee2558c2ca5daef27325d58180 |
| --- /dev/null |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/PageLoadMetrics.java |
| @@ -0,0 +1,60 @@ |
| +// Copyright 2016 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. |
| + |
| +package org.chromium.chrome.browser.metrics; |
| + |
| +import org.chromium.base.ThreadUtils; |
| +import org.chromium.base.annotations.CalledByNative; |
| +import org.chromium.content_public.browser.WebContents; |
| + |
| +import java.util.ArrayList; |
| +import java.util.List; |
| + |
| +/** |
| + * Receives the page load metrics updates from AndroidPageLoadMetricsObserver, and notifies the |
| + * observers. |
| + * |
| + * Threading: everything here must happen on the UI thread. |
| + */ |
| +public class PageLoadMetrics { |
| + public static final String FIRST_CONTENTFUL_PAINT = "firstContentfulPaint"; |
| + |
| + /** Observer for page load metrics. */ |
| + public interface Observer { |
| + /** |
| + * Called when the first contentful paint page load metric is available. |
| + * |
| + * @param webContents the WebContents this metrics is related to. |
| + * @param firstContentfulPaintMs Time to first contentful paint from navigation start. |
| + */ |
| + public void onFirstContentfulPaint(WebContents webContents, long firstContentfulPaintMs); |
| + } |
| + |
| + private static List<Observer> sObservers = null; |
| + |
| + /** Adds an observer. */ |
| + public static void addObserver(Observer observer) { |
| + ThreadUtils.assertOnUiThread(); |
| + if (sObservers == null) sObservers = new ArrayList<Observer>(); |
| + sObservers.add(observer); |
| + } |
| + |
| + /** Removes an observer. */ |
| + public static void removeObserver(Observer observer) { |
| + ThreadUtils.assertOnUiThread(); |
| + sObservers.remove(observer); |
|
Bryan McQuade
2016/07/26 14:29:33
is this safe if a listener removes themselves duri
Benoit L
2016/07/27 16:23:45
Yes, there is ObserverList in Java as well. I deli
|
| + if (sObservers.size() == 0) sObservers = null; |
| + } |
| + |
| + @CalledByNative |
| + static void onFirstContentfulPaint(WebContents webContents, long firstContentfulPaintMs) { |
| + ThreadUtils.assertOnUiThread(); |
| + if (sObservers == null) return; |
| + for (Observer observer : sObservers) { |
| + observer.onFirstContentfulPaint(webContents, firstContentfulPaintMs); |
| + } |
| + } |
| + |
| + private PageLoadMetrics() {} |
| +} |