1999-05-06 23:25:40 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
|
|
*
|
1999-11-06 06:40:37 +03:00
|
|
|
* The contents of this file are subject to the Netscape 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/NPL/
|
1999-05-06 23:25:40 +04:00
|
|
|
*
|
1999-11-06 06:40:37 +03: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 23:25:40 +04:00
|
|
|
*
|
|
|
|
* The Original Code is Mozilla Communicator client code.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is Netscape Communications
|
1999-11-06 06:40:37 +03:00
|
|
|
* Corporation. Portions created by Netscape are
|
|
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
|
|
* Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s):
|
1999-05-06 23:25:40 +04:00
|
|
|
*/
|
|
|
|
#include "nslayout.h"
|
|
|
|
#include "nsCOMPtr.h"
|
|
|
|
#include "nsCRT.h"
|
|
|
|
#include "nsString.h"
|
|
|
|
#include "nsISupports.h"
|
1999-11-19 10:35:27 +03:00
|
|
|
#include "nsIContent.h"
|
|
|
|
#include "nsIContentViewerContainer.h"
|
1999-05-06 23:25:40 +04:00
|
|
|
#include "nsIDocumentViewer.h"
|
2000-09-01 05:54:35 +04:00
|
|
|
#include "nsIDOMWindowInternal.h"
|
1999-09-22 11:34:31 +04:00
|
|
|
|
|
|
|
#include "nsIImageGroup.h"
|
|
|
|
#include "nsIImageObserver.h"
|
1999-05-06 23:25:40 +04:00
|
|
|
|
|
|
|
#include "nsIDocument.h"
|
|
|
|
#include "nsIPresContext.h"
|
|
|
|
#include "nsIPresShell.h"
|
|
|
|
#include "nsIStyleSet.h"
|
|
|
|
#include "nsIStyleSheet.h"
|
2000-04-29 03:32:51 +04:00
|
|
|
#include "nsICSSStyleSheet.h"
|
2000-04-03 01:52:17 +04:00
|
|
|
#include "nsIStyleContext.h"
|
1999-05-06 23:25:40 +04:00
|
|
|
#include "nsIFrame.h"
|
|
|
|
|
1999-12-03 12:24:22 +03:00
|
|
|
#include "nsIScriptGlobalObjectOwner.h"
|
1999-05-06 23:25:40 +04:00
|
|
|
#include "nsIScriptGlobalObject.h"
|
|
|
|
#include "nsILinkHandler.h"
|
|
|
|
#include "nsIDOMDocument.h"
|
2000-09-14 15:45:01 +04:00
|
|
|
#include "nsISelectionListener.h"
|
|
|
|
#include "nsISelectionPrivate.h"
|
2000-01-19 00:06:10 +03:00
|
|
|
#include "nsIDOMHTMLDocument.h"
|
|
|
|
#include "nsIDOMHTMLElement.h"
|
|
|
|
#include "nsIDOMRange.h"
|
2001-02-19 15:55:42 +03:00
|
|
|
#include "nsContentCID.h"
|
2000-01-19 00:06:10 +03:00
|
|
|
#include "nsLayoutCID.h"
|
2000-10-20 01:49:12 +04:00
|
|
|
#include "nsHTMLParts.h"
|
1999-05-06 23:25:40 +04:00
|
|
|
|
|
|
|
#include "nsViewsCID.h"
|
|
|
|
#include "nsWidgetsCID.h"
|
|
|
|
#include "nsGfxCIID.h"
|
|
|
|
#include "nsIDeviceContext.h"
|
|
|
|
#include "nsIDeviceContextSpec.h"
|
|
|
|
#include "nsIDeviceContextSpecFactory.h"
|
|
|
|
#include "nsIViewManager.h"
|
|
|
|
#include "nsIView.h"
|
|
|
|
|
|
|
|
#include "nsIPref.h"
|
|
|
|
#include "nsIPageSequenceFrame.h"
|
|
|
|
#include "nsIURL.h"
|
1999-05-14 18:40:59 +04:00
|
|
|
#include "nsIWebShell.h"
|
1999-11-19 10:35:27 +03:00
|
|
|
#include "nsIContentViewerEdit.h"
|
|
|
|
#include "nsIContentViewerFile.h"
|
|
|
|
#include "nsIMarkupDocumentViewer.h"
|
1999-11-13 10:36:28 +03:00
|
|
|
#include "nsIInterfaceRequestor.h"
|
1999-12-18 05:09:29 +03:00
|
|
|
#include "nsIDocShellTreeItem.h"
|
|
|
|
#include "nsIDocShellTreeNode.h"
|
2000-02-08 18:49:14 +03:00
|
|
|
#include "nsIDocShellTreeOwner.h"
|
1999-12-18 05:09:29 +03:00
|
|
|
#include "nsIDocShell.h"
|
2000-01-26 18:14:41 +03:00
|
|
|
#include "nsIFrameDebug.h"
|
2000-10-20 01:49:12 +04:00
|
|
|
#include "nsILayoutHistoryState.h"
|
2000-09-22 18:42:13 +04:00
|
|
|
#include "nsLayoutAtoms.h"
|
|
|
|
#include "nsIDOMHTMLFrameSetElement.h"
|
|
|
|
#include "nsIFrameManager.h"
|
2001-01-27 19:58:15 +03:00
|
|
|
#include "nsIParser.h"
|
2001-01-08 23:26:05 +03:00
|
|
|
#include "nsIPrintContext.h"
|
2000-10-29 02:17:53 +04:00
|
|
|
|
2000-04-29 03:32:51 +04:00
|
|
|
#include "nsIChromeRegistry.h"
|
1999-05-14 18:40:59 +04:00
|
|
|
|
1999-09-22 11:34:31 +04:00
|
|
|
#include "nsIServiceManager.h"
|
|
|
|
#include "nsIEventQueueService.h"
|
|
|
|
#include "nsIEventQueue.h"
|
|
|
|
|
2001-02-01 23:49:10 +03:00
|
|
|
#include "nsPIDOMWindow.h"
|
|
|
|
#include "nsIFocusController.h"
|
|
|
|
|
2001-01-27 17:09:34 +03:00
|
|
|
// Print Options
|
|
|
|
#include "nsIPrintOptions.h"
|
|
|
|
#include "nsGfxCIID.h"
|
|
|
|
#include "nsIServiceManager.h"
|
|
|
|
static NS_DEFINE_CID(kPrintOptionsCID, NS_PRINTOPTIONS_CID);
|
|
|
|
#include "nsHTMLAtoms.h" // XXX until atoms get factored into nsLayoutAtoms
|
|
|
|
|
2001-02-07 02:03:17 +03:00
|
|
|
// FrameSet
|
|
|
|
#include "nsINodeInfo.h"
|
|
|
|
#include "nsIDocument.h"
|
|
|
|
#include "nsHTMLAtoms.h"
|
|
|
|
#include "nsIHTMLContent.h"
|
|
|
|
#include "nsINameSpaceManager.h"
|
|
|
|
#include "nsIWebShell.h"
|
|
|
|
|
2000-04-22 01:40:28 +04:00
|
|
|
//focus
|
|
|
|
#include "nsIDOMEventReceiver.h"
|
|
|
|
#include "nsIDOMFocusListener.h"
|
2000-04-27 11:37:12 +04:00
|
|
|
#include "nsISelectionController.h"
|
2000-04-22 01:40:28 +04:00
|
|
|
|
2000-09-02 19:32:28 +04:00
|
|
|
#include "nsITransformMediator.h"
|
2000-04-22 01:40:28 +04:00
|
|
|
|
1999-09-22 11:34:31 +04:00
|
|
|
static NS_DEFINE_CID(kEventQueueService, NS_EVENTQUEUESERVICE_CID);
|
2001-02-19 15:55:42 +03:00
|
|
|
static NS_DEFINE_CID(kPresShellCID, NS_PRESSHELL_CID);
|
|
|
|
static NS_DEFINE_CID(kGalleyContextCID, NS_GALLEYCONTEXT_CID);
|
|
|
|
static NS_DEFINE_CID(kPrintContextCID, NS_PRINTCONTEXT_CID);
|
|
|
|
static NS_DEFINE_CID(kStyleSetCID, NS_STYLESET_CID);
|
1999-05-06 23:25:40 +04:00
|
|
|
|
|
|
|
#ifdef NS_DEBUG
|
|
|
|
#undef NOISY_VIEWER
|
|
|
|
#else
|
|
|
|
#undef NOISY_VIEWER
|
|
|
|
#endif
|
|
|
|
|
2001-02-07 02:03:17 +03:00
|
|
|
//#define SPOOL_TO_ONE_DOC 1
|
2000-02-16 04:39:30 +03:00
|
|
|
|
|
|
|
class DocumentViewerImpl;
|
|
|
|
|
|
|
|
// a small delegate class used to avoid circular references
|
|
|
|
|
|
|
|
#ifdef XP_MAC
|
|
|
|
#pragma mark ** nsDocViwerSelectionListener **
|
|
|
|
#endif
|
|
|
|
|
2000-09-14 15:45:01 +04:00
|
|
|
class nsDocViwerSelectionListener : public nsISelectionListener
|
2000-02-16 04:39:30 +03:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
// nsISupports interface...
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
|
2000-09-14 15:45:01 +04:00
|
|
|
// nsISelectionListerner interface
|
|
|
|
NS_DECL_NSISELECTIONLISTENER
|
2000-02-16 04:39:30 +03:00
|
|
|
|
|
|
|
nsDocViwerSelectionListener()
|
|
|
|
: mDocViewer(NULL)
|
|
|
|
, mGotSelectionState(PR_FALSE)
|
|
|
|
, mSelectionWasCollapsed(PR_FALSE)
|
|
|
|
{
|
|
|
|
NS_INIT_REFCNT();
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual ~nsDocViwerSelectionListener() {}
|
|
|
|
|
|
|
|
nsresult Init(DocumentViewerImpl *aDocViewer);
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
DocumentViewerImpl* mDocViewer;
|
|
|
|
PRPackedBool mGotSelectionState;
|
|
|
|
PRPackedBool mSelectionWasCollapsed;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2000-04-22 01:40:28 +04:00
|
|
|
/** editor Implementation of the FocusListener interface
|
|
|
|
*/
|
|
|
|
class nsDocViewerFocusListener : public nsIDOMFocusListener
|
|
|
|
{
|
|
|
|
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*/
|
|
|
|
virtual nsresult HandleEvent(nsIDOMEvent* aEvent);
|
|
|
|
virtual nsresult Focus(nsIDOMEvent* aEvent);
|
|
|
|
virtual nsresult Blur(nsIDOMEvent* aEvent);
|
|
|
|
/*END implementations of focus event handler interface*/
|
|
|
|
nsresult Init(DocumentViewerImpl *aDocViewer);
|
|
|
|
|
|
|
|
private:
|
|
|
|
DocumentViewerImpl* mDocViewer;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
2000-02-16 04:39:30 +03:00
|
|
|
#ifdef XP_MAC
|
|
|
|
#pragma mark ** DocumentViewerImpl **
|
|
|
|
#endif
|
|
|
|
|
2001-02-01 23:49:10 +03:00
|
|
|
|
1999-09-22 11:34:31 +04:00
|
|
|
class DocumentViewerImpl : public nsIDocumentViewer,
|
1999-11-19 10:35:27 +03:00
|
|
|
public nsIContentViewerEdit,
|
|
|
|
public nsIContentViewerFile,
|
|
|
|
public nsIMarkupDocumentViewer,
|
2000-02-16 04:39:30 +03:00
|
|
|
public nsIImageGroupObserver
|
1999-05-06 23:25:40 +04:00
|
|
|
{
|
2000-02-16 04:39:30 +03:00
|
|
|
friend class nsDocViwerSelectionListener;
|
|
|
|
|
1999-05-06 23:25:40 +04:00
|
|
|
public:
|
|
|
|
DocumentViewerImpl();
|
|
|
|
DocumentViewerImpl(nsIPresContext* aPresContext);
|
|
|
|
|
|
|
|
NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW
|
|
|
|
|
|
|
|
// nsISupports interface...
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
|
|
|
|
// nsIContentViewer interface...
|
2000-03-11 04:24:59 +03:00
|
|
|
NS_IMETHOD Init(nsIWidget* aParentWidget,
|
1999-05-06 23:25:40 +04:00
|
|
|
nsIDeviceContext* aDeviceContext,
|
2000-03-11 04:24:59 +03:00
|
|
|
const nsRect& aBounds);
|
1999-05-06 23:25:40 +04:00
|
|
|
NS_IMETHOD BindToDocument(nsISupports* aDoc, const char* aCommand);
|
1999-11-14 13:12:21 +03:00
|
|
|
NS_IMETHOD SetContainer(nsISupports* aContainer);
|
|
|
|
NS_IMETHOD GetContainer(nsISupports** aContainerResult);
|
2000-06-22 09:38:07 +04:00
|
|
|
NS_IMETHOD LoadComplete(nsresult aStatus);
|
|
|
|
NS_IMETHOD Destroy(void);
|
1999-05-06 23:25:40 +04:00
|
|
|
NS_IMETHOD Stop(void);
|
2000-06-22 09:38:07 +04:00
|
|
|
NS_IMETHOD GetDOMDocument(nsIDOMDocument **aResult);
|
|
|
|
NS_IMETHOD SetDOMDocument(nsIDOMDocument *aDocument);
|
1999-05-06 23:25:40 +04:00
|
|
|
NS_IMETHOD GetBounds(nsRect& aResult);
|
|
|
|
NS_IMETHOD SetBounds(const nsRect& aBounds);
|
|
|
|
NS_IMETHOD Move(PRInt32 aX, PRInt32 aY);
|
|
|
|
NS_IMETHOD Show();
|
|
|
|
NS_IMETHOD Hide();
|
1999-05-07 23:26:23 +04:00
|
|
|
NS_IMETHOD SetEnableRendering(PRBool aOn);
|
|
|
|
NS_IMETHOD GetEnableRendering(PRBool* aResult);
|
1999-05-06 23:25:40 +04:00
|
|
|
|
|
|
|
// nsIDocumentViewer interface...
|
|
|
|
NS_IMETHOD SetUAStyleSheet(nsIStyleSheet* aUAStyleSheet);
|
|
|
|
NS_IMETHOD GetDocument(nsIDocument*& aResult);
|
|
|
|
NS_IMETHOD GetPresShell(nsIPresShell*& aResult);
|
|
|
|
NS_IMETHOD GetPresContext(nsIPresContext*& aResult);
|
|
|
|
NS_IMETHOD CreateDocumentViewerUsing(nsIPresContext* aPresContext,
|
|
|
|
nsIDocumentViewer*& aResult);
|
2000-09-02 19:32:28 +04:00
|
|
|
NS_IMETHOD SetTransformMediator(nsITransformMediator* aMediator);
|
1999-05-06 23:25:40 +04:00
|
|
|
|
1999-11-19 10:35:27 +03:00
|
|
|
// nsIContentViewerEdit
|
|
|
|
NS_DECL_NSICONTENTVIEWEREDIT
|
|
|
|
|
|
|
|
// nsIContentViewerFile
|
|
|
|
NS_DECL_NSICONTENTVIEWERFILE
|
|
|
|
|
|
|
|
// nsIMarkupDocumentViewer
|
|
|
|
NS_DECL_NSIMARKUPDOCUMENTVIEWER
|
|
|
|
|
2000-04-03 01:52:17 +04:00
|
|
|
typedef void (*CallChildFunc)(nsIMarkupDocumentViewer* aViewer,
|
|
|
|
void* aClosure);
|
|
|
|
nsresult CallChildren(CallChildFunc aFunc, void* aClosure);
|
|
|
|
|
2000-01-19 00:06:10 +03:00
|
|
|
// nsIImageGroupObserver interface
|
1999-09-22 11:34:31 +04:00
|
|
|
virtual void Notify(nsIImageGroup *aImageGroup,
|
|
|
|
nsImageGroupNotification aNotificationType);
|
2000-01-19 00:06:10 +03:00
|
|
|
|
1999-05-06 23:25:40 +04:00
|
|
|
protected:
|
|
|
|
virtual ~DocumentViewerImpl();
|
|
|
|
|
|
|
|
private:
|
|
|
|
void ForceRefresh(void);
|
|
|
|
nsresult CreateStyleSet(nsIDocument* aDocument, nsIStyleSet** aStyleSet);
|
2000-03-11 04:24:59 +03:00
|
|
|
nsresult MakeWindow(nsIWidget* aParentWidget,
|
|
|
|
const nsRect& aBounds);
|
1999-05-06 23:25:40 +04:00
|
|
|
|
2001-02-07 02:03:17 +03:00
|
|
|
nsresult GetDocumentSelection(nsISelection **aSelection, nsIPresShell * aPresShell = nsnull);
|
2000-09-22 18:42:13 +04:00
|
|
|
nsresult FindFrameSetWithIID(nsIContent * aParentContent, const nsIID& aIID);
|
2001-02-07 02:03:17 +03:00
|
|
|
PRBool IsThereASelection(nsIDOMWindowInternal * aDOMWin);
|
|
|
|
PRBool DoesContainFrameSet(nsIWebShell * aParent);
|
|
|
|
PRBool IsThereAnIFrameSelected(nsIWebShell* aWebShell,
|
|
|
|
nsIDOMWindowInternal * aDOMWin,
|
|
|
|
PRBool& aDoesContainFrameset);
|
|
|
|
PRBool IsWindowsInOurSubTree(nsIDOMWindowInternal * aDOMWindow);
|
|
|
|
|
|
|
|
// get the currently infocus frame for the document viewer
|
|
|
|
nsIDOMWindowInternal * FindFocusedDOMWindowInternal();
|
|
|
|
// get the DOM window for a given document viewer
|
|
|
|
nsIDOMWindow * GetDOMWindowForThisDV();
|
2000-01-19 00:06:10 +03:00
|
|
|
|
1999-09-22 11:34:31 +04:00
|
|
|
//
|
|
|
|
// The following three methods are used for printing...
|
|
|
|
//
|
|
|
|
void DocumentReadyForPrinting();
|
2001-01-27 17:09:34 +03:00
|
|
|
//nsresult PrintSelection(nsIDeviceContextSpec * aDevSpec);
|
|
|
|
nsresult GetSelectionDocument(nsIDeviceContextSpec * aDevSpec, nsIDocument ** aNewDoc);
|
1999-09-22 11:34:31 +04:00
|
|
|
|
2001-02-07 02:03:17 +03:00
|
|
|
PRUnichar* GetWebShellTitle(nsIWebShell * aWebShell);
|
|
|
|
|
1999-09-22 11:34:31 +04:00
|
|
|
static void PR_CALLBACK HandlePLEvent(PLEvent* aEvent);
|
|
|
|
static void PR_CALLBACK DestroyPLEvent(PLEvent* aEvent);
|
|
|
|
|
1999-05-06 23:25:40 +04:00
|
|
|
protected:
|
|
|
|
// 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).
|
|
|
|
|
1999-11-13 10:36:28 +03:00
|
|
|
nsISupports* mContainer; // [WEAK] it owns me!
|
1999-05-06 23:25:40 +04:00
|
|
|
nsCOMPtr<nsIDeviceContext> mDeviceContext; // ??? can't hurt, but...
|
|
|
|
nsIView* mView; // [WEAK] cleaned up by view mgr
|
|
|
|
|
2000-09-17 00:53:08 +04:00
|
|
|
// the following seven items are explicitly in this order
|
1999-05-06 23:25:40 +04:00
|
|
|
// so they will be destroyed in the reverse order (pinkerton, scc)
|
2000-09-02 19:32:28 +04:00
|
|
|
nsCOMPtr<nsITransformMediator> mTransformMediator;
|
1999-05-06 23:25:40 +04:00
|
|
|
nsCOMPtr<nsIDocument> mDocument;
|
|
|
|
nsCOMPtr<nsIWidget> mWindow; // ??? should we really own it?
|
|
|
|
nsCOMPtr<nsIViewManager> mViewManager;
|
|
|
|
nsCOMPtr<nsIPresContext> mPresContext;
|
|
|
|
nsCOMPtr<nsIPresShell> mPresShell;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIStyleSheet> mUAStyleSheet;
|
1999-05-07 23:26:23 +04:00
|
|
|
|
2000-09-14 15:45:01 +04:00
|
|
|
nsCOMPtr<nsISelectionListener> mSelectionListener;
|
2000-04-22 01:40:28 +04:00
|
|
|
nsCOMPtr<nsIDOMFocusListener> mFocusListener;
|
2000-02-16 04:39:30 +03:00
|
|
|
|
2000-01-26 18:14:41 +03:00
|
|
|
PRBool mEnableRendering;
|
1999-07-15 18:23:40 +04:00
|
|
|
PRInt16 mNumURLStarts;
|
|
|
|
PRBool mIsPrinting;
|
|
|
|
|
|
|
|
|
2000-01-26 18:14:41 +03:00
|
|
|
|
1999-07-15 18:23:40 +04:00
|
|
|
// printing members
|
2001-02-01 23:49:10 +03:00
|
|
|
nsIDeviceContext *mPrintDC;
|
|
|
|
nsIPresContext *mPrintPC;
|
|
|
|
nsIStyleSet *mPrintSS;
|
|
|
|
nsIPresShell *mPrintPS;
|
|
|
|
nsIViewManager *mPrintVM;
|
|
|
|
nsIView *mPrintView;
|
|
|
|
FILE *mFilePointer; // a file where information can go to when printing
|
1999-07-15 18:23:40 +04:00
|
|
|
|
2000-03-15 04:47:36 +03:00
|
|
|
nsCOMPtr<nsIPrintListener> mPrintListener; // An observer for printing...
|
|
|
|
|
1999-11-19 10:35:27 +03:00
|
|
|
// document management data
|
|
|
|
// these items are specific to markup documents (html and xml)
|
|
|
|
// may consider splitting these out into a subclass
|
|
|
|
PRBool mAllowPlugins;
|
|
|
|
/* character set member data */
|
|
|
|
nsString mDefaultCharacterSet;
|
|
|
|
nsString mHintCharset;
|
|
|
|
nsCharsetSource mHintCharsetSource;
|
|
|
|
nsString mForceCharacterSet;
|
1999-05-06 23:25:40 +04:00
|
|
|
};
|
|
|
|
|
1999-05-07 23:26:23 +04:00
|
|
|
// Class IDs
|
1999-07-15 11:00:22 +04:00
|
|
|
static NS_DEFINE_CID(kViewManagerCID, NS_VIEW_MANAGER_CID);
|
|
|
|
static NS_DEFINE_CID(kScrollingViewCID, NS_SCROLLING_VIEW_CID);
|
|
|
|
static NS_DEFINE_CID(kWidgetCID, NS_CHILD_CID);
|
|
|
|
static NS_DEFINE_CID(kViewCID, NS_VIEW_CID);
|
1999-05-06 23:25:40 +04:00
|
|
|
|
|
|
|
nsresult
|
|
|
|
NS_NewDocumentViewer(nsIDocumentViewer** aResult)
|
|
|
|
{
|
|
|
|
NS_PRECONDITION(aResult, "null OUT ptr");
|
|
|
|
if (!aResult) {
|
|
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
}
|
|
|
|
DocumentViewerImpl* it = new DocumentViewerImpl();
|
|
|
|
if (nsnull == it) {
|
|
|
|
*aResult = nsnull;
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
2000-01-19 00:06:10 +03:00
|
|
|
return it->QueryInterface(NS_GET_IID(nsIDocumentViewer), (void**) aResult);
|
1999-05-06 23:25:40 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
// Note: operator new zeros our memory
|
|
|
|
DocumentViewerImpl::DocumentViewerImpl()
|
|
|
|
{
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_INIT_ISUPPORTS();
|
1999-05-14 00:27:47 +04:00
|
|
|
mEnableRendering = PR_TRUE;
|
2000-01-26 18:14:41 +03:00
|
|
|
mFilePointer = nsnull;
|
2000-03-15 04:47:36 +03:00
|
|
|
mPrintListener = nsnull;
|
1999-05-06 23:25:40 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
DocumentViewerImpl::DocumentViewerImpl(nsIPresContext* aPresContext)
|
|
|
|
: mPresContext(dont_QueryInterface(aPresContext))
|
|
|
|
{
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_INIT_ISUPPORTS();
|
1999-11-19 10:35:27 +03:00
|
|
|
mHintCharsetSource = kCharsetUninitialized;
|
|
|
|
mAllowPlugins = PR_TRUE;
|
1999-11-24 00:45:36 +03:00
|
|
|
mEnableRendering = PR_TRUE;
|
2000-01-26 18:14:41 +03:00
|
|
|
mFilePointer = nsnull;
|
1999-11-24 00:45:36 +03:00
|
|
|
|
1999-05-06 23:25:40 +04:00
|
|
|
}
|
|
|
|
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_IMPL_ISUPPORTS5(DocumentViewerImpl,
|
|
|
|
nsIContentViewer,
|
|
|
|
nsIDocumentViewer,
|
|
|
|
nsIMarkupDocumentViewer,
|
|
|
|
nsIContentViewerFile,
|
|
|
|
nsIContentViewerEdit)
|
1999-05-06 23:25:40 +04:00
|
|
|
|
|
|
|
DocumentViewerImpl::~DocumentViewerImpl()
|
|
|
|
{
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_ASSERTION(!mDocument, "User did not call nsIContentViewer::Destroy");
|
|
|
|
if (mDocument)
|
|
|
|
Destroy();
|
1999-05-06 23:25:40 +04:00
|
|
|
|
2001-03-10 06:19:36 +03:00
|
|
|
// clear weak references before we go away
|
2000-02-03 02:40:22 +03:00
|
|
|
if (mPresContext) {
|
|
|
|
mPresContext->SetContainer(nsnull);
|
|
|
|
mPresContext->SetLinkHandler(nsnull);
|
|
|
|
}
|
1999-05-06 23:25:40 +04: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.
|
|
|
|
*/
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::BindToDocument(nsISupports *aDoc, const char *aCommand)
|
|
|
|
{
|
|
|
|
NS_PRECONDITION(!mDocument, "Viewer is already bound to a document!");
|
|
|
|
|
|
|
|
#ifdef NOISY_VIEWER
|
2000-10-29 02:17:53 +04:00
|
|
|
printf("DocumentViewerImpl::BindToDocument\n");
|
1999-05-06 23:25:40 +04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
nsresult rv;
|
|
|
|
mDocument = do_QueryInterface(aDoc,&rv);
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
1999-11-14 13:12:21 +03:00
|
|
|
DocumentViewerImpl::SetContainer(nsISupports* aContainer)
|
1999-05-06 23:25:40 +04:00
|
|
|
{
|
|
|
|
mContainer = aContainer;
|
|
|
|
if (mPresContext) {
|
|
|
|
mPresContext->SetContainer(aContainer);
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
1999-11-14 13:12:21 +03:00
|
|
|
DocumentViewerImpl::GetContainer(nsISupports** aResult)
|
1999-05-06 23:25:40 +04:00
|
|
|
{
|
1999-11-14 13:12:21 +03:00
|
|
|
NS_ENSURE_ARG_POINTER(aResult);
|
|
|
|
|
|
|
|
*aResult = mContainer;
|
|
|
|
NS_IF_ADDREF(*aResult);
|
|
|
|
|
1999-11-13 10:36:28 +03:00
|
|
|
return NS_OK;
|
1999-05-06 23:25:40 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2000-03-11 04:24:59 +03:00
|
|
|
DocumentViewerImpl::Init(nsIWidget* aParentWidget,
|
1999-05-06 23:25:40 +04:00
|
|
|
nsIDeviceContext* aDeviceContext,
|
2000-03-11 04:24:59 +03:00
|
|
|
const nsRect& aBounds)
|
1999-05-06 23:25:40 +04:00
|
|
|
{
|
|
|
|
nsresult rv;
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_ENSURE_TRUE(mDocument, NS_ERROR_NULL_POINTER);
|
1999-05-06 23:25:40 +04:00
|
|
|
|
|
|
|
mDeviceContext = dont_QueryInterface(aDeviceContext);
|
|
|
|
|
|
|
|
PRBool makeCX = PR_FALSE;
|
|
|
|
if (!mPresContext) {
|
|
|
|
// Create presentation context
|
2000-05-05 03:16:42 +04:00
|
|
|
#if 1
|
2001-02-19 15:55:42 +03:00
|
|
|
mPresContext = do_CreateInstance(kGalleyContextCID,&rv);
|
2000-05-05 03:16:42 +04:00
|
|
|
#else // turn on print preview for debugging until print preview is fixed
|
|
|
|
rv = NS_NewPrintPreviewContext(getter_AddRefs(mPresContext));
|
|
|
|
#endif
|
2000-01-19 00:06:10 +03:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
1999-05-06 23:25:40 +04:00
|
|
|
|
2000-03-02 10:13:02 +03:00
|
|
|
mPresContext->Init(aDeviceContext);
|
1999-05-06 23:25:40 +04:00
|
|
|
makeCX = PR_TRUE;
|
|
|
|
}
|
|
|
|
|
1999-11-13 10:36:28 +03:00
|
|
|
nsCOMPtr<nsIInterfaceRequestor> requestor(do_QueryInterface(mContainer));
|
|
|
|
if (requestor) {
|
|
|
|
nsCOMPtr<nsILinkHandler> linkHandler;
|
|
|
|
requestor->GetInterface(NS_GET_IID(nsILinkHandler),
|
|
|
|
getter_AddRefs(linkHandler));
|
1999-05-06 23:25:40 +04:00
|
|
|
mPresContext->SetContainer(mContainer);
|
|
|
|
mPresContext->SetLinkHandler(linkHandler);
|
|
|
|
|
|
|
|
// Set script-context-owner in the document
|
1999-12-03 12:24:22 +03:00
|
|
|
nsCOMPtr<nsIScriptGlobalObjectOwner> owner;
|
|
|
|
requestor->GetInterface(NS_GET_IID(nsIScriptGlobalObjectOwner),
|
1999-11-13 10:36:28 +03:00
|
|
|
getter_AddRefs(owner));
|
1999-05-06 23:25:40 +04:00
|
|
|
if (nsnull != owner) {
|
1999-11-13 10:36:28 +03:00
|
|
|
nsCOMPtr<nsIScriptGlobalObject> global;
|
|
|
|
rv = owner->GetScriptGlobalObject(getter_AddRefs(global));
|
1999-05-06 23:25:40 +04:00
|
|
|
if (NS_SUCCEEDED(rv) && (nsnull != global)) {
|
1999-12-03 12:24:22 +03:00
|
|
|
mDocument->SetScriptGlobalObject(global);
|
1999-11-13 10:36:28 +03:00
|
|
|
nsCOMPtr<nsIDOMDocument> domdoc(do_QueryInterface(mDocument));
|
1999-05-06 23:25:40 +04:00
|
|
|
if (nsnull != domdoc) {
|
|
|
|
global->SetNewDocument(domdoc);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create the ViewManager and Root View...
|
2000-03-11 04:24:59 +03:00
|
|
|
rv = MakeWindow(aParentWidget, aBounds);
|
2000-01-19 00:06:10 +03:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
1999-05-06 23:25:40 +04:00
|
|
|
|
|
|
|
// Create the style set...
|
|
|
|
nsIStyleSet* styleSet;
|
|
|
|
rv = CreateStyleSet(mDocument, &styleSet);
|
2000-01-19 00:06:10 +03:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
1999-05-06 23:25:40 +04:00
|
|
|
// Now make the shell for the document
|
|
|
|
rv = mDocument->CreateShell(mPresContext, mViewManager, styleSet,
|
|
|
|
getter_AddRefs(mPresShell));
|
|
|
|
NS_RELEASE(styleSet);
|
2000-01-19 00:06:10 +03:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
2000-08-04 01:40:39 +04:00
|
|
|
mPresShell->BeginObservingDocument();
|
2000-02-11 04:21:50 +03:00
|
|
|
|
1999-05-06 23:25:40 +04:00
|
|
|
// Initialize our view manager
|
|
|
|
nsRect bounds;
|
|
|
|
mWindow->GetBounds(bounds);
|
|
|
|
nscoord width = bounds.width;
|
|
|
|
nscoord height = bounds.height;
|
|
|
|
float p2t;
|
|
|
|
mPresContext->GetPixelsToTwips(&p2t);
|
|
|
|
width = NSIntPixelsToTwips(width, p2t);
|
|
|
|
height = NSIntPixelsToTwips(height, p2t);
|
|
|
|
mViewManager->DisableRefresh();
|
|
|
|
mViewManager->SetWindowDimensions(width, height);
|
|
|
|
|
|
|
|
if (!makeCX) {
|
|
|
|
// Make shell an observer for next time
|
2000-02-11 04:21:50 +03:00
|
|
|
// XXX - we observe the docuement always, see above after preshell is created
|
|
|
|
// mPresShell->BeginObservingDocument();
|
1999-05-06 23:25:40 +04:00
|
|
|
|
1999-05-11 02:29:34 +04:00
|
|
|
//XXX I don't think this should be done *here*; and why paint nothing
|
|
|
|
//(which turns out to cause black flashes!)???
|
1999-05-06 23:25:40 +04:00
|
|
|
// Resize-reflow this time
|
|
|
|
mPresShell->InitialReflow(width, height);
|
|
|
|
|
|
|
|
// Now trigger a refresh
|
1999-05-07 23:26:23 +04:00
|
|
|
if (mEnableRendering) {
|
2000-02-09 18:48:01 +03:00
|
|
|
mViewManager->EnableRefresh(NS_VMREFRESH_IMMEDIATE);
|
1999-05-07 23:26:23 +04:00
|
|
|
}
|
1999-05-06 23:25:40 +04:00
|
|
|
}
|
2000-01-19 00:06:10 +03:00
|
|
|
|
|
|
|
// now register ourselves as a selection listener, so that we get called
|
|
|
|
// when the selection changes in the window
|
2000-02-16 04:39:30 +03:00
|
|
|
nsDocViwerSelectionListener *selectionListener;
|
|
|
|
NS_NEWXPCOM(selectionListener, nsDocViwerSelectionListener);
|
|
|
|
if (!selectionListener) return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
selectionListener->Init(this);
|
|
|
|
|
|
|
|
// this is the owning reference. The nsCOMPtr will take care of releasing
|
|
|
|
// our ref to the listener on destruction.
|
|
|
|
NS_ADDREF(selectionListener);
|
2000-09-14 15:45:01 +04:00
|
|
|
rv = selectionListener->QueryInterface(NS_GET_IID(nsISelectionListener), getter_AddRefs(mSelectionListener));
|
2000-02-16 04:39:30 +03:00
|
|
|
NS_RELEASE(selectionListener);
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
2000-09-14 15:45:01 +04:00
|
|
|
nsCOMPtr<nsISelection> selection;
|
2000-01-19 00:06:10 +03:00
|
|
|
rv = GetDocumentSelection(getter_AddRefs(selection));
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
2000-09-14 15:45:01 +04:00
|
|
|
nsCOMPtr<nsISelectionPrivate> selPrivate(do_QueryInterface(selection));
|
|
|
|
rv = selPrivate->AddSelectionListener(mSelectionListener);
|
2000-01-19 00:06:10 +03:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
2000-04-22 01:40:28 +04: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);
|
|
|
|
if (!focusListener) return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
focusListener->Init(this);
|
|
|
|
|
|
|
|
// this is the owning reference. The nsCOMPtr will take care of releasing
|
|
|
|
// our ref to the listener on destruction.
|
|
|
|
NS_ADDREF(focusListener);
|
|
|
|
rv = focusListener->QueryInterface(NS_GET_IID(nsIDOMFocusListener), getter_AddRefs(mFocusListener));
|
|
|
|
NS_RELEASE(focusListener);
|
|
|
|
if (NS_FAILED(rv))
|
|
|
|
return rv;
|
|
|
|
|
|
|
|
if(mDocument)
|
|
|
|
{
|
|
|
|
// get the DOM event receiver
|
|
|
|
nsCOMPtr<nsIDOMEventReceiver> erP;
|
|
|
|
rv = mDocument->QueryInterface(NS_GET_IID(nsIDOMEventReceiver), getter_AddRefs(erP));
|
|
|
|
if(NS_FAILED(rv) || !erP)
|
|
|
|
return rv?rv:NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
rv = erP->AddEventListenerByIID(mFocusListener, NS_GET_IID(nsIDOMFocusListener));
|
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to register focus listener");
|
|
|
|
}
|
1999-05-06 23:25:40 +04:00
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2000-09-06 13:11:38 +04: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 09:38:07 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::LoadComplete(nsresult aStatus)
|
|
|
|
{
|
2000-11-28 02:23:28 +03:00
|
|
|
nsresult rv = NS_OK;
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_ENSURE_TRUE(mDocument, NS_ERROR_NOT_AVAILABLE);
|
2000-09-06 13:11:38 +04:00
|
|
|
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> global;
|
|
|
|
|
|
|
|
// First, get the script global object from the document...
|
2001-03-10 06:19:36 +03:00
|
|
|
rv = mDocument->GetScriptGlobalObject(getter_AddRefs(global));
|
2000-09-06 13:11:38 +04:00
|
|
|
|
|
|
|
// Fail if no ScriptGlobalObject is available...
|
|
|
|
NS_ASSERTION(global, "nsIScriptGlobalObject not set for document!");
|
|
|
|
if (!global) return NS_ERROR_NULL_POINTER;
|
|
|
|
|
|
|
|
// Now, fire either an OnLoad or OnError event to the document...
|
|
|
|
if(NS_SUCCEEDED(aStatus)) {
|
|
|
|
nsEventStatus status = nsEventStatus_eIgnore;
|
|
|
|
nsEvent event;
|
|
|
|
|
|
|
|
event.eventStructType = NS_EVENT;
|
|
|
|
event.message = NS_PAGE_LOAD;
|
|
|
|
rv = global->HandleDOMEvent(mPresContext, &event, nsnull,
|
|
|
|
NS_EVENT_FLAG_INIT, &status);
|
|
|
|
} else {
|
|
|
|
// XXX: Should fire error event to the document...
|
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
2000-06-22 09:38:07 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2001-03-10 06:19:36 +03:00
|
|
|
DocumentViewerImpl::Destroy()
|
2000-06-22 09:38:07 +04:00
|
|
|
{
|
2001-03-10 06:19:36 +03: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.
|
|
|
|
|
|
|
|
nsresult rv;
|
|
|
|
|
|
|
|
if (mDocument) {
|
|
|
|
// Break global object circular reference on the document created
|
|
|
|
// in the DocViewer Init
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> globalObject;
|
|
|
|
mDocument->GetScriptGlobalObject(getter_AddRefs(globalObject));
|
|
|
|
if (globalObject) {
|
|
|
|
globalObject->SetNewDocument(nsnull);
|
|
|
|
}
|
|
|
|
// out of band cleanup of webshell
|
|
|
|
mDocument->SetScriptGlobalObject(nsnull);
|
|
|
|
if (mFocusListener) {
|
|
|
|
// get the DOM event receiver
|
|
|
|
nsCOMPtr<nsIDOMEventReceiver> erP;
|
|
|
|
rv = mDocument->QueryInterface(NS_GET_IID(nsIDOMEventReceiver), getter_AddRefs(erP));
|
|
|
|
if(NS_SUCCEEDED(rv) && erP)
|
|
|
|
erP->RemoveEventListenerByIID(mFocusListener, NS_GET_IID(nsIDOMFocusListener));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mDeviceContext)
|
|
|
|
mDeviceContext->FlushFontCache();
|
|
|
|
|
|
|
|
if (mPresShell) {
|
|
|
|
// Break circular reference (or something)
|
|
|
|
mPresShell->EndObservingDocument();
|
|
|
|
nsCOMPtr<nsISelection> selection;
|
|
|
|
rv = GetDocumentSelection(getter_AddRefs(selection));
|
|
|
|
nsCOMPtr<nsISelectionPrivate> selPrivate(do_QueryInterface(selection));
|
|
|
|
if (NS_SUCCEEDED(rv) && selPrivate && mSelectionListener)
|
|
|
|
selPrivate->RemoveSelectionListener(mSelectionListener);
|
|
|
|
}
|
|
|
|
|
|
|
|
mDocument = nsnull;
|
|
|
|
|
|
|
|
return NS_OK;
|
2000-06-22 09:38:07 +04:00
|
|
|
}
|
|
|
|
|
1999-05-06 23:25:40 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::Stop(void)
|
|
|
|
{
|
2001-03-10 06:19:36 +03: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 16:27:00 +03:00
|
|
|
if (mDocument) {
|
|
|
|
mDocument->StopDocumentLoad();
|
|
|
|
}
|
|
|
|
|
1999-05-06 23:25:40 +04:00
|
|
|
if (mPresContext) {
|
2000-09-21 05:20:00 +04:00
|
|
|
// stop everything but the chrome.
|
|
|
|
mPresContext->Stop(PR_FALSE);
|
1999-05-06 23:25:40 +04:00
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-06-22 09:38:07 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::GetDOMDocument(nsIDOMDocument **aResult)
|
|
|
|
{
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_ENSURE_TRUE(mDocument, NS_ERROR_NOT_AVAILABLE);
|
2000-06-22 09:38:07 +04:00
|
|
|
return CallQueryInterface(mDocument.get(), aResult);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::SetDOMDocument(nsIDOMDocument *aDocument)
|
|
|
|
{
|
2000-09-02 19:32:28 +04:00
|
|
|
// Assumptions:
|
|
|
|
//
|
|
|
|
// 1) this document viewer has been initialized with a call to Init().
|
|
|
|
// 2) the stylesheets associated with the document have been added to the document.
|
|
|
|
|
|
|
|
// 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.
|
|
|
|
// That work can happen when and if it is needed.
|
|
|
|
|
|
|
|
nsresult rv;
|
|
|
|
if (nsnull == aDocument)
|
|
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> newDoc = do_QueryInterface(aDocument, &rv);
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
// 0) Replace the old document with the new one
|
|
|
|
mDocument = newDoc;
|
|
|
|
|
|
|
|
// 1) Set the script global object on the new document
|
|
|
|
nsCOMPtr<nsIInterfaceRequestor> requestor(do_QueryInterface(mContainer));
|
|
|
|
if (requestor) {
|
|
|
|
nsCOMPtr<nsIScriptGlobalObjectOwner> owner;
|
|
|
|
requestor->GetInterface(NS_GET_IID(nsIScriptGlobalObjectOwner),
|
|
|
|
getter_AddRefs(owner));
|
|
|
|
if (nsnull != owner) {
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> global;
|
|
|
|
rv = owner->GetScriptGlobalObject(getter_AddRefs(global));
|
|
|
|
if (NS_SUCCEEDED(rv) && (nsnull != global)) {
|
|
|
|
mDocument->SetScriptGlobalObject(global);
|
|
|
|
global->SetNewDocument(aDocument);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 2) Create a new style set for the document
|
|
|
|
nsCOMPtr<nsIStyleSet> styleSet;
|
|
|
|
rv = CreateStyleSet(mDocument, getter_AddRefs(styleSet));
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
// 3) Replace the current pres shell with a new shell for the new document
|
|
|
|
mPresShell->EndObservingDocument();
|
|
|
|
|
|
|
|
mPresShell = nsnull;
|
|
|
|
rv = newDoc->CreateShell(mPresContext, mViewManager, styleSet,
|
|
|
|
getter_AddRefs(mPresShell));
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
mPresShell->BeginObservingDocument();
|
|
|
|
|
|
|
|
// 4) Register the focus listener on the new document
|
|
|
|
if(mDocument)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIDOMEventReceiver> erP;
|
|
|
|
rv = mDocument->QueryInterface(NS_GET_IID(nsIDOMEventReceiver), getter_AddRefs(erP));
|
|
|
|
if(NS_FAILED(rv) || !erP)
|
|
|
|
return rv ? rv : NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
rv = erP->AddEventListenerByIID(mFocusListener, NS_GET_IID(nsIDOMFocusListener));
|
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to register focus listener");
|
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
2000-06-22 09:38:07 +04:00
|
|
|
}
|
|
|
|
|
1999-05-06 23:25:40 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::SetUAStyleSheet(nsIStyleSheet* aUAStyleSheet)
|
|
|
|
{
|
|
|
|
mUAStyleSheet = dont_QueryInterface(aUAStyleSheet);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::GetDocument(nsIDocument*& aResult)
|
|
|
|
{
|
|
|
|
aResult = mDocument;
|
|
|
|
NS_IF_ADDREF(aResult);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::GetPresShell(nsIPresShell*& aResult)
|
|
|
|
{
|
|
|
|
aResult = mPresShell;
|
|
|
|
NS_IF_ADDREF(aResult);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::GetPresContext(nsIPresContext*& aResult)
|
|
|
|
{
|
|
|
|
aResult = mPresContext;
|
|
|
|
NS_IF_ADDREF(aResult);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::GetBounds(nsRect& aResult)
|
|
|
|
{
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_ENSURE_TRUE(mDocument, NS_ERROR_NOT_AVAILABLE);
|
1999-05-06 23:25:40 +04:00
|
|
|
NS_PRECONDITION(mWindow, "null window");
|
|
|
|
if (mWindow) {
|
|
|
|
mWindow->GetBounds(aResult);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
aResult.SetRect(0, 0, 0, 0);
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::SetBounds(const nsRect& aBounds)
|
|
|
|
{
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_ENSURE_TRUE(mDocument, NS_ERROR_NOT_AVAILABLE);
|
1999-05-06 23:25:40 +04:00
|
|
|
NS_PRECONDITION(mWindow, "null window");
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::Move(PRInt32 aX, PRInt32 aY)
|
|
|
|
{
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_ENSURE_TRUE(mDocument, NS_ERROR_NOT_AVAILABLE);
|
1999-05-06 23:25:40 +04:00
|
|
|
NS_PRECONDITION(mWindow, "null window");
|
|
|
|
if (mWindow) {
|
|
|
|
mWindow->Move(aX, aY);
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::Show(void)
|
|
|
|
{
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_ENSURE_TRUE(mDocument, NS_ERROR_NOT_AVAILABLE);
|
1999-05-06 23:25:40 +04:00
|
|
|
NS_PRECONDITION(mWindow, "null window");
|
|
|
|
if (mWindow) {
|
|
|
|
mWindow->Show(PR_TRUE);
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::Hide(void)
|
|
|
|
{
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_ENSURE_TRUE(mDocument, NS_ERROR_NOT_AVAILABLE);
|
1999-05-06 23:25:40 +04:00
|
|
|
NS_PRECONDITION(mWindow, "null window");
|
|
|
|
if (mWindow) {
|
|
|
|
mWindow->Show(PR_FALSE);
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-09-22 18:42:13 +04:00
|
|
|
nsresult
|
|
|
|
DocumentViewerImpl::FindFrameSetWithIID(nsIContent * aParentContent, const nsIID& aIID)
|
|
|
|
{
|
|
|
|
PRInt32 numChildren;
|
|
|
|
aParentContent->ChildCount(numChildren);
|
|
|
|
|
|
|
|
// do a breadth search across all siblings
|
|
|
|
PRInt32 inx;
|
|
|
|
for (inx=0;inx<numChildren;inx++) {
|
|
|
|
nsCOMPtr<nsIContent> child;
|
|
|
|
if (NS_SUCCEEDED(aParentContent->ChildAt(inx, *getter_AddRefs(child))) && child) {
|
|
|
|
nsCOMPtr<nsISupports> temp;
|
|
|
|
if (NS_SUCCEEDED(child->QueryInterface(aIID, (void**)getter_AddRefs(temp)))) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2001-01-27 17:09:34 +03:00
|
|
|
//---------------------------------------------------------------
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
//-- Debug helper routines
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
#if defined(DEBUG_rods) || defined(DEBUG_dcone)
|
|
|
|
|
|
|
|
/** ---------------------------------------------------
|
|
|
|
* Dumps Frames for Printing
|
|
|
|
*/
|
|
|
|
static void DumpFrames(FILE* out,
|
|
|
|
nsIPresContext* aPresContext,
|
|
|
|
nsIRenderingContext * aRendContext,
|
|
|
|
nsIFrame * aFrame,
|
|
|
|
PRInt32 aLevel)
|
|
|
|
{
|
|
|
|
nsIFrame * child;
|
|
|
|
aFrame->FirstChild(aPresContext, nsnull, &child);
|
|
|
|
while (child != nsnull) {
|
|
|
|
for (PRInt32 i=0;i<aLevel;i++) {
|
|
|
|
fprintf(out, " ");
|
|
|
|
}
|
|
|
|
nsAutoString tmp;
|
|
|
|
nsIFrameDebug* frameDebug;
|
|
|
|
|
|
|
|
if (NS_SUCCEEDED(child->QueryInterface(NS_GET_IID(nsIFrameDebug), (void**)&frameDebug))) {
|
|
|
|
frameDebug->GetFrameName(tmp);
|
|
|
|
}
|
|
|
|
fputs(tmp, out);
|
|
|
|
nsFrameState state;
|
|
|
|
child->GetFrameState(&state);
|
|
|
|
PRBool isSelected;
|
|
|
|
if (NS_SUCCEEDED(child->IsVisibleForPainting(aPresContext, *aRendContext, PR_TRUE, &isSelected))) {
|
|
|
|
fprintf(out, " %p %s", child, isSelected?"VIS":"UVS");
|
|
|
|
nsRect rect;
|
|
|
|
child->GetRect(rect);
|
|
|
|
fprintf(out, "[%d,%d,%d,%d] ", rect.x, rect.y, rect.width, rect.height);
|
|
|
|
nsIView * view;
|
|
|
|
child->GetView(aPresContext, &view);
|
|
|
|
fprintf(out, "v: %p ", view);
|
|
|
|
fprintf(out, "\n");
|
|
|
|
DumpFrames(out, aPresContext, aRendContext, child, aLevel+1);
|
|
|
|
child->GetNextSibling(&child);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/** ---------------------------------------------------
|
|
|
|
* Helper function needed for "DumpViews"
|
|
|
|
*/
|
|
|
|
static nsIPresShell*
|
|
|
|
GetPresShellFor(nsIDocShell* aDocShell)
|
|
|
|
{
|
|
|
|
nsIPresShell* shell = nsnull;
|
|
|
|
if (nsnull != aDocShell) {
|
|
|
|
nsIContentViewer* cv = nsnull;
|
|
|
|
aDocShell->GetContentViewer(&cv);
|
|
|
|
if (nsnull != cv) {
|
|
|
|
nsIDocumentViewer* docv = nsnull;
|
|
|
|
cv->QueryInterface(NS_GET_IID(nsIDocumentViewer), (void**) &docv);
|
|
|
|
if (nsnull != docv) {
|
|
|
|
nsIPresContext* cx;
|
|
|
|
docv->GetPresContext(cx);
|
|
|
|
if (nsnull != cx) {
|
|
|
|
cx->GetShell(&shell);
|
|
|
|
NS_RELEASE(cx);
|
|
|
|
}
|
|
|
|
NS_RELEASE(docv);
|
|
|
|
}
|
|
|
|
NS_RELEASE(cv);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return shell;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** ---------------------------------------------------
|
|
|
|
* Dumps the Views from the DocShell
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
DumpViews(nsIDocShell* aDocShell, FILE* out)
|
|
|
|
{
|
|
|
|
if (nsnull != aDocShell) {
|
|
|
|
fprintf(out, "docshell=%p \n", aDocShell);
|
|
|
|
nsIPresShell* shell = GetPresShellFor(aDocShell);
|
|
|
|
if (nsnull != shell) {
|
|
|
|
nsCOMPtr<nsIViewManager> vm;
|
|
|
|
shell->GetViewManager(getter_AddRefs(vm));
|
|
|
|
if (vm) {
|
|
|
|
nsIView* root;
|
|
|
|
vm->GetRootView(root);
|
|
|
|
if (nsnull != root) {
|
|
|
|
root->List(out);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
NS_RELEASE(shell);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
fputs("null pres shell\n", out);
|
|
|
|
}
|
|
|
|
|
|
|
|
// dump the views of the sub documents
|
|
|
|
PRInt32 i, n;
|
|
|
|
nsCOMPtr<nsIDocShellTreeNode> docShellAsNode(do_QueryInterface(aDocShell));
|
|
|
|
docShellAsNode->GetChildCount(&n);
|
|
|
|
for (i = 0; i < n; i++) {
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> child;
|
|
|
|
docShellAsNode->GetChildAt(i, getter_AddRefs(child));
|
|
|
|
nsCOMPtr<nsIDocShell> childAsShell(do_QueryInterface(child));
|
|
|
|
if (childAsShell) {
|
|
|
|
DumpViews(childAsShell, out);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/** ---------------------------------------------------
|
|
|
|
* Dumps the Views and Frames
|
|
|
|
*/
|
|
|
|
void DumpLayoutData(nsIPresContext* aPresContext,
|
|
|
|
nsIDeviceContext * aDC,
|
|
|
|
nsIFrame * aRootFrame,
|
|
|
|
nsIWebShell * aWebShell)
|
|
|
|
{
|
|
|
|
// Dump all the frames and view to a a file
|
|
|
|
FILE * fd = fopen("dump.txt", "w");
|
|
|
|
if (fd) {
|
|
|
|
fprintf(fd, "--------------- Frames ----------------\n");
|
|
|
|
nsCOMPtr<nsIRenderingContext> renderingContext;
|
|
|
|
aDC->CreateRenderingContext(*getter_AddRefs(renderingContext));
|
|
|
|
DumpFrames(fd, aPresContext, renderingContext, aRootFrame, 0);
|
|
|
|
fprintf(fd, "---------------------------------------\n\n");
|
|
|
|
fprintf(fd, "--------------- Views From Root Frame----------------\n");
|
|
|
|
nsIView * v;
|
|
|
|
aRootFrame->GetView(aPresContext, &v);
|
|
|
|
if (v) {
|
|
|
|
v->List(fd);
|
|
|
|
} else {
|
|
|
|
printf("View is null!\n");
|
|
|
|
}
|
|
|
|
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(aWebShell));
|
|
|
|
if (docShell) {
|
|
|
|
fprintf(fd, "--------------- All Views ----------------\n");
|
|
|
|
DumpViews(docShell, fd);
|
|
|
|
fprintf(fd, "---------------------------------------\n\n");
|
|
|
|
}
|
|
|
|
fclose(fd);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
//-- End of debug helper routines
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
|
|
|
|
/** ---------------------------------------------------
|
|
|
|
* Giving a child frame it searches "up" the tree until it
|
|
|
|
* finds a "Page" frame.
|
|
|
|
*/
|
|
|
|
static nsIFrame * GetPageFrame(nsIFrame * aFrame)
|
|
|
|
{
|
|
|
|
nsIFrame * frame = aFrame;
|
|
|
|
while (frame != nsnull) {
|
|
|
|
nsCOMPtr<nsIAtom> type;
|
|
|
|
frame->GetFrameType(getter_AddRefs(type));
|
|
|
|
if (type.get() == nsLayoutAtoms::pageFrame) {
|
|
|
|
return frame;
|
|
|
|
}
|
|
|
|
frame->GetParent(&frame);
|
|
|
|
}
|
|
|
|
return nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** ---------------------------------------------------
|
|
|
|
* Find by checking content's tag type
|
|
|
|
*/
|
|
|
|
static nsIFrame * FindFrameByType(nsIPresContext* aPresContext,
|
|
|
|
nsIFrame * aParentFrame,
|
|
|
|
nsIAtom * aType,
|
|
|
|
nsRect& aRect,
|
|
|
|
nsRect& aChildRect)
|
|
|
|
{
|
|
|
|
nsIFrame * child;
|
|
|
|
nsRect rect;
|
|
|
|
aParentFrame->GetRect(rect);
|
|
|
|
aRect.x += rect.x;
|
|
|
|
aRect.y += rect.y;
|
|
|
|
aParentFrame->FirstChild(aPresContext, nsnull, &child);
|
|
|
|
while (child != nsnull) {
|
|
|
|
nsCOMPtr<nsIContent> content;
|
|
|
|
child->GetContent(getter_AddRefs(content));
|
|
|
|
if (content) {
|
|
|
|
nsCOMPtr<nsIAtom> type;
|
|
|
|
content->GetTag(*getter_AddRefs(type));
|
|
|
|
if (type.get() == aType) {
|
|
|
|
nsRect r;
|
|
|
|
child->GetRect(r);
|
|
|
|
aChildRect.SetRect(aRect.x + r.x, aRect.y + r.y, r.width, r.height);
|
|
|
|
aRect.x -= rect.x;
|
|
|
|
aRect.y -= rect.y;
|
|
|
|
return child;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
nsIFrame * fndFrame = FindFrameByType(aPresContext, child, aType, aRect, aChildRect);
|
|
|
|
if (fndFrame != nsnull) {
|
|
|
|
return fndFrame;
|
|
|
|
}
|
|
|
|
child->GetNextSibling(&child);
|
|
|
|
}
|
|
|
|
aRect.x -= rect.x;
|
|
|
|
aRect.y -= rect.y;
|
|
|
|
return nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** ---------------------------------------------------
|
|
|
|
* Find by checking frames type
|
|
|
|
*/
|
|
|
|
static nsresult FindSelectionBounds(nsIPresContext* aPresContext,
|
|
|
|
nsIRenderingContext& aRC,
|
|
|
|
nsIFrame * aParentFrame,
|
|
|
|
nsRect& aRect,
|
|
|
|
nsIFrame *& aStartFrame,
|
|
|
|
nsRect& aStartRect,
|
|
|
|
nsIFrame *& aEndFrame,
|
|
|
|
nsRect& aEndRect)
|
|
|
|
{
|
|
|
|
nsIFrame * child;
|
|
|
|
aParentFrame->FirstChild(aPresContext, nsnull, &child);
|
|
|
|
nsRect rect;
|
|
|
|
aParentFrame->GetRect(rect);
|
|
|
|
aRect.x += rect.x;
|
|
|
|
aRect.y += rect.y;
|
|
|
|
while (child != nsnull) {
|
|
|
|
nsFrameState state;
|
|
|
|
child->GetFrameState(&state);
|
|
|
|
// only leaf frames have this bit flipped
|
|
|
|
// then check the hard way
|
|
|
|
PRBool isSelected = (state & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT;
|
|
|
|
if (isSelected) {
|
|
|
|
if (NS_FAILED(child->IsVisibleForPainting(aPresContext, aRC, PR_TRUE, &isSelected))) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isSelected) {
|
|
|
|
nsRect r;
|
|
|
|
child->GetRect(r);
|
|
|
|
if (aStartFrame == nsnull) {
|
|
|
|
aStartFrame = child;
|
|
|
|
aStartRect.SetRect(aRect.x + r.x, aRect.y + r.y, r.width, r.height);
|
|
|
|
} else {
|
|
|
|
child->GetRect(r);
|
|
|
|
aEndFrame = child;
|
|
|
|
aEndRect.SetRect(aRect.x + r.x, aRect.y + r.y, r.width, r.height);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
FindSelectionBounds(aPresContext, aRC, child, aRect, aStartFrame, aStartRect, aEndFrame, aEndRect);
|
|
|
|
child->GetNextSibling(&child);
|
|
|
|
}
|
|
|
|
aRect.x -= rect.x;
|
|
|
|
aRect.y -= rect.y;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** ---------------------------------------------------
|
|
|
|
* This method finds the starting and ending page numbers
|
|
|
|
* of the selection and also returns rect for each where
|
|
|
|
* the x,y of the rect is relative to the very top of the
|
|
|
|
* frame tree (absolutely positioned)
|
|
|
|
*/
|
|
|
|
static nsresult GetPageRangeForSelection(nsIPresShell * aPresShell,
|
|
|
|
nsIPresContext* aPresContext,
|
|
|
|
nsIRenderingContext& aRC,
|
|
|
|
nsISelection* aSelection,
|
|
|
|
nsIPageSequenceFrame* aPageSeqFrame,
|
|
|
|
nsIFrame** aStartFrame,
|
|
|
|
PRInt32& aStartPageNum,
|
|
|
|
nsRect& aStartRect,
|
|
|
|
nsIFrame** aEndFrame,
|
|
|
|
PRInt32& aEndPageNum,
|
|
|
|
nsRect& aEndRect)
|
|
|
|
{
|
|
|
|
nsIFrame * seqFrame;
|
|
|
|
if (NS_FAILED(aPageSeqFrame->QueryInterface(NS_GET_IID(nsIFrame), (void **)&seqFrame))) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIFrame * startFrame = nsnull;
|
|
|
|
nsIFrame * endFrame = nsnull;
|
|
|
|
nsRect rect;
|
|
|
|
seqFrame->GetRect(rect);
|
|
|
|
|
|
|
|
// start out with the sequence frame and search the entire frame tree
|
|
|
|
// capturing the the starting and ending child frames of the selection
|
|
|
|
// and their rects
|
|
|
|
FindSelectionBounds(aPresContext, aRC, seqFrame, rect, startFrame, aStartRect, endFrame, aEndRect);
|
|
|
|
|
|
|
|
#ifdef DEBUG_rods
|
|
|
|
printf("Start Frame: %p\n", startFrame);
|
|
|
|
printf("End Frame: %p\n", endFrame);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// initial the page numbers here
|
|
|
|
// in case we don't find and frames
|
|
|
|
aStartPageNum = -1;
|
|
|
|
aEndPageNum = -1;
|
|
|
|
|
|
|
|
nsIFrame * startPageFrame;
|
|
|
|
nsIFrame * endPageFrame;
|
|
|
|
|
|
|
|
// check to make sure we found a starting frame
|
|
|
|
if (startFrame != nsnull) {
|
|
|
|
// Now search up the tree to find what page the
|
|
|
|
// start/ending selections frames are on
|
|
|
|
//
|
|
|
|
// Check to see if start should be same as end if
|
|
|
|
// the end frame comes back null
|
|
|
|
if (endFrame == nsnull) {
|
|
|
|
// XXX the "GetPageFrame" step could be integrated into
|
|
|
|
// the FindSelectionBounds step, but walking up to find
|
|
|
|
// the parent of a child frame isn't expensive and it makes
|
|
|
|
// FindSelectionBounds a little easier to understand
|
|
|
|
startPageFrame = GetPageFrame(startFrame);
|
|
|
|
endPageFrame = startPageFrame;
|
|
|
|
aEndRect = aStartRect;
|
|
|
|
} else {
|
|
|
|
startPageFrame = GetPageFrame(startFrame);
|
|
|
|
endPageFrame = GetPageFrame(endFrame);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef DEBUG_rods
|
|
|
|
printf("Start Page: %p\n", startPageFrame);
|
|
|
|
printf("End Page: %p\n", endPageFrame);
|
|
|
|
|
|
|
|
// dump all the pages and their pointers
|
|
|
|
{
|
|
|
|
PRInt32 pageNum = 1;
|
|
|
|
nsIFrame * child;
|
|
|
|
seqFrame->FirstChild(aPresContext, nsnull, &child);
|
|
|
|
while (child != nsnull) {
|
|
|
|
printf("Page: %d - %p\n", pageNum, child);
|
|
|
|
pageNum++;
|
|
|
|
child->GetNextSibling(&child);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Now that we have the page frames
|
|
|
|
// find out what the page numbers are for each frame
|
|
|
|
PRInt32 pageNum = 1;
|
|
|
|
nsIFrame * page;
|
|
|
|
seqFrame->FirstChild(aPresContext, nsnull, &page);
|
|
|
|
while (page != nsnull) {
|
|
|
|
if (page == startPageFrame) {
|
|
|
|
aStartPageNum = pageNum;
|
|
|
|
}
|
|
|
|
if (page == endPageFrame) {
|
|
|
|
aEndPageNum = pageNum;
|
|
|
|
}
|
|
|
|
pageNum++;
|
|
|
|
page->GetNextSibling(&page);
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef DEBUG_rods
|
|
|
|
printf("Start Page No: %d\n", aStartPageNum);
|
|
|
|
printf("End Page No: %d\n", aEndPageNum);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
*aStartFrame = startPageFrame;
|
|
|
|
*aEndFrame = endPageFrame;
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------
|
2001-02-07 02:03:17 +03:00
|
|
|
PRBool
|
|
|
|
DocumentViewerImpl::DoesContainFrameSet(nsIWebShell * aParent)
|
1999-05-14 18:40:59 +04:00
|
|
|
{
|
2000-09-22 18:42:13 +04:00
|
|
|
// See if if the incoming doc is the root document
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> parentAsItem(do_QueryInterface(aParent));
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> parentsParentDoc;
|
|
|
|
parentAsItem->GetParent(getter_AddRefs(parentsParentDoc));
|
|
|
|
|
|
|
|
// When it is the top level document we need to check
|
|
|
|
// to see if it contains a frameset. If it does, then
|
|
|
|
// we only want to print the doc's children and not the document itself
|
|
|
|
// For anything else we always print all the children and the document
|
|
|
|
// for example, if the doc contains an IFRAME we eant to print the child
|
|
|
|
// document (the IFRAME) and then the rest of the document.
|
|
|
|
//
|
|
|
|
// XXX we really need to search the frame tree, and not the content
|
|
|
|
// but there is no way to distinguish between IFRAMEs and FRAMEs
|
|
|
|
// with the GetFrameType call.
|
|
|
|
// Bug 53459 has been files so we can eventually distinguish
|
|
|
|
// between IFRAME frames and FRAME frames
|
|
|
|
PRBool doesContainFrameSet = PR_FALSE;
|
|
|
|
// only check to see if there is a frameset if there is
|
|
|
|
// NO parent doc for this doc. meaning this parent is the root doc
|
2001-02-07 02:03:17 +03:00
|
|
|
//if (!parentsParentDoc) {
|
2000-09-22 18:42:13 +04:00
|
|
|
nsCOMPtr<nsIPresShell> shell;
|
|
|
|
mPresContext->GetShell(getter_AddRefs(shell));
|
|
|
|
if (shell) {
|
|
|
|
nsCOMPtr<nsIDocument> doc;
|
|
|
|
shell->GetDocument(getter_AddRefs(doc));
|
|
|
|
if (doc) {
|
2001-01-27 17:09:34 +03:00
|
|
|
nsCOMPtr<nsIContent> rootContent = getter_AddRefs(doc->GetRootContent());
|
2000-09-22 18:42:13 +04:00
|
|
|
if (rootContent) {
|
|
|
|
if (NS_SUCCEEDED(FindFrameSetWithIID(rootContent, NS_GET_IID(nsIDOMHTMLFrameSetElement)))) {
|
|
|
|
doesContainFrameSet = PR_TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2001-02-07 02:03:17 +03:00
|
|
|
//}
|
|
|
|
return doesContainFrameSet;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
PRUnichar*
|
|
|
|
DocumentViewerImpl::GetWebShellTitle(nsIWebShell * aWebShell)
|
|
|
|
{
|
|
|
|
NS_ASSERTION(aWebShell != nsnull, "Must have a valid webshell!");
|
|
|
|
|
|
|
|
PRUnichar * docTitleStr = nsnull;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(aWebShell));
|
|
|
|
if (docShell) {
|
|
|
|
nsCOMPtr<nsIPresShell> presShell;
|
|
|
|
docShell->GetPresShell(getter_AddRefs(presShell));
|
|
|
|
if (presShell) {
|
|
|
|
nsCOMPtr<nsIDocument> doc;
|
|
|
|
presShell->GetDocument(getter_AddRefs(doc));
|
|
|
|
if (doc) {
|
|
|
|
const nsString* docTitle = doc->GetDocumentTitle();
|
|
|
|
if (docTitle != nsnull) {
|
|
|
|
docTitleStr = docTitle->ToNewUnicode();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return docTitleStr;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
nsresult
|
|
|
|
DocumentViewerImpl::PrintContent(nsIWebShell * aParent,
|
|
|
|
nsIDeviceContext * aDContext,
|
|
|
|
nsIDOMWindow * aDOMWin,
|
|
|
|
PRBool aIsSubDoc)
|
|
|
|
{
|
|
|
|
|
|
|
|
NS_ENSURE_ARG_POINTER(aParent);
|
|
|
|
NS_ENSURE_ARG_POINTER(aDContext);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIStyleSet> ss;
|
|
|
|
nsCOMPtr<nsIViewManager> vm;
|
|
|
|
PRInt32 width, height;
|
|
|
|
nsresult rv;
|
|
|
|
PRInt32 i;
|
|
|
|
nsCOMPtr<nsIContentViewer> viewer;
|
|
|
|
nsCOMPtr<nsIDocShellTreeNode> parentAsNode(do_QueryInterface(aParent));
|
|
|
|
nsCOMPtr<nsIDOMWindowInternal> domWinIntl(do_QueryInterface(aDOMWin));
|
|
|
|
|
|
|
|
PRInt16 printFrameType = nsIPrintOptions::kSelectedFrame; // XXX later this default to kFramesAsIs
|
|
|
|
PRInt16 printHowEnable = nsIPrintOptions::kFrameEnableNone;
|
|
|
|
PRInt16 printRangeType = nsIPrintOptions::kRangeAllPages;
|
|
|
|
NS_WITH_SERVICE(nsIPrintOptions, printService, kPrintOptionsCID, &rv);
|
|
|
|
if (NS_SUCCEEDED(rv) && printService) {
|
|
|
|
printService->GetPrintFrameType(&printFrameType);
|
|
|
|
printService->GetHowToEnableFrameUI(&printHowEnable);
|
|
|
|
printService->GetPrintRange(&printRangeType);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
PRBool doesContainFrameSet;
|
|
|
|
PRBool isIFrameSelection = IsThereAnIFrameSelected(aParent, domWinIntl, doesContainFrameSet);
|
|
|
|
|
|
|
|
// the root webshell is responsible for
|
|
|
|
// starting and ending the printing
|
|
|
|
#if SPOOL_TO_ONE_DOC // this will fix all frames being painted to the same spooling document
|
|
|
|
// (this part needs to be added)
|
|
|
|
if (aIsSubDoc == nsnull) {
|
2001-02-16 20:36:02 +03:00
|
|
|
PRUnichar *docTitleStr = GetWebShellTitle(aparent);
|
|
|
|
NS_ENSURE_SUCCESS( aDContext->BeginDocument(docTitleStr), NS_ERROR_FAILURE );
|
|
|
|
if(docTitleStr) {
|
|
|
|
nsMemory::Free(docTitleStr);
|
|
|
|
}
|
2001-02-07 02:03:17 +03:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (printFrameType == nsIPrintOptions::kFramesAsIs) {
|
|
|
|
// print frameset "as is " here and return
|
|
|
|
return NS_OK;
|
2000-09-22 18:42:13 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
// print any child documents
|
|
|
|
// like frameset frames or iframes
|
2001-02-07 02:03:17 +03:00
|
|
|
PRInt32 childWebshellCount;
|
|
|
|
parentAsNode->GetChildCount(&childWebshellCount);
|
|
|
|
if(childWebshellCount > 0) {
|
|
|
|
for(i=0;i<childWebshellCount;i++) {
|
1999-12-18 05:09:29 +03:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> child;
|
|
|
|
parentAsNode->GetChildAt(i, getter_AddRefs(child));
|
|
|
|
nsCOMPtr<nsIDocShell> childAsShell(do_QueryInterface(child));
|
|
|
|
childAsShell->GetContentViewer(getter_AddRefs(viewer));
|
|
|
|
nsCOMPtr<nsIContentViewerFile> viewerFile(do_QueryInterface(viewer));
|
1999-11-19 10:35:27 +03:00
|
|
|
if (viewerFile) {
|
1999-12-18 05:09:29 +03:00
|
|
|
nsCOMPtr<nsIWebShell> childWebShell(do_QueryInterface(child));
|
2001-02-07 02:03:17 +03:00
|
|
|
NS_ENSURE_SUCCESS(viewerFile->PrintContent(childWebShell, aDContext, aDOMWin, PR_TRUE), NS_ERROR_FAILURE);
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
1999-05-14 18:40:59 +04:00
|
|
|
}
|
2001-02-07 02:03:17 +03:00
|
|
|
#if SPOOL_TO_ONE_DOC // this will fix all frames being painted to the same spooling document
|
|
|
|
// (this part needs to be added)
|
|
|
|
if (aIsSubDoc == nsnull) {
|
|
|
|
aDContext->EndDocument();
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
if (doesContainFrameSet || (!doesContainFrameSet && isIFrameSelection)) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2000-09-22 18:42:13 +04:00
|
|
|
}
|
2001-02-01 23:49:10 +03:00
|
|
|
|
2001-02-07 02:03:17 +03:00
|
|
|
//-----------------------------------------------------
|
|
|
|
// Now check to see if we can print this WebShell
|
|
|
|
//-----------------------------------------------------
|
|
|
|
|
|
|
|
// Check to see if printing frames is not on
|
|
|
|
// and that we are printing a range or all pages
|
|
|
|
PRBool printAllPages = (printRangeType == nsIPrintOptions::kRangeAllPages ||
|
|
|
|
printRangeType == nsIPrintOptions::kRangeSpecifiedPageRange) &&
|
|
|
|
printHowEnable == nsIPrintOptions::kFrameEnableNone;
|
|
|
|
|
|
|
|
// See if we are printing the selected frame
|
|
|
|
PRBool printEachFrame = printFrameType == nsIPrintOptions::kEachFrameSep;
|
|
|
|
|
|
|
|
// This is for when the current root WebShell is a Frameset
|
|
|
|
// and we need to see if the webshell being passed in
|
|
|
|
// is the currently selected frame of the frameset
|
|
|
|
//
|
|
|
|
// The aDOMWin is the currently selected DOM window,
|
|
|
|
// which could be a frameset frame or a IFrame
|
|
|
|
PRBool thisWebShellIsSelected = PR_FALSE;
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> scriptObj(do_QueryInterface(aDOMWin));
|
|
|
|
if (scriptObj) {
|
|
|
|
nsCOMPtr<nsIDocShell> docShell;
|
|
|
|
scriptObj->GetDocShell(getter_AddRefs(docShell));
|
|
|
|
if (docShell) {
|
|
|
|
nsCOMPtr<nsIWebShell> webShellForParent(do_QueryInterface(docShell));
|
|
|
|
if (webShellForParent.get() == aParent) {
|
|
|
|
thisWebShellIsSelected = PR_TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2001-02-01 23:49:10 +03:00
|
|
|
|
2001-02-07 02:03:17 +03:00
|
|
|
// Check to make we can print the currently selected frame of a frameset
|
|
|
|
PRBool printSelectedFrame = thisWebShellIsSelected &&
|
|
|
|
printFrameType == nsIPrintOptions::kSelectedFrame;
|
|
|
|
|
|
|
|
// Now see if we can print the selected IFrame
|
|
|
|
// When IFrames are selected all the frame UI is turned off
|
|
|
|
// and theuser prints it by selected the "Selection" radiobutton
|
|
|
|
// which turns on kRangeSelection
|
|
|
|
PRBool printSelectedIFrame = PR_FALSE;
|
|
|
|
if (printHowEnable == nsIPrintOptions::kFrameEnableNone &&
|
|
|
|
printRangeType == nsIPrintOptions::kRangeSelection &&
|
|
|
|
thisWebShellIsSelected) {
|
|
|
|
printSelectedIFrame = PR_TRUE;
|
|
|
|
// check to see if we have a range selection,
|
|
|
|
// as oppose to a insert selection
|
|
|
|
// this means if the user just clicked on the IFrame then
|
|
|
|
// there will not be a selection so we want the entire page to print
|
|
|
|
//
|
|
|
|
// XXX this is sort of a hack right here to make the page
|
|
|
|
// not try to reposition itself when printing selection
|
|
|
|
if (!IsThereASelection(domWinIntl)) {
|
|
|
|
printRangeType = nsIPrintOptions::kRangeAllPages;
|
|
|
|
printService->SetPrintRange(printRangeType);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
PRBool canPrintFrame = printAllPages || printEachFrame || printSelectedFrame || printSelectedIFrame;
|
2001-02-01 23:49:10 +03:00
|
|
|
|
2001-02-07 02:03:17 +03:00
|
|
|
if (!aIsSubDoc || (aIsSubDoc && canPrintFrame)) {
|
|
|
|
#ifndef SPOOL_TO_ONE_DOC // this will fix all frames being painted to the same spooling document
|
|
|
|
// (this part needs to be removed)
|
|
|
|
|
2001-02-16 20:36:02 +03:00
|
|
|
PRUnichar * docTitleStr = GetWebShellTitle(aParent);
|
|
|
|
NS_ENSURE_SUCCESS( aDContext->BeginDocument(docTitleStr), NS_ERROR_FAILURE );
|
2001-02-07 02:03:17 +03:00
|
|
|
if (docTitleStr != nsnull) {
|
|
|
|
nsMemory::Free(docTitleStr);
|
|
|
|
}
|
2001-02-16 20:36:02 +03:00
|
|
|
#endif
|
2001-02-07 02:03:17 +03:00
|
|
|
|
1999-05-14 18:40:59 +04:00
|
|
|
aDContext->GetDeviceSurfaceDimensions(width, height);
|
1999-05-07 23:26:23 +04:00
|
|
|
|
2001-01-27 17:09:34 +03:00
|
|
|
// XXX - Hack Alert
|
|
|
|
// OK, so ther eis a selection, we will print the entire selection
|
|
|
|
// on one page and then crop the page.
|
|
|
|
// This means you can never print any selection that is longer than one page
|
|
|
|
// put it keeps it from page breaking in the middle of your print of the selection
|
|
|
|
// (see also nsSimplePageSequence.cpp)
|
2001-02-07 02:03:17 +03:00
|
|
|
if (IsThereASelection(domWinIntl)) {
|
2001-01-27 17:09:34 +03:00
|
|
|
height = 0x0FFFFFFF;
|
|
|
|
}
|
|
|
|
|
1999-09-22 11:34:31 +04:00
|
|
|
nsCOMPtr<nsIPresContext> cx;
|
2001-02-19 15:55:42 +03:00
|
|
|
nsCOMPtr<nsIPrintContext> printcon(do_CreateInstance(kPrintContextCID,&rv));
|
1999-05-14 18:40:59 +04:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return rv;
|
2001-01-08 23:26:05 +03:00
|
|
|
} else {
|
|
|
|
rv = printcon->QueryInterface(NS_GET_IID(nsIPresContext), getter_AddRefs(cx));
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return rv;
|
|
|
|
}
|
1999-05-14 18:40:59 +04:00
|
|
|
}
|
1999-09-22 11:34:31 +04:00
|
|
|
|
2000-03-02 10:13:02 +03:00
|
|
|
cx->Init(aDContext);
|
1999-05-06 23:25:40 +04:00
|
|
|
|
1999-09-22 11:34:31 +04:00
|
|
|
CreateStyleSet(mDocument, getter_AddRefs(ss));
|
1999-05-06 23:25:40 +04:00
|
|
|
|
2001-02-19 15:55:42 +03:00
|
|
|
nsCOMPtr<nsIPresShell> ps(do_CreateInstance(kPresShellCID,&rv));
|
1999-05-14 18:40:59 +04:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return rv;
|
|
|
|
}
|
1999-05-06 23:25:40 +04:00
|
|
|
|
1999-09-22 11:34:31 +04:00
|
|
|
rv = nsComponentManager::CreateInstance(kViewManagerCID,
|
|
|
|
nsnull,
|
2000-01-19 00:06:10 +03:00
|
|
|
NS_GET_IID(nsIViewManager),
|
1999-09-22 11:34:31 +04:00
|
|
|
(void **)getter_AddRefs(vm));
|
1999-05-14 18:40:59 +04:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
rv = vm->Init(aDContext);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return rv;
|
|
|
|
}
|
1999-05-06 23:25:40 +04:00
|
|
|
|
1999-05-14 18:40:59 +04:00
|
|
|
nsRect tbounds = nsRect(0, 0, width, height);
|
1999-05-06 23:25:40 +04:00
|
|
|
|
1999-05-14 18:40:59 +04:00
|
|
|
// Create a child window of the parent that is our "root view/window"
|
2001-01-27 17:09:34 +03:00
|
|
|
nsIView* rootView;
|
|
|
|
rv = nsComponentManager::CreateInstance(kViewCID, nsnull, NS_GET_IID(nsIView), (void **)&rootView);
|
1999-05-14 18:40:59 +04:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return rv;
|
|
|
|
}
|
2001-01-27 17:09:34 +03:00
|
|
|
rv = rootView->Init(vm, tbounds, nsnull);
|
1999-05-14 18:40:59 +04:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return rv;
|
1999-05-06 23:25:40 +04:00
|
|
|
}
|
|
|
|
|
1999-05-14 18:40:59 +04:00
|
|
|
// Setup hierarchical relationship in view manager
|
2001-01-27 17:09:34 +03:00
|
|
|
vm->SetRootView(rootView);
|
1999-05-14 18:40:59 +04:00
|
|
|
|
|
|
|
ps->Init(mDocument, cx, vm, ss);
|
1999-05-12 17:32:09 +04:00
|
|
|
|
2000-06-08 03:04:45 +04:00
|
|
|
nsCompatibility mode;
|
|
|
|
mPresContext->GetCompatibilityMode(&mode);
|
|
|
|
cx->SetCompatibilityMode(mode);
|
|
|
|
cx->SetContainer(aParent);
|
|
|
|
|
2000-10-20 01:49:12 +04:00
|
|
|
|
|
|
|
// get the old history
|
|
|
|
nsCOMPtr<nsIPresShell> presShell;
|
|
|
|
nsCOMPtr<nsILayoutHistoryState> layoutState;
|
|
|
|
NS_ENSURE_SUCCESS(GetPresShell(*(getter_AddRefs(presShell))), NS_ERROR_FAILURE);
|
|
|
|
presShell->CaptureHistoryState(getter_AddRefs(layoutState),PR_TRUE);
|
|
|
|
|
2001-01-27 17:09:34 +03:00
|
|
|
|
2000-10-20 01:49:12 +04:00
|
|
|
ps->BeginObservingDocument();
|
1999-05-14 18:40:59 +04:00
|
|
|
//lay it out...
|
|
|
|
ps->InitialReflow(width, height);
|
|
|
|
|
2001-01-27 17:09:34 +03:00
|
|
|
// Transfer Selection Ranges to the new Print PresShell
|
|
|
|
nsCOMPtr<nsISelection> selection;
|
|
|
|
nsCOMPtr<nsISelection> selectionPS;
|
|
|
|
GetDocumentSelection(getter_AddRefs(selection));
|
|
|
|
if (selection) {
|
2001-02-07 02:03:17 +03:00
|
|
|
GetDocumentSelection(getter_AddRefs(selectionPS), ps);
|
2001-01-27 17:09:34 +03:00
|
|
|
if (selectionPS) {
|
|
|
|
PRInt32 cnt;
|
|
|
|
selection->GetRangeCount(&cnt);
|
|
|
|
PRInt32 inx;
|
|
|
|
for (inx=0;inx<cnt;inx++) {
|
|
|
|
nsCOMPtr<nsIDOMRange> range;
|
|
|
|
if (NS_SUCCEEDED(selection->GetRangeAt(inx, getter_AddRefs(range)))) {
|
|
|
|
selectionPS->AddRange(range);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-10-20 01:49:12 +04:00
|
|
|
// update the history from the old presentation shell
|
|
|
|
nsCOMPtr<nsIFrameManager> fm;
|
|
|
|
rv = ps->GetFrameManager(getter_AddRefs(fm));
|
|
|
|
if(NS_SUCCEEDED(rv) && fm) {
|
|
|
|
nsIFrame* root;
|
|
|
|
ps->GetRootFrame(&root);
|
|
|
|
fm->RestoreFrameState(cx, root, layoutState);
|
|
|
|
}
|
|
|
|
ps->EndObservingDocument();
|
|
|
|
|
1999-05-14 18:40:59 +04:00
|
|
|
// Ask the page sequence frame to print all the pages
|
|
|
|
nsIPageSequenceFrame* pageSequence;
|
|
|
|
|
2001-01-27 17:09:34 +03:00
|
|
|
//
|
1999-05-14 18:40:59 +04:00
|
|
|
ps->GetPageSequenceFrame(&pageSequence);
|
|
|
|
NS_ASSERTION(nsnull != pageSequence, "no page sequence frame");
|
2000-01-26 18:14:41 +03:00
|
|
|
|
|
|
|
|
|
|
|
if (nsnull != mFilePointer) {
|
|
|
|
// output the regression test
|
|
|
|
nsIFrameDebug* fdbg;
|
|
|
|
nsIFrame* root;
|
|
|
|
ps->GetRootFrame(&root);
|
|
|
|
|
|
|
|
if (NS_SUCCEEDED(root->QueryInterface(NS_GET_IID(nsIFrameDebug), (void**) &fdbg))) {
|
2000-12-07 18:31:40 +03:00
|
|
|
fdbg->DumpRegressionData(cx, mFilePointer, 0, PR_TRUE);
|
2000-01-26 18:14:41 +03:00
|
|
|
}
|
|
|
|
fclose(mFilePointer);
|
|
|
|
} else {
|
2001-01-27 17:09:34 +03:00
|
|
|
nsIFrame* rootFrame;
|
|
|
|
ps->GetRootFrame(&rootFrame);
|
|
|
|
|
|
|
|
#if defined(DEBUG_rods) || defined(DEBUG_dcone)
|
|
|
|
DumpLayoutData(cx, aDContext, rootFrame, aParent);
|
|
|
|
#endif
|
|
|
|
|
2001-02-07 02:03:17 +03:00
|
|
|
if (printService) {
|
2001-01-27 17:09:34 +03:00
|
|
|
// get the document title
|
|
|
|
const nsString* docTitle = mDocument->GetDocumentTitle();
|
2001-02-01 23:49:10 +03:00
|
|
|
if( docTitle != nsnull) {
|
|
|
|
PRUnichar * docStr = docTitle->ToNewUnicode();
|
|
|
|
printService->SetTitle(docStr);
|
|
|
|
nsMemory::Free(docStr);
|
|
|
|
}
|
2001-01-27 17:09:34 +03:00
|
|
|
|
|
|
|
// Get Document URL String
|
|
|
|
nsCOMPtr<nsIURI> url(getter_AddRefs(mDocument->GetDocumentURL()));
|
|
|
|
char * urlCStr;
|
|
|
|
url->GetSpec(&urlCStr);
|
|
|
|
nsAutoString urlStr;
|
|
|
|
urlStr.AssignWithConversion(urlCStr);
|
|
|
|
PRUnichar * urlUStr = urlStr.ToNewUnicode();
|
2001-02-02 11:42:53 +03:00
|
|
|
printService->SetDocURL(urlUStr);
|
2001-01-27 17:09:34 +03:00
|
|
|
nsMemory::Free(urlUStr);
|
|
|
|
nsMemory::Free(urlCStr);
|
|
|
|
|
2001-02-02 11:42:53 +03:00
|
|
|
if (nsIPrintOptions::kRangeSelection == printRangeType) {
|
2001-01-27 17:09:34 +03:00
|
|
|
cx->SetIsRenderingOnlySelection(PR_TRUE);
|
|
|
|
|
|
|
|
// temporarily creating rendering context
|
|
|
|
// which is needed to dinf the selection frames
|
|
|
|
nsCOMPtr<nsIRenderingContext> rc;
|
|
|
|
aDContext->CreateRenderingContext(*getter_AddRefs(rc));
|
|
|
|
|
|
|
|
// find the starting and ending page numbers
|
|
|
|
// via the selection
|
|
|
|
nsIFrame* startFrame;
|
|
|
|
nsIFrame* endFrame;
|
|
|
|
PRInt32 startPageNum;
|
|
|
|
PRInt32 endPageNum;
|
|
|
|
nsRect startRect;
|
|
|
|
nsRect endRect;
|
|
|
|
rv = GetPageRangeForSelection(ps, cx, *rc, selectionPS, pageSequence,
|
|
|
|
&startFrame, startPageNum, startRect,
|
|
|
|
&endFrame, endPageNum, endRect);
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2001-02-02 11:42:53 +03:00
|
|
|
printService->SetStartPageRange(startPageNum);
|
|
|
|
printService->SetEndPageRange(endPageNum);
|
2001-01-27 17:09:34 +03:00
|
|
|
if (startPageNum == endPageNum) {
|
|
|
|
nsIFrame * seqFrame;
|
|
|
|
if (NS_FAILED(pageSequence->QueryInterface(NS_GET_IID(nsIFrame), (void **)&seqFrame))) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
nsRect rect(0,0,0,0);
|
|
|
|
nsRect areaRect;
|
|
|
|
nsIFrame * areaFrame = FindFrameByType(cx, startFrame, nsHTMLAtoms::body, rect, areaRect);
|
|
|
|
if (areaFrame) {
|
|
|
|
areaRect.y = areaRect.y - startRect.y;
|
|
|
|
areaFrame->SetRect(cx, areaRect);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIFrame * seqFrame;
|
|
|
|
if (NS_FAILED(pageSequence->QueryInterface(NS_GET_IID(nsIFrame), (void **)&seqFrame))) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsRect srect;
|
|
|
|
seqFrame->GetRect(srect);
|
|
|
|
|
|
|
|
nsRect r;
|
|
|
|
rootView->GetBounds(r);
|
|
|
|
r.height = srect.height;
|
|
|
|
rootView->SetBounds(r);
|
|
|
|
|
|
|
|
rootFrame->GetRect(r);
|
|
|
|
r.height = srect.height;
|
|
|
|
rootFrame->SetRect(cx, r);
|
|
|
|
|
|
|
|
pageSequence->Print(cx, printService, nsnull);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
// not sure what to do here!
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2000-01-26 18:14:41 +03:00
|
|
|
}
|
2001-02-07 02:03:17 +03:00
|
|
|
#ifndef SPOOL_TO_ONE_DOC // this will fix all frames being painted to the same spooling document
|
|
|
|
// (this part needs to be removed)
|
1999-05-14 18:40:59 +04:00
|
|
|
aDContext->EndDocument();
|
2001-02-07 02:03:17 +03:00
|
|
|
#endif
|
1999-05-14 18:40:59 +04:00
|
|
|
ps->EndObservingDocument();
|
1999-09-22 11:34:31 +04:00
|
|
|
}
|
2001-02-07 02:03:17 +03:00
|
|
|
|
|
|
|
if (printSelectedIFrame) {
|
|
|
|
printService->SetPrintRange(nsIPrintOptions::kRangeSelection);
|
|
|
|
}
|
|
|
|
|
|
|
|
#if SPOOL_TO_ONE_DOC // this will fix all frames being painted to the same spooling document
|
|
|
|
// (this part needs to be added)
|
|
|
|
// Only root webshells/docs get to start and end
|
|
|
|
// the printing of the entire document
|
|
|
|
if (aIsSubDoc == nsnull) {
|
|
|
|
aDContext->EndDocument();
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
1999-05-12 17:32:09 +04:00
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
1999-09-22 11:34:31 +04:00
|
|
|
void DocumentViewerImpl::Notify(nsIImageGroup *aImageGroup,
|
|
|
|
nsImageGroupNotification aNotificationType)
|
1999-07-15 18:23:40 +04:00
|
|
|
{
|
1999-09-22 11:34:31 +04:00
|
|
|
//
|
|
|
|
// Image are being loaded... Set the flag to delay printing until
|
|
|
|
// all images are loaded.
|
|
|
|
//
|
|
|
|
if (aNotificationType == nsImageGroupNotification_kStartedLoading) {
|
|
|
|
mIsPrinting = PR_TRUE;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
// All the images have been loaded, so the document is ready to print.
|
|
|
|
//
|
|
|
|
// However, at this point we are unable to release the resources that
|
|
|
|
// were allocated for printing... This is because ImgLib resources will
|
|
|
|
// be deleted and *this* is an ImgLib notification routine. So, fire an
|
|
|
|
// event to do the actual printing.
|
|
|
|
//
|
|
|
|
else if(aNotificationType == nsImageGroupNotification_kFinishedLoading) {
|
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIEventQueue> eventQ;
|
|
|
|
|
|
|
|
// Get the event queue of the current thread...
|
|
|
|
NS_WITH_SERVICE(nsIEventQueueService, eventQService, kEventQueueService, &rv);
|
|
|
|
if (NS_FAILED(rv)) return;
|
|
|
|
|
1999-11-30 03:32:43 +03:00
|
|
|
rv = eventQService->GetThreadEventQueue(NS_CURRENT_THREAD,
|
1999-09-22 11:34:31 +04:00
|
|
|
getter_AddRefs(eventQ));
|
|
|
|
if (NS_FAILED(rv)) return;
|
|
|
|
|
|
|
|
PRStatus status;
|
|
|
|
PLEvent *event = new PLEvent;
|
|
|
|
|
|
|
|
if (!event) return;
|
1999-07-15 18:23:40 +04:00
|
|
|
|
1999-09-22 11:34:31 +04:00
|
|
|
//
|
|
|
|
// AddRef this because it is being placed in the PLEvent struct.
|
|
|
|
// It will be Released when DestroyPLEvent is called...
|
|
|
|
//
|
|
|
|
NS_ADDREF_THIS();
|
|
|
|
PL_InitEvent(event,
|
|
|
|
this,
|
|
|
|
(PLHandleEventProc) DocumentViewerImpl::HandlePLEvent,
|
|
|
|
(PLDestroyEventProc) DocumentViewerImpl::DestroyPLEvent);
|
1999-07-15 18:23:40 +04:00
|
|
|
|
1999-09-22 11:34:31 +04:00
|
|
|
status = eventQ->PostEvent(event);
|
|
|
|
}
|
1999-07-15 18:23:40 +04:00
|
|
|
}
|
|
|
|
|
1999-05-12 17:32:09 +04:00
|
|
|
|
1999-05-07 23:26:23 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::SetEnableRendering(PRBool aOn)
|
|
|
|
{
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_ENSURE_TRUE(mDocument, NS_ERROR_NOT_AVAILABLE);
|
1999-05-07 23:26:23 +04:00
|
|
|
mEnableRendering = aOn;
|
|
|
|
if (mViewManager) {
|
|
|
|
if (aOn) {
|
2000-02-09 18:48:01 +03:00
|
|
|
mViewManager->EnableRefresh(NS_VMREFRESH_IMMEDIATE);
|
1999-05-14 00:27:47 +04:00
|
|
|
nsIView* view;
|
|
|
|
mViewManager->GetRootView(view); // views are not refCounted
|
|
|
|
if (view) {
|
1999-11-14 05:51:25 +03:00
|
|
|
mViewManager->UpdateView(view, NS_VMREFRESH_IMMEDIATE);
|
1999-05-14 00:27:47 +04:00
|
|
|
}
|
1999-05-07 23:26:23 +04:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
mViewManager->DisableRefresh();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::GetEnableRendering(PRBool* aResult)
|
|
|
|
{
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_ENSURE_TRUE(mDocument, NS_ERROR_NOT_AVAILABLE);
|
1999-05-07 23:26:23 +04:00
|
|
|
NS_PRECONDITION(nsnull != aResult, "null OUT ptr");
|
|
|
|
if (aResult) {
|
|
|
|
*aResult = mEnableRendering;
|
|
|
|
}
|
1999-05-06 23:25:40 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
1999-05-07 23:26:23 +04:00
|
|
|
void
|
|
|
|
DocumentViewerImpl::ForceRefresh()
|
1999-05-06 23:25:40 +04:00
|
|
|
{
|
|
|
|
mWindow->Invalidate(PR_TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
|
|
|
|
nsIStyleSet** aStyleSet)
|
|
|
|
{
|
|
|
|
// this should eventually get expanded to allow for creating
|
|
|
|
// different sets for different media
|
|
|
|
nsresult rv;
|
|
|
|
|
|
|
|
if (!mUAStyleSheet) {
|
|
|
|
NS_WARNING("unable to load UA style sheet");
|
|
|
|
}
|
|
|
|
|
2001-02-19 15:55:42 +03:00
|
|
|
rv = nsComponentManager::CreateInstance(kStyleSetCID,nsnull,NS_GET_IID(nsIStyleSet),(void**)aStyleSet);
|
1999-05-06 23:25:40 +04:00
|
|
|
if (NS_OK == rv) {
|
|
|
|
PRInt32 index = aDocument->GetNumberOfStyleSheets();
|
|
|
|
|
|
|
|
while (0 < index--) {
|
1999-10-22 02:20:37 +04:00
|
|
|
nsCOMPtr<nsIStyleSheet> sheet(getter_AddRefs(aDocument->GetStyleSheetAt(index)));
|
|
|
|
|
|
|
|
/*
|
|
|
|
* GetStyleSheetAt will return all style sheets in the document but
|
|
|
|
* we're only interested in the ones that are enabled.
|
|
|
|
*/
|
|
|
|
|
|
|
|
PRBool styleEnabled;
|
|
|
|
sheet->GetEnabled(styleEnabled);
|
|
|
|
|
|
|
|
if (styleEnabled) {
|
|
|
|
(*aStyleSet)->AddDocStyleSheet(sheet, aDocument);
|
|
|
|
}
|
1999-05-06 23:25:40 +04:00
|
|
|
}
|
2000-04-29 03:32:51 +04:00
|
|
|
|
2000-09-14 03:57:52 +04:00
|
|
|
NS_WITH_SERVICE(nsIChromeRegistry, chromeRegistry, "@mozilla.org/chrome/chrome-registry;1", &rv);
|
2000-04-29 03:32:51 +04:00
|
|
|
if (NS_SUCCEEDED(rv) && chromeRegistry) {
|
|
|
|
nsCOMPtr<nsISupportsArray> sheets;
|
|
|
|
chromeRegistry->GetBackstopSheets(getter_AddRefs(sheets));
|
|
|
|
if(sheets){
|
|
|
|
nsCOMPtr<nsICSSStyleSheet> sheet;
|
|
|
|
PRUint32 count;
|
|
|
|
sheets->Count(&count);
|
|
|
|
for(PRUint32 i=0; i<count; i++) {
|
|
|
|
sheets->GetElementAt(i, getter_AddRefs(sheet));
|
|
|
|
(*aStyleSet)->AppendBackstopStyleSheet(sheet);
|
|
|
|
}
|
|
|
|
}
|
2000-08-29 12:07:22 +04:00
|
|
|
|
|
|
|
// Now handle the user sheets.
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShell(do_QueryInterface(mContainer));
|
|
|
|
PRInt32 shellType;
|
|
|
|
docShell->GetItemType(&shellType);
|
|
|
|
PRBool isChrome = (shellType == nsIDocShellTreeItem::typeChrome);
|
|
|
|
sheets = nsnull;
|
|
|
|
chromeRegistry->GetUserSheets(isChrome, getter_AddRefs(sheets));
|
|
|
|
if(sheets){
|
|
|
|
nsCOMPtr<nsICSSStyleSheet> sheet;
|
|
|
|
PRUint32 count;
|
|
|
|
sheets->Count(&count);
|
|
|
|
for(PRUint32 i=0; i<count; i++) {
|
|
|
|
sheets->GetElementAt(i, getter_AddRefs(sheet));
|
|
|
|
// XXX For now, append as backstop until we figure out something
|
|
|
|
// better to do.
|
|
|
|
(*aStyleSet)->AppendBackstopStyleSheet(sheet);
|
|
|
|
}
|
|
|
|
}
|
2000-04-29 03:32:51 +04:00
|
|
|
}
|
2000-05-01 11:58:07 +04:00
|
|
|
|
|
|
|
if (mUAStyleSheet) {
|
|
|
|
(*aStyleSet)->AppendBackstopStyleSheet(mUAStyleSheet);
|
|
|
|
}
|
1999-05-06 23:25:40 +04:00
|
|
|
}
|
2000-10-01 09:24:00 +04:00
|
|
|
return NS_OK;
|
1999-05-06 23:25:40 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2000-03-11 04:24:59 +03:00
|
|
|
DocumentViewerImpl::MakeWindow(nsIWidget* aParentWidget,
|
|
|
|
const nsRect& aBounds)
|
1999-05-06 23:25:40 +04:00
|
|
|
{
|
|
|
|
nsresult rv;
|
|
|
|
|
|
|
|
rv = nsComponentManager::CreateInstance(kViewManagerCID,
|
|
|
|
nsnull,
|
2000-01-19 00:06:10 +03:00
|
|
|
NS_GET_IID(nsIViewManager),
|
1999-05-06 23:25:40 +04:00
|
|
|
getter_AddRefs(mViewManager));
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDeviceContext> dx;
|
|
|
|
mPresContext->GetDeviceContext(getter_AddRefs(dx));
|
|
|
|
|
2000-03-24 02:50:42 +03:00
|
|
|
|
1999-05-06 23:25:40 +04:00
|
|
|
nsRect tbounds = aBounds;
|
|
|
|
float p2t;
|
|
|
|
mPresContext->GetPixelsToTwips(&p2t);
|
|
|
|
tbounds *= p2t;
|
|
|
|
|
2000-03-24 02:50:42 +03:00
|
|
|
// Initialize the view manager with an offset. This allows the viewmanager
|
|
|
|
// to manage a coordinate space offset from (0,0)
|
|
|
|
if ((NS_OK != rv) || (NS_OK != mViewManager->Init(dx, tbounds.x, tbounds.y))) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
// Reset the bounds offset so the root view is set to 0,0. The offset is
|
|
|
|
// specified in nsIViewManager::Init above.
|
|
|
|
// Besides, layout will reset the root view to (0,0) during reflow,
|
|
|
|
// so changing it to 0,0 eliminates placing
|
|
|
|
// the root view in the wrong place initially.
|
|
|
|
tbounds.x = 0;
|
|
|
|
tbounds.y = 0;
|
|
|
|
|
1999-05-06 23:25:40 +04:00
|
|
|
// Create a child window of the parent that is our "root view/window"
|
|
|
|
// Create a view
|
|
|
|
rv = nsComponentManager::CreateInstance(kViewCID,
|
|
|
|
nsnull,
|
2000-01-19 00:06:10 +03:00
|
|
|
NS_GET_IID(nsIView),
|
1999-05-06 23:25:40 +04:00
|
|
|
(void**)&mView);
|
|
|
|
if ((NS_OK != rv) || (NS_OK != mView->Init(mViewManager,
|
|
|
|
tbounds,
|
|
|
|
nsnull))) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2000-03-11 04:24:59 +03:00
|
|
|
rv = mView->CreateWidget(kWidgetCID, nsnull, aParentWidget->GetNativeData(NS_NATIVE_WIDGET));
|
1999-05-06 23:25:40 +04:00
|
|
|
|
|
|
|
if (rv != NS_OK)
|
|
|
|
return rv;
|
|
|
|
|
|
|
|
// Setup hierarchical relationship in view manager
|
|
|
|
mViewManager->SetRootView(mView);
|
|
|
|
|
|
|
|
mView->GetWidget(*getter_AddRefs(mWindow));
|
|
|
|
|
|
|
|
// 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)
|
1999-06-04 05:48:38 +04:00
|
|
|
// mWindow->SetFocus();
|
1999-05-06 23:25:40 +04:00
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2001-02-07 02:03:17 +03:00
|
|
|
nsresult DocumentViewerImpl::GetDocumentSelection(nsISelection **aSelection, nsIPresShell * aPresShell)
|
2000-01-19 00:06:10 +03:00
|
|
|
{
|
2001-02-07 02:03:17 +03:00
|
|
|
if (aPresShell == nsnull) {
|
|
|
|
if (!mPresShell) {
|
|
|
|
return NS_ERROR_NOT_INITIALIZED;
|
|
|
|
}
|
|
|
|
aPresShell = mPresShell;
|
|
|
|
}
|
2000-01-19 00:06:10 +03:00
|
|
|
if (!aSelection) return NS_ERROR_NULL_POINTER;
|
2001-01-27 17:09:34 +03:00
|
|
|
if (!aPresShell) return NS_ERROR_NULL_POINTER;
|
2001-02-07 02:03:17 +03:00
|
|
|
|
2000-04-27 11:37:12 +04:00
|
|
|
nsCOMPtr<nsISelectionController> selcon;
|
2001-01-27 17:09:34 +03:00
|
|
|
selcon = do_QueryInterface(aPresShell);
|
2000-04-27 11:37:12 +04:00
|
|
|
if (selcon)
|
|
|
|
return selcon->GetSelection(nsISelectionController::SELECTION_NORMAL, aSelection);
|
|
|
|
return NS_ERROR_FAILURE;
|
2000-01-19 00:06:10 +03:00
|
|
|
}
|
|
|
|
|
1999-05-06 23:25:40 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::CreateDocumentViewerUsing(nsIPresContext* aPresContext,
|
|
|
|
nsIDocumentViewer*& aResult)
|
|
|
|
{
|
|
|
|
if (!mDocument) {
|
|
|
|
// XXX better error
|
|
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
}
|
|
|
|
if (nsnull == aPresContext) {
|
|
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create new viewer
|
|
|
|
DocumentViewerImpl* viewer = new DocumentViewerImpl(aPresContext);
|
|
|
|
if (nsnull == viewer) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
|
|
|
NS_ADDREF(viewer);
|
|
|
|
|
|
|
|
// XXX make sure the ua style sheet is used (for now; need to be
|
|
|
|
// able to specify an alternate)
|
|
|
|
viewer->SetUAStyleSheet(mUAStyleSheet);
|
|
|
|
|
|
|
|
// Bind the new viewer to the old document
|
|
|
|
nsresult rv = viewer->BindToDocument(mDocument, "create");/* XXX verb? */
|
|
|
|
|
|
|
|
aResult = viewer;
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
1999-09-22 11:34:31 +04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void PR_CALLBACK DocumentViewerImpl::HandlePLEvent(PLEvent* aEvent)
|
|
|
|
{
|
|
|
|
DocumentViewerImpl *viewer;
|
|
|
|
|
|
|
|
viewer = (DocumentViewerImpl*)PL_GetEventOwner(aEvent);
|
|
|
|
|
|
|
|
NS_ASSERTION(viewer, "The event owner is null.");
|
|
|
|
if (viewer) {
|
|
|
|
viewer->DocumentReadyForPrinting();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PR_CALLBACK DocumentViewerImpl::DestroyPLEvent(PLEvent* aEvent)
|
|
|
|
{
|
|
|
|
DocumentViewerImpl *viewer;
|
|
|
|
|
|
|
|
viewer = (DocumentViewerImpl*)PL_GetEventOwner(aEvent);
|
|
|
|
NS_IF_RELEASE(viewer);
|
|
|
|
|
|
|
|
delete aEvent;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void DocumentViewerImpl::DocumentReadyForPrinting()
|
|
|
|
{
|
2001-02-01 23:49:10 +03:00
|
|
|
nsCOMPtr<nsIWebShell> webContainer;
|
1999-09-22 11:34:31 +04:00
|
|
|
|
1999-11-14 13:12:21 +03:00
|
|
|
webContainer = do_QueryInterface(mContainer);
|
1999-09-22 11:34:31 +04:00
|
|
|
if(webContainer) {
|
|
|
|
//
|
|
|
|
// Remove ourselves as an image group observer...
|
|
|
|
//
|
|
|
|
nsCOMPtr<nsIImageGroup> imageGroup;
|
|
|
|
mPrintPC->GetImageGroup(getter_AddRefs(imageGroup));
|
|
|
|
if (imageGroup) {
|
|
|
|
imageGroup->RemoveObserver(this);
|
|
|
|
}
|
2001-02-01 23:49:10 +03:00
|
|
|
|
2001-02-07 02:03:17 +03:00
|
|
|
// get the focused DOMWindow
|
|
|
|
nsCOMPtr<nsIDOMWindowInternal> curFocusDOMWin = getter_AddRefs(FindFocusedDOMWindowInternal());
|
|
|
|
nsCOMPtr<nsIDOMWindow> domWin(do_QueryInterface(curFocusDOMWin));
|
|
|
|
|
1999-09-22 11:34:31 +04:00
|
|
|
//
|
|
|
|
// Send the document to the printer...
|
|
|
|
//
|
2001-02-07 02:03:17 +03:00
|
|
|
|
|
|
|
|
|
|
|
nsresult rv = PrintContent(webContainer, mPrintDC, domWin, PR_FALSE);
|
1999-11-19 10:35:27 +03:00
|
|
|
NS_WARN_IF_FALSE(NS_SUCCEEDED(rv), "bad result from PrintConent");
|
1999-09-22 11:34:31 +04:00
|
|
|
|
|
|
|
// printing is complete, clean up now
|
|
|
|
mIsPrinting = PR_FALSE;
|
|
|
|
|
|
|
|
mPrintPS->EndObservingDocument();
|
2000-03-15 04:47:36 +03:00
|
|
|
|
|
|
|
if (mPrintListener)
|
|
|
|
mPrintListener->OnEndPrinting(NS_OK);
|
1999-09-22 11:34:31 +04:00
|
|
|
|
|
|
|
NS_RELEASE(mPrintPS);
|
|
|
|
NS_RELEASE(mPrintVM);
|
|
|
|
NS_RELEASE(mPrintSS);
|
|
|
|
NS_RELEASE(mPrintDC);
|
2001-02-14 08:45:05 +03:00
|
|
|
NS_RELEASE(mPrintPC);
|
1999-09-22 11:34:31 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-02 19:32:28 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::SetTransformMediator(nsITransformMediator* aMediator)
|
|
|
|
{
|
|
|
|
NS_ASSERTION(nsnull == mTransformMediator, "nsXMLDocument::SetTransformMediator(): \
|
|
|
|
Cannot set a second transform mediator\n");
|
|
|
|
mTransformMediator = aMediator;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-01-19 00:06:10 +03:00
|
|
|
#ifdef XP_MAC
|
|
|
|
#pragma mark -
|
|
|
|
#endif
|
|
|
|
|
1999-11-19 10:35:27 +03:00
|
|
|
/* ========================================================================================
|
2000-01-19 00:06:10 +03:00
|
|
|
* nsIContentViewerEdit
|
1999-11-19 10:35:27 +03:00
|
|
|
* ======================================================================================== */
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::Search()
|
|
|
|
{
|
|
|
|
NS_ASSERTION(0, "NOT IMPLEMENTED");
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::GetSearchable(PRBool *aSearchable)
|
|
|
|
{
|
|
|
|
NS_ASSERTION(0, "NOT IMPLEMENTED");
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::ClearSelection()
|
|
|
|
{
|
|
|
|
NS_ASSERTION(0, "NOT IMPLEMENTED");
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::SelectAll()
|
|
|
|
{
|
2000-01-19 00:06:10 +03:00
|
|
|
// 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.
|
2000-09-14 15:45:01 +04:00
|
|
|
nsCOMPtr<nsISelection> selection;
|
2000-01-19 00:06:10 +03:00
|
|
|
nsresult rv;
|
|
|
|
rv = GetDocumentSelection(getter_AddRefs(selection));
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMHTMLDocument> htmldoc = do_QueryInterface(mDocument);
|
|
|
|
nsCOMPtr<nsIDOMNode> bodyNode;
|
|
|
|
|
|
|
|
if (htmldoc)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIDOMHTMLElement>bodyElement;
|
|
|
|
rv = htmldoc->GetBody(getter_AddRefs(bodyElement));
|
|
|
|
if (NS_FAILED(rv) || !bodyElement) return rv;
|
|
|
|
|
|
|
|
bodyNode = do_QueryInterface(bodyElement);
|
|
|
|
}
|
|
|
|
else if (mDocument)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIContent> rootContent = getter_AddRefs(mDocument->GetRootContent());
|
|
|
|
bodyNode = do_QueryInterface(rootContent);
|
|
|
|
}
|
|
|
|
if (!bodyNode) return NS_ERROR_FAILURE;
|
|
|
|
|
2000-09-14 15:45:01 +04:00
|
|
|
rv = selection->RemoveAllRanges();
|
2000-01-19 00:06:10 +03:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
static NS_DEFINE_CID(kCDOMRangeCID, NS_RANGE_CID);
|
|
|
|
nsCOMPtr<nsIDOMRange> range;
|
|
|
|
rv = nsComponentManager::CreateInstance(kCDOMRangeCID, nsnull,
|
|
|
|
NS_GET_IID(nsIDOMRange),
|
|
|
|
getter_AddRefs(range));
|
|
|
|
|
|
|
|
rv = range->SelectNodeContents(bodyNode);
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
rv = selection->AddRange(range);
|
|
|
|
return rv;
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::CopySelection()
|
|
|
|
{
|
2000-01-19 00:06:10 +03:00
|
|
|
if (!mPresShell) return NS_ERROR_NOT_INITIALIZED;
|
|
|
|
return mPresShell->DoCopy();
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::GetCopyable(PRBool *aCopyable)
|
|
|
|
{
|
2000-09-14 15:45:01 +04:00
|
|
|
nsCOMPtr<nsISelection> selection;
|
2000-01-19 00:06:10 +03:00
|
|
|
nsresult rv;
|
|
|
|
rv = GetDocumentSelection(getter_AddRefs(selection));
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
PRBool isCollapsed;
|
|
|
|
selection->GetIsCollapsed(&isCollapsed);
|
|
|
|
|
2000-02-16 04:39:30 +03:00
|
|
|
*aCopyable = !isCollapsed;
|
2000-01-19 00:06:10 +03:00
|
|
|
return NS_OK;
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::CutSelection()
|
|
|
|
{
|
|
|
|
NS_ASSERTION(0, "NOT IMPLEMENTED");
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::GetCutable(PRBool *aCutable)
|
|
|
|
{
|
2000-01-19 00:06:10 +03:00
|
|
|
*aCutable = PR_FALSE; // mm, will this ever be called for an editable document?
|
|
|
|
return NS_OK;
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::Paste()
|
|
|
|
{
|
|
|
|
NS_ASSERTION(0, "NOT IMPLEMENTED");
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::GetPasteable(PRBool *aPasteable)
|
|
|
|
{
|
2000-01-19 00:06:10 +03:00
|
|
|
*aPasteable = PR_FALSE;
|
|
|
|
return NS_OK;
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
|
|
|
|
2000-01-19 00:06:10 +03:00
|
|
|
#ifdef XP_MAC
|
|
|
|
#pragma mark -
|
|
|
|
#endif
|
|
|
|
|
1999-11-19 10:35:27 +03:00
|
|
|
/* ========================================================================================
|
2000-01-19 00:06:10 +03:00
|
|
|
* nsIContentViewerFile
|
1999-11-19 10:35:27 +03:00
|
|
|
* ======================================================================================== */
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::Save()
|
|
|
|
{
|
|
|
|
NS_ASSERTION(0, "NOT IMPLEMENTED");
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::GetSaveable(PRBool *aSaveable)
|
|
|
|
{
|
|
|
|
NS_ASSERTION(0, "NOT IMPLEMENTED");
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
static NS_DEFINE_IID(kDeviceContextSpecFactoryCID, NS_DEVICE_CONTEXT_SPEC_FACTORY_CID);
|
|
|
|
|
2001-01-27 17:09:34 +03:00
|
|
|
nsresult DocumentViewerImpl::GetSelectionDocument(nsIDeviceContextSpec * aDevSpec, nsIDocument ** aNewDoc)
|
|
|
|
{
|
|
|
|
//NS_ENSURE_ARG_POINTER(*aDevSpec);
|
|
|
|
NS_ENSURE_ARG_POINTER(aNewDoc);
|
|
|
|
|
|
|
|
// create document
|
|
|
|
nsCOMPtr<nsIDocument> doc;
|
|
|
|
nsresult rv = NS_NewHTMLDocument(getter_AddRefs(doc));
|
|
|
|
if (NS_FAILED(rv)) { return rv; }
|
|
|
|
if (!doc) { return NS_ERROR_NULL_POINTER; }
|
|
|
|
|
|
|
|
nsCOMPtr<nsINodeInfoManager> nimgr;
|
|
|
|
rv = doc->GetNodeInfoManager(*getter_AddRefs(nimgr));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
nsCOMPtr<nsINodeInfo> nodeInfo;
|
|
|
|
nimgr->GetNodeInfo(nsHTMLAtoms::html, nsnull, kNameSpaceID_None,
|
|
|
|
*getter_AddRefs(nodeInfo));
|
|
|
|
|
|
|
|
// create document content
|
|
|
|
nsCOMPtr<nsIHTMLContent> htmlElement;
|
|
|
|
nsCOMPtr<nsIHTMLContent> headElement;
|
|
|
|
nsCOMPtr<nsIHTMLContent> bodyElement;
|
|
|
|
// create the root
|
|
|
|
rv = NS_NewHTMLHtmlElement(getter_AddRefs(htmlElement), nodeInfo);
|
|
|
|
if (NS_FAILED(rv)) { return rv; }
|
|
|
|
if (!htmlElement) { return NS_ERROR_NULL_POINTER; }
|
|
|
|
// create the head
|
|
|
|
|
|
|
|
nimgr->GetNodeInfo(NS_ConvertASCIItoUCS2("head"), nsnull,
|
|
|
|
kNameSpaceID_None, *getter_AddRefs(nodeInfo));
|
|
|
|
|
|
|
|
rv = NS_NewHTMLHeadElement(getter_AddRefs(headElement), nodeInfo);
|
|
|
|
if (NS_FAILED(rv)) { return rv; }
|
|
|
|
if (!headElement) { return NS_ERROR_NULL_POINTER; }
|
|
|
|
headElement->SetDocument(doc, PR_FALSE, PR_TRUE);
|
|
|
|
// create the body
|
|
|
|
|
|
|
|
nimgr->GetNodeInfo(nsHTMLAtoms::body, nsnull, kNameSpaceID_None,
|
|
|
|
*getter_AddRefs(nodeInfo));
|
|
|
|
|
|
|
|
rv = NS_NewHTMLBodyElement(getter_AddRefs(bodyElement), nodeInfo);
|
|
|
|
if (NS_FAILED(rv)) { return rv; }
|
|
|
|
if (!bodyElement) { return NS_ERROR_NULL_POINTER; }
|
|
|
|
bodyElement->SetDocument(doc, PR_FALSE, PR_TRUE);
|
|
|
|
// put the head and body into the root
|
|
|
|
rv = htmlElement->AppendChildTo(headElement, PR_FALSE);
|
|
|
|
if (NS_FAILED(rv)) { return rv; }
|
|
|
|
rv = htmlElement->AppendChildTo(bodyElement, PR_FALSE);
|
|
|
|
if (NS_FAILED(rv)) { return rv; }
|
|
|
|
|
|
|
|
// load the document into the docshell
|
|
|
|
nsCOMPtr<nsIDOMDocument> domDoc = do_QueryInterface(doc);
|
|
|
|
if (!domDoc) { return NS_ERROR_NULL_POINTER; }
|
|
|
|
nsCOMPtr<nsIDOMElement> htmlDOMElement = do_QueryInterface(htmlElement);
|
|
|
|
if (!htmlDOMElement) { return NS_ERROR_NULL_POINTER; }
|
|
|
|
|
|
|
|
//nsCOMPtr<nsIContent> rootContent(do_QueryInterface(htmlElement));
|
|
|
|
//doc->SetRootContent(rootContent);
|
|
|
|
|
|
|
|
*aNewDoc = doc.get();
|
|
|
|
NS_ADDREF(*aNewDoc);
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
PRBool
|
2001-02-07 02:03:17 +03:00
|
|
|
DocumentViewerImpl::IsThereAnIFrameSelected(nsIWebShell* aWebShell,
|
|
|
|
nsIDOMWindowInternal * aDOMWin,
|
|
|
|
PRBool& aDoesContainFrameset)
|
|
|
|
{
|
|
|
|
aDoesContainFrameset = DoesContainFrameSet(aWebShell);
|
|
|
|
PRBool iFrameIsSelected = PR_FALSE;
|
|
|
|
// First, check to see if we are a frameset
|
|
|
|
if (!aDoesContainFrameset) {
|
|
|
|
// Check to see if there is a currenlt focused frame
|
|
|
|
// if so, it means the selected frame is either the main webshell
|
|
|
|
// or an IFRAME
|
|
|
|
if (aDOMWin != nsnull) {
|
|
|
|
// Get the main webshell's DOMWin to see if it matches
|
|
|
|
// the frame that is selected
|
|
|
|
nsIDOMWindow* theDOMWindow = GetDOMWindowForThisDV();
|
|
|
|
if (aDOMWin != nsnull && theDOMWindow != aDOMWin) {
|
|
|
|
// we have a selected IFRAME
|
|
|
|
iFrameIsSelected = PR_TRUE;
|
|
|
|
}
|
|
|
|
NS_IF_RELEASE(theDOMWindow);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return iFrameIsSelected;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
PRBool
|
|
|
|
DocumentViewerImpl::IsThereASelection(nsIDOMWindowInternal * aDOMWin)
|
2001-01-27 17:09:34 +03:00
|
|
|
{
|
2001-02-07 02:03:17 +03:00
|
|
|
nsCOMPtr<nsIPresShell> presShell;
|
|
|
|
if (aDOMWin != nsnull) {
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> scriptObj(do_QueryInterface(aDOMWin));
|
|
|
|
nsCOMPtr<nsIDocShell> docShell;
|
|
|
|
scriptObj->GetDocShell(getter_AddRefs(docShell));
|
|
|
|
docShell->GetPresShell(getter_AddRefs(presShell));
|
|
|
|
}
|
|
|
|
|
2001-01-27 17:09:34 +03:00
|
|
|
// check here to see if there is a range selection
|
|
|
|
// so we know whether to turn on the "Selection" radio button
|
|
|
|
nsCOMPtr<nsISelection> selection;
|
2001-02-07 02:03:17 +03:00
|
|
|
GetDocumentSelection(getter_AddRefs(selection), presShell);
|
2001-01-27 17:09:34 +03:00
|
|
|
if (selection) {
|
|
|
|
PRInt32 count;
|
|
|
|
selection->GetRangeCount(&count);
|
|
|
|
if (count == 1) {
|
|
|
|
nsCOMPtr<nsIDOMRange> range;
|
|
|
|
if (NS_SUCCEEDED(selection->GetRangeAt(0, getter_AddRefs(range)))) {
|
|
|
|
// check to make sure it isn't an insertion selection
|
|
|
|
PRBool isCollapsed;
|
|
|
|
selection->GetIsCollapsed(&isCollapsed);
|
|
|
|
return !isCollapsed;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
1999-11-19 10:35:27 +03:00
|
|
|
|
|
|
|
/** ---------------------------------------------------
|
2000-01-26 18:14:41 +03:00
|
|
|
* See documentation above in the nsIContentViewerfile class definition
|
|
|
|
* @update 01/24/00 dwc
|
1999-11-19 10:35:27 +03:00
|
|
|
*/
|
|
|
|
NS_IMETHODIMP
|
2000-03-15 04:47:36 +03:00
|
|
|
DocumentViewerImpl::Print(PRBool aSilent,FILE *aFile, nsIPrintListener *aPrintListener)
|
1999-11-19 10:35:27 +03:00
|
|
|
{
|
2001-01-27 17:09:34 +03:00
|
|
|
nsCOMPtr<nsIWebShell> webContainer;
|
|
|
|
nsCOMPtr<nsIDeviceContextSpecFactory> factory;
|
|
|
|
PRInt32 width,height;
|
|
|
|
|
2001-02-07 02:03:17 +03:00
|
|
|
nsCOMPtr<nsIDOMWindowInternal> curFocusDOMWin = getter_AddRefs(FindFocusedDOMWindowInternal());
|
|
|
|
|
|
|
|
// Get the webshell for this documentviewer
|
|
|
|
webContainer = do_QueryInterface(mContainer);
|
|
|
|
|
|
|
|
// first check to see if there is a "regular" selection
|
|
|
|
PRBool isSelection = IsThereASelection(curFocusDOMWin);
|
|
|
|
|
|
|
|
// Get whether the doc contains a frameset
|
|
|
|
// Also, check to see if the currently focus webshell
|
|
|
|
// is a child of this webshell
|
|
|
|
PRBool doesContainFrameSet;
|
|
|
|
PRBool isIFrameSelection = IsThereAnIFrameSelected(webContainer, curFocusDOMWin, doesContainFrameSet);
|
|
|
|
|
|
|
|
// Setup print options for UI
|
2001-01-27 17:09:34 +03:00
|
|
|
nsresult rv = NS_ERROR_FAILURE;
|
|
|
|
NS_WITH_SERVICE(nsIPrintOptions, printService, kPrintOptionsCID, &rv);
|
|
|
|
if (NS_SUCCEEDED(rv) && printService) {
|
2001-02-07 02:03:17 +03:00
|
|
|
if (doesContainFrameSet) {
|
|
|
|
if (curFocusDOMWin) {
|
|
|
|
printService->SetHowToEnableFrameUI(nsIPrintOptions::kFrameEnableAll);
|
|
|
|
} else {
|
|
|
|
printService->SetHowToEnableFrameUI(nsIPrintOptions::kFrameEnableAsIsAndEach);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
printService->SetHowToEnableFrameUI(nsIPrintOptions::kFrameEnableNone);
|
|
|
|
}
|
|
|
|
// Now determine how to set up the Frame print UI
|
|
|
|
printService->SetPrintOptions(nsIPrintOptions::kPrintOptionsEnableSelectionRB, isSelection || isIFrameSelection);
|
2001-01-27 17:09:34 +03:00
|
|
|
}
|
1999-11-19 10:35:27 +03:00
|
|
|
|
|
|
|
nsComponentManager::CreateInstance(kDeviceContextSpecFactoryCID,
|
|
|
|
nsnull,
|
2001-01-04 23:44:42 +03:00
|
|
|
NS_GET_IID(nsIDeviceContextSpecFactory),
|
1999-11-19 10:35:27 +03:00
|
|
|
(void **)getter_AddRefs(factory));
|
|
|
|
|
|
|
|
if (factory) {
|
|
|
|
|
|
|
|
#ifdef DEBUG_dcone
|
2000-10-29 02:17:53 +04:00
|
|
|
printf("PRINT JOB STARTING\n");
|
1999-11-19 10:35:27 +03:00
|
|
|
#endif
|
|
|
|
|
|
|
|
nsIDeviceContextSpec *devspec = nsnull;
|
|
|
|
nsCOMPtr<nsIDeviceContext> dx;
|
|
|
|
mPrintDC = nsnull;
|
2000-01-26 18:14:41 +03:00
|
|
|
mFilePointer = aFile;
|
1999-11-19 10:35:27 +03:00
|
|
|
|
2001-02-02 11:42:53 +03:00
|
|
|
factory->CreateDeviceContextSpec(mWindow, devspec, aSilent);
|
1999-11-19 10:35:27 +03:00
|
|
|
if (nsnull != devspec) {
|
|
|
|
mPresContext->GetDeviceContext(getter_AddRefs(dx));
|
2001-01-27 17:09:34 +03:00
|
|
|
rv = dx->GetDeviceContextFor(devspec, mPrintDC);
|
1999-11-19 10:35:27 +03:00
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
|
|
|
|
NS_RELEASE(devspec);
|
|
|
|
|
|
|
|
if(webContainer) {
|
|
|
|
// load the document and do the initial reflow on the entire document
|
2001-02-19 15:55:42 +03:00
|
|
|
nsCOMPtr<nsIPrintContext> printcon(do_CreateInstance(kPrintContextCID,&rv));
|
2001-01-08 23:26:05 +03:00
|
|
|
if (NS_FAILED(rv)) {
|
1999-11-19 10:35:27 +03:00
|
|
|
return rv;
|
2001-01-08 23:26:05 +03:00
|
|
|
} else {
|
|
|
|
rv = printcon->QueryInterface(NS_GET_IID(nsIPresContext), (void**)&mPrintPC);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return rv;
|
|
|
|
}
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
2001-01-08 23:26:05 +03:00
|
|
|
|
1999-11-19 10:35:27 +03:00
|
|
|
|
|
|
|
mPrintDC->GetDeviceSurfaceDimensions(width,height);
|
2001-01-27 17:09:34 +03:00
|
|
|
// XXX - Hack Alert
|
|
|
|
// OK, so ther eis a selection, we will print the entire selection
|
|
|
|
// on one page and then crop the page.
|
|
|
|
// This means you can never print any selection that is longer than one page
|
|
|
|
// put it keeps it from page breaking in the middle of your print of the selection
|
2001-02-07 02:03:17 +03:00
|
|
|
if (isSelection) {
|
2001-01-27 17:09:34 +03:00
|
|
|
height = 0x0FFFFFFF;
|
|
|
|
}
|
|
|
|
|
2000-03-02 10:13:02 +03:00
|
|
|
mPrintPC->Init(mPrintDC);
|
2000-01-12 01:32:23 +03:00
|
|
|
mPrintPC->SetContainer(webContainer);
|
2001-02-07 02:03:17 +03:00
|
|
|
CreateStyleSet(mDocument,&mPrintSS);
|
1999-11-19 10:35:27 +03:00
|
|
|
|
2001-02-19 15:55:42 +03:00
|
|
|
rv = nsComponentManager::CreateInstance(kPresShellCID, nsnull, NS_GET_IID(nsIPresShell),(void**)&mPrintPS);
|
1999-11-19 10:35:27 +03:00
|
|
|
if(NS_FAILED(rv)){
|
|
|
|
return rv;
|
|
|
|
}
|
2001-01-27 17:09:34 +03:00
|
|
|
|
2000-01-19 00:06:10 +03:00
|
|
|
rv = nsComponentManager::CreateInstance(kViewManagerCID, nsnull, NS_GET_IID(nsIViewManager),(void**)&mPrintVM);
|
1999-11-19 10:35:27 +03:00
|
|
|
if(NS_FAILED(rv)) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
rv = mPrintVM->Init(mPrintDC);
|
|
|
|
if(NS_FAILED(rv)) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2000-01-19 00:06:10 +03:00
|
|
|
rv = nsComponentManager::CreateInstance(kViewCID, nsnull, NS_GET_IID(nsIView),(void**)&mPrintView);
|
1999-11-19 10:35:27 +03:00
|
|
|
if(NS_FAILED(rv)) {
|
|
|
|
return rv;
|
|
|
|
}
|
2001-01-27 17:09:34 +03:00
|
|
|
|
1999-11-19 10:35:27 +03:00
|
|
|
nsRect tbounds = nsRect(0,0,width,height);
|
|
|
|
rv = mPrintView->Init(mPrintVM,tbounds,nsnull);
|
|
|
|
if(NS_FAILED(rv)) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
// setup hierarchical relationship in view manager
|
|
|
|
mPrintVM->SetRootView(mPrintView);
|
2001-02-07 02:03:17 +03:00
|
|
|
mPrintPS->Init(mDocument,mPrintPC,mPrintVM,mPrintSS);
|
1999-11-19 10:35:27 +03:00
|
|
|
|
|
|
|
nsCOMPtr<nsIImageGroup> imageGroup;
|
|
|
|
mPrintPC->GetImageGroup(getter_AddRefs(imageGroup));
|
|
|
|
if (imageGroup) {
|
|
|
|
imageGroup->AddObserver(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
mPrintPS->InitialReflow(width,height);
|
|
|
|
|
|
|
|
#ifdef DEBUG_dcone
|
|
|
|
float a1,a2;
|
|
|
|
PRInt32 i1,i2;
|
|
|
|
|
2000-10-29 02:17:53 +04:00
|
|
|
printf("CRITICAL PRINTING INFORMATION\n");
|
|
|
|
printf("PRESSHELL(%x) PRESCONTEXT(%x)\nVIEWMANAGER(%x) VIEW(%x)\n",
|
|
|
|
mPrintPS, mPrintPC,mPrintDC,mPrintVM,mPrintView);
|
1999-11-19 10:35:27 +03:00
|
|
|
|
|
|
|
// DEVICE CONTEXT INFORMATION from PresContext
|
2000-10-29 02:17:53 +04:00
|
|
|
printf("DeviceContext of Presentation Context(%x)\n",dx);
|
1999-11-19 10:35:27 +03:00
|
|
|
dx->GetDevUnitsToTwips(a1);
|
|
|
|
dx->GetTwipsToDevUnits(a2);
|
2000-10-29 02:17:53 +04:00
|
|
|
printf(" DevToTwips = %f TwipToDev = %f\n",a1,a2);
|
1999-11-19 10:35:27 +03:00
|
|
|
dx->GetAppUnitsToDevUnits(a1);
|
|
|
|
dx->GetDevUnitsToAppUnits(a2);
|
2000-10-29 02:17:53 +04:00
|
|
|
printf(" AppUnitsToDev = %f DevUnitsToApp = %f\n",a1,a2);
|
1999-11-19 10:35:27 +03:00
|
|
|
dx->GetCanonicalPixelScale(a1);
|
2000-10-29 02:17:53 +04:00
|
|
|
printf(" GetCanonicalPixelScale = %f\n",a1);
|
1999-11-19 10:35:27 +03:00
|
|
|
dx->GetScrollBarDimensions(a1, a2);
|
2000-10-29 02:17:53 +04:00
|
|
|
printf(" ScrollBar x = %f y = %f\n",a1,a2);
|
1999-11-19 10:35:27 +03:00
|
|
|
dx->GetZoom(a1);
|
2000-10-29 02:17:53 +04:00
|
|
|
printf(" Zoom = %f\n",a1);
|
1999-11-19 10:35:27 +03:00
|
|
|
dx->GetDepth((PRUint32&)i1);
|
2000-10-29 02:17:53 +04:00
|
|
|
printf(" Depth = %d\n",i1);
|
1999-11-19 10:35:27 +03:00
|
|
|
dx->GetDeviceSurfaceDimensions(i1,i2);
|
2000-10-29 02:17:53 +04:00
|
|
|
printf(" DeviceDimension w = %d h = %d\n",i1,i2);
|
1999-11-19 10:35:27 +03:00
|
|
|
|
|
|
|
|
|
|
|
// DEVICE CONTEXT INFORMATION
|
2000-10-29 02:17:53 +04:00
|
|
|
printf("DeviceContext created for print(%x)\n",mPrintDC);
|
1999-11-19 10:35:27 +03:00
|
|
|
mPrintDC->GetDevUnitsToTwips(a1);
|
|
|
|
mPrintDC->GetTwipsToDevUnits(a2);
|
2000-10-29 02:17:53 +04:00
|
|
|
printf(" DevToTwips = %f TwipToDev = %f\n",a1,a2);
|
1999-11-19 10:35:27 +03:00
|
|
|
mPrintDC->GetAppUnitsToDevUnits(a1);
|
|
|
|
mPrintDC->GetDevUnitsToAppUnits(a2);
|
2000-10-29 02:17:53 +04:00
|
|
|
printf(" AppUnitsToDev = %f DevUnitsToApp = %f\n",a1,a2);
|
1999-11-19 10:35:27 +03:00
|
|
|
mPrintDC->GetCanonicalPixelScale(a1);
|
2000-10-29 02:17:53 +04:00
|
|
|
printf(" GetCanonicalPixelScale = %f\n",a1);
|
1999-11-19 10:35:27 +03:00
|
|
|
mPrintDC->GetScrollBarDimensions(a1, a2);
|
2000-10-29 02:17:53 +04:00
|
|
|
printf(" ScrollBar x = %f y = %f\n",a1,a2);
|
1999-11-19 10:35:27 +03:00
|
|
|
mPrintDC->GetZoom(a1);
|
2000-10-29 02:17:53 +04:00
|
|
|
printf(" Zoom = %f\n",a1);
|
1999-11-19 10:35:27 +03:00
|
|
|
mPrintDC->GetDepth((PRUint32&)i1);
|
2000-10-29 02:17:53 +04:00
|
|
|
printf(" Depth = %d\n",i1);
|
1999-11-19 10:35:27 +03:00
|
|
|
mPrintDC->GetDeviceSurfaceDimensions(i1,i2);
|
2000-10-29 02:17:53 +04:00
|
|
|
printf(" DeviceDimension w = %d h = %d\n",i1,i2);
|
1999-11-19 10:35:27 +03:00
|
|
|
|
|
|
|
#endif
|
2000-03-15 04:47:36 +03:00
|
|
|
// Print listener setup...
|
|
|
|
if (aPrintListener)
|
|
|
|
{
|
|
|
|
mPrintListener = aPrintListener;
|
|
|
|
mPrintListener->OnStartPrinting();
|
|
|
|
/* RICHIE mPrintListener->OnProgressPrinting(PRUint32 aProgress, PRUint32 aProgressMax); */
|
|
|
|
}
|
|
|
|
|
1999-11-19 10:35:27 +03:00
|
|
|
//
|
|
|
|
// The mIsPrinting flag is set when the ImageGroup observer is
|
|
|
|
// notified that images must be loaded as a result of the
|
|
|
|
// InitialReflow...
|
|
|
|
//
|
|
|
|
if(!mIsPrinting){
|
|
|
|
DocumentReadyForPrinting();
|
|
|
|
#ifdef DEBUG_dcone
|
2000-10-29 02:17:53 +04:00
|
|
|
printf("PRINT JOB ENDING, OBSERVER WAS NOT CALLED\n");
|
1999-11-19 10:35:27 +03:00
|
|
|
#endif
|
|
|
|
} else {
|
|
|
|
// use the observer mechanism to finish the printing
|
|
|
|
#ifdef DEBUG_dcone
|
2000-10-29 02:17:53 +04:00
|
|
|
printf("PRINTING OBSERVER STARTED\n");
|
1999-11-19 10:35:27 +03:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
2000-03-15 04:47:36 +03:00
|
|
|
}
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
2000-08-30 06:04:02 +04:00
|
|
|
else
|
|
|
|
{
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2001-02-07 02:03:17 +03:00
|
|
|
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
2001-02-07 02:03:17 +03:00
|
|
|
|
1999-11-19 10:35:27 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DocumentViewerImpl::GetPrintable(PRBool *aPrintable)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aPrintable);
|
|
|
|
|
|
|
|
*aPrintable = PR_TRUE;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-01-19 00:06:10 +03:00
|
|
|
#ifdef XP_MAC
|
|
|
|
#pragma mark -
|
|
|
|
#endif
|
1999-11-19 10:35:27 +03:00
|
|
|
|
|
|
|
//*****************************************************************************
|
|
|
|
// nsIMarkupDocumentViewer
|
|
|
|
//*****************************************************************************
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::ScrollToNode(nsIDOMNode* aNode)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG(aNode);
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_ENSURE_TRUE(mDocument, NS_ERROR_NOT_AVAILABLE);
|
1999-11-19 10:35:27 +03:00
|
|
|
nsCOMPtr<nsIPresShell> presShell;
|
|
|
|
NS_ENSURE_SUCCESS(GetPresShell(*(getter_AddRefs(presShell))), NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
// Get the nsIContent interface, because that's what we need to
|
|
|
|
// get the primary frame
|
|
|
|
|
|
|
|
nsCOMPtr<nsIContent> content(do_QueryInterface(aNode));
|
|
|
|
NS_ENSURE_TRUE(content, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
// Get the primary frame
|
|
|
|
nsIFrame* frame; // Remember Frames aren't ref-counted. They are in their
|
|
|
|
// own special little world.
|
|
|
|
|
|
|
|
NS_ENSURE_SUCCESS(presShell->GetPrimaryFrameFor(content, &frame),
|
|
|
|
NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
// tell the pres shell to scroll to the frame
|
|
|
|
NS_ENSURE_SUCCESS(presShell->ScrollFrameIntoView(frame,
|
|
|
|
NS_PRESSHELL_SCROLL_TOP,
|
|
|
|
NS_PRESSHELL_SCROLL_ANYWHERE),
|
|
|
|
NS_ERROR_FAILURE);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::GetAllowPlugins(PRBool* aAllowPlugins)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aAllowPlugins);
|
|
|
|
|
|
|
|
*aAllowPlugins = mAllowPlugins;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::SetAllowPlugins(PRBool aAllowPlugins)
|
|
|
|
{
|
|
|
|
mAllowPlugins = aAllowPlugins;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-04-03 01:52:17 +04:00
|
|
|
nsresult
|
|
|
|
DocumentViewerImpl::CallChildren(CallChildFunc aFunc, void* aClosure)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIDocShellTreeNode> docShellNode(do_QueryInterface(mContainer));
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct TextZoomInfo
|
|
|
|
{
|
|
|
|
float mTextZoom;
|
|
|
|
};
|
|
|
|
|
|
|
|
static void
|
|
|
|
SetChildTextZoom(nsIMarkupDocumentViewer* aChild, void* aClosure)
|
|
|
|
{
|
|
|
|
struct TextZoomInfo* textZoomInfo = (struct TextZoomInfo*) aClosure;
|
|
|
|
aChild->SetTextZoom(textZoomInfo->mTextZoom);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::SetTextZoom(float aTextZoom)
|
|
|
|
{
|
|
|
|
if (mDeviceContext) {
|
|
|
|
mDeviceContext->SetTextZoom(aTextZoom);
|
|
|
|
if (mPresContext) {
|
|
|
|
mPresContext->RemapStyleAndReflow();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// now set the text zoom on all children of mContainer
|
|
|
|
struct TextZoomInfo textZoomInfo = { aTextZoom };
|
|
|
|
return CallChildren(SetChildTextZoom, &textZoomInfo);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::GetTextZoom(float* aTextZoom)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aTextZoom);
|
|
|
|
|
|
|
|
if (mDeviceContext) {
|
|
|
|
return mDeviceContext->GetTextZoom(*aTextZoom);
|
|
|
|
}
|
|
|
|
|
|
|
|
*aTextZoom = 1.0;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
1999-11-19 10:35:27 +03:00
|
|
|
// XXX: SEMANTIC CHANGE!
|
|
|
|
// returns a copy of the string. Caller is responsible for freeing result
|
|
|
|
// using Recycle(aDefaultCharacterSet)
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::GetDefaultCharacterSet(PRUnichar** aDefaultCharacterSet)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aDefaultCharacterSet);
|
|
|
|
NS_ENSURE_STATE(mContainer);
|
|
|
|
|
2000-07-21 01:09:11 +04:00
|
|
|
static PRUnichar *gDefCharset = nsnull; // XXX: memory leak!
|
1999-11-19 10:35:27 +03:00
|
|
|
|
|
|
|
if (0 == mDefaultCharacterSet.Length())
|
|
|
|
{
|
|
|
|
if ((nsnull == gDefCharset) || (nsnull == *gDefCharset))
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWebShell> webShell;
|
|
|
|
webShell = do_QueryInterface(mContainer);
|
|
|
|
if (webShell)
|
|
|
|
{
|
2000-09-14 03:57:52 +04:00
|
|
|
nsCOMPtr<nsIPref> prefs(do_GetService(NS_PREF_CONTRACTID));
|
1999-11-19 10:35:27 +03:00
|
|
|
if(prefs)
|
2000-07-21 01:09:11 +04:00
|
|
|
prefs->GetLocalizedUnicharPref("intl.charset.default", &gDefCharset);
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if ((nsnull == gDefCharset) || (nsnull == *gDefCharset))
|
2000-04-03 15:20:35 +04:00
|
|
|
mDefaultCharacterSet.AssignWithConversion("ISO-8859-1");
|
1999-11-19 10:35:27 +03:00
|
|
|
else
|
2000-07-21 01:09:11 +04:00
|
|
|
mDefaultCharacterSet.Assign(gDefCharset);
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
|
|
|
*aDefaultCharacterSet = mDefaultCharacterSet.ToNewUnicode();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-04-03 01:52:17 +04:00
|
|
|
static void
|
|
|
|
SetChildDefaultCharacterSet(nsIMarkupDocumentViewer* aChild, void* aClosure)
|
|
|
|
{
|
|
|
|
aChild->SetDefaultCharacterSet((PRUnichar*) aClosure);
|
|
|
|
}
|
|
|
|
|
1999-11-19 10:35:27 +03:00
|
|
|
NS_IMETHODIMP DocumentViewerImpl::SetDefaultCharacterSet(const PRUnichar* aDefaultCharacterSet)
|
|
|
|
{
|
|
|
|
mDefaultCharacterSet = aDefaultCharacterSet; // this does a copy of aDefaultCharacterSet
|
|
|
|
// now set the default char set on all children of mContainer
|
2000-04-03 01:52:17 +04:00
|
|
|
return CallChildren(SetChildDefaultCharacterSet,
|
|
|
|
(void*) aDefaultCharacterSet);
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// XXX: SEMANTIC CHANGE!
|
|
|
|
// returns a copy of the string. Caller is responsible for freeing result
|
|
|
|
// using Recycle(aForceCharacterSet)
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::GetForceCharacterSet(PRUnichar** aForceCharacterSet)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aForceCharacterSet);
|
|
|
|
|
|
|
|
nsAutoString emptyStr;
|
|
|
|
if (mForceCharacterSet.Equals(emptyStr)) {
|
|
|
|
*aForceCharacterSet = nsnull;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
*aForceCharacterSet = mForceCharacterSet.ToNewUnicode();
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-04-03 01:52:17 +04:00
|
|
|
static void
|
|
|
|
SetChildForceCharacterSet(nsIMarkupDocumentViewer* aChild, void* aClosure)
|
|
|
|
{
|
|
|
|
aChild->SetForceCharacterSet((PRUnichar*) aClosure);
|
|
|
|
}
|
|
|
|
|
1999-11-19 10:35:27 +03:00
|
|
|
NS_IMETHODIMP DocumentViewerImpl::SetForceCharacterSet(const PRUnichar* aForceCharacterSet)
|
|
|
|
{
|
|
|
|
mForceCharacterSet = aForceCharacterSet;
|
|
|
|
// now set the force char set on all children of mContainer
|
2000-04-03 01:52:17 +04:00
|
|
|
return CallChildren(SetChildForceCharacterSet, (void*) aForceCharacterSet);
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// XXX: SEMANTIC CHANGE!
|
|
|
|
// returns a copy of the string. Caller is responsible for freeing result
|
|
|
|
// using Recycle(aHintCharacterSet)
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::GetHintCharacterSet(PRUnichar * *aHintCharacterSet)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aHintCharacterSet);
|
|
|
|
|
|
|
|
if(kCharsetUninitialized == mHintCharsetSource) {
|
|
|
|
*aHintCharacterSet = nsnull;
|
|
|
|
} else {
|
|
|
|
*aHintCharacterSet = mHintCharset.ToNewUnicode();
|
|
|
|
// this can't possibly be right. we can't set a value just because somebody got a related value!
|
|
|
|
//mHintCharsetSource = kCharsetUninitialized;
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::GetHintCharacterSetSource(PRInt32 *aHintCharacterSetSource)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aHintCharacterSetSource);
|
|
|
|
|
|
|
|
*aHintCharacterSetSource = mHintCharsetSource;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-04-03 01:52:17 +04:00
|
|
|
static void
|
|
|
|
SetChildHintCharacterSetSource(nsIMarkupDocumentViewer* aChild, void* aClosure)
|
|
|
|
{
|
|
|
|
aChild->SetHintCharacterSetSource((PRInt32) aClosure);
|
|
|
|
}
|
1999-11-19 10:35:27 +03:00
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::SetHintCharacterSetSource(PRInt32 aHintCharacterSetSource)
|
|
|
|
{
|
|
|
|
mHintCharsetSource = (nsCharsetSource)aHintCharacterSetSource;
|
2000-04-03 01:52:17 +04:00
|
|
|
// now set the hint char set source on all children of mContainer
|
|
|
|
return CallChildren(SetChildHintCharacterSetSource,
|
|
|
|
(void*) aHintCharacterSetSource);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
SetChildHintCharacterSet(nsIMarkupDocumentViewer* aChild, void* aClosure)
|
|
|
|
{
|
|
|
|
aChild->SetHintCharacterSet((PRUnichar*) aClosure);
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::SetHintCharacterSet(const PRUnichar* aHintCharacterSet)
|
|
|
|
{
|
|
|
|
mHintCharset = aHintCharacterSet;
|
2000-04-03 01:52:17 +04:00
|
|
|
// now set the hint char set on all children of mContainer
|
|
|
|
return CallChildren(SetChildHintCharacterSet, (void*) aHintCharacterSet);
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP DocumentViewerImpl::SizeToContent()
|
|
|
|
{
|
2001-03-10 06:19:36 +03:00
|
|
|
NS_ENSURE_TRUE(mDocument, NS_ERROR_NOT_AVAILABLE);
|
|
|
|
|
2000-02-08 18:49:14 +03:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellAsItem(do_QueryInterface(mContainer));
|
|
|
|
NS_ENSURE_TRUE(docShellAsItem, NS_ERROR_FAILURE);
|
1999-11-19 10:35:27 +03:00
|
|
|
|
2000-02-08 18:49:14 +03:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellParent;
|
|
|
|
docShellAsItem->GetSameTypeParent(getter_AddRefs(docShellParent));
|
1999-11-19 10:35:27 +03:00
|
|
|
|
2000-02-08 18:49:14 +03:00
|
|
|
// It's only valid to access this from a top frame. Doesn't work from
|
|
|
|
// sub-frames.
|
2000-02-11 11:35:20 +03:00
|
|
|
NS_ENSURE_TRUE(!docShellParent, NS_ERROR_FAILURE);
|
1999-11-19 10:35:27 +03:00
|
|
|
|
2000-02-08 18:49:14 +03:00
|
|
|
nsCOMPtr<nsIPresShell> presShell;
|
|
|
|
GetPresShell(*getter_AddRefs(presShell));
|
|
|
|
NS_ENSURE_TRUE(presShell, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
NS_ENSURE_SUCCESS(presShell->ResizeReflow(NS_UNCONSTRAINEDSIZE,
|
|
|
|
NS_UNCONSTRAINEDSIZE), NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIPresContext> presContext;
|
|
|
|
GetPresContext(*getter_AddRefs(presContext));
|
|
|
|
NS_ENSURE_TRUE(presContext, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
nsRect shellArea;
|
|
|
|
PRInt32 width, height;
|
|
|
|
float pixelScale;
|
|
|
|
|
|
|
|
// so how big is it?
|
|
|
|
presContext->GetVisibleArea(shellArea);
|
|
|
|
presContext->GetTwipsToPixels(&pixelScale);
|
|
|
|
width = PRInt32((float)shellArea.width*pixelScale);
|
|
|
|
height = PRInt32((float)shellArea.height*pixelScale);
|
1999-11-19 10:35:27 +03:00
|
|
|
|
2000-02-08 18:49:14 +03:00
|
|
|
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
|
|
|
|
docShellAsItem->GetTreeOwner(getter_AddRefs(treeOwner));
|
|
|
|
NS_ENSURE_TRUE(treeOwner, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
NS_ENSURE_SUCCESS(treeOwner->SizeShellTo(docShellAsItem, width, height),
|
|
|
|
NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
return NS_OK;
|
1999-11-19 10:35:27 +03:00
|
|
|
}
|
2000-02-16 04:39:30 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef XP_MAC
|
|
|
|
#pragma mark -
|
|
|
|
#endif
|
|
|
|
|
2000-09-14 15:45:01 +04:00
|
|
|
NS_IMPL_ISUPPORTS(nsDocViwerSelectionListener, NS_GET_IID(nsISelectionListener));
|
2000-02-16 04:39:30 +03:00
|
|
|
|
|
|
|
nsresult nsDocViwerSelectionListener::Init(DocumentViewerImpl *aDocViewer)
|
|
|
|
{
|
|
|
|
mDocViewer = aDocViewer;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-09-14 15:45:01 +04:00
|
|
|
NS_IMETHODIMP nsDocViwerSelectionListener::NotifySelectionChanged(nsIDOMDocument *, nsISelection *, short)
|
2000-01-19 00:06:10 +03:00
|
|
|
{
|
2000-02-16 04:39:30 +03:00
|
|
|
NS_ASSERTION(mDocViewer, "Should have doc viewer!");
|
|
|
|
|
|
|
|
// get the selection state
|
2000-09-14 15:45:01 +04:00
|
|
|
nsCOMPtr<nsISelection> selection;
|
2000-02-16 04:39:30 +03:00
|
|
|
nsresult rv = mDocViewer->GetDocumentSelection(getter_AddRefs(selection));
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
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;
|
|
|
|
mDocViewer->GetDocument(*getter_AddRefs(theDoc));
|
|
|
|
if (!theDoc) return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> scriptGlobalObject;
|
|
|
|
theDoc->GetScriptGlobalObject(getter_AddRefs(scriptGlobalObject));
|
|
|
|
|
2000-09-01 05:54:35 +04:00
|
|
|
nsCOMPtr<nsIDOMWindowInternal> domWindow = do_QueryInterface(scriptGlobalObject);
|
2000-02-16 04:39:30 +03:00
|
|
|
if (!domWindow) return NS_ERROR_FAILURE;
|
|
|
|
|
2001-03-27 15:17:17 +04:00
|
|
|
domWindow->UpdateCommands(NS_LITERAL_STRING("select"));
|
2000-02-16 04:39:30 +03:00
|
|
|
mGotSelectionState = PR_TRUE;
|
|
|
|
mSelectionWasCollapsed = selectionCollapsed;
|
|
|
|
}
|
|
|
|
|
2000-01-19 00:06:10 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2000-02-10 07:35:51 +03:00
|
|
|
|
2000-04-22 01:40:28 +04:00
|
|
|
//nsDocViewerFocusListener
|
|
|
|
NS_IMPL_ISUPPORTS(nsDocViewerFocusListener, NS_GET_IID(nsIDOMFocusListener));
|
|
|
|
|
|
|
|
nsDocViewerFocusListener::nsDocViewerFocusListener()
|
|
|
|
:mDocViewer(nsnull)
|
|
|
|
{
|
|
|
|
NS_INIT_REFCNT();
|
|
|
|
}
|
|
|
|
|
|
|
|
nsDocViewerFocusListener::~nsDocViewerFocusListener(){}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsDocViewerFocusListener::HandleEvent(nsIDOMEvent* aEvent)
|
|
|
|
{
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsDocViewerFocusListener::Focus(nsIDOMEvent* aEvent)
|
|
|
|
{
|
2000-04-28 10:21:31 +04:00
|
|
|
nsCOMPtr<nsIPresShell> shell;
|
2000-04-22 01:40:28 +04:00
|
|
|
if(!mDocViewer)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2000-04-28 10:21:31 +04:00
|
|
|
nsresult result = mDocViewer->GetPresShell(*getter_AddRefs(shell));//deref once cause it take a ptr ref
|
|
|
|
if(NS_FAILED(result) || !shell)
|
2000-04-22 01:40:28 +04:00
|
|
|
return result?result:NS_ERROR_FAILURE;
|
2000-04-28 10:21:31 +04:00
|
|
|
nsCOMPtr<nsISelectionController> selCon;
|
|
|
|
selCon = do_QueryInterface(shell);
|
|
|
|
PRInt16 selectionStatus;
|
|
|
|
selCon->GetDisplaySelection( &selectionStatus);
|
2000-04-22 01:40:28 +04:00
|
|
|
|
2000-04-28 10:21:31 +04:00
|
|
|
//if selection was nsISelectionController::SELECTION_OFF, do nothing
|
2000-05-11 08:25:43 +04:00
|
|
|
//otherwise re-enable it.
|
2000-04-28 10:21:31 +04:00
|
|
|
if(selectionStatus == nsISelectionController::SELECTION_DISABLED)
|
2000-04-22 01:40:28 +04:00
|
|
|
{
|
2000-04-28 10:21:31 +04:00
|
|
|
selCon->SetDisplaySelection(nsISelectionController::SELECTION_ON);
|
|
|
|
selCon->RepaintSelection(nsISelectionController::SELECTION_NORMAL);
|
2000-04-22 01:40:28 +04:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
2000-05-11 08:25:43 +04:00
|
|
|
|
2000-04-22 01:40:28 +04:00
|
|
|
nsresult
|
|
|
|
nsDocViewerFocusListener::Blur(nsIDOMEvent* aEvent)
|
|
|
|
{
|
2000-04-28 10:21:31 +04:00
|
|
|
nsCOMPtr<nsIPresShell> shell;
|
2000-05-11 08:25:43 +04:00
|
|
|
if(!mDocViewer)
|
2000-04-22 01:40:28 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2000-04-28 10:21:31 +04:00
|
|
|
nsresult result = mDocViewer->GetPresShell(*getter_AddRefs(shell));//deref once cause it take a ptr ref
|
|
|
|
if(NS_FAILED(result) || !shell)
|
2000-04-22 01:40:28 +04:00
|
|
|
return result?result:NS_ERROR_FAILURE;
|
2000-04-28 10:21:31 +04:00
|
|
|
nsCOMPtr<nsISelectionController> selCon;
|
|
|
|
selCon = do_QueryInterface(shell);
|
|
|
|
PRInt16 selectionStatus;
|
|
|
|
selCon->GetDisplaySelection(&selectionStatus);
|
2000-04-22 01:40:28 +04:00
|
|
|
|
2000-04-28 10:21:31 +04:00
|
|
|
//if selection was nsISelectionController::SELECTION_OFF, do nothing
|
2000-04-22 01:40:28 +04:00
|
|
|
//otherwise re-enable it.
|
2000-04-28 10:21:31 +04:00
|
|
|
if(selectionStatus == nsISelectionController::SELECTION_ON)
|
2000-04-22 01:40:28 +04:00
|
|
|
{
|
2000-04-28 10:21:31 +04:00
|
|
|
selCon->SetDisplaySelection(nsISelectionController::SELECTION_DISABLED);
|
|
|
|
selCon->RepaintSelection(nsISelectionController::SELECTION_NORMAL);
|
2000-04-22 01:40:28 +04:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsDocViewerFocusListener::Init(DocumentViewerImpl *aDocViewer)
|
|
|
|
{
|
|
|
|
mDocViewer = aDocViewer;
|
|
|
|
return NS_OK;
|
2000-04-22 02:17:14 +04:00
|
|
|
}
|
|
|
|
|
2001-02-01 23:49:10 +03:00
|
|
|
|
2001-02-07 02:03:17 +03:00
|
|
|
PRBool
|
|
|
|
DocumentViewerImpl::IsWindowsInOurSubTree(nsIDOMWindowInternal * aDOMWindow)
|
|
|
|
{
|
|
|
|
PRBool found = PR_FALSE;
|
|
|
|
if(aDOMWindow) {
|
|
|
|
// now check to make sure it is in "our" tree of webshells
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> scriptObj(do_QueryInterface(aDOMWindow));
|
|
|
|
if (scriptObj) {
|
|
|
|
nsCOMPtr<nsIDocShell> docShell;
|
|
|
|
scriptObj->GetDocShell(getter_AddRefs(docShell));
|
|
|
|
if (docShell) {
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellAsItem(do_QueryInterface(docShell));
|
|
|
|
if (docShellAsItem) {
|
|
|
|
// get this DocViewer webshell
|
|
|
|
nsCOMPtr<nsIWebShell> thisDVWebShell(do_QueryInterface(mContainer));
|
|
|
|
while (!found) {
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellParent;
|
|
|
|
docShellAsItem->GetSameTypeParent(getter_AddRefs(docShellParent));
|
|
|
|
if (docShellParent) {
|
|
|
|
nsCOMPtr<nsIWebShell> parentWebshell(do_QueryInterface(docShellParent));
|
|
|
|
if (parentWebshell) {
|
|
|
|
if (parentWebshell.get() == thisDVWebShell.get()) {
|
|
|
|
found = PR_TRUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
break; // at top of tree
|
|
|
|
}
|
|
|
|
docShellAsItem = docShellParent;
|
|
|
|
} // while
|
|
|
|
}
|
|
|
|
} // docshell
|
|
|
|
} // scriptobj
|
|
|
|
} // domWindow
|
|
|
|
|
|
|
|
return found;
|
|
|
|
}
|
|
|
|
|
2001-02-01 23:49:10 +03:00
|
|
|
/** ---------------------------------------------------
|
|
|
|
* Get the Focused Frame for a documentviewer
|
|
|
|
*
|
|
|
|
*/
|
2001-02-07 02:03:17 +03:00
|
|
|
nsIDOMWindowInternal*
|
|
|
|
DocumentViewerImpl::FindFocusedDOMWindowInternal()
|
2001-02-01 23:49:10 +03:00
|
|
|
{
|
2001-02-07 02:03:17 +03:00
|
|
|
nsCOMPtr<nsIDOMWindowInternal> theDOMWin;
|
|
|
|
nsCOMPtr<nsIDocument> theDoc;
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> theSGO;
|
|
|
|
nsCOMPtr<nsIFocusController> focusController;
|
|
|
|
nsIDOMWindowInternal * domWin = nsnull;
|
2001-02-01 23:49:10 +03:00
|
|
|
|
|
|
|
this->GetDocument(*getter_AddRefs(theDoc));
|
|
|
|
if(theDoc){
|
|
|
|
theDoc->GetScriptGlobalObject(getter_AddRefs(theSGO));
|
|
|
|
if(theSGO){
|
|
|
|
nsCOMPtr<nsPIDOMWindow> theDOMWindow = do_QueryInterface(theSGO);
|
|
|
|
if(theDOMWindow){
|
|
|
|
theDOMWindow->GetRootFocusController(getter_AddRefs(focusController));
|
|
|
|
if(focusController){
|
|
|
|
focusController->GetFocusedWindow(getter_AddRefs(theDOMWin));
|
2001-02-07 02:03:17 +03:00
|
|
|
domWin = theDOMWin.get();
|
|
|
|
if(domWin != nsnull) {
|
|
|
|
if (IsWindowsInOurSubTree(domWin)){
|
|
|
|
NS_ADDREF(domWin);
|
|
|
|
} else {
|
|
|
|
domWin = nsnull;
|
|
|
|
}
|
2001-02-01 23:49:10 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2001-02-07 02:03:17 +03:00
|
|
|
return domWin;
|
2001-02-01 23:49:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/** ---------------------------------------------------
|
|
|
|
* Get DOM Window represented by the document viewer
|
|
|
|
*
|
|
|
|
*/
|
2001-02-07 02:03:17 +03:00
|
|
|
nsIDOMWindow*
|
|
|
|
DocumentViewerImpl::GetDOMWindowForThisDV()
|
2001-02-01 23:49:10 +03:00
|
|
|
{
|
2001-02-07 02:03:17 +03:00
|
|
|
nsCOMPtr<nsIDocument> theDoc;
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> theSGO;
|
|
|
|
nsCOMPtr<nsIFocusController> focusController;
|
|
|
|
nsIDOMWindow * domWin = nsnull;
|
2001-02-01 23:49:10 +03:00
|
|
|
|
|
|
|
this->GetDocument(*getter_AddRefs(theDoc));
|
2001-02-07 02:03:17 +03:00
|
|
|
if (theDoc){
|
2001-02-01 23:49:10 +03:00
|
|
|
theDoc->GetScriptGlobalObject(getter_AddRefs(theSGO));
|
2001-02-07 02:03:17 +03:00
|
|
|
if (theSGO){
|
2001-02-01 23:49:10 +03:00
|
|
|
nsCOMPtr<nsIDOMWindow> theDOMWindow = do_QueryInterface(theSGO);
|
|
|
|
if(theDOMWindow){
|
2001-02-07 02:03:17 +03:00
|
|
|
domWin = theDOMWindow.get();
|
|
|
|
NS_ADDREF(domWin);
|
2001-02-01 23:49:10 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2001-02-07 02:03:17 +03:00
|
|
|
|
|
|
|
return domWin;
|
2001-02-02 00:37:05 +03:00
|
|
|
}
|