Bug 1620758 - Don't call AltSvcMapping::ProcessHeader OMT r=valentin

This patch contains two changes.
1. `AltSvcMapping::ProcessHeader` is not thread-safe, so dispatching an async task to do this.
2. `TRRService::Init` is called earlier before the user profile is loaded. If `network.trr.fetch_off_main_thread` is default to false and changed to true by users, TRR background thread would not be created.

Differential Revision: https://phabricator.services.mozilla.com/D65890

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Kershaw Chang 2020-03-08 13:52:07 +00:00
Родитель ca1e31ce93
Коммит c86671a23a
2 изменённых файлов: 28 добавлений и 16 удалений

Просмотреть файл

@ -109,17 +109,14 @@ nsresult TRRService::Init() {
do_GetService(NS_NETWORK_LINK_SERVICE_CONTRACTID);
RebuildSuffixList(nls);
if (StaticPrefs::network_trr_fetch_off_main_thread()) {
nsCOMPtr<nsIThread> thread;
if (NS_FAILED(
NS_NewNamedThread("TRR Background", getter_AddRefs(thread)))) {
NS_WARNING("NS_NewNamedThread failed!");
return NS_ERROR_FAILURE;
}
sTRRBackgroundThread = thread;
nsCOMPtr<nsIThread> thread;
if (NS_FAILED(NS_NewNamedThread("TRR Background", getter_AddRefs(thread)))) {
NS_WARNING("NS_NewNamedThread failed!");
return NS_ERROR_FAILURE;
}
sTRRBackgroundThread = thread;
LOG(("Initialized TRRService\n"));
return NS_OK;
}

Просмотреть файл

@ -799,14 +799,14 @@ void TRRServiceChannel::ProcessAltService() {
return;
}
nsAutoCString scheme;
nsCString scheme;
mURI->GetScheme(scheme);
bool isHttp = scheme.EqualsLiteral("http");
if (!isHttp && !scheme.EqualsLiteral("https")) {
return;
}
nsAutoCString altSvc;
nsCString altSvc;
Unused << mResponseHead->GetHeader(nsHttp::Alternate_Service, altSvc);
if (altSvc.IsEmpty()) {
return;
@ -817,7 +817,7 @@ void TRRServiceChannel::ProcessAltService() {
return;
}
nsAutoCString originHost;
nsCString originHost;
int32_t originPort = 80;
mURI->GetPort(&originPort);
if (NS_FAILED(mURI->GetAsciiHost(originHost))) {
@ -832,10 +832,25 @@ void TRRServiceChannel::ProcessAltService() {
proxyInfo = do_QueryInterface(mProxyInfo);
}
AltSvcMapping::ProcessHeader(
altSvc, scheme, originHost, originPort, mUsername, GetTopWindowOrigin(),
mPrivateBrowsing, IsIsolated(), callbacks, proxyInfo,
mCaps & NS_HTTP_DISALLOW_SPDY, OriginAttributes());
nsCString topWindowOrigin = GetTopWindowOrigin();
bool isIsolated = IsIsolated();
auto processHeaderTask = [altSvc, scheme, originHost, originPort,
userName(mUsername), topWindowOrigin,
privateBrowsing(mPrivateBrowsing), isIsolated,
callbacks, proxyInfo, caps(mCaps)]() {
AltSvcMapping::ProcessHeader(
altSvc, scheme, originHost, originPort, userName, topWindowOrigin,
privateBrowsing, isIsolated, callbacks, proxyInfo,
caps & NS_HTTP_DISALLOW_SPDY, OriginAttributes());
};
if (NS_IsMainThread()) {
processHeaderTask();
return;
}
NS_DispatchToMainThread(NS_NewRunnableFunction(
"TRRServiceChannel::ProcessAltService", std::move(processHeaderTask)));
}
NS_IMETHODIMP