Backed out 3 changesets (bug 1267474) foor test_immutable.js failures in xpcshell jobs
authorWes Kocher <wkocher@mozilla.com>
Wed, 11 May 2016 10:32:33 -0700
changeset 297000 6bd80255be5e
parent 296999 2da14459ec0f
child 297001 8e610eb88dc7
push id76557
push userkwierso@gmail.com
push date2016-05-11 17:32 +0000
treeherdermozilla-inbound@6bd80255be5e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1267474
milestone49.0a1
backs out057f3f50441f
960d93f30c66
0c059a0e87d7
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out 3 changesets (bug 1267474) foor test_immutable.js failures in xpcshell jobs Backed out changeset 057f3f50441f (bug 1267474) Backed out changeset 960d93f30c66 (bug 1267474) Backed out changeset 0c059a0e87d7 (bug 1267474)
netwerk/base/nsIRequest.idl
netwerk/protocol/http/Http2Session.cpp
netwerk/protocol/http/Http2Stream.cpp
netwerk/protocol/http/Http2Stream.h
netwerk/protocol/http/SpdySession31.cpp
netwerk/protocol/http/SpdyStream31.cpp
netwerk/protocol/http/SpdyStream31.h
netwerk/protocol/http/nsHttpChannel.cpp
netwerk/protocol/http/nsHttpChannel.h
netwerk/protocol/http/nsHttpResponseHead.cpp
netwerk/protocol/http/nsHttpResponseHead.h
netwerk/protocol/http/nsHttpTransaction.cpp
netwerk/protocol/http/nsHttpTransaction.h
netwerk/test/unit/test_immutable.js
netwerk/test/unit/xpcshell.ini
testing/xpcshell/moz-http2/moz-http2.js
--- a/netwerk/base/nsIRequest.idl
+++ b/netwerk/base/nsIRequest.idl
@@ -175,17 +175,17 @@ interface nsIRequest : nsISupports
     const unsigned long LOAD_FROM_CACHE   = 1 << 10;
 
     /**
      * The following flags control the frequency of cached content validation
      * when neither LOAD_BYPASS_CACHE or LOAD_FROM_CACHE are set.  By default,
      * cached content is automatically validated if necessary before reuse.
      * 
      * VALIDATE_ALWAYS forces validation of any cached content independent of
-     * its expiration time (unless it is https with Cache-Control: immutable)
+     * its expiration time.
      * 
      * VALIDATE_NEVER disables validation of cached content, unless it arrived
      * with the "Cache: no-store" header, or arrived via HTTPS with the
      * "Cache: no-cache" header.
      *
      * VALIDATE_ONCE_PER_SESSION disables validation of expired content, 
      * provided it has already been validated (at least once) since the start 
      * of this session.
--- a/netwerk/protocol/http/Http2Session.cpp
+++ b/netwerk/protocol/http/Http2Session.cpp
@@ -3309,17 +3309,16 @@ void
 Http2Session::SetNeedsCleanup()
 {
   LOG3(("Http2Session::SetNeedsCleanup %p - recorded downstream fin of "
         "stream %p 0x%X", this, mInputFrameDataStream,
         mInputFrameDataStream->StreamID()));
 
   // This will result in Close() being called
   MOZ_ASSERT(!mNeedsCleanup, "mNeedsCleanup unexpectedly set");
-  mInputFrameDataStream->SetResponseIsComplete();
   mNeedsCleanup = mInputFrameDataStream;
   ResetDownstreamState();
 }
 
 void
 Http2Session::ConnectPushedStream(Http2Stream *stream)
 {
   mPushesReadyForRead.Push(stream);
--- a/netwerk/protocol/http/Http2Stream.cpp
+++ b/netwerk/protocol/http/Http2Stream.cpp
@@ -1078,25 +1078,16 @@ Http2Stream::ConvertPushHeaders(Http2Dec
 
 void
 Http2Stream::Close(nsresult reason)
 {
   mTransaction->Close(reason);
 }
 
 void
-Http2Stream::SetResponseIsComplete()
-{
-  nsHttpTransaction *trans = mTransaction->QueryHttpTransaction();
-  if (trans) {
-    trans->SetResponseIsComplete();
-  }
-}
-
-void
 Http2Stream::SetAllHeadersReceived()
 {
   if (mAllHeadersReceived) {
     return;
   }
 
   if (mState == RESERVED_BY_REMOTE) {
     // pushed streams needs to wait until headers have
--- a/netwerk/protocol/http/Http2Stream.h
+++ b/netwerk/protocol/http/Http2Stream.h
@@ -75,17 +75,16 @@ public:
 
   nsAHttpTransaction *Transaction() { return mTransaction; }
   virtual nsIRequestContext *RequestContext()
   {
     return mTransaction ? mTransaction->RequestContext() : nullptr;
   }
 
   void Close(nsresult reason);
-  void SetResponseIsComplete();
 
   void SetRecvdFin(bool aStatus);
   bool RecvdFin() { return mRecvdFin; }
 
   void SetRecvdData(bool aStatus) { mReceivedData = aStatus ? 1 : 0; }
   bool RecvdData() { return mReceivedData; }
 
   void SetSentFin(bool aStatus);
--- a/netwerk/protocol/http/SpdySession31.cpp
+++ b/netwerk/protocol/http/SpdySession31.cpp
@@ -2630,17 +2630,16 @@ void
 SpdySession31::SetNeedsCleanup()
 {
   LOG3(("SpdySession31::SetNeedsCleanup %p - recorded downstream fin of "
         "stream %p 0x%X", this, mInputFrameDataStream,
         mInputFrameDataStream->StreamID()));
 
   // This will result in Close() being called
   MOZ_ASSERT(!mNeedsCleanup, "mNeedsCleanup unexpectedly set");
-  mInputFrameDataStream->SetResponseIsComplete();
   mNeedsCleanup = mInputFrameDataStream;
   ResetDownstreamState();
 }
 
 void
 SpdySession31::ConnectPushedStream(SpdyStream31 *stream)
 {
   mReadyForRead.Push(stream);
--- a/netwerk/protocol/http/SpdyStream31.cpp
+++ b/netwerk/protocol/http/SpdyStream31.cpp
@@ -1472,25 +1472,16 @@ SpdyStream31::SetFullyOpen()
 
 void
 SpdyStream31::Close(nsresult reason)
 {
   mTransaction->Close(reason);
 }
 
 void
-SpdyStream31::SetResponseIsComplete()
-{
-  nsHttpTransaction *trans = mTransaction->QueryHttpTransaction();
-  if (trans) {
-    trans->SetResponseIsComplete();
-  }
-}
-
-void
 SpdyStream31::UpdateRemoteWindow(int32_t delta)
 {
   mRemoteWindow += delta;
 
   // If the stream had a <=0 window, that has now opened
   // schedule it for writing again
   if (mBlockedOnRwin && mSession->RemoteSessionWindow() > 0 &&
       mRemoteWindow > 0) {
--- a/netwerk/protocol/http/SpdyStream31.h
+++ b/netwerk/protocol/http/SpdyStream31.h
@@ -44,17 +44,16 @@ public:
 
   nsAHttpTransaction *Transaction() { return mTransaction; }
   virtual nsIRequestContext *RequestContext()
   {
     return mTransaction ? mTransaction->RequestContext() : nullptr;
   }
 
   void Close(nsresult reason);
-  void SetResponseIsComplete();
 
   void SetRecvdFin(bool aStatus) { mRecvdFin = aStatus ? 1 : 0; }
   bool RecvdFin() { return mRecvdFin; }
 
   void SetRecvdData(bool aStatus) { mReceivedData = aStatus ? 1 : 0; }
   bool RecvdData() { return mReceivedData; }
 
   void SetQueued(bool aStatus) { mQueued = aStatus ? 1 : 0; }
--- a/netwerk/protocol/http/nsHttpChannel.cpp
+++ b/netwerk/protocol/http/nsHttpChannel.cpp
@@ -255,17 +255,16 @@ nsHttpChannel::nsHttpChannel()
     , mCacheEntriesToWaitFor(0)
     , mHasQueryString(0)
     , mConcurentCacheAccess(0)
     , mIsPartialRequest(0)
     , mHasAutoRedirectVetoNotifier(0)
     , mPinCacheContent(0)
     , mIsPackagedAppResource(0)
     , mIsCorsPreflightDone(0)
-    , mStronglyFramed(false)
     , mPushedStream(nullptr)
     , mLocalBlocklist(false)
     , mWarningReporter(nullptr)
     , mDidReval(false)
 {
     LOG(("Creating nsHttpChannel [this=%p]\n", this));
     mChannelCreationTime = PR_Now();
     mChannelCreationTimestamp = TimeStamp::Now();
@@ -3402,23 +3401,16 @@ nsHttpChannel::OnCacheEntryCheck(nsICach
     NS_ENSURE_SUCCESS(rv,rv);
 
     bool doValidation = false;
     bool canAddImsHeader = true;
 
     bool isForcedValid = false;
     entry->GetIsForcedValid(&isForcedValid);
 
-    nsXPIDLCString framedBuf;
-    rv = entry->GetMetaDataElement("strongly-framed", getter_Copies(framedBuf));
-    // describe this in terms of explicitly weakly framed so as to be backwards
-    // compatible with old cache contents which dont have strongly-framed makers
-    bool weaklyFramed = NS_SUCCEEDED(rv) && framedBuf.EqualsLiteral("0");
-    bool isImmutable = !weaklyFramed && isHttps && mCachedResponseHead->Immutable();
-
     // Cached entry is not the entity we request (see bug #633743)
     if (ResponseWouldVary(entry)) {
         LOG(("Validating based on Vary headers returning TRUE\n"));
         canAddImsHeader = false;
         doValidation = true;
     }
     // Check isForcedValid to see if it is possible to skip validation.
     // Don't skip validation if we have serious reason to believe that this
@@ -3434,17 +3426,17 @@ nsHttpChannel::OnCacheEntryCheck(nsICach
     }
     // If the LOAD_FROM_CACHE flag is set, any cached data can simply be used
     else if (mLoadFlags & nsIRequest::LOAD_FROM_CACHE || mAllowStaleCacheContent) {
         LOG(("NOT validating based on LOAD_FROM_CACHE load flag\n"));
         doValidation = false;
     }
     // If the VALIDATE_ALWAYS flag is set, any cached data won't be used until
     // it's revalidated with the server.
-    else if ((mLoadFlags & nsIRequest::VALIDATE_ALWAYS) && !isImmutable) {
+    else if (mLoadFlags & nsIRequest::VALIDATE_ALWAYS) {
         LOG(("Validating based on VALIDATE_ALWAYS load flag\n"));
         doValidation = true;
     }
     // Even if the VALIDATE_NEVER flag is set, there are still some cases in
     // which we must validate the cached response with the server.
     else if (mLoadFlags & nsIRequest::VALIDATE_NEVER) {
         LOG(("VALIDATE_NEVER set\n"));
         // if no-store validate cached response (see bug 112564)
@@ -3572,22 +3564,20 @@ nsHttpChannel::OnCacheEntryCheck(nsICach
         //
         // do not attempt to validate no-store content, since servers will not
         // expect it to be cached.  (we only keep it in our cache for the
         // purposes of back/forward, etc.)
         //
         // the request method MUST be either GET or HEAD (see bug 175641) and
         // the cached response code must be < 400
         //
-        // the cached content must not be weakly framed or marked immutable
-        //
         // do not override conditional headers when consumer has defined its own
         if (!mCachedResponseHead->NoStore() &&
             (mRequestHead.IsGet() || mRequestHead.IsHead()) &&
-            !mCustomConditionalRequest && !weaklyFramed && !isImmutable &&
+            !mCustomConditionalRequest &&
             (mCachedResponseHead->Status() < 400)) {
 
             if (mConcurentCacheAccess) {
                 // In case of concurrent read and also validation request we
                 // must wait for the current writer to close the output stream
                 // first.  Otherwise, when the writer's job would have been interrupted
                 // before all the data were downloaded, we'd have to do a range request
                 // which would be a second request in line during this channel's
@@ -4362,19 +4352,16 @@ nsHttpChannel::InitCacheEntry()
 
         mCacheEntryIsWriteOnly = true;
     }
 
     // Set the expiration time for this cache entry
     rv = UpdateExpirationTime();
     if (NS_FAILED(rv)) return rv;
 
-    // mark this weakly framed until a response body is seen
-    mCacheEntry->SetMetaDataElement("strongly-framed", "0");
-
     rv = AddCacheEntryHeaders(mCacheEntry);
     if (NS_FAILED(rv)) return rv;
 
     mInitedCacheEntry = true;
 
     // Don't perform the check when writing (doesn't make sense)
     mConcurentCacheAccess = 0;
 
@@ -4569,22 +4556,16 @@ StoreAuthorizationMetaData(nsICacheEntry
 //  - may need to rewrite response headers if any headers changed
 //  - may need to recalculate the expiration time if any headers changed
 //  - called only for freshly written cache entries
 nsresult
 nsHttpChannel::FinalizeCacheEntry()
 {
     LOG(("nsHttpChannel::FinalizeCacheEntry [this=%p]\n", this));
 
-    // Don't update this meta-data on 304
-    if (mStronglyFramed && !mCachedContentIsValid && mCacheEntry) {
-        LOG(("nsHttpChannel::FinalizeCacheEntry [this=%p] Is Strongly Framed\n", this));
-        mCacheEntry->SetMetaDataElement("strongly-framed", "1");
-    }
-
     if (mResponseHead && mResponseHeadersModified) {
         // Set the expiration time for this cache entry
         nsresult rv = UpdateExpirationTime();
         if (NS_FAILED(rv)) return rv;
     }
     return NS_OK;
 }
 
@@ -6082,19 +6063,16 @@ nsHttpChannel::OnStopRequest(nsIRequest 
     nsCOMPtr<nsICompressConvStats> conv = do_QueryInterface(mCompressListener);
     if (conv) {
         conv->GetDecodedDataLength(&mDecodedBodySize);
     }
 
     if (mTransaction) {
         // determine if we should call DoAuthRetry
         bool authRetry = mAuthRetryPending && NS_SUCCEEDED(status);
-        mStronglyFramed = mTransaction->ResponseIsComplete();
-        LOG(("nsHttpChannel %p has a strongly framed transaction: %d",
-             this, mStronglyFramed));
 
         //
         // grab references to connection in case we need to retry an
         // authentication request over it or use it for an upgrade
         // to another protocol.
         //
         // this code relies on the code in nsHttpTransaction::Close, which
         // tests for NS_HTTP_STICKY_CONNECTION to determine whether or not to
--- a/netwerk/protocol/http/nsHttpChannel.h
+++ b/netwerk/protocol/http/nsHttpChannel.h
@@ -534,21 +534,16 @@ private:
     // Whether fetching the content is meant to be handled by the
     // packaged app service, which behaves like a caching layer.
     // Upon successfully fetching the package, the resource will be placed in
     // the cache, and served by calling OnCacheEntryAvailable.
     uint32_t                          mIsPackagedAppResource : 1;
     // True if CORS preflight has been performed
     uint32_t                          mIsCorsPreflightDone : 1;
 
-    // if the http transaction was performed (i.e. not cached) and
-    // the result in OnStopRequest was known to be correctly delimited
-    // by chunking, content-length, or h2 end-stream framing
-    uint32_t                          mStronglyFramed : 1;
-
     nsCOMPtr<nsIChannel>              mPreflightChannel;
 
     nsTArray<nsContinueRedirectionFunc> mRedirectFuncStack;
 
     // Needed for accurate DNS timing
     RefPtr<nsDNSPrefetch>           mDNSPrefetch;
 
     Http2PushedStream                 *mPushedStream;
--- a/netwerk/protocol/http/nsHttpResponseHead.cpp
+++ b/netwerk/protocol/http/nsHttpResponseHead.cpp
@@ -638,17 +638,16 @@ nsHttpResponseHead::Reset()
     ClearHeaders();
 
     mVersion = NS_HTTP_VERSION_1_1;
     mStatus = 200;
     mContentLength = -1;
     mCacheControlPrivate = false;
     mCacheControlNoStore = false;
     mCacheControlNoCache = false;
-    mCacheControlImmutable = false;
     mPragmaNoCache = false;
     mStatusText.Truncate();
     mContentType.Truncate();
     mContentCharset.Truncate();
 }
 
 nsresult
 nsHttpResponseHead::ParseDateHeader(nsHttpAtom header, uint32_t *result) const
@@ -808,37 +807,31 @@ nsHttpResponseHead::ParseVersion(const c
 void
 nsHttpResponseHead::ParseCacheControl(const char *val)
 {
     if (!(val && *val)) {
         // clear flags
         mCacheControlPrivate = false;
         mCacheControlNoCache = false;
         mCacheControlNoStore = false;
-        mCacheControlImmutable = false;
         return;
     }
 
     // search header value for occurrence of "private"
     if (nsHttp::FindToken(val, "private", HTTP_HEADER_VALUE_SEPS))
         mCacheControlPrivate = true;
 
     // search header value for occurrence(s) of "no-cache" but ignore
     // occurrence(s) of "no-cache=blah"
     if (nsHttp::FindToken(val, "no-cache", HTTP_HEADER_VALUE_SEPS))
         mCacheControlNoCache = true;
 
     // search header value for occurrence of "no-store"
     if (nsHttp::FindToken(val, "no-store", HTTP_HEADER_VALUE_SEPS))
         mCacheControlNoStore = true;
-
-    // search header value for occurrence of "immutable"
-    if (nsHttp::FindToken(val, "immutable", HTTP_HEADER_VALUE_SEPS)) {
-        mCacheControlImmutable = true;
-    }
 }
 
 void
 nsHttpResponseHead::ParsePragma(const char *val)
 {
     LOG(("nsHttpResponseHead::ParsePragma [val=%s]\n", val));
 
     if (!(val && *val)) {
--- a/netwerk/protocol/http/nsHttpResponseHead.h
+++ b/netwerk/protocol/http/nsHttpResponseHead.h
@@ -27,33 +27,31 @@ class nsHttpResponseHead
 {
 public:
     nsHttpResponseHead() : mVersion(NS_HTTP_VERSION_1_1)
                          , mStatus(200)
                          , mContentLength(-1)
                          , mCacheControlPrivate(false)
                          , mCacheControlNoStore(false)
                          , mCacheControlNoCache(false)
-                         , mCacheControlImmutable(false)
                          , mPragmaNoCache(false) {}
 
     const nsHttpHeaderArray & Headers()   const { return mHeaders; }
     nsHttpHeaderArray    &Headers()             { return mHeaders; }
     nsHttpVersion         Version()       const { return mVersion; }
 // X11's Xlib.h #defines 'Status' to 'int' on some systems!
 #undef Status
     uint16_t              Status()        const { return mStatus; }
     const nsAFlatCString &StatusText()    const { return mStatusText; }
     int64_t               ContentLength() const { return mContentLength; }
     const nsAFlatCString &ContentType()   const { return mContentType; }
     const nsAFlatCString &ContentCharset() const { return mContentCharset; }
     bool                  Private() const { return mCacheControlPrivate; }
     bool                  NoStore() const { return mCacheControlNoStore; }
     bool                  NoCache() const { return (mCacheControlNoCache || mPragmaNoCache); }
-    bool                  Immutable() const { return mCacheControlImmutable; }
     /**
      * Full length of the entity. For byte-range requests, this may be larger
      * than ContentLength(), which will only represent the requested part of the
      * entity.
      */
     int64_t               TotalEntitySize() const;
 
     const char *PeekHeader(nsHttpAtom h) const      { return mHeaders.PeekHeader(h); }
