Bug 1402205 - Non-existent background page blocks extension startup. r?kmag draft
authorHaik Aftandilian <haftandilian@mozilla.com>
Mon, 25 Sep 2017 15:48:40 -0700
changeset 670172 21055d599acad0cf78154ed758c448304d22e3dd
parent 670161 36f0294c68bf55584d12952ede8d26a1e540d682
child 733159 e25e66665d73dd10a72bb1c74a06a67b6d28cb10
push id81545
push userhaftandilian@mozilla.com
push dateTue, 26 Sep 2017 00:15:49 +0000
reviewerskmag
bugs1402205
milestone58.0a1
Bug 1402205 - Non-existent background page blocks extension startup. r?kmag Add calls to OnStartRequest() and OnStopRequest() to properly handle async read failures for remote JAR's and remote unpacked extension resources. MozReview-Commit-ID: Dcg0LDht9B9
netwerk/protocol/res/ExtensionProtocolHandler.cpp
--- a/netwerk/protocol/res/ExtensionProtocolHandler.cpp
+++ b/netwerk/protocol/res/ExtensionProtocolHandler.cpp
@@ -248,49 +248,60 @@ ExtensionStreamGetter::GetAsync(nsIStrea
     },
     [self] (const mozilla::ipc::PromiseRejectReason) {
       self->OnStream(nullptr);
     }
   );
   return Ok();
 }
 
+static void
+CancelRequest(nsIStreamListener* aListener,
+              nsIChannel* aChannel,
+              nsresult aResult)
+{
+  MOZ_ASSERT(aListener);
+  MOZ_ASSERT(aChannel);
+
+  aListener->OnStartRequest(aChannel, nullptr);
+  aListener->OnStopRequest(aChannel, nullptr, aResult);
+  aChannel->Cancel(NS_BINDING_ABORTED);
+}
+
 // Handle an input stream sent from the parent.
 void
 ExtensionStreamGetter::OnStream(nsIInputStream* aStream)
 {
   MOZ_ASSERT(IsNeckoChild());
   MOZ_ASSERT(mListener);
   MOZ_ASSERT(mMainThreadEventTarget);
 
   // We must keep an owning reference to the listener
   // until we pass it on to AsyncRead.
   nsCOMPtr<nsIStreamListener> listener = mListener.forget();
 
   MOZ_ASSERT(mChannel);
 
   if (!aStream) {
     // The parent didn't send us back a stream.
-    listener->OnStartRequest(mChannel, nullptr);
-    listener->OnStopRequest(mChannel, nullptr, NS_ERROR_FILE_ACCESS_DENIED);
-    mChannel->Cancel(NS_BINDING_ABORTED);
+    CancelRequest(listener, mChannel, NS_ERROR_FILE_ACCESS_DENIED);
     return;
   }
 
   nsCOMPtr<nsIInputStreamPump> pump;
   nsresult rv = NS_NewInputStreamPump(getter_AddRefs(pump), aStream, -1, -1, 0,
                                       0, false, mMainThreadEventTarget);
   if (NS_FAILED(rv)) {
-    mChannel->Cancel(NS_BINDING_ABORTED);
+    CancelRequest(listener, mChannel, rv);
     return;
   }
 
   rv = pump->AsyncRead(listener, nullptr);
   if (NS_FAILED(rv)) {
-    mChannel->Cancel(NS_BINDING_ABORTED);
+    CancelRequest(listener, mChannel, rv);
   }
 }
 
 // Handle an FD sent from the parent.
 void
 ExtensionStreamGetter::OnFD(const FileDescriptor& aFD)
 {
   MOZ_ASSERT(IsNeckoChild());
@@ -305,17 +316,17 @@ ExtensionStreamGetter::OnFD(const FileDe
   // We must keep an owning reference to the listener
   // until we pass it on to AsyncOpen2.
   nsCOMPtr<nsIStreamListener> listener = mListener.forget();
 
   RefPtr<FileDescriptorFile> fdFile = new FileDescriptorFile(aFD, mJarFile);
   mJarChannel->SetJarFile(fdFile);
   nsresult rv = mJarChannel->AsyncOpen2(listener);
   if (NS_FAILED(rv)) {
-    mChannel->Cancel(NS_BINDING_ABORTED);
+    CancelRequest(listener, mChannel, rv);
   }
 }
 
 NS_IMPL_QUERY_INTERFACE(ExtensionProtocolHandler, nsISubstitutingProtocolHandler,
                         nsIProtocolHandler, nsIProtocolHandlerWithDynamicFlags,
                         nsISupportsWeakReference)
 NS_IMPL_ADDREF_INHERITED(ExtensionProtocolHandler, SubstitutingProtocolHandler)
 NS_IMPL_RELEASE_INHERITED(ExtensionProtocolHandler, SubstitutingProtocolHandler)