Fixing printing crash bug 127891. Make the destruction of printing related frames not hide iframe's document viewers. r=rods@netscape.com, sr=rpotts@netscape.com

git-svn-id: svn://10.0.0.236/trunk@119570 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
jst%netscape.com
2002-04-22 23:12:18 +00:00
parent 20f9c744c4
commit 856750ef5c
6 changed files with 148 additions and 38 deletions

View File

@@ -2041,11 +2041,22 @@ DocumentViewerImpl::Show(void)
NS_IMETHODIMP
DocumentViewerImpl::Hide(void)
{
PRBool is_in_print_preview = PR_FALSE;
PRBool is_in_print_mode = PR_FALSE;
GetDoingPrintPreview(&is_in_print_preview);
GetDoingPrint(&is_in_print_mode);
if (is_in_print_preview) {
if (is_in_print_mode) {
// If we, or one of our parents, is in print mode it means we're
// right now returning from print and the layout frame that was
// created for this document is being destroyed. In such a case we
// ignore the Hide() call.
return NS_OK;
}
GetDoingPrintPreview(&is_in_print_mode);
if (is_in_print_mode) {
// If we, or one of our parents, is in print preview mode it means
// we're right now returning from print preview and the layout
// frame that was created for this document is being destroyed. In
@@ -2973,9 +2984,9 @@ DocumentViewerImpl::DonePrintingPages(PrintObject* aPO)
DoProgressForAsIsFrames();
DoProgressForSeparateFrames();
mIsDoingPrinting = PR_FALSE;
delete mPrt;
mPrt = nsnull;
mIsDoingPrinting = PR_FALSE;
NS_IF_RELEASE(mPagePrintTimer);
@@ -8154,6 +8165,49 @@ DocumentViewerImpl::GetGlobalPrintSettings(nsIPrintSettings * *aGlobalPrintSetti
return rv;
}
static void
GetParentWebBrowserPrint(nsISupports *aContainer, nsIWebBrowserPrint **aParent)
{
*aParent = nsnull;
nsCOMPtr<nsIDocShellTreeItem> item(do_QueryInterface(aContainer));
if (item) {
nsCOMPtr<nsIDocShellTreeItem> parent;
item->GetParent(getter_AddRefs(parent));
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(parent));
if (docShell) {
nsCOMPtr<nsIContentViewer> viewer;
docShell->GetContentViewer(getter_AddRefs(viewer));
if (viewer) {
CallQueryInterface(viewer, aParent);
}
}
}
}
/* readonly attribute boolean doingPrint; */
NS_IMETHODIMP
DocumentViewerImpl::GetDoingPrint(PRBool *aDoingPrint)
{
NS_ENSURE_ARG_POINTER(aDoingPrint);
*aDoingPrint = mIsDoingPrinting;
if (!*aDoingPrint) {
nsCOMPtr<nsIWebBrowserPrint> wbp;
GetParentWebBrowserPrint(mContainer, getter_AddRefs(wbp));
if (wbp) {
return wbp->GetDoingPrint(aDoingPrint);
}
}
return NS_OK;
}
/* readonly attribute boolean doingPrintPreview; */
NS_IMETHODIMP
DocumentViewerImpl::GetDoingPrintPreview(PRBool *aDoingPrintPreview)
@@ -8162,21 +8216,8 @@ DocumentViewerImpl::GetDoingPrintPreview(PRBool *aDoingPrintPreview)
*aDoingPrintPreview = mIsDoingPrintPreview;
if (!*aDoingPrintPreview) {
nsCOMPtr<nsIDocShellTreeItem> item(do_QueryInterface(mContainer));
nsCOMPtr<nsIContentViewer> viewer;
if (item) {
nsCOMPtr<nsIDocShellTreeItem> parent;
item->GetParent(getter_AddRefs(parent));
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(parent));
if (docShell) {
docShell->GetContentViewer(getter_AddRefs(viewer));
}
}
nsCOMPtr<nsIWebBrowserPrint> wbp(do_QueryInterface(viewer));
nsCOMPtr<nsIWebBrowserPrint> wbp;
GetParentWebBrowserPrint(mContainer, getter_AddRefs(wbp));
if (wbp) {
return wbp->GetDoingPrintPreview(aDoingPrintPreview);

View File

@@ -75,6 +75,11 @@ interface nsIWebBrowserPrint : nsISupports
*/
readonly attribute nsIPrintSettings currentPrintSettings;
/**
* Returns whether it is in Print mode
*/
readonly attribute boolean doingPrint;
/**
* Returns whether it is in Print Preview mode
*/

View File

@@ -2041,11 +2041,22 @@ DocumentViewerImpl::Show(void)
NS_IMETHODIMP
DocumentViewerImpl::Hide(void)
{
PRBool is_in_print_preview = PR_FALSE;
PRBool is_in_print_mode = PR_FALSE;
GetDoingPrintPreview(&is_in_print_preview);
GetDoingPrint(&is_in_print_mode);
if (is_in_print_preview) {
if (is_in_print_mode) {
// If we, or one of our parents, is in print mode it means we're
// right now returning from print and the layout frame that was
// created for this document is being destroyed. In such a case we
// ignore the Hide() call.
return NS_OK;
}
GetDoingPrintPreview(&is_in_print_mode);
if (is_in_print_mode) {
// If we, or one of our parents, is in print preview mode it means
// we're right now returning from print preview and the layout
// frame that was created for this document is being destroyed. In
@@ -2973,9 +2984,9 @@ DocumentViewerImpl::DonePrintingPages(PrintObject* aPO)
DoProgressForAsIsFrames();
DoProgressForSeparateFrames();
mIsDoingPrinting = PR_FALSE;
delete mPrt;
mPrt = nsnull;
mIsDoingPrinting = PR_FALSE;
NS_IF_RELEASE(mPagePrintTimer);
@@ -8154,6 +8165,49 @@ DocumentViewerImpl::GetGlobalPrintSettings(nsIPrintSettings * *aGlobalPrintSetti
return rv;
}
static void
GetParentWebBrowserPrint(nsISupports *aContainer, nsIWebBrowserPrint **aParent)
{
*aParent = nsnull;
nsCOMPtr<nsIDocShellTreeItem> item(do_QueryInterface(aContainer));
if (item) {
nsCOMPtr<nsIDocShellTreeItem> parent;
item->GetParent(getter_AddRefs(parent));
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(parent));
if (docShell) {
nsCOMPtr<nsIContentViewer> viewer;
docShell->GetContentViewer(getter_AddRefs(viewer));
if (viewer) {
CallQueryInterface(viewer, aParent);
}
}
}
}
/* readonly attribute boolean doingPrint; */
NS_IMETHODIMP
DocumentViewerImpl::GetDoingPrint(PRBool *aDoingPrint)
{
NS_ENSURE_ARG_POINTER(aDoingPrint);
*aDoingPrint = mIsDoingPrinting;
if (!*aDoingPrint) {
nsCOMPtr<nsIWebBrowserPrint> wbp;
GetParentWebBrowserPrint(mContainer, getter_AddRefs(wbp));
if (wbp) {
return wbp->GetDoingPrint(aDoingPrint);
}
}
return NS_OK;
}
/* readonly attribute boolean doingPrintPreview; */
NS_IMETHODIMP
DocumentViewerImpl::GetDoingPrintPreview(PRBool *aDoingPrintPreview)
@@ -8162,21 +8216,8 @@ DocumentViewerImpl::GetDoingPrintPreview(PRBool *aDoingPrintPreview)
*aDoingPrintPreview = mIsDoingPrintPreview;
if (!*aDoingPrintPreview) {
nsCOMPtr<nsIDocShellTreeItem> item(do_QueryInterface(mContainer));
nsCOMPtr<nsIContentViewer> viewer;
if (item) {
nsCOMPtr<nsIDocShellTreeItem> parent;
item->GetParent(getter_AddRefs(parent));
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(parent));
if (docShell) {
docShell->GetContentViewer(getter_AddRefs(viewer));
}
}
nsCOMPtr<nsIWebBrowserPrint> wbp(do_QueryInterface(viewer));
nsCOMPtr<nsIWebBrowserPrint> wbp;
GetParentWebBrowserPrint(mContainer, getter_AddRefs(wbp));
if (wbp) {
return wbp->GetDoingPrintPreview(aDoingPrintPreview);

View File

@@ -1204,6 +1204,14 @@ nsHTMLFrameInnerFrame::Reflow(nsIPresContext* aPresContext,
aStatus = NS_FRAME_COMPLETE;
// If doing Printing or Print Preview return here
// the printing/print preview mechanism will resize the subshell
PRBool isPaginated;
aPresContext->IsPaginated(&isPaginated);
if (isPaginated) {
return NS_OK;
}
nsCOMPtr<nsIDocShell> docShell;
GetDocShell(getter_AddRefs(docShell));

View File

@@ -1204,6 +1204,14 @@ nsHTMLFrameInnerFrame::Reflow(nsIPresContext* aPresContext,
aStatus = NS_FRAME_COMPLETE;
// If doing Printing or Print Preview return here
// the printing/print preview mechanism will resize the subshell
PRBool isPaginated;
aPresContext->IsPaginated(&isPaginated);
if (isPaginated) {
return NS_OK;
}
nsCOMPtr<nsIDocShell> docShell;
GetDocShell(getter_AddRefs(docShell));

View File

@@ -875,6 +875,13 @@ PluginViewerImpl::GetDoingPrintPreview(PRBool *aDoingPrintPreview)
return NS_ERROR_NOT_IMPLEMENTED;
}
/* readonly attribute boolean doingPrint; */
NS_IMETHODIMP
PluginViewerImpl::GetDoingPrint(PRBool *aDoingPrint)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
/* readonly attribute nsIPrintSettings currentPrintSettings; */
NS_IMETHODIMP
PluginViewerImpl::GetCurrentPrintSettings(nsIPrintSettings * *aCurrentPrintSettings)