Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/netwerk/protocol/about/nsAboutCache.h
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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
#ifndef nsAboutCache_h__
7
#define nsAboutCache_h__
8
9
#include "nsIAboutModule.h"
10
#include "nsICacheStorageVisitor.h"
11
#include "nsICacheStorage.h"
12
13
#include "nsString.h"
14
#include "nsIOutputStream.h"
15
#include "nsILoadContextInfo.h"
16
17
#include "nsCOMPtr.h"
18
#include "nsTArray.h"
19
20
#define NS_FORWARD_SAFE_NSICHANNEL_SUBSET(_to) \
21
0
  NS_IMETHOD GetOriginalURI(nsIURI * *aOriginalURI) override { return !_to ? NS_ERROR_NULL_POINTER : _to->GetOriginalURI(aOriginalURI); } \
22
0
  NS_IMETHOD SetOriginalURI(nsIURI *aOriginalURI) override { return !_to ? NS_ERROR_NULL_POINTER : _to->SetOriginalURI(aOriginalURI); } \
23
0
  NS_IMETHOD GetURI(nsIURI * *aURI) override { return !_to ? NS_ERROR_NULL_POINTER : _to->GetURI(aURI); } \
24
0
  NS_IMETHOD GetOwner(nsISupports * *aOwner) override { return !_to ? NS_ERROR_NULL_POINTER : _to->GetOwner(aOwner); } \
25
0
  NS_IMETHOD SetOwner(nsISupports *aOwner) override { return !_to ? NS_ERROR_NULL_POINTER : _to->SetOwner(aOwner); } \
26
0
  NS_IMETHOD GetNotificationCallbacks(nsIInterfaceRequestor * *aNotificationCallbacks) override { return !_to ? NS_ERROR_NULL_POINTER : _to->GetNotificationCallbacks(aNotificationCallbacks); } \
27
0
  NS_IMETHOD SetNotificationCallbacks(nsIInterfaceRequestor *aNotificationCallbacks) override { return !_to ? NS_ERROR_NULL_POINTER : _to->SetNotificationCallbacks(aNotificationCallbacks); } \
28
0
  NS_IMETHOD GetSecurityInfo(nsISupports * *aSecurityInfo) override { return !_to ? NS_ERROR_NULL_POINTER : _to->GetSecurityInfo(aSecurityInfo); } \
29
0
  NS_IMETHOD GetContentType(nsACString & aContentType) override { return !_to ? NS_ERROR_NULL_POINTER : _to->GetContentType(aContentType); } \
30
0
  NS_IMETHOD SetContentType(const nsACString & aContentType) override { return !_to ? NS_ERROR_NULL_POINTER : _to->SetContentType(aContentType); } \
31
0
  NS_IMETHOD GetContentCharset(nsACString & aContentCharset) override { return !_to ? NS_ERROR_NULL_POINTER : _to->GetContentCharset(aContentCharset); } \
32
0
  NS_IMETHOD SetContentCharset(const nsACString & aContentCharset) override { return !_to ? NS_ERROR_NULL_POINTER : _to->SetContentCharset(aContentCharset); } \
33
0
  NS_IMETHOD GetContentLength(int64_t *aContentLength) override { return !_to ? NS_ERROR_NULL_POINTER : _to->GetContentLength(aContentLength); } \
34
0
  NS_IMETHOD SetContentLength(int64_t aContentLength) override { return !_to ? NS_ERROR_NULL_POINTER : _to->SetContentLength(aContentLength); } \
35
0
  NS_IMETHOD GetContentDisposition(uint32_t *aContentDisposition) override { return !_to ? NS_ERROR_NULL_POINTER : _to->GetContentDisposition(aContentDisposition); } \
36
0
  NS_IMETHOD SetContentDisposition(uint32_t aContentDisposition) override { return !_to ? NS_ERROR_NULL_POINTER : _to->SetContentDisposition(aContentDisposition); } \
37
0
  NS_IMETHOD GetContentDispositionFilename(nsAString & aContentDispositionFilename) override { return !_to ? NS_ERROR_NULL_POINTER : _to->GetContentDispositionFilename(aContentDispositionFilename); } \
38
0
  NS_IMETHOD SetContentDispositionFilename(const nsAString & aContentDispositionFilename) override { return !_to ? NS_ERROR_NULL_POINTER : _to->SetContentDispositionFilename(aContentDispositionFilename); } \
39
0
  NS_IMETHOD GetContentDispositionHeader(nsACString & aContentDispositionHeader) override { return !_to ? NS_ERROR_NULL_POINTER : _to->GetContentDispositionHeader(aContentDispositionHeader); } \
