Bug 1816918 - pass ClientInfo via IPC while creating webtransport session. r=necko-reviewers,jesup

Differential Revision: https://phabricator.services.mozilla.com/D173115
This commit is contained in:
sunil mayya 2023-03-27 12:35:44 +00:00
parent cf3b888238
commit 3497e2d7c9
14 changed files with 73 additions and 19 deletions

View File

@ -147,6 +147,7 @@ inline const char* NS_CP_ContentTypeName(nsContentPolicyType contentType) {
CASE_RETURN(TYPE_INTERNAL_WORKER_STATIC_MODULE);
CASE_RETURN(TYPE_PROXIED_WEBRTC_MEDIA);
CASE_RETURN(TYPE_WEB_IDENTITY);
CASE_RETURN(TYPE_WEB_TRANSPORT);
CASE_RETURN(TYPE_END);
case nsIContentPolicy::TYPE_INVALID:
break;

View File

@ -438,13 +438,18 @@ interface nsIContentPolicy : nsISupports
*/
TYPE_INTERNAL_WORKER_STATIC_MODULE = 58,
/**
* Indicates Webtransport request
*/
TYPE_WEB_TRANSPORT = 59,
/**
* Used to indicate the end of this list, not a content policy. If you want
* to add a new content policy type, place it before this sentinel value
* TYPE_END, have it use TYPE_END's current value, and increment TYPE_END by
* one. (TYPE_END should always have the highest numerical value.)
*/
TYPE_END = 59,
TYPE_END = 60,
/* When adding new content types, please update

View File

@ -344,7 +344,8 @@ static_assert(
nsIContentPolicy::TYPE_UA_FONT == 55 &&
nsIContentPolicy::TYPE_WEB_IDENTITY == 57 &&
nsIContentPolicy::TYPE_INTERNAL_WORKER_STATIC_MODULE == 58 &&
nsIContentPolicy::TYPE_END == 59,
nsIContentPolicy::TYPE_WEB_TRANSPORT == 59 &&
nsIContentPolicy::TYPE_END == 60,
"nsContentPolicyType values are as expected");
namespace {

View File

@ -347,6 +347,8 @@ RequestDestination InternalRequest::MapContentPolicyTypeToRequestDestination(
return RequestDestination::_empty;
case nsIContentPolicy::TYPE_WEB_IDENTITY:
return RequestDestination::_empty;
case nsIContentPolicy::TYPE_WEB_TRANSPORT:
return RequestDestination::_empty;
case nsIContentPolicy::TYPE_INVALID:
case nsIContentPolicy::TYPE_END:
break;

View File

@ -109,6 +109,8 @@ nsCString MapInternalContentPolicyTypeToDest(nsContentPolicyType aType) {
return "empty"_ns;
case nsIContentPolicy::TYPE_WEB_IDENTITY:
return "webidentity"_ns;
case nsIContentPolicy::TYPE_WEB_TRANSPORT:
return "webtransport"_ns;
case nsIContentPolicy::TYPE_END:
case nsIContentPolicy::TYPE_INVALID:
break;

View File

@ -323,6 +323,7 @@ CSPDirective CSP_ContentTypeToDirective(nsContentPolicyType aType) {
case nsIContentPolicy::TYPE_INTERNAL_EVENTSOURCE:
case nsIContentPolicy::TYPE_INTERNAL_FETCH_PRELOAD:
case nsIContentPolicy::TYPE_WEB_IDENTITY:
case nsIContentPolicy::TYPE_WEB_TRANSPORT:
return nsIContentSecurityPolicy::CONNECT_SRC_DIRECTIVE;
case nsIContentPolicy::TYPE_OBJECT:

View File

@ -244,6 +244,7 @@ void WebTransport::Init(const GlobalObject& aGlobal, const nsAString& aURL,
}
nsCOMPtr<nsIPrincipal> principal = mGlobal->PrincipalOrNull();
IPCClientInfo ipcClientInfo(mGlobal->GetClientInfo().ref().ToIPC());
// Create a new IPC connection
Endpoint<PWebTransportParent> parentEndpoint;
Endpoint<PWebTransportChild> childEndpoint;
@ -321,7 +322,7 @@ void WebTransport::Init(const GlobalObject& aGlobal, const nsAString& aURL,
// https://w3c.github.io/webtransport/#webtransport-constructor Spec 5.2
backgroundChild
->SendCreateWebTransportParent(aURL, principal, dedicated,
->SendCreateWebTransportParent(aURL, principal, ipcClientInfo, dedicated,
requireUnreliable,
(uint32_t)congestionControl,
// XXX serverCertHashes,

View File

@ -32,7 +32,8 @@ WebTransportParent::~WebTransportParent() {
}
void WebTransportParent::Create(
const nsAString& aURL, nsIPrincipal* aPrincipal, const bool& aDedicated,
const nsAString& aURL, nsIPrincipal* aPrincipal,
const IPCClientInfo& aClientInfo, const bool& aDedicated,
const bool& aRequireUnreliable, const uint32_t& aCongestionControl,
// Sequence<WebTransportHash>* aServerCertHashes,
Endpoint<PWebTransportParent>&& aParentEndpoint,
@ -88,10 +89,12 @@ void WebTransportParent::Create(
"WebTransport AsyncConnect",
[self = RefPtr{this}, uri = std::move(uri),
principal = RefPtr{aPrincipal},
flags = nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL] {
flags = nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL,
aClientInfo] {
LOG(("WebTransport %p AsyncConnect", self.get()));
if (NS_FAILED(self->mWebTransport->AsyncConnect(uri, principal, flags,
self))) {
if (NS_FAILED(self->mWebTransport->AsyncConnectWithClient(
uri, principal, flags, self,
mozilla::Some(ClientInfo(aClientInfo))))) {
LOG(("AsyncConnect failure; we should get OnSessionClosed"));
}
});

View File

@ -8,6 +8,7 @@
#define DOM_WEBTRANSPORT_PARENT_WEBTRANSPORTPARENT_H_
#include "ErrorList.h"
#include "mozilla/dom/ClientIPCTypes.h"
#include "mozilla/dom/FlippedOnce.h"
#include "mozilla/dom/PWebTransportParent.h"
#include "mozilla/ipc/Endpoint.h"
@ -31,7 +32,8 @@ class WebTransportParent : public PWebTransportParent,
NS_DECL_WEBTRANSPORTSESSIONEVENTLISTENER
void Create(const nsAString& aURL, nsIPrincipal* aPrincipal,
const bool& aDedicated, const bool& aRequireUnreliable,
const IPCClientInfo& aClientInfo, const bool& aDedicated,
const bool& aRequireUnreliable,
const uint32_t& aCongestionControl,
// Sequence<WebTransportHash>* aServerCertHashes,
Endpoint<PWebTransportParent>&& aParentEndpoint,

View File

@ -490,7 +490,8 @@ mozilla::ipc::IPCResult BackgroundParentImpl::RecvCreateFileSystemManagerParent(
}
mozilla::ipc::IPCResult BackgroundParentImpl::RecvCreateWebTransportParent(
const nsAString& aURL, nsIPrincipal* aPrincipal, const bool& aDedicated,
const nsAString& aURL, nsIPrincipal* aPrincipal,
const IPCClientInfo& aClientInfo, const bool& aDedicated,
const bool& aRequireUnreliable, const uint32_t& aCongestionControl,
// Sequence<WebTransportHash>* aServerCertHashes,
Endpoint<PWebTransportParent>&& aParentEndpoint,
@ -500,9 +501,10 @@ mozilla::ipc::IPCResult BackgroundParentImpl::RecvCreateWebTransportParent(
RefPtr<mozilla::dom::WebTransportParent> webt =
new mozilla::dom::WebTransportParent();
webt->Create(
aURL, aPrincipal, aDedicated, aRequireUnreliable, aCongestionControl,
/*aServerCertHashes, */ std::move(aParentEndpoint), std::move(aResolver));
webt->Create(aURL, aPrincipal, aClientInfo, aDedicated, aRequireUnreliable,
aCongestionControl,
/*aServerCertHashes, */ std::move(aParentEndpoint),
std::move(aResolver));
return IPC_OK();
}

