Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/xul/nsXULControllers.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* This Source Code Form is subject to the terms of the Mozilla Public
3
 * License, v. 2.0. If a copy of the MPL was not distributed with this
4
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6
/*
7
8
  This file provides the implementation for the XUL "controllers"
9
  object.
10
11
*/
12
13
#include "nsString.h"
14
15
#include "nsIControllers.h"
16
#include "nsXULControllers.h"
17
#include "nsIController.h"
18
#include "mozilla/RefPtr.h"
19
20
//----------------------------------------------------------------------
21
22
nsXULControllers::nsXULControllers()
23
: mCurControllerID(0)
24
0
{
25
0
}
26
27
nsXULControllers::~nsXULControllers(void)
28
0
{
29
0
  DeleteControllers();
30
0
}
31
32
void
33
nsXULControllers::DeleteControllers()
34
0
{
35
0
  uint32_t count = mControllers.Length();
36
0
  for (uint32_t i = 0; i < count; i++)
37
0
  {
38
0
    nsXULControllerData* controllerData = mControllers.ElementAt(i);
39
0
    delete controllerData;    // releases the nsIController
40
0
  }
41
0
42
0
  mControllers.Clear();
43
0
}
44
45
NS_IMPL_CYCLE_COLLECTION_CLASS(nsXULControllers)
46
47
0
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsXULControllers)
48
0
  tmp->DeleteControllers();
49
0
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
50
0
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsXULControllers)
51
0
  {
52
0
    uint32_t i, count = tmp->mControllers.Length();
53
0
    for (i = 0; i < count; ++i) {
54
0
      nsXULControllerData* controllerData = tmp->mControllers[i];
55
0
      if (controllerData) {
56
0
        cb.NoteXPCOMChild(controllerData->mController);
57
0
      }
58
0
    }
59
0
  }
60
0
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
61
62
0
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsXULControllers)
63
0
  NS_INTERFACE_MAP_ENTRY(nsIControllers)
64
0
  NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIControllers)
