diff --git a/image/decoders/icon/moz.build b/image/decoders/icon/moz.build index 9ff31faaaac..b72920ac996 100644 --- a/image/decoders/icon/moz.build +++ b/image/decoders/icon/moz.build @@ -10,6 +10,10 @@ XPIDL_SOURCES += [ XPIDL_MODULE = 'imgicon' +EXPORTS += [ + 'nsIconURI.h', +] + UNIFIED_SOURCES += [ 'nsIconModule.cpp', 'nsIconProtocolHandler.cpp', @@ -20,6 +24,8 @@ FAIL_ON_WARNINGS = True FINAL_LIBRARY = 'xul' +include('/ipc/chromium/chromium-config.mozbuild') + platform = None if CONFIG['MOZ_WIDGET_GTK']: diff --git a/image/decoders/icon/nsIconURI.cpp b/image/decoders/icon/nsIconURI.cpp index 748b9bed90d..628eb3153e2 100644 --- a/image/decoders/icon/nsIconURI.cpp +++ b/image/decoders/icon/nsIconURI.cpp @@ -1,4 +1,5 @@ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * vim: set sw=2 sts=2 ts=2 et 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 @@ -6,6 +7,8 @@ #include "mozilla/ArrayUtils.h" +#include "mozilla/ipc/URIUtils.h" + #include "nsIconURI.h" #include "nsNetUtil.h" #include "nsIIOService.h" @@ -15,6 +18,7 @@ #include using namespace mozilla; +using namespace mozilla::ipc; #define DEFAULT_IMAGE_SIZE 16 @@ -59,7 +63,7 @@ nsMozIconURI::nsMozIconURI() nsMozIconURI::~nsMozIconURI() { } -NS_IMPL_ISUPPORTS(nsMozIconURI, nsIMozIconURI, nsIURI) +NS_IMPL_ISUPPORTS(nsMozIconURI, nsIMozIconURI, nsIURI, nsIIPCSerializableURI) #define MOZICON_SCHEME "moz-icon:" #define MOZICON_SCHEME_LEN (sizeof(MOZICON_SCHEME) - 1) @@ -582,3 +586,59 @@ nsMozIconURI::GetIconState(nsACString& aState) return NS_OK; } //////////////////////////////////////////////////////////////////////////////// +// nsIIPCSerializableURI methods: + +void +nsMozIconURI::Serialize(URIParams& aParams) +{ + IconURIParams params; + + if (mIconURL) { + URIParams iconURLParams; + SerializeURI(mIconURL, iconURLParams); + if (iconURLParams.type() == URIParams::T__None) { + // Serialization failed, bail. + return; + } + + params.uri() = iconURLParams; + } else { + params.uri() = void_t(); + } + + params.size() = mSize; + params.fileName() = mFileName; + params.stockIcon() = mStockIcon; + params.iconSize() = mIconSize; + params.iconState() = mIconState; + + aParams = params; +} + +bool +nsMozIconURI::Deserialize(const URIParams& aParams) +{ + if (aParams.type() != URIParams::TIconURIParams) { + MOZ_ASSERT_UNREACHABLE("Received unknown URI from other process!"); + return false; + } + + const IconURIParams& params = aParams.get_IconURIParams(); + if (params.uri().type() != OptionalURIParams::Tvoid_t) { + nsCOMPtr uri = DeserializeURI(params.uri().get_URIParams()); + mIconURL = do_QueryInterface(uri); + if (!mIconURL) { + MOZ_ASSERT_UNREACHABLE("bad nsIURI passed"); + return false; + } + } + + mSize = params.size(); + mContentType = params.contentType(); + mFileName = params.fileName(); + mStockIcon = params.stockIcon(); + mIconSize = params.iconSize(); + mIconState = params.iconState(); + + return true; +} diff --git a/image/decoders/icon/nsIconURI.h b/image/decoders/icon/nsIconURI.h index 5bbaa79b68f..e5bc15655e5 100644 --- a/image/decoders/icon/nsIconURI.h +++ b/image/decoders/icon/nsIconURI.h @@ -10,6 +10,7 @@ #include "nsIIconURI.h" #include "nsCOMPtr.h" #include "nsString.h" +#include "nsIIPCSerializableURI.h" #define NS_MOZICONURI_CID \ { \ @@ -20,11 +21,13 @@ } class nsMozIconURI MOZ_FINAL : public nsIMozIconURI + , public nsIIPCSerializableURI { public: NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIURI NS_DECL_NSIMOZICONURI + NS_DECL_NSIIPCSERIALIZABLEURI // nsMozIconURI nsMozIconURI(); diff --git a/ipc/glue/URIParams.ipdlh b/ipc/glue/URIParams.ipdlh index ec9acbc67af..997456d2a6c 100644 --- a/ipc/glue/URIParams.ipdlh +++ b/ipc/glue/URIParams.ipdlh @@ -53,11 +53,23 @@ struct JARURIParams nsCString charset; }; +struct IconURIParams +{ + OptionalURIParams uri; + uint32_t size; + nsCString contentType; + nsCString fileName; + nsCString stockIcon; + int32_t iconSize; + int32_t iconState; +}; + union URIParams { SimpleURIParams; StandardURLParams; JARURIParams; + IconURIParams; }; union OptionalURIParams diff --git a/ipc/glue/URIUtils.cpp b/ipc/glue/URIUtils.cpp index a9b60f73d99..6bcb2872dd3 100644 --- a/ipc/glue/URIUtils.cpp +++ b/ipc/glue/URIUtils.cpp @@ -12,6 +12,7 @@ #include "nsDebug.h" #include "nsID.h" #include "nsJARURI.h" +#include "nsIconURI.h" #include "nsNetCID.h" #include "nsNetUtil.h" #include "nsThreadUtils.h" @@ -84,6 +85,10 @@ DeserializeURI(const URIParams& aParams) serializable = do_CreateInstance(kJARURICID); break; + case URIParams::TIconURIParams: + serializable = new nsMozIconURI(); + break; + default: MOZ_CRASH("Unknown params!"); }