From 43a97878ce14b72f0981164f87f2e35e14151312 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 11:22:09 +0200 Subject: Adding upstream version 110.0.1. Signed-off-by: Daniel Baumann --- netwerk/base/ProtocolHandlerInfo.cpp | 86 ++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 netwerk/base/ProtocolHandlerInfo.cpp (limited to 'netwerk/base/ProtocolHandlerInfo.cpp') diff --git a/netwerk/base/ProtocolHandlerInfo.cpp b/netwerk/base/ProtocolHandlerInfo.cpp new file mode 100644 index 0000000000..432ff965ce --- /dev/null +++ b/netwerk/base/ProtocolHandlerInfo.cpp @@ -0,0 +1,86 @@ +/* -*- 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/. */ + +#include "ProtocolHandlerInfo.h" +#include "StaticComponents.h" +#include "nsIProtocolHandler.h" + +namespace mozilla::net { + +uint32_t ProtocolHandlerInfo::StaticProtocolFlags() const { + uint32_t flags = mInner.match( + [&](const xpcom::StaticProtocolHandler* handler) { + return handler->mProtocolFlags; + }, + [&](const RuntimeProtocolHandler& handler) { + return handler.mProtocolFlags; + }); +#if !IS_ORIGIN_IS_FULL_SPEC_DEFINED + MOZ_RELEASE_ASSERT(!(flags & nsIProtocolHandler::ORIGIN_IS_FULL_SPEC), + "ORIGIN_IS_FULL_SPEC is unsupported but used"); +#endif + return flags; +} + +int32_t ProtocolHandlerInfo::DefaultPort() const { + return mInner.match( + [&](const xpcom::StaticProtocolHandler* handler) { + return handler->mDefaultPort; + }, + [&](const RuntimeProtocolHandler& handler) { + return handler.mDefaultPort; + }); +} + +nsresult ProtocolHandlerInfo::DynamicProtocolFlags(nsIURI* aURI, + uint32_t* aFlags) const { + MOZ_DIAGNOSTIC_ASSERT(NS_IsMainThread()); + + // If we're querying dynamic flags, we'll need to fetch the actual xpcom + // component in order to check them. + if (HasDynamicFlags()) { + nsCOMPtr handler = Handler(); + if (nsCOMPtr dynamic = + do_QueryInterface(handler)) { + nsresult rv = dynamic->GetFlagsForURI(aURI, aFlags); + NS_ENSURE_SUCCESS(rv, rv); + MOZ_DIAGNOSTIC_ASSERT( + (StaticProtocolFlags() & ~nsIProtocolHandler::DYNAMIC_URI_FLAGS) == + (*aFlags & ~nsIProtocolHandler::DYNAMIC_URI_FLAGS), + "only DYNAMIC_URI_FLAGS may be changed by a " + "nsIProtocolHandlerWithDynamicFlags implementation"); + return NS_OK; + } + } + + // Otherwise, just check against static flags. + *aFlags = StaticProtocolFlags(); + return NS_OK; +} + +bool ProtocolHandlerInfo::HasDynamicFlags() const { + return mInner.match( + [&](const xpcom::StaticProtocolHandler* handler) { + return handler->mHasDynamicFlags; + }, + [&](const RuntimeProtocolHandler&) { return false; }); +} + +already_AddRefed ProtocolHandlerInfo::Handler() const { + MOZ_ASSERT(NS_IsMainThread()); + + nsCOMPtr retval; + mInner.match( + [&](const xpcom::StaticProtocolHandler* handler) { + retval = handler->Module().GetService(); + }, + [&](const RuntimeProtocolHandler& handler) { + retval = handler.mHandler.get(); + }); + return retval.forget(); +} + +} // namespace mozilla::net -- cgit v1.2.3