@@ -130,17 +128,16 @@ public:
                mStatus == aOther.mStatus &&
                mStatusText == aOther.mStatusText &&
                mContentLength == aOther.mContentLength &&
                mContentType == aOther.mContentType &&
                mContentCharset == aOther.mContentCharset &&
                mCacheControlPrivate == aOther.mCacheControlPrivate &&
                mCacheControlNoCache == aOther.mCacheControlNoCache &&
                mCacheControlNoStore == aOther.mCacheControlNoStore &&
-               mCacheControlImmutable == aOther.mCacheControlImmutable &&
                mPragmaNoCache == aOther.mPragmaNoCache;
     }
 
 private:
     void     AssignDefaultStatusText();
     void     ParseVersion(const char *);
     void     ParseCacheControl(const char *);
     void     ParsePragma(const char *);
@@ -152,17 +149,16 @@ private:
     uint16_t          mStatus;
     nsCString         mStatusText;
     int64_t           mContentLength;
     nsCString         mContentType;
     nsCString         mContentCharset;
     bool              mCacheControlPrivate;
     bool              mCacheControlNoStore;
     bool              mCacheControlNoCache;
-    bool              mCacheControlImmutable;
     bool              mPragmaNoCache;
 
     friend struct IPC::ParamTraits<nsHttpResponseHead>;
 };
 
 } // namespace net
 } // namespace mozilla
 
