diff -r 000000000000 -r 6474c204b198 netwerk/protocol/http/HttpChannelParent.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/netwerk/protocol/http/HttpChannelParent.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,167 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set sw=2 ts=8 et 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/. */ + +#ifndef mozilla_net_HttpChannelParent_h +#define mozilla_net_HttpChannelParent_h + +#include "ADivertableParentChannel.h" +#include "nsHttp.h" +#include "mozilla/dom/PBrowserParent.h" +#include "mozilla/net/PHttpChannelParent.h" +#include "mozilla/net/NeckoCommon.h" +#include "mozilla/net/NeckoParent.h" +#include "nsIParentRedirectingChannel.h" +#include "nsIProgressEventSink.h" +#include "nsHttpChannel.h" + +class nsICacheEntry; +class nsIAssociatedContentSecurity; + +namespace mozilla { + +namespace dom{ +class TabParent; +} + +namespace net { + +class HttpChannelParentListener; + +class HttpChannelParent : public PHttpChannelParent + , public nsIParentRedirectingChannel + , public nsIProgressEventSink + , public nsIInterfaceRequestor + , public ADivertableParentChannel +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSIREQUESTOBSERVER + NS_DECL_NSISTREAMLISTENER + NS_DECL_NSIPARENTCHANNEL + NS_DECL_NSIPARENTREDIRECTINGCHANNEL + NS_DECL_NSIPROGRESSEVENTSINK + NS_DECL_NSIINTERFACEREQUESTOR + + HttpChannelParent(mozilla::dom::PBrowserParent* iframeEmbedding, + nsILoadContext* aLoadContext, + PBOverrideStatus aStatus); + virtual ~HttpChannelParent(); + + bool Init(const HttpChannelCreationArgs& aOpenArgs); + + // ADivertableParentChannel functions. + void DivertTo(nsIStreamListener *aListener) MOZ_OVERRIDE; + nsresult SuspendForDiversion() MOZ_OVERRIDE; + + // Calls OnStartRequest for "DivertTo" listener, then notifies child channel + // that it should divert OnDataAvailable and OnStopRequest calls to this + // parent channel. + void StartDiversion(); + + // Handles calling OnStart/Stop if there are errors during diversion. + // Called asynchronously from FailDiversion. + void NotifyDiversionFailed(nsresult aErrorCode, bool aSkipResume = true); + +protected: + // used to connect redirected-to channel in parent with just created + // ChildChannel. Used during redirects. + bool ConnectChannel(const uint32_t& channelId); + + bool DoAsyncOpen(const URIParams& uri, + const OptionalURIParams& originalUri, + const OptionalURIParams& docUri, + const OptionalURIParams& referrerUri, + const OptionalURIParams& internalRedirectUri, + const uint32_t& loadFlags, + const RequestHeaderTuples& requestHeaders, + const nsCString& requestMethod, + const OptionalInputStreamParams& uploadStream, + const bool& uploadStreamHasHeaders, + const uint16_t& priority, + const uint8_t& redirectionLimit, + const bool& allowPipelining, + const bool& forceAllowThirdPartyCookie, + const bool& doResumeAt, + const uint64_t& startPos, + const nsCString& entityID, + const bool& chooseApplicationCache, + const nsCString& appCacheClientID, + const bool& allowSpdy, + const OptionalFileDescriptorSet& aFds); + + virtual bool RecvSetPriority(const uint16_t& priority) MOZ_OVERRIDE; + virtual bool RecvSetCacheTokenCachedCharset(const nsCString& charset) MOZ_OVERRIDE; + virtual bool RecvSuspend() MOZ_OVERRIDE; + virtual bool RecvResume() MOZ_OVERRIDE; + virtual bool RecvCancel(const nsresult& status) MOZ_OVERRIDE; + virtual bool RecvRedirect2Verify(const nsresult& result, + const RequestHeaderTuples& changedHeaders, + const OptionalURIParams& apiRedirectUri) MOZ_OVERRIDE; + virtual bool RecvUpdateAssociatedContentSecurity(const int32_t& broken, + const int32_t& no) MOZ_OVERRIDE; + virtual bool RecvDocumentChannelCleanup() MOZ_OVERRIDE; + virtual bool RecvMarkOfflineCacheEntryAsForeign() MOZ_OVERRIDE; + virtual bool RecvDivertOnDataAvailable(const nsCString& data, + const uint64_t& offset, + const uint32_t& count) MOZ_OVERRIDE; + virtual bool RecvDivertOnStopRequest(const nsresult& statusCode) MOZ_OVERRIDE; + virtual bool RecvDivertComplete() MOZ_OVERRIDE; + virtual void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE; + + // Supporting function for ADivertableParentChannel. + nsresult ResumeForDiversion(); + + // Asynchronously calls NotifyDiversionFailed. + void FailDiversion(nsresult aErrorCode, bool aSkipResume = true); + + friend class HttpChannelParentListener; + nsRefPtr mTabParent; + +private: + nsRefPtr mChannel; + nsCOMPtr mCacheEntry; + nsCOMPtr mAssociatedContentSecurity; + bool mIPCClosed; // PHttpChannel actor has been Closed() + + nsCOMPtr mRedirectChannel; + nsCOMPtr mRedirectCallback; + + nsAutoPtr mOfflineForeignMarker; + + // state for combining OnStatus/OnProgress with OnDataAvailable + // into one IPDL call to child. + nsresult mStoredStatus; + uint64_t mStoredProgress; + uint64_t mStoredProgressMax; + + bool mSentRedirect1Begin : 1; + bool mSentRedirect1BeginFailed : 1; + bool mReceivedRedirect2Verify : 1; + + PBOverrideStatus mPBOverride; + + nsCOMPtr mLoadContext; + nsRefPtr mHttpHandler; + + nsRefPtr mParentListener; + // Set to the canceled status value if the main channel was canceled. + nsresult mStatus; + // Once set, no OnStart/OnData/OnStop calls should be accepted; conversely, it + // must be set when RecvDivertOnData/~DivertOnStop/~DivertComplete are + // received from the child channel. + bool mDivertingFromChild; + + // Set if OnStart|StopRequest was called during a diversion from the child. + bool mDivertedOnStartRequest; + + bool mSuspendedForDiversion; +}; + +} // namespace net +} // namespace mozilla + +#endif // mozilla_net_HttpChannelParent_h