Blob Blame History Raw
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 ts=8 et tw=80 ft=cpp : */

/* 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 PNecko;
include protocol PStreamFilter;
include InputStreamParams;
include URIParams;
include PBackgroundSharedTypes;
include NeckoChannelParams;
include IPCServiceWorkerDescriptor;

include "mozilla/net/NeckoMessageUtils.h";

using class nsHttpHeaderArray from "nsHttpHeaderArray.h";
using mozilla::net::NetAddr from "mozilla/net/DNS.h";
using struct mozilla::net::ResourceTimingStruct from "mozilla/net/TimingStruct.h";

namespace mozilla {
namespace net {

//-------------------------------------------------------------------
protocol PHttpChannel
{
  manager PNecko;

parent:
  // Note: channels are opened during construction, so no open method here:
  // see PNecko.ipdl

  async SetClassOfService(uint32_t cos);

  async SetCacheTokenCachedCharset(nsCString charset);

  async UpdateAssociatedContentSecurity(int32_t broken,
                                        int32_t no);
  async Suspend();
  async Resume();

  async Cancel(nsresult status);

  // Reports approval/veto of redirect by child process redirect observers
  async Redirect2Verify(nsresult result, RequestHeaderTuples changedHeaders,
                        uint32_t loadFlags, uint32_t referrerPolicy,
                        OptionalURIParams referrerUri,
                        OptionalURIParams apiRedirectTo,
                        OptionalCorsPreflightArgs corsPreflightArgs,
                        bool chooseAppcache);

  // For document loads we keep this protocol open after child's
  // OnStopRequest, and send this msg (instead of __delete__) to allow
  // partial cleanup on parent.
  async DocumentChannelCleanup(bool clearCacheEntry);

  // This might have to be sync. If this fails we must fail the document load
  // to avoid endless loop.
  //
  // Explanation: the document loaded was loaded from the offline cache. But
  // the cache group id (the manifest URL) of the cache group it was loaded
  // from is different then the manifest the document refers to in the html
  // tag. If we detect this during the cache selection algorithm, we must not
  // load this document from the offline cache group it was just loaded from.
  // Marking the cache entry as foreign in its cache group will prevent
  // the document to load from the bad offline cache group. After it is marked,
  // we reload the document to take the effect. If we fail to mark the entry
  // as foreign, we will end up in the same situation and reload again and
  // again, indefinitely.
  async MarkOfflineCacheEntryAsForeign();

  // Divert OnDataAvailable to the parent.
  async DivertOnDataAvailable(nsCString data,
                              uint64_t  offset,
                              uint32_t  count);

  // Divert OnStopRequest to the parent.
  async DivertOnStopRequest(nsresult statusCode);

  // Child has no more events/messages to divert to the parent.
  async DivertComplete();

  // Child has detected a CORS check failure, so needs to tell the parent
  // to remove any matching entry from the CORS preflight cache.
  async RemoveCorsPreflightCacheEntry(URIParams uri,
                                      PrincipalInfo requestingPrincipal);

  // After receiving this message, the parent calls SendDeleteSelf, and makes
  // sure not to send any more messages after that.
  async DeletingChannel();

  async __delete__();

child:
  async OnStartRequest(nsresult            channelStatus,
                       nsHttpResponseHead  responseHead,
                       bool                useResponseHead,
                       nsHttpHeaderArray   requestHeaders,
                       ParentLoadInfoForwarderArgs loadInfoForwarder,
                       bool                isFromCache,
                       bool                cacheEntryAvailable,
                       uint64_t            cacheEntryId,
                       int32_t             cacheFetchCount,
                       uint32_t            cacheExpirationTime,
                       nsCString           cachedCharset,
                       nsCString           securityInfoSerialization,
                       NetAddr             selfAddr,
                       NetAddr             peerAddr,
                       int16_t             redirectCount,
                       uint32_t            cacheKey,
                       nsCString           altDataType,
                       int64_t             altDataLength,
                       OptionalIPCServiceWorkerDescriptor controller,
                       bool                applyConversion);

  // Used to cancel child channel if we hit errors during creating and
  // AsyncOpen of nsHttpChannel on the parent.
  async FailedAsyncOpen(nsresult status);

  // Called to initiate content channel redirect, starts talking to sinks
  // on the content process and reports result via Redirect2Verify above
  async Redirect1Begin(uint32_t           registrarId,
                       URIParams          newOriginalUri,
                       uint32_t           redirectFlags,
                       ParentLoadInfoForwarderArgs loadInfoForwarder,
                       nsHttpResponseHead responseHead,
                       nsCString          securityInfoSerialization,
                       uint64_t           channelId,
                       NetAddr            oldPeerAddr);

  // Called if redirect successful so that child can complete setup.
  async Redirect3Complete();

  // Associate the child with an application ids
  async AssociateApplicationCache(nsCString groupID,
                                  nsCString clientID);

  // Report a security message to the console associated with this
  // channel.
  async ReportSecurityMessage(nsString messageTag, nsString messageCategory);

  // Tell child to delete channel (all IPDL deletes must be done from child to
  // avoid races: see bug 591708).
  async DeleteSelf();

  // Tell the child to issue a deprecation warning.
  async IssueDeprecationWarning(uint32_t warning, bool asError);

  // When CORS blocks the request in the parent process, it doesn't have the
  // correct window ID, so send the message to the child for logging to the web
  // console.
  async LogBlockedCORSRequest(nsString message);

  async AttachStreamFilter(Endpoint<PStreamFilterParent> aEndpoint);

  // See ADivertableParentChannel::CancelDiversion
  async CancelDiversion();

both:
  // After receiving this message, the parent also calls
  // SendFinishInterceptedRedirect, and makes sure not to send any more messages
  // after that. When receiving this message, the child will call
  // Send__delete__() and complete the steps required to finish the redirect.
  async FinishInterceptedRedirect();

  async SetPriority(int16_t priority);
};


} // namespace net
} // namespace mozilla