summaryrefslogtreecommitdiffstats
path: root/ipc/glue/BackgroundUtils.h
blob: db1d48d2e003f5a9cba08540c0ded60661824b8e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef mozilla_ipc_backgroundutils_h__
#define mozilla_ipc_backgroundutils_h__

#include "ipc/IPCMessageUtils.h"
#include "mozilla/Attributes.h"
#include "mozilla/OriginAttributes.h"
#include "nsCOMPtr.h"
#include "nscore.h"

class nsIContentSecurityPolicy;
class nsILoadInfo;
class nsINode;
class nsIPrincipal;
class nsIRedirectHistoryEntry;

namespace IPC {

namespace detail {
template <class ParamType>
struct OriginAttributesParamTraits {
  typedef ParamType paramType;

  static void Write(MessageWriter* aWriter, const paramType& aParam) {
    nsAutoCString suffix;
    aParam.CreateSuffix(suffix);
    WriteParam(aWriter, suffix);
  }

  static bool Read(MessageReader* aReader, paramType* aResult) {
    nsAutoCString suffix;
    return ReadParam(aReader, &suffix) && aResult->PopulateFromSuffix(suffix);
  }
};
}  // namespace detail

template <>
struct ParamTraits<mozilla::OriginAttributes>
    : public detail::OriginAttributesParamTraits<mozilla::OriginAttributes> {};

}  // namespace IPC

namespace mozilla {

namespace dom {
class Document;
}

namespace net {
class ChildLoadInfoForwarderArgs;
class LoadInfoArgs;
class LoadInfo;
class ParentLoadInfoForwarderArgs;
class RedirectHistoryEntryInfo;
}  // namespace net

namespace ipc {

class ContentSecurityPolicy;
class CSPInfo;
class PrincipalInfo;

/**
 * Convert a PrincipalInfo to an nsIPrincipal.
 *
 * MUST be called on the main thread.
 */
Result<nsCOMPtr<nsIPrincipal>, nsresult> PrincipalInfoToPrincipal(
    const PrincipalInfo& aPrincipalInfo);

/**
 * Convert an nsIPrincipal to a PrincipalInfo.
 *
 * MUST be called on the main thread only.
 */
nsresult PrincipalToPrincipalInfo(nsIPrincipal* aPrincipal,
                                  PrincipalInfo* aPrincipalInfo,
                                  bool aSkipBaseDomain = false);

/**
 * Compare storage keys for equivalence.
 *
 * Only use with storage keys retrieved from nsIGlobalObject::GetStorageKey!
 * Bug 1776271 tracks enhancing this into a proper type.
 */
bool StorageKeysEqual(const PrincipalInfo& aLeft, const PrincipalInfo& aRight);

/**
 * Convert a CSPInfo to an nsIContentSecurityPolicy.
 *
 * MUST be called on the main thread only.
 *
 * If possible, provide a requesting doc, so policy violation events can
 * be dispatched correctly. If aRequestingDoc is null, then the CSPInfo holds
 * the necessary fallback information, like a serialized requestPrincipal,
 * to generate a valid nsIContentSecurityPolicy.
 */
already_AddRefed<nsIContentSecurityPolicy> CSPInfoToCSP(
    const CSPInfo& aCSPInfo, mozilla::dom::Document* aRequestingDoc,
    nsresult* aOptionalResult = nullptr);

/**
 * Convert an nsIContentSecurityPolicy to a CSPInfo.
 *
 * MUST be called on the main thread only.
 */
nsresult CSPToCSPInfo(nsIContentSecurityPolicy* aCSP, CSPInfo* aCSPInfo);

/**
 * Return true if this PrincipalInfo is a content principal and it has
 * a privateBrowsing id in its OriginAttributes
 */
bool IsPrincipalInfoPrivate(const PrincipalInfo& aPrincipalInfo);

/**
 * Convert an RedirectHistoryEntryInfo to a nsIRedirectHistoryEntry.
 */

already_AddRefed<nsIRedirectHistoryEntry> RHEntryInfoToRHEntry(
    const mozilla::net::RedirectHistoryEntryInfo& aRHEntryInfo);

/**
 * Convert an nsIRedirectHistoryEntry to a RedirectHistoryEntryInfo.
 */

nsresult RHEntryToRHEntryInfo(
    nsIRedirectHistoryEntry* aRHEntry,
    mozilla::net::RedirectHistoryEntryInfo* aRHEntryInfo);

/**
 * Convert a LoadInfo to LoadInfoArgs struct.
 */
nsresult LoadInfoToLoadInfoArgs(
    nsILoadInfo* aLoadInfo,
    Maybe<mozilla::net::LoadInfoArgs>* outOptionalLoadInfoArgs);

/**
 * Convert LoadInfoArgs to a LoadInfo.
 */
nsresult LoadInfoArgsToLoadInfo(
    const Maybe<mozilla::net::LoadInfoArgs>& aOptionalLoadInfoArgs,
    const nsACString& aOriginRemoteType, nsILoadInfo** outLoadInfo);
nsresult LoadInfoArgsToLoadInfo(
    const Maybe<mozilla::net::LoadInfoArgs>& aOptionalLoadInfoArgs,
    const nsACString& aOriginRemoteType, nsINode* aCspToInheritLoadingContext,
    nsILoadInfo** outLoadInfo);
nsresult LoadInfoArgsToLoadInfo(
    const Maybe<net::LoadInfoArgs>& aOptionalLoadInfoArgs,
    const nsACString& aOriginRemoteType, mozilla::net::LoadInfo** outLoadInfo);
nsresult LoadInfoArgsToLoadInfo(
    const Maybe<net::LoadInfoArgs>& aOptionalLoadInfoArgs,
    const nsACString& aOriginRemoteType, nsINode* aCspToInheritLoadingContext,
    mozilla::net::LoadInfo** outLoadInfo);

/**
 * Fills ParentLoadInfoForwarderArgs with properties we want to carry to child
 * processes.
 */
void LoadInfoToParentLoadInfoForwarder(
    nsILoadInfo* aLoadInfo,
    mozilla::net::ParentLoadInfoForwarderArgs* aForwarderArgsOut);

/**
 * Merges (replaces) properties of an existing LoadInfo on a child process
 * with properties carried down through ParentLoadInfoForwarderArgs.
 */
nsresult MergeParentLoadInfoForwarder(
    mozilla::net::ParentLoadInfoForwarderArgs const& aForwarderArgs,
    nsILoadInfo* aLoadInfo);

/**
 * Fills ChildLoadInfoForwarderArgs with properties we want to carry to the
 * parent process after the initial channel creation.
 */
void LoadInfoToChildLoadInfoForwarder(
    nsILoadInfo* aLoadInfo,
    mozilla::net::ChildLoadInfoForwarderArgs* aForwarderArgsOut);

/**
 * Merges (replaces) properties of an existing LoadInfo on the parent process
 * with properties contained in a ChildLoadInfoForwarderArgs.
 */
nsresult MergeChildLoadInfoForwarder(
    const mozilla::net::ChildLoadInfoForwarderArgs& aForwardArgs,
    nsILoadInfo* aLoadInfo);

}  // namespace ipc
}  // namespace mozilla

#endif  // mozilla_ipc_backgroundutils_h__