summaryrefslogtreecommitdiffstats
path: root/image/build/nsImageModule.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'image/build/nsImageModule.cpp')
-rw-r--r--image/build/nsImageModule.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/image/build/nsImageModule.cpp b/image/build/nsImageModule.cpp
new file mode 100644
index 0000000000..b3c70f9bd0
--- /dev/null
+++ b/image/build/nsImageModule.cpp
@@ -0,0 +1,84 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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/. */
+
+#include "nsImageModule.h"
+
+#include "mozilla/ModuleUtils.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/StaticPrefs_image.h"
+
+#include "DecodePool.h"
+#include "ImageFactory.h"
+#include "nsICategoryManager.h"
+#include "nsServiceManagerUtils.h"
+#include "ShutdownTracker.h"
+#include "SurfaceCache.h"
+#include "imgLoader.h"
+
+using namespace mozilla::image;
+
+struct ImageEnablementCookie {
+ bool (*mIsEnabled)();
+ const nsLiteralCString mMimeType;
+};
+
+static void UpdateDocumentViewerRegistration(const char* aPref, void* aData) {
+ auto* cookie = static_cast<ImageEnablementCookie*>(aData);
+
+ nsCOMPtr<nsICategoryManager> catMan =
+ do_GetService(NS_CATEGORYMANAGER_CONTRACTID);
+ if (!catMan) {
+ return;
+ }
+
+ static nsLiteralCString kCategory = "Gecko-Content-Viewers"_ns;
+ static nsLiteralCString kContractId =
+ "@mozilla.org/content/plugin/document-loader-factory;1"_ns;
+
+ if (cookie->mIsEnabled()) {
+ catMan->AddCategoryEntry(kCategory, cookie->mMimeType, kContractId,
+ false /* aPersist */, true /* aReplace */);
+ } else {
+ catMan->DeleteCategoryEntry(
+ kCategory, cookie->mMimeType, false /* aPersist */
+ );
+ }
+}
+
+static bool sInitialized = false;
+nsresult mozilla::image::EnsureModuleInitialized() {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (sInitialized) {
+ return NS_OK;
+ }
+
+ static ImageEnablementCookie kAVIFCookie = {
+ mozilla::StaticPrefs::image_avif_enabled, "image/avif"_ns};
+ static ImageEnablementCookie kJXLCookie = {
+ mozilla::StaticPrefs::image_jxl_enabled, "image/jxl"_ns};
+ Preferences::RegisterCallbackAndCall(UpdateDocumentViewerRegistration,
+ "image.avif.enabled", &kAVIFCookie);
+ Preferences::RegisterCallbackAndCall(UpdateDocumentViewerRegistration,
+ "image.jxl.enabled", &kJXLCookie);
+
+ mozilla::image::ShutdownTracker::Initialize();
+ mozilla::image::ImageFactory::Initialize();
+ mozilla::image::DecodePool::Initialize();
+ mozilla::image::SurfaceCache::Initialize();
+ imgLoader::GlobalInit();
+ sInitialized = true;
+ return NS_OK;
+}
+
+void mozilla::image::ShutdownModule() {
+ if (!sInitialized) {
+ return;
+ }
+ imgLoader::Shutdown();
+ mozilla::image::SurfaceCache::Shutdown();
+ sInitialized = false;
+}