Bug 1314955 part C - Make the `binary-component` manifest instruction obsolete: it will continue to be parsed and will report a deprecation notice to the browser console. r=froydnj
authorBenjamin Smedberg <benjamin@smedbergs.us>
Wed, 26 Oct 2016 12:40:42 -0400
changeset 367844 25f407284342afe366f96a4234eace16377cddf3
parent 367843 c1554712210f4a44329fc6a01d51603aed1c43a5
child 367845 a1d6693a7f5b965462208d53058e9925e35aeafe
push id6996
push userjlorenzo@mozilla.com
push dateMon, 06 Mar 2017 20:48:21 +0000
treeherdermozilla-beta@d89512dab048 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersfroydnj
bugs1314955
milestone53.0a1
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
Bug 1314955 part C - Make the `binary-component` manifest instruction obsolete: it will continue to be parsed and will report a deprecation notice to the browser console. r=froydnj MozReview-Commit-ID: LqjraYHrbnw
xpcom/components/moz.build
xpcom/components/nsComponentManager.cpp
xpcom/components/nsComponentManager.h
xpcom/components/nsNativeModuleLoader.cpp
xpcom/components/nsNativeModuleLoader.h
--- a/xpcom/components/moz.build
+++ b/xpcom/components/moz.build
@@ -31,17 +31,16 @@ EXPORTS.mozilla += [
 # with plarena.h.
 SOURCES += [
     'nsCategoryManager.cpp',
     'nsComponentManager.cpp',
 ]
 
 UNIFIED_SOURCES += [
     'ManifestParser.cpp',
-    'nsNativeModuleLoader.cpp',
 ]
 
 FINAL_LIBRARY = 'xul'
 
 LOCAL_INCLUDES += [
     '!..',
     '../base',
     '../build',
--- a/xpcom/components/nsComponentManager.cpp
+++ b/xpcom/components/nsComponentManager.cpp
@@ -338,21 +338,16 @@ nsComponentManagerImpl::Init()
 
   nsCOMPtr<nsIFile> greDir =
     GetLocationFromDirectoryService(NS_GRE_DIR);
   nsCOMPtr<nsIFile> appDir =
     GetLocationFromDirectoryService(NS_XPCOM_CURRENT_PROCESS_DIR);
 
   InitializeStaticModules();
 
-  nsresult rv = mNativeModuleLoader.Init();
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-
   nsCategoryManager::GetSingleton()->SuppressNotifications(true);
 
   RegisterModule(&kXPCOMModule, nullptr);
 
   for (uint32_t i = 0; i < sStaticModules->Length(); ++i) {
     RegisterModule((*sStaticModules)[i], nullptr);
   }
 
@@ -627,41 +622,19 @@ nsComponentManagerImpl::ManifestManifest
   RegisterManifest(aCx.mType, f, aCx.mChromeOnly);
 }
 
 void
 nsComponentManagerImpl::ManifestBinaryComponent(ManifestProcessingContext& aCx,
                                                 int aLineNo,
                                                 char* const* aArgv)
 {
-  if (aCx.mFile.IsZip()) {
-    NS_WARNING("Cannot load binary components from a jar.");
-    LogMessageWithContext(aCx.mFile, aLineNo,
-                          "Cannot load binary components from a jar.");
-    return;
-  }
-
-  FileLocation f(aCx.mFile, aArgv[0]);
-  nsCString uri;
-  f.GetURIString(uri);
-
-  if (mKnownModules.Get(uri)) {
-    NS_WARNING("Attempting to register a binary component twice.");
-    LogMessageWithContext(aCx.mFile, aLineNo,
-                          "Attempting to register a binary component twice.");
-    return;
-  }
-
-  const mozilla::Module* m = mNativeModuleLoader.LoadModule(f);
-  // The native module loader should report an error here, we don't have to
-  if (!m) {
-    return;
-  }
-
-  RegisterModule(m, &f);
+  LogMessageWithContext(aCx.mFile, aLineNo,
+                        "Binary XPCOM components are no longer supported.");
+  return;
 }
 
 static void
 DoRegisterXPT(FileLocation& aFile)
 {
   uint32_t len;
   FileLocation::Data data;
   UniquePtr<char[]> buf;
@@ -878,19 +851,16 @@ nsresult nsComponentManagerImpl::Shutdow
   mFactories.Clear(); // XXX release the objects, don't just clear
   mLoaderMap.Clear();
   mKnownModules.Clear();
   mKnownStaticModules.Clear();
 
   delete sStaticModules;
   delete sModuleLocations;
 
-  // Unload libraries
-  mNativeModuleLoader.UnloadLibraries();
-
   // delete arena for strings and small objects
   PL_FinishArenaPool(&mArena);
 
   mStatus = SHUTDOWN_COMPLETE;
 
   MOZ_LOG(nsComponentManagerLog, LogLevel::Debug,
          ("nsComponentManager: Shutdown complete."));
 
@@ -1806,17 +1776,16 @@ nsComponentManagerImpl::SizeOfIncludingT
   n += mPendingServices.ShallowSizeOfExcludingThis(aMallocSizeOf);
 
   // Measurement of the following members may be added later if DMD finds it is
   // worthwhile:
   // - mLoaderMap's keys and values
   // - mMon
   // - sStaticModules' entries
   // - sModuleLocations' entries
-  // - mNativeModuleLoader
   // - mKnownStaticModules' entries?
   // - mKnownModules' keys and values?
 
   return n;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // nsFactoryEntry
--- a/xpcom/components/nsComponentManager.h
+++ b/xpcom/components/nsComponentManager.h
@@ -16,17 +16,16 @@
 #include "nsIServiceManager.h"
 #include "nsIFile.h"
 #include "mozilla/Atomics.h"
 #include "mozilla/MemoryReporting.h"
 #include "mozilla/Module.h"
 #include "mozilla/ModuleLoader.h"
 #include "mozilla/Mutex.h"
 #include "nsXULAppAPI.h"
-#include "nsNativeModuleLoader.h"
 #include "nsIFactory.h"
 #include "nsIInterfaceRequestor.h"
 #include "nsIInterfaceRequestorUtils.h"
 #include "PLDHashTable.h"
 #include "prtime.h"
 #include "nsCOMPtr.h"
 #include "nsAutoPtr.h"
 #include "nsWeakReference.h"
@@ -189,18 +188,16 @@ public:
     {
       return (aA.type == aB.type && aA.location.Equals(aB.location));
     }
   };
 
   static nsTArray<const mozilla::Module*>* sStaticModules;
   static nsTArray<ComponentLocation>* sModuleLocations;
 
-  nsNativeModuleLoader mNativeModuleLoader;
-
   class KnownModule
   {
   public:
     /**
      * Static or binary module.
      */
     KnownModule(const mozilla::Module* aModule, mozilla::FileLocation& aFile)
       : mModule(aModule)
deleted file mode 100644
--- a/xpcom/components/nsNativeModuleLoader.cpp
+++ /dev/null
@@ -1,220 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- * This Original Code has been modified by IBM Corporation.
- * Modifications made by IBM described herein are
- * Copyright (c) International Business Machines
- * Corporation, 2000
- *
- * Modifications to Mozilla code or documentation
- * identified per MPL Section 3.3
- *
- * Date             Modified by     Description of modification
- * 04/20/2000       IBM Corp.      Added PR_CALLBACK for Optlink use in OS2
- */
-
-#include "nsNativeModuleLoader.h"
-
-#include "mozilla/Logging.h"
-#include "prinit.h"
-#include "prerror.h"
-
-#include "nsComponentManager.h"
-#include "ManifestParser.h" // for LogMessage
-#include "nsCRTGlue.h"
-#include "nsThreadUtils.h"
-#include "nsTraceRefcnt.h"
-
-#include "nsIFile.h"
-#include "mozilla/WindowsDllBlocklist.h"
-
-#ifdef XP_WIN
-#include <windows.h>
-#endif
-
-#ifdef XP_MACOSX
-#include <signal.h>
-#endif
-
-#ifdef DEBUG
-#define IMPLEMENT_BREAK_AFTER_LOAD
-#endif
-
-using namespace mozilla;
-
-static LazyLogModule sNativeModuleLoaderLog("nsNativeModuleLoader");
-#define LOG(level, args) MOZ_LOG(sNativeModuleLoaderLog, level, args)
-
-nsresult
-nsNativeModuleLoader::Init()
-{
-  MOZ_ASSERT(NS_IsMainThread(), "Startup not on main thread?");
-  LOG(LogLevel::Debug, ("nsNativeModuleLoader::Init()"));
-  return NS_OK;
-}
-
-class LoadModuleMainThreadRunnable : public Runnable
-{
-public:
-  LoadModuleMainThreadRunnable(nsNativeModuleLoader* aLoader,
-                               FileLocation& aFile)
-    : mManager(nsComponentManagerImpl::gComponentManager)
-    , mLoader(aLoader)
-    , mFile(aFile)
-    , mResult(nullptr)
-  {
-  }
-
-  NS_IMETHOD Run() override
-  {
-    mResult = mLoader->LoadModule(mFile);
-    return NS_OK;
-  }
-
-  RefPtr<nsComponentManagerImpl> mManager;
-  nsNativeModuleLoader* mLoader;
-  FileLocation mFile;
-  const mozilla::Module* mResult;
-};
-
-const mozilla::Module*
-nsNativeModuleLoader::LoadModule(FileLocation& aFile)
-{
-  if (aFile.IsZip()) {
-    NS_ERROR("Binary components cannot be loaded from JARs");
-    return nullptr;
-  }
-  nsCOMPtr<nsIFile> file = aFile.GetBaseFile();
-  nsresult rv;
-
-  if (!NS_IsMainThread()) {
-    // If this call is off the main thread, synchronously proxy it
-    // to the main thread.
-    RefPtr<LoadModuleMainThreadRunnable> r =
-      new LoadModuleMainThreadRunnable(this, aFile);
-    NS_DispatchToMainThread(r, NS_DISPATCH_SYNC);
-    return r->mResult;
-  }
-
-  nsCOMPtr<nsIHashable> hashedFile(do_QueryInterface(file));
-  if (!hashedFile) {
-    NS_ERROR("nsIFile is not nsIHashable");
-    return nullptr;
-  }
-
-  nsAutoCString filePath;
-  file->GetNativePath(filePath);
-
-  NativeLoadData data;
-
-  if (mLibraries.Get(hashedFile, &data)) {
-    NS_ASSERTION(data.mModule, "Corrupt mLibraries hash");
-    LOG(LogLevel::Debug,
-        ("nsNativeModuleLoader::LoadModule(\"%s\") - found in cache",
-         filePath.get()));
-    return data.mModule;
-  }
-
-  // We haven't loaded this module before
-  {
-#ifdef HAS_DLL_BLOCKLIST
-    AutoSetXPCOMLoadOnMainThread guard;
-#endif
-    rv = file->Load(&data.mLibrary);
-  }
-
-  if (NS_FAILED(rv)) {
-    char errorMsg[1024] = "<unknown; can't get error from NSPR>";
-
-    if (PR_GetErrorTextLength() < (int)sizeof(errorMsg)) {
-      PR_GetErrorText(errorMsg);
-    }
-
-    LogMessage("Failed to load native module at path '%s': (%lx) %s",
-               filePath.get(), rv, errorMsg);
-
-    return nullptr;
-  }
-
-#ifdef IMPLEMENT_BREAK_AFTER_LOAD
-  nsAutoCString leafName;
-  file->GetNativeLeafName(leafName);
-
-  char* env = getenv("XPCOM_BREAK_ON_LOAD");
-  char* blist;
-  if (env && *env && (blist = strdup(env))) {
-    char* nextTok = blist;
-    while (char* token = NS_strtok(":", &nextTok)) {
-      if (leafName.Find(token, true) != kNotFound) {
-        NS_BREAK();
-      }
-    }
-
-    free(blist);
-  }
-#endif
-
-  void* module = PR_FindSymbol(data.mLibrary, "NSModule");
-  if (!module) {
-    LogMessage("Native module at path '%s' doesn't export symbol `NSModule`.",
-               filePath.get());
-    PR_UnloadLibrary(data.mLibrary);
-    return nullptr;
-  }
-
-  data.mModule = *(mozilla::Module const* const*)module;
-  if (mozilla::Module::kVersion != data.mModule->mVersion) {
-    LogMessage("Native module at path '%s' is incompatible with this version of Firefox, has version %i, expected %i.",
-               filePath.get(), data.mModule->mVersion,
-               mozilla::Module::kVersion);
-    PR_UnloadLibrary(data.mLibrary);
-    return nullptr;
-  }
-
-  mLibraries.Put(hashedFile, data); // infallible
-  return data.mModule;
-}
-
-void
-nsNativeModuleLoader::UnloadLibraries()
-{
-  MOZ_ASSERT(NS_IsMainThread(), "Shutdown not on main thread?");
-
-  for (auto iter = mLibraries.Iter(); !iter.Done(); iter.Next()) {
-    NativeLoadData& loadData = iter.Data();
-    loadData.mModule = nullptr;
-  }
-
-  for (auto iter = mLibraries.Iter(); !iter.Done(); iter.Next()) {
-    if (MOZ_LOG_TEST(sNativeModuleLoaderLog, LogLevel::Debug)) {
-      nsIHashable* hashedFile = iter.Key();
-      nsCOMPtr<nsIFile> file(do_QueryInterface(hashedFile));
-
-      nsAutoCString filePath;
-      file->GetNativePath(filePath);
-
-      LOG(LogLevel::Debug,
-          ("nsNativeModuleLoader::UnloaderFunc(\"%s\")", filePath.get()));
-    }
-
-#ifdef NS_BUILD_REFCNT_LOGGING
-    nsTraceRefcnt::SetActivityIsLegal(false);
-#endif
-
-#if 0
-    // XXXbsmedberg: do this as soon as the static-destructor crash(es)
-    // are fixed
-    NativeLoadData& loadData = iter.Data();
-    PRStatus ret = PR_UnloadLibrary(loadData.mLibrary);
-    NS_ASSERTION(ret == PR_SUCCESS, "Failed to unload library");
-#endif
-
-#ifdef NS_BUILD_REFCNT_LOGGING
-    nsTraceRefcnt::SetActivityIsLegal(true);
-#endif
-
-    iter.Remove();
-  }
-}
deleted file mode 100644
--- a/xpcom/components/nsNativeModuleLoader.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef nsNativeModuleLoader_h__
-#define nsNativeModuleLoader_h__
-
-#include "nsDataHashtable.h"
-#include "nsHashKeys.h"
-#include "prlink.h"
-
-namespace mozilla {
-class FileLocation;
-} // namespace mozilla
-
-class nsNativeModuleLoader final
-{
-public:
-  const mozilla::Module* LoadModule(mozilla::FileLocation& aFile);
-
-  nsresult Init();
-
-  void UnloadLibraries();
-
-private:
-  struct NativeLoadData
-  {
-    NativeLoadData() : mModule(nullptr), mLibrary(nullptr) {}
-
-    const mozilla::Module* mModule;
-    PRLibrary* mLibrary;
-  };
-
-  nsDataHashtable<nsHashableHashKey, NativeLoadData> mLibraries;
-};
-
-#endif /* nsNativeModuleLoader_h__ */