зеркало из https://github.com/mozilla/pjs.git
Sample code only - not part of mozilla. Implement nsIWebBrowserChrome::ShowAsModal() and some other windowing cleanup. r=danm@netscape.com
This commit is contained in:
Родитель
015c3400ee
Коммит
9df84b4e54
|
@ -29,12 +29,13 @@
|
||||||
#include "nsIChannel.h"
|
#include "nsIChannel.h"
|
||||||
#include "nsIURI.h"
|
#include "nsIURI.h"
|
||||||
#include "nsXPIDLString.h"
|
#include "nsXPIDLString.h"
|
||||||
#include "nsIContentViewer.h"
|
|
||||||
#include "nsIMarkupDocumentViewer.h"
|
|
||||||
#include "nsIDOMHTMLLinkElement.h"
|
#include "nsIDOMHTMLLinkElement.h"
|
||||||
#include "nsIDOMHTMLAnchorElement.h"
|
#include "nsIDOMHTMLAnchorElement.h"
|
||||||
#include "nsIWindowCreator.h"
|
#include "nsIWindowCreator.h"
|
||||||
#include "nsIWindowWatcher.h"
|
#include "nsIWindowWatcher.h"
|
||||||
|
#include "nsIDOMWindow.h"
|
||||||
|
#include "nsIDOMDocument.h"
|
||||||
|
#include "nsIDOMWindowInternal.h"
|
||||||
|
|
||||||
#include "CBrowserWindow.h"
|
#include "CBrowserWindow.h"
|
||||||
#include "CBrowserShell.h"
|
#include "CBrowserShell.h"
|
||||||
|
@ -77,11 +78,12 @@ static NS_DEFINE_IID(kWindowCID, NS_WINDOW_CID);
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
CBrowserWindow::CBrowserWindow() :
|
CBrowserWindow::CBrowserWindow() :
|
||||||
|
mIsChromeWindow(false),
|
||||||
mBrowserShell(NULL), mBrowserChrome(NULL),
|
mBrowserShell(NULL), mBrowserChrome(NULL),
|
||||||
mURLField(NULL), mStatusBar(NULL), mThrobber(NULL),
|
mURLField(NULL), mStatusBar(NULL), mThrobber(NULL),
|
||||||
mBackButton(NULL), mForwardButton(NULL), mStopButton(NULL),
|
mBackButton(NULL), mForwardButton(NULL), mStopButton(NULL),
|
||||||
mProgressBar(NULL), mBusy(false),
|
mProgressBar(NULL), mBusy(false),
|
||||||
mInitialLoadComplete(false), mShowOnInitialLoad(false),
|
mInitialLoadComplete(false), mVisible(false),
|
||||||
mSizeToContent(true),
|
mSizeToContent(true),
|
||||||
mContextMenuContext(nsIContextMenuListener::CONTEXT_NONE)
|
mContextMenuContext(nsIContextMenuListener::CONTEXT_NONE)
|
||||||
{
|
{
|
||||||
|
@ -100,13 +102,15 @@ CBrowserWindow::CBrowserWindow(LCommander* inSuperCommander,
|
||||||
ConstStringPtr inTitle,
|
ConstStringPtr inTitle,
|
||||||
SInt16 inProcID,
|
SInt16 inProcID,
|
||||||
UInt32 inAttributes,
|
UInt32 inAttributes,
|
||||||
WindowPtr inBehind) :
|
WindowPtr inBehind,
|
||||||
|
Boolean inIsChromeWindow) :
|
||||||
LWindow(inSuperCommander, inGlobalBounds, inTitle, inProcID, inAttributes, inBehind),
|
LWindow(inSuperCommander, inGlobalBounds, inTitle, inProcID, inAttributes, inBehind),
|
||||||
|
mIsChromeWindow(inIsChromeWindow),
|
||||||
mBrowserShell(NULL), mBrowserChrome(NULL),
|
mBrowserShell(NULL), mBrowserChrome(NULL),
|
||||||
mURLField(NULL), mStatusBar(NULL), mThrobber(NULL),
|
mURLField(NULL), mStatusBar(NULL), mThrobber(NULL),
|
||||||
mBackButton(NULL), mForwardButton(NULL), mStopButton(NULL),
|
mBackButton(NULL), mForwardButton(NULL), mStopButton(NULL),
|
||||||
mProgressBar(NULL), mBusy(false),
|
mProgressBar(NULL), mBusy(false),
|
||||||
mInitialLoadComplete(false), mShowOnInitialLoad(false),
|
mInitialLoadComplete(false), mVisible(false),
|
||||||
mSizeToContent(true),
|
mSizeToContent(true),
|
||||||
mContextMenuContext(nsIContextMenuListener::CONTEXT_NONE)
|
mContextMenuContext(nsIContextMenuListener::CONTEXT_NONE)
|
||||||
{
|
{
|
||||||
|
@ -122,11 +126,12 @@ CBrowserWindow::CBrowserWindow(LCommander* inSuperCommander,
|
||||||
|
|
||||||
CBrowserWindow::CBrowserWindow(LStream* inStream) :
|
CBrowserWindow::CBrowserWindow(LStream* inStream) :
|
||||||
LWindow(inStream),
|
LWindow(inStream),
|
||||||
|
mIsChromeWindow(false),
|
||||||
mBrowserShell(NULL), mBrowserChrome(NULL),
|
mBrowserShell(NULL), mBrowserChrome(NULL),
|
||||||
mURLField(NULL), mStatusBar(NULL), mThrobber(NULL),
|
mURLField(NULL), mStatusBar(NULL), mThrobber(NULL),
|
||||||
mBackButton(NULL), mForwardButton(NULL), mStopButton(NULL),
|
mBackButton(NULL), mForwardButton(NULL), mStopButton(NULL),
|
||||||
mProgressBar(NULL), mBusy(false),
|
mProgressBar(NULL), mBusy(false),
|
||||||
mInitialLoadComplete(false), mShowOnInitialLoad(false),
|
mInitialLoadComplete(false), mVisible(false),
|
||||||
mSizeToContent(true),
|
mSizeToContent(true),
|
||||||
mContextMenuContext(nsIContextMenuListener::CONTEXT_NONE)
|
mContextMenuContext(nsIContextMenuListener::CONTEXT_NONE)
|
||||||
{
|
{
|
||||||
|
@ -205,7 +210,8 @@ CBrowserWindow* CBrowserWindow::CreateWindow(PRUint32 chromeFlags, PRInt32 width
|
||||||
windowAttrs |= windAttr_CloseBox;
|
windowAttrs |= windAttr_CloseBox;
|
||||||
}
|
}
|
||||||
|
|
||||||
theWindow = new CBrowserWindow(LCommander::GetTopCommander(), globalBounds, "\p", windowDefProc, windowAttrs, window_InFront);
|
Boolean isChrome = (chromeFlags & nsIWebBrowserChrome::CHROME_OPENAS_CHROME) != 0;
|
||||||
|
theWindow = new CBrowserWindow(LCommander::GetTopCommander(), globalBounds, "\p", windowDefProc, windowAttrs, window_InFront, isChrome);
|
||||||
ThrowIfNil_(theWindow);
|
ThrowIfNil_(theWindow);
|
||||||
theWindow->SetUserCon(wind_BrowserWindow);
|
theWindow->SetUserCon(wind_BrowserWindow);
|
||||||
|
|
||||||
|
@ -546,14 +552,13 @@ NS_METHOD CBrowserWindow::GetIWebBrowserChrome(nsIWebBrowserChrome **aChrome)
|
||||||
|
|
||||||
NS_METHOD CBrowserWindow::SizeToContent()
|
NS_METHOD CBrowserWindow::SizeToContent()
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsIContentViewer> aContentViewer;
|
nsresult rv;
|
||||||
mBrowserShell->GetContentViewer(getter_AddRefs(aContentViewer));
|
nsCOMPtr<nsIDOMWindow> domWindow;
|
||||||
NS_ENSURE_TRUE(aContentViewer, NS_ERROR_FAILURE);
|
rv = mBrowserChrome->GetInterface(NS_GET_IID(nsIDOMWindow), getter_AddRefs(domWindow));
|
||||||
nsCOMPtr<nsIMarkupDocumentViewer> markupViewer(do_QueryInterface(aContentViewer));
|
if (NS_FAILED(rv)) return rv;
|
||||||
NS_ENSURE_TRUE(markupViewer, NS_ERROR_FAILURE);
|
nsCOMPtr<nsIDOMWindowInternal> domWindowInternal(do_QueryInterface(domWindow, &rv));
|
||||||
NS_ENSURE_SUCCESS(markupViewer->SizeToContent(), NS_ERROR_FAILURE);
|
if (NS_FAILED(rv)) return rv;
|
||||||
|
return domWindowInternal->SizeToContent();
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_METHOD CBrowserWindow::Stop()
|
NS_METHOD CBrowserWindow::Stop()
|
||||||
|
@ -635,20 +640,25 @@ NS_METHOD CBrowserWindow::OnStatusNetStop(nsIWebProgress *progress, nsIRequest *
|
||||||
if (mStopButton)
|
if (mStopButton)
|
||||||
mStopButton->Disable();
|
mStopButton->Disable();
|
||||||
|
|
||||||
// If this is our first load, check to see if we need to be sized/shown.
|
// If this is a chrome window and it's first load, do some things.
|
||||||
if (!mInitialLoadComplete) {
|
if (mIsChromeWindow && !mInitialLoadComplete) {
|
||||||
if (mSizeToContent) {
|
|
||||||
SizeToContent();
|
|
||||||
mSizeToContent = false;
|
|
||||||
}
|
|
||||||
if (mShowOnInitialLoad) {
|
|
||||||
Show();
|
|
||||||
Select();
|
|
||||||
mShowOnInitialLoad = false;
|
|
||||||
}
|
|
||||||
mInitialLoadComplete = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// If we don't have a title yet, see if we can get one from the DOM
|
||||||
|
LStr255 windowTitle;
|
||||||
|
GetDescriptor(windowTitle);
|
||||||
|
if (!windowTitle.Length())
|
||||||
|
SetTitleFromDOMDocument();
|
||||||
|
|
||||||
|
// If we are being sized intrinsically, do it now
|
||||||
|
if (mSizeToContent)
|
||||||
|
SizeToContent();
|
||||||
|
|
||||||
|
// If we deferred showing ourselves because waiting to be sized, do it now
|
||||||
|
if (mVisible && !IsVisible())
|
||||||
|
Show();
|
||||||
|
|
||||||
|
}
|
||||||
|
mInitialLoadComplete = true;
|
||||||
mBusy = false;
|
mBusy = false;
|
||||||
|
|
||||||
// Inform any other interested parties
|
// Inform any other interested parties
|
||||||
|
@ -681,22 +691,26 @@ NS_METHOD CBrowserWindow::OnProgressChange(nsIWebProgress *progress, nsIRequest
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_METHOD CBrowserWindow::GetVisibility(PRBool *aVisibility)
|
||||||
|
{
|
||||||
|
*aVisibility = mVisible;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
NS_METHOD CBrowserWindow::SetVisibility(PRBool aVisibility)
|
NS_METHOD CBrowserWindow::SetVisibility(PRBool aVisibility)
|
||||||
{
|
{
|
||||||
// If we are waiting for content to load in order to size ourself,
|
// If we are waiting for content to load in order to size ourself,
|
||||||
// defer making ourselves visible until the load completes.
|
// defer making ourselves visible until the load completes.
|
||||||
|
|
||||||
if (aVisibility) {
|
if (aVisibility) {
|
||||||
if (!mSizeToContent || mInitialLoadComplete) {
|
if (mInitialLoadComplete)
|
||||||
Show();
|
Show();
|
||||||
Select();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
mShowOnInitialLoad = true;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Hide();
|
Hide();
|
||||||
|
|
||||||
|
mVisible = aVisibility;
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -761,6 +775,33 @@ NS_METHOD CBrowserWindow::OnShowContextMenu(PRUint32 aContextFlags, nsIDOMEvent
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_METHOD CBrowserWindow::SetTitleFromDOMDocument()
|
||||||
|
{
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
nsCOMPtr<nsIDOMWindow> domWindow;
|
||||||
|
rv = mBrowserChrome->GetInterface(NS_GET_IID(nsIDOMWindow), getter_AddRefs(domWindow));
|
||||||
|
if (NS_FAILED(rv)) return rv;
|
||||||
|
nsCOMPtr<nsIDOMDocument> domDoc;
|
||||||
|
rv = domWindow->GetDocument(getter_AddRefs(domDoc));
|
||||||
|
if (NS_FAILED(rv)) return rv;
|
||||||
|
nsCOMPtr<nsIDOMElement> domDocElem;
|
||||||
|
rv = domDoc->GetDocumentElement(getter_AddRefs(domDocElem));
|
||||||
|
if (NS_FAILED(rv)) return rv;
|
||||||
|
|
||||||
|
nsAutoString windowTitle;
|
||||||
|
domDocElem->GetAttribute(NS_LITERAL_STRING("title"), windowTitle);
|
||||||
|
if (!windowTitle.IsEmpty()) {
|
||||||
|
Str255 pStr;
|
||||||
|
CPlatformUCSConversion::GetInstance()->UCSToPlatform(windowTitle, pStr);
|
||||||
|
SetDescriptor(pStr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
rv = NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Window Creator
|
// Window Creator
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
@ -799,8 +840,6 @@ NS_IMETHODIMP CWindowCreator::CreateChromeWindow(nsIWebBrowserChrome *aParent,
|
||||||
// but since windows on the Mac don't have parents anyway...
|
// but since windows on the Mac don't have parents anyway...
|
||||||
try {
|
try {
|
||||||
theWindow = CBrowserWindow::CreateWindow(aChromeFlags, -1, -1);
|
theWindow = CBrowserWindow::CreateWindow(aChromeFlags, -1, -1);
|
||||||
theWindow->SetSizeToContent(false);
|
|
||||||
theWindow->Show();
|
|
||||||
theWindow->GetIWebBrowserChrome(_retval);
|
theWindow->GetIWebBrowserChrome(_retval);
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
|
|
|
@ -84,7 +84,8 @@ public:
|
||||||
ConstStringPtr inTitle,
|
ConstStringPtr inTitle,
|
||||||
SInt16 inProcID,
|
SInt16 inProcID,
|
||||||
UInt32 inAttributes,
|
UInt32 inAttributes,
|
||||||
WindowPtr inBehind);
|
WindowPtr inBehind,
|
||||||
|
Boolean inIsChromeWindow);
|
||||||
CBrowserWindow(LStream* inStream);
|
CBrowserWindow(LStream* inStream);
|
||||||
|
|
||||||
virtual ~CBrowserWindow();
|
virtual ~CBrowserWindow();
|
||||||
|
@ -148,15 +149,23 @@ protected:
|
||||||
PRInt32 curSelfProgress, PRInt32 maxSelfProgress,
|
PRInt32 curSelfProgress, PRInt32 maxSelfProgress,
|
||||||
PRInt32 curTotalProgress, PRInt32 maxTotalProgress);
|
PRInt32 curTotalProgress, PRInt32 maxTotalProgress);
|
||||||
|
|
||||||
|
NS_METHOD GetVisibility(PRBool *aVisibility);
|
||||||
NS_METHOD SetVisibility(PRBool aVisibility);
|
NS_METHOD SetVisibility(PRBool aVisibility);
|
||||||
|
|
||||||
NS_METHOD OnShowContextMenu(PRUint32 aContextFlags, nsIDOMEvent *aEvent, nsIDOMNode *aNode);
|
NS_METHOD OnShowContextMenu(PRUint32 aContextFlags, nsIDOMEvent *aEvent, nsIDOMNode *aNode);
|
||||||
|
|
||||||
NS_METHOD GetIWebBrowserChrome(nsIWebBrowserChrome **aChrome);
|
NS_METHOD GetIWebBrowserChrome(nsIWebBrowserChrome **aChrome);
|
||||||
|
|
||||||
|
// -----------------------------------
|
||||||
|
// Internal
|
||||||
|
// -----------------------------------
|
||||||
|
|
||||||
|
NS_METHOD SetTitleFromDOMDocument();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
nsCOMPtr<nsIWidget> mWindow;
|
nsCOMPtr<nsIWidget> mWindow;
|
||||||
|
|
||||||
|
Boolean mIsChromeWindow;
|
||||||
CBrowserShell* mBrowserShell;
|
CBrowserShell* mBrowserShell;
|
||||||
CWebBrowserChrome* mBrowserChrome;
|
CWebBrowserChrome* mBrowserChrome;
|
||||||
LEditText* mURLField;
|
LEditText* mURLField;
|
||||||
|
@ -165,7 +174,8 @@ protected:
|
||||||
LBevelButton *mBackButton, *mForwardButton, *mStopButton;
|
LBevelButton *mBackButton, *mForwardButton, *mStopButton;
|
||||||
LProgressBar* mProgressBar;
|
LProgressBar* mProgressBar;
|
||||||
Boolean mBusy;
|
Boolean mBusy;
|
||||||
Boolean mInitialLoadComplete, mShowOnInitialLoad;
|
Boolean mInitialLoadComplete;
|
||||||
|
Boolean mVisible; // whether we are visible according to Get/SetVisibility
|
||||||
Boolean mSizeToContent;
|
Boolean mSizeToContent;
|
||||||
|
|
||||||
PRUint32 mContextMenuContext;
|
PRUint32 mContextMenuContext;
|
||||||
|
|
|
@ -87,7 +87,8 @@ CWebBrowserPrompter::~CWebBrowserPrompter()
|
||||||
//*****************************************************************************
|
//*****************************************************************************
|
||||||
|
|
||||||
CWebBrowserChrome::CWebBrowserChrome() :
|
CWebBrowserChrome::CWebBrowserChrome() :
|
||||||
mBrowserWindow(nsnull), mBrowserShell(nsnull), mPreviousBalloonState(false)
|
mBrowserWindow(nsnull), mBrowserShell(nsnull),
|
||||||
|
mPreviousBalloonState(false), mInModalLoop(false)
|
||||||
{
|
{
|
||||||
NS_INIT_REFCNT();
|
NS_INIT_REFCNT();
|
||||||
}
|
}
|
||||||
|
@ -226,6 +227,7 @@ NS_IMETHODIMP CWebBrowserChrome::CreateBrowserWindow(PRUint32 chromeMask, PRInt3
|
||||||
|
|
||||||
NS_IMETHODIMP CWebBrowserChrome::DestroyBrowserWindow()
|
NS_IMETHODIMP CWebBrowserChrome::DestroyBrowserWindow()
|
||||||
{
|
{
|
||||||
|
mInModalLoop = false;
|
||||||
delete mBrowserWindow;
|
delete mBrowserWindow;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
@ -247,14 +249,35 @@ NS_IMETHODIMP CWebBrowserChrome::SizeBrowserTo(PRInt32 aCX, PRInt32 aCY)
|
||||||
|
|
||||||
NS_IMETHODIMP CWebBrowserChrome::ShowAsModal(void)
|
NS_IMETHODIMP CWebBrowserChrome::ShowAsModal(void)
|
||||||
{
|
{
|
||||||
NS_ERROR("Haven't Implemented this yet");
|
// We need this override because StDialogHandler deletes
|
||||||
return NS_ERROR_FAILURE;
|
// its window in its destructor. We don't want that here.
|
||||||
|
class CChromeDialogHandler : public StDialogHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CChromeDialogHandler(LWindow* inWindow,
|
||||||
|
LCommander* inSuper) :
|
||||||
|
StDialogHandler(inWindow, inSuper)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
virtual ~CChromeDialogHandler()
|
||||||
|
{ mDialog = nil; }
|
||||||
|
};
|
||||||
|
|
||||||
|
CChromeDialogHandler theHandler(mBrowserWindow, mBrowserWindow->GetSuperCommander());
|
||||||
|
|
||||||
|
// Set to false by ExitModalEventLoop or DestroyBrowserWindow
|
||||||
|
mInModalLoop = true;
|
||||||
|
while (mInModalLoop)
|
||||||
|
theHandler.DoDialog();
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP CWebBrowserChrome::ExitModalEventLoop(nsresult aStatus)
|
NS_IMETHODIMP CWebBrowserChrome::ExitModalEventLoop(nsresult aStatus)
|
||||||
{
|
{
|
||||||
NS_ERROR("Haven't Implemented this yet");
|
mInModalLoop = false;
|
||||||
return NS_ERROR_FAILURE;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
//*****************************************************************************
|
//*****************************************************************************
|
||||||
|
@ -353,6 +376,7 @@ NS_IMETHODIMP CWebBrowserChrome::SetDimensions(PRUint32 flags, PRInt32 x, PRInt3
|
||||||
}
|
}
|
||||||
else // setting size
|
else // setting size
|
||||||
{
|
{
|
||||||
|
mBrowserWindow->SetSizeToContent(false);
|
||||||
if (flags & nsIEmbeddingSiteWindow::DIM_FLAGS_SIZE_INNER)
|
if (flags & nsIEmbeddingSiteWindow::DIM_FLAGS_SIZE_INNER)
|
||||||
{
|
{
|
||||||
browserShell = mBrowserWindow->GetBrowserShell();
|
browserShell = mBrowserWindow->GetBrowserShell();
|
||||||
|
@ -441,7 +465,7 @@ NS_IMETHODIMP CWebBrowserChrome::GetVisibility(PRBool *aVisibility)
|
||||||
NS_ENSURE_STATE(mBrowserWindow);
|
NS_ENSURE_STATE(mBrowserWindow);
|
||||||
NS_ENSURE_ARG_POINTER(aVisibility);
|
NS_ENSURE_ARG_POINTER(aVisibility);
|
||||||
|
|
||||||
*aVisibility = mBrowserWindow->IsVisible();
|
mBrowserWindow->GetVisibility(aVisibility);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -76,6 +76,7 @@ protected:
|
||||||
CBrowserShell* mBrowserShell;
|
CBrowserShell* mBrowserShell;
|
||||||
|
|
||||||
Boolean mPreviousBalloonState; // are balloons on or off?
|
Boolean mPreviousBalloonState; // are balloons on or off?
|
||||||
|
Boolean mInModalLoop;
|
||||||
|
|
||||||
nsCOMPtr<nsIPrompt> mPrompter;
|
nsCOMPtr<nsIPrompt> mPrompter;
|
||||||
};
|
};
|
||||||
|
|
Загрузка…
Ссылка в новой задаче