summaryrefslogtreecommitdiff
path: root/chromium/media/base/android/android_overlay.cc
blob: c034210618c152d661c6a6275cf10c4a80a4b323 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/base/android/android_overlay.h"

namespace media {

AndroidOverlay::AndroidOverlay() {}
AndroidOverlay::~AndroidOverlay() {
  // Don't permit any other callbacks once we start sending deletion cbs.
  weak_factory_.InvalidateWeakPtrs();
  for (auto& cb : deletion_cbs_)
    std::move(cb).Run(this);
}

void AndroidOverlay::AddSurfaceDestroyedCallback(
    AndroidOverlayConfig::DestroyedCB cb) {
  destruction_cbs_.push_back(std::move(cb));
}

void AndroidOverlay::RunSurfaceDestroyedCallbacks() {
  if (destruction_cbs_.empty())
    return;

  // Move the list, in case it's modified during traversal.
  std::list<AndroidOverlayConfig::DestroyedCB> cbs =
      std::move(destruction_cbs_);

  // Get a wp for |this|, in case it's destroyed during a callback.
  base::WeakPtr<AndroidOverlay> wp = weak_factory_.GetWeakPtr();

  for (auto& cb : cbs) {
    std::move(cb).Run(this);
    // If |this| has been deleted, then stop here.
    if (!wp)
      return;
  }
}

void AndroidOverlay::AddOverlayDeletedCallback(
    AndroidOverlayConfig::DeletedCB cb) {
  deletion_cbs_.push_back(std::move(cb));
}

}  // namespace media