--- a/netwerk/protocol/http/nsHttpTransaction.cpp
+++ b/netwerk/protocol/http/nsHttpTransaction.cpp
@@ -96,25 +96,25 @@ nsHttpTransaction::nsHttpTransaction()
     , mInitialRwin(0)
     , mChunkedDecoder(nullptr)
     , mStatus(NS_OK)
     , mPriority(0)
     , mRestartCount(0)
     , mCaps(0)
     , mClassification(CLASS_GENERAL)
     , mPipelinePosition(0)
+    , mCapsToClear(0)
     , mHttpVersion(NS_HTTP_VERSION_UNKNOWN)
     , mHttpResponseCode(0)
-    , mCapsToClear(0)
-    , mResponseIsComplete(false)
     , mClosed(false)
     , mConnected(false)
     , mHaveStatusLine(false)
     , mHaveAllHeaders(false)
     , mTransactionDone(false)
+    , mResponseIsComplete(false)
     , mDidContentStart(false)
     , mNoContent(false)
     , mSentData(false)
     , mReceivedData(false)
     , mStatusEventPending(false)
     , mHasRequestBody(false)
     , mProxyConnectFailed(false)
     , mHttpResponseMatched(false)
--- a/netwerk/protocol/http/nsHttpTransaction.h
+++ b/netwerk/protocol/http/nsHttpTransaction.h
@@ -100,19 +100,18 @@ public:
     // Called to take ownership of the response headers; the transaction
     // will drop any reference to the response headers after this call.
     nsHttpResponseHead *TakeResponseHead();
 
     // Provides a thread safe reference of the connection
     // nsHttpTransaction::Connection should only be used on the socket thread
     already_AddRefed<nsAHttpConnection> GetConnectionReference();
 
