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 draft
authorBenjamin Smedberg <benjamin@smedbergs.us>
Wed, 26 Oct 2016 12:40:42 -0400
changeset 436764 99fc9f2814a0a77b281650447f9f316017080780
parent 436763 f0b3cd9bb028f0738cb66e1ffa750e6b20c201d5
child 436765 ea5a252b4bbe5be07874248e5f6df33395cdaa72
push id35181
push userbsmedberg@mozilla.com
push dateWed, 09 Nov 2016 18:31:33 +0000
reviewersfroydnj
bugs1314955
milestone52.0a1
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__ */