Skip to content

Commit

Permalink
Bug 1816918 - pass ClientInfo via IPC while creating webtransport ses…
Browse files Browse the repository at this point in the history
…sion. r=necko-reviewers,jesup

Differential Revision: https://phabricator.services.mozilla.com/D173115
  • Loading branch information
MayyaSunil committed Mar 28, 2023
1 parent f1500bc commit 79d3097
Show file tree
Hide file tree
Showing 14 changed files with 73 additions and 19 deletions.
1 change: 1 addition & 0 deletions dom/base/nsContentPolicyUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
7 changes: 6 additions & 1 deletion dom/base/nsIContentPolicy.idl
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion dom/cache/DBSchema.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
2 changes: 2 additions & 0 deletions dom/fetch/InternalRequest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions dom/security/SecFetch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions dom/security/nsCSPUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
3 changes: 2 additions & 1 deletion dom/webtransport/api/WebTransport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down
11 changes: 7 additions & 4 deletions dom/webtransport/parent/WebTransportParent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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"));
}
});
Expand Down
4 changes: 3 additions & 1 deletion dom/webtransport/parent/WebTransportParent.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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,
Expand Down
10 changes: 6 additions & 4 deletions ipc/glue/BackgroundParentImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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();
}

Expand Down
3 changes: 2 additions & 1 deletion ipc/glue/BackgroundParentImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 2 additions & 0 deletions ipc/glue/PBackground.ipdl
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ include protocol PWebSocketConnection;
include protocol PWebTransport;
include protocol PFetch;

include ClientIPCTypes;
include DOMTypes;
include IPCBlob;
include IPCServiceWorkerDescriptor;
Expand Down Expand Up @@ -195,6 +196,7 @@ parent:
async CreateWebTransportParent(
nsString aURL,
nullable nsIPrincipal aPrincipal,
IPCClientInfo aClientInfo,
bool aDedicated,
bool aRequireUnreliable,
uint32_t aCongestionControl,
Expand Down
32 changes: 26 additions & 6 deletions netwerk/protocol/webtransport/WebTransportSessionProxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,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"));
Expand All @@ -81,12 +89,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);

Expand Down
11 changes: 11 additions & 0 deletions netwerk/protocol/webtransport/nsIWebTransport.idl
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ interface nsIWebTransportSendStream;
interface nsIWebTransportReceiveStream;

%{C++
namespace mozilla::dom {
class ClientInfo;
}
namespace mozilla::net {
class Http3WebTransportSession;
class Http3WebTransportStream;
Expand All @@ -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 {
Expand All @@ -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();

Expand Down

0 comments on commit 79d3097

Please sign in to comment.