/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set sw=2 ts=8 et tw=80 ft=c: */ /* 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 protocol PHttpChannel; include protocol PFTPChannel; include protocol PChildToParentStream; include BlobTypes; include ClientIPCTypes; include URIParams; include IPCServiceWorkerDescriptor; include IPCStream; include PBackgroundSharedTypes; using mozilla::OriginAttributes from "mozilla/ipc/BackgroundUtils.h"; using struct mozilla::void_t from "ipc/IPCMessageUtils.h"; using RequestHeaderTuples from "mozilla/net/PHttpChannelParams.h"; using ArrayOfStringPairs from "mozilla/net/PHttpChannelParams.h"; using struct nsHttpAtom from "nsHttp.h"; using class mozilla::net::nsHttpResponseHead from "nsHttpResponseHead.h"; using class mozilla::TimeStamp from "mozilla/TimeStamp.h"; namespace mozilla { namespace net { //----------------------------------------------------------------------------- // LoadInfo IPDL structs //----------------------------------------------------------------------------- struct RedirectHistoryEntryInfo { PrincipalInfo principalInfo; OptionalURIParams referrerUri; nsCString remoteAddress; }; struct LoadInfoArgs { OptionalPrincipalInfo requestingPrincipalInfo; PrincipalInfo triggeringPrincipalInfo; OptionalPrincipalInfo principalToInheritInfo; OptionalPrincipalInfo sandboxedLoadingPrincipalInfo; OptionalPrincipalInfo topLevelPrincipalInfo; OptionalPrincipalInfo topLevelStorageAreaPrincipalInfo; OptionalURIParams resultPrincipalURI; uint32_t securityFlags; uint32_t contentPolicyType; uint32_t tainting; bool upgradeInsecureRequests; bool browserUpgradeInsecureRequests; bool browserWouldUpgradeInsecureRequests; bool verifySignedContent; bool enforceSRI; bool forceAllowDataURI; bool allowInsecureRedirectToDataURI; bool skipContentPolicyCheckForWebRequest; bool forceInheritPrincipalDropped; uint64_t innerWindowID; uint64_t outerWindowID; uint64_t parentOuterWindowID; uint64_t topOuterWindowID; uint64_t frameOuterWindowID; uint64_t browsingContextID; bool initialSecurityCheckDone; bool isInThirdPartyContext; bool isDocshellReload; bool sendCSPViolationEvents; OriginAttributes originAttributes; RedirectHistoryEntryInfo[] redirectChainIncludingInternalRedirects; RedirectHistoryEntryInfo[] redirectChain; /** * Ancestor data for use with the WebRequest API. * See nsILoadInfo.idl for details. */ PrincipalInfo[] ancestorPrincipals; uint64_t[] ancestorOuterWindowIDs; /** * ClientInfo structure representing the window or worker that triggered * this network request. May be void_t if its a system internal request. */ OptionalIPCClientInfo clientInfo; /** * Non-subresource requests will result in the creation of a window or * worker client. The reserved and initial ClientInfo values represent * this resulting client. An initial ClientInfo represents an initial * about:blank window that will be re-used while a reserved ClientInfo * represents a to-be-newly-created window/worker. */ OptionalIPCClientInfo reservedClientInfo; OptionalIPCClientInfo initialClientInfo; /** * Subresource loads may have a controller set based on their owning * window/worker client. We must send this across IPC to support * performing interception in the parent. */ OptionalIPCServiceWorkerDescriptor controller; nsCString[] corsUnsafeHeaders; bool forcePreflight; bool isPreflight; bool loadTriggeredFromExternal; bool serviceWorkerTaintingSynthesized; bool documentHasUserInteracted; bool documentHasLoaded; nsString cspNonce; bool isFromProcessingFrameAttributes; }; /** * Not every channel necessarily has a loadInfo attached. */ union OptionalLoadInfoArgs { void_t; LoadInfoArgs; }; /** * This structure is used to carry selected properties of a LoadInfo * object to child processes to merge LoadInfo changes from the parent * process. We don't want to use LoadInfoArgs for that since it's * too huge and we only care about small subpart of properties anyway. */ struct ParentLoadInfoForwarderArgs { // WebExtextensions' WebRequest API allows extensions to intercept and // redirect a channel to a data URI. This modifications happens in // the parent and needs to be mirrored to the child so that security // checks can pass. bool allowInsecureRedirectToDataURI; // The ServiceWorker controller that may be set in the parent when // interception occurs. OptionalIPCServiceWorkerDescriptor controller; // The service worker may synthesize a Response with a particular // tainting value. uint32_t tainting; // We must also note that the tainting value was explicitly set // by the service worker. bool serviceWorkerTaintingSynthesized; bool documentHasUserInteracted; bool documentHasLoaded; // IMPORTANT: when you add new properites here you must also update // LoadInfoToParentLoadInfoForwarder and MergeParentLoadInfoForwarder // in BackgroundUtils.cpp/.h! }; /** * This structure is used to carry selected properties of a LoadInfo * object to the parent process that might have changed in the child * during a redirect. We don't want to use LoadInfoArgs for that since * it's too huge and we only care about small subpart of properties * anyway. */ struct ChildLoadInfoForwarderArgs { // The reserved and initial ClientInfo values may change during a // redirect if the new channel is cross-origin to the old channel. OptionalIPCClientInfo reservedClientInfo; OptionalIPCClientInfo initialClientInfo; // The ServiceWorker controller may be cleared in the child during // a redirect. OptionalIPCServiceWorkerDescriptor controller; }; //----------------------------------------------------------------------------- // HTTP IPDL structs //----------------------------------------------------------------------------- union OptionalHttpResponseHead { void_t; nsHttpResponseHead; }; struct CorsPreflightArgs { nsCString[] unsafeHeaders; }; union OptionalCorsPreflightArgs { void_t; CorsPreflightArgs; }; struct HttpChannelOpenArgs { URIParams uri; // - TODO: bug 571161: unclear if any HTTP channel clients ever // set originalURI != uri (about:credits?); also not clear if // chrome channel would ever need to know. Get rid of next arg? OptionalURIParams original; OptionalURIParams doc; OptionalURIParams referrer; uint32_t referrerPolicy; OptionalURIParams apiRedirectTo; OptionalURIParams topWindowURI; uint32_t loadFlags; RequestHeaderTuples requestHeaders; nsCString requestMethod; OptionalIPCStream uploadStream; bool uploadStreamHasHeaders; int16_t priority; uint32_t classOfService; uint8_t redirectionLimit; bool allowSTS; uint32_t thirdPartyFlags; bool resumeAt; uint64_t startPos; nsCString entityID; bool chooseApplicationCache; nsCString appCacheClientID; bool allowSpdy; bool allowAltSvc; bool beConservative; uint32_t tlsFlags; OptionalLoadInfoArgs loadInfo; OptionalHttpResponseHead synthesizedResponseHead; nsCString synthesizedSecurityInfoSerialization; uint32_t cacheKey; uint64_t requestContextID; OptionalCorsPreflightArgs preflightArgs; uint32_t initialRwin; bool blockAuthPrompt; bool suspendAfterSynthesizeResponse; bool allowStaleCacheContent; nsCString contentTypeHint; uint32_t corsMode; uint32_t redirectMode; uint64_t channelId; nsString integrityMetadata; uint64_t contentWindowId; ArrayOfStringPairs preferredAlternativeTypes; uint64_t topLevelOuterContentWindowId; TimeStamp launchServiceWorkerStart; TimeStamp launchServiceWorkerEnd; TimeStamp dispatchFetchEventStart; TimeStamp dispatchFetchEventEnd; TimeStamp handleFetchEventStart; TimeStamp handleFetchEventEnd; bool forceMainDocumentChannel; TimeStamp navigationStartTimeStamp; }; struct HttpChannelConnectArgs { uint32_t registrarId; bool shouldIntercept; }; union HttpChannelCreationArgs { HttpChannelOpenArgs; // For AsyncOpen: the common case. HttpChannelConnectArgs; // Used for redirected-to channels }; //----------------------------------------------------------------------------- // FTP IPDL structs //----------------------------------------------------------------------------- struct FTPChannelOpenArgs { URIParams uri; uint64_t startPos; nsCString entityID; OptionalIPCStream uploadStream; OptionalLoadInfoArgs loadInfo; uint32_t loadFlags; }; struct FTPChannelConnectArgs { uint32_t channelId; }; union FTPChannelCreationArgs { FTPChannelOpenArgs; // For AsyncOpen: the common case. FTPChannelConnectArgs; // Used for redirected-to channels }; struct HttpChannelDiverterArgs { PHttpChannel mChannel; bool mApplyConversion; }; union ChannelDiverterArgs { HttpChannelDiverterArgs; PFTPChannel; }; struct CookieStruct { nsCString name; nsCString value; nsCString host; nsCString path; int64_t expiry; int64_t lastAccessed; int64_t creationTime; bool isHttpOnly; bool isSession; bool isSecure; int8_t sameSite; }; } // namespace ipc } // namespace mozilla