Merge inbound to mozilla-central. a=merge
authorBrindusan Cristian <cbrindusan@mozilla.com>
Wed, 31 Oct 2018 23:41:40 +0200
changeset 443834 7e4afca2ca929a07128419874845a94c2ff9aa3d
parent 443833 814414676c2507f5adb6bd483a4f510a35977ad2 (current diff)
parent 443762 e28fa79bc2f94ca3b72456b47353f2e2dda8da1a (diff)
child 443835 1a14d5c09a1f7823980b77c1678d3b466aa8602a
child 443839 dea36816d6462b99b991c2dcd12be14267ffdb8f
child 443863 9fff496623bb17af8c50db85a227423a9042a5bc
push id109455
push usercbrindusan@mozilla.com
push dateWed, 31 Oct 2018 21:46:31 +0000
treeherdermozilla-inbound@1a14d5c09a1f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone65.0a1
first release with
nightly linux32
7e4afca2ca92 / 65.0a1 / 20181031223503 / files
nightly linux64
7e4afca2ca92 / 65.0a1 / 20181031223503 / files
nightly mac
7e4afca2ca92 / 65.0a1 / 20181031223503 / files
nightly win32
7e4afca2ca92 / 65.0a1 / 20181031223503 / files
nightly win64
7e4afca2ca92 / 65.0a1 / 20181031223503 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to mozilla-central. a=merge
modules/libpref/init/all.js
testing/web-platform/meta/fetch/api/response/response-stream-disturbed-6.html.ini
toolkit/mozapps/extensions/test/browser/addons/browser_bug596336_1.xpi
toolkit/mozapps/extensions/test/browser/addons/browser_bug596336_2.xpi
toolkit/mozapps/extensions/test/browser/addons/browser_dragdrop1.xpi
toolkit/mozapps/extensions/test/browser/addons/browser_dragdrop2.xpi
toolkit/mozapps/extensions/test/browser/addons/browser_dragdrop_incompat.xpi
toolkit/mozapps/extensions/test/browser/addons/browser_inlinesettings1.xpi
toolkit/mozapps/extensions/test/browser/addons/browser_inlinesettings1_custom.xpi
toolkit/mozapps/extensions/test/browser/addons/browser_inlinesettings1_info.xpi
toolkit/mozapps/extensions/test/browser/addons/browser_installssl.xpi
toolkit/mozapps/extensions/test/browser/addons/browser_theme.xpi
toolkit/mozapps/extensions/test/browser/addons/browser_update1_1.xpi
toolkit/mozapps/extensions/test/browser/addons/browser_update1_2.xpi
toolkit/mozapps/extensions/test/browser/addons/browser_webapi_install.xpi
toolkit/mozapps/extensions/test/browser/addons/browser_webapi_install/bootstrap.js
toolkit/mozapps/extensions/test/browser/addons/browser_webapi_install/install.rdf
toolkit/mozapps/extensions/test/browser/addons/options_signed.xpi
toolkit/mozapps/extensions/test/browser/browser.ini
--- a/browser/components/enterprisepolicies/tests/browser/browser_policy_search_engine.js
+++ b/browser/components/enterprisepolicies/tests/browser/browser_policy_search_engine.js
@@ -154,16 +154,20 @@ add_task(async function test_prevent_ins
 });
 
 add_task(async function test_opensearch_disabled() {
   // Check that search engines cannot be added via opensearch
   await test_opensearch(false);
 });
 
 add_task(async function test_AddSearchProvider() {
+  if (!Services.prefs.getBoolPref("dom.sidebar.enabled", false)) {
+    return;
+  }
+
   // Mock the modal error dialog
   let mockPrompter = {
     promptCount: 0,
     alert() {
       this.promptCount++;
     },
     QueryInterface: ChromeUtils.generateQI([Ci.nsIPrompt]),
   };
--- a/browser/components/search/test/browser.ini
+++ b/browser/components/search/test/browser.ini
@@ -1,9 +1,10 @@
 [DEFAULT]
+prefs = dom.sidebar.enabled=true
 support-files =
   426329.xml
   483086-1.xml
   483086-2.xml
   head.js
   opensearch.html
   test.html
   testEngine.xml
--- a/dom/base/nsINode.cpp
+++ b/dom/base/nsINode.cpp
@@ -2711,35 +2711,16 @@ nsINode::AddSizeOfExcludingThis(nsWindow
 
 void
 nsINode::AddSizeOfIncludingThis(nsWindowSizes& aSizes, size_t* aNodeSize) const
 {
   *aNodeSize += aSizes.mState.mMallocSizeOf(this);
   AddSizeOfExcludingThis(aSizes, aNodeSize);
 }
 
-#define EVENT(name_, id_, type_, struct_)                                    \
-  EventHandlerNonNull* nsINode::GetOn##name_() {                             \
-    EventListenerManager *elm = GetExistingListenerManager();                \
-    return elm ? elm->GetEventHandler(nsGkAtoms::on##name_) : nullptr;       \
-  }                                                                          \
-  void nsINode::SetOn##name_(EventHandlerNonNull* handler)                   \
-  {                                                                          \
-    EventListenerManager *elm = GetOrCreateListenerManager();                \
-    if (elm) {                                                               \
-      elm->SetEventHandler(nsGkAtoms::on##name_, handler);                   \
-    }                                                                        \
-  }
-#define TOUCH_EVENT EVENT
-#define DOCUMENT_ONLY_EVENT EVENT
-#include "mozilla/EventNameList.h"
-#undef DOCUMENT_ONLY_EVENT
-#undef TOUCH_EVENT
-#undef EVENT
-
 bool
 nsINode::Contains(const nsINode* aOther) const
 {
   if (aOther == this) {
     return true;
   }
   if (!aOther ||
       OwnerDoc() != aOther->OwnerDoc() ||
--- a/dom/base/nsINode.h
+++ b/dom/base/nsINode.h
@@ -1993,27 +1993,30 @@ protected:
    *
    * Note that the selector list returned here is owned by the owner doc's
    * selector cache.
    */
   const RawServoSelectorList* ParseSelectorList(const nsAString& aSelectorString,
                                                 mozilla::ErrorResult&);
 
 public:
-  /* Event stuff that documents and elements share.  This needs to be
-     NS_IMETHOD because some subclasses implement DOM methods with
-     this exact name and signature and then the calling convention
-     needs to match.
+  /* Event stuff that documents and elements share.
 
      Note that we include DOCUMENT_ONLY_EVENT events here so that we
      can forward all the document stuff to this implementation.
   */
-#define EVENT(name_, id_, type_, struct_)                             \
-  mozilla::dom::EventHandlerNonNull* GetOn##name_();                  \
-  void SetOn##name_(mozilla::dom::EventHandlerNonNull* listener);
+#define EVENT(name_, id_, type_, struct_)                               \
+  mozilla::dom::EventHandlerNonNull* GetOn##name_()                     \
+  {                                                                     \
+    return GetEventHandler(nsGkAtoms::on##name_);                       \
+  }                                                                     \
+  void SetOn##name_(mozilla::dom::EventHandlerNonNull* handler)         \
+  {                                                                     \
+    SetEventHandler(nsGkAtoms::on##name_, handler);                     \
+  }
 #define TOUCH_EVENT EVENT
 #define DOCUMENT_ONLY_EVENT EVENT
 #include "mozilla/EventNameList.h"
 #undef DOCUMENT_ONLY_EVENT
 #undef TOUCH_EVENT
 #undef EVENT
 
 protected:
--- a/dom/cache/Cache.cpp
+++ b/dom/cache/Cache.cpp
@@ -200,16 +200,17 @@ public:
     MOZ_DIAGNOSTIC_ASSERT(mRequestList.Length() == responseList.Length());
 
     // Now store the unwrapped Response list in the Cache.
     ErrorResult result;
     // TODO: Here we use the JSContext as received by the ResolvedCallback, and
     // its state could be the wrong one. The spec doesn't say anything
     // about it, yet (bug 1384006)
     RefPtr<Promise> put = mCache->PutAll(aCx, mRequestList, responseList, result);
+    result.WouldReportJSException();
     if (NS_WARN_IF(result.Failed())) {
       // TODO: abort the fetch requests we have running (bug 1157434)
       mPromise->MaybeReject(result);
       return;
     }
 
     // Chain the Cache::Put() promise to the original promise returned to
     // the content script.
--- a/dom/fetch/Fetch.cpp
+++ b/dom/fetch/Fetch.cpp
@@ -53,16 +53,18 @@
 namespace mozilla {
 namespace dom {
 
 namespace {
 
 void
 AbortStream(JSContext* aCx, JS::Handle<JSObject*> aStream, ErrorResult& aRv)
 {
+  aRv.MightThrowJSException();
+
   bool isReadable;
   if (!JS::ReadableStreamIsReadable(aCx, aStream, &isReadable)) {
     aRv.StealExceptionFromJSContext(aCx);
     return;
   }
   if (!isReadable) {
     return;
   }
@@ -1114,37 +1116,35 @@ FetchBody<Response>::~FetchBody();
 template <class Derived>
 bool
 FetchBody<Derived>::GetBodyUsed(ErrorResult& aRv) const
 {
   if (mBodyUsed) {
     return true;
   }
 
-  // If this stream is disturbed or locked, return true.
+  // If this stream is disturbed, return true.
   if (mReadableStreamBody) {
+    aRv.MightThrowJSException();
+
     AutoJSAPI jsapi;
     if (!jsapi.Init(mOwner)) {
       aRv.Throw(NS_ERROR_FAILURE);
       return true;
     }
 
     JSContext* cx = jsapi.cx();
     JS::Rooted<JSObject*> body(cx, mReadableStreamBody);
     bool disturbed;
-    bool locked;
-    bool readable;
-    if (!JS::ReadableStreamIsDisturbed(cx, body, &disturbed) ||
-        !JS::ReadableStreamIsLocked(cx, body, &locked) ||
-        !JS::ReadableStreamIsReadable(cx, body, &readable)) {
+    if (!JS::ReadableStreamIsDisturbed(cx, body, &disturbed)) {
       aRv.StealExceptionFromJSContext(cx);
       return false;
     }
 
-    return disturbed || locked || !readable;
+    return disturbed;
   }
 
   return false;
 }
 
 template
 bool
 FetchBody<Request>::GetBodyUsed(ErrorResult&) const;
@@ -1177,16 +1177,18 @@ FetchBody<Derived>::SetBodyUsed(JSContex
     return;
   }
 
   mBodyUsed = true;
 
   // If we already have a ReadableStreamBody and it has been created by DOM, we
   // have to lock it now because it can have been shared with other objects.
   if (mReadableStreamBody) {
+    aRv.MightThrowJSException();
+
     JS::Rooted<JSObject*> readableStreamObj(aCx, mReadableStreamBody);
 
     JS::ReadableStreamMode mode;
     if (!JS::ReadableStreamGetMode(aCx, readableStreamObj, &mode)) {
       aRv.StealExceptionFromJSContext(aCx);
       return;
     }
 
@@ -1218,16 +1220,18 @@ template
 void
 FetchBody<Response>::SetBodyUsed(JSContext* aCx, ErrorResult& aRv);
 
 template <class Derived>
 already_AddRefed<Promise>
 FetchBody<Derived>::ConsumeBody(JSContext* aCx, FetchConsumeType aType,
                                 ErrorResult& aRv)
 {
+  aRv.MightThrowJSException();
+
   RefPtr<AbortSignalImpl> signalImpl = DerivedClass()->GetSignalImpl();
   if (signalImpl && signalImpl->Aborted()) {
     aRv.Throw(NS_ERROR_DOM_ABORT_ERR);
     return nullptr;
   }
 
   bool bodyUsed = GetBodyUsed(aRv);
   if (NS_WARN_IF(aRv.Failed())) {
@@ -1426,16 +1430,18 @@ FetchBody<Response>::GetBody(JSContext* 
                              ErrorResult& aRv);
 
 template <class Derived>
 void
 FetchBody<Derived>::LockStream(JSContext* aCx,
                                JS::HandleObject aStream,
                                ErrorResult& aRv)
 {
+  aRv.MightThrowJSException();
+
 #if DEBUG
   JS::ReadableStreamMode streamMode;
   if (!JS::ReadableStreamGetMode(aCx, aStream, &streamMode)) {
     aRv.StealExceptionFromJSContext(aCx);
     return;
   }
   MOZ_ASSERT(streamMode == JS::ReadableStreamMode::ExternalSource);
 #endif // DEBUG
@@ -1479,16 +1485,18 @@ FetchBody<Derived>::MaybeTeeReadableStre
   aBodyOut.set(nullptr);
   *aStreamReader = nullptr;
   *aInputStream = nullptr;
 
   if (!mReadableStreamBody) {
     return;
   }
 
+  aRv.MightThrowJSException();
+
   JS::Rooted<JSObject*> stream(aCx, mReadableStreamBody);
 
   // If this is a ReadableStream with an external source, this has been
   // generated by a Fetch. In this case, Fetch will be able to recreate it
   // again when GetBody() is called.
   JS::ReadableStreamMode streamMode;
   if (!JS::ReadableStreamGetMode(aCx, stream, &streamMode)) {
     aRv.StealExceptionFromJSContext(aCx);
--- a/dom/fetch/FetchStreamReader.cpp
+++ b/dom/fetch/FetchStreamReader.cpp
@@ -114,19 +114,17 @@ FetchStreamReader::CloseAndRelease(JSCon
 
   if (mStreamClosed) {
     // Already closed.
     return;
   }
 
   RefPtr<FetchStreamReader> kungFuDeathGrip = this;
 
-  if (aCx) {
-    MOZ_ASSERT(mReader);
-
+  if (aCx && mReader) {
     RefPtr<DOMException> error = DOMException::Create(aStatus);
 
     JS::Rooted<JS::Value> errorValue(aCx);
     if (ToJSValue(aCx, error, &errorValue)) {
       JS::Rooted<JSObject*> reader(aCx, mReader);
       // It's currently safe to cancel an already closed reader because, per the
       // comments in ReadableStream::cancel() conveying the spec, step 2 of
       // 3.4.3 that specified ReadableStreamCancel is: If stream.[[state]] is
@@ -152,16 +150,18 @@ void
 FetchStreamReader::StartConsuming(JSContext* aCx,
                                   JS::HandleObject aStream,
                                   JS::MutableHandle<JSObject*> aReader,
                                   ErrorResult& aRv)
 {
   MOZ_DIAGNOSTIC_ASSERT(!mReader);
   MOZ_DIAGNOSTIC_ASSERT(aStream);
 
+  aRv.MightThrowJSException();
+
   JS::Rooted<JSObject*> reader(aCx,
                                JS::ReadableStreamGetReader(aCx, aStream,
                                                            JS::ReadableStreamReaderMode::Default));
   if (!reader) {
     aRv.StealExceptionFromJSContext(aCx);
     CloseAndRelease(aCx, NS_ERROR_DOM_INVALID_STATE_ERR);
     return;
   }
--- a/dom/fetch/Response.cpp
+++ b/dom/fetch/Response.cpp
@@ -234,31 +234,31 @@ Response::Constructor(const GlobalObject
     }
 
     nsCString contentTypeWithCharset;
     nsCOMPtr<nsIInputStream> bodyStream;
     int64_t bodySize = InternalResponse::UNKNOWN_BODY_SIZE;
 
     const fetch::ResponseBodyInit& body = aBody.Value().Value();
     if (body.IsReadableStream()) {
+      aRv.MightThrowJSException();
+
       JSContext* cx = aGlobal.Context();
       const ReadableStream& readableStream = body.GetAsReadableStream();
 
       JS::Rooted<JSObject*> readableStreamObj(cx, readableStream.Obj());
 
       bool disturbed;
       bool locked;
-      bool readable;
       if (!JS::ReadableStreamIsDisturbed(cx, readableStreamObj, &disturbed) ||
-          !JS::ReadableStreamIsLocked(cx, readableStreamObj, &locked) ||
-          !JS::ReadableStreamIsReadable(cx, readableStreamObj, &readable)) {
+          !JS::ReadableStreamIsLocked(cx, readableStreamObj, &locked)) {
         aRv.StealExceptionFromJSContext(cx);
         return nullptr;
       }
-      if (disturbed || locked || !readable) {
+      if (disturbed || locked) {
         aRv.ThrowTypeError<MSG_FETCH_BODY_CONSUMED_ERROR>();
         return nullptr;
       }
 
       r->SetReadableStreamBody(cx, readableStreamObj);
 
       JS::ReadableStreamMode streamMode;
       if (!JS::ReadableStreamGetMode(cx, readableStreamObj, &streamMode)) {
@@ -336,16 +336,39 @@ Response::Constructor(const GlobalObject
 
 already_AddRefed<Response>
 Response::Clone(JSContext* aCx, ErrorResult& aRv)
 {
   bool bodyUsed = GetBodyUsed(aRv);
   if (NS_WARN_IF(aRv.Failed())) {
     return nullptr;
   }
+
+  if (!bodyUsed && mReadableStreamBody) {
+    aRv.MightThrowJSException();
+
+    AutoJSAPI jsapi;
+    if (!jsapi.Init(mOwner)) {
+      aRv.Throw(NS_ERROR_FAILURE);
+      return nullptr;
+    }
+
+    JSContext* cx = jsapi.cx();
+    JS::Rooted<JSObject*> body(cx, mReadableStreamBody);
+    bool locked;
+    // We just need to check the 'locked' state because GetBodyUsed() already
+    // checked the 'disturbed' state.
+    if (!JS::ReadableStreamIsLocked(cx, body, &locked)) {
+      aRv.StealExceptionFromJSContext(cx);
+      return nullptr;
+    }
+
+    bodyUsed = locked;
+  }
+
   if (bodyUsed) {
     aRv.ThrowTypeError<MSG_FETCH_BODY_CONSUMED_ERROR>();
     return nullptr;
   }
 
   RefPtr<FetchStreamReader> streamReader;
   nsCOMPtr<nsIInputStream> inputStream;
 
--- a/dom/media/tests/mochitest/mochitest.ini
+++ b/dom/media/tests/mochitest/mochitest.ini
@@ -241,17 +241,17 @@ skip-if = toolkit == 'android'
 skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
 [test_peerConnection_simulcastOffer.html]
 skip-if = android_version # no simulcast support on android
 [test_peerConnection_simulcastAnswer.html]
 skip-if = android_version # no simulcast support on android
 [test_peerConnection_simulcastOddResolution.html]
 skip-if = android_version # no simulcast support on android
 [test_peerConnection_relayOnly.html]
-disabled=
+skip-if = toolkit == 'android' # android(Bug 1189784, timeouts on 4.3 emulator)
 [test_peerConnection_callbacks.html]
 skip-if = toolkit == 'android' # android(Bug 1189784, timeouts on 4.3 emulator)
 [test_peerConnection_replaceTrack.html]
 skip-if = toolkit == 'android'  # Bug 1189784
 [test_peerConnection_syncSetDescription.html]
 skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
 [test_peerConnection_setLocalAnswerInHaveLocalOffer.html]
 [test_peerConnection_setLocalAnswerInStable.html]
--- a/dom/media/tests/mochitest/pc.js
+++ b/dom/media/tests/mochitest/pc.js
@@ -794,17 +794,17 @@ function PeerConnectionWrapper(label, co
     var iceState = this._pc.iceConnectionState;
     info(this + ": oniceconnectionstatechange fired, new state is: " + iceState);
     Object.keys(this.ice_connection_callbacks).forEach(name => {
       this.ice_connection_callbacks[name]();
     });
     if (iceState === "connected") {
       this.iceConnectedResolve();
     } else if (iceState === "failed") {
-      this.iceConnectedReject();
+      this.iceConnectedReject(new Error("ICE failed"));
     }
   };
 
   this._pc.onicegatheringstatechange = e => {
     isnot(typeof this._pc.iceGatheringState, "undefined",
           "iceGetheringState should not be undefined");
     var gatheringState = this._pc.iceGatheringState;
     info(this + ": onicegatheringstatechange fired, new state is: " + gatheringState);
--- a/dom/media/tests/mochitest/test_peerConnection_relayOnly.html
+++ b/dom/media/tests/mochitest/test_peerConnection_relayOnly.html
@@ -17,18 +17,18 @@ function PC_LOCAL_NO_CANDIDATES(test) {
 }
 
 function PC_BOTH_WAIT_FOR_ICE_FAILED(test) {
   var isFail = (f, reason, msg) =>
     f().then(() => { throw new Error(msg + " must fail"); },
              e => is(e.message, reason, msg + " must fail with: " + e.message));
 
   return Promise.all([
-    isFail(() => waitForIceConnected(test, test.pcLocal), "ICE failed", "Local ICE"),
-    isFail(() => waitForIceConnected(test, test.pcRemote), "ICE failed", "Remote ICE")
+    isFail(() => test.pcLocal.waitForIceConnected(), "ICE failed", "Local ICE"),
+    isFail(() => test.pcRemote.waitForIceConnected(), "ICE failed", "Remote ICE")
   ])
   .then(() => ok(true, "ICE on both sides must fail."));
 }
 
 var test;
 
 runNetworkTest(options =>
     pushPrefs(['media.peerconnection.ice.stun_client_maximum_transmits', 3],
--- a/dom/security/nsCSPService.cpp
+++ b/dom/security/nsCSPService.cpp
@@ -27,17 +27,16 @@ using namespace mozilla;
 static LazyLogModule gCspPRLog("CSP");
 
 CSPService::CSPService()
 {
 }
 
 CSPService::~CSPService()
 {
-  mAppStatusCache.Clear();
 }
 
 NS_IMPL_ISUPPORTS(CSPService, nsIContentPolicy, nsIChannelEventSink)
 
 // Helper function to identify protocols and content types not subject to CSP.
 bool
 subjectToCSP(nsIURI* aURI, nsContentPolicyType aContentType) {
 
--- a/dom/security/nsCSPService.h
+++ b/dom/security/nsCSPService.h
@@ -25,13 +25,10 @@ public:
   NS_DECL_NSICONTENTPOLICY
   NS_DECL_NSICHANNELEVENTSINK
 
   CSPService();
 
 protected:
   virtual ~CSPService();
 
-private:
-  // Maps origins to app status.
-  nsDataHashtable<nsCStringHashKey, uint16_t> mAppStatusCache;
 };
 #endif /* nsCSPService_h___ */
--- a/dom/serviceworkers/ServiceWorkerEvents.cpp
+++ b/dom/serviceworkers/ServiceWorkerEvents.cpp
@@ -673,16 +673,17 @@ RespondWithHandler::ResolvedCallback(JSC
     autoCancel.SetCancelMessage(
       NS_LITERAL_CSTRING("BadRedirectModeInterceptionWithURL"), mRequestURL);
     return;
   }
 
   {
     ErrorResult error;
     bool bodyUsed = response->GetBodyUsed(error);
+    error.WouldReportJSException();
     if (NS_WARN_IF(error.Failed())) {
       autoCancel.SetCancelErrorResult(aCx, error);
       return;
     }
     if (NS_WARN_IF(bodyUsed)) {
       autoCancel.SetCancelMessage(
         NS_LITERAL_CSTRING("InterceptedUsedResponseWithURL"), mRequestURL);
       return;
@@ -754,16 +755,17 @@ RespondWithHandler::ResolvedCallback(JSC
                                                           std::move(closure));
 
   nsCOMPtr<nsIInputStream> body;
   ir->GetUnfilteredBody(getter_AddRefs(body));
   // Errors and redirects may not have a body.
   if (body) {
     ErrorResult error;
     response->SetBodyUsed(aCx, error);
+    error.WouldReportJSException();
     if (NS_WARN_IF(error.Failed())) {
       autoCancel.SetCancelErrorResult(aCx, error);
       return;
     }
   }
 
   MOZ_ALWAYS_SUCCEEDS(worker->DispatchToMainThread(startRunnable.forget()));
 
--- a/dom/serviceworkers/ServiceWorkerScriptCache.cpp
+++ b/dom/serviceworkers/ServiceWorkerScriptCache.cpp
@@ -613,23 +613,21 @@ private:
     MOZ_ASSERT(aCN);
     MOZ_DIAGNOSTIC_ASSERT(mState == WaitingForOpen);
 
     // We don't have to save any information from a failed CompareNetwork.
     if (!aCN->Succeeded()) {
       return NS_OK;
     }
 
-    ErrorResult result;
     nsCOMPtr<nsIInputStream> body;
-    result = NS_NewCStringInputStream(getter_AddRefs(body),
-                                      NS_ConvertUTF16toUTF8(aCN->Buffer()));
-    if (NS_WARN_IF(result.Failed())) {
-      MOZ_ASSERT(!result.IsErrorWithMessage());
-      return result.StealNSResult();
+    nsresult rv = NS_NewCStringInputStream(getter_AddRefs(body),
+                                           NS_ConvertUTF16toUTF8(aCN->Buffer()));
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      return rv;
     }
 
     RefPtr<InternalResponse> ir =
       new InternalResponse(200, NS_LITERAL_CSTRING("OK"));
     ir->SetBody(body, aCN->Buffer().Length());
     ir->SetURLList(aCN->URLList());
 
     ir->InitChannelInfo(aCN->GetChannelInfo());
@@ -645,17 +643,19 @@ private:
       new Response(aCache->GetGlobalObject(), ir, nullptr);
 
     RequestOrUSVString request;
     request.SetAsUSVString().Rebind(aCN->URL().Data(), aCN->URL().Length());
 
     // For now we have to wait until the Put Promise is fulfilled before we can
     // continue since Cache does not yet support starting a read that is being
     // written to.
+    ErrorResult result;
     RefPtr<Promise> cachePromise = aCache->Put(aCx, request, *response, result);
+    result.WouldReportJSException();
     if (NS_WARN_IF(result.Failed())) {
       // No exception here because there are no ReadableStreams involved here.
       MOZ_ASSERT(!result.IsJSException());
       MOZ_ASSERT(!result.IsErrorWithMessage());
       return result.StealNSResult();
     }
 
     mPendingCount += 1;
--- a/dom/webidl/External.webidl
+++ b/dom/webidl/External.webidl
@@ -3,10 +3,10 @@
  * 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/.
  */
 
 [NoInterfaceObject, JSImplementation="@mozilla.org/sidebar;1"]
 interface External
 {
   void AddSearchProvider(DOMString aDescriptionURL);
-  unsigned long IsSearchProviderInstalled(DOMString aSearchURL);
+  void IsSearchProviderInstalled();
 };
--- a/dom/webidl/Window.webidl
+++ b/dom/webidl/Window.webidl
@@ -382,17 +382,17 @@ partial interface Window {
   readonly attribute short orientation;
            attribute EventHandler onorientationchange;
 };
 #endif
 
 #ifdef HAVE_SIDEBAR
 // Mozilla extension
 partial interface Window {
-  [Replaceable, Throws, UseCounter]
+  [Replaceable, Throws, UseCounter, Pref="dom.sidebar.enabled"]
   readonly attribute (External or WindowProxy) sidebar;
 };
 #endif
 
 callback PromiseDocumentFlushedCallback = any ();
 
 // Mozilla extensions for Chrome windows.
 partial interface Window {
--- a/dom/workers/RuntimeService.cpp
+++ b/dom/workers/RuntimeService.cpp
@@ -2021,16 +2021,20 @@ RuntimeService::CrashIfHanging()
 
 // This spins the event loop until all workers are finished and their threads
 // have been joined.
 void
 RuntimeService::Cleanup()
 {
   AssertIsOnMainThread();
 
+  if (!mShuttingDown) {
+    Shutdown();
+  }
+
   nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
   NS_WARNING_ASSERTION(obs, "Failed to get observer service?!");
 
   if (mIdleThreadTimer) {
     if (NS_FAILED(mIdleThreadTimer->Cancel())) {
       NS_WARNING("Failed to cancel idle timer!");
     }
     mIdleThreadTimer = nullptr;
--- a/dom/workers/ScriptLoader.cpp
+++ b/dom/workers/ScriptLoader.cpp
@@ -837,16 +837,17 @@ private:
     // This JSContext will not end up executing JS code because here there are
     // no ReadableStreams involved.
     AutoJSAPI jsapi;
     jsapi.Init();
 
     ErrorResult error;
     RefPtr<Promise> cachePromise =
       mCacheCreator->Cache_()->Put(jsapi.cx(), request, *response, error);
+    error.WouldReportJSException();
     if (NS_WARN_IF(error.Failed())) {
       nsresult rv = error.StealNSResult();
       channel->Cancel(rv);
       return rv;
     }
 
     RefPtr<CachePromiseHandler> promiseHandler =
       new CachePromiseHandler(this, loadInfo, aIndex);
--- a/js/xpconnect/tests/mochitest/test_bug384632.html
+++ b/js/xpconnect/tests/mochitest/test_bug384632.html
@@ -19,16 +19,16 @@ https://bugzilla.mozilla.org/show_bug.cg
 
 /** Test for Bug 384632 **/
 var Cc = SpecialPowers.Cc, Ci = SpecialPowers.Ci;
 var propBag = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag);
 var obj = {};
 propBag.setProperty("foopy", obj);
 ok(SpecialPowers.unwrap(propBag.getProperty("foopy")) === obj,
    "nsIVariant works with regular objects");
-propBag.setProperty("foopy1", sidebar);
-ok(SpecialPowers.unwrap(propBag.getProperty("foopy1")) === sidebar,
+propBag.setProperty("foopy1", external);
+ok(SpecialPowers.unwrap(propBag.getProperty("foopy1")) === external,
    "nsIVariant works with bizarre objects");
 
 </script>
 </pre>
 </body>
 </html>
--- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AccessibilityTest.kt
+++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AccessibilityTest.kt
@@ -30,16 +30,17 @@ import android.widget.EditText
 
 import android.widget.FrameLayout
 
 import org.hamcrest.Matchers.*
 import org.junit.Test
 import org.junit.Before
 import org.junit.After
 import org.junit.runner.RunWith
+import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.ReuseSession
 
 const val DISPLAY_WIDTH = 480
 const val DISPLAY_HEIGHT = 640
 
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 @WithDisplay(width = DISPLAY_WIDTH, height = DISPLAY_HEIGHT)
 @WithDevToolsAPI
@@ -49,17 +50,18 @@ class AccessibilityTest : BaseSessionTes
     val provider: AccessibilityNodeProvider get() = view.accessibilityNodeProvider
     private val nodeInfos = mutableListOf<AccessibilityNodeInfo>()
 
     // Given a child ID, return the virtual descendent ID.
     private fun getVirtualDescendantId(childId: Long): Int {
         try {
             val getVirtualDescendantIdMethod =
                 AccessibilityNodeInfo::class.java.getMethod("getVirtualDescendantId", Long::class.java)
-            return getVirtualDescendantIdMethod.invoke(null, childId) as Int
+            val virtualDescendantId = getVirtualDescendantIdMethod.invoke(null, childId) as Int
+            return if (virtualDescendantId == Int.MAX_VALUE) -1 else virtualDescendantId
         } catch (ex: Exception) {
             return 0
         }
     }
 
     // Retrieve the virtual descendent ID of the event's source.
     private fun getSourceId(event: AccessibilityEvent): Int {
         try {
@@ -493,16 +495,17 @@ class AccessibilityTest : BaseSessionTes
 
     private fun screenContainsNode(nodeId: Int): Boolean {
         var node = createNodeInfo(nodeId)
         var nodeBounds = Rect()
         node.getBoundsInScreen(nodeBounds)
         return screenRect.contains(nodeBounds)
     }
 
+    @ReuseSession(false)
     @Test fun testScroll() {
         var nodeId = View.NO_ID
         sessionRule.session.loadString(
                 """<body style="margin: 0;">
                         <div style="height: 100vh;"></div>
                         <button>Hello</button>
                         <p style="margin: 0;">Lorem ipsum dolor sit amet, consectetur adipiscing elit,
                             sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
--- a/mobile/android/modules/geckoview/GeckoViewProgress.jsm
+++ b/mobile/android/modules/geckoview/GeckoViewProgress.jsm
@@ -136,17 +136,18 @@ var IdentityHandler = {
 
     if (aBrowser.contentPrincipal) {
       result.origin = aBrowser.contentPrincipal.originNoSuffix;
     }
 
     // Don't show identity data for pages with an unknown identity or if any
     // mixed content is loaded (mixed display content is loaded by default).
     if (identityMode === this.IDENTITY_MODE_UNKNOWN ||
-        (aState & Ci.nsIWebProgressListener.STATE_IS_BROKEN)) {
+        (aState & Ci.nsIWebProgressListener.STATE_IS_BROKEN) ||
+        (aState & Ci.nsIWebProgressListener.STATE_IS_INSECURE)) {
       result.secure = false;
       return result;
     }
 
     result.secure = true;
 
     let uri = aBrowser.currentURI || {};
     try {
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -5883,16 +5883,22 @@ pref("dom.xhr.lowercase_header.enabled",
 
 // Control whether clients.openWindow() opens windows in the same process
 // that called the API vs following our normal multi-process selection
 // algorithm.  Restricting openWindow to same process improves service worker
 // web compat in the short term.  Once the SW multi-e10s refactor is complete
 // this can be removed.
 pref("dom.clients.openwindow_favors_same_process", true);
 
+#ifdef RELEASE_OR_BETA
+pref("toolkit.aboutPerformance.showInternals", false);
+#else
+pref("toolkit.aboutPerformance.showInternals", true);
+#endif
+
 // When a crash happens, whether to include heap regions of the crash context
 // in the minidump. Enabled by default on nightly and aurora.
 #ifdef RELEASE_OR_BETA
 pref("toolkit.crashreporter.include_context_heap", false);
 #else
 pref("toolkit.crashreporter.include_context_heap", true);
 #endif
 
@@ -5937,8 +5943,14 @@ pref("dom.datatransfer.mozAtAPIs", false
 #else
 pref("dom.datatransfer.mozAtAPIs", true);
 #endif
 
 // Whether or not Prio is supported on this platform.
 #ifdef MOZ_LIBPRIO
 pref("prio.enabled", false);
 #endif
+
+#ifdef NIGHTLY_BUILD
+pref("dom.sidebar.enabled", false);
+#else
+pref("dom.sidebar.enabled", true);
+#endif
deleted file mode 100644
--- a/testing/web-platform/meta/fetch/api/response/response-stream-disturbed-6.html.ini
+++ /dev/null
@@ -1,16 +0,0 @@
-[response-stream-disturbed-6.html]
-  [A non-closed stream on which read() has been called]
-    expected: FAIL
-
-  [A non-closed stream on which cancel() has been called]
-    expected: FAIL
-
-  [A closed stream on which read() has been called]
-    expected: FAIL
-
-  [An errored stream on which read() has been called]
-    expected: FAIL
-
-  [An errored stream on which cancel() has been called]
-    expected: FAIL
-
--- a/toolkit/components/aboutperformance/content/aboutPerformance.js
+++ b/toolkit/components/aboutperformance/content/aboutPerformance.js
@@ -4,16 +4,17 @@
  * 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/. */
 
 "use strict";
 
 const { PerformanceStats } = ChromeUtils.import("resource://gre/modules/PerformanceStats.jsm", {});
 const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm", {});
 const { ObjectUtils } = ChromeUtils.import("resource://gre/modules/ObjectUtils.jsm", {});
+const { AddonManager } = ChromeUtils.import("resource://gre/modules/AddonManager.jsm", {});
 const { ExtensionParent } = ChromeUtils.import("resource://gre/modules/ExtensionParent.jsm", {});
 
 const {WebExtensionPolicy} = Cu.getGlobalForObject(Services);
 
 // about:performance observes notifications on this topic.
 // if a notification is sent, this causes the page to be updated immediately,
 // regardless of whether the page is on pause.
 const TEST_DRIVER_TOPIC = "test-about:performance-test-driver";
@@ -72,16 +73,23 @@ const MODE_RECENT = "recent";
 function performanceCountersEnabled() {
   return Services.prefs.getBoolPref("dom.performance.enable_scheduler_timing", false);
 }
 
 function extensionCountersEnabled() {
   return Services.prefs.getBoolPref("extensions.webextensions.enablePerformanceCounters", false);
 }
 
+// The ids of system add-ons, so that we can hide them when the
+// toolkit.aboutPerformance.showInternals pref is false.
+// The API to access addons is async, so we cache the list during init.
+// The list is unlikely to change while the about:performance
+// tab is open, so not updating seems fine.
+var gSystemAddonIds = new Set();
+
 let tabFinder = {
   update() {
     this._map = new Map();
     for (let win of Services.wm.getEnumerator("navigator:browser")) {
       let tabbrowser = win.gBrowser;
       for (let browser of tabbrowser.browsers) {
         let id = browser.outerWindowID; // May be `null` if the browser isn't loaded yet
         if (id != null) {
@@ -597,53 +605,58 @@ var State = {
   getCounters() {
     tabFinder.update();
     // We rebuild the maps during each iteration to make sure that
     // we do not maintain references to groups that has been removed
     // (e.g. pages that have been closed).
 
     let previous = this._buffer[Math.max(this._buffer.length - 2, 0)].tabs;
     let current = this._latest.tabs;
-    return Object.keys(current).map(id => {
+    let counters = [];
+    for (let id of Object.keys(current)) {
       let tab = current[id];
       let oldest;
       for (let index = 0; index <= this._buffer.length - 2; ++index) {
         if (id in this._buffer[index].tabs) {
           oldest = this._buffer[index].tabs[id];
           break;
         }
       }
       let prev = previous[id];
       let host = tab.host;
 
-      let type = "tab";
+      let type = "other";
       let name = `${host} (${id})`;
       let image = "chrome://mozapps/skin/places/defaultFavicon.svg";
       let found = tabFinder.get(parseInt(id));
       if (found) {
         if (found.tabbrowser) {
           name = found.tab.getAttribute("label");
           image = found.tab.getAttribute("image");
+          type = "tab";
         } else {
           name = {id: "preloaded-tab",
                   title: found.tab.linkedBrowser.contentTitle};
-          type = "other";
         }
       } else if (id == 1) {
         name = BRAND_NAME;
         image = "chrome://branding/content/icon32.png";
         type = "browser";
       } else if (/^[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}$/.test(host)) {
         let addon = WebExtensionPolicy.getByHostname(host);
         name = `${addon.name} (${addon.id})`;
         image = "chrome://mozapps/skin/extensions/extensionGeneric-16.svg";
-        type = "addon";
+        type = gSystemAddonIds.has(addon.id) ? "system-addon" : "addon";
       } else if (id == 0 && !tab.isWorker) {
         name = {id: "ghost-windows"};
-        type = "other";
+      }
+
+      if (type != "tab" && type != "addon" &&
+          !Services.prefs.getBoolPref("toolkit.aboutPerformance.showInternals", false)) {
+        continue;
       }
 
       // Create a map of all the child items from the previous time we read the
       // counters, indexed by counterId so that we can quickly find the previous
       // value for any subitem.
       let prevChildren = new Map();
       if (prev) {
         for (let child of prev.children) {
@@ -692,22 +705,23 @@ var State = {
           dispatches - prev.dispatchCount - (prev.dispatchesFromFormerChildren || 0);
       }
       if (oldest) {
         dispatchesSinceStartOfBuffer =
           dispatches - oldest.dispatchCount - (oldest.dispatchesFromFormerChildren || 0);
         durationSinceStartOfBuffer =
           duration - oldest.duration - (oldest.durationFromFormerChildren || 0);
       }
-      return ({id, name, image, type,
-               totalDispatches: dispatches, totalDuration: duration,
-               durationSincePrevious, dispatchesSincePrevious,
-               durationSinceStartOfBuffer, dispatchesSinceStartOfBuffer,
-               children});
-    });
+      counters.push({id, name, image, type,
+                     totalDispatches: dispatches, totalDuration: duration,
+                     durationSincePrevious, dispatchesSincePrevious,
+                     durationSinceStartOfBuffer, dispatchesSinceStartOfBuffer,
+                     children});
+    }
+    return counters;
   },
 };
 
 var View = {
   /**
    * A cache for all the per-item DOM elements that are reused across refreshes.
    *
    * Reusing the same elements means that elements that were hidden (respectively
@@ -1024,16 +1038,18 @@ var View = {
       elt.classList.add("indent");
     else
       elt.classList.add("root");
     if (["tracker", "worker"].includes(type))
       elt.classList.add(type);
     row.appendChild(elt);
 
     elt = document.createElement("td");
+    if (type == "system-addon")
+      type = "addon";
     document.l10n.setAttributes(elt, "type-" + type);
     row.appendChild(elt);
 
     elt = document.createElement("td");
     if (!energyImpact)
       elt.textContent = "–";
     else {
       let impact = "high";
@@ -1347,16 +1363,23 @@ var Control = {
 var go = async function() {
 
   Control.init();
 
   if (performanceCountersEnabled()) {
     let opt = document.querySelector(".options");
     opt.style.display = "none";
     opt.nextElementSibling.style.display = "none";
+
+    let addons = await AddonManager.getAddonsByTypes(["extension"]);
+    for (let addon of addons) {
+      if (addon.isSystem) {
+        gSystemAddonIds.add(addon.id);
+      }
+    }
   } else {
     document.getElementById("dispatch-table").parentNode.style.display = "none";
   }
 
   // Setup a hook to allow tests to configure and control this page
   let testUpdate = function(subject, topic, value) {
     let options = JSON.parse(value);
     Control._setOptions(options);
--- a/toolkit/components/search/nsSidebar.js
+++ b/toolkit/components/search/nsSidebar.js
@@ -1,43 +1,46 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
 /* 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/. */
 
 ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+ChromeUtils.import("resource://gre/modules/Services.jsm");
 
 function nsSidebar() {
 }
 
 nsSidebar.prototype = {
   init(window) {
     this.window = window;
     this.mm = window.docShell.messageManager;
   },
 
   // This function implements window.external.AddSearchProvider().
   // The capitalization, although nonstandard here, is to match other browsers'
   // APIs and is therefore important.
   AddSearchProvider(engineURL) {
+    if (!Services.prefs.getBoolPref("dom.sidebar.enabled", false)) {
+      return;
+    }
+
     if (!this.mm) {
       Cu.reportError(`Installing a search provider from this context is not currently supported: ${Error().stack}.`);
       return;
     }
 
     this.mm.sendAsyncMessage("Search:AddEngine", {
       pageURL: this.window.document.documentURIObject.spec,
       engineURL,
     });
   },
 
   // This function exists to implement window.external.IsSearchProviderInstalled(),
   // for compatibility with other browsers.  The function has been deprecated
   // and so will not be implemented.
-  IsSearchProviderInstalled(engineURL) {
-    return 0;
-  },
+  IsSearchProviderInstalled() {},
 
   classID: Components.ID("{22117140-9c6e-11d3-aaf1-00805f8a4905}"),
   QueryInterface: ChromeUtils.generateQI([Ci.nsIDOMGlobalPropertyInitializer]),
 };
 
 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([nsSidebar]);
deleted file mode 100644
index c438cbd0be052d4df3e6c564d3a7e8c0459477a3..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/addons/browser_bug596336_1/META-INF/manifest.mf
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+
+Name: install.rdf
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 59ZQahS8eYm678dptqF2fQ==
+SHA1-Digest: fCpbSYnLdjYZpC1t1zwsEztrYA8=
+
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..93c6e606e81096d8710db86f2c4d348d6deec513
GIT binary patch
literal 4188
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
Ol4W7fj4Owk;lBWJH?npB
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/addons/browser_bug596336_1/META-INF/mozilla.sf
@@ -0,0 +1,4 @@
+Signature-Version: 1.0
+MD5-Digest-Manifest: Cp9ofwdMdvAralffnWqQww==
+SHA1-Digest-Manifest: TpmukUYFQ+eJgQzFeAUYw+PzUdY=
+
deleted file mode 100644
index a87191efed7d99a987c4a0f662886c390566e761..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/addons/browser_bug596336_2/META-INF/manifest.mf
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+
+Name: install.rdf
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 1gYPkSqlgVzw1RWJIVLXrQ==
+SHA1-Digest: 046B+AIjFVBHO7G2BQfj2zoPvRw=
+
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ef0b63a8006dfba86151409401224f290498dee0
GIT binary patch
literal 4188
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
GSobgb%CH>(
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/addons/browser_bug596336_2/META-INF/mozilla.sf
@@ -0,0 +1,4 @@
+Signature-Version: 1.0
+MD5-Digest-Manifest: whMuT0nKTV49pQyLDTgTfA==
+SHA1-Digest-Manifest: WzDdDwYCt5znpmOn2Sz8eCWWcvA=
+
deleted file mode 100644
index c121d31c4df27dd8dce1c8499a4ae314e2646b62..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/addons/browser_dragdrop1/META-INF/manifest.mf
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+
+Name: manifest.json
+Digest-Algorithms: MD5 SHA1 SHA256
+MD5-Digest: mCLu38qfGN3trj7qKQQeEA==
+SHA1-Digest: A1BaJErQY6KqnYDijP0lglrehk0=
+SHA256-Digest: p2vjGP7DRqrK81NfT4LqnF7a5p8+lEuout5WLBhk9AA=
+
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..046a0285c7071e4ce2a0c798191882ecc365dd4d
GIT binary patch
literal 4210
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
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/addons/browser_dragdrop1/META-INF/mozilla.sf
@@ -0,0 +1,5 @@
+Signature-Version: 1.0
+MD5-Digest-Manifest: LrrwWBKNYWeVd205Hq+JwQ==
+SHA1-Digest-Manifest: MeqqQN+uuf0MVesMXxbBtYN+5tU=
+SHA256-Digest-Manifest: iWCxfAJX593Cn4l8R63jaQETO5HX3XOhcnpQ7nMiPlg=
+
deleted file mode 100644
index dc6cc1a36fc740e92536342fb44dc71730bc64f5..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/addons/browser_dragdrop2/META-INF/manifest.mf
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+
+Name: manifest.json
+Digest-Algorithms: MD5 SHA1 SHA256
+MD5-Digest: 3dL7JFDBPC63pSFI5x+Z7Q==
+SHA1-Digest: l1cKPyWJIYdZyvumH9VfJ6fpqVA=
+SHA256-Digest: QHTjPqTMXxt5tl8zOaAzpQ8FZLqZx8LRF9LmzY+RCDQ=
+
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..170a3616207bdfb3583f3b466ca0b1a12dad8a16
GIT binary patch
literal 4210
zc%0Q&c{r5q9`??Rv1Q8`OSZDhn0FXUMTIPhY!R|FhU_!;MAD3`Ng?}^b?p0I$QGg~
z$ximKLJ7qeaj5fs^__FBbN)Klxz2y@{r-N>dp-AaJ@@^4Z;;GFfYV6?YX)yH0yL0x
zGK&>RX1N3b01O>S1E)U91ch*e3_n|dbTT6VlBu78WN1}76aqjXwCp^iIQblEKalay
zKHvZ~6-dg(Fo1M$s1Xd#1~D?k@POR=fS!#_hv@6z?2HpoCAzy3-Ep1{L;?m4qV}r{
zY$AVDm34Fl^xTOyUike60Ye8nf&;-$z|hv++W~Kj5dnqv7eLu~J$_X1IE)m|#)e4n
zkaGF)2`Qqx9p*5||L4Bw0OY|dL>~`Z{OLbh@I)7okAo4T0LozGrDbHXSXr|@c<dJl
z2K<%C-vKQfL{%As1QGjyhK*5&=tc0vIS>Sl9c-^+nD>t3J6pK&_dQ|QK-M1w>3@>K
z2!n#(NgUv@amU%&xD#Db(x*LbJv{%y0VG3?{Cc_oH5HT$VW!%9PY)qO0IG%51@<NR
ze5&7#-9Bn9$GMq^mMBQw3G%#Q5CxHbF{=^y5ndBhc;$1D@a0d?tv2=d#DG&#GrP|t
z?PwRqOu49WuNOF6&MGf4)lMLeaipKK@X<rvRiMvY?6GIUE<eYVHXG<V^qH^>!9w0O
zf3A){G9P3a0}HHz@W0Y7z8Xz?tJAP_^T4Z#falIzKHVKxm$6*lTDvxf)7!3RJ4>X<
zrsj%8N%`Z#V}|?QQnoF>99IjJsMg%hebQv0kj`MAbnIgTEA``d_#@0Jsi(xO-L?Cp
z15L*aZ<qV!ZCspLbw_+*$<ALkkMwSPb1*L3GF-A$@jVAC@=}JnNdi%`gms|N)cr&y
z<pFPOYwB)VfJU`P{KOY9n7ug4rU1it=OSxO8;YWp|Jzno^zfO<qoVqlt1M>`mCVeH
zepRQUv2x!k>^sI7bi~`;wB})UMdEAWD_FHB%JNo}wogaG4POih%*=V<7-V=pl;ZCd
zg~!u(+!X6o?Pd?fpQDHqKSFM&6rR0iOF$Z42xVO@QM)M}6|(Z#i^2NsoBr~P1{EGP
z!UCsnxP5EFDsNUcJdokcZ2K5p|KOfM2Mz-UR-Y*{GgOLYgE7rH8rT;JS;`F6=;t~`
z(Fc2fzTnlOh$TCvZ6~)VyoA;1MyOCU&E<y?z9k1^QIq5IGOZ1H!!!O6C_n{d34;4~
z9csiY2;&5iHxbB_TRgi5j>c>zvk#%NS{Hn9<IDdbQt1Be@jFQ$?KEYvYpcsn!7R;e
z-)hpkc@weCo*|b>?Xa}+EGtPtY33OEzAk{d?ChyNm!`eJQ_@BXTe3R+q^2zRLXed@
z&yG7<g03e-;aD$AN1<GL%9+sOLU_*0YrI8zivSj=UmF?J!|CTMJ}Hnkbo@&3nCR_G
zFR&Yb@|s=hXsEYJ-dkPK_1IE^fVSi-<Bjtp)~L<bEtFw(Gj%uL%aZL&j&C$>ttLd4
z8%8+9@D;0JV$UQ-Ray66UdUA`ha_|cTgmsR&gu7*Jdur=-e8CvM`~)%t9?rzSqsp=
zZCYM)!vPhPa)?XVFwuPA3!`4`-A@-2tdfnd(;*et;yesKv@Z?B+X@#|`&zTt6<e-v
zkk(uU>5^O_H1cJ6MT(ArgHa?b@am1rJyc1Lg}1`^eE06RfCpvg<{$M(O)e9JDV{ze
z_Un0%DVZj;YZ(W(#wPM#qmz}@{fM>g<;jD&f)tJsm8&{wM@>1Yvt~zTJPluqP7Ow>
zWyZI49Q1xwEy9CSyLo&!l5b2)O5bH-cv9f)J<Z`uy}q?MxtNF2lB$o<M`&fs3rrDm
zdgj-Pci0#!bW@!w4#W!01?tCnc8STexWwgyD#k8z=mkYfTN%7~60OT3hi>;3hu*k?
zL39I+Yh^=OJ*TMDG-M0iB~#XK^WZ|WuJ}ldqE8e^ra|p_I{Oblhq6$?{?W?)|Eo^U
z5AyzSa-=(v=!wGPP_BPAqi`<7@BS<g%7R!B1dn0me)#iG_<uBM{*#eEF1VB#dbjLE
zK```o=W@$Ov(N9mPc(}7jkWrYSv%vZwXDvSGPn$PaF1=B*$H~>qoEs!nB0Na_2lp?
zE0})CN$xByZ(N4m*A`lZ2;aCsTlernTG;4jzJ)L;;MpbDsT)d>S}~bBtO;=r@2zEA
zTD>TE?2HN(Um4<>y5G`3Oz%o?^yre~a*@v~Vo#%vP*XDPbQ4YA3VEd1-h&vm`?OAk
zxo+4#DwOf=Ad_P?>0;HydPcjFlC*{HlK*yA;vq!+7@@$CA%FYqXWBQ0M}(-G<?S98
zK_gbq=DEVLEK*tq;T+<JI2*1{w*hm_!DD{e;yPzF3$|s!-}O%RjyzfeQcWwkumz%r
zOft_pz38}Q>8^wKkw?gX)=<sQCAP5MH41SvU;p|r-}*3jptR{&T80SsrY&op+){nm
z+;XCH<-w+>+|(i;FcY#sLTkiO=nJtrOw){vsp;1Orj)jZv~4-Y`i+x}g8e!o*;-G+
z)&oC<QlDsl5KQ}Q)Xsu)LO=3p`R%%G)mTwqF-UWIr|=hA<x!_MG^$rycS_8>yB~38
z6n+h)^aVwl+-YiRUCa-?5YSkn9U>?dd^1S6wW)orU7~I7p3hKzNR}qPR~H@biEqtp
z$l4U0XsAi@T7!Jx8SFZ=z-@5eSWnJ(mryg9Q2kk5Z&fU${mqd04<jc7VIUa@0uSt)
zIU9@`gaW`W$h41`_nu&|J)y!u<USVO#|J=qIPFn5Kut{pg?<+kFB1$2`_}`2l=ovq
zkkUa?>P<vt!+R6Y!fAq!L`7kWAYUF{GQKv0M9L2MAB&z00H6$<?sBju5WJ}Zz+fUs
zA$w0x*W+mPKT8jd$D#4=&Qh+nF5vlndVDYqP%T3h6d?2M>5kxOOYlVPix=nV<!<|z
zUn_nx@4s*O7Xwpisq_3(+hY+21Csde?*jM5%`ythB$<_c-6!J!#zWK9bqak-eb1C~
zZlj(;d*ImlmHM>4b0}nq?kv%yE|*3OUmPkFVig)e+dZMuZfCc&fPR@9;1y!;=HC#?
zPd}I``@XK2Kdk50jV{XhV_1Zp>~UM9{-QN|cY2lK+B-L9dco0+26C#p>~z@Lvy)PJ
z<ta6i>CdTXkfWU92>arfY?2Mg^Cspc*EKlrhPN2YZ$_Z-O-DWvWgZ?9Os1<ICJAud
z=NVNPG2?bzcFf|cjj$G&Dh5+_6ZI#r=Cz+v<F`X~p~kPM4mq_p9)3+U#H^mGU!Ohl
zd!tcm!Buwp7OfDUzK8M*<%N9JwNE!wg<^$mc>9hf9c8>n09;SimMpMs%)Z|SyfB^3
zggdMyU9lXW6mEBRf>h6Sb7<uloXUJtI$mVNc6@kB_6?8;{kTOZ#3<KvCspbGC+3Pc
zR*CGx9vN|nfxs05e1Z|Pb|>6$wG_%jK^Jw44`BKHy4v2gUMrC9>`ka~sjO7cgcnyU
z=yzxAu;vQ5C|0zzra-h&NzK_iySr<Lu>5o8<3$w;<8bk#(sluyz8s|ZBQ1Vs>IZ7W
z=G4@UF}~IFqO<Bd<1o!euBJdc<>?j09Q`{*E)_a~q-+9FNZXra#$;ZR{j{Hc=FzYS
zYG85-Lx#%l1t6KdoCK1p{(r{LFInx6aF=cYa{gQe#r&G}K%So!Y7FyVLek#U75rI+
zVfNfc$VfwUQW}oSInPmu(5Q?z7p>O%B|8GtFfxQHKf~jr<wB0dc+%n369y_8x=Y;>
zi4>!*>1&$Yj&hG#EW)7zv^CmBn|gejlaX;80tPmnxT?5}an(@!<WusAmez~j;lb}D
zF9h~oS07^yd+gJ8aHvz>-^_XO;o^1K`PgXpu#N!avfN4YY~!J`V+dxCk0-uV)3bR`
z<rjoA-(y<TzBPnL1G3}(g<PL(c0<Z2ZC$f&9{tlRuY#N<qPa$imm|OVC(<t(T^m_9
z)d?35T#GndWyXI0($f_Fp79FIqgK)RZ<p=kUeA_mBNo3kBdo*$t{#givWm4_oVdUF
zthZ#~%Tafu<W}=3T6mPccI(s)HtW>*i^H7H$J+gwxYSQK5^g!+UwWO}u7PqbSZ0TT
z4qr4_BY68R4>XV*t}v%4)<KH`XW(WNcl1Ov$6~_Xl}va)5Cr(qu|@qAQ#$R^l(c^T
zpzeOLq|{5CS*Lpa$4J$s0>6o*BvpBPH4Z66C2m>wAe0Pt2$h-Y)#FpUV1Lk@$mleF
zo&Q{aHu`Ik{E0{##oMeGQY<yDgkQBAYFOS}6QbiRO)Y2YYPf|q_2o#jx^>Msz4Abc
zGIgS?gq1q!x8v#Q$>HNLzSk90Z$(;GRtuBZW`5`FV7HFTLPj(@n!YK1mg1ZJEMBO7
gqkaVdr=0>;cxGZ=MmJ?76-$5Mj!`xnW<*B)4J_BiZvX%Q
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/addons/browser_dragdrop2/META-INF/mozilla.sf
@@ -0,0 +1,5 @@
+Signature-Version: 1.0
+MD5-Digest-Manifest: c30hzcI1ISlt46ODjVVJ2w==
+SHA1-Digest-Manifest: 2yMpQHuLM0J61T7vt11NHoYI1tU=
+SHA256-Digest-Manifest: qtsYxiv1zGWBp7JWxLWrIztIdxIt+i3CToReEx5fkyw=
+
deleted file mode 100644
index 050b2d2cd81379a31886e693744443a65105550f..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/addons/browser_dragdrop_incompat/META-INF/manifest.mf
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+
+Name: manifest.json
+Digest-Algorithms: MD5 SHA1 SHA256
+MD5-Digest: Wzo/k6fhArpFb4UB2hIKlg==
+SHA1-Digest: D/WDy9api0X7OgRM6Gkvfbyzogo=
+SHA256-Digest: IWBdbytHgPLtCMKKhiZ3jenxKmKiRAhh3ce8iP5AVWU=
+
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a026680e91122b7c87e38bb5af73dda7012a59cf
GIT binary patch
literal 4218
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
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/addons/browser_dragdrop_incompat/META-INF/mozilla.sf
@@ -0,0 +1,5 @@
+Signature-Version: 1.0
+MD5-Digest-Manifest: ovtNeIie34gMM5l18zP2MA==
+SHA1-Digest-Manifest: c5owdrvcOINxKp/HprYkWXXI/js=
+SHA256-Digest-Manifest: uLPmoONlxFYxWeSTOEPJ9hN2yMDDZMJL1PoNIWcqKG4=
+
deleted file mode 100644
index be453ce9c08bf1737d849229b8e2d5d975e6b398..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 6e937c5cc2aabf7339b2e1a0e75391d05cac5f09..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 4c939c05b97184486ef3b16eb875342aa5ce0a5f..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 8d23fb88edb0db59e5b86fe84237e5ffe07acf1e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/addons/browser_installssl/META-INF/manifest.mf
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+
+Name: manifest.json
+Digest-Algorithms: MD5 SHA1 SHA256
+MD5-Digest: b4Q2C4GsIJfRLsXc7T2ldQ==
+SHA1-Digest: UG5rHxpzKmdlGrquXaguiAGDu8E=
+SHA256-Digest: WZrN9SdGBux9t3lV7TVIvyUG/L1px4er2dU3TsBpC4s=
+
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..68621e19be403a1d8662274fb0997d6f1488b291
GIT binary patch
literal 4213
zc%0Q&c{G%N-!{9Yu`~>2Uki=7rx|Mzku9?Q6hg+(M9f&m5``HVBP6Ao64}?RnNSFc
zEYWID2|0u;(Za(+y}w`mp7%NL``3Hk^Zaq2b6@x8bKmECeb4v0KKBJM1pVPWDoj)6
z7bFM)&R__-0}Me|FbIU>0T6JQDnA6g6X5&R0?J?@p#THc127=f84xfC4CWS*cw<*x
z5m*2q|LOy6gK+`$d>kLZ1Bci{;V7`Z9Zmw+xdnJpC`)RXmyZuo#*iA|M-3p-yr>i$
z7Qk#(`A|xKRt+qzWUK?I9zmq71{pgqGR2ERma+2;2=*d*;*<b|trs9D$-ti#5)r3H
z^zfik0@ZwfenO2JK*q@e(toXs2ZY{!k{TN5Nz(tbg+%oQq(qT8EdalH0R%0Ay3;1q
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
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/addons/browser_installssl/META-INF/mozilla.sf
@@ -0,0 +1,5 @@
+Signature-Version: 1.0
+MD5-Digest-Manifest: zqRm8+jxS0iRUGWeArGkXg==
+SHA1-Digest-Manifest: pa/31Ll1PYx0dPBQ6C+fd1/wJO4=
+SHA256-Digest-Manifest: DJELIyswfwgeL0kaRqogXW2bzUKhn+Pickfv6WHBsW8=
+
deleted file mode 100644
index 42fba0c062066dcf7305abb1c4733eee7d12dedc..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index e52172baf2e300ed03e5f585cc3eec9975cfcc03..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 7e48119c8ef2d658ce8482bb1e95a9f2d11487bb..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 4fa7b8bfac89670c21366c62d1edbf5ff39b3e4a..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/toolkit/mozapps/extensions/test/browser/addons/browser_webapi_install/bootstrap.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/* exported startup, shutdown, install, uninstall */
-ChromeUtils.import("resource://gre/modules/Services.jsm");
-
-function startup(data, reason) {
-  Services.prefs.setIntPref("webapitest.active_version", 1);
-}
-
-function shutdown(data, reason) {
-  Services.prefs.setIntPref("webapitest.active_version", 0);
-}
deleted file mode 100644
--- a/toolkit/mozapps/extensions/test/browser/addons/browser_webapi_install/install.rdf
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0"?>
-
-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-
-  <Description about="urn:mozilla:install-manifest">
-    <em:id>webapi_install@tests.mozilla.org</em:id>
-    <em:version>1.1</em:version>
-    <em:name>AddonManger web API test</em:name>
-    <em:bootstrap>true</em:bootstrap>
-
-    <em:targetApplication>
-      <Description>
-        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-        <em:minVersion>0.3</em:minVersion>
-        <em:maxVersion>*</em:maxVersion>
-      </Description>
-    </em:targetApplication>
-
-    <em:targetApplication>
-      <Description>
-        <em:id>toolkit@mozilla.org</em:id>
-        <em:minVersion>0</em:minVersion>
-        <em:maxVersion>*</em:maxVersion>
-      </Description>
-    </em:targetApplication>
-
-  </Description>
-</RDF>
deleted file mode 100644
index a063fd1c43d3cfa9ae7b2df388e29bf12494970b..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/addons/options_signed/META-INF/manifest.mf
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+
+Name: manifest.json
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Rnoaa6yWePDor5y5/SLFaw==
+SHA1-Digest: k51DtKj7bYrwkFJDdmYNDQeUBlA=
+
+Name: options.html
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: vTjxWlRpioEhTZGKTNUqIw==
+SHA1-Digest: Y/mr6A34LsvekgRpdhyZRwPF1Vw=
+
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8b6320addae6d90aed0a494e7a8701bc7bde572b
GIT binary patch
literal 4197
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
XJ%xJCP*?p;{vwLI@bxAe|L{Kmrv9-4
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/addons/options_signed/META-INF/mozilla.sf
@@ -0,0 +1,4 @@
+Signature-Version: 1.0
+MD5-Digest-Manifest: rdmx8VMNzkZ5tRf7tt8G1w==
+SHA1-Digest-Manifest: gjtTe8X9Tg46Hz2h4Tru3T02hmE=
+
--- a/toolkit/mozapps/extensions/test/browser/browser.ini
+++ b/toolkit/mozapps/extensions/test/browser/browser.ini
@@ -1,12 +1,22 @@
 [DEFAULT]
 tags = addons
 support-files =
-  addons/*
+  addons/browser_bug596336_1.xpi
+  addons/browser_bug596336_2.xpi
+  addons/browser_dragdrop1.xpi
+  addons/browser_dragdrop2.xpi
+  addons/browser_dragdrop_incompat.xpi
+  addons/browser_installssl.xpi
+  addons/browser_theme.xpi
+  addons/browser_update1_1.xpi
+  addons/browser_update1_2.xpi
+  addons/options_signed.xpi
+  addons/options_signed/*
   addon_prefs.xul
   discovery.html
   head.js
   more_options.xul
   options.xul
   plugin_test.html
   redirect.sjs
   releaseNotes.xhtml
@@ -22,16 +32,28 @@ support-files =
   !/toolkit/mozapps/extensions/test/xpinstall/corrupt.xpi
   !/toolkit/mozapps/extensions/test/xpinstall/incompatible.xpi
   !/toolkit/mozapps/extensions/test/xpinstall/installtrigger.html
   !/toolkit/mozapps/extensions/test/xpinstall/restartless.xpi
   !/toolkit/mozapps/extensions/test/xpinstall/unsigned.xpi
   !/toolkit/mozapps/extensions/test/xpinstall/amosigned.xpi
   !/toolkit/mozapps/extensions/test/xpinstall/amosigned-restart-required.xpi
 
+generated-files =
+  addons/browser_bug596336_1.xpi
+  addons/browser_bug596336_2.xpi
+  addons/browser_dragdrop1.xpi
+  addons/browser_dragdrop2.xpi
+  addons/browser_dragdrop_incompat.xpi
+  addons/browser_installssl.xpi
+  addons/browser_theme.xpi
+  addons/browser_update1_1.xpi
+  addons/browser_update1_2.xpi
+  addons/options_signed.xpi
+
 [browser_CTP_plugins.js]
 tags = blocklist
 [browser_bug523784.js]
 [browser_bug562797.js]
 [browser_bug562890.js]
 skip-if = os == 'win' && !debug # Disabled on Windows opt/PGO builds due to intermittent failures (bug 1135866)
 [browser_bug562899.js]
 [browser_bug562992.js]
--- a/toolkit/mozapps/extensions/test/browser/browser_webapi_install.js
+++ b/toolkit/mozapps/extensions/test/browser/browser_webapi_install.js
@@ -1,15 +1,16 @@
 const TESTPAGE = `${SECURE_TESTROOT}webapi_checkavailable.html`;
-const XPI_URL = `${SECURE_TESTROOT}addons/browser_webapi_install.xpi`;
-const XPI_SHA = "sha256:d4bab17ff9ba5f635e97c84021f4c527c502250d62ab7f6e6c9e8ee28822f772";
+const XPI_URL = `${SECURE_TESTROOT}../xpinstall/amosigned.xpi`;
 
-const ID = "webapi_install@tests.mozilla.org";
+const XPI_SHA = "sha256:91121ed2c27f670f2307b9aebdd30979f147318c7fb9111c254c14ddbb84e4b0";
+
+const ID = "amosigned-xpi@tests.mozilla.org";
 // eh, would be good to just stat the real file instead of this...
-const XPI_LEN = 4782;
+const XPI_LEN = 4287;
 
 function waitForClear() {
   const MSG = "WebAPICleanup";
   return new Promise(resolve => {
     let listener = {
       receiveMessage(msg) {
         if (msg.name == MSG) {
           Services.mm.removeMessageListener(MSG, listener);
@@ -33,16 +34,20 @@ add_task(async function setup() {
 // Wrapper around a common task to run in the content process to test
 // the mozAddonManager API.  Takes a URL for the XPI to install and an
 // array of steps, each of which can either be an action to take
 // (i.e., start or cancel the install) or an install event to wait for.
 // Steps that look for a specific event may also include a "props" property
 // with properties that the AddonInstall object is expected to have when
 // that event is triggered.
 async function testInstall(browser, args, steps, description) {
+  promisePopupNotificationShown("addon-webext-permissions").then(panel => {
+    panel.button.click();
+  });
+
   let success = await ContentTask.spawn(browser, {args, steps}, async function(opts) {
     let { args, steps } = opts;
     let install = await content.navigator.mozAddonManager.createInstall(args);
     if (!install) {
       await Promise.reject("createInstall() did not return an install object");
     }
 
     // Check that the initial state of the AddonInstall is sane.
@@ -198,34 +203,31 @@ function makeRegularTest(options, what) 
     ];
 
     let promptPromise = acceptAppMenuNotificationWhenShown("addon-installed");
 
     await testInstall(browser, options, steps, what);
 
     await promptPromise;
 
-    let version = Services.prefs.getIntPref("webapitest.active_version");
-    is(version, 1, "the install really did work");
-
     // Sanity check to ensure that the test in makeInstallTest() that
     // installs.size == 0 means we actually did clean up.
     ok(AddonManager.webAPI.installs.size > 0, "webAPI is tracking the AddonInstall");
 
-    let addons = await promiseAddonsByIDs([ID]);
-    isnot(addons[0], null, "Found the addon");
+    let addon = await promiseAddonByID(ID);
+    isnot(addon, null, "Found the addon");
 
     // Check that the expected installTelemetryInfo has been stored in the addon details.
-    Assert.deepEqual(addons[0].installTelemetryInfo, {source: "test-host", method: "amWebAPI"},
+    Assert.deepEqual(addon.installTelemetryInfo, {source: "test-host", method: "amWebAPI"},
                      "Got the expected addon.installTelemetryInfo");
 
-    await addons[0].uninstall();
+    await addon.uninstall();
 
-    addons = await promiseAddonsByIDs([ID]);
-    is(addons[0], null, "Addon was uninstalled");
+    addon = await promiseAddonByID(ID);
+    is(addon, null, "Addon was uninstalled");
   });
 }
 
 add_task(makeRegularTest({url: XPI_URL}, "a basic install works"));
 add_task(makeRegularTest({url: XPI_URL, hash: null}, "install with hash=null works"));
 add_task(makeRegularTest({url: XPI_URL, hash: ""}, "install with empty string for hash works"));
 add_task(makeRegularTest({url: XPI_URL, hash: XPI_SHA}, "install with hash works"));
 
--- a/toolkit/mozapps/extensions/test/browser/moz.build
+++ b/toolkit/mozapps/extensions/test/browser/moz.build
@@ -2,8 +2,34 @@
 # vim: set filetype=python:
 # 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/.
 
 BROWSER_CHROME_MANIFESTS += [
     'browser.ini',
 ]
+
+addons = [
+    'browser_bug596336_1',
+    'browser_bug596336_2',
+    'browser_dragdrop1',
+    'browser_dragdrop2',
+    'browser_dragdrop_incompat',
+    'browser_installssl',
+    'browser_theme',
+    'browser_update1_1',
+    'browser_update1_2',
+    'options_signed',
+]
+
+output_dir = OBJDIR_FILES._tests.testing.mochitest.browser.toolkit.mozapps.extensions.test.browser.addons
+
+for addon in addons:
+    indir = 'addons/%s' % addon
+    xpi = '%s.xpi' % indir
+
+    GENERATED_FILES += [xpi]
+    GENERATED_FILES[xpi].script = '../create_xpi.py'
+    GENERATED_FILES[xpi].inputs = [indir]
+
+    output_dir += ['!%s' % xpi]
+
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/create_xpi.py
@@ -0,0 +1,14 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+from os.path import abspath
+
+from mozbuild.action.zip import main as create_zip
+
+def main(output, input_dir):
+    output.close()
+
+    return create_zip(['-C', input_dir, abspath(output.name), '**'])
--- a/xpfe/appshell/test/test_windowlessBrowser.xul
+++ b/xpfe/appshell/test/test_windowlessBrowser.xul
@@ -38,17 +38,16 @@ function testWindowlessBrowser(chromePri
 
   var win = docShell.contentViewer.DOMDocument.defaultView;
 
   ok(win.screenX == 0, "window.screenX should be 0 in a windowless browser");
   ok(win.screenY == 0, "window.screenY should be 0 in a windowless browser");
   ok(win.outerWidth == 0, "window.outerWidth should be 0 in a windowless browser");
   ok(win.outerHeight == 0, "window.outerHeight should be 0 in a windowless browser");
   
-  ok(win.sidebar, "window.sidebar should be defined");
   ok(win.external, "window.external should be defined");
   
   var exception;
 
   try {
     win.external.AddSearchProvider("http://test-fake.url");
   } catch(e) {
     exception = e;