diff --git a/mozilla/docshell/base/nsWebShell.cpp b/mozilla/docshell/base/nsWebShell.cpp index 7795f9b18c9..6e9b9d569d2 100644 --- a/mozilla/docshell/base/nsWebShell.cpp +++ b/mozilla/docshell/base/nsWebShell.cpp @@ -808,16 +808,39 @@ nsWebShell::Embed(nsIContentViewer* aContentViewer, ("nsWebShell::Embed: this=%p aDocViewer=%p aCommand=%s aExtraInfo=%p", this, aContentViewer, aCommand ? aCommand : "", aExtraInfo)); + // + // The following logic is mirrored in nsHTMLDocument::StartDocumentLoad! + // + nsCOMPtr oldMUDV; if (mContentViewer) // && (eCharsetReloadInit!=mCharsetReloadState)) { // get any interesting state from the old content viewer // XXX: it would be far better to just reuse the document viewer , // since we know we're just displaying the same document as before + oldMUDV = do_QueryInterface(mContentViewer); + } + else + { // If we don't have an old content viewer, get state from our parent + // in this block of code, if we get an error result, we return it + // but if we get a null pointer, that's perfectly legal for parent and parentContentViewer + nsCOMPtr parent; + rv = GetParent(*getter_AddRefs(parent)); + if (NS_FAILED(rv)) { return rv; } + if (parent) { + nsCOMPtr parentContentViewer; + rv = parent->GetContentViewer(getter_AddRefs(parentContentViewer)); + if (NS_FAILED(rv)) { return rv; } + if (parentContentViewer) { + oldMUDV = do_QueryInterface(parentContentViewer); + } + } + } + + if (oldMUDV) { PRUnichar *defaultCharset=nsnull; PRUnichar *forceCharset=nsnull; PRUnichar *hintCharset=nsnull; PRInt32 hintCharsetSource; - nsCOMPtr oldMUDV = do_QueryInterface(mContentViewer); nsCOMPtr newMUDV = do_QueryInterface(aContentViewer); if (oldMUDV && newMUDV) { diff --git a/mozilla/webshell/src/nsWebShell.cpp b/mozilla/webshell/src/nsWebShell.cpp index 7795f9b18c9..6e9b9d569d2 100644 --- a/mozilla/webshell/src/nsWebShell.cpp +++ b/mozilla/webshell/src/nsWebShell.cpp @@ -808,16 +808,39 @@ nsWebShell::Embed(nsIContentViewer* aContentViewer, ("nsWebShell::Embed: this=%p aDocViewer=%p aCommand=%s aExtraInfo=%p", this, aContentViewer, aCommand ? aCommand : "", aExtraInfo)); + // + // The following logic is mirrored in nsHTMLDocument::StartDocumentLoad! + // + nsCOMPtr oldMUDV; if (mContentViewer) // && (eCharsetReloadInit!=mCharsetReloadState)) { // get any interesting state from the old content viewer // XXX: it would be far better to just reuse the document viewer , // since we know we're just displaying the same document as before + oldMUDV = do_QueryInterface(mContentViewer); + } + else + { // If we don't have an old content viewer, get state from our parent + // in this block of code, if we get an error result, we return it + // but if we get a null pointer, that's perfectly legal for parent and parentContentViewer + nsCOMPtr parent; + rv = GetParent(*getter_AddRefs(parent)); + if (NS_FAILED(rv)) { return rv; } + if (parent) { + nsCOMPtr parentContentViewer; + rv = parent->GetContentViewer(getter_AddRefs(parentContentViewer)); + if (NS_FAILED(rv)) { return rv; } + if (parentContentViewer) { + oldMUDV = do_QueryInterface(parentContentViewer); + } + } + } + + if (oldMUDV) { PRUnichar *defaultCharset=nsnull; PRUnichar *forceCharset=nsnull; PRUnichar *hintCharset=nsnull; PRInt32 hintCharsetSource; - nsCOMPtr oldMUDV = do_QueryInterface(mContentViewer); nsCOMPtr newMUDV = do_QueryInterface(aContentViewer); if (oldMUDV && newMUDV) {