-    // Called to set/find out if the transaction generated a complete response.
+    // Called to find out if the transaction generated a complete response.
     bool ResponseIsComplete() { return mResponseIsComplete; }
-    void SetResponseIsComplete() { mResponseIsComplete = true; }
 
     bool      ProxyConnectFailed() { return mProxyConnectFailed; }
 
     void EnableKeepAlive() { mCaps |= NS_HTTP_ALLOW_KEEPALIVE; }
     void MakeSticky() { mCaps |= NS_HTTP_STICKY_CONNECTION; }
 
     // SetPriority() may only be used by the connection manager.
     void    SetPriority(int32_t priority) { mPriority = priority; }
@@ -267,36 +266,36 @@ private:
     int16_t                         mPriority;
 
     uint16_t                        mRestartCount;        // the number of times this transaction has been restarted
     uint32_t                        mCaps;
     enum Classifier                 mClassification;
     int32_t                         mPipelinePosition;
     int64_t                         mMaxPipelineObjectSize;
 
-    nsHttpVersion                   mHttpVersion;
-    uint16_t                        mHttpResponseCode;
-
     // mCapsToClear holds flags that should be cleared in mCaps, e.g. unset
     // NS_HTTP_REFRESH_DNS when DNS refresh request has completed to avoid
     // redundant requests on the network. The member itself is atomic, but
     // access to it from the networking thread may happen either before or
     // after the main thread modifies it. To deal with raciness, only unsetting
     // bitfields should be allowed: 'lost races' will thus err on the
     // conservative side, e.g. by going ahead with a 2nd DNS refresh.
     Atomic<uint32_t>                mCapsToClear;
