Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/netwerk/protocol/http/nsHttpActivityDistributor.cpp
Line
Count
Source (jump to first uncovered line)
1
/* This Source Code Form is subject to the terms of the Mozilla Public
2
 * License, v. 2.0. If a copy of the MPL was not distributed with this
3
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5
// HttpLog.h should generally be included first
6
#include "HttpLog.h"
7
8
#include "nsHttpActivityDistributor.h"
9
#include "nsCOMPtr.h"
10
#include "nsAutoPtr.h"
11
#include "nsThreadUtils.h"
12
13
namespace mozilla {
14
namespace net {
15
16
typedef nsMainThreadPtrHolder<nsIHttpActivityObserver> ObserverHolder;
17
typedef nsMainThreadPtrHandle<nsIHttpActivityObserver> ObserverHandle;
18
typedef nsTArray<ObserverHandle> ObserverArray;
19
20
class nsHttpActivityEvent : public Runnable
21
{
22
public:
23
  nsHttpActivityEvent(nsISupports* aHttpChannel,
24
                      uint32_t aActivityType,
25
                      uint32_t aActivitySubtype,
26
                      PRTime aTimestamp,
27
                      uint64_t aExtraSizeData,
28
                      const nsACString& aExtraStringData,
29
                      ObserverArray* aObservers)
30
    : Runnable("net::nsHttpActivityEvent")
31
    , mHttpChannel(aHttpChannel)
32
    , mActivityType(aActivityType)
33
    , mActivitySubtype(aActivitySubtype)
34
    , mTimestamp(aTimestamp)
35
    , mExtraSizeData(aExtraSizeData)
36
    , mExtraStringData(aExtraStringData)
37
    , mObservers(*aObservers)
38
0
  {
39
0
    }
40
41
    NS_IMETHOD Run() override
42
0
    {
43
0
        for (size_t i = 0 ; i < mObservers.Length() ; i++) {
44
0
            Unused <<
45
0
                mObservers[i]->ObserveActivity(mHttpChannel, mActivityType,
46
0
                                               mActivitySubtype, mTimestamp,
47
0
                                               mExtraSizeData,
48
0
                                               mExtraStringData);
49
0
        }
50
0
        return NS_OK;
51
0
    }
52
53
private:
54
0
    virtual ~nsHttpActivityEvent() = default;
55
56
    nsCOMPtr<nsISupports> mHttpChannel;
57
    uint32_t mActivityType;
58
    uint32_t mActivitySubtype;
59
    PRTime mTimestamp;
60
    uint64_t mExtraSizeData;
61
    nsCString mExtraStringData;
62
63
    ObserverArray mObservers;
64
};
65
66
NS_IMPL_ISUPPORTS(nsHttpActivityDistributor,
67
                  nsIHttpActivityDistributor,
68
                  nsIHttpActivityObserver)
69
70
nsHttpActivityDistributor::nsHttpActivityDistributor()
71
    : mLock("nsHttpActivityDistributor.mLock")
72
0
{
73
0
}
74
75
NS_IMETHODIMP
76
nsHttpActivityDistributor::ObserveActivity(nsISupports *aHttpChannel,
77
                                           uint32_t aActivityType,
78
                                           uint32_t aActivitySubtype,
79
                                           PRTime aTimestamp,
80
                                           uint64_t aExtraSizeData,
81
                                           const nsACString & aExtraStringData)
82
0
{
83
0
    nsCOMPtr<nsIRunnable> event;
84
0
    {
85
0
        MutexAutoLock lock(mLock);
86
0
87
0
        if (!mObservers.Length())
88
0
            return NS_OK;
89
0
90
0
        event = new nsHttpActivityEvent(aHttpChannel, aActivityType,
91
0
                                        aActivitySubtype, aTimestamp,
92
0
                                        aExtraSizeData, aExtraStringData,
93
0
                                        &mObservers);
94
0
    }
95
0
    NS_ENSURE_TRUE(event, NS_ERROR_OUT_OF_MEMORY);
96
0
    return NS_DispatchToMainThread(event);
97
0
}
98
99
NS_IMETHODIMP
100
nsHttpActivityDistributor::GetIsActive(bool *isActive)
101
0
{
102
0
    NS_ENSURE_ARG_POINTER(isActive);
103
0
    MutexAutoLock lock(mLock);
104
0
    *isActive = !!mObservers.Length();
105
0
    return NS_OK;
106
0
}
107
108
NS_IMETHODIMP
109
nsHttpActivityDistributor::AddObserver(nsIHttpActivityObserver *aObserver)
110
0
{
111
0
    MutexAutoLock lock(mLock);
112
0
113
0
    ObserverHandle observer(new ObserverHolder("nsIHttpActivityObserver", aObserver));
114
0
    if (!mObservers.AppendElement(observer))
115
0
        return NS_ERROR_OUT_OF_MEMORY;
116
0
117
0
    return NS_OK;
118
0
}
119
120
NS_IMETHODIMP
121
nsHttpActivityDistributor::RemoveObserver(nsIHttpActivityObserver *aObserver)
122
0
{
123
0
    MutexAutoLock lock(mLock);
124
0
125
0
    ObserverHandle observer(new ObserverHolder("nsIHttpActivityObserver", aObserver));
126
0
    if (!mObservers.RemoveElement(observer))
127
0
        return NS_ERROR_FAILURE;
128
0
129
0
    return NS_OK;
130
0
}
131
132
} // namespace net
133
} // namespace mozilla