Bug 1729952 [wpt PR 30477] - Fix timeout in grid-positioned-item-dynamic-change-006...
[gecko.git] / netwerk / socket / nsSocketProviderService.cpp
blob93a84991f31a1b294d65b27294ac2ddae783ccc9
1 /* -*- Mode: C++; tab-width: 2; 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 #include "nsString.h"
7 #include "nsISocketProvider.h"
8 #include "nsError.h"
9 #include "nsNSSComponent.h"
10 #include "nsSOCKSSocketProvider.h"
11 #include "nsSocketProviderService.h"
12 #include "nsSSLSocketProvider.h"
13 #include "nsTLSSocketProvider.h"
14 #include "nsUDPSocketProvider.h"
15 #include "mozilla/ClearOnShutdown.h"
17 mozilla::StaticRefPtr<nsSocketProviderService>
18 nsSocketProviderService::gSingleton;
20 ////////////////////////////////////////////////////////////////////////////////
22 already_AddRefed<nsISocketProviderService>
23 nsSocketProviderService::GetOrCreate() {
24 RefPtr<nsSocketProviderService> inst;
25 if (gSingleton) {
26 inst = gSingleton;
27 } else {
28 inst = new nsSocketProviderService();
29 gSingleton = inst;
30 if (NS_IsMainThread()) {
31 mozilla::ClearOnShutdown(&gSingleton);
32 } else {
33 NS_DispatchToMainThread(NS_NewRunnableFunction(
34 "net::nsSocketProviderService::GetOrCreate",
35 []() -> void { mozilla::ClearOnShutdown(&gSingleton); }));
38 return inst.forget();
41 NS_IMPL_ISUPPORTS(nsSocketProviderService, nsISocketProviderService)
43 ////////////////////////////////////////////////////////////////////////////////
45 NS_IMETHODIMP
46 nsSocketProviderService::GetSocketProvider(const char* type,
47 nsISocketProvider** result) {
48 nsCOMPtr<nsISocketProvider> inst;
49 if (!nsCRT::strcmp(type, "ssl") &&
50 (XRE_IsParentProcess() || XRE_IsSocketProcess()) &&
51 EnsureNSSInitializedChromeOrContent()) {
52 inst = new nsSSLSocketProvider();
53 } else if (!nsCRT::strcmp(type, "starttls") &&
54 (XRE_IsParentProcess() || XRE_IsSocketProcess()) &&
55 EnsureNSSInitializedChromeOrContent()) {
56 inst = new nsTLSSocketProvider();
57 } else if (!nsCRT::strcmp(type, "socks")) {
58 inst = new nsSOCKSSocketProvider(NS_SOCKS_VERSION_5);
59 } else if (!nsCRT::strcmp(type, "socks4")) {
60 inst = new nsSOCKSSocketProvider(NS_SOCKS_VERSION_4);
61 } else if (!nsCRT::strcmp(type, "udp")) {
62 inst = new nsUDPSocketProvider();
63 } else {
64 return NS_ERROR_UNKNOWN_SOCKET_TYPE;
66 inst.forget(result);
67 return NS_OK;
70 ////////////////////////////////////////////////////////////////////////////////