-    Atomic<bool, ReleaseAcquire>    mResponseIsComplete;
+
+    nsHttpVersion                   mHttpVersion;
+    uint16_t                        mHttpResponseCode;
 
     // state flags, all logically boolean, but not packed together into a
     // bitfield so as to avoid bitfield-induced races.  See bug 560579.
     bool                            mClosed;
     bool                            mConnected;
     bool                            mHaveStatusLine;
     bool                            mHaveAllHeaders;
     bool                            mTransactionDone;
+    bool                            mResponseIsComplete;
     bool                            mDidContentStart;
     bool                            mNoContent; // expecting an empty entity body
     bool                            mSentData;
     bool                            mReceivedData;
     bool                            mStatusEventPending;
     bool                            mHasRequestBody;
     bool                            mProxyConnectFailed;
     bool                            mHttpResponseMatched;
deleted file mode 100644
--- a/netwerk/test/unit/test_immutable.js
+++ /dev/null
@@ -1,180 +0,0 @@
-Cu.import("resource://testing-common/httpd.js");
-Cu.import("resource://gre/modules/NetUtil.jsm");
-
-var prefs;
-var spdypref;
-var http2pref;
-var tlspref;
-var origin;
-
-function run_test() {
-  var env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
-  var h2Port = env.get("MOZHTTP2_PORT");
-  do_check_neq(h2Port, null);
-  do_check_neq(h2Port, "");
-
-  // Set to allow the cert presented by our H2 server
-  do_get_profile();
-  prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
-
-  spdypref = prefs.getBoolPref("network.http.spdy.enabled");
-  http2pref = prefs.getBoolPref("network.http.spdy.enabled.http2");
-  tlspref = prefs.getBoolPref("network.http.spdy.enforce-tls-profile");
-
-  prefs.setBoolPref("network.http.spdy.enabled", true);
-  prefs.setBoolPref("network.http.spdy.enabled.http2", true);
-  prefs.setBoolPref("network.http.spdy.enforce-tls-profile", false);
-  prefs.setCharPref("network.dns.localDomains", "foo.example.com, bar.example.com");
-
-  // The moz-http2 cert is for foo.example.com and is signed by CA.cert.der
-  // so add that cert to the trust list as a signing cert.  // the foo.example.com domain name.
-  let certdb = Cc["@mozilla.org/security/x509certdb;1"]
-                  .getService(Ci.nsIX509CertDB);
-  addCertFromFile(certdb, "CA.cert.der", "CTu,u,u");
-
-  origin = "https://foo.example.com:" + h2Port;
-  dump ("origin - " + origin + "\n");
-  doTest1();
-}
-
-function resetPrefs() {
-  prefs.setBoolPref("network.http.spdy.enabled", spdypref);
-  prefs.setBoolPref("network.http.spdy.enabled.http2", http2pref);
-  prefs.setBoolPref("network.http.spdy.enforce-tls-profile", tlspref);
-  prefs.clearUserPref("network.dns.localDomains");
-}
-
-function readFile(file) {
-  let fstream = Cc["@mozilla.org/network/file-input-stream;1"]
-                  .createInstance(Ci.nsIFileInputStream);
-  fstream.init(file, -1, 0, 0);
-  let data = NetUtil.readInputStreamToString(fstream, fstream.available());
-  fstream.close();
-  return data;
-}
-
-function addCertFromFile(certdb, filename, trustString) {
-  let certFile = do_get_file(filename, false);
-  let der = readFile(certFile);
-  certdb.addCert(der, trustString, null);
-}
-
-function makeChan(origin, path) {
-  return NetUtil.newChannel({
-    uri: origin + path,
-    loadUsingSystemPrincipal: true
-  }).QueryInterface(Ci.nsIHttpChannel);
-}
-
-var nextTest;
-var expectPass = true;
-var expectConditional = false;
-
-var Listener = function() {};
-Listener.prototype = {
-  onStartRequest: function testOnStartRequest(request, ctx) {
-    do_check_true(request instanceof Components.interfaces.nsIHttpChannel);
-
-    if (expectPass) {
-      if (!Components.isSuccessCode(request.status)) {
-        do_throw("Channel should have a success code! (" + request.status + ")");
-      }
-      do_check_eq(request.responseStatus, 200);
-    } else {
-      do_check_eq(Components.isSuccessCode(request.status), false);
-    }
-  },
-
-  onDataAvailable: function testOnDataAvailable(request, ctx, stream, off, cnt) {
-    read_stream(stream, cnt);
-  },
-
-  onStopRequest: function testOnStopRequest(request, ctx, status) {
-      if (expectConditional) {
-        do_check_eq(request.getResponseHeader("x-conditional"), "true");
-      } else {
-	  try { do_check_neq(request.getResponseHeader("x-conditional"), "true"); }
-	  catch (e) { do_check_true(true); }
-    }
-    nextTest();
-    do_test_finished();
-  }
-};
-
-function testsDone()
-{
-  dump("testDone\n");
-  resetPrefs();
-}
-
-function doTest1()
-{
-  dump("execute doTest1 - resource without immutable. initial request\n");
-  do_test_pending();
-  expectConditional = false;
-  var chan = makeChan(origin, "/immutable-test-without-attribute");
-  var listener = new Listener();
-  nextTest = doTest2;
-  chan.asyncOpen2(listener);
-}
-
-function doTest2()
-{
-  dump("execute doTest2 - resource without immutable. reload\n");
-  do_test_pending();
-  expectConditional = true;
-  var chan = makeChan(origin, "/immutable-test-without-attribute");
-  var listener = new Listener();
-  nextTest = doTest3;
-  chan.loadFlags = Ci.nsIRequest.VALIDATE_ALWAYS;
-  chan.asyncOpen2(listener);
-}
-
-function doTest3()
-{
-  dump("execute doTest3 - resource without immutable. shift reload\n");
-  do_test_pending();
-  expectConditional = false;
-  var chan = makeChan(origin, "/immutable-test-without-attribute");
-  var listener = new Listener();
-  nextTest = doTest4;
-  chan.loadFlags = Ci.nsIRequest.LOAD_BYPASS_CACHE;
-  chan.asyncOpen2(listener);
-}
-
-function doTest4()
-{
-  dump("execute doTest1 - resource with immutable. initial request\n");
-  do_test_pending();
-  expectConditional = false;
-  var chan = makeChan(origin, "/immutable-test-with-attribute");
-  var listener = new Listener();
-  nextTest = doTest5;
-  chan.asyncOpen2(listener);
-}
-
-function doTest5()
-{
-  dump("execute doTest5 - resource with immutable. reload\n");
-  do_test_pending();
-  expectConditional = false;
-  var chan = makeChan(origin, "/immutable-test-with-attribute");
-  var listener = new Listener();
-  nextTest = doTest6;
-  chan.loadFlags = Ci.nsIRequest.VALIDATE_ALWAYS;
-  chan.asyncOpen2(listener);
-}
-
-function doTest6()
-{
-  dump("execute doTest3 - resource with immutable. shift reload\n");
-  do_test_pending();
-  expectConditional = false;
-  var chan = makeChan(origin, "/immutable-test-with-attribute");
-  var listener = new Listener();
-  nextTest = testsDone;
-  chan.loadFlags = Ci.nsIRequest.LOAD_BYPASS_CACHE;
-  chan.asyncOpen2(listener);
-}
-
-
--- a/netwerk/test/unit/xpcshell.ini
+++ b/netwerk/test/unit/xpcshell.ini
@@ -219,17 +219,16 @@ skip-if = bits != 32
 [test_httpResponseTimeout.js]
 [test_httpsuspend.js]
 [test_idnservice.js]
 [test_idn_blacklist.js]
 [test_idn_urls.js]
 [test_idna2008.js]
 # IDNA2008 depends on ICU, not available on android
 skip-if = os == "android"