40
0
  NS_IMETHOD GetLoadInfo(nsILoadInfo * *aLoadInfo) override { return !_to ? NS_ERROR_NULL_POINTER : _to->GetLoadInfo(aLoadInfo); } \
41
0
  NS_IMETHOD SetLoadInfo(nsILoadInfo *aLoadInfo) override { return !_to ? NS_ERROR_NULL_POINTER : _to->SetLoadInfo(aLoadInfo); } \
42
0
  NS_IMETHOD GetIsDocument(bool *aIsDocument) override { return !_to ? NS_ERROR_NULL_POINTER : _to->GetIsDocument(aIsDocument); }; \
43
44
class nsAboutCache final : public nsIAboutModule
45
{
46
public:
47
    NS_DECL_ISUPPORTS
48
    NS_DECL_NSIABOUTMODULE
49
50
0
    nsAboutCache() = default;
51
52
    static MOZ_MUST_USE nsresult
53
    Create(nsISupports *aOuter, REFNSIID aIID, void **aResult);
54
55
    static MOZ_MUST_USE nsresult
56
    GetStorage(nsACString const & storageName, nsILoadContextInfo* loadInfo,
57
               nsICacheStorage **storage);
58
59
protected:
60
0
    virtual ~nsAboutCache() = default;
61
62
    class Channel final : public nsIChannel
63
                        , public nsICacheStorageVisitor
64
    {
65
        NS_DECL_ISUPPORTS
66
        NS_DECL_NSICACHESTORAGEVISITOR
67
        NS_FORWARD_SAFE_NSIREQUEST(mChannel)
68
        NS_FORWARD_SAFE_NSICHANNEL_SUBSET(mChannel)
69
        NS_IMETHOD AsyncOpen(nsIStreamListener *aListener, nsISupports *aContext) override;
70
        NS_IMETHOD AsyncOpen2(nsIStreamListener *aListener) override;
71
        NS_IMETHOD Open(nsIInputStream * *_retval) override;
72
        NS_IMETHOD Open2(nsIInputStream * *_retval) override;
73
74
    private:
75
0
        virtual ~Channel() = default;
76
77
    public:
78
        MOZ_MUST_USE nsresult Init(nsIURI* aURI, nsILoadInfo* aLoadInfo);
79
        MOZ_MUST_USE nsresult ParseURI(nsIURI * uri, nsACString & storage);
80
81
        // Finds a next storage we wish to visit (we use this method
82
        // even there is a specified storage name, which is the only
83
        // one in the list then.)  Posts FireVisitStorage() when found.
84
        MOZ_MUST_USE nsresult VisitNextStorage();
85
        // Helper method that calls VisitStorage() for the current storage.
86
        // When it fails, OnCacheEntryVisitCompleted is simulated to close
87
        // the output stream and thus the about:cache channel.
88
        void FireVisitStorage();
89
        // Kiks the visit cycle for the given storage, names can be:
90
        // "disk", "memory", "appcache"
91
        // Note: any newly added storage type has to be manually handled here.
92
        MOZ_MUST_USE nsresult VisitStorage(nsACString const & storageName);
93
94
        // Writes content of mBuffer to mStream and truncates
95
        // the buffer.  It may fail when the input stream is closed by canceling
96
        // the input stream channel.  It can be used to stop the cache iteration
97
        // process.
98
        MOZ_MUST_USE nsresult FlushBuffer();
99
100
        // Whether we are showing overview status of all available
101
        // storages.
102
        bool mOverview;
103
104
        // Flag initially false, that indicates the entries header has
105
        // been added to the output HTML.
106
        bool mEntriesHeaderAdded;
107
108
        // Cancelation flag
109
        bool mCancel;
110
111
        // The context we are working with.
112
        nsCOMPtr<nsILoadContextInfo> mLoadInfo;
113
        nsCString mContextString;
114
115
        // The list of all storage names we want to visit
116
        nsTArray<nsCString> mStorageList;
117
        nsCString mStorageName;
118
        nsCOMPtr<nsICacheStorage> mStorage;
119
120
        // Output data buffering and streaming output
121
        nsCString mBuffer;
122
        nsCOMPtr<nsIOutputStream> mStream;
123
124
        // The input stream channel, the one that actually does the job
125
        nsCOMPtr<nsIChannel> mChannel;
126
    };
127
};
128
129
#define NS_ABOUT_CACHE_MODULE_CID                    \
130
{ /* 9158c470-86e4-11d4-9be2-00e09872a416 */         \
131
    0x9158c470,                                      \
132
    0x86e4,                                          \
133
    0x11d4,                                          \
134
    {0x9b, 0xe2, 0x00, 0xe0, 0x98, 0x72, 0xa4, 0x16} \
135
}
136
137
#endif // nsAboutCache_h__