910e62b5创建于 1月15日历史提交
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_TEST_VIEW_DRAWN_WAITER_H_
#define ASH_TEST_VIEW_DRAWN_WAITER_H_

#include <memory>

#include "ash/ash_export.h"
#include "base/scoped_observation.h"
#include "ui/views/view.h"
#include "ui/views/view_observer.h"

namespace base {
class RunLoop;
}

namespace ash {

// Helper that allows waiting for a view to be drawn. See `Wait()` below. An
// instance can be used more than once (i.e. to wait on a different view).
class ViewDrawnWaiter : public views::ViewObserver {
 public:
  ViewDrawnWaiter();
  ViewDrawnWaiter(const ViewDrawnWaiter&) = delete;
  ViewDrawnWaiter& operator=(const ViewDrawnWaiter&) = delete;
  ~ViewDrawnWaiter() override;

  // Waits for `view` to be drawn (implying visible) and have non-zero size
  // (implying layout is complete).
  void Wait(views::View* view);

 private:
  // views::ViewObserver:
  void OnViewVisibilityChanged(views::View* view,
                               views::View* starting_view,
                               bool visible) override;
  void OnViewBoundsChanged(views::View* view) override;
  void OnViewIsDeleting(views::View* view) override;

  std::unique_ptr<base::RunLoop> wait_loop_;
  base::ScopedObservation<views::View, views::ViewObserver> view_observer_{
      this};
};

}  // namespace ash

#endif  // ASH_TEST_VIEW_DRAWN_WAITER_H_