-[test_immutable.js]
 [test_invalidport.js]
 [test_localstreams.js]
 [test_mismatch_last-modified.js]
 [test_MIME_params.js]
 [test_mozTXTToHTMLConv.js]
 [test_multipart_byteranges.js]
 [test_multipart_streamconv.js]
 [test_multipart_streamconv_missing_lead_boundary.js]
--- a/testing/xpcshell/moz-http2/moz-http2.js
+++ b/testing/xpcshell/moz-http2/moz-http2.js
@@ -710,34 +710,16 @@ function handleRequest(req, res) {
 
   else if (u.pathname === "/emptydata") {
     // Overwrite the original transform with our version that will insert an
     // empty DATA frame at the beginning of the stream response, then fall
     // through to the default response behavior.
     Serializer.prototype._transform = newTransform;
   }
 
-  // for use with test_immutable.js
-  else if (u.pathname === "/immutable-test-without-attribute") {
-     res.setHeader('Cache-Control', 'max-age=100000');
-     res.setHeader('Etag', '1');
-     if (req.headers["if-none-match"]) {
-       res.setHeader("x-conditional", "true");
-     }
-    // default response from here
-  }
-  else if (u.pathname === "/immutable-test-with-attribute") {
-    res.setHeader('Cache-Control', 'max-age=100000, immutable');
-    res.setHeader('Etag', '2');
-     if (req.headers["if-none-match"]) {
-       res.setHeader("x-conditional", "true");
-     }
-   // default response from here
-  }
-
   res.setHeader('Content-Type', 'text/html');
   if (req.httpVersionMajor != 2) {
     res.setHeader('Connection', 'close');
   }
   res.writeHead(200);
   res.end(content);
 }