Bug 1405506: Flush buffered data when disconnecting suspended channel. r?mixedpuppy draft
authorKris Maglione <maglione.k@gmail.com>
Tue, 31 Oct 2017 18:19:40 -0700
changeset 689852 ab39396b70e0e791d2f7091b079fcb41c9a4fac4
parent 689851 6e65333b288fb320400080841f38c77b70b4ed0d
child 738400 7c665fb9f5530d56e32b504c3f80bf07d180d2d8
push id87117
push usermaglione.k@gmail.com
push dateWed, 01 Nov 2017 01:20:44 +0000
reviewersmixedpuppy
bugs1405506
milestone58.0a1
Bug 1405506: Flush buffered data when disconnecting suspended channel. r?mixedpuppy MozReview-Commit-ID: F9rIhQHr8i
toolkit/components/extensions/webrequest/StreamFilterChild.cpp
toolkit/components/extensions/webrequest/StreamFilterChild.h
--- a/toolkit/components/extensions/webrequest/StreamFilterChild.cpp
+++ b/toolkit/components/extensions/webrequest/StreamFilterChild.cpp
@@ -129,16 +129,17 @@ StreamFilterChild::Disconnect(ErrorResul
 {
   switch (mState) {
   case State::Suspended:
   case State::TransferringData:
   case State::FinishedTransferringData:
     mState = State::Disconnecting;
     mNextState = State::Disconnected;
 
+    WriteBufferedData();
     SendDisconnect();
     break;
 
   case State::Suspending:
   case State::Resuming:
     switch (mNextState) {
     case State::Suspended:
     case State::Resuming:
@@ -472,16 +473,26 @@ StreamFilterChild::FlushBufferedData()
 {
   while (!mBufferedData.isEmpty() && CanFlushData()) {
     UniquePtr<BufferedData> data(mBufferedData.popFirst());
 
     EmitData(data->mData);
   }
 }
 
+void
+StreamFilterChild::WriteBufferedData()
+{
+  while (!mBufferedData.isEmpty()) {
+    UniquePtr<BufferedData> data(mBufferedData.popFirst());
+
+    SendWrite(data->mData);
+  }
+}
+
 IPCResult
 StreamFilterChild::RecvData(Data&& aData)
 {
   MOZ_ASSERT(!mReceivedOnStop);
 
   if (mStreamFilter) {
     Unused << mStreamFilter->CheckAlive();
   }
--- a/toolkit/components/extensions/webrequest/StreamFilterChild.h
+++ b/toolkit/components/extensions/webrequest/StreamFilterChild.h
@@ -125,16 +125,17 @@ private:
   bool
   CanFlushData()
   {
     return (mState == State::TransferringData ||
             mState == State::Resuming);
   }
 
   void FlushBufferedData();
+  void WriteBufferedData();
 
   virtual void ActorDestroy(ActorDestroyReason aWhy) override;
 
 
   State mState;
   State mNextState;
   bool mReceivedOnStop;