2001-11-27 09:30:15 +00:00
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2005-08-15 18:16:42 +00:00
/* vim: set ts=2 sw=2 et tw=80: */
2001-09-25 01:32:19 +00:00
/* ***** BEGIN LICENSE BLOCK *****
2004-04-17 21:52:36 +00:00
* Version : MPL 1.1 / GPL 2.0 / LGPL 2.1
1999-05-06 19:25:40 +00:00
*
2004-04-17 21:52:36 +00:00
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 ( the " License " ) ; you may not use this file except in compliance with
* the License . You may obtain a copy of the License at
* http : //www.mozilla.org/MPL/
1999-05-06 19:25:40 +00:00
*
2001-09-25 01:32:19 +00:00
* Software distributed under the License is distributed on an " AS IS " basis ,
* WITHOUT WARRANTY OF ANY KIND , either express or implied . See the License
* for the specific language governing rights and limitations under the
* License .
1999-05-06 19:25:40 +00:00
*
* The Original Code is Mozilla Communicator client code .
*
2004-04-17 21:52:36 +00:00
* The Initial Developer of the Original Code is
2001-09-25 01:32:19 +00:00
* Netscape Communications Corporation .
* Portions created by the Initial Developer are Copyright ( C ) 1998
* the Initial Developer . All Rights Reserved .
1999-11-06 03:40:37 +00:00
*
2001-04-18 06:06:31 +00:00
* Contributor ( s ) :
* Dan Rosen < dr @ netscape . com >
2001-09-21 13:52:39 +00:00
* Roland Mainz < roland . mainz @ informatik . med . uni - giessen . de >
2006-12-31 08:13:56 +00:00
* Mats Palmgren < mats . palmgren @ bredband . net >
2001-09-25 01:32:19 +00:00
*
* Alternatively , the contents of this file may be used under the terms of
2004-04-17 21:52:36 +00:00
* either of the GNU General Public License Version 2 or later ( the " GPL " ) ,
* or the GNU Lesser General Public License Version 2.1 or later ( the " LGPL " ) ,
2001-09-25 01:32:19 +00:00
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above . If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL , and not to allow others to
2004-04-17 21:52:36 +00:00
* use your version of this file under the terms of the MPL , indicate your
2001-09-25 01:32:19 +00:00
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL . If you do not delete
* the provisions above , a recipient may use your version of this file under
2004-04-17 21:52:36 +00:00
* the terms of any one of the MPL , the GPL or the LGPL .
2001-09-25 01:32:19 +00:00
*
* * * * * * END LICENSE BLOCK * * * * * */
2001-04-18 06:06:31 +00:00
2006-03-30 05:56:38 +00:00
/* container for a document and its presentation */
2001-08-14 07:59:59 +00:00
# include "nscore.h"
1999-05-06 19:25:40 +00:00
# include "nsCOMPtr.h"
# include "nsCRT.h"
# include "nsString.h"
2001-09-29 08:28:41 +00:00
# include "nsReadableUtils.h"
1999-05-06 19:25:40 +00:00
# include "nsISupports.h"
1999-11-19 07:35:27 +00:00
# include "nsIContent.h"
# include "nsIContentViewerContainer.h"
1999-05-06 19:25:40 +00:00
# include "nsIDocumentViewer.h"
2002-08-21 12:01:05 +00:00
# include "nsIDocumentViewerPrint.h"
2009-06-24 08:42:00 +00:00
# include "nsIDOMDocumentEvent.h"
# include "nsIPrivateDOMEvent.h"
# include "nsIDOMBeforeUnloadEvent.h"
1999-05-06 19:25:40 +00:00
# include "nsIDocument.h"
2004-07-31 23:15:21 +00:00
# include "nsPresContext.h"
1999-05-06 19:25:40 +00:00
# include "nsIPresShell.h"
2005-07-21 00:15:27 +00:00
# include "nsIEventStateManager.h"
2004-01-07 22:30:53 +00:00
# include "nsStyleSet.h"
1999-05-06 19:25:40 +00:00
# include "nsIStyleSheet.h"
2000-04-28 23:32:51 +00:00
# include "nsICSSStyleSheet.h"
1999-05-06 19:25:40 +00:00
# include "nsIFrame.h"
# include "nsILinkHandler.h"
# include "nsIDOMDocument.h"
2000-09-14 11:45:01 +00:00
# include "nsISelectionListener.h"
# include "nsISelectionPrivate.h"
2000-01-18 21:06:10 +00:00
# include "nsIDOMHTMLDocument.h"
2002-03-26 11:43:40 +00:00
# include "nsIDOMNSHTMLDocument.h"
# include "nsIDOMHTMLCollection.h"
2000-01-18 21:06:10 +00:00
# include "nsIDOMHTMLElement.h"
# include "nsIDOMRange.h"
2001-02-19 12:55:42 +00:00
# include "nsContentCID.h"
2000-01-18 21:06:10 +00:00
# include "nsLayoutCID.h"
2004-12-07 02:28:38 +00:00
# include "nsContentUtils.h"
2004-03-09 19:59:09 +00:00
# include "nsLayoutStylesheetCache.h"
1999-05-06 19:25:40 +00:00
# include "nsViewsCID.h"
# include "nsWidgetsCID.h"
# include "nsIDeviceContext.h"
# include "nsIDeviceContextSpec.h"
# include "nsIViewManager.h"
# include "nsIView.h"
# include "nsIPageSequenceFrame.h"
# include "nsIURL.h"
2004-03-09 19:59:09 +00:00
# include "nsNetUtil.h"
1999-11-19 07:35:27 +00:00
# include "nsIContentViewerEdit.h"
# include "nsIContentViewerFile.h"
2004-03-09 19:59:09 +00:00
# include "nsICSSLoader.h"
1999-11-19 07:35:27 +00:00
# include "nsIMarkupDocumentViewer.h"
1999-11-13 07:36:28 +00:00
# include "nsIInterfaceRequestor.h"
2001-09-05 21:28:38 +00:00
# include "nsIInterfaceRequestorUtils.h"
1999-12-18 02:09:29 +00:00
# include "nsIDocShellTreeItem.h"
# include "nsIDocShellTreeNode.h"
2000-02-08 15:49:14 +00:00
# include "nsIDocShellTreeOwner.h"
1999-12-18 02:09:29 +00:00
# include "nsIDocShell.h"
2002-04-17 04:17:16 +00:00
# include "nsIBaseWindow.h"
2000-01-26 15:14:41 +00:00
# include "nsIFrameDebug.h"
2000-10-19 21:49:12 +00:00
# include "nsILayoutHistoryState.h"
2001-01-27 16:58:15 +00:00
# include "nsIParser.h"
2001-07-16 02:40:48 +00:00
# include "nsGUIEvent.h"
# include "nsHTMLReflowState.h"
2001-04-18 06:06:31 +00:00
# include "nsIDOMHTMLAnchorElement.h"
2001-09-12 23:31:37 +00:00
# include "nsIDOMHTMLAreaElement.h"
# include "nsIDOMHTMLLinkElement.h"
2004-06-05 17:57:00 +00:00
# include "nsIImageLoadingContent.h"
# include "nsCopySupport.h"
2002-08-21 12:01:05 +00:00
# include "nsIDOMHTMLFrameSetElement.h"
2003-04-11 00:56:27 +00:00
# ifdef MOZ_XUL
2004-12-24 22:27:57 +00:00
# include "nsIXULDocument.h"
2007-07-04 15:49:38 +00:00
# include "nsXULPopupManager.h"
2007-07-24 00:04:36 +00:00
# endif
2005-03-07 01:24:22 +00:00
# include "nsPrintfCString.h"
2000-10-28 22:17:53 +00:00
2002-08-01 21:36:02 +00:00
# include "nsIClipboardHelper.h"
1999-05-14 14:40:59 +00:00
2001-02-01 20:49:10 +00:00
# include "nsPIDOMWindow.h"
2007-01-11 00:02:58 +00:00
# include "nsJSEnvironment.h"
2001-02-01 20:49:10 +00:00
# include "nsIFocusController.h"
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 18:00:39 +00:00
# include "nsFocusManager.h"
2001-02-01 20:49:10 +00:00
2002-08-21 12:01:05 +00:00
# include "nsIScrollableView.h"
2004-09-04 19:51:21 +00:00
# include "nsIHTMLDocument.h"
2002-08-21 12:01:05 +00:00
# include "nsITimelineService.h"
# include "nsGfxCIID.h"
2005-01-15 00:10:19 +00:00
# include "nsStyleSheetService.h"
2009-02-16 11:27:22 +00:00
# include "nsURILoader.h"
2002-08-21 12:01:05 +00:00
2005-09-16 02:25:37 +00:00
# include "nsIPrompt.h"
# include "imgIContainer.h" // image animation mode constants
2002-08-21 12:01:05 +00:00
//--------------------------
// Printing Include
//---------------------------
# ifdef NS_PRINTING
2005-09-16 02:25:37 +00:00
# include "nsIWebBrowserPrint.h"
2002-08-21 12:01:05 +00:00
# include "nsPrintEngine.h"
2001-01-27 14:09:34 +00:00
// Print Options
2002-01-01 12:58:53 +00:00
# include "nsIPrintSettings.h"
2002-05-14 12:05:00 +00:00
# include "nsIPrintSettingsService.h"
2001-01-27 14:09:34 +00:00
# include "nsIPrintOptions.h"
# include "nsIServiceManager.h"
2002-01-01 12:58:53 +00:00
# include "nsISimpleEnumerator.h"
2002-09-03 23:36:13 +00:00
# include "nsXPCOM.h"
2002-01-01 12:58:53 +00:00
# include "nsISupportsPrimitives.h"
2001-01-27 14:09:34 +00:00
2002-05-14 12:05:00 +00:00
// PrintOptions is now implemented by PrintSettingsService
2002-05-14 14:32:42 +00:00
static const char sPrintOptionsContractID [ ] = " @mozilla.org/gfx/printsettings-service;1 " ;
2002-05-14 12:05:00 +00:00
2001-03-27 11:56:03 +00:00
// Printing Events
2002-03-23 18:07:51 +00:00
# include "nsPrintPreviewListener.h"
2001-03-27 11:56:03 +00:00
2001-04-12 13:04:29 +00:00
# include "nsIDOMHTMLFrameElement.h"
# include "nsIDOMHTMLIFrameElement.h"
2002-03-07 12:44:57 +00:00
# include "nsIDOMHTMLObjectElement.h"
2003-03-22 03:20:23 +00:00
# include "nsIPluginDocument.h"
2001-04-12 13:04:29 +00:00
2002-05-07 14:07:28 +00:00
// Print Progress
# include "nsIPrintProgress.h"
# include "nsIPrintProgressParams.h"
2001-09-21 13:52:39 +00:00
// Print error dialog
# include "nsIWindowWatcher.h"
2002-08-21 12:01:05 +00:00
// Printing
# include "nsPrintEngine.h"
# include "nsPagePrintTimer.h"
2002-05-07 12:03:37 +00:00
2002-08-21 12:01:05 +00:00
# endif // NS_PRINTING
2001-09-21 13:52:39 +00:00
2001-02-06 23:03:17 +00:00
// FrameSet
# include "nsIDocument.h"
2000-04-21 21:40:28 +00:00
//focus
2007-05-14 09:11:38 +00:00
# include "nsIDOMEventTarget.h"
2000-04-21 21:40:28 +00:00
# include "nsIDOMFocusListener.h"
2000-04-27 07:37:12 +00:00
# include "nsISelectionController.h"
2000-04-21 21:40:28 +00:00
2002-02-19 20:41:32 +00:00
# include "nsBidiUtils.h"
2005-05-04 20:22:32 +00:00
# include "nsISHEntry.h"
# include "nsISHistory.h"
# include "nsISHistoryInternal.h"
# include "nsIWebNavigation.h"
2005-05-15 00:30:02 +00:00
# include "nsWeakPtr.h"
2006-03-07 17:08:51 +00:00
# include "nsEventDispatcher.h"
2007-11-09 10:19:12 +00:00
# include "nsPresShellIterator.h"
2001-04-12 23:35:24 +00:00
2004-01-09 14:20:53 +00:00
//paint forcing
# include "prenv.h"
# include <stdio.h>
2006-04-01 01:19:28 +00:00
//switch to page layout
# include "nsGfxCIID.h"
1999-05-06 19:25:40 +00:00
# ifdef NS_DEBUG
2001-04-12 13:04:29 +00:00
1999-05-06 19:25:40 +00:00
# undef NOISY_VIEWER
# else
# undef NOISY_VIEWER
# endif
2002-06-19 21:51:13 +00:00
//-----------------------------------------------------
// PR LOGGING
# ifdef MOZ_LOGGING
# define FORCE_PR_LOG /* Allow logging in the release build */
2001-04-12 13:04:29 +00:00
# endif
2002-06-19 21:51:13 +00:00
# include "prlog.h"
# ifdef PR_LOGGING
static PRLogModuleInfo * kPrintingLogMod = PR_NewLogModule ( " printing " ) ;
# define PR_PL(_p1) PR_LOG(kPrintingLogMod, PR_LOG_DEBUG, _p1);
# define PRT_YESNO(_p) ((_p)?"YES":"NO")
# else
2002-04-17 04:17:16 +00:00
# define PRT_YESNO(_p)
2002-06-19 21:51:13 +00:00
# define PR_PL(_p1)
2001-04-12 13:04:29 +00:00
# endif
2002-06-19 21:51:13 +00:00
//-----------------------------------------------------
2001-04-12 13:04:29 +00:00
2000-02-16 01:39:30 +00:00
class DocumentViewerImpl ;
// a small delegate class used to avoid circular references
# ifdef XP_MAC
2001-04-18 06:06:31 +00:00
# pragma mark ** nsDocViewerSelectionListener **
2000-02-16 01:39:30 +00:00
# endif
2001-04-18 06:06:31 +00:00
class nsDocViewerSelectionListener : public nsISelectionListener
2000-02-16 01:39:30 +00:00
{
public :
// nsISupports interface...
NS_DECL_ISUPPORTS
2000-09-14 11:45:01 +00:00
// nsISelectionListerner interface
2002-04-17 04:17:16 +00:00
NS_DECL_NSISELECTIONLISTENER
2000-02-16 01:39:30 +00:00
2001-04-18 06:06:31 +00:00
nsDocViewerSelectionListener ( )
2000-02-16 01:39:30 +00:00
: mDocViewer ( NULL )
, mGotSelectionState ( PR_FALSE )
, mSelectionWasCollapsed ( PR_FALSE )
{
}
2002-04-17 04:17:16 +00:00
2001-04-18 06:06:31 +00:00
virtual ~ nsDocViewerSelectionListener ( ) { }
2002-04-17 04:17:16 +00:00
2000-02-16 01:39:30 +00:00
nsresult Init ( DocumentViewerImpl * aDocViewer ) ;
protected :
DocumentViewerImpl * mDocViewer ;
PRPackedBool mGotSelectionState ;
PRPackedBool mSelectionWasCollapsed ;
2002-04-17 04:17:16 +00:00
2000-02-16 01:39:30 +00:00
} ;
2000-04-21 21:40:28 +00:00
/** editor Implementation of the FocusListener interface
*/
2002-04-17 04:17:16 +00:00
class nsDocViewerFocusListener : public nsIDOMFocusListener
2000-04-21 21:40:28 +00:00
{
public :
/** default constructor
*/
nsDocViewerFocusListener ( ) ;
/** default destructor
*/
virtual ~ nsDocViewerFocusListener ( ) ;
/*interfaces for addref and release and queryinterface*/
NS_DECL_ISUPPORTS
/*BEGIN implementations of focus event handler interface*/
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 16:46:42 +00:00
NS_IMETHOD HandleEvent ( nsIDOMEvent * aEvent ) ;
NS_IMETHOD Focus ( nsIDOMEvent * aEvent ) ;
NS_IMETHOD Blur ( nsIDOMEvent * aEvent ) ;
2000-04-21 21:40:28 +00:00
/*END implementations of focus event handler interface*/
nsresult Init ( DocumentViewerImpl * aDocViewer ) ;
private :
DocumentViewerImpl * mDocViewer ;
} ;
2000-02-16 01:39:30 +00:00
# ifdef XP_MAC
# pragma mark ** DocumentViewerImpl **
# endif
2001-04-12 13:04:29 +00:00
//-------------------------------------------------------------
1999-09-22 07:34:31 +00:00
class DocumentViewerImpl : public nsIDocumentViewer ,
1999-11-19 07:35:27 +00:00
public nsIContentViewerEdit ,
public nsIContentViewerFile ,
2002-02-01 14:52:11 +00:00
public nsIMarkupDocumentViewer ,
2002-08-21 12:01:05 +00:00
public nsIDocumentViewerPrint
2005-09-16 02:25:37 +00:00
# ifdef NS_PRINTING
, public nsIWebBrowserPrint
# endif
1999-05-06 19:25:40 +00:00
{
2001-04-18 06:06:31 +00:00
friend class nsDocViewerSelectionListener ;
2001-11-03 14:59:39 +00:00
friend class nsPagePrintTimer ;
2002-08-21 12:01:05 +00:00
friend class nsPrintEngine ;
2002-04-17 04:17:16 +00:00
1999-05-06 19:25:40 +00:00
public :
2007-02-23 04:50:06 +00:00
DocumentViewerImpl ( ) ;
2002-04-17 04:17:16 +00:00
1999-05-06 19:25:40 +00:00
NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW
// nsISupports interface...
NS_DECL_ISUPPORTS
// nsIContentViewer interface...
2001-08-01 03:15:50 +00:00
NS_DECL_NSICONTENTVIEWER
1999-05-06 19:25:40 +00:00
// nsIDocumentViewer interface...
2003-06-13 20:10:01 +00:00
NS_IMETHOD GetDocument ( nsIDocument * * aResult ) ;
NS_IMETHOD GetPresShell ( nsIPresShell * * aResult ) ;
2004-07-31 23:15:21 +00:00
NS_IMETHOD GetPresContext ( nsPresContext * * aResult ) ;
1999-05-06 19:25:40 +00:00
1999-11-19 07:35:27 +00:00
// nsIContentViewerEdit
NS_DECL_NSICONTENTVIEWEREDIT
// nsIContentViewerFile
NS_DECL_NSICONTENTVIEWERFILE
// nsIMarkupDocumentViewer
NS_DECL_NSIMARKUPDOCUMENTVIEWER
2005-09-16 02:25:37 +00:00
# ifdef NS_PRINTING
2002-02-01 14:52:11 +00:00
// nsIWebBrowserPrint
NS_DECL_NSIWEBBROWSERPRINT
2005-09-16 02:25:37 +00:00
# endif
2002-02-01 14:52:11 +00:00
2000-04-02 21:52:17 +00:00
typedef void ( * CallChildFunc ) ( nsIMarkupDocumentViewer * aViewer ,
void * aClosure ) ;
2004-12-01 03:28:44 +00:00
void CallChildren ( CallChildFunc aFunc , void * aClosure ) ;
2000-04-02 21:52:17 +00:00
2002-08-21 12:01:05 +00:00
// nsIDocumentViewerPrint Printing Methods
2002-10-08 13:17:56 +00:00
NS_DECL_NSIDOCUMENTVIEWERPRINT
2002-08-21 12:01:05 +00:00
1999-05-06 19:25:40 +00:00
protected :
virtual ~ DocumentViewerImpl ( ) ;
private :
2007-12-01 10:42:12 +00:00
/**
* Creates a view manager , root view , and widget for the root view , setting
* mViewManager and mWindow .
* @ param aSize the initial size in appunits
*/
nsresult MakeWindow ( const nsSize & aSize ) ;
2008-08-18 19:22:19 +00:00
/**
* Create our device context
*/
nsresult CreateDeviceContext ( nsIWidget * aWidget ) ;
/**
* Make sure to set up mDeviceContext as needed before calling this
*/
2002-03-26 11:43:40 +00:00
nsresult InitInternal ( nsIWidget * aParentWidget ,
2005-08-15 18:16:42 +00:00
nsISupports * aState ,
2009-01-15 03:27:09 +00:00
const nsIntRect & aBounds ,
2002-11-18 14:34:09 +00:00
PRBool aDoCreation ,
2006-04-01 01:19:28 +00:00
PRBool aInPrintPreview ,
PRBool aNeedMakeCX = PR_TRUE ) ;
2008-01-09 22:41:43 +00:00
/**
* @ param aDoInitialReflow set to true if you want to kick off the initial
* reflow
* @ param aReenableRefresh set to true if you want this to reenable refresh
* before returning ; otherwise this will return with refresh disabled
* in the view manager
*/
nsresult InitPresentationStuff ( PRBool aDoInitialReflow , PRBool aReenableRefresh ) ;
2002-04-17 04:17:16 +00:00
2001-04-18 06:06:31 +00:00
nsresult GetPopupNode ( nsIDOMNode * * aNode ) ;
nsresult GetPopupLinkNode ( nsIDOMNode * * aNode ) ;
2004-06-05 17:57:00 +00:00
nsresult GetPopupImageNode ( nsIImageLoadingContent * * aNode ) ;
2001-04-18 06:06:31 +00:00
2001-05-25 08:49:03 +00:00
void PrepareToStartLoad ( void ) ;
2002-04-17 04:17:16 +00:00
nsresult SyncParentSubDocMap ( ) ;
2006-12-10 08:05:05 +00:00
nsresult GetDocumentSelection ( nsISelection * * aSelection ) ;
2007-07-26 04:14:33 +00:00
nsresult GetClipboardEventTarget ( nsIDOMNode * * aEventTarget ) ;
2007-09-01 08:53:07 +00:00
nsresult FireClipboardEvent ( PRUint32 msg , PRBool * aPreventDefault ) ;
2007-07-26 04:14:33 +00:00
2009-01-14 12:24:10 +00:00
void DestroyPresShell ( ) ;
2002-10-08 13:17:56 +00:00
# ifdef NS_PRINTING
// Called when the DocViewer is notified that the state
// of Printing or PP has changed
void SetIsPrintingInDocShellTree ( nsIDocShellTreeNode * aParentNode ,
PRBool aIsPrintingOrPP ,
PRBool aStartAtTop ) ;
# endif // NS_PRINTING
1999-05-06 19:25:40 +00:00
protected :
2007-11-09 10:19:12 +00:00
// These return the current shell/prescontext etc.
nsIPresShell * GetPresShell ( ) ;
nsPresContext * GetPresContext ( ) ;
nsIViewManager * GetViewManager ( ) ;
1999-05-06 19:25:40 +00:00
// IMPORTANT: The ownership implicit in the following member
// variables has been explicitly checked and set using nsCOMPtr
// for owning pointers and raw COM interface pointers for weak
// (ie, non owning) references. If you add any members to this
// class, please make the ownership explicit (pinkerton, scc).
2002-04-17 04:17:16 +00:00
2005-05-15 00:30:02 +00:00
nsWeakPtr mContainer ; // it owns me!
2008-08-18 19:22:19 +00:00
nsCOMPtr < nsIDeviceContext > mDeviceContext ; // We create and own this baby
1999-05-06 19:25:40 +00:00
2002-06-20 12:04:22 +00:00
// the following six items are explicitly in this order
1999-05-06 19:25:40 +00:00
// so they will be destroyed in the reverse order (pinkerton, scc)
nsCOMPtr < nsIDocument > mDocument ;
nsCOMPtr < nsIWidget > mWindow ; // ??? should we really own it?
nsCOMPtr < nsIViewManager > mViewManager ;
2004-07-31 23:15:21 +00:00
nsCOMPtr < nsPresContext > mPresContext ;
1999-05-06 19:25:40 +00:00
nsCOMPtr < nsIPresShell > mPresShell ;
2000-09-14 11:45:01 +00:00
nsCOMPtr < nsISelectionListener > mSelectionListener ;
2000-04-21 21:40:28 +00:00
nsCOMPtr < nsIDOMFocusListener > mFocusListener ;
2002-04-17 04:17:16 +00:00
2001-05-01 22:50:16 +00:00
nsCOMPtr < nsIContentViewer > mPreviousViewer ;
2005-05-04 20:22:32 +00:00
nsCOMPtr < nsISHEntry > mSHEntry ;
1999-07-15 14:23:40 +00:00
2008-09-28 19:14:28 +00:00
nsIWidget * mParentWidget ; // purposely won't be ref counted. May be null
1999-07-15 14:23:40 +00:00
2007-11-09 22:29:43 +00:00
// mTextZoom/mPageZoom record the textzoom/pagezoom of the first (galley)
// presshell only.
2006-06-12 13:49:46 +00:00
float mTextZoom ; // Text zoom, defaults to 1.0
2007-08-28 01:20:17 +00:00
float mPageZoom ;
2006-06-12 13:49:46 +00:00
2005-05-04 20:22:32 +00:00
PRInt16 mNumURLStarts ;
PRInt16 mDestroyRefCount ; // a second "refcount" for the document viewer's "destroy"
unsigned mEnableRendering : 1 ;
unsigned mStopped : 1 ;
unsigned mLoaded : 1 ;
unsigned mDeferredWindowClose : 1 ;
// document management data
// these items are specific to markup documents (html and xml)
// may consider splitting these out into a subclass
unsigned mIsSticky : 1 ;
unsigned mInPermitUnload : 1 ;
2004-02-11 06:09:51 +00:00
2002-08-21 12:01:05 +00:00
# ifdef NS_PRINTING
2005-05-04 20:22:32 +00:00
unsigned mClosingWhilePrinting : 1 ;
2002-08-21 12:01:05 +00:00
# if NS_PRINT_PREVIEW
2009-03-08 19:01:02 +00:00
unsigned mPrintPreviewZoomed : 1 ;
2005-05-04 20:22:32 +00:00
// These data members support delayed printing when the document is loading
unsigned mPrintIsPending : 1 ;
unsigned mPrintDocIsFullyLoaded : 1 ;
2002-06-28 13:39:44 +00:00
nsCOMPtr < nsIPrintSettings > mCachedPrintSettings ;
nsCOMPtr < nsIWebProgressListener > mCachedPrintWebProgressListner ;
2001-11-03 14:59:39 +00:00
2006-12-10 08:05:05 +00:00
nsCOMPtr < nsPrintEngine > mPrintEngine ;
2009-03-08 19:01:02 +00:00
float mOriginalPrintPreviewScale ;
float mPrintPreviewZoom ;
2005-09-16 02:25:37 +00:00
# endif // NS_PRINT_PREVIEW
2005-05-04 20:22:32 +00:00
2002-01-01 12:58:53 +00:00
# ifdef NS_DEBUG
FILE * mDebugFile ;
2002-08-21 12:01:05 +00:00
# endif // NS_DEBUG
# endif // NS_PRINTING
2001-03-27 11:56:03 +00:00
2003-06-17 16:40:34 +00:00
/* character set member data */
PRInt32 mHintCharsetSource ;
nsCString mHintCharset ;
nsCString mDefaultCharacterSet ;
nsCString mForceCharacterSet ;
nsCString mPrevDocCharacterSet ;
2006-04-01 01:19:28 +00:00
PRPackedBool mIsPageMode ;
2002-04-24 00:33:56 +00:00
1999-05-06 19:25:40 +00:00
} ;
2001-04-12 13:04:29 +00:00
//------------------------------------------------------------------
// DocumentViewerImpl
//------------------------------------------------------------------
1999-05-07 19:26:23 +00:00
// Class IDs
1999-07-15 07:00:22 +00:00
static NS_DEFINE_CID ( kViewManagerCID , NS_VIEW_MANAGER_CID ) ;
static NS_DEFINE_CID ( kWidgetCID , NS_CHILD_CID ) ;
2008-08-18 19:22:19 +00:00
static NS_DEFINE_CID ( kDeviceContextCID , NS_DEVICE_CONTEXT_CID ) ;
1999-05-06 19:25:40 +00:00
2002-02-01 14:52:11 +00:00
//------------------------------------------------------------------
1999-05-06 19:25:40 +00:00
nsresult
NS_NewDocumentViewer ( nsIDocumentViewer * * aResult )
{
2007-02-23 04:50:06 +00:00
* aResult = new DocumentViewerImpl ( ) ;
2002-04-17 04:17:16 +00:00
if ( ! * aResult ) {
1999-05-06 19:25:40 +00:00
return NS_ERROR_OUT_OF_MEMORY ;
}
2002-04-17 04:17:16 +00:00
NS_ADDREF ( * aResult ) ;
return NS_OK ;
1999-05-06 19:25:40 +00:00
}
2002-04-17 04:17:16 +00:00
void DocumentViewerImpl : : PrepareToStartLoad ( )
{
2001-03-27 11:56:03 +00:00
mEnableRendering = PR_TRUE ;
2001-04-25 19:52:49 +00:00
mStopped = PR_FALSE ;
2001-05-01 22:50:16 +00:00
mLoaded = PR_FALSE ;
2003-09-26 21:45:15 +00:00
mDeferredWindowClose = PR_FALSE ;
2002-08-21 12:01:05 +00:00
# ifdef NS_PRINTING
mPrintIsPending = PR_FALSE ;
2002-06-28 13:39:44 +00:00
mPrintDocIsFullyLoaded = PR_FALSE ;
2002-10-01 21:57:15 +00:00
mClosingWhilePrinting = PR_FALSE ;
2001-11-03 14:59:39 +00:00
2002-08-21 12:01:05 +00:00
// Make sure we have destroyed it and cleared the data member
if ( mPrintEngine ) {
mPrintEngine - > Destroy ( ) ;
2006-12-10 08:05:05 +00:00
mPrintEngine = nsnull ;
2002-08-21 12:01:05 +00:00
}
2001-11-03 14:59:39 +00:00
# ifdef NS_PRINT_PREVIEW
2002-08-21 12:01:05 +00:00
SetIsPrintPreview ( PR_FALSE ) ;
2001-11-03 14:59:39 +00:00
# endif
2002-01-01 12:58:53 +00:00
# ifdef NS_DEBUG
mDebugFile = nsnull ;
# endif
2002-08-21 12:01:05 +00:00
# endif // NS_PRINTING
1999-05-06 19:25:40 +00:00
}
2003-04-04 22:37:52 +00:00
// Note: operator new zeros our memory, so no need to init things to null.
2007-02-23 04:50:06 +00:00
DocumentViewerImpl : : DocumentViewerImpl ( )
2007-08-28 01:20:17 +00:00
: mTextZoom ( 1.0 ) , mPageZoom ( 1.0 ) ,
2005-05-04 20:22:32 +00:00
mIsSticky ( PR_TRUE ) ,
2009-03-08 19:01:02 +00:00
# ifdef NS_PRINT_PREVIEW
mPrintPreviewZoom ( 1.0 ) ,
# endif
2007-01-11 00:02:58 +00:00
mHintCharsetSource ( kCharsetUninitialized )
1999-05-06 19:25:40 +00:00
{
2001-05-25 08:49:03 +00:00
PrepareToStartLoad ( ) ;
1999-05-06 19:25:40 +00:00
}
2005-09-16 02:25:37 +00:00
NS_IMPL_ADDREF ( DocumentViewerImpl )
NS_IMPL_RELEASE ( DocumentViewerImpl )
NS_INTERFACE_MAP_BEGIN ( DocumentViewerImpl )
NS_INTERFACE_MAP_ENTRY ( nsIContentViewer )
NS_INTERFACE_MAP_ENTRY ( nsIDocumentViewer )
NS_INTERFACE_MAP_ENTRY ( nsIMarkupDocumentViewer )
NS_INTERFACE_MAP_ENTRY ( nsIContentViewerFile )
NS_INTERFACE_MAP_ENTRY ( nsIContentViewerEdit )
NS_INTERFACE_MAP_ENTRY ( nsIDocumentViewerPrint )
2005-09-16 19:57:20 +00:00
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS ( nsISupports , nsIContentViewer )
2005-09-16 02:25:37 +00:00
# ifdef NS_PRINTING
NS_INTERFACE_MAP_ENTRY ( nsIWebBrowserPrint )
# endif
NS_INTERFACE_MAP_END
1999-05-06 19:25:40 +00:00
DocumentViewerImpl : : ~ DocumentViewerImpl ( )
{
2002-04-17 04:17:16 +00:00
if ( mDocument ) {
2005-05-18 03:52:33 +00:00
Close ( nsnull ) ;
2005-05-04 20:22:32 +00:00
mDocument - > Destroy ( ) ;
2002-04-17 04:17:16 +00:00
}
2001-08-01 03:15:50 +00:00
2004-02-11 06:48:37 +00:00
NS_ASSERTION ( ! mPresShell & & ! mPresContext ,
" User did not call nsIContentViewer::Destroy " ) ;
if ( mPresShell | | mPresContext ) {
2005-06-17 07:01:36 +00:00
// Make sure we don't hand out a reference to the content viewer to
// the SHEntry!
mSHEntry = nsnull ;
2001-07-26 20:53:21 +00:00
Destroy ( ) ;
2002-04-17 04:17:16 +00:00
}
1999-05-06 19:25:40 +00:00
2001-08-01 03:15:50 +00:00
// XXX(?) Revoke pending invalidate events
1999-05-06 19:25:40 +00:00
}
/*
* This method is called by the Document Loader once a document has
* been created for a particular data stream . . . The content viewer
* must cache this document for later use when Init ( . . . ) is called .
2001-05-25 08:49:03 +00:00
*
* This method is also called when an out of band document . write ( ) happens .
* In that case , the document passed in is the same as the previous document .
1999-05-06 19:25:40 +00:00
*/
NS_IMETHODIMP
2001-05-25 08:49:03 +00:00
DocumentViewerImpl : : LoadStart ( nsISupports * aDoc )
1999-05-06 19:25:40 +00:00
{
# ifdef NOISY_VIEWER
2001-05-25 08:49:03 +00:00
printf ( " DocumentViewerImpl::LoadStart \n " ) ;
1999-05-06 19:25:40 +00:00
# endif
2006-04-19 21:14:57 +00:00
nsresult rv = NS_OK ;
2001-05-25 08:49:03 +00:00
if ( ! mDocument ) {
2002-04-17 04:17:16 +00:00
mDocument = do_QueryInterface ( aDoc , & rv ) ;
2001-05-25 08:49:03 +00:00
}
else if ( mDocument = = aDoc ) {
2002-04-17 04:17:16 +00:00
// Reset the document viewer's state back to what it was
2001-05-25 08:49:03 +00:00
// when the document load started.
PrepareToStartLoad ( ) ;
}
1999-05-06 19:25:40 +00:00
return rv ;
}
2002-04-17 04:17:16 +00:00
nsresult
DocumentViewerImpl : : SyncParentSubDocMap ( )
{
2005-05-15 00:30:02 +00:00
nsCOMPtr < nsIDocShellTreeItem > item ( do_QueryReferent ( mContainer ) ) ;
2004-05-07 11:57:10 +00:00
nsCOMPtr < nsPIDOMWindow > pwin ( do_GetInterface ( item ) ) ;
2002-04-17 04:17:16 +00:00
nsCOMPtr < nsIContent > content ;
if ( mDocument & & pwin ) {
2004-05-03 21:48:36 +00:00
content = do_QueryInterface ( pwin - > GetFrameElementInternal ( ) ) ;
2002-04-17 04:17:16 +00:00
}
if ( content ) {
nsCOMPtr < nsIDocShellTreeItem > parent ;
item - > GetParent ( getter_AddRefs ( parent ) ) ;
nsCOMPtr < nsIDOMWindow > parent_win ( do_GetInterface ( parent ) ) ;
if ( parent_win ) {
nsCOMPtr < nsIDOMDocument > dom_doc ;
parent_win - > GetDocument ( getter_AddRefs ( dom_doc ) ) ;
nsCOMPtr < nsIDocument > parent_doc ( do_QueryInterface ( dom_doc ) ) ;
if ( parent_doc ) {
2009-03-03 20:11:14 +00:00
if ( mDocument & & parent_doc - > GetSubDocumentFor ( content ) ! = mDocument ) {
mDocument - > SuppressEventHandling ( parent_doc - > EventHandlingSuppressed ( ) ) ;
}
2002-04-17 04:17:16 +00:00
return parent_doc - > SetSubDocumentFor ( content , mDocument ) ;
}
}
}
return NS_OK ;
}
1999-05-06 19:25:40 +00:00
NS_IMETHODIMP
1999-11-14 10:12:21 +00:00
DocumentViewerImpl : : SetContainer ( nsISupports * aContainer )
1999-05-06 19:25:40 +00:00
{
2005-05-15 00:30:02 +00:00
mContainer = do_GetWeakReference ( aContainer ) ;
1999-05-06 19:25:40 +00:00
if ( mPresContext ) {
mPresContext - > SetContainer ( aContainer ) ;
}
2002-04-17 04:17:16 +00:00
// We're loading a new document into the window where this document
// viewer lives, sync the parent document's frame element -> sub
// document map
return SyncParentSubDocMap ( ) ;
1999-05-06 19:25:40 +00:00
}
NS_IMETHODIMP
1999-11-14 10:12:21 +00:00
DocumentViewerImpl : : GetContainer ( nsISupports * * aResult )
1999-05-06 19:25:40 +00:00
{
1999-11-14 10:12:21 +00:00
NS_ENSURE_ARG_POINTER ( aResult ) ;
2005-05-15 00:30:02 +00:00
* aResult = nsnull ;
nsCOMPtr < nsISupports > container = do_QueryReferent ( mContainer ) ;
container . swap ( * aResult ) ;
1999-11-13 07:36:28 +00:00
return NS_OK ;
1999-05-06 19:25:40 +00:00
}
NS_IMETHODIMP
2000-03-11 01:24:59 +00:00
DocumentViewerImpl : : Init ( nsIWidget * aParentWidget ,
2009-01-15 03:27:09 +00:00
const nsIntRect & aBounds )
2002-03-26 11:43:40 +00:00
{
2008-08-18 19:22:19 +00:00
nsresult rv = CreateDeviceContext ( aParentWidget ) ;
NS_ENSURE_SUCCESS ( rv , rv ) ;
return InitInternal ( aParentWidget , nsnull , aBounds , PR_TRUE , PR_FALSE ) ;
2002-03-26 11:43:40 +00:00
}
2002-04-17 04:17:16 +00:00
nsresult
2008-01-09 22:41:43 +00:00
DocumentViewerImpl : : InitPresentationStuff ( PRBool aDoInitialReflow , PRBool aReenableRefresh )
2002-04-17 04:17:16 +00:00
{
2009-01-14 12:24:10 +00:00
NS_ASSERTION ( ! mPresShell ,
" Someone should have destroyed the presshell! " ) ;
2002-04-17 04:17:16 +00:00
// Create the style set...
2004-01-11 09:34:07 +00:00
nsStyleSet * styleSet ;
nsresult rv = CreateStyleSet ( mDocument , & styleSet ) ;
2002-04-17 04:17:16 +00:00
NS_ENSURE_SUCCESS ( rv , rv ) ;
// Now make the shell for the document
rv = mDocument - > CreateShell ( mPresContext , mViewManager , styleSet ,
getter_AddRefs ( mPresShell ) ) ;
2004-01-11 09:34:07 +00:00
if ( NS_FAILED ( rv ) ) {
delete styleSet ;
return rv ;
}
2004-01-08 19:23:12 +00:00
2004-07-15 20:30:30 +00:00
// We're done creating the style set
styleSet - > EndUpdate ( ) ;
2002-09-06 05:44:31 +00:00
if ( aDoInitialReflow ) {
// Since InitialReflow() will create frames for *all* items
// that are currently in the document tree, we need to flush
// any pending notifications to prevent the content sink from
// duplicating layout frames for content it has added to the tree
// but hasn't notified the document about. (Bug 154018)
//
// Note that we are flushing before we add mPresShell as an observer
// to avoid bogus notifications.
2004-05-27 22:08:42 +00:00
mDocument - > FlushPendingNotifications ( Flush_ContentAndNotify ) ;
2002-09-06 05:44:31 +00:00
}
2002-04-17 04:17:16 +00:00
mPresShell - > BeginObservingDocument ( ) ;
// Initialize our view manager
2009-01-15 03:27:09 +00:00
nsIntRect bounds ;
2002-04-17 04:17:16 +00:00
mWindow - > GetBounds ( bounds ) ;
2007-08-28 01:20:17 +00:00
nscoord width = mPresContext - > DeviceContext ( ) - > UnscaledAppUnitsPerDevPixel ( ) * bounds . width ;
nscoord height = mPresContext - > DeviceContext ( ) - > UnscaledAppUnitsPerDevPixel ( ) * bounds . height ;
2002-04-17 04:17:16 +00:00
mViewManager - > DisableRefresh ( ) ;
mViewManager - > SetWindowDimensions ( width , height ) ;
2006-06-12 13:49:46 +00:00
mPresContext - > SetTextZoom ( mTextZoom ) ;
2007-08-28 01:20:17 +00:00
mPresContext - > SetFullZoom ( mPageZoom ) ;
2002-04-17 04:17:16 +00:00
if ( aDoInitialReflow ) {
2004-09-04 19:51:21 +00:00
nsCOMPtr < nsIHTMLDocument > htmlDoc = do_QueryInterface ( mDocument ) ;
if ( htmlDoc ) {
nsCOMPtr < nsIDOMHTMLFrameSetElement > frameset =
do_QueryInterface ( mDocument - > GetRootContent ( ) ) ;
htmlDoc - > SetIsFrameset ( frameset ! = nsnull ) ;
2002-04-19 23:55:45 +00:00
}
2007-05-14 03:52:48 +00:00
nsCOMPtr < nsIPresShell > shellGrip = mPresShell ;
2002-04-19 23:56:45 +00:00
// Initial reflow
2002-04-17 04:17:16 +00:00
mPresShell - > InitialReflow ( width , height ) ;
2004-10-13 21:59:26 +00:00
} else {
// Store the visible area so it's available for other callers of
// InitialReflow, like nsContentSink::StartLayout.
mPresContext - > SetVisibleArea ( nsRect ( 0 , 0 , width , height ) ) ;
2002-04-17 04:17:16 +00:00
}
2008-01-09 22:41:43 +00:00
// Now trigger a refresh
if ( aReenableRefresh & & mEnableRendering & & mViewManager ) {
mViewManager - > EnableRefresh ( NS_VMREFRESH_IMMEDIATE ) ;
}
2002-04-17 04:17:16 +00:00
// now register ourselves as a selection listener, so that we get
// called when the selection changes in the window
2009-01-14 12:24:10 +00:00
if ( ! mSelectionListener ) {
nsDocViewerSelectionListener * selectionListener =
new nsDocViewerSelectionListener ( ) ;
NS_ENSURE_TRUE ( selectionListener , NS_ERROR_OUT_OF_MEMORY ) ;
2002-04-17 04:17:16 +00:00
2009-01-14 12:24:10 +00:00
selectionListener - > Init ( this ) ;
2002-04-17 04:17:16 +00:00
2009-01-14 12:24:10 +00:00
// mSelectionListener is a owning reference
mSelectionListener = selectionListener ;
}
2002-04-17 04:17:16 +00:00
nsCOMPtr < nsISelection > selection ;
rv = GetDocumentSelection ( getter_AddRefs ( selection ) ) ;
NS_ENSURE_SUCCESS ( rv , rv ) ;
nsCOMPtr < nsISelectionPrivate > selPrivate ( do_QueryInterface ( selection ) ) ;
rv = selPrivate - > AddSelectionListener ( mSelectionListener ) ;
if ( NS_FAILED ( rv ) )
return rv ;
2002-05-21 19:37:28 +00:00
// Save old listener so we can unregister it
2008-01-09 22:41:43 +00:00
nsCOMPtr < nsIDOMFocusListener > oldFocusListener = mFocusListener ;
2002-05-21 19:37:28 +00:00
2002-04-17 04:17:16 +00:00
// focus listener
//
// now register ourselves as a focus listener, so that we get called
// when the focus changes in the window
nsDocViewerFocusListener * focusListener ;
NS_NEWXPCOM ( focusListener , nsDocViewerFocusListener ) ;
NS_ENSURE_TRUE ( focusListener , NS_ERROR_OUT_OF_MEMORY ) ;
focusListener - > Init ( this ) ;
// mFocusListener is a strong reference
mFocusListener = focusListener ;
2007-05-14 09:11:38 +00:00
if ( mDocument ) {
rv = mDocument - > AddEventListenerByIID ( mFocusListener ,
NS_GET_IID ( nsIDOMFocusListener ) ) ;
2002-04-17 04:17:16 +00:00
NS_ASSERTION ( NS_SUCCEEDED ( rv ) , " failed to register focus listener " ) ;
2008-01-09 22:41:43 +00:00
if ( oldFocusListener ) {
rv = mDocument - > RemoveEventListenerByIID ( oldFocusListener ,
2007-05-14 09:11:38 +00:00
NS_GET_IID ( nsIDOMFocusListener ) ) ;
2002-05-21 19:37:28 +00:00
NS_ASSERTION ( NS_SUCCEEDED ( rv ) , " failed to remove focus listener " ) ;
}
2002-04-17 04:17:16 +00:00
}
return NS_OK ;
}
2002-03-26 11:43:40 +00:00
//-----------------------------------------------
// This method can be used to initial the "presentation"
// The aDoCreation indicates whether it should create
// all the new objects or just initialize the existing ones
nsresult
DocumentViewerImpl : : InitInternal ( nsIWidget * aParentWidget ,
2005-08-15 18:16:42 +00:00
nsISupports * aState ,
2009-01-15 03:27:09 +00:00
const nsIntRect & aBounds ,
2002-11-18 14:34:09 +00:00
PRBool aDoCreation ,
2006-04-01 01:19:28 +00:00
PRBool aInPrintPreview ,
PRBool aNeedMakeCX /*= PR_TRUE*/ )
1999-05-06 19:25:40 +00:00
{
2001-11-14 11:24:03 +00:00
mParentWidget = aParentWidget ; // not ref counted
2001-11-03 14:59:39 +00:00
2002-04-17 04:17:16 +00:00
nsresult rv = NS_OK ;
2001-03-10 03:19:36 +00:00
NS_ENSURE_TRUE ( mDocument , NS_ERROR_NULL_POINTER ) ;
1999-05-06 19:25:40 +00:00
PRBool makeCX = PR_FALSE ;
2002-03-26 11:43:40 +00:00
if ( aDoCreation ) {
2008-10-04 20:00:09 +00:00
// XXXbz this is a nasty hack to do with the fact that we create
// presentations both in Init() and in Show()... Ideally we would only do
// it in one place (Show()) and require that callers call init(), open(),
// show() in that order or something.
if ( ( aParentWidget | | mDocument - > GetDisplayDocument ( ) ) & & ! mPresContext ) {
2002-03-26 11:43:40 +00:00
// Create presentation context
2006-12-10 08:05:05 +00:00
if ( mIsPageMode ) {
//Presentation context already created in SetPageMode which is calling this method
}
2006-04-01 01:19:28 +00:00
else
2006-12-10 08:05:05 +00:00
mPresContext =
2006-05-19 10:26:44 +00:00
new nsPresContext ( mDocument , nsPresContext : : eContext_Galley ) ;
2004-07-29 19:41:39 +00:00
NS_ENSURE_TRUE ( mPresContext , NS_ERROR_OUT_OF_MEMORY ) ;
1999-05-06 19:25:40 +00:00
2008-08-18 19:22:19 +00:00
nsresult rv = mPresContext - > Init ( mDeviceContext ) ;
2004-01-21 09:35:59 +00:00
if ( NS_FAILED ( rv ) ) {
mPresContext = nsnull ;
return rv ;
}
2002-04-17 04:17:16 +00:00
2002-08-21 12:01:05 +00:00
# if defined(NS_PRINTING) && defined(NS_PRINT_PREVIEW)
2006-04-01 01:19:28 +00:00
makeCX = ! GetIsPrintPreview ( ) & & aNeedMakeCX ; // needs to be true except when we are already in PP or we are enabling/disabling paginated mode.
2001-11-14 11:24:03 +00:00
# else
2002-03-26 11:43:40 +00:00
makeCX = PR_TRUE ;
2001-11-14 11:24:03 +00:00
# endif
2002-03-26 11:43:40 +00:00
}
1999-05-06 19:25:40 +00:00
2005-05-04 20:22:32 +00:00
if ( mPresContext ) {
// Create the ViewManager and Root View...
2000-04-21 21:40:28 +00:00
2005-05-04 20:22:32 +00:00
// We must do this before we tell the script global object about
// this new document since doing that will cause us to re-enter
// into nsSubDocumentFrame code through reflows caused by
// FlushPendingNotifications() calls down the road...
2002-04-04 07:31:16 +00:00
2007-12-01 10:42:12 +00:00
rv = MakeWindow ( nsSize ( mPresContext - > DevPixelsToAppUnits ( aBounds . width ) ,
mPresContext - > DevPixelsToAppUnits ( aBounds . height ) ) ) ;
2005-05-04 20:22:32 +00:00
NS_ENSURE_SUCCESS ( rv , rv ) ;
Hide ( ) ;
2006-04-01 01:19:28 +00:00
2006-04-05 04:37:44 +00:00
# ifdef NS_PRINT_PREVIEW
2006-04-01 01:19:28 +00:00
if ( mIsPageMode ) {
2007-03-21 06:07:42 +00:00
// I'm leaving this in a broken state for the moment; we should
// be measuring/scaling with the print device context, not the
// screen device context, but this is good enough to allow
// printing reftests to work.
#if 0
2006-12-09 17:18:56 +00:00
nsCOMPtr < nsIDeviceContextSpec > devspec =
2007-02-15 11:08:47 +00:00
do_CreateInstance ( " @mozilla.org/gfx/devicecontextspec;1 " , & rv ) ;
NS_ENSURE_SUCCESS ( rv , rv ) ;
2006-04-01 01:19:28 +00:00
// mWindow has been initialized by preceding call to MakeWindow
2007-02-15 11:08:47 +00:00
rv = devspec - > Init ( mWindow , mPresContext - > GetPrintSettings ( ) , PR_FALSE ) ;
NS_ENSURE_SUCCESS ( rv , rv ) ;
nsCOMPtr < nsIDeviceContext > devctx =
do_CreateInstance ( " @mozilla.org/gfx/devicecontext;1 " , & rv ) ;
NS_ENSURE_SUCCESS ( rv , rv ) ;
2007-03-21 06:07:42 +00:00
rv = devctx - > InitForPrinting ( devspec ) ;
2007-02-15 11:08:47 +00:00
NS_ENSURE_SUCCESS ( rv , rv ) ;
2007-02-13 22:36:59 +00:00
// XXX I'm breaking this code; I'm not sure I really want to mess with
// the document viewer at the moment to get the right device context
// (this won't break anyone, since page layout mode was never really
// usable)
2007-03-21 06:07:42 +00:00
# endif
2007-07-16 23:16:48 +00:00
double pageWidth = 0 , pageHeight = 0 ;
mPresContext - > GetPrintSettings ( ) - > GetEffectivePageSize ( & pageWidth ,
& pageHeight ) ;
2007-03-21 06:07:42 +00:00
mPresContext - > SetPageSize (
2007-11-21 05:09:58 +00:00
nsSize ( mPresContext - > TwipsToAppUnits ( NSToIntFloor ( pageWidth ) ) ,
mPresContext - > TwipsToAppUnits ( NSToIntFloor ( pageHeight ) ) ) ) ;
2006-04-01 01:19:28 +00:00
mPresContext - > SetIsRootPaginatedDocument ( PR_TRUE ) ;
2007-03-21 06:07:42 +00:00
mPresContext - > SetPageScale ( 1.0f ) ;
2006-04-01 01:19:28 +00:00
}
2006-04-05 04:37:44 +00:00
# endif
2005-05-04 20:22:32 +00:00
}
2002-04-17 04:17:16 +00:00
}
2002-04-05 05:42:10 +00:00
2005-05-15 00:30:02 +00:00
nsCOMPtr < nsIInterfaceRequestor > requestor ( do_QueryReferent ( mContainer ) ) ;
2002-04-17 04:17:16 +00:00
if ( requestor ) {
if ( mPresContext ) {
nsCOMPtr < nsILinkHandler > linkHandler ;
requestor - > GetInterface ( NS_GET_IID ( nsILinkHandler ) ,
getter_AddRefs ( linkHandler ) ) ;
2005-05-15 00:30:02 +00:00
mPresContext - > SetContainer ( requestor ) ;
2002-04-17 04:17:16 +00:00
mPresContext - > SetLinkHandler ( linkHandler ) ;
}
2002-04-05 05:42:10 +00:00
2002-11-18 14:34:09 +00:00
if ( ! aInPrintPreview ) {
2002-04-17 04:17:16 +00:00
// Set script-context-owner in the document
2002-04-05 05:42:10 +00:00
2005-12-01 19:35:27 +00:00
nsCOMPtr < nsPIDOMWindow > window ;
requestor - > GetInterface ( NS_GET_IID ( nsPIDOMWindow ) ,
getter_AddRefs ( window ) ) ;
2002-04-05 05:42:10 +00:00
2005-12-01 19:35:27 +00:00
if ( window ) {
window - > SetNewDocument ( mDocument , aState , PR_TRUE ) ;
2007-01-11 00:02:58 +00:00
nsJSContext : : LoadStart ( ) ;
2002-04-05 05:42:10 +00:00
}
}
}
2002-04-17 04:17:16 +00:00
if ( aDoCreation & & mPresContext ) {
// The ViewManager and Root View was created above (in
// MakeWindow())...
2002-04-05 05:42:10 +00:00
2008-01-09 22:41:43 +00:00
rv = InitPresentationStuff ( ! makeCX , ! makeCX ) ;
2000-04-21 21:40:28 +00:00
}
2001-03-27 11:56:03 +00:00
1999-05-06 19:25:40 +00:00
return rv ;
}
2000-09-06 09:11:38 +00:00
//
// LoadComplete(aStatus)
//
// aStatus - The status returned from loading the document.
//
// This method is called by the container when the document has been
// completely loaded.
//
2000-06-22 05:38:07 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : LoadComplete ( nsresult aStatus )
{
2002-04-17 04:17:16 +00:00
/* We need to protect ourself against auto-destruction in case the
window is closed while processing the OnLoad event . See bug
http : //bugzilla.mozilla.org/show_bug.cgi?id=78445 for more
explanation .
2001-05-12 17:40:12 +00:00
*/
2002-07-11 18:11:12 +00:00
nsCOMPtr < nsIDocumentViewer > kungFuDeathGrip ( this ) ;
2001-05-12 17:40:12 +00:00
2007-05-01 19:11:28 +00:00
// Flush out layout so it's up-to-date by the time onload is called.
// Note that this could destroy the window, so do this before
// checking for our mDocument and its window.
2007-04-30 03:09:55 +00:00
if ( mPresShell & & ! mStopped ) {
// Hold strong ref because this could conceivably run script
nsCOMPtr < nsIPresShell > shell = mPresShell ;
shell - > FlushPendingNotifications ( Flush_Layout ) ;
}
2007-05-01 19:11:28 +00:00
nsresult rv = NS_OK ;
NS_ENSURE_TRUE ( mDocument , NS_ERROR_NOT_AVAILABLE ) ;
// First, get the window from the document...
nsPIDOMWindow * window = mDocument - > GetWindow ( ) ;
mLoaded = PR_TRUE ;
2000-09-06 09:11:38 +00:00
// Now, fire either an OnLoad or OnError event to the document...
2005-06-15 23:52:46 +00:00
PRBool restoring = PR_FALSE ;
2008-11-18 22:54:36 +00:00
// XXXbz imagelib kills off the document load for a full-page image with
2009-02-16 11:27:22 +00:00
// NS_ERROR_PARSED_DATA_CACHED if it's in the cache. So we want to treat
2008-11-18 22:54:36 +00:00
// that one as a success code; otherwise whether we fire onload for the image
// will depend on whether it's cached!
if ( window & &
2009-02-16 11:27:22 +00:00
( NS_SUCCEEDED ( aStatus ) | | aStatus = = NS_ERROR_PARSED_DATA_CACHED ) ) {
2009-01-09 17:12:09 +00:00
if ( mDocument )
mDocument - > SetReadyStateInternal ( nsIDocument : : READYSTATE_COMPLETE ) ;
2000-09-06 09:11:38 +00:00
nsEventStatus status = nsEventStatus_eIgnore ;
2006-08-31 19:33:01 +00:00
nsEvent event ( PR_TRUE , NS_LOAD ) ;
2006-03-07 17:08:51 +00:00
event . flags | = NS_EVENT_FLAG_CANT_BUBBLE ;
// XXX Dispatching to |window|, but using |document| as the target.
event . target = mDocument ;
2000-09-06 09:11:38 +00:00
2005-06-15 23:52:46 +00:00
// If the document presentation is being restored, we don't want to fire
// onload to the document content since that would likely confuse scripts
// on the page.
2005-11-28 23:56:44 +00:00
nsIDocShell * docShell = window - > GetDocShell ( ) ;
2005-06-15 23:52:46 +00:00
NS_ENSURE_TRUE ( docShell , NS_ERROR_UNEXPECTED ) ;
docShell - > GetRestoringDocument ( & restoring ) ;
if ( ! restoring ) {
2006-03-07 17:08:51 +00:00
nsEventDispatcher : : Dispatch ( window , mPresContext , & event , nsnull ,
& status ) ;
2001-11-26 23:13:36 +00:00
# ifdef MOZ_TIMELINE
2005-06-15 23:52:46 +00:00
// if navigator.xul's load is complete, the main nav window is visible
// mark that point.
2002-04-17 04:17:16 +00:00
2001-11-26 23:13:36 +00:00
//printf("DEBUG: getting uri from document (%p)\n", mDocument.get());
2002-04-17 04:17:16 +00:00
2005-07-29 10:09:08 +00:00
nsIURI * uri = mDocument ? mDocument - > GetDocumentURI ( ) : nsnull ;
2002-04-17 04:17:16 +00:00
if ( uri ) {
2005-07-29 10:09:08 +00:00
//printf("DEBUG: getting spec for uri (%p)\n", uri.get());
2002-03-06 07:48:55 +00:00
nsCAutoString spec ;
uri - > GetSpec ( spec ) ;
2005-07-29 10:09:08 +00:00
if ( spec . EqualsLiteral ( " chrome://navigator/content/navigator.xul " ) | |
spec . EqualsLiteral ( " chrome://browser/content/browser.xul " ) ) {
2001-11-26 23:13:36 +00:00
NS_TIMELINE_MARK ( " Navigator Window visible now " ) ;
}
}
# endif /* MOZ_TIMELINE */
2005-06-15 23:52:46 +00:00
}
2000-09-06 09:11:38 +00:00
} else {
// XXX: Should fire error event to the document...
}
2002-04-17 04:17:16 +00:00
2005-06-15 23:52:46 +00:00
// Notify the document that it has been shown (regardless of whether
2005-06-17 21:49:01 +00:00
// it was just loaded). Note: mDocument may be null now if the above
// firing of onload caused the document to unload.
if ( mDocument )
2009-02-26 22:05:42 +00:00
mDocument - > OnPageShow ( restoring , nsnull ) ;
2005-06-15 23:52:46 +00:00
2001-04-25 19:52:49 +00:00
// Now that the document has loaded, we can tell the presshell
// to unsuppress painting.
2002-04-17 04:17:16 +00:00
if ( mPresShell & & ! mStopped ) {
2008-04-10 22:42:03 +00:00
nsCOMPtr < nsIPresShell > shellDeathGrip ( mPresShell ) ;
2001-05-01 22:50:16 +00:00
mPresShell - > UnsuppressPainting ( ) ;
2008-04-10 22:42:03 +00:00
// mPresShell could have been removed now, see bug 378682/421432
if ( mPresShell ) {
mPresShell - > ScrollToAnchor ( ) ;
}
2002-04-17 04:17:16 +00:00
}
2000-09-06 09:11:38 +00:00
2007-10-21 16:46:54 +00:00
nsJSContext : : LoadEnd ( ) ;
2007-01-11 00:02:58 +00:00
2002-08-21 12:01:05 +00:00
# ifdef NS_PRINTING
2002-06-28 13:39:44 +00:00
// Check to see if someone tried to print during the load
if ( mPrintIsPending ) {
mPrintIsPending = PR_FALSE ;
mPrintDocIsFullyLoaded = PR_TRUE ;
Print ( mCachedPrintSettings , mCachedPrintWebProgressListner ) ;
mCachedPrintSettings = nsnull ;
mCachedPrintWebProgressListner = nsnull ;
}
2002-08-21 12:01:05 +00:00
# endif
2002-06-28 13:39:44 +00:00
2000-09-06 09:11:38 +00:00
return rv ;
2000-06-22 05:38:07 +00:00
}
2004-02-11 06:09:51 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : PermitUnload ( PRBool * aPermitUnload )
{
* aPermitUnload = PR_TRUE ;
if ( ! mDocument | | mInPermitUnload ) {
return NS_OK ;
}
// First, get the script global object from the document...
2005-11-28 23:56:44 +00:00
nsPIDOMWindow * window = mDocument - > GetWindow ( ) ;
2004-02-11 06:09:51 +00:00
2005-11-28 23:56:44 +00:00
if ( ! window ) {
2004-02-11 06:09:51 +00:00
// This is odd, but not fatal
2005-11-28 23:56:44 +00:00
NS_WARNING ( " window not set for document! " ) ;
2004-02-11 06:09:51 +00:00
return NS_OK ;
}
2008-03-14 23:08:57 +00:00
NS_ASSERTION ( nsContentUtils : : IsSafeToRunScript ( ) , " This is unsafe " ) ;
2004-02-11 06:09:51 +00:00
// Now, fire an BeforeUnload event to the document and see if it's ok
// to unload...
2009-06-24 08:42:00 +00:00
nsCOMPtr < nsIDOMDocumentEvent > docEvent = do_QueryInterface ( mDocument ) ;
nsCOMPtr < nsIDOMEvent > event ;
docEvent - > CreateEvent ( NS_LITERAL_STRING ( " beforeunloadevent " ) ,
getter_AddRefs ( event ) ) ;
nsCOMPtr < nsIDOMBeforeUnloadEvent > beforeUnload = do_QueryInterface ( event ) ;
nsCOMPtr < nsIPrivateDOMEvent > pEvent = do_QueryInterface ( beforeUnload ) ;
NS_ENSURE_STATE ( pEvent ) ;
nsresult rv = event - > InitEvent ( NS_LITERAL_STRING ( " beforeunload " ) ,
PR_FALSE , PR_TRUE ) ;
NS_ENSURE_SUCCESS ( rv , rv ) ;
2006-03-07 17:08:51 +00:00
// XXX Dispatching to |window|, but using |document| as the target.
2009-06-24 08:42:00 +00:00
nsCOMPtr < nsIDOMEventTarget > target = do_QueryInterface ( mDocument ) ;
pEvent - > SetTarget ( target ) ;
pEvent - > SetTrusted ( PR_TRUE ) ;
2004-09-23 23:39:16 +00:00
2006-04-05 23:57:30 +00:00
// In evil cases we might be destroyed while handling the
// onbeforeunload event, don't let that happen. (see also bug#331040)
nsRefPtr < DocumentViewerImpl > kungFuDeathGrip ( this ) ;
2004-09-23 23:39:16 +00:00
{
// Never permit popups from the beforeunload handler, no matter
// how we get here.
nsAutoPopupStatePusher popupStatePusher ( openAbused , PR_TRUE ) ;
2004-02-11 06:09:51 +00:00
2004-09-23 23:39:16 +00:00
mInPermitUnload = PR_TRUE ;
2009-06-24 08:42:00 +00:00
nsEventDispatcher : : DispatchDOMEvent ( window , nsnull , event , mPresContext ,
nsnull ) ;
2004-09-23 23:39:16 +00:00
mInPermitUnload = PR_FALSE ;
}
2004-02-11 06:09:51 +00:00
2005-05-15 00:30:02 +00:00
nsCOMPtr < nsIDocShellTreeNode > docShellNode ( do_QueryReferent ( mContainer ) ) ;
2009-06-24 08:42:00 +00:00
nsAutoString text ;
beforeUnload - > GetReturnValue ( text ) ;
if ( pEvent - > GetInternalNSEvent ( ) - > flags & NS_EVENT_FLAG_NO_DEFAULT | |
! text . IsEmpty ( ) ) {
2004-02-11 06:09:51 +00:00
// Ask the user if it's ok to unload the current page
2005-05-15 00:30:02 +00:00
nsCOMPtr < nsIPrompt > prompt = do_GetInterface ( docShellNode ) ;
2004-02-11 06:09:51 +00:00
if ( prompt ) {
2005-01-18 23:46:59 +00:00
nsXPIDLString preMsg , postMsg ;
2004-12-17 20:40:48 +00:00
rv = nsContentUtils : : GetLocalizedString ( nsContentUtils : : eDOM_PROPERTIES ,
" OnBeforeUnloadPreMessage " ,
preMsg ) ;
rv | = nsContentUtils : : GetLocalizedString ( nsContentUtils : : eDOM_PROPERTIES ,
" OnBeforeUnloadPostMessage " ,
postMsg ) ;
2004-02-11 06:09:51 +00:00
// GetStringFromName can succeed, yet give NULL strings back.
2004-12-17 20:40:48 +00:00
if ( NS_FAILED ( rv ) | | preMsg . IsEmpty ( ) | | postMsg . IsEmpty ( ) ) {
2004-02-11 06:09:51 +00:00
NS_ERROR ( " Failed to get strings from dom.properties! " ) ;
return NS_OK ;
}
// Limit the length of the text the page can inject into this
// dialogue to 1024 characters.
2009-06-24 08:42:00 +00:00
PRInt32 len = PR_MIN ( text . Length ( ) , 1024 ) ;
2004-02-11 06:09:51 +00:00
2006-11-21 23:57:21 +00:00
nsAutoString msg ;
if ( len = = 0 ) {
2006-11-22 18:41:11 +00:00
msg = preMsg + NS_LITERAL_STRING ( " \n \n " ) + postMsg ;
2006-11-21 23:57:21 +00:00
} else {
msg = preMsg + NS_LITERAL_STRING ( " \n \n " ) +
2009-06-24 08:42:00 +00:00
StringHead ( text , len ) +
2006-11-21 23:57:21 +00:00
NS_LITERAL_STRING ( " \n \n " ) + postMsg ;
}
2004-02-11 06:09:51 +00:00
// This doesn't pass a title, which makes the title be
// "Confirm", is that ok, or do we want a localizable title for
// this dialogue?
if ( NS_FAILED ( prompt - > Confirm ( nsnull , msg . get ( ) , aPermitUnload ) ) ) {
* aPermitUnload = PR_TRUE ;
}
}
}
if ( docShellNode ) {
PRInt32 childCount ;
docShellNode - > GetChildCount ( & childCount ) ;
for ( PRInt32 i = 0 ; i < childCount & & * aPermitUnload ; + + i ) {
nsCOMPtr < nsIDocShellTreeItem > item ;
docShellNode - > GetChildAt ( i , getter_AddRefs ( item ) ) ;
nsCOMPtr < nsIDocShell > docShell ( do_QueryInterface ( item ) ) ;
2006-01-12 06:30:05 +00:00
if ( docShell ) {
nsCOMPtr < nsIContentViewer > cv ;
2004-02-11 06:09:51 +00:00
docShell - > GetContentViewer ( getter_AddRefs ( cv ) ) ;
if ( cv ) {
cv - > PermitUnload ( aPermitUnload ) ;
2006-01-12 06:30:05 +00:00
}
2004-02-11 06:09:51 +00:00
}
}
}
return NS_OK ;
}
2001-07-17 20:17:38 +00:00
NS_IMETHODIMP
2005-06-15 23:52:46 +00:00
DocumentViewerImpl : : PageHide ( PRBool aIsUnload )
2001-07-17 20:17:38 +00:00
{
2003-07-11 20:19:34 +00:00
mEnableRendering = PR_FALSE ;
2001-07-17 20:17:38 +00:00
if ( ! mDocument ) {
return NS_ERROR_NULL_POINTER ;
}
2009-02-26 22:05:42 +00:00
mDocument - > OnPageHide ( ! aIsUnload , nsnull ) ;
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 18:00:39 +00:00
// inform the window so that the focus state is reset.
NS_ENSURE_STATE ( mDocument ) ;
nsPIDOMWindow * window = mDocument - > GetWindow ( ) ;
if ( window )
window - > PageHidden ( ) ;
2007-01-25 17:59:20 +00:00
if ( aIsUnload ) {
// if Destroy() was called during OnPageHide(), mDocument is nsnull.
NS_ENSURE_STATE ( mDocument ) ;
2005-06-15 23:52:46 +00:00
2007-01-25 17:59:20 +00:00
// First, get the window from the document...
nsPIDOMWindow * window = mDocument - > GetWindow ( ) ;
2006-05-24 20:31:59 +00:00
2007-01-25 17:59:20 +00:00
if ( ! window ) {
// Fail if no window is available...
NS_ERROR ( " window not set for document! " ) ;
return NS_ERROR_NULL_POINTER ;
}
2001-07-17 20:17:38 +00:00
2007-01-25 17:59:20 +00:00
// Now, fire an Unload event to the document...
nsEventStatus status = nsEventStatus_eIgnore ;
nsEvent event ( PR_TRUE , NS_PAGE_UNLOAD ) ;
event . flags | = NS_EVENT_FLAG_CANT_BUBBLE ;
// XXX Dispatching to |window|, but using |document| as the target.
event . target = mDocument ;
2001-07-17 20:17:38 +00:00
2007-01-25 17:59:20 +00:00
// Never permit popups from the unload handler, no matter how we get
// here.
nsAutoPopupStatePusher popupStatePusher ( openAbused , PR_TRUE ) ;
2001-07-17 20:17:38 +00:00
2007-01-25 17:59:20 +00:00
nsEventDispatcher : : Dispatch ( window , mPresContext , & event , nsnull , & status ) ;
}
2007-07-24 00:04:36 +00:00
# ifdef MOZ_XUL
2007-04-20 18:20:03 +00:00
// look for open menupopups and close them after the unload event, in case
// the unload event listeners open any new popups
2008-02-08 20:23:05 +00:00
if ( mDocument )
nsContentUtils : : HidePopupsInDocument ( mDocument ) ;
2007-07-24 00:04:36 +00:00
# endif
2007-04-26 02:37:27 +00:00
return NS_OK ;
2007-01-25 17:59:20 +00:00
}
2005-11-06 19:23:03 +00:00
static void
AttachContainerRecurse ( nsIDocShell * aShell )
{
nsCOMPtr < nsIContentViewer > viewer ;
aShell - > GetContentViewer ( getter_AddRefs ( viewer ) ) ;
nsCOMPtr < nsIDocumentViewer > docViewer = do_QueryInterface ( viewer ) ;
if ( docViewer ) {
nsCOMPtr < nsIDocument > doc ;
docViewer - > GetDocument ( getter_AddRefs ( doc ) ) ;
if ( doc ) {
doc - > SetContainer ( aShell ) ;
}
nsCOMPtr < nsPresContext > pc ;
docViewer - > GetPresContext ( getter_AddRefs ( pc ) ) ;
if ( pc ) {
pc - > SetContainer ( aShell ) ;
pc - > SetLinkHandler ( nsCOMPtr < nsILinkHandler > ( do_QueryInterface ( aShell ) ) ) ;
}
nsCOMPtr < nsIPresShell > presShell ;
docViewer - > GetPresShell ( getter_AddRefs ( presShell ) ) ;
if ( presShell ) {
presShell - > SetForwardingContainer ( nsnull ) ;
}
}
// Now recurse through the children
nsCOMPtr < nsIDocShellTreeNode > node = do_QueryInterface ( aShell ) ;
NS_ASSERTION ( node , " docshells must implement nsIDocShellTreeNode " ) ;
PRInt32 childCount ;
node - > GetChildCount ( & childCount ) ;
for ( PRInt32 i = 0 ; i < childCount ; + + i ) {
nsCOMPtr < nsIDocShellTreeItem > childItem ;
node - > GetChildAt ( i , getter_AddRefs ( childItem ) ) ;
AttachContainerRecurse ( nsCOMPtr < nsIDocShell > ( do_QueryInterface ( childItem ) ) ) ;
}
}
2005-05-04 20:22:32 +00:00
NS_IMETHODIMP
2005-11-06 19:23:03 +00:00
DocumentViewerImpl : : Open ( nsISupports * aState , nsISHEntry * aSHEntry )
2005-05-04 20:22:32 +00:00
{
NS_ENSURE_TRUE ( mPresShell , NS_ERROR_NOT_INITIALIZED ) ;
2009-01-15 03:27:09 +00:00
nsIntRect bounds ;
2005-05-04 20:22:32 +00:00
mWindow - > GetBounds ( bounds ) ;
2008-09-30 16:51:26 +00:00
if ( mDocument )
mDocument - > SetContainer ( nsCOMPtr < nsISupports > ( do_QueryReferent ( mContainer ) ) ) ;
2008-10-04 20:00:09 +00:00
nsresult rv = InitInternal ( mParentWidget , aState , bounds , PR_FALSE , PR_FALSE ) ;
NS_ENSURE_SUCCESS ( rv , rv ) ;
2005-08-22 01:55:34 +00:00
if ( mPresShell )
mPresShell - > SetForwardingContainer ( nsnull ) ;
2005-11-06 19:23:03 +00:00
// Rehook the child presentations. The child shells are still in
// session history, so get them from there.
2008-09-28 19:14:28 +00:00
if ( aSHEntry ) {
nsCOMPtr < nsIDocShellTreeItem > item ;
PRInt32 itemIndex = 0 ;
while ( NS_SUCCEEDED ( aSHEntry - > ChildShellAt ( itemIndex + + ,
getter_AddRefs ( item ) ) ) & & item ) {
AttachContainerRecurse ( nsCOMPtr < nsIDocShell > ( do_QueryInterface ( item ) ) ) ;
}
2005-11-06 19:23:03 +00:00
}
2005-05-04 20:22:32 +00:00
SyncParentSubDocMap ( ) ;
2007-05-14 09:11:38 +00:00
if ( mFocusListener & & mDocument ) {
mDocument - > AddEventListenerByIID ( mFocusListener ,
NS_GET_IID ( nsIDOMFocusListener ) ) ;
2005-11-01 21:55:34 +00:00
}
2005-05-04 20:22:32 +00:00
// XXX re-enable image animations once that works correctly
2005-07-01 07:12:02 +00:00
PrepareToStartLoad ( ) ;
2005-05-04 20:22:32 +00:00
return NS_OK ;
}
2000-06-22 05:38:07 +00:00
NS_IMETHODIMP
2005-05-18 03:52:33 +00:00
DocumentViewerImpl : : Close ( nsISHEntry * aSHEntry )
2000-06-22 05:38:07 +00:00
{
2001-08-01 03:15:50 +00:00
// All callers are supposed to call close to break circular
2001-03-10 03:19:36 +00:00
// references. If we do this stuff in the destructor, the
// destructor might never be called (especially if we're being
// used from JS.
2005-05-18 03:52:33 +00:00
mSHEntry = aSHEntry ;
2001-08-01 03:15:50 +00:00
// Close is also needed to disable scripts during paint suppression,
// since we transfer the existing global object to the new document
// that is loaded. In the future, the global object may become a proxy
// for an object that can be switched in and out so that we don't need
// to disable scripts during paint suppression.
2005-05-04 20:22:32 +00:00
if ( ! mDocument )
return NS_OK ;
2002-08-21 12:01:05 +00:00
# if defined(NS_PRINTING) && defined(NS_PRINT_PREVIEW)
2005-05-04 20:22:32 +00:00
// Turn scripting back on
// after PrintPreview had turned it off
if ( GetIsPrintPreview ( ) & & mPrintEngine ) {
mPrintEngine - > TurnScriptingOn ( PR_TRUE ) ;
}
2001-11-03 14:59:39 +00:00
# endif
2002-10-01 21:57:15 +00:00
# ifdef NS_PRINTING
2005-05-04 20:22:32 +00:00
// A Close was called while we were printing
// so don't clear the ScriptGlobalObject
// or clear the mDocument below
if ( mPrintEngine & & ! mClosingWhilePrinting ) {
mClosingWhilePrinting = PR_TRUE ;
} else
# endif
{
2009-05-07 19:21:53 +00:00
// out of band cleanup of docshell
2002-10-01 21:57:15 +00:00
mDocument - > SetScriptGlobalObject ( nsnull ) ;
2005-05-18 03:52:33 +00:00
2008-12-19 23:45:56 +00:00
if ( ! mSHEntry & & mDocument )
2008-04-18 10:02:03 +00:00
mDocument - > RemovedFromDocShell ( ) ;
2002-10-01 21:57:15 +00:00
}
2002-04-17 04:17:16 +00:00
2007-05-14 09:11:38 +00:00
if ( mFocusListener & & mDocument ) {
mDocument - > RemoveEventListenerByIID ( mFocusListener ,
NS_GET_IID ( nsIDOMFocusListener ) ) ;
2002-04-17 04:17:16 +00:00
}
2001-03-10 03:19:36 +00:00
2001-08-01 03:15:50 +00:00
return NS_OK ;
}
2005-11-06 19:23:03 +00:00
static void
DetachContainerRecurse ( nsIDocShell * aShell )
{
// Unhook this docshell's presentation
nsCOMPtr < nsIContentViewer > viewer ;
aShell - > GetContentViewer ( getter_AddRefs ( viewer ) ) ;
nsCOMPtr < nsIDocumentViewer > docViewer = do_QueryInterface ( viewer ) ;
if ( docViewer ) {
nsCOMPtr < nsIDocument > doc ;
docViewer - > GetDocument ( getter_AddRefs ( doc ) ) ;
if ( doc ) {
doc - > SetContainer ( nsnull ) ;
}
nsCOMPtr < nsPresContext > pc ;
docViewer - > GetPresContext ( getter_AddRefs ( pc ) ) ;
if ( pc ) {
pc - > SetContainer ( nsnull ) ;
pc - > SetLinkHandler ( nsnull ) ;
}
nsCOMPtr < nsIPresShell > presShell ;
docViewer - > GetPresShell ( getter_AddRefs ( presShell ) ) ;
if ( presShell ) {
presShell - > SetForwardingContainer ( nsWeakPtr ( do_GetWeakReference ( aShell ) ) ) ;
}
}
// Now recurse through the children
nsCOMPtr < nsIDocShellTreeNode > node = do_QueryInterface ( aShell ) ;
NS_ASSERTION ( node , " docshells must implement nsIDocShellTreeNode " ) ;
PRInt32 childCount ;
node - > GetChildCount ( & childCount ) ;
for ( PRInt32 i = 0 ; i < childCount ; + + i ) {
nsCOMPtr < nsIDocShellTreeItem > childItem ;
node - > GetChildAt ( i , getter_AddRefs ( childItem ) ) ;
DetachContainerRecurse ( nsCOMPtr < nsIDocShell > ( do_QueryInterface ( childItem ) ) ) ;
}
}
2001-08-01 03:15:50 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : Destroy ( )
{
2005-05-04 20:22:32 +00:00
NS_ASSERTION ( mDocument , " No document in Destroy()! " ) ;
2002-08-21 12:01:05 +00:00
# ifdef NS_PRINTING
2009-01-17 01:35:19 +00:00
// Here is where we check to see if the document was still being prepared
2002-03-23 16:48:58 +00:00
// for printing when it was asked to be destroy from someone externally
2009-01-17 01:35:19 +00:00
// This usually happens if the document is unloaded while the user is in the
// Print Dialog
2002-03-23 16:48:58 +00:00
//
// So we flip the bool to remember that the document is going away
// and we can clean up and abort later after returning from the Print Dialog
2002-08-21 12:01:05 +00:00
if ( mPrintEngine ) {
if ( mPrintEngine - > CheckBeforeDestroy ( ) ) {
return NS_OK ;
}
2002-03-23 16:48:58 +00:00
}
2002-08-21 12:01:05 +00:00
# endif
2002-03-23 16:48:58 +00:00
2005-05-04 20:22:32 +00:00
// Don't let the document get unloaded while we are printing.
// this could happen if we hit the back button during printing.
// We also keep the viewer from being cached in session history, since
// we require all documents there to be sanitized.
2001-08-06 02:27:43 +00:00
if ( mDestroyRefCount ! = 0 ) {
- - mDestroyRefCount ;
return NS_OK ;
}
2005-05-04 20:22:32 +00:00
// If we were told to put ourselves into session history instead of destroy
// the presentation, do that now.
if ( mSHEntry ) {
if ( mPresShell )
mPresShell - > Freeze ( ) ;
// Make sure the presentation isn't torn down by Hide().
mSHEntry - > SetSticky ( mIsSticky ) ;
mIsSticky = PR_TRUE ;
2005-10-07 20:20:52 +00:00
PRBool savePresentation = PR_TRUE ;
2005-05-04 20:22:32 +00:00
// Remove our root view from the view hierarchy.
if ( mPresShell ) {
nsIViewManager * vm = mPresShell - > GetViewManager ( ) ;
if ( vm ) {
nsIView * rootView = nsnull ;
vm - > GetRootView ( rootView ) ;
if ( rootView ) {
nsIView * rootViewParent = rootView - > GetParent ( ) ;
if ( rootViewParent ) {
nsIViewManager * parentVM = rootViewParent - > GetViewManager ( ) ;
if ( parentVM ) {
parentVM - > RemoveChild ( rootView ) ;
}
}
}
}
}
Hide ( ) ;
// This is after Hide() so that the user doesn't see the inputs clear.
if ( mDocument ) {
nsresult rv = mDocument - > Sanitize ( ) ;
if ( NS_FAILED ( rv ) ) {
2005-10-07 20:20:52 +00:00
// If we failed to sanitize, don't save presentation.
savePresentation = PR_FALSE ;
2005-05-04 20:22:32 +00:00
}
}
2005-10-07 20:20:52 +00:00
// Reverse ownership. Do this *after* calling sanitize so that sanitize
// doesn't cause mutations that make the SHEntry drop the presentation
if ( savePresentation ) {
mSHEntry - > SetContentViewer ( this ) ;
}
else {
mSHEntry - > SyncPresentationState ( ) ;
}
2005-11-06 19:23:03 +00:00
nsCOMPtr < nsISHEntry > shEntry = mSHEntry ; // we'll need this below
2005-05-04 20:22:32 +00:00
mSHEntry = nsnull ;
// Break the link from the document/presentation to the docshell, so that
// link traversals cannot affect the currently-loaded document.
// When the presentation is restored, Open() and InitInternal() will reset
// these pointers to their original values.
if ( mDocument )
mDocument - > SetContainer ( nsnull ) ;
2005-06-21 02:18:57 +00:00
if ( mPresContext ) {
2005-05-04 20:22:32 +00:00
mPresContext - > SetLinkHandler ( nsnull ) ;
2005-06-21 02:18:57 +00:00
mPresContext - > SetContainer ( nsnull ) ;
}
2005-08-22 01:55:34 +00:00
if ( mPresShell )
mPresShell - > SetForwardingContainer ( mContainer ) ;
2005-05-04 20:22:32 +00:00
2005-11-06 19:23:03 +00:00
// Do the same for our children. Note that we need to get the child
// docshells from the SHEntry now; the docshell will have cleared them.
nsCOMPtr < nsIDocShellTreeItem > item ;
PRInt32 itemIndex = 0 ;
while ( NS_SUCCEEDED ( shEntry - > ChildShellAt ( itemIndex + + ,
getter_AddRefs ( item ) ) ) & & item ) {
DetachContainerRecurse ( nsCOMPtr < nsIDocShell > ( do_QueryInterface ( item ) ) ) ;
}
2005-05-04 20:22:32 +00:00
return NS_OK ;
}
2005-06-02 01:02:16 +00:00
if ( mDocument ) {
mDocument - > Destroy ( ) ;
mDocument = nsnull ;
}
2005-05-04 20:22:32 +00:00
2001-08-01 03:15:50 +00:00
// All callers are supposed to call destroy to break circular
// references. If we do this stuff in the destructor, the
// destructor might never be called (especially if we're being
// used from JS.
2008-04-09 05:24:13 +00:00
# ifdef NS_PRINTING
if ( mPrintEngine ) {
# ifdef NS_PRINT_PREVIEW
PRBool doingPrintPreview ;
mPrintEngine - > GetDoingPrintPreview ( & doingPrintPreview ) ;
if ( doingPrintPreview ) {
mPrintEngine - > FinishPrintPreview ( ) ;
}
# endif
mPrintEngine - > Destroy ( ) ;
mPrintEngine = nsnull ;
}
# endif
2001-08-01 03:15:50 +00:00
// Avoid leaking the old viewer.
if ( mPreviousViewer ) {
mPreviousViewer - > Destroy ( ) ;
mPreviousViewer = nsnull ;
}
2008-01-21 02:05:38 +00:00
mDeviceContext = nsnull ;
2001-03-10 03:19:36 +00:00
if ( mPresShell ) {
2009-01-14 12:24:10 +00:00
DestroyPresShell ( ) ;
2001-03-10 03:19:36 +00:00
}
2002-04-17 04:17:16 +00:00
2004-02-11 06:48:37 +00:00
if ( mPresContext ) {
mPresContext - > SetContainer ( nsnull ) ;
mPresContext - > SetLinkHandler ( nsnull ) ;
mPresContext = nsnull ;
}
2004-02-11 06:09:51 +00:00
mContainer = nsnull ;
2001-03-10 03:19:36 +00:00
return NS_OK ;
2000-06-22 05:38:07 +00:00
}
1999-05-06 19:25:40 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : Stop ( void )
{
2001-03-10 03:19:36 +00:00
NS_ASSERTION ( mDocument , " Stop called too early or too late " ) ;
Landing changes Vidur made while the tree was closed for beta1 work, here's a list of the changes. r=me
[1] Cutting down the size of content. Made nsIJSScriptObject inherit from nsIScriptObjectOwner
[2] Cutting down the size of content. Made nsITextContent inherit from nsIContent.
[3] Cutting down the size of content. Moved implementation of nsIDOMReceiver to nsListenerManager. This is not true aggregation since it isn't transitive, but it's OK for now. It will be necessary for nsListenerManager to have a reference to its content in the future anyway, so the transitivity could be done.
dom/public/nsDOMPropEnums.h,v - bug 12559
dom/public/nsIJSScriptObject.h,v - [1]
dom/public/html/MANIFEST,v - bug 12559
dom/public/html/Makefile.in,v - bug 12559
dom/public/html/makefile.win,v - bug 12559
dom/public/html/nsIDOMHTMLInputElement.h,v - bug 17544
dom/public/idl/html/HTMLAnchorElement.idl,v - bug 12559
dom/public/idl/html/HTMLAreaElement.idl,v - bug 12559
dom/public/idl/html/HTMLInputElement.idl,v - bug 17544
dom/src/base/nsGlobalWindow.cpp,v - bug 30700
dom/src/base/nsGlobalWindow.h,v - [1]
dom/src/base/nsLocation.cpp,v - [1]
dom/src/html/nsJSHTMLAnchorElement.cpp,v - bug 12559
dom/src/html/nsJSHTMLAreaElement.cpp,v - bug 12559
dom/src/html/nsJSHTMLInputElement.cpp,v - bug 17544
layout/base/public/nsIDocument.h,v - bug 27953
layout/base/public/nsITextContent.h,v - [2]
layout/base/src/nsCommentNode.cpp,v - [2]
layout/base/src/nsDocument.cpp,v - bug 27953
layout/base/src/nsDocument.h,v - bug 27953
layout/base/src/nsDocumentViewer.cpp,v - bug 27953
layout/base/src/nsGenericDOMDataNode.cpp,v - [3]
layout/base/src/nsGenericDOMDataNode.h,v - [3]
layout/base/src/nsGenericElement.cpp,v - [3]
layout/base/src/nsGenericElement.h,v - [3]
layout/base/src/nsNameSpaceManager.cpp,v - bug 7834
layout/base/src/nsStyleContext.cpp,v - outline property shouldn't reflow
layout/base/src/nsTextNode.cpp,v - [2]
layout/events/src/nsEventListenerManager.cpp,v - [3]
layout/events/src/nsEventListenerManager.h,v - [3]
layout/html/base/src/nsGfxScrollFrame.cpp,v - nsString->nsAutoString
layout/html/content/src/nsAttributeContent.cpp,v - [2]
layout/html/content/src/nsHTMLAnchorElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLAppletElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLAreaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBRElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBaseElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBaseFontElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBodyElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLButtonElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDelElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDirectoryElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDivElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLEmbedElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFieldSetElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFontElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFormElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFrameElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFrameSetElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHRElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHeadElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHeadingElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHtmlElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLIFrameElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLImageElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLInputElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLInsElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLIsIndexElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLIElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLabelElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLayerElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLegendElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLinkElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMapElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMenuElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMetaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLModElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLObjectElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOptGroupElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOptionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLParagraphElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLParamElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLPreElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLQuoteElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLScriptElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSelectElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSpacerElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSpanElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLStyleElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableCaptionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableCellElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableColElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableColGroupElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableRowElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableSectionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTextAreaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTitleElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLUListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLWBRElement.cpp,v - [1][3]
layout/html/document/src/nsHTMLDocument.cpp,v - bug 27953
layout/html/document/src/nsHTMLDocument.h,v - bug 27953
layout/xml/content/src/nsXMLCDATASection.cpp,v - [1][2]
layout/xml/content/src/nsXMLDocumentType.cpp,v - [1][2]
layout/xml/content/src/nsXMLElement.h,v - [1][2]
layout/xml/content/src/nsXMLEntity.cpp,v - [1][2]
layout/xml/content/src/nsXMLNotation.cpp,v - [1][2]
layout/xml/content/src/nsXMLProcessingInstruction.cpp,v - [1][2]
layout/xul/base/src/nsBoxFrame.cpp,v - nsString->nsAutoString
layout/xul/base/src/nsSliderFrame.cpp,v - nsString->nsAutoString
netwerk/protocol/http/src/nsHTTPRequest.cpp,v - nsString->nsAutoString
rdf/content/src/nsXULDocument.cpp,v - bug 27953
rdf/content/src/nsXULDocument.h,v - bug 27953
rdf/content/src/nsXULElement.h,v - [1]
xpcom/base/IIDS.h,v - bug 12559
2000-03-17 13:27:00 +00:00
if ( mDocument ) {
mDocument - > StopDocumentLoad ( ) ;
}
2005-05-04 20:22:32 +00:00
if ( mEnableRendering & & ( mLoaded | | mStopped ) & & mPresContext & & ! mSHEntry )
2003-07-11 20:19:34 +00:00
mPresContext - > SetImageAnimationMode ( imgIContainer : : kDontAnimMode ) ;
2001-05-01 22:50:16 +00:00
mStopped = PR_TRUE ;
if ( ! mLoaded & & mPresShell ) {
// Well, we might as well paint what we have so far.
2007-04-27 11:06:22 +00:00
nsCOMPtr < nsIPresShell > shellDeathGrip ( mPresShell ) ; // bug 378682
2001-05-01 22:50:16 +00:00
mPresShell - > UnsuppressPainting ( ) ;
1999-05-06 19:25:40 +00:00
}
2001-04-25 19:52:49 +00:00
1999-05-06 19:25:40 +00:00
return NS_OK ;
}
2000-06-22 05:38:07 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : GetDOMDocument ( nsIDOMDocument * * aResult )
{
2001-03-10 03:19:36 +00:00
NS_ENSURE_TRUE ( mDocument , NS_ERROR_NOT_AVAILABLE ) ;
2003-03-26 07:41:30 +00:00
return CallQueryInterface ( mDocument , aResult ) ;
2000-06-22 05:38:07 +00:00
}
NS_IMETHODIMP
DocumentViewerImpl : : SetDOMDocument ( nsIDOMDocument * aDocument )
{
2000-09-02 15:32:28 +00:00
// Assumptions:
//
// 1) this document viewer has been initialized with a call to Init().
2002-04-17 04:17:16 +00:00
// 2) the stylesheets associated with the document have been added
// to the document.
2000-09-02 15:32:28 +00:00
2002-04-17 04:17:16 +00:00
// XXX Right now, this method assumes that the layout of the current
// document hasn't started yet. More cleanup will probably be
// necessary to make this method work for the case when layout *has*
// occurred for the current document.
2000-09-02 15:32:28 +00:00
// That work can happen when and if it is needed.
2002-04-17 04:17:16 +00:00
2000-09-02 15:32:28 +00:00
nsresult rv ;
2002-04-17 04:17:16 +00:00
if ( ! aDocument )
2000-09-02 15:32:28 +00:00
return NS_ERROR_NULL_POINTER ;
nsCOMPtr < nsIDocument > newDoc = do_QueryInterface ( aDocument , & rv ) ;
if ( NS_FAILED ( rv ) ) return rv ;
2005-02-05 13:41:00 +00:00
// Set new container
2005-05-15 00:30:02 +00:00
nsCOMPtr < nsISupports > container = do_QueryReferent ( mContainer ) ;
newDoc - > SetContainer ( container ) ;
2005-02-05 13:41:00 +00:00
2005-07-30 20:57:07 +00:00
if ( mDocument ! = newDoc ) {
// Replace the old document with the new one. Do this only when
// the new document really is a new document.
mDocument = newDoc ;
2002-04-04 22:42:19 +00:00
2005-07-30 20:57:07 +00:00
// Set the script global object on the new document
2005-12-01 19:35:27 +00:00
nsCOMPtr < nsPIDOMWindow > window = do_GetInterface ( container ) ;
if ( window ) {
window - > SetNewDocument ( newDoc , nsnull , PR_TRUE ) ;
2005-07-30 20:57:07 +00:00
}
2006-06-26 19:06:20 +00:00
// Clear the list of old child docshells. CChild docshells for the new
// document will be constructed as frames are created.
nsCOMPtr < nsIDocShellTreeNode > node = do_QueryInterface ( container ) ;
if ( node ) {
PRInt32 count ;
node - > GetChildCount ( & count ) ;
for ( PRInt32 i = 0 ; i < count ; + + i ) {
nsCOMPtr < nsIDocShellTreeItem > child ;
node - > GetChildAt ( 0 , getter_AddRefs ( child ) ) ;
node - > RemoveChild ( child ) ;
}
}
2002-04-17 04:17:16 +00:00
}
2002-04-04 22:42:19 +00:00
2005-07-30 20:57:07 +00:00
rv = SyncParentSubDocMap ( ) ;
NS_ENSURE_SUCCESS ( rv , rv ) ;
2005-02-05 13:41:00 +00:00
// Replace the current pres shell with a new shell for the new document
2002-04-04 22:42:19 +00:00
2004-08-25 14:17:40 +00:00
nsCOMPtr < nsILinkHandler > linkHandler ;
2002-04-17 04:17:16 +00:00
if ( mPresShell ) {
2007-12-01 10:42:12 +00:00
nsSize currentSize ( 0 , 0 ) ;
if ( mViewManager ) {
mViewManager - > GetWindowDimensions ( & currentSize . width , & currentSize . height ) ;
}
2004-08-25 14:17:40 +00:00
if ( mPresContext ) {
// Save the linkhandler (nsPresShell::Destroy removes it from
// mPresContext).
linkHandler = mPresContext - > GetLinkHandler ( ) ;
}
2009-01-14 12:24:10 +00:00
DestroyPresShell ( ) ;
2007-12-01 10:42:12 +00:00
// This destroys the root view because it was associated with the root frame,
// which has been torn down. Recreate the viewmanager and root view.
MakeWindow ( currentSize ) ;
2002-04-17 04:17:16 +00:00
}
// And if we're already given a prescontext...
if ( mPresContext ) {
2004-08-25 14:17:40 +00:00
// If we had a linkHandler and it got removed, put it back.
if ( linkHandler ) {
mPresContext - > SetLinkHandler ( linkHandler ) ;
}
2009-01-18 15:21:26 +00:00
rv = InitPresentationStuff ( PR_FALSE , PR_FALSE ) ;
if ( NS_SUCCEEDED ( rv ) & & mEnableRendering & & mViewManager ) {
mViewManager - > EnableRefresh ( NS_VMREFRESH_IMMEDIATE ) ;
}
2000-09-02 15:32:28 +00:00
}
return rv ;
2000-06-22 05:38:07 +00:00
}
1999-05-06 19:25:40 +00:00
NS_IMETHODIMP
2003-06-13 20:10:01 +00:00
DocumentViewerImpl : : GetDocument ( nsIDocument * * aResult )
1999-05-06 19:25:40 +00:00
{
2003-06-13 20:10:01 +00:00
NS_IF_ADDREF ( * aResult = mDocument ) ;
1999-05-06 19:25:40 +00:00
return NS_OK ;
}
2002-04-17 04:17:16 +00:00
2007-11-09 10:19:12 +00:00
nsIPresShell *
DocumentViewerImpl : : GetPresShell ( )
{
if ( ! GetIsPrintPreview ( ) ) {
return mPresShell ;
}
NS_ENSURE_TRUE ( mDocument , nsnull ) ;
nsCOMPtr < nsIPresShell > shell ;
nsCOMPtr < nsIPresShell > currentShell ;
nsPresShellIterator iter ( mDocument ) ;
while ( ( shell = iter . GetNextShell ( ) ) ) {
currentShell . swap ( shell ) ;
}
return currentShell . get ( ) ;
}
nsPresContext *
DocumentViewerImpl : : GetPresContext ( )
{
if ( ! GetIsPrintPreview ( ) ) {
return mPresContext ;
}
nsIPresShell * shell = GetPresShell ( ) ;
return shell ? shell - > GetPresContext ( ) : nsnull ;
}
nsIViewManager *
DocumentViewerImpl : : GetViewManager ( )
{
if ( ! GetIsPrintPreview ( ) ) {
return mViewManager ;
}
nsIPresShell * shell = GetPresShell ( ) ;
return shell ? shell - > GetViewManager ( ) : nsnull ;
}
1999-05-06 19:25:40 +00:00
NS_IMETHODIMP
2003-06-13 20:10:01 +00:00
DocumentViewerImpl : : GetPresShell ( nsIPresShell * * aResult )
1999-05-06 19:25:40 +00:00
{
2007-11-09 10:19:12 +00:00
nsIPresShell * shell = GetPresShell ( ) ;
NS_IF_ADDREF ( * aResult = shell ) ;
1999-05-06 19:25:40 +00:00
return NS_OK ;
}
2002-04-17 04:17:16 +00:00
1999-05-06 19:25:40 +00:00
NS_IMETHODIMP
2004-07-31 23:15:21 +00:00
DocumentViewerImpl : : GetPresContext ( nsPresContext * * aResult )
1999-05-06 19:25:40 +00:00
{
2007-11-09 10:19:12 +00:00
nsPresContext * pc = GetPresContext ( ) ;
NS_IF_ADDREF ( * aResult = pc ) ;
1999-05-06 19:25:40 +00:00
return NS_OK ;
}
NS_IMETHODIMP
2009-01-15 03:27:09 +00:00
DocumentViewerImpl : : GetBounds ( nsIntRect & aResult )
1999-05-06 19:25:40 +00:00
{
2001-03-10 03:19:36 +00:00
NS_ENSURE_TRUE ( mDocument , NS_ERROR_NOT_AVAILABLE ) ;
1999-05-06 19:25:40 +00:00
NS_PRECONDITION ( mWindow , " null window " ) ;
if ( mWindow ) {
mWindow - > GetBounds ( aResult ) ;
}
else {
aResult . SetRect ( 0 , 0 , 0 , 0 ) ;
}
return NS_OK ;
}
2001-05-01 22:50:16 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : GetPreviousViewer ( nsIContentViewer * * aViewer )
{
* aViewer = mPreviousViewer ;
NS_IF_ADDREF ( * aViewer ) ;
return NS_OK ;
}
NS_IMETHODIMP
DocumentViewerImpl : : SetPreviousViewer ( nsIContentViewer * aViewer )
{
2001-08-01 03:15:50 +00:00
// NOTE: |Show| sets |mPreviousViewer| to null without calling this
// function.
if ( aViewer ) {
NS_ASSERTION ( ! mPreviousViewer ,
" can't set previous viewer when there already is one " ) ;
2001-05-01 22:50:16 +00:00
// In a multiple chaining situation (which occurs when running a thrashing
2002-04-17 04:17:16 +00:00
// test like i-bench or jrgm's tests with no delay), we can build up a
2001-05-01 22:50:16 +00:00
// whole chain of viewers. In order to avoid this, we always set our previous
// viewer to the MOST previous viewer in the chain, and then dump the intermediate
// link from the chain. This ensures that at most only 2 documents are alive
// and undestroyed at any given time (the one that is showing and the one that
// is loading with painting suppressed).
2007-10-06 00:35:00 +00:00
// It's very important that if this ever gets changed the code
// before the RestorePresentation call in nsDocShell::InternalLoad
// be changed accordingly.
2001-05-01 22:50:16 +00:00
nsCOMPtr < nsIContentViewer > prevViewer ;
aViewer - > GetPreviousViewer ( getter_AddRefs ( prevViewer ) ) ;
if ( prevViewer ) {
2001-08-01 03:15:50 +00:00
aViewer - > SetPreviousViewer ( nsnull ) ;
aViewer - > Destroy ( ) ;
return SetPreviousViewer ( prevViewer ) ;
2001-05-01 22:50:16 +00:00
}
}
mPreviousViewer = aViewer ;
return NS_OK ;
}
1999-05-06 19:25:40 +00:00
NS_IMETHODIMP
2009-01-15 03:27:09 +00:00
DocumentViewerImpl : : SetBounds ( const nsIntRect & aBounds )
1999-05-06 19:25:40 +00:00
{
2001-03-10 03:19:36 +00:00
NS_ENSURE_TRUE ( mDocument , NS_ERROR_NOT_AVAILABLE ) ;
2002-04-17 04:17:16 +00:00
1999-05-06 19:25:40 +00:00
if ( mWindow ) {
// Don't have the widget repaint. Layout will generate repaint requests
// during reflow
mWindow - > Resize ( aBounds . x , aBounds . y , aBounds . width , aBounds . height ,
PR_FALSE ) ;
}
2005-08-02 20:19:19 +00:00
// If there's a previous viewer, it's the one that's actually showing,
// so be sure to resize it as well so it paints over the right area.
// This may slow down the performance of the new page load, but resize
// during load is also probably a relatively unusual condition
// relating to things being hidden while something is loaded. It so
// happens that Firefox does this a good bit with its infobar, and it
// looks ugly if we don't do this.
if ( mPreviousViewer )
mPreviousViewer - > SetBounds ( aBounds ) ;
2006-12-12 23:00:52 +00:00
# if defined(NS_PRINTING) && defined(NS_PRINT_PREVIEW)
2007-01-01 10:53:11 +00:00
if ( GetIsPrintPreview ( ) & & ! mPrintEngine - > GetIsCreatingPrintPreview ( ) ) {
mPrintEngine - > GetPrintPreviewWindow ( ) - > Resize ( aBounds . x , aBounds . y ,
aBounds . width , aBounds . height ,
PR_FALSE ) ;
2006-12-10 08:05:05 +00:00
}
2006-12-12 23:00:52 +00:00
# endif
1999-05-06 19:25:40 +00:00
return NS_OK ;
}
NS_IMETHODIMP
DocumentViewerImpl : : Move ( PRInt32 aX , PRInt32 aY )
{
2001-03-10 03:19:36 +00:00
NS_ENSURE_TRUE ( mDocument , NS_ERROR_NOT_AVAILABLE ) ;
1999-05-06 19:25:40 +00:00
NS_PRECONDITION ( mWindow , " null window " ) ;
if ( mWindow ) {
mWindow - > Move ( aX , aY ) ;
}
return NS_OK ;
}
NS_IMETHODIMP
DocumentViewerImpl : : Show ( void )
{
2001-03-10 03:19:36 +00:00
NS_ENSURE_TRUE ( mDocument , NS_ERROR_NOT_AVAILABLE ) ;
2001-08-01 03:15:50 +00:00
// We don't need the previous viewer anymore since we're not
// displaying it.
if ( mPreviousViewer ) {
// This little dance *may* only be to keep
// PresShell::EndObservingDocument happy, but I'm not sure.
nsCOMPtr < nsIContentViewer > prevViewer ( mPreviousViewer ) ;
mPreviousViewer = nsnull ;
prevViewer - > Destroy ( ) ;
2005-09-23 18:16:40 +00:00
// Make sure we don't have too many cached ContentViewers
nsCOMPtr < nsIDocShellTreeItem > treeItem = do_QueryReferent ( mContainer ) ;
if ( treeItem ) {
// We need to find the root DocShell since only that object has an
// SHistory and we need the SHistory to evict content viewers
nsCOMPtr < nsIDocShellTreeItem > root ;
treeItem - > GetSameTypeRootTreeItem ( getter_AddRefs ( root ) ) ;
nsCOMPtr < nsIWebNavigation > webNav = do_QueryInterface ( root ) ;
nsCOMPtr < nsISHistory > history ;
webNav - > GetSessionHistory ( getter_AddRefs ( history ) ) ;
nsCOMPtr < nsISHistoryInternal > historyInt = do_QueryInterface ( history ) ;
if ( historyInt ) {
2008-09-29 18:28:15 +00:00
PRInt32 prevIndex , loadedIndex ;
nsCOMPtr < nsIDocShell > docShell = do_QueryInterface ( treeItem ) ;
docShell - > GetPreviousTransIndex ( & prevIndex ) ;
docShell - > GetLoadedTransIndex ( & loadedIndex ) ;
2005-09-23 18:16:40 +00:00
# ifdef DEBUG_PAGE_CACHE
2008-09-29 18:28:15 +00:00
printf ( " About to evict content viewers: prev=%d, loaded=%d \n " ,
prevIndex , loadedIndex ) ;
2005-09-23 18:16:40 +00:00
# endif
2008-09-29 18:28:15 +00:00
historyInt - > EvictContentViewers ( prevIndex , loadedIndex ) ;
2005-09-23 18:16:40 +00:00
}
}
2001-08-01 03:15:50 +00:00
}
1999-05-06 19:25:40 +00:00
if ( mWindow ) {
mWindow - > Show ( PR_TRUE ) ;
}
2002-04-17 04:17:16 +00:00
if ( mDocument & & ! mPresShell & & ! mWindow ) {
2005-05-15 00:30:02 +00:00
nsCOMPtr < nsIBaseWindow > base_win ( do_QueryReferent ( mContainer ) ) ;
2008-09-28 19:14:28 +00:00
if ( base_win ) {
base_win - > GetParentWidget ( & mParentWidget ) ;
NS_ENSURE_TRUE ( mParentWidget , NS_ERROR_UNEXPECTED ) ;
mParentWidget - > Release ( ) ; // GetParentWidget AddRefs, but mParentWidget is weak
}
2002-04-17 04:17:16 +00:00
2008-08-18 19:22:19 +00:00
nsresult rv = CreateDeviceContext ( mParentWidget ) ;
NS_ENSURE_SUCCESS ( rv , rv ) ;
2002-04-17 04:17:16 +00:00
// Create presentation context
2004-02-11 06:48:37 +00:00
NS_ASSERTION ( ! mPresContext , " Shouldn't have a prescontext if we have no shell! " ) ;
2006-05-19 10:26:44 +00:00
mPresContext = new nsPresContext ( mDocument , nsPresContext : : eContext_Galley ) ;
2004-07-29 19:41:39 +00:00
NS_ENSURE_TRUE ( mPresContext , NS_ERROR_OUT_OF_MEMORY ) ;
2002-04-17 04:17:16 +00:00
2004-01-21 09:35:59 +00:00
rv = mPresContext - > Init ( mDeviceContext ) ;
if ( NS_FAILED ( rv ) ) {
mPresContext = nsnull ;
return rv ;
}
2002-04-17 04:17:16 +00:00
2009-01-15 03:27:09 +00:00
nsIntRect tbounds ;
2008-09-28 19:14:28 +00:00
if ( mParentWidget ) {
mParentWidget - > GetBounds ( tbounds ) ;
} else {
// No good default size; just size to 0 by 0 for lack of anything better.
2009-01-15 03:27:09 +00:00
tbounds = nsIntRect ( 0 , 0 , 0 , 0 ) ;
2008-09-28 19:14:28 +00:00
}
2002-04-17 04:17:16 +00:00
2007-12-01 10:42:12 +00:00
rv = MakeWindow ( nsSize ( mPresContext - > DevPixelsToAppUnits ( tbounds . width ) ,
mPresContext - > DevPixelsToAppUnits ( tbounds . height ) ) ) ;
2002-04-17 04:17:16 +00:00
if ( NS_FAILED ( rv ) )
return rv ;
2005-05-15 00:30:02 +00:00
if ( mPresContext & & base_win ) {
nsCOMPtr < nsILinkHandler > linkHandler ( do_GetInterface ( base_win ) ) ;
2002-04-17 04:17:16 +00:00
if ( linkHandler ) {
mPresContext - > SetLinkHandler ( linkHandler ) ;
}
2005-05-15 00:30:02 +00:00
mPresContext - > SetContainer ( base_win ) ;
2002-04-17 04:17:16 +00:00
}
if ( mPresContext ) {
Hide ( ) ;
2008-01-20 18:02:02 +00:00
rv = InitPresentationStuff ( mDocument - > MayStartLayout ( ) ,
mDocument - > MayStartLayout ( ) ) ;
2002-04-17 04:17:16 +00:00
}
// If we get here the document load has already started and the
// window is shown because some JS on the page caused it to be
// shown...
2007-04-27 11:06:22 +00:00
nsCOMPtr < nsIPresShell > shellDeathGrip ( mPresShell ) ; // bug 378682
2002-04-17 04:17:16 +00:00
mPresShell - > UnsuppressPainting ( ) ;
}
1999-05-06 19:25:40 +00:00
return NS_OK ;
}
NS_IMETHODIMP
DocumentViewerImpl : : Hide ( void )
{
NS_PRECONDITION ( mWindow , " null window " ) ;
if ( mWindow ) {
mWindow - > Show ( PR_FALSE ) ;
}
2002-04-17 04:17:16 +00:00
2006-12-10 08:05:05 +00:00
if ( ! mPresShell )
2002-04-17 04:17:16 +00:00
return NS_OK ;
2004-02-11 06:48:37 +00:00
NS_ASSERTION ( mPresContext , " Can't have a presshell and no prescontext! " ) ;
2002-04-17 04:17:16 +00:00
// Avoid leaking the old viewer.
if ( mPreviousViewer ) {
mPreviousViewer - > Destroy ( ) ;
mPreviousViewer = nsnull ;
}
2002-04-24 00:33:56 +00:00
if ( mIsSticky ) {
// This window is sticky, that means that it might be shown again
// and we don't want the presshell n' all that to be thrown away
// just because the window is hidden.
return NS_OK ;
}
2005-05-15 00:30:02 +00:00
nsCOMPtr < nsIDocShell > docShell ( do_QueryReferent ( mContainer ) ) ;
2003-05-30 00:21:01 +00:00
if ( docShell ) {
2008-12-03 17:55:14 +00:00
nsCOMPtr < nsILayoutHistoryState > layoutState ;
mPresShell - > CaptureHistoryState ( getter_AddRefs ( layoutState ) , PR_TRUE ) ;
2003-05-30 00:21:01 +00:00
}
2009-01-14 12:24:10 +00:00
DestroyPresShell ( ) ;
2004-02-11 06:48:37 +00:00
// Clear weak refs
mPresContext - > SetContainer ( nsnull ) ;
mPresContext - > SetLinkHandler ( nsnull ) ;
2002-04-17 04:17:16 +00:00
mPresContext = nsnull ;
mViewManager = nsnull ;
mWindow = nsnull ;
mDeviceContext = nsnull ;
mParentWidget = nsnull ;
2005-05-15 00:30:02 +00:00
nsCOMPtr < nsIBaseWindow > base_win ( do_QueryReferent ( mContainer ) ) ;
2002-04-17 04:17:16 +00:00
if ( base_win ) {
base_win - > SetParentWidget ( nsnull ) ;
}
1999-05-06 19:25:40 +00:00
return NS_OK ;
}
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : SetEnableRendering ( PRBool aOn )
2000-09-22 14:42:13 +00:00
{
2002-08-21 12:01:05 +00:00
NS_ENSURE_TRUE ( mDocument , NS_ERROR_NOT_AVAILABLE ) ;
mEnableRendering = aOn ;
if ( mViewManager ) {
if ( aOn ) {
mViewManager - > EnableRefresh ( NS_VMREFRESH_IMMEDIATE ) ;
2004-05-17 16:29:13 +00:00
nsIView * view ;
mViewManager - > GetRootView ( view ) ; // views are not refCounted
if ( view ) {
mViewManager - > UpdateView ( view , NS_VMREFRESH_IMMEDIATE ) ;
}
2000-09-22 14:42:13 +00:00
}
2002-08-21 12:01:05 +00:00
else {
mViewManager - > DisableRefresh ( ) ;
}
2000-09-22 14:42:13 +00:00
}
2002-08-21 12:01:05 +00:00
return NS_OK ;
2000-09-22 14:42:13 +00:00
}
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : GetSticky ( PRBool * aSticky )
2001-04-12 13:04:29 +00:00
{
2002-08-21 12:01:05 +00:00
* aSticky = mIsSticky ;
2002-03-26 11:43:40 +00:00
2002-08-21 12:01:05 +00:00
return NS_OK ;
}
2002-03-26 11:43:40 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : SetSticky ( PRBool aSticky )
{
mIsSticky = aSticky ;
2002-03-26 11:43:40 +00:00
2002-08-21 12:01:05 +00:00
return NS_OK ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : GetEnableRendering ( PRBool * aResult )
{
NS_ENSURE_TRUE ( mDocument , NS_ERROR_NOT_AVAILABLE ) ;
NS_PRECONDITION ( nsnull ! = aResult , " null OUT ptr " ) ;
if ( aResult ) {
* aResult = mEnableRendering ;
}
return NS_OK ;
2002-01-25 14:30:14 +00:00
}
2003-09-26 21:45:15 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : RequestWindowClose ( PRBool * aCanClose )
{
# ifdef NS_PRINTING
if ( mPrintIsPending | | ( mPrintEngine & & mPrintEngine - > GetIsPrinting ( ) ) ) {
* aCanClose = PR_FALSE ;
mDeferredWindowClose = PR_TRUE ;
} else
# endif
* aCanClose = PR_TRUE ;
return NS_OK ;
}
2008-10-10 15:04:34 +00:00
static PRBool
2005-01-15 00:10:19 +00:00
AppendAgentSheet ( nsIStyleSheet * aSheet , void * aData )
{
2007-07-08 07:08:04 +00:00
nsStyleSet * styleSet = static_cast < nsStyleSet * > ( aData ) ;
2005-01-15 00:10:19 +00:00
styleSet - > AppendStyleSheet ( nsStyleSet : : eAgentSheet , aSheet ) ;
return PR_TRUE ;
}
2008-10-10 15:04:34 +00:00
static PRBool
2005-08-20 01:24:00 +00:00
PrependUserSheet ( nsIStyleSheet * aSheet , void * aData )
2005-01-15 00:10:19 +00:00
{
2007-07-08 07:08:04 +00:00
nsStyleSet * styleSet = static_cast < nsStyleSet * > ( aData ) ;
2005-08-20 01:24:00 +00:00
styleSet - > PrependStyleSheet ( nsStyleSet : : eUserSheet , aSheet ) ;
2005-01-15 00:10:19 +00:00
return PR_TRUE ;
}
2002-08-21 12:01:05 +00:00
nsresult
DocumentViewerImpl : : CreateStyleSet ( nsIDocument * aDocument ,
2004-01-07 22:30:53 +00:00
nsStyleSet * * aStyleSet )
2002-02-19 11:49:27 +00:00
{
2006-06-08 14:32:20 +00:00
// Make sure this does the same thing as PresShell::AddSheet wrt ordering.
2002-08-21 12:01:05 +00:00
// this should eventually get expanded to allow for creating
// different sets for different media
2004-01-11 09:34:07 +00:00
nsStyleSet * styleSet = new nsStyleSet ( ) ;
2004-01-07 22:30:53 +00:00
if ( ! styleSet ) {
return NS_ERROR_OUT_OF_MEMORY ;
}
2001-01-27 14:09:34 +00:00
2004-01-07 22:30:53 +00:00
styleSet - > BeginUpdate ( ) ;
2004-07-15 20:30:30 +00:00
// The document will fill in the document sheets when we create the presshell
// Handle the user sheets.
2008-10-04 20:00:09 +00:00
# ifdef DEBUG
nsCOMPtr < nsISupports > debugDocContainer = aDocument - > GetContainer ( ) ;
nsCOMPtr < nsIDocShellTreeItem > debugDocShell ( do_QueryReferent ( mContainer ) ) ;
NS_ASSERTION ( SameCOMIdentity ( debugDocContainer , debugDocShell ) ,
" Unexpected containers " ) ;
# endif
2004-03-09 19:59:09 +00:00
nsICSSStyleSheet * sheet = nsnull ;
2008-10-04 20:00:09 +00:00
if ( nsContentUtils : : IsInChromeDocshell ( aDocument ) ) {
2004-03-09 19:59:09 +00:00
sheet = nsLayoutStylesheetCache : : UserChromeSheet ( ) ;
}
else {
sheet = nsLayoutStylesheetCache : : UserContentSheet ( ) ;
}
if ( sheet )
2004-07-28 07:08:41 +00:00
styleSet - > AppendStyleSheet ( nsStyleSet : : eUserSheet , sheet ) ;
2004-03-09 19:59:09 +00:00
// Append chrome sheets (scrollbars + forms).
PRBool shouldOverride = PR_FALSE ;
2008-10-04 20:00:09 +00:00
// We don't want a docshell here for external resource docs, so just
// look at mContainer.
nsCOMPtr < nsIDocShell > ds ( do_QueryReferent ( mContainer ) ) ;
2007-02-15 23:04:33 +00:00
nsCOMPtr < nsIDOMEventTarget > chromeHandler ;
2004-03-09 19:59:09 +00:00
nsCOMPtr < nsIURI > uri ;
nsCOMPtr < nsICSSStyleSheet > csssheet ;
2008-09-28 19:14:28 +00:00
if ( ds ) {
ds - > GetChromeEventHandler ( getter_AddRefs ( chromeHandler ) ) ;
}
2004-03-09 19:59:09 +00:00
if ( chromeHandler ) {
nsCOMPtr < nsIDOMElement > elt ( do_QueryInterface ( chromeHandler ) ) ;
nsCOMPtr < nsIContent > content ( do_QueryInterface ( elt ) ) ;
if ( elt & & content ) {
nsCOMPtr < nsIURI > baseURI = content - > GetBaseURI ( ) ;
nsAutoString sheets ;
elt - > GetAttribute ( NS_LITERAL_STRING ( " usechromesheets " ) , sheets ) ;
if ( ! sheets . IsEmpty ( ) & & baseURI ) {
2005-12-09 11:10:36 +00:00
nsCOMPtr < nsICSSLoader > cssLoader ;
NS_NewCSSLoader ( getter_AddRefs ( cssLoader ) ) ;
2004-03-09 19:59:09 +00:00
char * str = ToNewCString ( sheets ) ;
2004-04-14 08:19:27 +00:00
char * newStr = str ;
char * token ;
while ( ( token = nsCRT : : strtok ( newStr , " , " , & newStr ) ) ) {
2004-03-09 19:59:09 +00:00
NS_NewURI ( getter_AddRefs ( uri ) , nsDependentCString ( token ) , nsnull ,
baseURI ) ;
if ( ! uri ) continue ;
2005-09-12 18:41:15 +00:00
cssLoader - > LoadSheetSync ( uri , getter_AddRefs ( csssheet ) ) ;
2004-03-09 19:59:09 +00:00
if ( ! sheet ) continue ;
2004-07-28 07:08:41 +00:00
styleSet - > PrependStyleSheet ( nsStyleSet : : eAgentSheet , csssheet ) ;
2004-03-09 19:59:09 +00:00
shouldOverride = PR_TRUE ;
}
nsMemory : : Free ( str ) ;
2002-08-21 12:01:05 +00:00
}
2004-01-07 22:30:53 +00:00
}
2004-03-09 19:59:09 +00:00
}
2001-04-12 13:04:29 +00:00
2004-03-09 19:59:09 +00:00
if ( ! shouldOverride ) {
sheet = nsLayoutStylesheetCache : : ScrollbarsSheet ( ) ;
if ( sheet ) {
2004-07-28 07:08:41 +00:00
styleSet - > PrependStyleSheet ( nsStyleSet : : eAgentSheet , sheet ) ;
2001-04-12 13:04:29 +00:00
}
2004-01-07 22:30:53 +00:00
}
2001-04-12 13:04:29 +00:00
2004-03-09 19:59:09 +00:00
sheet = nsLayoutStylesheetCache : : FormsSheet ( ) ;
if ( sheet ) {
2004-07-28 07:08:41 +00:00
styleSet - > PrependStyleSheet ( nsStyleSet : : eAgentSheet , sheet ) ;
2004-03-09 19:59:09 +00:00
}
2008-11-03 02:29:51 +00:00
// Make sure to clone the quirk sheet so that it can be usefully
// enabled/disabled as needed.
nsCOMPtr < nsICSSStyleSheet > quirkClone ;
if ( ! nsLayoutStylesheetCache : : UASheet ( ) | |
! nsLayoutStylesheetCache : : QuirkSheet ( ) | |
NS_FAILED ( nsLayoutStylesheetCache : : QuirkSheet ( ) - >
Clone ( nsnull , nsnull , nsnull , nsnull ,
getter_AddRefs ( quirkClone ) ) ) | |
! sheet ) {
delete styleSet ;
return NS_ERROR_OUT_OF_MEMORY ;
2002-04-17 04:17:16 +00:00
}
2008-11-03 02:29:51 +00:00
// quirk.css needs to come after the regular UA sheet (or more precisely,
// after the html.css and so forth that the UA sheet imports).
styleSet - > PrependStyleSheet ( nsStyleSet : : eAgentSheet , quirkClone ) ;
styleSet - > SetQuirkStyleSheet ( quirkClone ) ;
styleSet - > PrependStyleSheet ( nsStyleSet : : eAgentSheet ,
nsLayoutStylesheetCache : : UASheet ( ) ) ;
2004-01-07 22:30:53 +00:00
2005-01-15 00:10:19 +00:00
nsCOMPtr < nsIStyleSheetService > dummy =
do_GetService ( NS_STYLESHEETSERVICE_CONTRACTID ) ;
nsStyleSheetService * sheetService = nsStyleSheetService : : gInstance ;
if ( sheetService ) {
sheetService - > AgentStyleSheets ( ) - > EnumerateForwards ( AppendAgentSheet ,
styleSet ) ;
2005-08-20 01:24:00 +00:00
sheetService - > UserStyleSheets ( ) - > EnumerateBackwards ( PrependUserSheet ,
styleSet ) ;
2005-01-15 00:10:19 +00:00
}
2004-07-15 20:30:30 +00:00
// Caller will handle calling EndUpdate, per contract.
2004-01-07 22:30:53 +00:00
* aStyleSet = styleSet ;
2002-08-21 12:01:05 +00:00
return NS_OK ;
2001-04-12 13:04:29 +00:00
}
2002-04-17 04:17:16 +00:00
2005-05-18 03:52:33 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : ClearHistoryEntry ( )
{
mSHEntry = nsnull ;
return NS_OK ;
}
2001-11-03 14:59:39 +00:00
2002-08-21 12:01:05 +00:00
//-------------------------------------------------------
2001-01-27 14:09:34 +00:00
2002-08-21 12:01:05 +00:00
nsresult
2007-12-01 10:42:12 +00:00
DocumentViewerImpl : : MakeWindow ( const nsSize & aSize )
2002-08-21 12:01:05 +00:00
{
nsresult rv ;
2001-01-27 14:09:34 +00:00
2002-08-21 12:01:05 +00:00
mViewManager = do_CreateInstance ( kViewManagerCID , & rv ) ;
if ( NS_FAILED ( rv ) )
return rv ;
2001-01-27 14:09:34 +00:00
2004-02-02 22:17:21 +00:00
nsIDeviceContext * dx = mPresContext - > DeviceContext ( ) ;
2001-01-27 14:09:34 +00:00
2004-05-17 16:29:13 +00:00
rv = mViewManager - > Init ( dx ) ;
if ( NS_FAILED ( rv ) )
return rv ;
2002-08-21 12:01:05 +00:00
// Create a child window of the parent that is our "root view/window"
2006-11-23 01:12:52 +00:00
// if aParentWidget has a view, we'll hook our view manager up to its view tree
2008-09-28 19:14:28 +00:00
nsIView * containerView =
mParentWidget ? nsIView : : GetViewFor ( mParentWidget ) : nsnull ;
2001-04-12 13:04:29 +00:00
2006-11-23 01:12:52 +00:00
if ( containerView ) {
// see if the containerView has already been hooked into a foreign view manager hierarchy
// if it has, then we have to hook into the hierarchy too otherwise bad things will happen.
nsIViewManager * containerVM = containerView - > GetViewManager ( ) ;
nsIView * pView = containerView ;
do {
pView = pView - > GetParent ( ) ;
} while ( pView & & pView - > GetViewManager ( ) = = containerVM ) ;
if ( ! pView ) {
// OK, so the container is not already hooked up into a foreign view manager hierarchy.
// That means we can choose not to hook ourselves up.
//
2007-11-08 04:50:49 +00:00
// If the parent container is a chrome shell and we are a content shell
// then we won't hook into its view
2006-11-23 01:12:52 +00:00
// tree. This will improve performance a little bit (especially given scrolling/painting perf bugs)
// but is really just for peace of mind. This check can be removed if we want to support fancy
// chrome effects like transparent controls floating over content, transparent Web browsers, and
// things like that, and the perf bugs are fixed.
nsCOMPtr < nsIDocShellTreeItem > container ( do_QueryReferent ( mContainer ) ) ;
2007-11-08 04:50:49 +00:00
nsCOMPtr < nsIDocShellTreeItem > sameTypeParent ;
if ( container ) {
container - > GetSameTypeParent ( getter_AddRefs ( sameTypeParent ) ) ;
}
2009-02-24 16:53:32 +00:00
if ( ! sameTypeParent & & mParentWidget - > GetTransparencyMode ( ) ! = eTransparencyTransparent ) {
2006-11-23 01:12:52 +00:00
containerView = nsnull ;
}
}
}
2007-12-01 10:42:12 +00:00
// The root view is always at 0,0.
nsRect tbounds ( nsPoint ( 0 , 0 ) , aSize ) ;
2004-11-04 15:06:50 +00:00
// Create a view
nsIView * view = mViewManager - > CreateView ( tbounds , containerView ) ;
if ( ! view )
return NS_ERROR_OUT_OF_MEMORY ;
2002-02-12 13:33:39 +00:00
2002-08-21 12:01:05 +00:00
// pass in a native widget to be the parent widget ONLY if the view hierarchy will stand alone.
// otherwise the view will find its own parent widget and "do the right thing" to
// establish a parent/child widget relationship
2008-09-28 19:14:28 +00:00
nsWidgetInitData initData ;
nsWidgetInitData * initDataPtr ;
if ( ! mParentWidget ) {
initDataPtr = & initData ;
initData . mWindowType = eWindowType_invisible ;
initData . mContentType =
nsContentUtils : : IsInChromeDocshell ( mDocument ) ?
eContentTypeUI : eContentTypeContent ;
} else {
initDataPtr = nsnull ;
}
rv = view - > CreateWidget ( kWidgetCID , initDataPtr ,
( containerView ! = nsnull | | ! mParentWidget ) ?
nsnull : mParentWidget - > GetNativeData ( NS_NATIVE_WIDGET ) ,
2004-05-20 03:14:41 +00:00
PR_TRUE , PR_FALSE ) ;
2003-02-22 21:48:39 +00:00
if ( NS_FAILED ( rv ) )
2002-08-21 12:01:05 +00:00
return rv ;
2002-02-12 13:33:39 +00:00
2004-05-17 16:29:13 +00:00
// Setup hierarchical relationship in view manager
mViewManager - > SetRootView ( view ) ;
2003-08-06 03:07:12 +00:00
mWindow = view - > GetWidget ( ) ;
2002-02-12 13:33:39 +00:00
2002-08-21 12:01:05 +00:00
// This SetFocus is necessary so the Arrow Key and Page Key events
// go to the scrolled view as soon as the Window is created instead of going to
// the browser window (this enables keyboard scrolling of the document)
// mWindow->SetFocus();
2002-02-12 13:33:39 +00:00
2002-08-21 12:01:05 +00:00
return rv ;
2002-02-12 13:33:39 +00:00
}
2008-08-18 19:22:19 +00:00
nsresult
DocumentViewerImpl : : CreateDeviceContext ( nsIWidget * aWidget )
{
2008-09-28 19:14:28 +00:00
NS_PRECONDITION ( ! mPresShell & & ! mPresContext & & ! mWindow ,
" This will screw up our existing presentation " ) ;
2008-10-04 20:00:09 +00:00
NS_PRECONDITION ( mDocument , " Gotta have a document here " ) ;
nsIDocument * doc = mDocument - > GetDisplayDocument ( ) ;
if ( doc ) {
NS_ASSERTION ( ! aWidget , " Shouldn't have a widget here " ) ;
// We want to use our display document's device context if possible
nsIPresShell * shell = doc - > GetPrimaryShell ( ) ;
if ( shell ) {
nsPresContext * ctx = shell - > GetPresContext ( ) ;
if ( ctx ) {
mDeviceContext = ctx - > DeviceContext ( ) ;
return NS_OK ;
}
}
}
2008-09-28 19:14:28 +00:00
// Create a device context even if we already have one, since our widget
// might have changed.
mDeviceContext = do_CreateInstance ( kDeviceContextCID ) ;
NS_ENSURE_TRUE ( mDeviceContext , NS_ERROR_FAILURE ) ;
2009-06-11 09:24:41 +00:00
mDeviceContext - > Init ( aWidget ? aWidget - > GetTopLevelWidget ( ) : nsnull ) ;
2008-08-18 19:22:19 +00:00
return NS_OK ;
}
2005-08-29 15:19:13 +00:00
// Return the selection for the document. Note that text fields have their
// own selection, which cannot be accessed with this method. Use
// mPresShell->GetSelectionForCopy() instead.
2006-12-10 08:05:05 +00:00
nsresult DocumentViewerImpl : : GetDocumentSelection ( nsISelection * * aSelection )
2002-08-21 12:01:05 +00:00
{
2006-12-10 08:05:05 +00:00
NS_ENSURE_ARG_POINTER ( aSelection ) ;
if ( ! mPresShell ) {
return NS_ERROR_NOT_INITIALIZED ;
2002-08-21 12:01:05 +00:00
}
2002-01-08 01:17:40 +00:00
2002-08-21 12:01:05 +00:00
nsCOMPtr < nsISelectionController > selcon ;
2006-12-10 08:05:05 +00:00
selcon = do_QueryInterface ( mPresShell ) ;
2002-08-21 12:01:05 +00:00
if ( selcon )
return selcon - > GetSelection ( nsISelectionController : : SELECTION_NORMAL ,
aSelection ) ;
return NS_ERROR_FAILURE ;
}
2002-01-08 01:17:40 +00:00
2002-08-21 12:01:05 +00:00
/* ========================================================================================
* nsIContentViewerEdit
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
2001-03-27 11:56:03 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : Search ( )
{
2006-10-19 22:43:59 +00:00
// Nothing to do here.
return NS_OK ;
2002-08-21 12:01:05 +00:00
}
2001-03-27 11:56:03 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetSearchable ( PRBool * aSearchable )
{
2006-10-19 22:43:59 +00:00
// Nothing to do here.
* aSearchable = PR_FALSE ;
return NS_OK ;
2002-08-21 12:01:05 +00:00
}
2001-03-27 11:56:03 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : ClearSelection ( )
{
nsresult rv ;
nsCOMPtr < nsISelection > selection ;
2001-03-27 11:56:03 +00:00
2005-08-29 15:19:13 +00:00
// use mPresShell->GetSelectionForCopy() ?
2002-08-21 12:01:05 +00:00
rv = GetDocumentSelection ( getter_AddRefs ( selection ) ) ;
if ( NS_FAILED ( rv ) ) return rv ;
2001-08-06 02:27:43 +00:00
2002-08-21 12:01:05 +00:00
return selection - > CollapseToStart ( ) ;
2001-03-27 11:56:03 +00:00
}
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : SelectAll ( )
{
// XXX this is a temporary implementation copied from nsWebShell
// for now. I think nsDocument and friends should have some helper
// functions to make this easier.
nsCOMPtr < nsISelection > selection ;
nsresult rv ;
2005-08-29 15:19:13 +00:00
// use mPresShell->GetSelectionForCopy() ?
2002-08-21 12:01:05 +00:00
rv = GetDocumentSelection ( getter_AddRefs ( selection ) ) ;
if ( NS_FAILED ( rv ) ) return rv ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
nsCOMPtr < nsIDOMHTMLDocument > htmldoc = do_QueryInterface ( mDocument ) ;
nsCOMPtr < nsIDOMNode > bodyNode ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
if ( htmldoc )
{
nsCOMPtr < nsIDOMHTMLElement > bodyElement ;
rv = htmldoc - > GetBody ( getter_AddRefs ( bodyElement ) ) ;
if ( NS_FAILED ( rv ) | | ! bodyElement ) return rv ;
2002-02-12 13:33:39 +00:00
2002-08-21 12:01:05 +00:00
bodyNode = do_QueryInterface ( bodyElement ) ;
2002-01-01 12:58:53 +00:00
}
2002-08-21 12:01:05 +00:00
else if ( mDocument )
{
2003-10-22 06:09:48 +00:00
bodyNode = do_QueryInterface ( mDocument - > GetRootContent ( ) ) ;
2001-03-27 11:56:03 +00:00
}
2002-08-21 12:01:05 +00:00
if ( ! bodyNode ) return NS_ERROR_FAILURE ;
2001-03-27 11:56:03 +00:00
2002-08-21 12:01:05 +00:00
rv = selection - > RemoveAllRanges ( ) ;
if ( NS_FAILED ( rv ) ) return rv ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
rv = selection - > SelectAllChildren ( bodyNode ) ;
return rv ;
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : CopySelection ( )
{
2007-09-01 08:53:07 +00:00
PRBool preventDefault ;
nsresult rv = FireClipboardEvent ( NS_COPY , & preventDefault ) ;
if ( NS_FAILED ( rv ) | | preventDefault )
return rv ;
2007-07-26 04:14:33 +00:00
2002-08-21 12:01:05 +00:00
return mPresShell - > DoCopy ( ) ;
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : CopyLinkLocation ( )
{
NS_ENSURE_TRUE ( mPresShell , NS_ERROR_NOT_INITIALIZED ) ;
nsCOMPtr < nsIDOMNode > node ;
2003-02-27 01:38:20 +00:00
GetPopupLinkNode ( getter_AddRefs ( node ) ) ;
2002-08-21 12:01:05 +00:00
// make noise if we're not in a link
NS_ENSURE_TRUE ( node , NS_ERROR_FAILURE ) ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
nsAutoString locationText ;
2003-02-27 01:38:20 +00:00
nsresult rv = mPresShell - > GetLinkLocation ( node , locationText ) ;
2002-08-21 12:01:05 +00:00
NS_ENSURE_SUCCESS ( rv , rv ) ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
nsCOMPtr < nsIClipboardHelper > clipboard ( do_GetService ( " @mozilla.org/widget/clipboardhelper;1 " , & rv ) ) ;
NS_ENSURE_SUCCESS ( rv , rv ) ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
// copy the href onto the clipboard
return clipboard - > CopyString ( locationText ) ;
}
2001-04-12 13:04:29 +00:00
2005-03-11 11:12:15 +00:00
NS_IMETHODIMP DocumentViewerImpl : : CopyImage ( PRInt32 aCopyFlags )
2001-04-12 13:04:29 +00:00
{
2002-08-21 12:01:05 +00:00
NS_ENSURE_TRUE ( mPresShell , NS_ERROR_NOT_INITIALIZED ) ;
2004-06-05 17:57:00 +00:00
nsCOMPtr < nsIImageLoadingContent > node ;
2003-02-27 01:38:20 +00:00
GetPopupImageNode ( getter_AddRefs ( node ) ) ;
2002-08-21 12:01:05 +00:00
// make noise if we're not in an image
NS_ENSURE_TRUE ( node , NS_ERROR_FAILURE ) ;
2003-02-27 01:38:20 +00:00
2005-03-11 11:12:15 +00:00
return nsCopySupport : : ImageCopy ( node , aCopyFlags ) ;
2001-04-12 13:04:29 +00:00
}
2007-07-26 04:14:33 +00:00
nsresult DocumentViewerImpl : : GetClipboardEventTarget ( nsIDOMNode * * aEventTarget )
{
NS_ENSURE_ARG_POINTER ( aEventTarget ) ;
* aEventTarget = nsnull ;
if ( ! mPresShell )
return NS_ERROR_NOT_INITIALIZED ;
nsCOMPtr < nsISelection > sel ;
nsresult rv = mPresShell - > GetSelectionForCopy ( getter_AddRefs ( sel ) ) ;
if ( NS_FAILED ( rv ) )
return rv ;
if ( ! sel )
return NS_ERROR_FAILURE ;
return nsCopySupport : : GetClipboardEventTarget ( sel , aEventTarget ) ;
}
2007-09-01 08:53:07 +00:00
nsresult DocumentViewerImpl : : FireClipboardEvent ( PRUint32 msg ,
PRBool * aPreventDefault )
2001-04-12 13:04:29 +00:00
{
2007-09-01 08:53:07 +00:00
* aPreventDefault = PR_FALSE ;
2007-07-26 04:14:33 +00:00
2007-09-01 08:53:07 +00:00
NS_ENSURE_TRUE ( mPresContext , NS_ERROR_NOT_INITIALIZED ) ;
2005-08-29 15:19:13 +00:00
NS_ENSURE_TRUE ( mPresShell , NS_ERROR_NOT_INITIALIZED ) ;
2007-09-01 08:53:07 +00:00
// It seems to be unsafe to fire an event handler during reflow (bug 393696)
PRBool isReflowing = PR_TRUE ;
nsresult rv = mPresShell - > IsReflowLocked ( & isReflowing ) ;
if ( NS_FAILED ( rv ) | | isReflowing )
return NS_OK ;
2007-07-26 04:14:33 +00:00
nsCOMPtr < nsIDOMNode > eventTarget ;
2007-09-01 08:53:07 +00:00
rv = GetClipboardEventTarget ( getter_AddRefs ( eventTarget ) ) ;
if ( NS_FAILED ( rv ) )
// On failure to get event target, just forget about it and don't fire.
return NS_OK ;
nsEventStatus status = nsEventStatus_eIgnore ;
nsEvent evt ( PR_TRUE , msg ) ;
nsEventDispatcher : : Dispatch ( eventTarget , mPresContext , & evt , nsnull ,
& status ) ;
// if event handler return'd false (PreventDefault)
if ( status = = nsEventStatus_eConsumeNoDefault )
* aPreventDefault = PR_TRUE ;
// Ensure that the calling function can use mPresShell -- if the event
// handler closed this window, mPresShell will be gone.
NS_ENSURE_STATE ( mPresShell ) ;
return NS_OK ;
}
NS_IMETHODIMP DocumentViewerImpl : : GetCopyable ( PRBool * aCopyable )
{
NS_ENSURE_ARG_POINTER ( aCopyable ) ;
* aCopyable = PR_FALSE ;
2008-03-06 23:05:35 +00:00
NS_ENSURE_STATE ( mPresShell ) ;
2002-08-21 12:01:05 +00:00
nsCOMPtr < nsISelection > selection ;
2008-02-24 10:55:37 +00:00
nsresult rv = mPresShell - > GetSelectionForCopy ( getter_AddRefs ( selection ) ) ;
2007-09-01 08:53:07 +00:00
if ( NS_FAILED ( rv ) )
return rv ;
2002-04-17 04:17:16 +00:00
2002-08-21 12:01:05 +00:00
PRBool isCollapsed ;
selection - > GetIsCollapsed ( & isCollapsed ) ;
2002-04-17 04:17:16 +00:00
2002-08-21 12:01:05 +00:00
* aCopyable = ! isCollapsed ;
return NS_OK ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : CutSelection ( )
2001-04-12 13:04:29 +00:00
{
2007-09-01 08:53:07 +00:00
// preventDefault's value is ignored because cut from the document has no
// default behaviour.
PRBool preventDefault ;
return FireClipboardEvent ( NS_CUT , & preventDefault ) ;
2002-08-21 12:01:05 +00:00
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetCutable ( PRBool * aCutable )
{
2007-07-26 04:14:33 +00:00
NS_ENSURE_ARG_POINTER ( aCutable ) ;
* aCutable = PR_FALSE ;
2008-02-24 10:55:37 +00:00
return NS_OK ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : Paste ( )
2001-04-12 13:04:29 +00:00
{
2007-09-01 08:53:07 +00:00
// preventDefault's value is ignored because paste into the document has no
// default behaviour.
PRBool preventDefault ;
return FireClipboardEvent ( NS_PASTE , & preventDefault ) ;
2002-08-21 12:01:05 +00:00
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetPasteable ( PRBool * aPasteable )
{
2007-07-26 04:14:33 +00:00
NS_ENSURE_ARG_POINTER ( aPasteable ) ;
* aPasteable = PR_FALSE ;
2008-02-24 10:55:37 +00:00
return NS_OK ;
2002-08-21 12:01:05 +00:00
}
2002-04-11 00:33:24 +00:00
2003-04-22 18:11:12 +00:00
/* AString getContents (in string mimeType, in boolean selectionOnly); */
NS_IMETHODIMP DocumentViewerImpl : : GetContents ( const char * mimeType , PRBool selectionOnly , nsAString & aOutValue )
{
NS_ENSURE_TRUE ( mPresShell , NS_ERROR_NOT_INITIALIZED ) ;
return mPresShell - > DoGetContents ( nsDependentCString ( mimeType ) , 0 , selectionOnly , aOutValue ) ;
}
/* readonly attribute boolean canGetContents; */
NS_IMETHODIMP DocumentViewerImpl : : GetCanGetContents ( PRBool * aCanGetContents )
{
2005-08-29 15:19:13 +00:00
return GetCopyable ( aCanGetContents ) ;
2003-04-22 18:11:12 +00:00
}
2002-08-21 12:01:05 +00:00
# ifdef XP_MAC
# pragma mark -
# endif
2002-04-11 00:33:24 +00:00
2002-08-21 12:01:05 +00:00
/* ========================================================================================
* nsIContentViewerFile
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
/** ---------------------------------------------------
* See documentation above in the nsIContentViewerfile class definition
* @ update 01 / 24 / 00 dwc
*/
NS_IMETHODIMP
DocumentViewerImpl : : Print ( PRBool aSilent ,
FILE * aDebugFile ,
nsIPrintSettings * aPrintSettings )
2001-04-12 13:04:29 +00:00
{
2002-08-21 12:01:05 +00:00
# ifdef NS_PRINTING
nsCOMPtr < nsIPrintSettings > printSettings ;
2002-01-12 12:31:05 +00:00
2002-08-21 12:01:05 +00:00
# ifdef NS_DEBUG
nsresult rv = NS_ERROR_FAILURE ;
mDebugFile = aDebugFile ;
// if they don't pass in a PrintSettings, then make one
// it will have all the default values
printSettings = aPrintSettings ;
nsCOMPtr < nsIPrintOptions > printOptions = do_GetService ( sPrintOptionsContractID , & rv ) ;
if ( NS_SUCCEEDED ( rv ) ) {
// if they don't pass in a PrintSettings, then make one
if ( printSettings = = nsnull ) {
printOptions - > CreatePrintSettings ( getter_AddRefs ( printSettings ) ) ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
NS_ASSERTION ( printSettings , " You can't PrintPreview without a PrintSettings! " ) ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
if ( printSettings ) printSettings - > SetPrintSilent ( aSilent ) ;
if ( printSettings ) printSettings - > SetShowPrintProgress ( PR_FALSE ) ;
# endif
return Print ( printSettings , nsnull ) ;
# else
return NS_ERROR_FAILURE ;
# endif
2001-04-12 13:04:29 +00:00
}
2002-10-03 10:48:59 +00:00
/* [noscript] void printWithParent (in nsIDOMWindowInternal aParentWin, in nsIPrintSettings aThePrintSettings, in nsIWebProgressListener aWPListener); */
NS_IMETHODIMP
DocumentViewerImpl : : PrintWithParent ( nsIDOMWindowInternal * aParentWin , nsIPrintSettings * aThePrintSettings , nsIWebProgressListener * aWPListener )
{
2005-09-16 02:25:37 +00:00
# ifdef NS_PRINTING
2002-10-03 10:48:59 +00:00
return Print ( aThePrintSettings , aWPListener ) ;
2005-09-16 02:25:37 +00:00
# else
return NS_ERROR_FAILURE ;
# endif
2002-10-03 10:48:59 +00:00
}
2002-08-21 12:01:05 +00:00
// nsIContentViewerFile interface
NS_IMETHODIMP
DocumentViewerImpl : : GetPrintable ( PRBool * aPrintable )
2001-04-12 13:04:29 +00:00
{
2002-08-21 12:01:05 +00:00
NS_ENSURE_ARG_POINTER ( aPrintable ) ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
* aPrintable = ! GetIsPrinting ( ) ;
2001-04-12 13:04:29 +00:00
2002-01-12 12:31:05 +00:00
return NS_OK ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
//*****************************************************************************
// nsIMarkupDocumentViewer
//*****************************************************************************
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : ScrollToNode ( nsIDOMNode * aNode )
2001-04-12 13:04:29 +00:00
{
2002-08-21 12:01:05 +00:00
NS_ENSURE_ARG ( aNode ) ;
NS_ENSURE_TRUE ( mDocument , NS_ERROR_NOT_AVAILABLE ) ;
nsCOMPtr < nsIPresShell > presShell ;
2003-06-13 20:10:01 +00:00
NS_ENSURE_SUCCESS ( GetPresShell ( getter_AddRefs ( presShell ) ) , NS_ERROR_FAILURE ) ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
// Get the nsIContent interface, because that's what we need to
// get the primary frame
2002-04-17 04:17:16 +00:00
2002-08-21 12:01:05 +00:00
nsCOMPtr < nsIContent > content ( do_QueryInterface ( aNode ) ) ;
NS_ENSURE_TRUE ( content , NS_ERROR_FAILURE ) ;
2002-04-17 04:17:16 +00:00
2007-03-06 09:53:56 +00:00
// Tell the PresShell to scroll to the primary frame of the content.
NS_ENSURE_SUCCESS ( presShell - > ScrollContentIntoView ( content ,
NS_PRESSHELL_SCROLL_TOP ,
NS_PRESSHELL_SCROLL_ANYWHERE ) ,
2002-08-21 12:01:05 +00:00
NS_ERROR_FAILURE ) ;
return NS_OK ;
2001-04-12 13:04:29 +00:00
}
2004-12-01 03:28:44 +00:00
void
2002-08-21 12:01:05 +00:00
DocumentViewerImpl : : CallChildren ( CallChildFunc aFunc , void * aClosure )
2001-04-12 13:04:29 +00:00
{
2005-05-15 00:30:02 +00:00
nsCOMPtr < nsIDocShellTreeNode > docShellNode ( do_QueryReferent ( mContainer ) ) ;
2002-08-21 12:01:05 +00:00
if ( docShellNode )
{
PRInt32 i ;
PRInt32 n ;
docShellNode - > GetChildCount ( & n ) ;
for ( i = 0 ; i < n ; i + + )
{
nsCOMPtr < nsIDocShellTreeItem > child ;
docShellNode - > GetChildAt ( i , getter_AddRefs ( child ) ) ;
nsCOMPtr < nsIDocShell > childAsShell ( do_QueryInterface ( child ) ) ;
NS_ASSERTION ( childAsShell , " null child in docshell " ) ;
if ( childAsShell )
{
nsCOMPtr < nsIContentViewer > childCV ;
childAsShell - > GetContentViewer ( getter_AddRefs ( childCV ) ) ;
if ( childCV )
{
nsCOMPtr < nsIMarkupDocumentViewer > markupCV = do_QueryInterface ( childCV ) ;
if ( markupCV ) {
( * aFunc ) ( markupCV , aClosure ) ;
}
}
}
}
}
}
2001-04-12 13:04:29 +00:00
2007-08-07 20:38:35 +00:00
struct ZoomInfo
2002-08-21 12:01:05 +00:00
{
2007-08-07 20:38:35 +00:00
float mZoom ;
2002-08-21 12:01:05 +00:00
} ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
static void
SetChildTextZoom ( nsIMarkupDocumentViewer * aChild , void * aClosure )
{
2007-08-07 20:38:35 +00:00
struct ZoomInfo * ZoomInfo = ( struct ZoomInfo * ) aClosure ;
aChild - > SetTextZoom ( ZoomInfo - > mZoom ) ;
}
static void
SetChildFullZoom ( nsIMarkupDocumentViewer * aChild , void * aClosure )
{
struct ZoomInfo * ZoomInfo = ( struct ZoomInfo * ) aClosure ;
aChild - > SetFullZoom ( ZoomInfo - > mZoom ) ;
2002-08-21 12:01:05 +00:00
}
2001-04-12 13:04:29 +00:00
2008-10-21 06:50:05 +00:00
static PRBool
2008-10-04 20:00:09 +00:00
SetExtResourceTextZoom ( nsIDocument * aDocument , void * aClosure )
{
// Would it be better to enumerate external resource viewers instead?
nsIPresShell * shell = aDocument - > GetPrimaryShell ( ) ;
if ( shell ) {
nsPresContext * ctxt = shell - > GetPresContext ( ) ;
if ( ctxt ) {
struct ZoomInfo * ZoomInfo = static_cast < struct ZoomInfo * > ( aClosure ) ;
ctxt - > SetTextZoom ( ZoomInfo - > mZoom ) ;
}
}
return PR_TRUE ;
}
2008-10-21 06:50:05 +00:00
static PRBool
2008-10-04 20:00:09 +00:00
SetExtResourceFullZoom ( nsIDocument * aDocument , void * aClosure )
{
// Would it be better to enumerate external resource viewers instead?
nsIPresShell * shell = aDocument - > GetPrimaryShell ( ) ;
if ( shell ) {
nsPresContext * ctxt = shell - > GetPresContext ( ) ;
if ( ctxt ) {
struct ZoomInfo * ZoomInfo = static_cast < struct ZoomInfo * > ( aClosure ) ;
ctxt - > SetFullZoom ( ZoomInfo - > mZoom ) ;
}
}
return PR_TRUE ;
}
2004-04-29 23:34:19 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : SetTextZoom ( float aTextZoom )
2002-08-21 12:01:05 +00:00
{
2009-03-08 19:01:02 +00:00
if ( GetIsPrintPreview ( ) ) {
return NS_OK ;
2007-11-09 10:19:12 +00:00
}
2008-01-26 23:59:50 +00:00
2009-03-08 19:01:02 +00:00
mTextZoom = aTextZoom ;
2008-01-26 23:59:50 +00:00
nsIViewManager : : UpdateViewBatch batch ( GetViewManager ( ) ) ;
2004-12-01 03:28:44 +00:00
// Set the text zoom on all children of mContainer (even if our zoom didn't
// change, our children's zoom may be different, though it would be unusual).
// Do this first, in case kids are auto-sizing and post reflow commands on
// our presshell (which should be subsumed into our own style change reflow).
2007-08-07 20:38:35 +00:00
struct ZoomInfo ZoomInfo = { aTextZoom } ;
CallChildren ( SetChildTextZoom , & ZoomInfo ) ;
2004-12-01 03:28:44 +00:00
// Now change our own zoom
2007-11-09 10:19:12 +00:00
nsPresContext * pc = GetPresContext ( ) ;
if ( pc & & aTextZoom ! = mPresContext - > TextZoom ( ) ) {
pc - > SetTextZoom ( aTextZoom ) ;
2002-08-21 12:01:05 +00:00
}
2001-04-12 13:04:29 +00:00
2008-10-04 20:00:09 +00:00
// And do the external resources
mDocument - > EnumerateExternalResources ( SetExtResourceTextZoom , & ZoomInfo ) ;
2008-01-26 23:59:50 +00:00
batch . EndUpdateViewBatch ( NS_VMREFRESH_NO_SYNC ) ;
2004-12-01 03:28:44 +00:00
return NS_OK ;
2001-04-12 13:04:29 +00:00
}
2004-04-29 23:34:19 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : GetTextZoom ( float * aTextZoom )
2001-04-12 13:04:29 +00:00
{
2002-08-21 12:01:05 +00:00
NS_ENSURE_ARG_POINTER ( aTextZoom ) ;
2007-11-09 10:19:12 +00:00
nsPresContext * pc = GetPresContext ( ) ;
* aTextZoom = pc ? pc - > TextZoom ( ) : 1.0f ;
2002-08-21 12:01:05 +00:00
return NS_OK ;
}
2001-04-13 12:32:18 +00:00
2007-07-26 03:34:16 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : SetFullZoom ( float aFullZoom )
{
2009-03-08 19:01:02 +00:00
# ifdef NS_PRINT_PREVIEW
if ( GetIsPrintPreview ( ) ) {
nsPresContext * pc = GetPresContext ( ) ;
NS_ENSURE_TRUE ( pc , NS_OK ) ;
nsCOMPtr < nsIPresShell > shell = pc - > GetPresShell ( ) ;
NS_ENSURE_TRUE ( shell , NS_OK ) ;
2009-03-11 15:43:08 +00:00
nsIViewManager : : UpdateViewBatch batch ( shell - > GetViewManager ( ) ) ;
2009-03-08 19:01:02 +00:00
if ( ! mPrintPreviewZoomed ) {
mOriginalPrintPreviewScale = pc - > GetPrintPreviewScale ( ) ;
mPrintPreviewZoomed = PR_TRUE ;
}
mPrintPreviewZoom = aFullZoom ;
pc - > SetPrintPreviewScale ( aFullZoom * mOriginalPrintPreviewScale ) ;
nsIPageSequenceFrame * pf = nsnull ;
shell - > GetPageSequenceFrame ( & pf ) ;
if ( pf ) {
nsIFrame * f = do_QueryFrame ( pf ) ;
shell - > FrameNeedsReflow ( f , nsIPresShell : : eResize , NS_FRAME_IS_DIRTY ) ;
}
nsIFrame * rootFrame = shell - > GetRootFrame ( ) ;
if ( rootFrame ) {
nsRect rect ( nsPoint ( 0 , 0 ) , rootFrame - > GetSize ( ) ) ;
rootFrame - > Invalidate ( rect ) ;
}
batch . EndUpdateViewBatch ( NS_VMREFRESH_NO_SYNC ) ;
return NS_OK ;
2007-11-09 10:19:12 +00:00
}
2009-03-08 19:01:02 +00:00
# endif
mPageZoom = aFullZoom ;
2007-11-09 10:19:12 +00:00
2008-01-26 23:59:50 +00:00
nsIViewManager : : UpdateViewBatch batch ( GetViewManager ( ) ) ;
2007-11-09 10:19:12 +00:00
2007-08-07 20:38:35 +00:00
struct ZoomInfo ZoomInfo = { aFullZoom } ;
CallChildren ( SetChildFullZoom , & ZoomInfo ) ;
2007-11-09 10:19:12 +00:00
nsPresContext * pc = GetPresContext ( ) ;
if ( pc ) {
pc - > SetFullZoom ( aFullZoom ) ;
}
2008-10-04 20:00:09 +00:00
// And do the external resources
mDocument - > EnumerateExternalResources ( SetExtResourceFullZoom , & ZoomInfo ) ;
2008-01-26 23:59:50 +00:00
batch . EndUpdateViewBatch ( NS_VMREFRESH_NO_SYNC ) ;
2007-07-26 03:34:16 +00:00
return NS_OK ;
}
NS_IMETHODIMP
DocumentViewerImpl : : GetFullZoom ( float * aFullZoom )
{
NS_ENSURE_ARG_POINTER ( aFullZoom ) ;
2009-03-08 19:01:02 +00:00
# ifdef NS_PRINT_PREVIEW
if ( GetIsPrintPreview ( ) ) {
* aFullZoom = mPrintPreviewZoom ;
return NS_OK ;
}
# endif
2008-05-26 22:03:11 +00:00
// Check the prescontext first because it might have a temporary
// setting for print-preview
2007-11-09 10:19:12 +00:00
nsPresContext * pc = GetPresContext ( ) ;
2008-05-26 22:03:11 +00:00
* aFullZoom = pc ? pc - > GetFullZoom ( ) : mPageZoom ;
2007-07-26 03:34:16 +00:00
return NS_OK ;
}
2004-08-05 11:38:42 +00:00
static void
SetChildAuthorStyleDisabled ( nsIMarkupDocumentViewer * aChild , void * aClosure )
{
2007-07-08 07:08:04 +00:00
PRBool styleDisabled = * static_cast < PRBool * > ( aClosure ) ;
2004-08-05 11:38:42 +00:00
aChild - > SetAuthorStyleDisabled ( styleDisabled ) ;
}
NS_IMETHODIMP
DocumentViewerImpl : : SetAuthorStyleDisabled ( PRBool aStyleDisabled )
{
if ( mPresShell ) {
2004-08-29 03:08:44 +00:00
mPresShell - > SetAuthorStyleDisabled ( aStyleDisabled ) ;
2004-08-05 11:38:42 +00:00
}
2004-12-01 03:28:44 +00:00
CallChildren ( SetChildAuthorStyleDisabled , & aStyleDisabled ) ;
return NS_OK ;
2004-08-05 11:38:42 +00:00
}
NS_IMETHODIMP
DocumentViewerImpl : : GetAuthorStyleDisabled ( PRBool * aStyleDisabled )
{
if ( mPresShell ) {
2004-08-29 03:08:44 +00:00
* aStyleDisabled = mPresShell - > GetAuthorStyleDisabled ( ) ;
} else {
* aStyleDisabled = PR_FALSE ;
2004-08-05 11:38:42 +00:00
}
return NS_OK ;
}
2004-04-29 23:34:19 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : GetDefaultCharacterSet ( nsACString & aDefaultCharacterSet )
2002-08-21 12:01:05 +00:00
{
if ( mDefaultCharacterSet . IsEmpty ( ) )
{
2004-04-29 23:34:19 +00:00
const nsAdoptingString & defCharset =
nsContentUtils : : GetLocalizedStringPref ( " intl.charset.default " ) ;
2001-04-13 12:32:18 +00:00
2002-08-21 12:01:05 +00:00
if ( ! defCharset . IsEmpty ( ) )
2004-04-29 23:34:19 +00:00
LossyCopyUTF16toASCII ( defCharset , mDefaultCharacterSet ) ;
2002-08-21 12:01:05 +00:00
else
2004-06-17 00:13:25 +00:00
mDefaultCharacterSet . AssignLiteral ( " ISO-8859-1 " ) ;
2001-04-12 13:04:29 +00:00
}
2003-06-17 16:40:34 +00:00
aDefaultCharacterSet = mDefaultCharacterSet ;
2002-08-21 12:01:05 +00:00
return NS_OK ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
static void
SetChildDefaultCharacterSet ( nsIMarkupDocumentViewer * aChild , void * aClosure )
2001-04-12 13:04:29 +00:00
{
2007-07-08 07:08:04 +00:00
const nsACString * charset = static_cast < nsACString * > ( aClosure ) ;
2003-06-17 16:40:34 +00:00
aChild - > SetDefaultCharacterSet ( * charset ) ;
2002-08-21 12:01:05 +00:00
}
2001-04-12 13:04:29 +00:00
2003-06-17 16:40:34 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : SetDefaultCharacterSet ( const nsACString & aDefaultCharacterSet )
2002-08-21 12:01:05 +00:00
{
mDefaultCharacterSet = aDefaultCharacterSet ; // this does a copy of aDefaultCharacterSet
// now set the default char set on all children of mContainer
2004-12-01 03:28:44 +00:00
CallChildren ( SetChildDefaultCharacterSet , ( void * ) & aDefaultCharacterSet ) ;
return NS_OK ;
2002-08-21 12:01:05 +00:00
}
2002-02-19 11:49:27 +00:00
2002-08-21 12:01:05 +00:00
// XXX: SEMANTIC CHANGE!
// returns a copy of the string. Caller is responsible for freeing result
// using Recycle(aForceCharacterSet)
2003-06-17 16:40:34 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetForceCharacterSet ( nsACString & aForceCharacterSet )
2002-08-21 12:01:05 +00:00
{
2003-06-17 16:40:34 +00:00
aForceCharacterSet = mForceCharacterSet ;
2001-04-12 13:04:29 +00:00
return NS_OK ;
}
2002-08-21 12:01:05 +00:00
static void
SetChildForceCharacterSet ( nsIMarkupDocumentViewer * aChild , void * aClosure )
2001-04-12 13:04:29 +00:00
{
2007-07-08 07:08:04 +00:00
const nsACString * charset = static_cast < nsACString * > ( aClosure ) ;
2003-06-17 16:40:34 +00:00
aChild - > SetForceCharacterSet ( * charset ) ;
2002-08-21 12:01:05 +00:00
}
2001-04-12 13:04:29 +00:00
2003-06-17 16:40:34 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : SetForceCharacterSet ( const nsACString & aForceCharacterSet )
2002-08-21 12:01:05 +00:00
{
mForceCharacterSet = aForceCharacterSet ;
// now set the force char set on all children of mContainer
2004-12-01 03:28:44 +00:00
CallChildren ( SetChildForceCharacterSet , ( void * ) & aForceCharacterSet ) ;
return NS_OK ;
2002-08-21 12:01:05 +00:00
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
// XXX: SEMANTIC CHANGE!
// returns a copy of the string. Caller is responsible for freeing result
// using Recycle(aHintCharacterSet)
2003-06-17 16:40:34 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetHintCharacterSet ( nsACString & aHintCharacterSet )
2002-08-21 12:01:05 +00:00
{
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
if ( kCharsetUninitialized = = mHintCharsetSource ) {
2003-06-17 16:40:34 +00:00
aHintCharacterSet . Truncate ( ) ;
2001-04-12 13:04:29 +00:00
} else {
2003-06-17 16:40:34 +00:00
aHintCharacterSet = mHintCharset ;
2002-08-21 12:01:05 +00:00
// this can't possibly be right. we can't set a value just because somebody got a related value!
//mHintCharsetSource = kCharsetUninitialized;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
return NS_OK ;
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetHintCharacterSetSource ( PRInt32 * aHintCharacterSetSource )
{
NS_ENSURE_ARG_POINTER ( aHintCharacterSetSource ) ;
2002-02-15 14:48:12 +00:00
2002-08-21 12:01:05 +00:00
* aHintCharacterSetSource = mHintCharsetSource ;
return NS_OK ;
}
2002-02-15 14:48:12 +00:00
2002-08-26 20:13:31 +00:00
2003-06-17 16:40:34 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetPrevDocCharacterSet ( nsACString & aPrevDocCharacterSet )
2002-08-26 20:13:31 +00:00
{
2003-06-17 16:40:34 +00:00
aPrevDocCharacterSet = mPrevDocCharacterSet ;
2002-08-26 20:13:31 +00:00
return NS_OK ;
}
static void
SetChildPrevDocCharacterSet ( nsIMarkupDocumentViewer * aChild , void * aClosure )
{
2007-07-08 07:08:04 +00:00
const nsACString * charset = static_cast < nsACString * > ( aClosure ) ;
2003-06-17 16:40:34 +00:00
aChild - > SetPrevDocCharacterSet ( * charset ) ;
2002-08-26 20:13:31 +00:00
}
2003-06-17 16:40:34 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : SetPrevDocCharacterSet ( const nsACString & aPrevDocCharacterSet )
2002-08-26 20:13:31 +00:00
{
mPrevDocCharacterSet = aPrevDocCharacterSet ;
2004-12-01 03:28:44 +00:00
CallChildren ( SetChildPrevDocCharacterSet , ( void * ) & aPrevDocCharacterSet ) ;
return NS_OK ;
2002-08-26 20:13:31 +00:00
}
2002-08-21 12:01:05 +00:00
static void
SetChildHintCharacterSetSource ( nsIMarkupDocumentViewer * aChild , void * aClosure )
{
aChild - > SetHintCharacterSetSource ( NS_PTR_TO_INT32 ( aClosure ) ) ;
}
2001-04-12 13:04:29 +00:00
2003-06-17 16:40:34 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : SetHintCharacterSetSource ( PRInt32 aHintCharacterSetSource )
2002-08-21 12:01:05 +00:00
{
mHintCharsetSource = aHintCharacterSetSource ;
// now set the hint char set source on all children of mContainer
2004-12-01 03:28:44 +00:00
CallChildren ( SetChildHintCharacterSetSource ,
2002-08-21 12:01:05 +00:00
( void * ) aHintCharacterSetSource ) ;
2004-12-01 03:28:44 +00:00
return NS_OK ;
2002-08-21 12:01:05 +00:00
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
static void
SetChildHintCharacterSet ( nsIMarkupDocumentViewer * aChild , void * aClosure )
{
2007-07-08 07:08:04 +00:00
const nsACString * charset = static_cast < nsACString * > ( aClosure ) ;
2003-06-17 16:40:34 +00:00
aChild - > SetHintCharacterSet ( * charset ) ;
2002-08-21 12:01:05 +00:00
}
2001-04-12 13:04:29 +00:00
2003-06-17 16:40:34 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : SetHintCharacterSet ( const nsACString & aHintCharacterSet )
2002-08-21 12:01:05 +00:00
{
mHintCharset = aHintCharacterSet ;
// now set the hint char set on all children of mContainer
2004-12-01 03:28:44 +00:00
CallChildren ( SetChildHintCharacterSet , ( void * ) & aHintCharacterSet ) ;
return NS_OK ;
2002-08-21 12:01:05 +00:00
}
2001-12-01 14:31:45 +00:00
2002-08-21 12:01:05 +00:00
static void
SetChildBidiOptions ( nsIMarkupDocumentViewer * aChild , void * aClosure )
{
aChild - > SetBidiOptions ( NS_PTR_TO_INT32 ( aClosure ) ) ;
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : SetBidiTextDirection ( PRUint8 aTextDirection )
{
PRUint32 bidiOptions ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
GetBidiOptions ( & bidiOptions ) ;
SET_BIDI_OPTION_DIRECTION ( bidiOptions , aTextDirection ) ;
SetBidiOptions ( bidiOptions ) ;
return NS_OK ;
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetBidiTextDirection ( PRUint8 * aTextDirection )
{
PRUint32 bidiOptions ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
if ( aTextDirection ) {
GetBidiOptions ( & bidiOptions ) ;
* aTextDirection = GET_BIDI_OPTION_DIRECTION ( bidiOptions ) ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
return NS_OK ;
}
2002-04-17 04:17:16 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : SetBidiTextType ( PRUint8 aTextType )
{
PRUint32 bidiOptions ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
GetBidiOptions ( & bidiOptions ) ;
SET_BIDI_OPTION_TEXTTYPE ( bidiOptions , aTextType ) ;
SetBidiOptions ( bidiOptions ) ;
return NS_OK ;
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetBidiTextType ( PRUint8 * aTextType )
{
PRUint32 bidiOptions ;
2002-04-17 04:17:16 +00:00
2002-08-21 12:01:05 +00:00
if ( aTextType ) {
GetBidiOptions ( & bidiOptions ) ;
* aTextType = GET_BIDI_OPTION_TEXTTYPE ( bidiOptions ) ;
2001-11-03 14:59:39 +00:00
}
2002-08-21 12:01:05 +00:00
return NS_OK ;
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : SetBidiControlsTextMode ( PRUint8 aControlsTextMode )
{
PRUint32 bidiOptions ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
GetBidiOptions ( & bidiOptions ) ;
SET_BIDI_OPTION_CONTROLSTEXTMODE ( bidiOptions , aControlsTextMode ) ;
SetBidiOptions ( bidiOptions ) ;
return NS_OK ;
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetBidiControlsTextMode ( PRUint8 * aControlsTextMode )
{
PRUint32 bidiOptions ;
2001-09-29 17:50:15 +00:00
2002-08-21 12:01:05 +00:00
if ( aControlsTextMode ) {
GetBidiOptions ( & bidiOptions ) ;
* aControlsTextMode = GET_BIDI_OPTION_CONTROLSTEXTMODE ( bidiOptions ) ;
2001-11-14 11:24:03 +00:00
}
2002-08-21 12:01:05 +00:00
return NS_OK ;
}
2001-04-13 12:32:18 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : SetBidiNumeral ( PRUint8 aNumeral )
{
PRUint32 bidiOptions ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
GetBidiOptions ( & bidiOptions ) ;
SET_BIDI_OPTION_NUMERAL ( bidiOptions , aNumeral ) ;
SetBidiOptions ( bidiOptions ) ;
return NS_OK ;
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetBidiNumeral ( PRUint8 * aNumeral )
{
PRUint32 bidiOptions ;
if ( aNumeral ) {
GetBidiOptions ( & bidiOptions ) ;
* aNumeral = GET_BIDI_OPTION_NUMERAL ( bidiOptions ) ;
2002-02-20 03:21:25 +00:00
}
2002-08-21 12:01:05 +00:00
return NS_OK ;
}
2002-02-20 03:21:25 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : SetBidiSupport ( PRUint8 aSupport )
{
PRUint32 bidiOptions ;
2002-02-19 11:49:27 +00:00
2002-08-21 12:01:05 +00:00
GetBidiOptions ( & bidiOptions ) ;
SET_BIDI_OPTION_SUPPORT ( bidiOptions , aSupport ) ;
SetBidiOptions ( bidiOptions ) ;
return NS_OK ;
}
2001-06-29 05:42:47 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetBidiSupport ( PRUint8 * aSupport )
{
PRUint32 bidiOptions ;
if ( aSupport ) {
GetBidiOptions ( & bidiOptions ) ;
* aSupport = GET_BIDI_OPTION_SUPPORT ( bidiOptions ) ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
return NS_OK ;
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : SetBidiCharacterSet ( PRUint8 aCharacterSet )
{
PRUint32 bidiOptions ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
GetBidiOptions ( & bidiOptions ) ;
SET_BIDI_OPTION_CHARACTERSET ( bidiOptions , aCharacterSet ) ;
SetBidiOptions ( bidiOptions ) ;
return NS_OK ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetBidiCharacterSet ( PRUint8 * aCharacterSet )
2001-04-12 13:04:29 +00:00
{
2002-08-21 12:01:05 +00:00
PRUint32 bidiOptions ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
if ( aCharacterSet ) {
GetBidiOptions ( & bidiOptions ) ;
* aCharacterSet = GET_BIDI_OPTION_CHARACTERSET ( bidiOptions ) ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
return NS_OK ;
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : SetBidiOptions ( PRUint32 aBidiOptions )
{
if ( mPresContext ) {
2005-11-13 09:55:09 +00:00
mPresContext - > SetBidi ( aBidiOptions , PR_TRUE ) ; // could cause reflow
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
// now set bidi on all children of mContainer
CallChildren ( SetChildBidiOptions , ( void * ) aBidiOptions ) ;
return NS_OK ;
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetBidiOptions ( PRUint32 * aBidiOptions )
{
if ( aBidiOptions ) {
if ( mPresContext ) {
2004-07-29 19:41:39 +00:00
* aBidiOptions = mPresContext - > GetBidi ( ) ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
else
* aBidiOptions = IBMBIDI_DEFAULT_BIDI_OPTIONS ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
return NS_OK ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : SizeToContent ( )
2001-04-12 13:04:29 +00:00
{
2002-08-21 12:01:05 +00:00
NS_ENSURE_TRUE ( mDocument , NS_ERROR_NOT_AVAILABLE ) ;
2001-04-12 13:04:29 +00:00
2008-09-28 19:14:28 +00:00
// Skip doing this on docshell-less documents for now
2005-05-15 00:30:02 +00:00
nsCOMPtr < nsIDocShellTreeItem > docShellAsItem ( do_QueryReferent ( mContainer ) ) ;
2008-09-28 19:14:28 +00:00
NS_ENSURE_TRUE ( docShellAsItem , NS_ERROR_NOT_AVAILABLE ) ;
2002-08-21 12:01:05 +00:00
nsCOMPtr < nsIDocShellTreeItem > docShellParent ;
docShellAsItem - > GetSameTypeParent ( getter_AddRefs ( docShellParent ) ) ;
2002-03-26 11:43:40 +00:00
2002-08-21 12:01:05 +00:00
// It's only valid to access this from a top frame. Doesn't work from
// sub-frames.
NS_ENSURE_TRUE ( ! docShellParent , NS_ERROR_FAILURE ) ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
nsCOMPtr < nsIPresShell > presShell ;
2003-06-13 20:10:01 +00:00
GetPresShell ( getter_AddRefs ( presShell ) ) ;
2002-08-21 12:01:05 +00:00
NS_ENSURE_TRUE ( presShell , NS_ERROR_FAILURE ) ;
2001-04-12 13:04:29 +00:00
2005-01-15 18:01:22 +00:00
// Flush out all content and style updates. We can't use a resize reflow
// because it won't change some sizes that a style change reflow will.
mDocument - > FlushPendingNotifications ( Flush_Layout ) ;
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
nsIFrame * root = presShell - > GetRootFrame ( ) ;
NS_ENSURE_TRUE ( root , NS_ERROR_FAILURE ) ;
nscoord prefWidth ;
{
nsCOMPtr < nsIRenderingContext > rcx ;
presShell - > CreateRenderingContext ( root , getter_AddRefs ( rcx ) ) ;
NS_ENSURE_TRUE ( rcx , NS_ERROR_FAILURE ) ;
prefWidth = root - > GetPrefWidth ( rcx ) ;
}
nsresult rv = presShell - > ResizeReflow ( prefWidth , NS_UNCONSTRAINEDSIZE ) ;
NS_ENSURE_SUCCESS ( rv , rv ) ;
2001-04-12 13:04:29 +00:00
2004-07-31 23:15:21 +00:00
nsCOMPtr < nsPresContext > presContext ;
2003-06-13 20:10:01 +00:00
GetPresContext ( getter_AddRefs ( presContext ) ) ;
2002-08-21 12:01:05 +00:00
NS_ENSURE_TRUE ( presContext , NS_ERROR_FAILURE ) ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
PRInt32 width , height ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
// so how big is it?
2004-02-01 10:09:07 +00:00
nsRect shellArea = presContext - > GetVisibleArea ( ) ;
2008-03-12 22:04:45 +00:00
// Protect against bogus returns here
NS_ENSURE_TRUE ( shellArea . width ! = NS_UNCONSTRAINEDSIZE & &
shellArea . height ! = NS_UNCONSTRAINEDSIZE ,
NS_ERROR_FAILURE ) ;
2007-02-07 07:46:44 +00:00
width = presContext - > AppUnitsToDevPixels ( shellArea . width ) ;
height = presContext - > AppUnitsToDevPixels ( shellArea . height ) ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
nsCOMPtr < nsIDocShellTreeOwner > treeOwner ;
docShellAsItem - > GetTreeOwner ( getter_AddRefs ( treeOwner ) ) ;
NS_ENSURE_TRUE ( treeOwner , NS_ERROR_FAILURE ) ;
2001-04-12 13:04:29 +00:00
2007-11-21 05:09:58 +00:00
/* presContext's size was calculated in app units and has already been
2002-08-21 12:01:05 +00:00
rounded to the equivalent pixels ( so the width / height calculation
we just performed was probably exact , though it was based on
values already rounded during ResizeReflow ) . In a surprising
number of instances , this rounding makes a window which for want
of one extra pixel ' s width ends up wrapping the longest line of
text during actual window layout . This makes the window too short ,
generally clipping the OK / Cancel buttons . Here we add one pixel
to the calculated width , to circumvent this problem . */
NS_ENSURE_SUCCESS ( treeOwner - > SizeShellTo ( docShellAsItem , width + 1 , height ) ,
NS_ERROR_FAILURE ) ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
return NS_OK ;
}
2001-04-12 13:04:29 +00:00
2002-04-17 04:17:16 +00:00
2003-09-07 21:50:21 +00:00
NS_IMPL_ISUPPORTS1 ( nsDocViewerSelectionListener , nsISelectionListener )
2001-03-27 11:56:03 +00:00
2002-08-21 12:01:05 +00:00
nsresult nsDocViewerSelectionListener : : Init ( DocumentViewerImpl * aDocViewer )
{
mDocViewer = aDocViewer ;
return NS_OK ;
}
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
/*
* GetPopupNode , GetPopupLinkNode and GetPopupImageNode are helpers
* for the cmd_copyLink / cmd_copyImageLocation / cmd_copyImageContents family
* of commands . The focus controller stores the popup node , these retrieve
* them and munge appropriately . Note that we have to store the popup node
* rather than retrieving it from EventStateManager : : GetFocusedContent because
* not all content ( images included ) can receive focus .
*/
2002-04-17 04:17:16 +00:00
2002-08-21 12:01:05 +00:00
nsresult
DocumentViewerImpl : : GetPopupNode ( nsIDOMNode * * aNode )
{
NS_ENSURE_ARG_POINTER ( aNode ) ;
2001-03-27 11:56:03 +00:00
2002-08-21 12:01:05 +00:00
nsresult rv ;
2001-03-27 11:56:03 +00:00
2002-08-21 12:01:05 +00:00
// get the document
nsCOMPtr < nsIDocument > document ;
2003-06-13 20:10:01 +00:00
rv = GetDocument ( getter_AddRefs ( document ) ) ;
2002-08-21 12:01:05 +00:00
NS_ENSURE_SUCCESS ( rv , rv ) ;
NS_ENSURE_TRUE ( document , NS_ERROR_FAILURE ) ;
2002-02-19 11:49:27 +00:00
2002-08-21 12:01:05 +00:00
// get the private dom window
2005-11-28 23:56:44 +00:00
nsPIDOMWindow * privateWin = document - > GetWindow ( ) ;
NS_ENSURE_TRUE ( privateWin , NS_ERROR_NOT_AVAILABLE ) ;
2002-08-21 12:01:05 +00:00
// get the focus controller
2004-05-03 21:48:36 +00:00
nsIFocusController * focusController = privateWin - > GetRootFocusController ( ) ;
2002-08-21 12:01:05 +00:00
NS_ENSURE_TRUE ( focusController , NS_ERROR_FAILURE ) ;
// get the popup node
2003-10-22 06:09:48 +00:00
focusController - > GetPopupNode ( aNode ) ; // addref happens here
2002-08-21 12:01:05 +00:00
return rv ;
2002-02-19 11:49:27 +00:00
}
2002-08-21 12:01:05 +00:00
// GetPopupLinkNode: return popup link node or fail
nsresult
DocumentViewerImpl : : GetPopupLinkNode ( nsIDOMNode * * aNode )
2002-02-19 11:49:27 +00:00
{
2002-08-21 12:01:05 +00:00
NS_ENSURE_ARG_POINTER ( aNode ) ;
2002-02-19 11:49:27 +00:00
2002-08-21 12:01:05 +00:00
// you get null unless i say so
* aNode = nsnull ;
2002-02-19 11:49:27 +00:00
2002-08-21 12:01:05 +00:00
// find popup node
nsCOMPtr < nsIDOMNode > node ;
nsresult rv = GetPopupNode ( getter_AddRefs ( node ) ) ;
NS_ENSURE_SUCCESS ( rv , rv ) ;
2002-02-19 11:49:27 +00:00
2002-08-21 12:01:05 +00:00
// find out if we have a link in our ancestry
while ( node ) {
2002-02-19 11:49:27 +00:00
2002-08-21 12:01:05 +00:00
// are we an anchor?
nsCOMPtr < nsIDOMHTMLAnchorElement > anchor ( do_QueryInterface ( node ) ) ;
nsCOMPtr < nsIDOMHTMLAreaElement > area ;
nsCOMPtr < nsIDOMHTMLLinkElement > link ;
nsAutoString xlinkType ;
if ( ! anchor ) {
// area?
area = do_QueryInterface ( node ) ;
if ( ! area ) {
// link?
link = do_QueryInterface ( node ) ;
if ( ! link ) {
// XLink?
nsCOMPtr < nsIDOMElement > element ( do_QueryInterface ( node ) ) ;
if ( element ) {
element - > GetAttributeNS ( NS_LITERAL_STRING ( " http://www.w3.org/1999/xlink " ) , NS_LITERAL_STRING ( " type " ) , xlinkType ) ;
}
2002-02-19 11:49:27 +00:00
}
}
}
2004-05-22 22:15:22 +00:00
if ( anchor | | area | | link | | xlinkType . EqualsLiteral ( " simple " ) ) {
2002-08-21 12:01:05 +00:00
* aNode = node ;
NS_IF_ADDREF ( * aNode ) ; // addref
return NS_OK ;
}
else {
// if not, get our parent and keep trying...
nsCOMPtr < nsIDOMNode > parentNode ;
node - > GetParentNode ( getter_AddRefs ( parentNode ) ) ;
node = parentNode ;
}
2002-02-19 11:49:27 +00:00
}
2002-08-21 12:01:05 +00:00
// if we have no node, fail
return NS_ERROR_FAILURE ;
2002-02-19 11:49:27 +00:00
}
2002-08-21 12:01:05 +00:00
// GetPopupLinkNode: return popup image node or fail
2001-02-06 23:03:17 +00:00
nsresult
2004-06-05 17:57:00 +00:00
DocumentViewerImpl : : GetPopupImageNode ( nsIImageLoadingContent * * aNode )
2001-03-27 11:56:03 +00:00
{
2002-08-21 12:01:05 +00:00
NS_ENSURE_ARG_POINTER ( aNode ) ;
2001-02-06 23:03:17 +00:00
2002-08-21 12:01:05 +00:00
// you get null unless i say so
* aNode = nsnull ;
2001-02-06 23:03:17 +00:00
2002-08-21 12:01:05 +00:00
// find popup node
nsCOMPtr < nsIDOMNode > node ;
nsresult rv = GetPopupNode ( getter_AddRefs ( node ) ) ;
NS_ENSURE_SUCCESS ( rv , rv ) ;
2001-02-06 23:03:17 +00:00
2005-06-01 16:26:51 +00:00
if ( node )
CallQueryInterface ( node , aNode ) ;
2002-08-21 12:01:05 +00:00
return NS_OK ;
}
2002-02-19 11:49:27 +00:00
2002-08-21 12:01:05 +00:00
/*
* XXX dr
* - - - - - -
* These two functions - - GetInLink and GetInImage - - are kind of annoying
* in that they only get called from the controller ( in
* nsDOMWindowController : : IsCommandEnabled ) . The actual construction of the
* context menus in communicator ( nsContextMenu . js ) has its own , redundant
* tests . No big deal , but good to keep in mind if we ever clean context
* menus .
*/
2001-03-27 11:56:03 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetInLink ( PRBool * aInLink )
{
# ifdef DEBUG_dr
printf ( " dr :: DocumentViewerImpl::GetInLink \n " ) ;
# endif
2002-02-19 11:49:27 +00:00
2002-08-21 12:01:05 +00:00
NS_ENSURE_ARG_POINTER ( aInLink ) ;
2002-04-06 13:09:15 +00:00
2002-08-21 12:01:05 +00:00
// we're not in a link unless i say so
* aInLink = PR_FALSE ;
2002-02-19 11:49:27 +00:00
2002-08-21 12:01:05 +00:00
// get the popup link
nsCOMPtr < nsIDOMNode > node ;
nsresult rv = GetPopupLinkNode ( getter_AddRefs ( node ) ) ;
if ( NS_FAILED ( rv ) ) return rv ;
NS_ENSURE_TRUE ( node , NS_ERROR_FAILURE ) ;
2002-06-19 21:51:13 +00:00
2002-08-21 12:01:05 +00:00
// if we made it here, we're in a link
* aInLink = PR_TRUE ;
return NS_OK ;
}
2002-06-19 21:51:13 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP DocumentViewerImpl : : GetInImage ( PRBool * aInImage )
{
# ifdef DEBUG_dr
printf ( " dr :: DocumentViewerImpl::GetInImage \n " ) ;
2002-05-07 12:03:37 +00:00
# endif
2002-02-19 11:49:27 +00:00
2002-08-21 12:01:05 +00:00
NS_ENSURE_ARG_POINTER ( aInImage ) ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
// we're not in an image unless i say so
* aInImage = PR_FALSE ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
// get the popup image
2004-06-05 17:57:00 +00:00
nsCOMPtr < nsIImageLoadingContent > node ;
2002-08-21 12:01:05 +00:00
nsresult rv = GetPopupImageNode ( getter_AddRefs ( node ) ) ;
if ( NS_FAILED ( rv ) ) return rv ;
NS_ENSURE_TRUE ( node , NS_ERROR_FAILURE ) ;
2001-03-27 11:56:03 +00:00
2002-08-21 12:01:05 +00:00
// if we made it here, we're in an image
* aInImage = PR_TRUE ;
return NS_OK ;
}
2002-07-09 12:39:02 +00:00
2005-01-31 23:47:26 +00:00
NS_IMETHODIMP nsDocViewerSelectionListener : : NotifySelectionChanged ( nsIDOMDocument * , nsISelection * , PRInt16 )
2002-08-21 12:01:05 +00:00
{
NS_ASSERTION ( mDocViewer , " Should have doc viewer! " ) ;
2001-03-27 11:56:03 +00:00
2002-08-21 12:01:05 +00:00
// get the selection state
nsCOMPtr < nsISelection > selection ;
nsresult rv = mDocViewer - > GetDocumentSelection ( getter_AddRefs ( selection ) ) ;
if ( NS_FAILED ( rv ) ) return rv ;
2002-05-07 12:03:37 +00:00
2002-08-21 12:01:05 +00:00
PRBool selectionCollapsed ;
selection - > GetIsCollapsed ( & selectionCollapsed ) ;
// we only call UpdateCommands when the selection changes from collapsed
// to non-collapsed or vice versa. We might need another update string
// for simple selection changes, but that would be expenseive.
if ( ! mGotSelectionState | | mSelectionWasCollapsed ! = selectionCollapsed )
{
nsCOMPtr < nsIDocument > theDoc ;
2003-06-13 20:10:01 +00:00
mDocViewer - > GetDocument ( getter_AddRefs ( theDoc ) ) ;
2002-08-21 12:01:05 +00:00
if ( ! theDoc ) return NS_ERROR_FAILURE ;
2002-05-07 12:03:37 +00:00
2005-11-28 23:56:44 +00:00
nsPIDOMWindow * domWindow = theDoc - > GetWindow ( ) ;
2002-08-21 12:01:05 +00:00
if ( ! domWindow ) return NS_ERROR_FAILURE ;
2002-05-07 12:03:37 +00:00
2002-08-21 12:01:05 +00:00
domWindow - > UpdateCommands ( NS_LITERAL_STRING ( " select " ) ) ;
mGotSelectionState = PR_TRUE ;
mSelectionWasCollapsed = selectionCollapsed ;
2002-05-07 12:03:37 +00:00
}
2002-08-21 12:01:05 +00:00
return NS_OK ;
}
2002-05-07 12:03:37 +00:00
2002-08-21 12:01:05 +00:00
//nsDocViewerFocusListener
2005-12-03 07:42:40 +00:00
NS_IMPL_ISUPPORTS2 ( nsDocViewerFocusListener ,
nsIDOMFocusListener ,
nsIDOMEventListener )
2002-05-07 12:03:37 +00:00
2002-08-21 12:01:05 +00:00
nsDocViewerFocusListener : : nsDocViewerFocusListener ( )
: mDocViewer ( nsnull )
{
}
2001-03-27 11:56:03 +00:00
2002-08-21 12:01:05 +00:00
nsDocViewerFocusListener : : ~ nsDocViewerFocusListener ( ) { }
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
nsresult
nsDocViewerFocusListener : : HandleEvent ( nsIDOMEvent * aEvent )
{
return NS_OK ;
2001-03-27 11:56:03 +00:00
}
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP
nsDocViewerFocusListener : : Focus ( nsIDOMEvent * aEvent )
2001-03-27 11:56:03 +00:00
{
2002-08-21 12:01:05 +00:00
nsCOMPtr < nsIPresShell > shell ;
if ( ! mDocViewer )
return NS_ERROR_FAILURE ;
2001-03-27 11:56:03 +00:00
2003-06-13 20:10:01 +00:00
nsresult result = mDocViewer - > GetPresShell ( getter_AddRefs ( shell ) ) ;
2002-08-21 12:01:05 +00:00
if ( NS_FAILED ( result ) | | ! shell )
return result ? result : NS_ERROR_FAILURE ;
nsCOMPtr < nsISelectionController > selCon ;
selCon = do_QueryInterface ( shell ) ;
PRInt16 selectionStatus ;
2005-07-30 20:57:07 +00:00
selCon - > GetDisplaySelection ( & selectionStatus ) ;
2001-03-27 11:56:03 +00:00
2006-06-17 01:05:26 +00:00
// If selection was disabled, re-enable it.
2002-08-21 12:01:05 +00:00
if ( selectionStatus = = nsISelectionController : : SELECTION_DISABLED | |
selectionStatus = = nsISelectionController : : SELECTION_HIDDEN )
{
selCon - > SetDisplaySelection ( nsISelectionController : : SELECTION_ON ) ;
selCon - > RepaintSelection ( nsISelectionController : : SELECTION_NORMAL ) ;
}
return result ;
}
NS_IMETHODIMP
nsDocViewerFocusListener : : Blur ( nsIDOMEvent * aEvent )
{
nsCOMPtr < nsIPresShell > shell ;
if ( ! mDocViewer )
return NS_ERROR_FAILURE ;
2001-02-06 23:03:17 +00:00
2003-06-13 20:10:01 +00:00
nsresult result = mDocViewer - > GetPresShell ( getter_AddRefs ( shell ) ) ;
2002-08-21 12:01:05 +00:00
if ( NS_FAILED ( result ) | | ! shell )
return result ? result : NS_ERROR_FAILURE ;
nsCOMPtr < nsISelectionController > selCon ;
selCon = do_QueryInterface ( shell ) ;
PRInt16 selectionStatus ;
selCon - > GetDisplaySelection ( & selectionStatus ) ;
2001-02-01 20:49:10 +00:00
2006-06-17 01:05:26 +00:00
// If selection was on, disable it.
if ( selectionStatus = = nsISelectionController : : SELECTION_ON | |
selectionStatus = = nsISelectionController : : SELECTION_ATTENTION )
2002-08-21 12:01:05 +00:00
{
selCon - > SetDisplaySelection ( nsISelectionController : : SELECTION_DISABLED ) ;
selCon - > RepaintSelection ( nsISelectionController : : SELECTION_NORMAL ) ;
2002-01-01 12:58:53 +00:00
}
2002-08-21 12:01:05 +00:00
return result ;
}
2002-01-01 12:58:53 +00:00
2001-02-06 23:03:17 +00:00
2002-08-21 12:01:05 +00:00
nsresult
nsDocViewerFocusListener : : Init ( DocumentViewerImpl * aDocViewer )
{
mDocViewer = aDocViewer ;
return NS_OK ;
}
2001-02-06 23:03:17 +00:00
2002-08-21 12:01:05 +00:00
/** ---------------------------------------------------
* From nsIWebBrowserPrint
*/
2005-09-16 02:25:37 +00:00
# ifdef NS_PRINTING
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : Print ( nsIPrintSettings * aPrintSettings ,
nsIWebProgressListener * aWebProgressListener )
{
2002-09-03 23:21:15 +00:00
2004-12-24 22:27:57 +00:00
# ifdef MOZ_XUL
// Temporary code for Bug 136185 / Bug 240490
nsCOMPtr < nsIXULDocument > xulDoc ( do_QueryInterface ( mDocument ) ) ;
if ( xulDoc ) {
nsPrintEngine : : ShowPrintErrorDialog ( NS_ERROR_GFX_PRINTER_NO_XUL ) ;
return NS_ERROR_FAILURE ;
}
# endif
2008-01-21 07:54:47 +00:00
if ( ! mContainer ) {
PR_PL ( ( " Container was destroyed yet we are still trying to use it! " ) ) ;
return NS_ERROR_FAILURE ;
}
2005-05-15 00:30:02 +00:00
nsCOMPtr < nsIDocShell > docShell ( do_QueryReferent ( mContainer ) ) ;
2002-08-21 12:01:05 +00:00
NS_ASSERTION ( docShell , " This has to be a docshell " ) ;
1999-05-06 19:25:40 +00:00
2002-08-21 12:01:05 +00:00
// Check to see if this document is still busy
// If it is busy and we aren't already "queued" up to print then
// Indicate there is a print pending and cache the args for later
PRUint32 busyFlags = nsIDocShell : : BUSY_FLAGS_NONE ;
if ( ( NS_FAILED ( docShell - > GetBusyFlags ( & busyFlags ) ) | |
( busyFlags ! = nsIDocShell : : BUSY_FLAGS_NONE & & busyFlags & nsIDocShell : : BUSY_FLAGS_PAGE_LOADING ) ) & &
! mPrintDocIsFullyLoaded ) {
if ( ! mPrintIsPending ) {
mCachedPrintSettings = aPrintSettings ;
mCachedPrintWebProgressListner = aWebProgressListener ;
mPrintIsPending = PR_TRUE ;
}
2004-02-19 21:58:40 +00:00
PR_PL ( ( " Printing Stopped - document is still busy! " ) ) ;
return NS_ERROR_GFX_PRINTER_DOC_IS_BUSY ;
2002-08-21 12:01:05 +00:00
}
2000-10-19 21:49:12 +00:00
2002-08-21 12:01:05 +00:00
nsCOMPtr < nsIPresShell > presShell ;
docShell - > GetPresShell ( getter_AddRefs ( presShell ) ) ;
2006-12-31 08:13:56 +00:00
if ( ! presShell | | ! mDocument | | ! mDeviceContext | | ! mParentWidget ) {
PR_PL ( ( " Can't Print without pres shell, document etc " ) ) ;
return NS_ERROR_FAILURE ;
2002-08-21 12:01:05 +00:00
}
1999-05-14 14:40:59 +00:00
2006-12-31 08:13:56 +00:00
nsresult rv ;
2000-10-19 21:49:12 +00:00
2002-08-21 12:01:05 +00:00
// if we are printing another URL, then exit
// the reason we check here is because this method can be called while
// another is still in here (the printing dialog is a good example).
// the only time we can print more than one job at a time is the regression tests
if ( GetIsPrinting ( ) ) {
// Let the user know we are not ready to print.
rv = NS_ERROR_NOT_AVAILABLE ;
nsPrintEngine : : ShowPrintErrorDialog ( rv ) ;
return rv ;
}
1999-05-14 14:40:59 +00:00
2003-03-22 03:20:23 +00:00
// If we are hosting a full-page plugin, tell it to print
// first. It shows its own native print UI.
nsCOMPtr < nsIPluginDocument > pDoc ( do_QueryInterface ( mDocument ) ) ;
if ( pDoc )
return pDoc - > Print ( ) ;
2002-08-21 12:01:05 +00:00
if ( ! mPrintEngine ) {
mPrintEngine = new nsPrintEngine ( ) ;
NS_ENSURE_TRUE ( mPrintEngine , NS_ERROR_OUT_OF_MEMORY ) ;
2002-04-04 13:04:21 +00:00
2006-12-31 08:13:56 +00:00
rv = mPrintEngine - > Initialize ( this , docShell , mDocument ,
mDeviceContext , mParentWidget ,
2002-01-01 12:58:53 +00:00
# ifdef NS_DEBUG
2006-12-31 08:13:56 +00:00
mDebugFile
2002-08-21 12:01:05 +00:00
# else
2006-12-31 08:13:56 +00:00
nsnull
2002-01-01 12:58:53 +00:00
# endif
2006-12-31 08:13:56 +00:00
) ;
if ( NS_FAILED ( rv ) ) {
mPrintEngine - > Destroy ( ) ;
mPrintEngine = nsnull ;
return rv ;
}
2002-08-21 12:01:05 +00:00
}
2001-01-27 14:09:34 +00:00
2002-08-21 12:01:05 +00:00
rv = mPrintEngine - > Print ( aPrintSettings , aWebProgressListener ) ;
if ( NS_FAILED ( rv ) ) {
OnDonePrinting ( ) ;
}
return rv ;
}
2001-01-27 14:09:34 +00:00
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : PrintPreview ( nsIPrintSettings * aPrintSettings ,
nsIDOMWindow * aChildDOMWin ,
nsIWebProgressListener * aWebProgressListener )
{
# if defined(NS_PRINTING) && defined(NS_PRINT_PREVIEW)
nsresult rv = NS_OK ;
2001-01-27 14:09:34 +00:00
2002-08-21 12:01:05 +00:00
if ( GetIsPrinting ( ) ) {
nsPrintEngine : : CloseProgressDialog ( aWebProgressListener ) ;
return NS_ERROR_FAILURE ;
}
2001-04-12 13:04:29 +00:00
2004-12-24 22:27:57 +00:00
# ifdef MOZ_XUL
// Temporary code for Bug 136185 / Bug 240490
nsCOMPtr < nsIXULDocument > xulDoc ( do_QueryInterface ( mDocument ) ) ;
if ( xulDoc ) {
nsPrintEngine : : CloseProgressDialog ( aWebProgressListener ) ;
nsPrintEngine : : ShowPrintErrorDialog ( NS_ERROR_GFX_PRINTER_NO_XUL , PR_FALSE ) ;
return NS_ERROR_FAILURE ;
}
# endif
2008-01-21 07:54:47 +00:00
if ( ! mContainer ) {
PR_PL ( ( " Container was destroyed yet we are still trying to use it! " ) ) ;
return NS_ERROR_FAILURE ;
}
2006-12-31 08:13:56 +00:00
nsCOMPtr < nsIDocShell > docShell ( do_QueryReferent ( mContainer ) ) ;
NS_ASSERTION ( docShell , " This has to be a docshell " ) ;
nsCOMPtr < nsIPresShell > presShell ;
docShell - > GetPresShell ( getter_AddRefs ( presShell ) ) ;
if ( ! presShell | | ! mDocument | | ! mDeviceContext | | ! mParentWidget ) {
PR_PL ( ( " Can't Print Preview without pres shell, document etc " ) ) ;
return NS_ERROR_FAILURE ;
}
2002-08-21 12:01:05 +00:00
if ( ! mPrintEngine ) {
mPrintEngine = new nsPrintEngine ( ) ;
NS_ENSURE_TRUE ( mPrintEngine , NS_ERROR_OUT_OF_MEMORY ) ;
2002-05-08 20:11:14 +00:00
2006-12-31 08:13:56 +00:00
rv = mPrintEngine - > Initialize ( this , docShell , mDocument ,
mDeviceContext , mParentWidget ,
2002-08-21 12:01:05 +00:00
# ifdef NS_DEBUG
2006-12-31 08:13:56 +00:00
mDebugFile
2002-08-21 12:01:05 +00:00
# else
2006-12-31 08:13:56 +00:00
nsnull
2002-08-21 12:01:05 +00:00
# endif
2006-12-31 08:13:56 +00:00
) ;
if ( NS_FAILED ( rv ) ) {
mPrintEngine - > Destroy ( ) ;
mPrintEngine = nsnull ;
return rv ;
}
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
rv = mPrintEngine - > PrintPreview ( aPrintSettings , aChildDOMWin , aWebProgressListener ) ;
2009-03-08 19:01:02 +00:00
mPrintPreviewZoomed = PR_FALSE ;
2002-08-21 12:01:05 +00:00
if ( NS_FAILED ( rv ) ) {
OnDonePrinting ( ) ;
}
return rv ;
# else
return NS_ERROR_FAILURE ;
# endif
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
//----------------------------------------------------------------------
NS_IMETHODIMP
DocumentViewerImpl : : PrintPreviewNavigate ( PRInt16 aType , PRInt32 aPageNum )
{
2007-01-01 10:53:11 +00:00
if ( ! GetIsPrintPreview ( ) | |
mPrintEngine - > GetIsCreatingPrintPreview ( ) )
return NS_ERROR_FAILURE ;
2001-02-06 23:03:17 +00:00
2006-12-10 08:05:05 +00:00
nsIScrollableView * scrollableView = nsnull ;
mPrintEngine - > GetPrintPreviewViewManager ( ) - > GetRootScrollableView ( & scrollableView ) ;
2007-01-01 10:53:11 +00:00
if ( scrollableView = = nsnull )
return NS_OK ;
2002-08-21 12:01:05 +00:00
// Check to see if we can short circut scrolling to the top
if ( aType = = nsIWebBrowserPrint : : PRINTPREVIEW_HOME | |
( aType = = nsIWebBrowserPrint : : PRINTPREVIEW_GOTO_PAGENUM & & aPageNum = = 1 ) ) {
2008-11-04 14:38:16 +00:00
scrollableView - > ScrollTo ( 0 , 0 , 0 ) ;
2002-08-21 12:01:05 +00:00
return NS_OK ;
2001-02-06 23:03:17 +00:00
}
2002-08-21 12:01:05 +00:00
// Finds the SimplePageSequencer frame
// in PP mPrtPreview->mPrintObject->mSeqFrame is null
nsIFrame * seqFrame = nsnull ;
PRInt32 pageCount = 0 ;
if ( NS_FAILED ( mPrintEngine - > GetSeqFrameAndCountPages ( seqFrame , pageCount ) ) ) {
return NS_ERROR_FAILURE ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
// Figure where we are currently scrolled to
nscoord x ;
nscoord y ;
scrollableView - > GetScrollPosition ( x , y ) ;
2001-04-12 13:04:29 +00:00
2002-08-21 12:01:05 +00:00
PRInt32 pageNum = 1 ;
nsIFrame * fndPageFrame = nsnull ;
nsIFrame * currentPage = nsnull ;
2001-08-06 02:27:43 +00:00
2002-08-21 12:01:05 +00:00
// If it is "End" then just do a "goto" to the last page
if ( aType = = nsIWebBrowserPrint : : PRINTPREVIEW_END ) {
aType = nsIWebBrowserPrint : : PRINTPREVIEW_GOTO_PAGENUM ;
aPageNum = pageCount ;
2001-04-12 13:04:29 +00:00
}
1999-05-12 13:32:09 +00:00
2002-08-21 12:01:05 +00:00
// Now, locate the current page we are on and
// and the page of the page number
nscoord gap = 0 ;
2004-01-09 14:20:53 +00:00
nsIFrame * pageFrame = seqFrame - > GetFirstChild ( nsnull ) ;
2002-08-21 12:01:05 +00:00
while ( pageFrame ! = nsnull ) {
2003-08-06 03:07:12 +00:00
nsRect pageRect = pageFrame - > GetRect ( ) ;
2002-08-21 12:01:05 +00:00
if ( pageNum = = 1 ) {
gap = pageRect . y ;
}
if ( pageRect . Contains ( pageRect . x , y ) ) {
currentPage = pageFrame ;
}
if ( pageNum = = aPageNum ) {
fndPageFrame = pageFrame ;
break ;
2001-04-12 13:04:29 +00:00
}
2002-08-21 12:01:05 +00:00
pageNum + + ;
2003-08-06 03:07:12 +00:00
pageFrame = pageFrame - > GetNextSibling ( ) ;
2002-04-17 04:17:16 +00:00
}
1999-05-12 13:32:09 +00:00
2002-08-21 12:01:05 +00:00
if ( aType = = nsIWebBrowserPrint : : PRINTPREVIEW_PREV_PAGE ) {
if ( currentPage ) {
2004-09-14 02:28:03 +00:00
fndPageFrame = currentPage - > GetPrevInFlow ( ) ;
2002-08-21 12:01:05 +00:00
if ( ! fndPageFrame ) {
return NS_OK ;
}
} else {
return NS_OK ;
}
} else if ( aType = = nsIWebBrowserPrint : : PRINTPREVIEW_NEXT_PAGE ) {
if ( currentPage ) {
2004-09-14 02:28:03 +00:00
fndPageFrame = currentPage - > GetNextInFlow ( ) ;
2002-08-21 12:01:05 +00:00
if ( ! fndPageFrame ) {
return NS_OK ;
2002-04-17 04:17:16 +00:00
}
2002-08-21 12:01:05 +00:00
} else {
return NS_OK ;
1999-05-07 19:26:23 +00:00
}
2002-08-21 12:01:05 +00:00
} else { // If we get here we are doing "GoTo"
if ( aPageNum < 0 | | aPageNum > pageCount ) {
return NS_OK ;
1999-05-07 19:26:23 +00:00
}
}
2001-04-18 06:06:31 +00:00
2002-08-21 12:01:05 +00:00
if ( fndPageFrame & & scrollableView ) {
2007-11-21 05:09:58 +00:00
nscoord deadSpaceGapTwips = 0 ;
2009-01-12 19:20:59 +00:00
nsIPageSequenceFrame * sqf = do_QueryFrame ( seqFrame ) ;
if ( sqf ) {
2007-11-21 05:09:58 +00:00
sqf - > GetDeadSpaceValue ( & deadSpaceGapTwips ) ;
2001-04-18 06:06:31 +00:00
}
2008-02-07 23:08:00 +00:00
// To compute deadSpaceGap, use the same presContext as was used
// to layout the seqFrame. (That presContext may have different
// TwipsToAppUnits conversion from this->mPresContext)
nscoord deadSpaceGap =
seqFrame - > PresContext ( ) - > TwipsToAppUnits ( deadSpaceGapTwips ) ;
2008-01-29 20:14:51 +00:00
nscoord newYPosn =
nscoord ( mPrintEngine - > GetPrintPreviewScale ( ) *
2008-02-07 23:08:00 +00:00
float ( fndPageFrame - > GetPosition ( ) . y - deadSpaceGap ) ) ;
2008-11-04 14:38:16 +00:00
scrollableView - > ScrollTo ( 0 , newYPosn , 0 ) ;
2002-08-21 12:01:05 +00:00
}
return NS_OK ;
2001-04-18 06:06:31 +00:00
}
2002-08-21 12:01:05 +00:00
/* readonly attribute nsIPrintSettings globalPrintSettings; */
NS_IMETHODIMP
DocumentViewerImpl : : GetGlobalPrintSettings ( nsIPrintSettings * * aGlobalPrintSettings )
2001-04-18 06:06:31 +00:00
{
2006-03-30 00:27:42 +00:00
return nsPrintEngine : : GetGlobalPrintSettings ( aGlobalPrintSettings ) ;
2001-04-18 06:06:31 +00:00
}
2002-08-21 12:01:05 +00:00
/* readonly attribute boolean doingPrint; */
2005-04-07 04:04:06 +00:00
// XXX This always returns PR_FALSE for subdocuments
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : GetDoingPrint ( PRBool * aDoingPrint )
2001-04-18 06:06:31 +00:00
{
2002-08-21 12:01:05 +00:00
NS_ENSURE_ARG_POINTER ( aDoingPrint ) ;
* aDoingPrint = PR_FALSE ;
if ( mPrintEngine ) {
2005-04-07 04:04:06 +00:00
// XXX shouldn't this be GetDoingPrint() ?
2002-08-21 12:01:05 +00:00
return mPrintEngine - > GetDoingPrintPreview ( aDoingPrint ) ;
}
return NS_OK ;
}
2001-04-18 06:06:31 +00:00
2002-08-21 12:01:05 +00:00
/* readonly attribute boolean doingPrintPreview; */
2005-04-07 04:04:06 +00:00
// XXX This always returns PR_FALSE for subdocuments
2002-08-21 12:01:05 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : GetDoingPrintPreview ( PRBool * aDoingPrintPreview )
{
NS_ENSURE_ARG_POINTER ( aDoingPrintPreview ) ;
2001-04-18 06:06:31 +00:00
2002-08-21 12:01:05 +00:00
* aDoingPrintPreview = PR_FALSE ;
if ( mPrintEngine ) {
return mPrintEngine - > GetDoingPrintPreview ( aDoingPrintPreview ) ;
}
2001-04-18 06:06:31 +00:00
return NS_OK ;
}
2002-08-21 12:01:05 +00:00
/* readonly attribute nsIPrintSettings currentPrintSettings; */
NS_IMETHODIMP
DocumentViewerImpl : : GetCurrentPrintSettings ( nsIPrintSettings * * aCurrentPrintSettings )
2001-04-18 06:06:31 +00:00
{
2002-08-21 12:01:05 +00:00
NS_ENSURE_ARG_POINTER ( aCurrentPrintSettings ) ;
2001-04-18 06:06:31 +00:00
2002-08-21 12:01:05 +00:00
* aCurrentPrintSettings = nsnull ;
NS_ENSURE_TRUE ( mPrintEngine , NS_ERROR_FAILURE ) ;
2001-04-18 06:06:31 +00:00
2002-08-21 12:01:05 +00:00
return mPrintEngine - > GetCurrentPrintSettings ( aCurrentPrintSettings ) ;
2001-04-18 06:06:31 +00:00
}
2000-02-16 01:39:30 +00:00
2005-09-16 02:25:37 +00:00
2002-08-21 12:01:05 +00:00
/* readonly attribute nsIDOMWindow currentChildDOMWindow; */
NS_IMETHODIMP
DocumentViewerImpl : : GetCurrentChildDOMWindow ( nsIDOMWindow * * aCurrentChildDOMWindow )
2000-01-18 21:06:10 +00:00
{
2002-08-21 12:01:05 +00:00
NS_ENSURE_ARG_POINTER ( aCurrentChildDOMWindow ) ;
* aCurrentChildDOMWindow = nsnull ;
return NS_ERROR_NOT_IMPLEMENTED ;
}
2002-04-17 04:17:16 +00:00
2002-08-21 12:01:05 +00:00
/* void cancel (); */
NS_IMETHODIMP
DocumentViewerImpl : : Cancel ( )
{
NS_ENSURE_TRUE ( mPrintEngine , NS_ERROR_FAILURE ) ;
return mPrintEngine - > Cancelled ( ) ;
}
2000-02-16 01:39:30 +00:00
2002-08-21 12:01:05 +00:00
/* void exitPrintPreview (); */
NS_IMETHODIMP
DocumentViewerImpl : : ExitPrintPreview ( )
{
if ( GetIsPrinting ( ) ) return NS_ERROR_FAILURE ;
NS_ENSURE_TRUE ( mPrintEngine , NS_ERROR_FAILURE ) ;
2002-04-17 04:17:16 +00:00
2002-08-21 12:01:05 +00:00
if ( GetIsPrintPreview ( ) ) {
ReturnToGalleyPresentation ( ) ;
2002-04-17 04:17:16 +00:00
}
2000-01-18 21:06:10 +00:00
return NS_OK ;
}
2000-02-10 04:35:51 +00:00
2002-08-21 12:01:05 +00:00
//----------------------------------------------------------------------------------
// Enumerate all the documents for their titles
NS_IMETHODIMP
DocumentViewerImpl : : EnumerateDocumentNames ( PRUint32 * aCount ,
PRUnichar * * * aResult )
2000-04-21 21:40:28 +00:00
{
2002-08-21 12:01:05 +00:00
# ifdef NS_PRINTING
NS_ENSURE_ARG ( aCount ) ;
NS_ENSURE_ARG_POINTER ( aResult ) ;
NS_ENSURE_TRUE ( mPrintEngine , NS_ERROR_FAILURE ) ;
2000-04-21 21:40:28 +00:00
2002-08-21 12:01:05 +00:00
return mPrintEngine - > EnumerateDocumentNames ( aCount , aResult ) ;
# else
return NS_ERROR_FAILURE ;
# endif
}
2000-04-21 21:40:28 +00:00
2002-08-21 12:01:05 +00:00
/* readonly attribute boolean isFramesetFrameSelected; */
NS_IMETHODIMP
DocumentViewerImpl : : GetIsFramesetFrameSelected ( PRBool * aIsFramesetFrameSelected )
2000-04-21 21:40:28 +00:00
{
2002-08-21 12:01:05 +00:00
# ifdef NS_PRINTING
* aIsFramesetFrameSelected = PR_FALSE ;
NS_ENSURE_TRUE ( mPrintEngine , NS_ERROR_FAILURE ) ;
return mPrintEngine - > GetIsFramesetFrameSelected ( aIsFramesetFrameSelected ) ;
# else
return NS_ERROR_FAILURE ;
# endif
2000-04-21 21:40:28 +00:00
}
2002-08-21 12:01:05 +00:00
/* readonly attribute long printPreviewNumPages; */
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 16:46:42 +00:00
NS_IMETHODIMP
2002-08-21 12:01:05 +00:00
DocumentViewerImpl : : GetPrintPreviewNumPages ( PRInt32 * aPrintPreviewNumPages )
2000-04-21 21:40:28 +00:00
{
2002-08-21 12:01:05 +00:00
# ifdef NS_PRINTING
NS_ENSURE_ARG_POINTER ( aPrintPreviewNumPages ) ;
NS_ENSURE_TRUE ( mPrintEngine , NS_ERROR_FAILURE ) ;
2000-04-21 21:40:28 +00:00
2002-08-21 12:01:05 +00:00
return mPrintEngine - > GetPrintPreviewNumPages ( aPrintPreviewNumPages ) ;
# else
return NS_ERROR_FAILURE ;
# endif
2000-04-21 21:40:28 +00:00
}
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 16:46:42 +00:00
2002-08-21 12:01:05 +00:00
/* readonly attribute boolean isFramesetDocument; */
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 16:46:42 +00:00
NS_IMETHODIMP
2002-08-21 12:01:05 +00:00
DocumentViewerImpl : : GetIsFramesetDocument ( PRBool * aIsFramesetDocument )
2000-04-21 21:40:28 +00:00
{
2002-08-21 12:01:05 +00:00
# ifdef NS_PRINTING
* aIsFramesetDocument = PR_FALSE ;
NS_ENSURE_TRUE ( mPrintEngine , NS_ERROR_FAILURE ) ;
2000-04-21 21:40:28 +00:00
2002-08-21 12:01:05 +00:00
return mPrintEngine - > GetIsFramesetDocument ( aIsFramesetDocument ) ;
# else
return NS_ERROR_FAILURE ;
# endif
}
2002-04-17 04:17:16 +00:00
2002-08-21 12:01:05 +00:00
/* readonly attribute boolean isIFrameSelected; */
NS_IMETHODIMP
DocumentViewerImpl : : GetIsIFrameSelected ( PRBool * aIsIFrameSelected )
{
# ifdef NS_PRINTING
* aIsIFrameSelected = PR_FALSE ;
NS_ENSURE_TRUE ( mPrintEngine , NS_ERROR_FAILURE ) ;
return mPrintEngine - > GetIsIFrameSelected ( aIsIFrameSelected ) ;
# else
return NS_ERROR_FAILURE ;
# endif
}
/* readonly attribute boolean isRangeSelection; */
NS_IMETHODIMP
DocumentViewerImpl : : GetIsRangeSelection ( PRBool * aIsRangeSelection )
{
# ifdef NS_PRINTING
* aIsRangeSelection = PR_FALSE ;
NS_ENSURE_TRUE ( mPrintEngine , NS_ERROR_FAILURE ) ;
return mPrintEngine - > GetIsRangeSelection ( aIsRangeSelection ) ;
# else
return NS_ERROR_FAILURE ;
# endif
2000-04-21 21:40:28 +00:00
}
2002-08-21 12:01:05 +00:00
//----------------------------------------------------------------------------------
// Printing/Print Preview Helpers
//----------------------------------------------------------------------------------
2002-10-08 13:17:56 +00:00
//----------------------------------------------------------------------------------
// Walks the document tree and tells each DocShell whether Printing/PP is happening
void
DocumentViewerImpl : : SetIsPrintingInDocShellTree ( nsIDocShellTreeNode * aParentNode ,
PRBool aIsPrintingOrPP ,
PRBool aStartAtTop )
{
NS_ASSERTION ( aParentNode , " Parent can't be NULL! " ) ;
nsCOMPtr < nsIDocShellTreeItem > parentItem ( do_QueryInterface ( aParentNode ) ) ;
// find top of "same parent" tree
if ( aStartAtTop ) {
while ( parentItem ) {
nsCOMPtr < nsIDocShellTreeItem > parent ;
parentItem - > GetSameTypeParent ( getter_AddRefs ( parent ) ) ;
if ( ! parent ) {
break ;
}
parentItem = do_QueryInterface ( parent ) ;
}
}
NS_ASSERTION ( parentItem , " parentItem can't be null " ) ;
// Check to see if the DocShell's ContentViewer is printing/PP
nsCOMPtr < nsIContentViewerContainer > viewerContainer ( do_QueryInterface ( parentItem ) ) ;
if ( viewerContainer ) {
viewerContainer - > SetIsPrinting ( aIsPrintingOrPP ) ;
}
// Traverse children to see if any of them are printing.
PRInt32 n ;
aParentNode - > GetChildCount ( & n ) ;
for ( PRInt32 i = 0 ; i < n ; i + + ) {
nsCOMPtr < nsIDocShellTreeItem > child ;
aParentNode - > GetChildAt ( i , getter_AddRefs ( child ) ) ;
nsCOMPtr < nsIDocShellTreeNode > childAsNode ( do_QueryInterface ( child ) ) ;
NS_ASSERTION ( childAsNode , " child isn't nsIDocShellTreeNode " ) ;
if ( childAsNode ) {
SetIsPrintingInDocShellTree ( childAsNode , aIsPrintingOrPP , PR_FALSE ) ;
}
}
}
# endif // NS_PRINTING
2002-08-21 12:01:05 +00:00
//------------------------------------------------------------
2005-04-07 04:04:06 +00:00
// XXX this always returns PR_FALSE for subdocuments
2002-08-21 12:01:05 +00:00
PRBool
DocumentViewerImpl : : GetIsPrinting ( )
2000-04-21 21:40:28 +00:00
{
2002-08-21 12:01:05 +00:00
# ifdef NS_PRINTING
if ( mPrintEngine ) {
return mPrintEngine - > GetIsPrinting ( ) ;
}
# endif
return PR_FALSE ;
2000-04-21 22:17:14 +00:00
}
2002-08-21 12:01:05 +00:00
//------------------------------------------------------------
2002-10-08 13:17:56 +00:00
// Notification from the PrintEngine of the current Printing status
2002-08-21 12:01:05 +00:00
void
DocumentViewerImpl : : SetIsPrinting ( PRBool aIsPrinting )
{
# ifdef NS_PRINTING
2002-10-08 13:17:56 +00:00
// Set all the docShells in the docshell tree to be printing.
// that way if anyone of them tries to "navigate" it can't
if ( mContainer ) {
2005-05-15 00:30:02 +00:00
nsCOMPtr < nsIDocShellTreeNode > docShellTreeNode ( do_QueryReferent ( mContainer ) ) ;
2002-10-08 13:17:56 +00:00
NS_ASSERTION ( docShellTreeNode , " mContainer has to be a nsIDocShellTreeNode " ) ;
SetIsPrintingInDocShellTree ( docShellTreeNode , aIsPrinting , PR_TRUE ) ;
2002-08-21 12:01:05 +00:00
}
# endif
}
2001-02-01 20:49:10 +00:00
2002-08-21 12:01:05 +00:00
//------------------------------------------------------------
2002-10-08 13:17:56 +00:00
// The PrintEngine holds the current value
2005-04-07 04:04:06 +00:00
// this called from inside the DocViewer.
// XXX it always returns PR_FALSE for subdocuments
2002-04-17 04:17:16 +00:00
PRBool
2002-08-21 12:01:05 +00:00
DocumentViewerImpl : : GetIsPrintPreview ( )
{
# ifdef NS_PRINTING
if ( mPrintEngine ) {
return mPrintEngine - > GetIsPrintPreview ( ) ;
}
# endif
return PR_FALSE ;
}
2001-02-06 23:03:17 +00:00
2002-08-21 12:01:05 +00:00
//------------------------------------------------------------
2002-10-08 13:17:56 +00:00
// Notification from the PrintEngine of the current PP status
2002-08-21 12:01:05 +00:00
void
DocumentViewerImpl : : SetIsPrintPreview ( PRBool aIsPrintPreview )
{
# ifdef NS_PRINTING
2002-10-08 13:17:56 +00:00
// Set all the docShells in the docshell tree to be printing.
// that way if anyone of them tries to "navigate" it can't
if ( mContainer ) {
2005-05-15 00:30:02 +00:00
nsCOMPtr < nsIDocShellTreeNode > docShellTreeNode ( do_QueryReferent ( mContainer ) ) ;
2002-10-08 13:17:56 +00:00
NS_ASSERTION ( docShellTreeNode , " mContainer has to be a nsIDocShellTreeNode " ) ;
SetIsPrintingInDocShellTree ( docShellTreeNode , aIsPrintPreview , PR_TRUE ) ;
2002-08-21 12:01:05 +00:00
}
# endif
2001-02-06 23:03:17 +00:00
}
2002-02-01 14:52:11 +00:00
//----------------------------------------------------------------------------------
2002-08-21 12:01:05 +00:00
// nsIDocumentViewerPrint IFace
//----------------------------------------------------------------------------------
//------------------------------------------------------------
void
DocumentViewerImpl : : IncrementDestroyRefCount ( )
2002-02-01 14:52:11 +00:00
{
2002-08-21 12:01:05 +00:00
+ + mDestroyRefCount ;
}
2002-02-01 14:52:11 +00:00
2002-08-21 12:01:05 +00:00
//------------------------------------------------------------
2006-12-10 08:05:05 +00:00
static void ResetFocusState ( nsIDocShell * aDocShell ) ;
2002-08-21 12:01:05 +00:00
void
DocumentViewerImpl : : ReturnToGalleyPresentation ( )
{
# if defined(NS_PRINTING) && defined(NS_PRINT_PREVIEW)
if ( ! GetIsPrintPreview ( ) ) {
2006-10-19 22:43:59 +00:00
NS_ERROR ( " Wow, we should never get here! " ) ;
2002-08-21 12:01:05 +00:00
return ;
}
2002-04-17 04:17:16 +00:00
2002-08-21 12:01:05 +00:00
SetIsPrintPreview ( PR_FALSE ) ;
2006-12-10 08:05:05 +00:00
mPrintEngine - > TurnScriptingOn ( PR_TRUE ) ;
mPrintEngine - > Destroy ( ) ;
mPrintEngine = nsnull ;
2004-10-09 01:39:21 +00:00
mViewManager - > EnableRefresh ( NS_VMREFRESH_DEFERRED ) ;
2002-08-21 12:01:05 +00:00
2006-12-10 08:05:05 +00:00
nsCOMPtr < nsIDocShell > docShell ( do_QueryReferent ( mContainer ) ) ;
ResetFocusState ( docShell ) ;
2008-03-13 02:58:34 +00:00
if ( mPresContext )
mPresContext - > RestoreImageAnimationMode ( ) ;
2007-11-09 10:19:12 +00:00
SetTextZoom ( mTextZoom ) ;
SetFullZoom ( mPageZoom ) ;
2002-08-21 12:01:05 +00:00
Show ( ) ;
# endif // NS_PRINTING && NS_PRINT_PREVIEW
2002-04-22 23:12:18 +00:00
}
2005-07-21 00:15:27 +00:00
//------------------------------------------------------------
// Reset ESM focus for all descendent doc shells.
static void
ResetFocusState ( nsIDocShell * aDocShell )
{
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 18:00:39 +00:00
nsIFocusManager * fm = nsFocusManager : : GetFocusManager ( ) ;
if ( ! fm )
return ;
2005-07-21 00:15:27 +00:00
nsCOMPtr < nsISimpleEnumerator > docShellEnumerator ;
aDocShell - > GetDocShellEnumerator ( nsIDocShellTreeItem : : typeContent ,
nsIDocShell : : ENUMERATE_FORWARDS ,
getter_AddRefs ( docShellEnumerator ) ) ;
nsCOMPtr < nsISupports > currentContainer ;
PRBool hasMoreDocShells ;
while ( NS_SUCCEEDED ( docShellEnumerator - > HasMoreElements ( & hasMoreDocShells ) )
& & hasMoreDocShells ) {
docShellEnumerator - > GetNext ( getter_AddRefs ( currentContainer ) ) ;
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 18:00:39 +00:00
nsCOMPtr < nsIDOMWindow > win = do_GetInterface ( currentContainer ) ;
if ( win )
fm - > ClearFocus ( win ) ;
2005-07-21 00:15:27 +00:00
}
}
2002-08-21 12:01:05 +00:00
//------------------------------------------------------------
2002-09-10 01:57:09 +00:00
// This called ONLY when printing has completed and the DV
// is being notified that it should get rid of the PrintEngine.
//
// BUT, if we are in Print Preview then we want to ignore the
// notification (we do not get rid of the PrintEngine)
//
// One small caveat:
// This IS called from two places in this module for cleaning
// up when an error occurred during the start up printing
// and print preview
//
2002-08-21 12:01:05 +00:00
void
DocumentViewerImpl : : OnDonePrinting ( )
2002-07-09 12:39:02 +00:00
{
2002-08-21 12:01:05 +00:00
# if defined(NS_PRINTING) && defined(NS_PRINT_PREVIEW)
if ( mPrintEngine ) {
2002-09-10 01:57:09 +00:00
if ( GetIsPrintPreview ( ) ) {
mPrintEngine - > DestroyPrintingData ( ) ;
} else {
mPrintEngine - > Destroy ( ) ;
2006-12-10 08:05:05 +00:00
mPrintEngine = nsnull ;
2002-09-10 01:57:09 +00:00
}
2002-10-01 21:57:15 +00:00
// We are done printing, now cleanup
2003-09-26 21:45:15 +00:00
if ( mDeferredWindowClose ) {
mDeferredWindowClose = PR_FALSE ;
2005-05-15 00:30:02 +00:00
nsCOMPtr < nsISupports > container = do_QueryReferent ( mContainer ) ;
nsCOMPtr < nsIDOMWindowInternal > win = do_GetInterface ( container ) ;
2003-09-26 21:45:15 +00:00
if ( win )
win - > Close ( ) ;
} else if ( mClosingWhilePrinting ) {
2002-10-01 21:57:15 +00:00
if ( mDocument ) {
mDocument - > SetScriptGlobalObject ( nsnull ) ;
2005-05-18 03:52:33 +00:00
mDocument - > Destroy ( ) ;
2002-10-01 21:57:15 +00:00
mDocument = nsnull ;
}
mClosingWhilePrinting = PR_FALSE ;
}
2008-03-13 02:58:34 +00:00
if ( mPresContext )
mPresContext - > RestoreImageAnimationMode ( ) ;
2002-07-09 12:39:02 +00:00
}
2002-08-21 12:01:05 +00:00
# endif // NS_PRINTING && NS_PRINT_PREVIEW
2002-07-09 12:39:02 +00:00
}
2006-04-01 01:19:28 +00:00
NS_IMETHODIMP DocumentViewerImpl : : SetPageMode ( PRBool aPageMode , nsIPrintSettings * aPrintSettings )
{
2007-03-21 06:07:42 +00:00
// XXX Page mode is only partially working; it's currently used for
// reftests that require a paginated context
2006-04-01 01:19:28 +00:00
mIsPageMode = aPageMode ;
// Get the current size of what is being viewed
2009-01-15 03:27:09 +00:00
nsIntRect bounds ;
2006-04-01 01:19:28 +00:00
mWindow - > GetBounds ( bounds ) ;
if ( mPresShell ) {
2009-01-14 12:24:10 +00:00
DestroyPresShell ( ) ;
2006-04-01 01:19:28 +00:00
}
if ( mPresContext ) {
mPresContext - > SetContainer ( nsnull ) ;
mPresContext - > SetLinkHandler ( nsnull ) ;
}
mPresShell = nsnull ;
mPresContext = nsnull ;
mViewManager = nsnull ;
mWindow = nsnull ;
2006-05-19 10:26:44 +00:00
NS_ENSURE_STATE ( mDocument ) ;
2006-04-01 01:19:28 +00:00
if ( aPageMode )
{
2006-05-19 10:26:44 +00:00
mPresContext =
new nsPresContext ( mDocument , nsPresContext : : eContext_PageLayout ) ;
NS_ENSURE_TRUE ( mPresContext , NS_ERROR_OUT_OF_MEMORY ) ;
2006-04-01 01:19:28 +00:00
mPresContext - > SetPaginatedScrolling ( PR_TRUE ) ;
mPresContext - > SetPrintSettings ( aPrintSettings ) ;
nsresult rv = mPresContext - > Init ( mDeviceContext ) ;
2006-05-19 10:26:44 +00:00
NS_ENSURE_SUCCESS ( rv , rv ) ;
2006-04-01 01:19:28 +00:00
}
2008-08-18 19:22:19 +00:00
InitInternal ( mParentWidget , nsnull , bounds , PR_TRUE , PR_FALSE , PR_FALSE ) ;
2006-04-01 01:19:28 +00:00
mViewManager - > EnableRefresh ( NS_VMREFRESH_NO_SYNC ) ;
Show ( ) ;
return NS_OK ;
2006-04-05 04:37:44 +00:00
}
2007-10-06 00:35:00 +00:00
NS_IMETHODIMP
DocumentViewerImpl : : GetHistoryEntry ( nsISHEntry * * aHistoryEntry )
{
NS_IF_ADDREF ( * aHistoryEntry = mSHEntry ) ;
return NS_OK ;
}
2009-01-14 12:24:10 +00:00
void
DocumentViewerImpl : : DestroyPresShell ( )
{
// Break circular reference (or something)
mPresShell - > EndObservingDocument ( ) ;
nsCOMPtr < nsISelection > selection ;
GetDocumentSelection ( getter_AddRefs ( selection ) ) ;
nsCOMPtr < nsISelectionPrivate > selPrivate = do_QueryInterface ( selection ) ;
if ( selPrivate & & mSelectionListener )
selPrivate - > RemoveSelectionListener ( mSelectionListener ) ;
2009-05-15 03:08:41 +00:00
nsAutoScriptBlocker scriptBlocker ;
2009-01-14 12:24:10 +00:00
mPresShell - > Destroy ( ) ;
mPresShell = nsnull ;
}