View File

@ -136,7 +136,8 @@ class BackgroundParentImpl : public PBackgroundParent {
CreateFileSystemManagerParentResolver&& aResolver) override;
mozilla::ipc::IPCResult RecvCreateWebTransportParent(
const nsAString& aURL, nsIPrincipal* aPrincipal, const bool& aDedicated,
const nsAString& aURL, nsIPrincipal* aPrincipal,
const IPCClientInfo& aClientInfo, const bool& aDedicated,
const bool& aRequireUnreliable, const uint32_t& aCongestionControl,
// Sequence<WebTransportHash>* aServerCertHashes,
Endpoint<PWebTransportParent>&& aParentEndpoint,

View File

@ -55,6 +55,7 @@ include protocol PWebSocketConnection;
include protocol PWebTransport;
include protocol PFetch;
include ClientIPCTypes;
include DOMTypes;
include IPCBlob;
include IPCServiceWorkerDescriptor;
@ -195,6 +196,7 @@ parent:
async CreateWebTransportParent(
nsString aURL,
nullable nsIPrincipal aPrincipal,
IPCClientInfo aClientInfo,
bool aDedicated,
bool aRequireUnreliable,
uint32_t aCongestionControl,

View File

@ -61,6 +61,14 @@ WebTransportSessionProxy::~WebTransportSessionProxy() {
nsresult WebTransportSessionProxy::AsyncConnect(
nsIURI* aURI, nsIPrincipal* aPrincipal, uint32_t aSecurityFlags,
WebTransportSessionEventListener* aListener) {
return AsyncConnectWithClient(aURI, aPrincipal, aSecurityFlags, aListener,
Maybe<dom::ClientInfo>());
}
nsresult WebTransportSessionProxy::AsyncConnectWithClient(
nsIURI* aURI, nsIPrincipal* aPrincipal, uint32_t aSecurityFlags,
WebTransportSessionEventListener* aListener,
const Maybe<dom::ClientInfo>& aClientInfo) {
MOZ_ASSERT(NS_IsMainThread());
LOG(("WebTransportSessionProxy::AsyncConnect"));
@ -80,12 +88,24 @@ nsresult WebTransportSessionProxy::AsyncConnect(
nsLoadFlags loadFlags = nsIRequest::LOAD_NORMAL |
nsIRequest::LOAD_BYPASS_CACHE |
nsIRequest::INHIBIT_CACHING;
nsresult rv = NS_NewChannel(getter_AddRefs(mChannel), aURI, aPrincipal, flags,
nsContentPolicyType::TYPE_OTHER,
/* aCookieJarSettings */ nullptr,
/* aPerformanceStorage */ nullptr,
/* aLoadGroup */ nullptr,
/* aCallbacks */ this, loadFlags);
nsresult rv = NS_ERROR_FAILURE;
if (aClientInfo.isSome()) {
rv = NS_NewChannel(getter_AddRefs(mChannel), aURI, aPrincipal,
aClientInfo.ref(), Maybe<dom::ServiceWorkerDescriptor>(),
flags, nsContentPolicyType::TYPE_WEB_TRANSPORT,
/* aCookieJarSettings */ nullptr,
/* aPerformanceStorage */ nullptr,
/* aLoadGroup */ nullptr,
/* aCallbacks */ this, loadFlags);
} else {
rv = NS_NewChannel(getter_AddRefs(mChannel), aURI, aPrincipal, flags,
nsContentPolicyType::TYPE_WEB_TRANSPORT,
/* aCookieJarSettings */ nullptr,
/* aPerformanceStorage */ nullptr,
/* aLoadGroup */ nullptr,
/* aCallbacks */ this, loadFlags);
}
NS_ENSURE_SUCCESS(rv, rv);

View File

@ -14,6 +14,9 @@ interface nsIWebTransportSendStream;
interface nsIWebTransportReceiveStream;
%{C++
namespace mozilla::dom {
class ClientInfo;
}
namespace mozilla::net {
class Http3WebTransportSession;
class Http3WebTransportStream;
@ -23,6 +26,7 @@ class Http3WebTransportStream;
[ptr] native Http3WebTransportSessionPtr(mozilla::net::Http3WebTransportSession);
[ptr] native Http3WebTransportStreamPtr(mozilla::net::Http3WebTransportStream);
native Datagram(nsTArray<uint8_t>&&);
[ref] native const_MaybeClientInfoRef(const mozilla::Maybe<mozilla::dom::ClientInfo>);
[builtinclass, scriptable, uuid(c20d6e77-8cb1-4838-a88d-fff826080aa3)]
interface nsIWebTransport : nsISupports {
@ -36,6 +40,13 @@ interface nsIWebTransport : nsISupports {
in nsIPrincipal aLoadingPrincipal,
in unsigned long aSecurityFlags,
in WebTransportSessionEventListener aListener);
void asyncConnectWithClient(in nsIURI aURI,
in nsIPrincipal aLoadingPrincipal,
in unsigned long aSecurityFlags,
in WebTransportSessionEventListener aListener,
in const_MaybeClientInfoRef aClientInfo);
// Asynchronously get states.
void getStats();