Bug 1583044: Make nsMozIconURI serializeable. r=valentin

Differential Revision: https://phabricator.services.mozilla.com/D49442

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Christoph Kerschbaumer 2019-10-18 10:49:55 +00:00
Родитель 5f72da5f69
Коммит 89195abaf2
6 изменённых файлов: 136 добавлений и 8 удалений

Просмотреть файл

@ -0,0 +1,12 @@
<html>
<head>
<title>
Bug 1583044
</title>
</head>
<body>
<script>
window.location.href="moz-icon://.pdf?size=128";
</script>
</body>
</html>

Просмотреть файл

@ -0,0 +1 @@
load 1583044.html

Просмотреть файл

@ -12,6 +12,9 @@
#include "mozilla/Sprintf.h"
#include "nsIIOService.h"
#include "nsISerializable.h"
#include "nsIObjectInputStream.h"
#include "nsIObjectOutputStream.h"
#include "nsIURL.h"
#include "nsNetUtil.h"
#include "plstr.h"
@ -30,6 +33,10 @@ using namespace mozilla::ipc;
# define SANE_FILE_NAME_LEN 1024
#endif
static NS_DEFINE_CID(kThisIconURIImplementationCID,
NS_THIS_ICONURI_IMPLEMENTATION_CID);
static NS_DEFINE_CID(kIconURICID, NS_ICONURI_CID);
// helper function for parsing out attributes like size, and contentType
// from the icon url.
static void extractAttributeValue(const char* aSearchString,
@ -51,11 +58,14 @@ nsMozIconURI::~nsMozIconURI() {}
NS_IMPL_ADDREF(nsMozIconURI)
NS_IMPL_RELEASE(nsMozIconURI)
NS_INTERFACE_MAP_BEGIN(nsMozIconURI)
NS_INTERFACE_MAP_ENTRY(nsIMozIconURI)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIURI)
NS_INTERFACE_MAP_ENTRY(nsIURI)
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsINestedURI, mIconURL)
NS_INTERFACE_TABLE_HEAD(nsMozIconURI)
NS_INTERFACE_TABLE(nsMozIconURI, nsIMozIconURI, nsIURI, nsISerializable,
nsIClassInfo)
NS_INTERFACE_TABLE_TO_MAP_SEGUE
if (aIID.Equals(kThisIconURIImplementationCID))
foundInterface = static_cast<nsIURI*>(this);
else if (aIID.Equals(NS_GET_IID(nsINestedURI)) && mIconURL)
foundInterface = static_cast<nsINestedURI*>(this);
NS_INTERFACE_MAP_END
#define MOZICON_SCHEME "moz-icon:"
@ -132,7 +142,8 @@ nsMozIconURI::GetHasRef(bool* result) {
return NS_OK;
}
NS_IMPL_ISUPPORTS(nsMozIconURI::Mutator, nsIURISetters, nsIURIMutator)
NS_IMPL_NSIURIMUTATOR_ISUPPORTS(nsMozIconURI::Mutator, nsIURISetters,
nsIURIMutator, nsISerializable)
NS_IMETHODIMP
nsMozIconURI::Mutate(nsIURIMutator** aMutator) {
@ -617,3 +628,74 @@ NS_IMETHODIMP
nsMozIconURI::GetInnermostURI(nsIURI** aURI) {
return NS_ImplGetInnermostURI(this, aURI);
}
NS_IMETHODIMP
nsMozIconURI::Read(nsIObjectInputStream* aStream) {
MOZ_ASSERT_UNREACHABLE("Use nsIURIMutator.read() instead");
return NS_ERROR_NOT_IMPLEMENTED;
}
nsresult nsMozIconURI::ReadPrivate(nsIObjectInputStream* aStream) {
nsAutoCString spec;
nsresult rv = aStream->ReadCString(spec);
NS_ENSURE_SUCCESS(rv, rv);
return SetSpecInternal(spec);
}
NS_IMETHODIMP
nsMozIconURI::Write(nsIObjectOutputStream* aStream) {
nsAutoCString spec;
nsresult rv = GetSpec(spec);
NS_ENSURE_SUCCESS(rv, rv);
return aStream->WriteStringZ(spec.get());
}
//----------------------------------------------------------------------------
// nsSimpleURI::nsIClassInfo
//----------------------------------------------------------------------------
NS_IMETHODIMP
nsMozIconURI::GetInterfaces(nsTArray<nsIID>& array) {
array.Clear();
return NS_OK;
}
NS_IMETHODIMP
nsMozIconURI::GetScriptableHelper(nsIXPCScriptable** _retval) {
*_retval = nullptr;
return NS_OK;
}
NS_IMETHODIMP
nsMozIconURI::GetContractID(nsACString& aContractID) {
// Make sure to modify any subclasses as needed if this ever
// changes.
aContractID.SetIsVoid(true);
return NS_OK;
}
NS_IMETHODIMP
nsMozIconURI::GetClassDescription(nsACString& aClassDescription) {
aClassDescription.SetIsVoid(true);
return NS_OK;
}
NS_IMETHODIMP
nsMozIconURI::GetClassID(nsCID** aClassID) {
// Make sure to modify any subclasses as needed if this ever
// changes to not call the virtual GetClassIDNoAlloc.
*aClassID = (nsCID*)moz_xmalloc(sizeof(nsCID));
return GetClassIDNoAlloc(*aClassID);
}
NS_IMETHODIMP
nsMozIconURI::GetFlags(uint32_t* aFlags) {
*aFlags = nsIClassInfo::MAIN_THREAD_ONLY;
return NS_OK;
}
NS_IMETHODIMP
nsMozIconURI::GetClassIDNoAlloc(nsCID* aClassIDNoAlloc) {
*aClassIDNoAlloc = kIconURICID;
return NS_OK;
}

Просмотреть файл

@ -10,19 +10,32 @@
#include "nsIIconURI.h"
#include "nsCOMPtr.h"
#include "nsString.h"
#include "nsIClassInfo.h"
#include "nsINestedURI.h"
#include "nsIURIMutator.h"
#define NS_THIS_ICONURI_IMPLEMENTATION_CID \
{ /* 0b9bb0c2-fee6-470b-b9b9-9fd9462b5e19 */ \
0x5c3e417f, 0xb686, 0x4105, { \
0x86, 0xe7, 0xf9, 0x1b, 0xac, 0x97, 0x4d, 0x5c \
} \
}
namespace mozilla {
class Encoding;
}
class nsMozIconURI final : public nsIMozIconURI, public nsINestedURI {
class nsMozIconURI final : public nsIMozIconURI,
public nsINestedURI,
public nsISerializable,
public nsIClassInfo {
public:
NS_DECL_THREADSAFE_ISUPPORTS
NS_DECL_NSIURI
NS_DECL_NSIMOZICONURI
NS_DECL_NSINESTEDURI
NS_DECL_NSISERIALIZABLE
NS_DECL_NSICLASSINFO
protected:
nsMozIconURI();
@ -56,14 +69,25 @@ class nsMozIconURI final : public nsIMozIconURI, public nsINestedURI {
nsresult SetQuery(const nsACString& input);
nsresult SetQueryWithEncoding(const nsACString& input,
const mozilla::Encoding* encoding);
nsresult ReadPrivate(nsIObjectInputStream* stream);
bool Deserialize(const mozilla::ipc::URIParams&);
public:
class Mutator final : public nsIURIMutator,
public BaseURIMutator<nsMozIconURI> {
public BaseURIMutator<nsMozIconURI>,
public nsISerializable {
NS_DECL_ISUPPORTS
NS_FORWARD_SAFE_NSIURISETTERS_RET(mURI)
NS_IMETHOD
Write(nsIObjectOutputStream* aOutputStream) override {
return NS_ERROR_NOT_IMPLEMENTED;
}
MOZ_MUST_USE NS_IMETHOD Read(nsIObjectInputStream* aStream) override {
return InitFromInputStream(aStream);
}
NS_IMETHOD Deserialize(const mozilla::ipc::URIParams& aParams) override {
return InitFromIPCParams(aParams);
}

Просмотреть файл

@ -59,6 +59,14 @@
} \
}
// component implementing nsIURI, nsISerializable, and nsIClassInfo.
#define NS_ICONURI_CID \
{ /* 1460df3b-774c-4205-8349-838e507c3ef9 */ \
0x1460df3b, 0x774c, 0x4205, { \
0x83, 0x49, 0x83, 0x8e, 0x50, 0x7c, 0x3e, 0xf9 \
} \
}
#define NS_SIMPLEURIMUTATOR_CONTRACTID \
"@mozilla.org/network/simple-uri-mutator;1"
#define NS_SIMPLEURIMUTATOR_CID \

Просмотреть файл

@ -25,6 +25,7 @@ skip-if(!webrtc) include ../../dom/media/tests/crashtests/crashtests.list
include ../../dom/media/webspeech/synth/crashtests/crashtests.list
include ../../dom/offline/crashtests/crashtests.list
include ../../dom/plugins/test/crashtests/crashtests.list
include ../../dom/security/test/crashtests/crashtests.list
include ../../dom/smil/crashtests/crashtests.list
include ../../dom/svg/crashtests/crashtests.list
include ../../dom/workers/test/crashtests/crashtests.list