Files
tubestation/dom/fetch/ChannelInfo.cpp
Nika Layzell def1925970 Bug 1751948 - Part 7: Fix non-unified filename conflict between generated and non-generated ChannelInfo.cpp files, r=asuth
Due to the earlier changes in this patch series, we now build IPDL files
within the directories which they're declared in, meaning that the
generated ChannelInfo.cpp file made by ChannelInfo.ipdlh will try to
compile a ChannelInfo.o file on top of ChannelInfo.cpp's ChannelInfo.o
file when building in non-unified mode.

This works around the issue by renaming the ipdlh file to
IPCChannelInfo.ipdlh.

Differential Revision: https://phabricator.services.mozilla.com/D138567
2022-02-28 21:01:49 +00:00

114 lines
3.3 KiB
C++

/* -*- 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/. */
#include "mozilla/dom/ChannelInfo.h"
#include "nsCOMPtr.h"
#include "nsContentUtils.h"
#include "nsIChannel.h"
#include "mozilla/dom/Document.h"
#include "nsIGlobalObject.h"
#include "nsIHttpChannel.h"
#include "nsSerializationHelper.h"
#include "mozilla/BasePrincipal.h"
#include "mozilla/net/HttpBaseChannel.h"
#include "mozilla/ipc/IPCChannelInfo.h"
#include "nsNetUtil.h"
using namespace mozilla;
using namespace mozilla::dom;
void ChannelInfo::InitFromDocument(Document* aDoc) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(!mInited, "Cannot initialize the object twice");
nsCOMPtr<nsISupports> securityInfo = aDoc->GetSecurityInfo();
if (securityInfo) {
SetSecurityInfo(securityInfo);
}
mInited = true;
}
void ChannelInfo::InitFromChannel(nsIChannel* aChannel) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(!mInited, "Cannot initialize the object twice");
nsCOMPtr<nsISupports> securityInfo;
aChannel->GetSecurityInfo(getter_AddRefs(securityInfo));
if (securityInfo) {
SetSecurityInfo(securityInfo);
}
mInited = true;
}
void ChannelInfo::InitFromChromeGlobal(nsIGlobalObject* aGlobal) {
MOZ_ASSERT(!mInited, "Cannot initialize the object twice");
MOZ_ASSERT(aGlobal);
MOZ_RELEASE_ASSERT(aGlobal->PrincipalOrNull()->IsSystemPrincipal());
mSecurityInfo.Truncate();
mInited = true;
}
void ChannelInfo::InitFromIPCChannelInfo(
const mozilla::ipc::IPCChannelInfo& aChannelInfo) {
MOZ_ASSERT(!mInited, "Cannot initialize the object twice");
mSecurityInfo = aChannelInfo.securityInfo();
mInited = true;
}
void ChannelInfo::SetSecurityInfo(nsISupports* aSecurityInfo) {
MOZ_ASSERT(mSecurityInfo.IsEmpty(), "security info should only be set once");
nsCOMPtr<nsISerializable> serializable = do_QueryInterface(aSecurityInfo);
if (!serializable) {
NS_WARNING(
"A non-serializable object was passed to "
"InternalResponse::SetSecurityInfo");
return;
}
NS_SerializeToString(serializable, mSecurityInfo);
}
nsresult ChannelInfo::ResurrectInfoOnChannel(nsIChannel* aChannel) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(mInited);
if (!mSecurityInfo.IsEmpty()) {
nsCOMPtr<nsISupports> infoObj;
nsresult rv = NS_DeserializeObject(mSecurityInfo, getter_AddRefs(infoObj));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(aChannel);
MOZ_ASSERT(httpChannel);
net::HttpBaseChannel* httpBaseChannel =
static_cast<net::HttpBaseChannel*>(httpChannel.get());
rv = httpBaseChannel->OverrideSecurityInfo(infoObj);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
}
return NS_OK;
}
mozilla::ipc::IPCChannelInfo ChannelInfo::AsIPCChannelInfo() const {
// This may be called when mInited is false, for example if we try to store
// a synthesized Response object into the Cache. Uninitialized and empty
// ChannelInfo objects are indistinguishable at the IPC level, so this is
// fine.
IPCChannelInfo ipcInfo;
ipcInfo.securityInfo() = mSecurityInfo;
return ipcInfo;
}