occlusion_tracker_pauser.cc 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/utility/occlusion_tracker_pauser.h"
  5. #include "ash/shell.h"
  6. #include "base/bind.h"
  7. #include "ui/aura/window_tree_host.h"
  8. #include "ui/compositor/compositor.h"
  9. namespace ash {
  10. OcclusionTrackerPauser::OcclusionTrackerPauser() = default;
  11. OcclusionTrackerPauser::~OcclusionTrackerPauser() {
  12. DCHECK(!observations_.IsObservingAnySource());
  13. }
  14. void OcclusionTrackerPauser::PauseUntilAnimationsEnd(base::TimeDelta timeout) {
  15. for (auto* root : Shell::GetAllRootWindows())
  16. Pause(root->GetHost()->compositor());
  17. if (!scoped_pause_) {
  18. scoped_pause_ =
  19. std::make_unique<aura::WindowOcclusionTracker::ScopedPause>();
  20. }
  21. timer_.Stop();
  22. if (!timeout.is_zero()) {
  23. timer_.Start(FROM_HERE, timeout,
  24. base::BindOnce(&OcclusionTrackerPauser::Timeout,
  25. base::Unretained(this)));
  26. }
  27. }
  28. void OcclusionTrackerPauser::OnLastAnimationEnded(ui::Compositor* compositor) {
  29. OnFinish(compositor);
  30. }
  31. void OcclusionTrackerPauser::OnCompositingShuttingDown(
  32. ui::Compositor* compositor) {
  33. OnFinish(compositor);
  34. }
  35. void OcclusionTrackerPauser::Pause(ui::Compositor* compositor) {
  36. if (!observations_.IsObservingSource(compositor))
  37. observations_.AddObservation(compositor);
  38. }
  39. void OcclusionTrackerPauser::OnFinish(ui::Compositor* compositor) {
  40. if (!observations_.IsObservingSource(compositor))
  41. return;
  42. observations_.RemoveObservation(compositor);
  43. if (observations_.IsObservingAnySource())
  44. return;
  45. DCHECK(scoped_pause_);
  46. timer_.Stop();
  47. scoped_pause_.reset();
  48. }
  49. void OcclusionTrackerPauser::Timeout() {
  50. DCHECK(scoped_pause_);
  51. LOG(WARNING) << "Unpausing because animations didn't start and end in time";
  52. scoped_pause_.reset();
  53. observations_.RemoveAllObservations();
  54. }
  55. } // namespace ash