| Index: chrome/test/android/javatests_staging/src/org/chromium/chrome/test/util/OverviewModeBehaviorWatcher.java | 
| diff --git a/chrome/test/android/javatests_staging/src/org/chromium/chrome/test/util/OverviewModeBehaviorWatcher.java b/chrome/test/android/javatests_staging/src/org/chromium/chrome/test/util/OverviewModeBehaviorWatcher.java | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..9a8a2816d8f2ad0a2924984e7ebd2cf164ccb7e4 | 
| --- /dev/null | 
| +++ b/chrome/test/android/javatests_staging/src/org/chromium/chrome/test/util/OverviewModeBehaviorWatcher.java | 
| @@ -0,0 +1,82 @@ | 
| +// 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. | 
| + | 
| +package org.chromium.chrome.test.util; | 
| + | 
| +import junit.framework.Assert; | 
| + | 
| +import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; | 
| +import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver; | 
| +import org.chromium.content.browser.test.util.Criteria; | 
| +import org.chromium.content.browser.test.util.CriteriaHelper; | 
| + | 
| +/** | 
| + * Checks and waits for certain overview mode events to happen.  Can be used to block test threads | 
| + * until certain overview mode state criteria are met. | 
| + */ | 
| +public class OverviewModeBehaviorWatcher implements OverviewModeObserver { | 
| +    private final OverviewModeBehavior mOverviewModeBehavior; | 
| +    private boolean mWaitingForShow; | 
| +    private boolean mWaitingForHide; | 
| + | 
| +    private final Criteria mCriteria = new Criteria() { | 
| +        @Override | 
| +        public boolean isSatisfied() { | 
| +            return !mWaitingForShow && !mWaitingForHide; | 
| +        } | 
| +    }; | 
| + | 
| +    /** | 
| +     * Creates an instance of an {@link OverviewModeBehaviorWatcher}.  Note that at this point | 
| +     * it will be registered for overview mode events. | 
| +     * | 
| +     * @param behavior          The {@link OverviewModeBehavior} to watch. | 
| +     * @param waitForShow Whether or not to wait for overview mode to finish showing. | 
| +     * @param waitForHide Whether or not to wait for overview mode to finish hiding. | 
| +     */ | 
| +    public OverviewModeBehaviorWatcher(OverviewModeBehavior behavior, boolean waitForShow, | 
| +            boolean waitForHide) { | 
| +        mOverviewModeBehavior = behavior; | 
| +        mOverviewModeBehavior.addOverviewModeObserver(this); | 
| + | 
| +        mWaitingForShow = waitForShow; | 
| +        mWaitingForHide = waitForHide; | 
| +    } | 
| + | 
| +    @Override | 
| +    public void onOverviewModeStartedShowing(boolean showToolbar) { } | 
| + | 
| +    @Override | 
| +    public void onOverviewModeFinishedShowing() { | 
| +        mWaitingForShow = false; | 
| +    } | 
| + | 
| +    @Override | 
| +    public void onOverviewModeStartedHiding(boolean showToolbar, boolean delayAnimation) { } | 
| + | 
| +    @Override | 
| +    public void onOverviewModeFinishedHiding() { | 
| +        mWaitingForHide = false; | 
| +    } | 
| + | 
| +    /** | 
| +     * Blocks until all of the expected events have occurred.  Once the events of this class | 
| +     * are met it will always return immediately from {@link #waitForBehavior()}. | 
| +     * @throws InterruptedException | 
| +     */ | 
| +    public void waitForBehavior() throws InterruptedException { | 
| +        try { | 
| +            if (!CriteriaHelper.pollForUIThreadCriteria(mCriteria)) { | 
| +                Assert.assertFalse( | 
| +                        "OverviewModeObserver#onOverviewModeFinishedShowing() not called.", | 
| +                        mWaitingForShow); | 
| +                Assert.assertFalse( | 
| +                        "OverviewModeObserver#onOverviewModeFinishedHiding() not called.", | 
| +                        mWaitingForHide); | 
| +            } | 
| +        } finally { | 
| +            mOverviewModeBehavior.removeOverviewModeObserver(this); | 
| +        } | 
| +    } | 
| +} | 
|  |