From c350bf445d426ea53b1872690bf56a26577d98ae Mon Sep 17 00:00:00 2001 From: "bzbarsky%mit.edu" Date: Mon, 17 Sep 2007 22:23:12 +0000 Subject: [PATCH] Fix nsStandardURL serialization/deserialization to properly restore all state. Bug 396389, r+sr=biesi, a=bsmedberg git-svn-id: svn://10.0.0.236/trunk@236163 18797224-902f-48f8-a5cc-f745e15eee43 --- .../document/public/nsIXULPrototypeCache.h | 2 +- mozilla/netwerk/base/src/nsStandardURL.cpp | 35 ++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/mozilla/content/xul/document/public/nsIXULPrototypeCache.h b/mozilla/content/xul/document/public/nsIXULPrototypeCache.h index fd9d41d7332..8d21b835cfb 100644 --- a/mozilla/content/xul/document/public/nsIXULPrototypeCache.h +++ b/mozilla/content/xul/document/public/nsIXULPrototypeCache.h @@ -82,7 +82,7 @@ const char XUL_FASTLOAD_FILE_BASENAME[] = "XUL"; // (opaque to XPCOM FastLoad code) format of XUL-specific XDR serializations. // See also JSXDR_BYTECODE_VERSION in jsxdrapi.h, which tracks incompatible JS // bytecode version changes. -#define XUL_FASTLOAD_FILE_VERSION (0xfeedbeef - 23) +#define XUL_FASTLOAD_FILE_VERSION (0xfeedbeef - 24) #define XUL_SERIALIZATION_BUFFER_SIZE (64 * 1024) #define XUL_DESERIALIZATION_BUFFER_SIZE (8 * 1024) diff --git a/mozilla/netwerk/base/src/nsStandardURL.cpp b/mozilla/netwerk/base/src/nsStandardURL.cpp index caf3903f1ba..5fd59931cdf 100644 --- a/mozilla/netwerk/base/src/nsStandardURL.cpp +++ b/mozilla/netwerk/base/src/nsStandardURL.cpp @@ -2631,6 +2631,10 @@ nsStandardURL::SetMutable(PRBool value) NS_IMETHODIMP nsStandardURL::Read(nsIObjectInputStream *stream) { + NS_PRECONDITION(!mHostA, "Shouldn't have cached ASCII host"); + NS_PRECONDITION(mSpecEncoding == eEncoding_Unknown, + "Shouldn't have spec encoding here"); + nsresult rv; PRUint32 urlType; @@ -2706,9 +2710,30 @@ nsStandardURL::Read(nsIObjectInputStream *stream) PRBool isMutable; rv = stream->ReadBoolean(&isMutable); if (NS_FAILED(rv)) return rv; - + if (isMutable != PR_TRUE && isMutable != PR_FALSE) { + NS_WARNING("Unexpected boolean value"); + return NS_ERROR_UNEXPECTED; + } mMutable = isMutable; + PRBool supportsFileURL; + rv = stream->ReadBoolean(&supportsFileURL); + if (NS_FAILED(rv)) return rv; + if (supportsFileURL != PR_TRUE && supportsFileURL != PR_FALSE) { + NS_WARNING("Unexpected boolean value"); + return NS_ERROR_UNEXPECTED; + } + mSupportsFileURL = supportsFileURL; + + PRUint32 hostEncoding; + rv = stream->Read32(&hostEncoding); + if (NS_FAILED(rv)) return rv; + if (hostEncoding != eEncoding_ASCII && hostEncoding != eEncoding_UTF8) { + NS_WARNING("Unexpected host encoding"); + return NS_ERROR_UNEXPECTED; + } + mHostEncoding = hostEncoding; + return NS_OK; } @@ -2774,6 +2799,14 @@ nsStandardURL::Write(nsIObjectOutputStream *stream) rv = stream->WriteBoolean(mMutable); if (NS_FAILED(rv)) return rv; + rv = stream->WriteBoolean(mSupportsFileURL); + if (NS_FAILED(rv)) return rv; + + rv = stream->Write32(mHostEncoding); + if (NS_FAILED(rv)) return rv; + + // mSpecEncoding and mHostA are just caches that can be recovered as needed. + return NS_OK; }