diff --git a/mozilla/content/html/content/src/nsGenericHTMLElement.cpp b/mozilla/content/html/content/src/nsGenericHTMLElement.cpp
index 6b56cd33e45..44a96025745 100644
--- a/mozilla/content/html/content/src/nsGenericHTMLElement.cpp
+++ b/mozilla/content/html/content/src/nsGenericHTMLElement.cpp
@@ -1733,7 +1733,7 @@ nsGenericHTMLElement::GetPrimaryPresState(nsGenericHTMLElement* aContent,
nsCOMPtr history;
nsCAutoString key;
- GetLayoutHistoryAndKey(aContent, getter_AddRefs(history), key);
+ GetLayoutHistoryAndKey(aContent, PR_FALSE, getter_AddRefs(history), key);
if (history) {
// Get the pres state for this key, if it doesn't exist, create one
@@ -1752,6 +1752,7 @@ nsGenericHTMLElement::GetPrimaryPresState(nsGenericHTMLElement* aContent,
nsresult
nsGenericHTMLElement::GetLayoutHistoryAndKey(nsGenericHTMLElement* aContent,
+ PRBool aRead,
nsILayoutHistoryState** aHistory,
nsACString& aKey)
{
@@ -1771,6 +1772,11 @@ nsGenericHTMLElement::GetLayoutHistoryAndKey(nsGenericHTMLElement* aContent,
return NS_OK;
}
+ if (aRead && !(*aHistory)->HasStates()) {
+ NS_RELEASE(*aHistory);
+ return NS_OK;
+ }
+
//
// Get the state key
//
@@ -1801,7 +1807,8 @@ nsGenericHTMLElement::RestoreFormControlState(nsGenericHTMLElement* aContent,
{
nsCOMPtr history;
nsCAutoString key;
- nsresult rv = GetLayoutHistoryAndKey(aContent, getter_AddRefs(history), key);
+ nsresult rv = GetLayoutHistoryAndKey(aContent, PR_TRUE,
+ getter_AddRefs(history), key);
if (!history) {
return PR_FALSE;
}
diff --git a/mozilla/content/html/content/src/nsGenericHTMLElement.h b/mozilla/content/html/content/src/nsGenericHTMLElement.h
index b497be39526..644bff7df19 100644
--- a/mozilla/content/html/content/src/nsGenericHTMLElement.h
+++ b/mozilla/content/html/content/src/nsGenericHTMLElement.h
@@ -527,10 +527,13 @@ public:
* piece of content.
*
* @param aContent the content to generate the key for
+ * @param aRead if true, won't return a layout history state (and won't
+ * generate a key) if the layout history state is empty.
* @param aState the history state object (out param)
* @param aKey the key (out param)
*/
static nsresult GetLayoutHistoryAndKey(nsGenericHTMLElement* aContent,
+ PRBool aRead,
nsILayoutHistoryState** aState,
nsACString& aKey);
/**
diff --git a/mozilla/layout/base/nsILayoutHistoryState.h b/mozilla/layout/base/nsILayoutHistoryState.h
index 1df07a1da45..52a15dc450a 100644
--- a/mozilla/layout/base/nsILayoutHistoryState.h
+++ b/mozilla/layout/base/nsILayoutHistoryState.h
@@ -50,8 +50,8 @@
class nsPresState;
#define NS_ILAYOUTHISTORYSTATE_IID \
-{0xe6abfb7c, 0x6624, 0x4b4d, \
-{0x9d, 0xfe, 0xea, 0x62, 0xae, 0xfe, 0x03, 0x31}}
+{ 0x99003f0f, 0x7ade, 0x44a1, \
+ { 0x81, 0x74, 0xe3, 0x6a, 0xa5, 0xbb, 0x6b, 0x10 } }
class nsILayoutHistoryState : public nsISupports {
public:
@@ -74,6 +74,11 @@ class nsILayoutHistoryState : public nsISupports {
* Remove the state object for |aKey|.
*/
NS_IMETHOD RemoveState(const nsCString& aKey) = 0;
+
+ /**
+ * Check whether this history has any states in it
+ */
+ NS_IMETHOD_(PRBool) HasStates() const = 0;
};
NS_DEFINE_STATIC_IID_ACCESSOR(nsILayoutHistoryState,
diff --git a/mozilla/layout/base/nsLayoutHistoryState.cpp b/mozilla/layout/base/nsLayoutHistoryState.cpp
index 61ec23edd12..61403f1a922 100644
--- a/mozilla/layout/base/nsLayoutHistoryState.cpp
+++ b/mozilla/layout/base/nsLayoutHistoryState.cpp
@@ -58,6 +58,7 @@ public:
NS_IMETHOD AddState(const nsCString& aKey, nsPresState* aState);
NS_IMETHOD GetState(const nsCString& aKey, nsPresState** aState);
NS_IMETHOD RemoveState(const nsCString& aKey);
+ NS_IMETHOD_(PRBool) HasStates() const;
private:
@@ -116,3 +117,9 @@ nsLayoutHistoryState::RemoveState(const nsCString& aKey)
mStates.Remove(aKey);
return NS_OK;
}
+
+NS_IMETHODIMP_(PRBool)
+nsLayoutHistoryState::HasStates() const
+{
+ return mStates.Count() != 0;
+}