65
0
NS_INTERFACE_MAP_END
66
67
NS_IMPL_CYCLE_COLLECTING_ADDREF(nsXULControllers)
68
NS_IMPL_CYCLE_COLLECTING_RELEASE(nsXULControllers)
69
70
NS_IMETHODIMP
71
nsXULControllers::GetControllerForCommand(const char *aCommand, nsIController** _retval)
72
0
{
73
0
  NS_ENSURE_ARG_POINTER(_retval);
74
0
  *_retval = nullptr;
75
0
76
0
  uint32_t count = mControllers.Length();
77
0
  for (uint32_t i=0; i < count; i++)
78
0
  {
79
0
    nsXULControllerData* controllerData = mControllers.ElementAt(i);
80
0
    if (controllerData)
81
0
    {
82
0
      nsCOMPtr<nsIController> controller;
83
0
      controllerData->GetController(getter_AddRefs(controller));
84
0
      if (controller)
85
0
      {
86
0
        bool supportsCommand;
87
0
        controller->SupportsCommand(aCommand, &supportsCommand);
88
0
        if (supportsCommand) {
89
0
          controller.forget(_retval);
90
0
          return NS_OK;
91
0
        }
92
0
      }
93
0
    }
94
0
  }
95
0
96
0
  return NS_OK;
97
0
}
98
99
NS_IMETHODIMP
100
nsXULControllers::InsertControllerAt(uint32_t aIndex, nsIController *controller)
101
0
{
102
0
  nsXULControllerData*  controllerData = new nsXULControllerData(++mCurControllerID, controller);
103
#ifdef DEBUG
104
  nsXULControllerData** inserted =
105
#endif
106
  mControllers.InsertElementAt(aIndex, controllerData);
107
0
  NS_ASSERTION(inserted != nullptr, "Insertion of controller failed");
108
0
  return NS_OK;
109
0
}
110
111
NS_IMETHODIMP
112
nsXULControllers::RemoveControllerAt(uint32_t aIndex, nsIController **_retval)
113
0
{
114
0
  NS_ENSURE_ARG_POINTER(_retval);
115
0
  *_retval = nullptr;
116
0
117
0
  nsXULControllerData* controllerData = mControllers.SafeElementAt(aIndex);
118
0
  if (!controllerData) return NS_ERROR_FAILURE;
119
0
120
0
  mControllers.RemoveElementAt(aIndex);
121
0
122
0
  controllerData->GetController(_retval);
123
0
  delete controllerData;
124
0
125
0
  return NS_OK;
126
0
}
127
128
129
NS_IMETHODIMP
130
nsXULControllers::GetControllerAt(uint32_t aIndex, nsIController **_retval)
131
0
{
132
0
  NS_ENSURE_ARG_POINTER(_retval);
133
0
  *_retval = nullptr;
134
0
135
0
  nsXULControllerData* controllerData = mControllers.SafeElementAt(aIndex);
136
0
  if (!controllerData) return NS_ERROR_FAILURE;
137
0
138
0
  return controllerData->GetController(_retval);   // does the addref
139
0
}
140
141
NS_IMETHODIMP
142
nsXULControllers::AppendController(nsIController *controller)
143
0
{
144
0
  // This assigns controller IDs starting at 1 so we can use 0 to test if an ID was obtained
145
0
  nsXULControllerData*  controllerData = new nsXULControllerData(++mCurControllerID, controller);
146
0
147
#ifdef DEBUG
148
  nsXULControllerData** appended =
149
#endif
150
  mControllers.AppendElement(controllerData);
151
0
  NS_ASSERTION(appended != nullptr, "Appending controller failed");
152
0
  return NS_OK;
153
0
}
154
155
NS_IMETHODIMP
156
nsXULControllers::RemoveController(nsIController *controller)
157
0
{
158
0
  // first get the identity pointer
159
0
  nsCOMPtr<nsISupports> controllerSup(do_QueryInterface(controller));
160
0
  // then find it
161
0
  uint32_t count = mControllers.Length();
162
0
  for (uint32_t i = 0; i < count; i++)
163
0
  {
164
0
    nsXULControllerData* controllerData = mControllers.ElementAt(i);
165
0
    if (controllerData)
166
0
    {
167
0
      nsCOMPtr<nsIController> thisController;
168
0
      controllerData->GetController(getter_AddRefs(thisController));
169
0
      nsCOMPtr<nsISupports> thisControllerSup(do_QueryInterface(thisController)); // get identity
170
0
      if (thisControllerSup == controllerSup)
171
0
      {
172
0
        mControllers.RemoveElementAt(i);
173
0
        delete controllerData;
174
0
        return NS_OK;
175
0
      }
176
0
    }
177
0
  }
178
0
  return NS_ERROR_FAILURE;      // right thing to return if no controller found?
179
0
}
180
181
NS_IMETHODIMP
182
nsXULControllers::GetControllerId(nsIController *controller, uint32_t *_retval)
183
0
{
184
0
  NS_ENSURE_ARG_POINTER(_retval);
185
0
186
0
  uint32_t count = mControllers.Length();
187
0
  for (uint32_t i = 0; i < count; i++)
188
0
  {
189
0
    nsXULControllerData* controllerData = mControllers.ElementAt(i);
190
0
    if (controllerData)
191
0
    {
192
0
      nsCOMPtr<nsIController> thisController;
193
0
      controllerData->GetController(getter_AddRefs(thisController));
194
0
      if (thisController.get() == controller)
195
0
      {
196
0
        *_retval = controllerData->GetControllerID();
197
0
        return NS_OK;
198
0
      }
199
0
    }
200
0
  }
201
0
  return NS_ERROR_FAILURE;  // none found
202
0
}
203
204
NS_IMETHODIMP
205
nsXULControllers::GetControllerById(uint32_t controllerID, nsIController **_retval)
206
0
{
207
0
  NS_ENSURE_ARG_POINTER(_retval);
208
0
209
0
  uint32_t count = mControllers.Length();
210
0
  for (uint32_t i = 0; i < count; i++)
211
0
  {
212
0
    nsXULControllerData* controllerData = mControllers.ElementAt(i);
213
0
    if (controllerData && controllerData->GetControllerID() == controllerID)
214
0
    {
215
0
      return controllerData->GetController(_retval);
216
0
    }
217
0
  }
218
0
  return NS_ERROR_FAILURE;  // none found
219
0
}
220
221
NS_IMETHODIMP
222
nsXULControllers::GetControllerCount(uint32_t *_retval)
223
0
{
224
0
  NS_ENSURE_ARG_POINTER(_retval);
225
0
  *_retval = mControllers.Length();
226
0
  return NS_OK;
227
0
}
228