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
--- 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__ */