Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/abort/AbortSignal.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 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
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "AbortSignal.h"
8
9
#include "mozilla/dom/Event.h"
10
#include "mozilla/dom/AbortSignalBinding.h"
11
12
namespace mozilla {
13
namespace dom {
14
15
// AbortSignalImpl
16
// ----------------------------------------------------------------------------
17
18
AbortSignalImpl::AbortSignalImpl(bool aAborted)
19
  : mAborted(aAborted)
20
0
{}
21
22
bool
23
AbortSignalImpl::Aborted() const
24
0
{
25
0
  return mAborted;
26
0
}
27
28
void
29
AbortSignalImpl::Abort()
30
0
{
31
0
  if (mAborted) {
32
0
    return;
33
0
  }
34
0
35
0
  mAborted = true;
36
0
37
0
  // Let's inform the followers.
38
0
  nsTObserverArray<AbortFollower*>::ForwardIterator iter(mFollowers);
39
0
  while (iter.HasMore()) {
40
0
    iter.GetNext()->Abort();
41
0
  }
42
0
}
43
44
void
45
AbortSignalImpl::AddFollower(AbortFollower* aFollower)
46
0
{
47
0
  MOZ_DIAGNOSTIC_ASSERT(aFollower);
48
0
  if (!mFollowers.Contains(aFollower)) {
49
0
    mFollowers.AppendElement(aFollower);
50
0
  }
51
0
}
52
53
void
54
AbortSignalImpl::RemoveFollower(AbortFollower* aFollower)
55
0
{
56
0
  MOZ_DIAGNOSTIC_ASSERT(aFollower);
57
0
  mFollowers.RemoveElement(aFollower);
58
0
}
59
60
// AbortSignal
61
// ----------------------------------------------------------------------------
62
63
NS_IMPL_CYCLE_COLLECTION_CLASS(AbortSignal)
64
65
0
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(AbortSignal,
66
0
                                                  DOMEventTargetHelper)
67
0
  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFollowingSignal)
68
0
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
69
70
0
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(AbortSignal,
71
0
                                                DOMEventTargetHelper)
72
0
  tmp->Unfollow();
73
0
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
74
75
0
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(AbortSignal)
76
0
NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
77
78
NS_IMPL_ADDREF_INHERITED(AbortSignal, DOMEventTargetHelper)
79
NS_IMPL_RELEASE_INHERITED(AbortSignal, DOMEventTargetHelper)
80
81
AbortSignal::AbortSignal(nsIGlobalObject* aGlobalObject,
82
                         bool aAborted)
83
  : DOMEventTargetHelper(aGlobalObject)
84
  , AbortSignalImpl(aAborted)
85
0
{}
86
87
JSObject*
88
AbortSignal::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
89
0
{
90
0
  return AbortSignal_Binding::Wrap(aCx, this, aGivenProto);
91
0
}
92
93
void
94
AbortSignal::Abort()
95
0
{
96
0
  AbortSignalImpl::Abort();
97
0
98
0
  EventInit init;
99
0
  init.mBubbles = false;
100
0
  init.mCancelable = false;
101
0
102
0
  RefPtr<Event> event =
103
0
    Event::Constructor(this, NS_LITERAL_STRING("abort"), init);
104
0
  event->SetTrusted(true);
105
0
106
0
  DispatchEvent(*event);
107
0
}
108
109
// AbortFollower
110
// ----------------------------------------------------------------------------
111
112
AbortFollower::~AbortFollower()
113
0
{
114
0
  Unfollow();
115
0
}
116
117
void
118
AbortFollower::Follow(AbortSignalImpl* aSignal)
119
0
{
120
0
  MOZ_DIAGNOSTIC_ASSERT(aSignal);
121
0
122
0
  Unfollow();
123
0
124
0
  mFollowingSignal = aSignal;
125
0
  aSignal->AddFollower(this);
126
0
}
127
128
void
129
AbortFollower::Unfollow()
130
0
{
131
0
  if (mFollowingSignal) {
132
0
    mFollowingSignal->RemoveFollower(this);
133
0
    mFollowingSignal = nullptr;
134
0
  }
135
0
}
136
137
bool
138
AbortFollower::IsFollowing() const
139
0
{
140
0
  return !!mFollowingSignal;
141
0
}
142
143
} // dom namespace
144
} // mozilla namespace