Bug 1838629 - Part 7: Inline nursery cell allocation method in Allocator.h r=sfink
[gecko.git] / toolkit / xre / Bootstrap.h
blob9d46bec55b480c0e72840a8078021690dfa11882
1 /* -*- Mode: C++; tab-width: 8; 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/. */
6 /**
7 * This file represents the only external interface exposed from libxul. It
8 * is used by the various stub binaries (nsBrowserApp, xpcshell,
9 * plugin-container) to initialize XPCOM and start their main loop.
12 #ifndef mozilla_Bootstrap_h
13 #define mozilla_Bootstrap_h
15 #include "mozilla/Maybe.h"
16 #include "mozilla/ResultVariant.h"
17 #include "mozilla/UniquePtr.h"
18 #include "mozilla/UniquePtrExtensions.h"
19 #include "mozilla/Variant.h"
20 #include "nscore.h"
21 #include "nsXULAppAPI.h"
23 #ifdef MOZ_WIDGET_ANDROID
24 # include "jni.h"
26 namespace mozilla {
27 struct StaticXREAppData;
30 extern "C" NS_EXPORT void GeckoStart(JNIEnv* aEnv, char** argv, int argc,
31 const mozilla::StaticXREAppData& aAppData,
32 bool xpcshell, const char* outFilePath);
33 #endif
35 #if defined(XP_WIN) && defined(MOZ_SANDBOX)
36 namespace sandbox {
37 class BrokerServices;
39 #endif
41 namespace mozilla {
43 struct StaticXREAppData;
45 struct BootstrapConfig {
46 #if defined(XP_WIN) && defined(MOZ_SANDBOX)
47 /* Chromium sandbox BrokerServices. */
48 sandbox::BrokerServices* sandboxBrokerServices;
49 #endif
50 /* Pointer to static XRE AppData from application.ini.h */
51 const StaticXREAppData* appData;
52 /* When the pointer above is null, points to the (string) path of an
53 * application.ini file to open and parse.
54 * When the pointer above is non-null, may indicate the directory where
55 * application files are, relative to the XRE. */
56 const char* appDataPath;
59 /**
60 * This class is virtual abstract so that using it does not require linking
61 * any symbols. The singleton instance of this class is obtained from the
62 * exported method XRE_GetBootstrap.
64 class Bootstrap {
65 protected:
66 Bootstrap() {}
68 // Because of allocator mismatches, code outside libxul shouldn't delete a
69 // Bootstrap instance. Use Dispose().
70 virtual ~Bootstrap() {}
72 /**
73 * Destroy and deallocate this Bootstrap instance.
75 virtual void Dispose() = 0;
77 /**
78 * Helper class to use with UniquePtr.
80 class BootstrapDelete {
81 public:
82 constexpr BootstrapDelete() {}
83 void operator()(Bootstrap* aPtr) const { aPtr->Dispose(); }
86 public:
87 typedef mozilla::UniquePtr<Bootstrap, BootstrapDelete> UniquePtr;
89 virtual void NS_LogInit() = 0;
91 virtual void NS_LogTerm() = 0;
93 virtual void XRE_TelemetryAccumulate(int aID, uint32_t aSample) = 0;
95 virtual void XRE_StartupTimelineRecord(int aEvent,
96 mozilla::TimeStamp aWhen) = 0;
98 virtual int XRE_main(int argc, char* argv[],
99 const BootstrapConfig& aConfig) = 0;
101 virtual void XRE_StopLateWriteChecks() = 0;
103 virtual int XRE_XPCShellMain(int argc, char** argv, char** envp,
104 const XREShellData* aShellData) = 0;
106 virtual GeckoProcessType XRE_GetProcessType() = 0;
108 virtual void XRE_SetProcessType(const char* aProcessTypeString) = 0;
110 virtual nsresult XRE_InitChildProcess(int argc, char* argv[],
111 const XREChildData* aChildData) = 0;
113 virtual void XRE_EnableSameExecutableForContentProc() = 0;
115 #ifdef MOZ_WIDGET_ANDROID
116 virtual void GeckoStart(JNIEnv* aEnv, char** argv, int argc,
117 const StaticXREAppData& aAppData, bool xpcshell,
118 const char* outFilePath) = 0;
120 virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv,
121 const XRE_AndroidChildFds& fds) = 0;
122 # ifdef MOZ_PROFILE_GENERATE
123 virtual void XRE_WriteLLVMProfData() = 0;
124 # endif
125 #endif
127 #ifdef LIBFUZZER
128 virtual void XRE_LibFuzzerSetDriver(LibFuzzerDriver aDriver) = 0;
129 #endif
131 #ifdef MOZ_ENABLE_FORKSERVER
132 virtual int XRE_ForkServer(int* argc, char*** argv) = 0;
133 #endif
136 enum class LibLoadingStrategy {
137 NoReadAhead,
138 ReadAhead,
141 #if defined(XP_WIN)
142 using DLErrorType = unsigned long; // (DWORD)
143 #else
144 using DLErrorType = UniqueFreePtr<char>;
145 #endif
147 using BootstrapError = Variant<nsresult, DLErrorType>;
149 using BootstrapResult = ::mozilla::Result<Bootstrap::UniquePtr, BootstrapError>;
152 * Creates and returns the singleton instance of the bootstrap object.
153 * @param `b` is an outparam. We use a parameter and not a return value
154 * because MSVC doesn't let us return a c++ class from a function with
155 * "C" linkage. On failure this will be null.
156 * @note This function may only be called once and will crash if called again.
158 #ifdef XPCOM_GLUE
159 typedef void (*GetBootstrapType)(Bootstrap::UniquePtr&);
160 BootstrapResult GetBootstrap(
161 const char* aXPCOMFile = nullptr,
162 LibLoadingStrategy aLibLoadingStrategy = LibLoadingStrategy::NoReadAhead);
163 #else
164 extern "C" NS_EXPORT void NS_FROZENCALL
165 XRE_GetBootstrap(Bootstrap::UniquePtr& b);
167 inline BootstrapResult GetBootstrap(const char* aXPCOMFile = nullptr) {
168 Bootstrap::UniquePtr bootstrap;
169 XRE_GetBootstrap(bootstrap);
170 return bootstrap;
172 #endif
174 } // namespace mozilla
176 #endif // mozilla_Bootstrap_h