Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/media/eme/DetailedPromise.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=2 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5
 * You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "DetailedPromise.h"
8
#include "mozilla/dom/DOMException.h"
9
#include "nsPrintfCString.h"
10
11
namespace mozilla {
12
namespace dom {
13
14
DetailedPromise::DetailedPromise(nsIGlobalObject* aGlobal,
15
                                 const nsACString& aName)
16
  : Promise(aGlobal)
17
  , mName(aName)
18
  , mResponded(false)
19
  , mStartTime(TimeStamp::Now())
20
0
{
21
0
}
22
23
DetailedPromise::DetailedPromise(nsIGlobalObject* aGlobal,
24
                                 const nsACString& aName,
25
                                 Telemetry::HistogramID aSuccessLatencyProbe,
26
                                 Telemetry::HistogramID aFailureLatencyProbe)
27
  : DetailedPromise(aGlobal, aName)
28
0
{
29
0
  mSuccessLatencyProbe.Construct(aSuccessLatencyProbe);
30
0
  mFailureLatencyProbe.Construct(aFailureLatencyProbe);
31
0
}
32
33
DetailedPromise::~DetailedPromise()
34
0
{
35
0
  // It would be nice to assert that mResponded is identical to
36
0
  // GetPromiseState() == PromiseState::Rejected.  But by now we've been
37
0
  // unlinked, so don't have a reference to our actual JS Promise object
38
0
  // anymore.
39
0
  MaybeReportTelemetry(kFailed);
40
0
}
41
42
void
43
DetailedPromise::MaybeReject(nsresult aArg, const nsACString& aReason)
44
0
{
45
0
  nsPrintfCString msg("%s promise rejected 0x%" PRIx32 " '%s'", mName.get(),
46
0
                      static_cast<uint32_t>(aArg), PromiseFlatCString(aReason).get());
47
0
  EME_LOG("%s", msg.get());
48
0
49
0
  MaybeReportTelemetry(kFailed);
50
0
51
0
  LogToBrowserConsole(NS_ConvertUTF8toUTF16(msg));
52
0
53
0
  ErrorResult rv;
54
0
  rv.ThrowDOMException(aArg, aReason);
55
0
  Promise::MaybeReject(rv);
56
0
}
57
58
void
59
DetailedPromise::MaybeReject(ErrorResult&, const nsACString& aReason)
60
0
{
61
0
  MOZ_ASSERT_UNREACHABLE("nsresult expected in MaybeReject()");
62
0
}
63
64
/* static */ already_AddRefed<DetailedPromise>
65
DetailedPromise::Create(nsIGlobalObject* aGlobal,
66
                        ErrorResult& aRv,
67
                        const nsACString& aName)
68
0
{
69
0
  RefPtr<DetailedPromise> promise = new DetailedPromise(aGlobal, aName);
70
0
  promise->CreateWrapper(nullptr, aRv);
71
0
  return aRv.Failed() ? nullptr : promise.forget();
72
0
}
73
74
/* static */ already_AddRefed<DetailedPromise>
75
DetailedPromise::Create(nsIGlobalObject* aGlobal,
76
                        ErrorResult& aRv,
77
                        const nsACString& aName,
78
                        Telemetry::HistogramID aSuccessLatencyProbe,
79
                        Telemetry::HistogramID aFailureLatencyProbe)
80
0
{
81
0
  RefPtr<DetailedPromise> promise = new DetailedPromise(aGlobal, aName, aSuccessLatencyProbe, aFailureLatencyProbe);
82
0
  promise->CreateWrapper(nullptr, aRv);
83
0
  return aRv.Failed() ? nullptr : promise.forget();
84
0
}
85
86
void
87
DetailedPromise::MaybeReportTelemetry(eStatus aStatus)
88
0
{
89
0
  if (mResponded) {
90
0
    return;
91
0
  }
92
0
  mResponded = true;
93
0
  if (!mSuccessLatencyProbe.WasPassed() || !mFailureLatencyProbe.WasPassed()) {
94
0
    return;
95
0
  }
96
0
  uint32_t latency = (TimeStamp::Now() - mStartTime).ToMilliseconds();
97
0
  EME_LOG("%s %s latency %ums reported via telemetry", mName.get(),
98
0
          ((aStatus == kSucceeded) ? "succcess" : "failure"), latency);
99
0
  Telemetry::HistogramID tid = (aStatus == kSucceeded) ? mSuccessLatencyProbe.Value()
100
0
                                                      : mFailureLatencyProbe.Value();
101
0
  Telemetry::Accumulate(tid, latency);
102
0
}
103
104
} // namespace dom
105
} // namespace mozilla