diff options
Diffstat (limited to 'image/build')
-rw-r--r-- | image/build/components.conf | 85 | ||||
-rw-r--r-- | image/build/moz.build | 26 | ||||
-rw-r--r-- | image/build/nsImageModule.cpp | 88 | ||||
-rw-r--r-- | image/build/nsImageModule.h | 20 |
4 files changed, 219 insertions, 0 deletions
diff --git a/image/build/components.conf b/image/build/components.conf new file mode 100644 index 0000000000..182d1cd1af --- /dev/null +++ b/image/build/components.conf @@ -0,0 +1,85 @@ +# -*- 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/. + +Headers = [ + '/image/build/nsImageModule.h', +] + +InitFunc = 'mozilla::image::EnsureModuleInitialized' +# This is called by LayoutModuleDtor to ensure it happens at the right time +# during shutdown. +# UnloadFunc = 'mozilla::image::ShutdownModule' + +Classes = [ + # XXX We would like to get rid of the imgLoader factory constructor. See the + # comment documenting the imgLoader constructor. + { + 'cid': '{c1354898-e3fe-4602-88a7-c4520c21cb4e}', + 'contract_ids': [ + '@mozilla.org/image/cache;1', + '@mozilla.org/image/loader;1', + ], + 'type': 'imgLoader', + 'headers': ['imgLoader.h'], + 'init_method': 'Init', + 'categories': { + 'content-sniffing-services': '@mozilla.org/image/loader;1', + 'orb-content-sniffers': '@mozilla.org/image/loader;1', + 'net-and-orb-content-sniffers': '@mozilla.org/image/loader;1', + }, + }, + { + 'cid': '{f6fcd651-164b-4416-b001-9c8c393fd93b}', + 'contract_ids': [ + '@mozilla.org/image-blocker-content-policy;1', + ], + 'type': 'mozilla::image::ImageBlocker', + 'headers': ['ImageBlocker.h'], + 'categories': {'content-policy': '@mozilla.org/image-blocker-content-policy;1'}, + }, + { + 'cid': '{20557898-1dd2-11b2-8f65-9c462ee2bc95}', + 'contract_ids': ['@mozilla.org/image/request;1'], + 'type': 'imgRequestProxy', + 'headers': ['imgRequestProxy.h'], + }, + { + 'cid': '{3d8fa16d-c9e1-4b50-bdef-2c7ae249967a}', + 'contract_ids': ['@mozilla.org/image/tools;1'], + 'type': 'mozilla::image::imgTools', + 'headers': ['/image/imgTools.h'], + }, + { + 'cid': '{13a5320c-4c91-4fa4-bd16-b081a3ba8c0b}', + 'contract_ids': ['@mozilla.org/image/encoder;2?type=image/bmp'], + 'type': 'nsBMPEncoder', + 'headers': ['/image/encoders/bmp/nsBMPEncoder.h'], + }, + { + 'cid': '{92ae3ab2-8968-41b1-8709-b6123bceaf21}', + 'contract_ids': ['@mozilla.org/image/encoder;2?type=image/vnd.microsoft.icon'], + 'type': 'nsICOEncoder', + 'headers': ['/image/encoders/ico/nsICOEncoder.h'], + }, + { + 'cid': '{ac2bb8fe-eeeb-4572-b40f-be03932b56e0}', + 'contract_ids': ['@mozilla.org/image/encoder;2?type=image/jpeg'], + 'type': 'nsJPEGEncoder', + 'headers': ['/image/encoders/jpeg/nsJPEGEncoder.h'], + }, + { + 'cid': '{38d1592e-b81e-432b-86f8-471878bbfe07}', + 'contract_ids': ['@mozilla.org/image/encoder;2?type=image/png'], + 'type': 'nsPNGEncoder', + 'headers': ['/image/encoders/png/nsPNGEncoder.h'], + }, + { + 'cid': '{a8e5a8e5-bebf-4512-9f50-e41e4748ce28}', + 'contract_ids': ['@mozilla.org/image/encoder;2?type=image/webp'], + 'type': 'nsWebPEncoder', + 'headers': ['/image/encoders/webp/nsWebPEncoder.h'], + }, +] diff --git a/image/build/moz.build b/image/build/moz.build new file mode 100644 index 0000000000..7ba10e42b9 --- /dev/null +++ b/image/build/moz.build @@ -0,0 +1,26 @@ +# -*- 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/. + +EXPORTS += [ + "nsImageModule.h", +] + +SOURCES += [ + "nsImageModule.cpp", +] + +XPCOM_MANIFESTS += [ + "components.conf", +] + +FINAL_LIBRARY = "xul" +LOCAL_INCLUDES += [ + "/image", + "/image/encoders/bmp", + "/image/encoders/ico", + "/image/encoders/jpeg", + "/image/encoders/png", +] diff --git a/image/build/nsImageModule.cpp b/image/build/nsImageModule.cpp new file mode 100644 index 0000000000..28fb8bb330 --- /dev/null +++ b/image/build/nsImageModule.cpp @@ -0,0 +1,88 @@ +/* -*- 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 UpdateContentViewerRegistration(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}; + static ImageEnablementCookie kWebPCookie = { + mozilla::StaticPrefs::image_webp_enabled, "image/webp"_ns}; + Preferences::RegisterCallbackAndCall(UpdateContentViewerRegistration, + "image.avif.enabled", &kAVIFCookie); + Preferences::RegisterCallbackAndCall(UpdateContentViewerRegistration, + "image.jxl.enabled", &kJXLCookie); + Preferences::RegisterCallbackAndCall(UpdateContentViewerRegistration, + "image.webp.enabled", &kWebPCookie); + + 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; +} diff --git a/image/build/nsImageModule.h b/image/build/nsImageModule.h new file mode 100644 index 0000000000..130e59b868 --- /dev/null +++ b/image/build/nsImageModule.h @@ -0,0 +1,20 @@ +/* -*- 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/. */ + +#ifndef mozilla_image_build_nsImageModule_h +#define mozilla_image_build_nsImageModule_h + +#include "nsError.h" + +namespace mozilla { +namespace image { + +nsresult EnsureModuleInitialized(); +void ShutdownModule(); + +} /* namespace image */ +} /* namespace mozilla */ + +#endif // mozilla_image_build_nsImageModule_h |