summaryrefslogtreecommitdiffstats
path: root/netwerk/ipc/NeckoCommon.h
blob: 57f770db68a47df17bfcf2d5204d013407b1d7bd (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
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 ts=8 et 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_net_NeckoCommon_h
#define mozilla_net_NeckoCommon_h

#include "mozilla/Preferences.h"
#include "mozilla/Variant.h"
#include "nsIRequest.h"
#include "nsPrintfCString.h"
#include "nsXULAppAPI.h"
#include "prenv.h"

class nsIStreamListener;

namespace mozilla {
namespace dom {
class BrowserChild;
}  // namespace dom
}  // namespace mozilla

#if defined(DEBUG)
#  define NECKO_ERRORS_ARE_FATAL_DEFAULT true
#else
#  define NECKO_ERRORS_ARE_FATAL_DEFAULT false
#endif

// TODO: Eventually remove NECKO_MAYBE_ABORT and DROP_DEAD (bug 575494).
// Still useful for catching listener interfaces we don't yet support across
// processes, etc.

#define NECKO_MAYBE_ABORT(msg)                                  \
  do {                                                          \
    bool abort = NECKO_ERRORS_ARE_FATAL_DEFAULT;                \
    const char* e = PR_GetEnv("NECKO_ERRORS_ARE_FATAL");        \
    if (e) abort = (*e == '0') ? false : true;                  \
    if (abort) {                                                \
      msg.AppendLiteral(                                        \
          " (set NECKO_ERRORS_ARE_FATAL=0 in your environment " \
          "to convert this error into a warning.)");            \
      MOZ_CRASH_UNSAFE(msg.get());                              \
    } else {                                                    \
      msg.AppendLiteral(                                        \
          " (set NECKO_ERRORS_ARE_FATAL=1 in your environment " \
          "to convert this warning into a fatal error.)");      \
      NS_WARNING(msg.get());                                    \
    }                                                           \
  } while (0)

#define DROP_DEAD()                                                       \
  do {                                                                    \
    nsPrintfCString msg("NECKO ERROR: '%s' UNIMPLEMENTED", __FUNCTION__); \
    NECKO_MAYBE_ABORT(msg);                                               \
    return NS_ERROR_NOT_IMPLEMENTED;                                      \
  } while (0)

#define ENSURE_CALLED_BEFORE_ASYNC_OPEN()                                      \
  do {                                                                         \
    if (LoadIsPending() || LoadWasOpened()) {                                  \
      nsPrintfCString msg("'%s' called after AsyncOpen: %s +%d", __FUNCTION__, \
                          __FILE__, __LINE__);                                 \
      NECKO_MAYBE_ABORT(msg);                                                  \
    }                                                                          \
    NS_ENSURE_TRUE(!LoadIsPending(), NS_ERROR_IN_PROGRESS);                    \
    NS_ENSURE_TRUE(!LoadWasOpened(), NS_ERROR_ALREADY_OPENED);                 \
  } while (0)

// Fails call if made after request observers (on-modify-request, etc) have been
// called

#define ENSURE_CALLED_BEFORE_CONNECT()                                  \
  do {                                                                  \
    if (LoadRequestObserversCalled()) {                                 \
      nsPrintfCString msg("'%s' called too late: %s +%d", __FUNCTION__, \
                          __FILE__, __LINE__);                          \
      NECKO_MAYBE_ABORT(msg);                                           \
      if (LoadIsPending()) return NS_ERROR_IN_PROGRESS;                 \
      MOZ_ASSERT(LoadWasOpened());                                      \
      return NS_ERROR_ALREADY_OPENED;                                   \
    }                                                                   \
  } while (0)

namespace mozilla {
namespace net {

inline bool IsNeckoChild() {
  static bool didCheck = false;
  static bool amChild = false;

  if (!didCheck) {
    didCheck = true;
    amChild = (XRE_GetProcessType() == GeckoProcessType_Content);
  }
  return amChild;
}

inline bool IsSocketProcessChild() {
  static bool amChild = (XRE_GetProcessType() == GeckoProcessType_Socket);
  return amChild;
}

class HttpChannelSecurityWarningReporter : public nsISupports {
 public:
  [[nodiscard]] virtual nsresult ReportSecurityMessage(
      const nsAString& aMessageTag, const nsAString& aMessageCategory) = 0;
  [[nodiscard]] virtual nsresult LogBlockedCORSRequest(
      const nsAString& aMessage, const nsACString& aCategory,
      bool aIsWarning = false) = 0;
  [[nodiscard]] virtual nsresult LogMimeTypeMismatch(
      const nsACString& aMessageName, bool aWarning, const nsAString& aURL,
      const nsAString& aContentType) = 0;
};

struct OnStartRequestParams {
  nsCOMPtr<nsIRequest> request;
};
struct OnDataAvailableParams {
  nsCOMPtr<nsIRequest> request;
  nsCString data;
  uint64_t offset;
  uint32_t count;
};
struct OnStopRequestParams {
  nsCOMPtr<nsIRequest> request;
  nsresult status;
};
struct OnAfterLastPartParams {
  nsresult status;
};
using StreamListenerFunction =
    mozilla::Variant<OnStartRequestParams, OnDataAvailableParams,
                     OnStopRequestParams, OnAfterLastPartParams>;

nsresult ForwardStreamListenerFunctions(nsTArray<StreamListenerFunction> aCalls,
                                        nsIStreamListener* aParent);

}  // namespace net
}  // namespace mozilla

#endif  // mozilla_net_NeckoCommon_h