Checking in support for intrinsic sizing of chrome.

This commit is contained in:
hyatt%netscape.com 1999-07-04 04:09:54 +00:00
Родитель 77096ca1e6
Коммит 73b08a974d
23 изменённых файлов: 833 добавлений и 172 удалений

Просмотреть файл

@ -107,6 +107,7 @@
#include "rdfutil.h"
#include "rdf.h"
#include "nsIFrameReflow.h"
#include "nsIDOMXULFocusTracker.h"
#include "nsIXULFocusTracker.h"
#include "nsIDOMEventCapturer.h"
@ -3951,43 +3952,49 @@ XULDocumentImpl::StartLayout(void)
PRInt32 count = GetNumberOfShells();
for (PRInt32 i = 0; i < count; i++) {
nsIPresShell* shell = GetShellAt(i);
if (nsnull == shell)
continue;
nsIPresShell* shell = GetShellAt(i);
if (nsnull == shell)
continue;
// Resize-reflow this time
nsCOMPtr<nsIPresContext> cx;
shell->GetPresContext(getter_AddRefs(cx));
// Resize-reflow this time
nsCOMPtr<nsIPresContext> cx;
shell->GetPresContext(getter_AddRefs(cx));
if (cx) {
nsCOMPtr<nsISupports> container;
cx->GetContainer(getter_AddRefs(container));
if (container) {
nsCOMPtr<nsIWebShell> webShell;
webShell = do_QueryInterface(container);
if (webShell) {
webShell->SetScrolling(NS_STYLE_OVERFLOW_HIDDEN);
if (cx) {
nsCOMPtr<nsISupports> container;
cx->GetContainer(getter_AddRefs(container));
if (container) {
nsCOMPtr<nsIWebShell> webShell;
webShell = do_QueryInterface(container);
if (webShell) {
webShell->SetScrolling(NS_STYLE_OVERFLOW_HIDDEN);
}
}
}
}
}
nsRect r;
cx->GetVisibleArea(r);
shell->InitialReflow(r.width, r.height);
nsRect r;
cx->GetVisibleArea(r);
if (r.width == 0 || r.height == 0) {
// Flow at an unconstrained width and height
r.width = NS_UNCONSTRAINEDSIZE;
r.height = NS_UNCONSTRAINEDSIZE;
}
// Now trigger a refresh
nsCOMPtr<nsIViewManager> vm;
shell->GetViewManager(getter_AddRefs(vm));
if (vm) {
vm->EnableRefresh();
}
shell->InitialReflow(r.width, r.height);
// Start observing the document _after_ we do the initial
// reflow. Otherwise, we'll get into an trouble trying to
// create kids before the root frame is established.
shell->BeginObservingDocument();
// Now trigger a refresh
nsCOMPtr<nsIViewManager> vm;
shell->GetViewManager(getter_AddRefs(vm));
if (vm) {
vm->EnableRefresh();
}
NS_RELEASE(shell);
// Start observing the document _after_ we do the initial
// reflow. Otherwise, we'll get into an trouble trying to
// create kids before the root frame is established.
shell->BeginObservingDocument();
NS_RELEASE(shell);
}
return NS_OK;
}

Просмотреть файл

@ -752,7 +752,7 @@ GlobalWindowImpl::GetInnerWidth(PRInt32* aInnerWidth)
if (NS_OK == GetBrowserWindowInterface(mBrowser)) {
nsRect r;
mBrowser->GetBounds(r);
mBrowser->GetContentBounds(r);
*aInnerWidth = r.width;
NS_RELEASE(mBrowser);
}
@ -770,9 +770,9 @@ GlobalWindowImpl::SetInnerWidth(PRInt32 aInnerWidth)
if (NS_OK == GetBrowserWindowInterface(mBrowser)) {
nsRect r;
mBrowser->GetBounds(r);
mBrowser->GetContentBounds(r);
mBrowser->SizeTo(aInnerWidth, r.height);
mBrowser->SizeContentTo(aInnerWidth, r.height);
NS_RELEASE(mBrowser);
}
return NS_OK;
@ -785,7 +785,7 @@ GlobalWindowImpl::GetInnerHeight(PRInt32* aInnerHeight)
if (NS_OK == GetBrowserWindowInterface(mBrowser)) {
nsRect r;
mBrowser->GetBounds(r);
mBrowser->GetContentBounds(r);
*aInnerHeight = r.height;
NS_RELEASE(mBrowser);
}
@ -803,9 +803,9 @@ GlobalWindowImpl::SetInnerHeight(PRInt32 aInnerHeight)
if (NS_OK == GetBrowserWindowInterface(mBrowser)) {
nsRect r;
mBrowser->GetBounds(r);
mBrowser->GetContentBounds(r);
mBrowser->SizeTo(r.width, aInnerHeight);
mBrowser->SizeContentTo(r.width, aInnerHeight);
NS_RELEASE(mBrowser);
}
return NS_OK;
@ -838,7 +838,7 @@ GlobalWindowImpl::SetOuterWidth(PRInt32 aOuterWidth)
nsRect r;
mBrowser->GetWindowBounds(r);
mBrowser->SizeTo(aOuterWidth, r.height);
mBrowser->SizeWindowTo(aOuterWidth, r.height);
NS_RELEASE(mBrowser);
}
return NS_OK;
@ -871,7 +871,7 @@ GlobalWindowImpl::SetOuterHeight(PRInt32 aOuterHeight)
nsRect r;
mBrowser->GetWindowBounds(r);
mBrowser->SizeTo(r.width, aOuterHeight);
mBrowser->SizeWindowTo(r.width, aOuterHeight);
NS_RELEASE(mBrowser);
}
return NS_OK;
@ -1323,7 +1323,7 @@ GlobalWindowImpl::ResizeTo(PRInt32 aWidth, PRInt32 aHeight)
nsIBrowserWindow *mBrowser;
if (NS_OK == GetBrowserWindowInterface(mBrowser)) {
mBrowser->SizeTo(aWidth, aHeight);
mBrowser->SizeWindowTo(aWidth, aHeight);
NS_RELEASE(mBrowser);
}
return NS_OK;
@ -1338,7 +1338,7 @@ GlobalWindowImpl::ResizeBy(PRInt32 aWidthDif, PRInt32 aHeightDif)
nsRect r;
mBrowser->GetWindowBounds(r);
mBrowser->SizeTo(r.width + aWidthDif, r.height + aHeightDif);
mBrowser->SizeWindowTo(r.width + aWidthDif, r.height + aHeightDif);
NS_RELEASE(mBrowser);
}
return NS_OK;
@ -2066,12 +2066,20 @@ GlobalWindowImpl::SizeAndShowOpenedWebShell(nsIWebShell *aOuterShell, char *aFea
// set size
if (nsnull != openedWindow) {
if (nsnull != aFeatures) {
width = WinHasOption(aFeatures, "innerWidth") | WinHasOption(aFeatures, "width");
height = WinHasOption(aFeatures, "innerHeight") | WinHasOption(aFeatures, "height");
PRUint32 chromeFlags = CalculateChromeFlags(aFeatures);
PRBool openAsContent = ((chromeFlags & NS_CHROME_OPEN_AS_CHROME) == 0);
// width = WinHasOption(aFeatures, "outerWidth");
// height = WinHasOption(aFeatures, "outerHeight");
if (nsnull != aFeatures) {
if (openAsContent) {
width = WinHasOption(aFeatures, "innerWidth") | WinHasOption(aFeatures, "width");
height = WinHasOption(aFeatures, "innerHeight") | WinHasOption(aFeatures, "height");
}
else {
// Chrome. Look for outerWidth, outerHeight, or width/height
width = WinHasOption(aFeatures, "outerWidth") | WinHasOption(aFeatures, "width");
height = WinHasOption(aFeatures, "outerHeight") | WinHasOption(aFeatures, "height");
}
left = WinHasOption(aFeatures, "left") | WinHasOption(aFeatures, "screenX");
top = WinHasOption(aFeatures, "top") | WinHasOption(aFeatures, "screenY");
@ -2079,7 +2087,11 @@ GlobalWindowImpl::SizeAndShowOpenedWebShell(nsIWebShell *aOuterShell, char *aFea
// beard: don't resize/reposition the window if it is the same web shell.
if (aOuterShell != mWebShell) {
openedWindow->SizeTo(width ? width : defaultBounds.width, height ? height : defaultBounds.height);
if (openAsContent)
openedWindow->SizeContentTo(width ? width : defaultBounds.width, height ? height : defaultBounds.height);
else if (width > 0 || height > 0)
openedWindow->SizeWindowTo(width ? width : defaultBounds.width, height ? height : defaultBounds.height);
openedWindow->MoveTo(left ? left : defaultBounds.x, top ? top : defaultBounds.y);
openedWindow->Show();
}

Просмотреть файл

@ -72,7 +72,7 @@
#include "nsITransferable.h"
#include "nsIFormatConverter.h"
#include "nsIWebShell.h"
#include "nsIBrowserWindow.h"
// Drag & Drop, Clipboard Support
static NS_DEFINE_CID(kCClipboardCID, NS_CLIPBOARD_CID);
@ -896,6 +896,46 @@ PresShell::InitialReflow(nscoord aWidth, nscoord aHeight)
if (NS_OK == mRootFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
htmlReflow->Reflow(*mPresContext, desiredSize, reflowState, status);
mRootFrame->SizeTo(desiredSize.width, desiredSize.height);
if (maxSize.width == NS_UNCONSTRAINEDSIZE && maxSize.height == NS_UNCONSTRAINEDSIZE) {
// We were flowed intrinsically. Set our new visible area to our intrinsic
// size.
mPresContext->SetVisibleArea(nsRect(0,0,desiredSize.width, desiredSize.height));
// Provide our window with the hint that it needs to resize.
nsCOMPtr<nsIWebShell> webShell;
nsCOMPtr<nsISupports> container;
mPresContext->GetContainer(getter_AddRefs(container));
if (container) {
webShell = do_QueryInterface(container);
if (webShell) {
// Retrieve our container and see if it's a browser window.
nsCOMPtr<nsIWebShellContainer> rootContainer;
webShell->GetContainer(*getter_AddRefs(rootContainer));
if (rootContainer) {
nsCOMPtr<nsIBrowserWindow> browserWindow = do_QueryInterface(rootContainer);
if (browserWindow) {
PRInt32 chromeX,chromeY,chromeWidth,chromeHeight;
webShell->GetBounds(chromeX,chromeY,chromeWidth,chromeHeight);
float t2p;
mPresContext->GetTwipsToPixels(&t2p);
PRInt32 width = PRInt32((float)desiredSize.width*t2p);
PRInt32 height = PRInt32((float)desiredSize.height*t2p);
PRInt32 widthDelta = width - chromeWidth;
PRInt32 heightDelta = height - chromeHeight;
nsRect windowBounds;
browserWindow->GetWindowBounds(windowBounds);
browserWindow->SizeWindowTo(windowBounds.width + widthDelta,
windowBounds.height + heightDelta);
}
}
}
}
}
#ifdef NS_DEBUG
if (nsIFrame::GetVerifyTreeEnable()) {
mRootFrame->VerifyTree();

Просмотреть файл

@ -397,6 +397,8 @@ ViewportFrame::Reflow(nsIPresContext& aPresContext,
}
}
nsRect kidRect(0,0,aReflowState.availableWidth,aReflowState.availableHeight);
if (!isHandled) {
if ((eReflowReason_Incremental == aReflowState.reason) &&
(mFixedFrames.ContainsFrame(nextFrame))) {
@ -437,6 +439,7 @@ ViewportFrame::Reflow(nsIPresContext& aPresContext,
nsRect rect(0, 0, kidDesiredSize.width, kidDesiredSize.height);
kidFrame->SetRect(rect);
kidRect = rect;
// XXX We should resolve the details of who/when DidReflow()
// notifications are sent...
@ -452,11 +455,23 @@ ViewportFrame::Reflow(nsIPresContext& aPresContext,
}
}
// Return the max size as our desired size
aDesiredSize.width = aReflowState.availableWidth;
aDesiredSize.height = aReflowState.availableHeight;
aDesiredSize.ascent = aReflowState.availableHeight;
aDesiredSize.descent = 0;
// If we were flowed initially at both an unconstrained width and height,
// this is a hint that we should return our child's intrinsic size.
if (eReflowReason_Initial == aReflowState.reason &&
aReflowState.availableWidth == NS_UNCONSTRAINEDSIZE &&
aReflowState.availableHeight == NS_UNCONSTRAINEDSIZE) {
aDesiredSize.width = kidRect.width;
aDesiredSize.height = kidRect.height;
aDesiredSize.ascent = kidRect.height;
aDesiredSize.descent = 0;
}
else {
// Return the max size as our desired size
aDesiredSize.width = aReflowState.availableWidth;
aDesiredSize.height = aReflowState.availableHeight;
aDesiredSize.ascent = aReflowState.availableHeight;
aDesiredSize.descent = 0;
}
NS_FRAME_TRACE_REFLOW_OUT("ViewportFrame::Reflow", aStatus);
return NS_OK;

Просмотреть файл

@ -72,7 +72,7 @@
#include "nsITransferable.h"
#include "nsIFormatConverter.h"
#include "nsIWebShell.h"
#include "nsIBrowserWindow.h"
// Drag & Drop, Clipboard Support
static NS_DEFINE_CID(kCClipboardCID, NS_CLIPBOARD_CID);
@ -896,6 +896,46 @@ PresShell::InitialReflow(nscoord aWidth, nscoord aHeight)
if (NS_OK == mRootFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
htmlReflow->Reflow(*mPresContext, desiredSize, reflowState, status);
mRootFrame->SizeTo(desiredSize.width, desiredSize.height);
if (maxSize.width == NS_UNCONSTRAINEDSIZE && maxSize.height == NS_UNCONSTRAINEDSIZE) {
// We were flowed intrinsically. Set our new visible area to our intrinsic
// size.
mPresContext->SetVisibleArea(nsRect(0,0,desiredSize.width, desiredSize.height));
// Provide our window with the hint that it needs to resize.
nsCOMPtr<nsIWebShell> webShell;
nsCOMPtr<nsISupports> container;
mPresContext->GetContainer(getter_AddRefs(container));
if (container) {
webShell = do_QueryInterface(container);
if (webShell) {
// Retrieve our container and see if it's a browser window.
nsCOMPtr<nsIWebShellContainer> rootContainer;
webShell->GetContainer(*getter_AddRefs(rootContainer));
if (rootContainer) {
nsCOMPtr<nsIBrowserWindow> browserWindow = do_QueryInterface(rootContainer);
if (browserWindow) {
PRInt32 chromeX,chromeY,chromeWidth,chromeHeight;
webShell->GetBounds(chromeX,chromeY,chromeWidth,chromeHeight);
float t2p;
mPresContext->GetTwipsToPixels(&t2p);
PRInt32 width = PRInt32((float)desiredSize.width*t2p);
PRInt32 height = PRInt32((float)desiredSize.height*t2p);
PRInt32 widthDelta = width - chromeWidth;
PRInt32 heightDelta = height - chromeHeight;
nsRect windowBounds;
browserWindow->GetWindowBounds(windowBounds);
browserWindow->SizeWindowTo(windowBounds.width + widthDelta,
windowBounds.height + heightDelta);
}
}
}
}
}
#ifdef NS_DEBUG
if (nsIFrame::GetVerifyTreeEnable()) {
mRootFrame->VerifyTree();

Просмотреть файл

@ -397,6 +397,8 @@ ViewportFrame::Reflow(nsIPresContext& aPresContext,
}
}
nsRect kidRect(0,0,aReflowState.availableWidth,aReflowState.availableHeight);
if (!isHandled) {
if ((eReflowReason_Incremental == aReflowState.reason) &&
(mFixedFrames.ContainsFrame(nextFrame))) {
@ -437,6 +439,7 @@ ViewportFrame::Reflow(nsIPresContext& aPresContext,
nsRect rect(0, 0, kidDesiredSize.width, kidDesiredSize.height);
kidFrame->SetRect(rect);
kidRect = rect;
// XXX We should resolve the details of who/when DidReflow()
// notifications are sent...
@ -452,11 +455,23 @@ ViewportFrame::Reflow(nsIPresContext& aPresContext,
}
}
// Return the max size as our desired size
aDesiredSize.width = aReflowState.availableWidth;
aDesiredSize.height = aReflowState.availableHeight;
aDesiredSize.ascent = aReflowState.availableHeight;
aDesiredSize.descent = 0;
// If we were flowed initially at both an unconstrained width and height,
// this is a hint that we should return our child's intrinsic size.
if (eReflowReason_Initial == aReflowState.reason &&
aReflowState.availableWidth == NS_UNCONSTRAINEDSIZE &&
aReflowState.availableHeight == NS_UNCONSTRAINEDSIZE) {
aDesiredSize.width = kidRect.width;
aDesiredSize.height = kidRect.height;
aDesiredSize.ascent = kidRect.height;
aDesiredSize.descent = 0;
}
else {
// Return the max size as our desired size
aDesiredSize.width = aReflowState.availableWidth;
aDesiredSize.height = aReflowState.availableHeight;
aDesiredSize.ascent = aReflowState.availableHeight;
aDesiredSize.descent = 0;
}
NS_FRAME_TRACE_REFLOW_OUT("ViewportFrame::Reflow", aStatus);
return NS_OK;

Просмотреть файл

@ -276,8 +276,8 @@ nsMessenger::Open3PaneWindow()
getter_AddRefs(newWindow), // result widget
nsnull, // observer
nsnull, // callbacks
200, // width
200); // height
NS_SIZETOCONTENT, // width
NS_SIZETOCONTENT); // height
done:
NS_IF_RELEASE(url);
return NS_OK;

Просмотреть файл

@ -107,6 +107,7 @@
#include "rdfutil.h"
#include "rdf.h"
#include "nsIFrameReflow.h"
#include "nsIDOMXULFocusTracker.h"
#include "nsIXULFocusTracker.h"
#include "nsIDOMEventCapturer.h"
@ -3951,43 +3952,49 @@ XULDocumentImpl::StartLayout(void)
PRInt32 count = GetNumberOfShells();
for (PRInt32 i = 0; i < count; i++) {
nsIPresShell* shell = GetShellAt(i);
if (nsnull == shell)
continue;
nsIPresShell* shell = GetShellAt(i);
if (nsnull == shell)
continue;
// Resize-reflow this time
nsCOMPtr<nsIPresContext> cx;
shell->GetPresContext(getter_AddRefs(cx));
// Resize-reflow this time
nsCOMPtr<nsIPresContext> cx;
shell->GetPresContext(getter_AddRefs(cx));
if (cx) {
nsCOMPtr<nsISupports> container;
cx->GetContainer(getter_AddRefs(container));
if (container) {
nsCOMPtr<nsIWebShell> webShell;
webShell = do_QueryInterface(container);
if (webShell) {
webShell->SetScrolling(NS_STYLE_OVERFLOW_HIDDEN);
if (cx) {
nsCOMPtr<nsISupports> container;
cx->GetContainer(getter_AddRefs(container));
if (container) {
nsCOMPtr<nsIWebShell> webShell;
webShell = do_QueryInterface(container);
if (webShell) {
webShell->SetScrolling(NS_STYLE_OVERFLOW_HIDDEN);
}
}
}
}
}
nsRect r;
cx->GetVisibleArea(r);
shell->InitialReflow(r.width, r.height);
nsRect r;
cx->GetVisibleArea(r);
if (r.width == 0 || r.height == 0) {
// Flow at an unconstrained width and height
r.width = NS_UNCONSTRAINEDSIZE;
r.height = NS_UNCONSTRAINEDSIZE;
}
// Now trigger a refresh
nsCOMPtr<nsIViewManager> vm;
shell->GetViewManager(getter_AddRefs(vm));
if (vm) {
vm->EnableRefresh();
}
shell->InitialReflow(r.width, r.height);
// Start observing the document _after_ we do the initial
// reflow. Otherwise, we'll get into an trouble trying to
// create kids before the root frame is established.
shell->BeginObservingDocument();
// Now trigger a refresh
nsCOMPtr<nsIViewManager> vm;
shell->GetViewManager(getter_AddRefs(vm));
if (vm) {
vm->EnableRefresh();
}
NS_RELEASE(shell);
// Start observing the document _after_ we do the initial
// reflow. Otherwise, we'll get into an trouble trying to
// create kids before the root frame is established.
shell->BeginObservingDocument();
NS_RELEASE(shell);
}
return NS_OK;
}

Просмотреть файл

@ -65,10 +65,10 @@ public:
NS_IMETHOD MoveTo(PRInt32 aX, PRInt32 aY) = 0;
NS_IMETHOD SizeTo(PRInt32 aWidth, PRInt32 aHeight) = 0;
NS_IMETHOD GetBounds(nsRect& aResult) = 0;
NS_IMETHOD SizeWindowTo(PRInt32 aWidth, PRInt32 aHeight) = 0;
NS_IMETHOD SizeContentTo(PRInt32 aWidth, PRInt32 aHeight) = 0;
NS_IMETHOD GetContentBounds(nsRect& aResult) = 0;
NS_IMETHOD GetWindowBounds(nsRect& aResult) = 0;
NS_IMETHOD Show() = 0;

Просмотреть файл

@ -1526,7 +1526,7 @@ nsBrowserWindow::MoveTo(PRInt32 aX, PRInt32 aY)
}
NS_IMETHODIMP
nsBrowserWindow::SizeTo(PRInt32 aWidth, PRInt32 aHeight)
nsBrowserWindow::SizeContentTo(PRInt32 aWidth, PRInt32 aHeight)
{
NS_PRECONDITION(nsnull != mWindow, "null window");
@ -1538,7 +1538,13 @@ nsBrowserWindow::SizeTo(PRInt32 aWidth, PRInt32 aHeight)
}
NS_IMETHODIMP
nsBrowserWindow::GetBounds(nsRect& aBounds)
nsBrowserWindow::SizeWindowTo(PRInt32 aWidth, PRInt32 aHeight)
{
return SizeContentTo(aWidth, aHeight);
}
NS_IMETHODIMP
nsBrowserWindow::GetContentBounds(nsRect& aBounds)
{
mWindow->GetClientBounds(aBounds);
return NS_OK;
@ -1769,7 +1775,7 @@ nsBrowserWindow::NewWebShell(PRUint32 aChromeMask,
if (nsnull != browser)
{
nsRect bounds;
GetBounds(bounds);
GetContentBounds(bounds);
browser->SetApp(mApp);

Просмотреть файл

@ -87,8 +87,9 @@ public:
// nsIBrowserWindow
NS_IMETHOD MoveTo(PRInt32 aX, PRInt32 aY);
NS_IMETHOD SizeTo(PRInt32 aWidth, PRInt32 aHeight);
NS_IMETHOD GetBounds(nsRect& aBounds);
NS_IMETHOD SizeContentTo(PRInt32 aWidth, PRInt32 aHeight);
NS_IMETHOD SizeWindowTo(PRInt32 aWidth, PRInt32 aHeight);
NS_IMETHOD GetContentBounds(nsRect& aBounds);
NS_IMETHOD GetWindowBounds(nsRect& aBounds);
NS_IMETHOD Show();
NS_IMETHOD Hide();

Просмотреть файл

@ -300,15 +300,15 @@ nsWebCrawler::OnEndDocumentLoad(nsIDocumentLoader* loader,
if (mJiggleLayout) {
nsRect r;
mBrowser->GetBounds(r);
mBrowser->GetContentBounds(r);
nscoord oldWidth = r.width;
while (r.width > 100) {
r.width -= 10;
mBrowser->SizeTo(r.width, r.height);
mBrowser->SizeWindowTo(r.width, r.height);
}
while (r.width < oldWidth) {
r.width += 10;
mBrowser->SizeTo(r.width, r.height);
mBrowser->SizeWindowTo(r.width, r.height);
}
}

Просмотреть файл

@ -434,7 +434,7 @@ newWind(char* urlName)
nsCOMPtr<nsIWebShellWindow> newWindow;
appShell->CreateTopLevelWindow(nsnull, url, PR_TRUE, getter_AddRefs(newWindow),
nsnull, nsnull, 615, 480);
nsnull, nsnull, NS_SIZETOCONTENT, NS_SIZETOCONTENT);
NS_RELEASE(url);
@ -1537,7 +1537,7 @@ nsBrowserAppCore::NewWindow()
nsCOMPtr<nsIWebShellWindow> newWindow;
appShell->CreateTopLevelWindow(nsnull, url, PR_TRUE, getter_AddRefs(newWindow),
nsnull, nsnull, 615, 480);
nsnull, nsnull, NS_SIZETOCONTENT, NS_SIZETOCONTENT);
NS_RELEASE(url);
return NS_OK;

Просмотреть файл

@ -0,0 +1,509 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (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/
*
* 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.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is Netscape Communications
* Corporation. Portions created by Netscape are Copyright (C) 1998
* Netscape Communications Corporation. All Rights Reserved.
*/
#include "nsAppCoresManager.h"
#include "nsAppShellCIDs.h"
#include "nsIAppShellService.h"
#include "nsIDOMBaseAppCore.h"
#include "nsIDOMWindow.h"
#include "nsIScriptGlobalObject.h"
#include "nsIServiceManager.h"
#include "nsISupports.h"
#include "nsIURL.h"
#ifdef NECKO
#include "nsIIOService.h"
#include "nsIURL.h"
static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
#endif // NECKO
#include "nsIWebShell.h"
#include "nsIWebShellWindow.h"
#include "nsIWidget.h"
#include "nsDOMPropsCore.h"
#include "nsIDOMNode.h"
#include "nsIDOMNamedNodeMap.h"
//#include "nsIDOMNode.h"
//#include <iostream.h>
// Stuff to implement properties dialog.
#include "nsIDOMXULDocument.h"
#include "nsIDocumentViewer.h"
#include "nsIDOMHTMLImageElement.h"
#include "nsIContent.h"
#include "nsIDocument.h"
#include "nsIDOMWindow.h"
#include "nsIXULWindowCallbacks.h"
#include "nsIDocumentObserver.h"
#include "nsINameSpaceManager.h"
class nsIScriptContext;
static NS_DEFINE_IID(kAppShellServiceCID, NS_APPSHELL_SERVICE_CID);
static NS_DEFINE_IID(kIAppShellServiceIID, NS_IAPPSHELL_SERVICE_IID);
static NS_DEFINE_IID(kIDOMBaseAppCoreIID, NS_IDOMBASEAPPCORE_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kIDOMPropsCoreIID, NS_IDOMDOMPROPSCORE_IID);
/////////////////////////////////////////////////////////////////////////
// nsPropertiesDialog
/////////////////////////////////////////////////////////////////////////
// Note: This is only a temporary home for nsPropertiesDialog
// It will be moving to it's own component .h/.cpp file soon.
struct nsPropertiesDialog : public nsIXULWindowCallbacks,
nsIDocumentObserver {
// Declare implementation of ISupports stuff.
NS_DECL_ISUPPORTS
// Declare implementations of nsIXULWindowCallbacks interface functions.
NS_IMETHOD ConstructBeforeJavaScript(nsIWebShell *aWebShell);
NS_IMETHOD ConstructAfterJavaScript(nsIWebShell *aWebShell) { return NS_OK; }
// Declare implementations of nsIDocumentObserver functions.
NS_IMETHOD BeginUpdate(nsIDocument *aDocument) { return NS_OK; }
NS_IMETHOD EndUpdate(nsIDocument *aDocument) { return NS_OK; }
NS_IMETHOD BeginLoad(nsIDocument *aDocument) { return NS_OK; }
NS_IMETHOD EndLoad(nsIDocument *aDocument) { return NS_OK; }
NS_IMETHOD BeginReflow(nsIDocument *aDocument, nsIPresShell* aShell)
{ return NS_OK; }
NS_IMETHOD EndReflow(nsIDocument *aDocument, nsIPresShell* aShell)
{ return NS_OK; }
NS_IMETHOD ContentChanged(nsIDocument *aDocument,
nsIContent* aContent,
nsISupports* aSubContent) { return NS_OK; }
NS_IMETHOD ContentStatesChanged(nsIDocument* aDocument,
nsIContent* aContent1,
nsIContent* aContent2) { return NS_OK; }
// This one we care about; see implementation below.
NS_IMETHOD AttributeChanged(nsIDocument *aDocument,
nsIContent* aContent,
nsIAtom* aAttribute,
PRInt32 aHint);
NS_IMETHOD ContentAppended(nsIDocument *aDocument,
nsIContent* aContainer,
PRInt32 aNewIndexInContainer)
{ return NS_OK; }
NS_IMETHOD ContentInserted(nsIDocument *aDocument,
nsIContent* aContainer,
nsIContent* aChild,
PRInt32 aIndexInContainer) { return NS_OK; }
NS_IMETHOD ContentReplaced(nsIDocument *aDocument,
nsIContent* aContainer,
nsIContent* aOldChild,
nsIContent* aNewChild,
PRInt32 aIndexInContainer) { return NS_OK; }
NS_IMETHOD ContentRemoved(nsIDocument *aDocument,
nsIContent* aContainer,
nsIContent* aChild,
PRInt32 aIndexInContainer) { return NS_OK; }
NS_IMETHOD StyleSheetAdded(nsIDocument *aDocument,
nsIStyleSheet* aStyleSheet) { return NS_OK; }
NS_IMETHOD StyleSheetRemoved(nsIDocument *aDocument,
nsIStyleSheet* aStyleSheet) { return NS_OK; }
NS_IMETHOD StyleSheetDisabledStateChanged(nsIDocument *aDocument,
nsIStyleSheet* aStyleSheet,
PRBool aDisabled) { return NS_OK; }
NS_IMETHOD StyleRuleChanged(nsIDocument *aDocument,
nsIStyleSheet* aStyleSheet,
nsIStyleRule* aStyleRule,
PRInt32 aHint) { return NS_OK; }
NS_IMETHOD StyleRuleAdded(nsIDocument *aDocument,
nsIStyleSheet* aStyleSheet,
nsIStyleRule* aStyleRule) { return NS_OK; }
NS_IMETHOD StyleRuleRemoved(nsIDocument *aDocument,
nsIStyleSheet* aStyleSheet,
nsIStyleRule* aStyleRule) { return NS_OK; }
NS_IMETHOD DocumentWillBeDestroyed(nsIDocument *aDocument)
{ return NS_OK; }
// nsPropertiesDialog stuff
nsPropertiesDialog( nsIDOMNode *aNode );
virtual ~nsPropertiesDialog() {}
//void SetWindow( nsIWebShellWindow *aWindow );
private:
nsCOMPtr<nsIDOMNode> mNode;
//nsCOMPtr<nsIWebShell> mWebShell;
//nsCOMPtr<nsIWebShellWindow> mWindow;
static nsIAtom *kIdAtom;
}; // nsPropertiesDialog
nsIAtom *nsPropertiesDialog::kIdAtom = 0;
// Standard implementations of addref/release.
NS_IMPL_ADDREF( nsPropertiesDialog );
NS_IMPL_RELEASE( nsPropertiesDialog );
NS_IMETHODIMP
nsPropertiesDialog::QueryInterface(REFNSIID aIID,void** aInstancePtr)
{
if (aInstancePtr == NULL) {
return NS_ERROR_NULL_POINTER;
}
// Always NULL result, in case of failure
*aInstancePtr = NULL;
if (aIID.Equals(nsIDocumentObserver::GetIID())) {
*aInstancePtr = (void*) ((nsIDocumentObserver*)this);
NS_ADDREF_THIS();
return NS_OK;
}
if (aIID.Equals(nsIXULWindowCallbacks::GetIID())) {
*aInstancePtr = (void*) ((nsIXULWindowCallbacks*)this);
NS_ADDREF_THIS();
return NS_OK;
}
return NS_ERROR_NO_INTERFACE;
}
// ctor
nsPropertiesDialog::nsPropertiesDialog( nsIDOMNode *aNode )
: mNode( nsDontQueryInterface<nsIDOMNode>(aNode) ) {
// Initialize ref count.
NS_INIT_REFCNT();
// Initialize static atoms.
static PRBool initialized = 0;
if ( !initialized ) {
kIdAtom = NS_NewAtom("id");
initialized = 1;
}
}
static nsresult setAttribute( nsIWebShell *shell,
const char *id,
const nsString &name,
const nsString &value ) {
nsresult rv = NS_OK;
nsCOMPtr<nsIContentViewer> cv;
rv = shell->GetContentViewer(getter_AddRefs(cv));
if ( cv ) {
// Up-cast.
nsCOMPtr<nsIDocumentViewer> docv(do_QueryInterface(cv));
if ( docv ) {
// Get the document from the doc viewer.
nsCOMPtr<nsIDocument> doc;
rv = docv->GetDocument(*getter_AddRefs(doc));
if ( doc ) {
// Up-cast.
nsCOMPtr<nsIDOMXULDocument> xulDoc( do_QueryInterface(doc) );
if ( xulDoc ) {
// Find specified element.
nsCOMPtr<nsIDOMElement> elem;
rv = xulDoc->GetElementById( id, getter_AddRefs(elem) );
if ( elem ) {
// Set the text attribute.
rv = elem->SetAttribute( name, value );
if ( rv != NS_OK ) {
}
}
}
}
}
}
return rv;
}
// Do startup stuff from C++ side.
NS_IMETHODIMP
nsPropertiesDialog::ConstructBeforeJavaScript(nsIWebShell *aWebShell) {
nsresult rv = NS_OK;
// Save web shell pointer.
//mWebShell = nsDontQueryInterface<nsIWebShell>( aWebShell );
// Store attributes of propeties node into dialog's DOM.
nsIDOMNamedNodeMap* map;
nsresult result = mNode->GetAttributes(&map);
if (NS_OK == result) {
nsIDOMNode *node;
PRUint32 attr_count;
result = map->GetLength(&attr_count);
if (NS_OK == result) {
for (PRUint32 ii=0; ii<attr_count; ii++) {
result = map->Item(ii,&node);
if (NS_OK == result) {
nsString name;
result = node->GetNodeName(name);
if (NS_OK == result) {
nsString value;
result = node->GetNodeValue(value);
if (NS_OK == result) {
if (name == "id") {
name = "url";
}
setAttribute( aWebShell, "properties_node", name, value );
//cout << "BM Props: " << "name=" << name << " value=" << value << endl;
}
}
NS_RELEASE(node);
}
}
}
NS_RELEASE(map);
}
// Add as observer of the xul document.
nsCOMPtr<nsIContentViewer> cv;
rv = aWebShell->GetContentViewer(getter_AddRefs(cv));
if ( cv ) {
// Up-cast.
nsCOMPtr<nsIDocumentViewer> docv(do_QueryInterface(cv));
if ( docv ) {
// Get the document from the doc viewer.
nsCOMPtr<nsIDocument> doc;
rv = docv->GetDocument(*getter_AddRefs(doc));
if ( doc ) {
doc->AddObserver( this );
}
}
}
// Trigger dialog startup code.
setAttribute( aWebShell, "dialog.start", "ready", "true" );
return rv;
}
// Handle attribute changing; we only care about the element "data.execute"
// which is used to signal command execution from the UI.
NS_IMETHODIMP
nsPropertiesDialog::AttributeChanged( nsIDocument *aDocument,
nsIContent* aContent,
nsIAtom* aAttribute,
PRInt32 aHint ) {
nsresult rv = NS_OK;
nsString id;
aContent->GetAttribute( kNameSpaceID_None, kIdAtom, id );
if ( id == "properties_node" ) {
//cout << "BM properties node changed" << endl;
nsIDOMNamedNodeMap* map;
nsresult result = mNode->GetAttributes(&map);
if (NS_OK == result) {
nsIDOMNode *attr_node;
PRUint32 attr_count;
result = map->GetLength(&attr_count);
if (NS_OK == result) {
for (PRUint32 ii=0; ii<attr_count; ii++) {
result = map->Item(ii,&attr_node);
if (NS_OK == result) {
nsString name;
result = attr_node->GetNodeName(name);
if (NS_OK == result && name != "id") {
nsString attr;
nsIAtom *atom = NS_NewAtom(name);
aContent->GetAttribute( kNameSpaceID_None, atom, attr );
//cerr << "BM Props: name=" << name << " value=" << attr << " (setting)" << endl;
attr_node->SetNodeValue(attr);
//attr_node->SetNodeValue("something");
NS_RELEASE(atom);
}
NS_RELEASE(attr_node);
}
}
}
NS_RELEASE(map);
}
}
return rv;
}
/////////////////////////////////////////////////////////////////////////
// nsDOMPropsCore
/////////////////////////////////////////////////////////////////////////
nsDOMPropsCore::nsDOMPropsCore() {
printf("Created nsDOMPropsCore\n");
IncInstanceCount();
NS_INIT_REFCNT();
}
nsDOMPropsCore::~nsDOMPropsCore() {
DecInstanceCount();
}
NS_IMPL_ADDREF_INHERITED(nsDOMPropsCore, nsBaseAppCore)
NS_IMPL_RELEASE_INHERITED(nsDOMPropsCore, nsBaseAppCore)
NS_IMETHODIMP
nsDOMPropsCore::QueryInterface(REFNSIID aIID, void** aInstancePtr) {
if (aInstancePtr == NULL)
return NS_ERROR_NULL_POINTER;
*aInstancePtr = NULL;
if (aIID.Equals(kIDOMPropsCoreIID)) {
*aInstancePtr = (void*) ((nsIDOMDOMPropsCore*) this);
AddRef();
return NS_OK;
}
return nsBaseAppCore::QueryInterface(aIID, aInstancePtr);
}
NS_IMETHODIMP
nsDOMPropsCore::GetScriptObject(nsIScriptContext *aContext, void** aScriptObject) {
nsresult rv = NS_OK;
NS_PRECONDITION(aScriptObject != nsnull, "null arg");
if (mScriptObject == nsnull) {
nsISupports *core;
rv = QueryInterface(kISupportsIID, (void **)&core);
if (NS_SUCCEEDED(rv)) {
rv = NS_NewScriptDOMPropsCore(aContext,
(nsISupports *) core,
nsnull,
&mScriptObject);
NS_RELEASE(core);
}
}
*aScriptObject = mScriptObject;
return rv;
}
NS_IMETHODIMP
nsDOMPropsCore::Init(const nsString& aId) {
nsresult rv;
nsBaseAppCore::Init(aId);
nsIDOMBaseAppCore *core;
rv = QueryInterface(kIDOMBaseAppCoreIID, (void **)&core);
if (NS_SUCCEEDED(rv)) {
nsAppCoresManager* sdm = new nsAppCoresManager();
if (sdm) {
sdm->Add(core);
delete sdm;
return NS_OK;
} else
rv = NS_ERROR_OUT_OF_MEMORY;
NS_RELEASE(core);
}
return rv;
}
NS_IMETHODIMP
nsDOMPropsCore::GetNode(nsIDOMNode** aNode) {
nsresult err = NS_OK;
return err;
}
NS_IMETHODIMP
nsDOMPropsCore::SetNode(nsIDOMNode* aNode) {
nsresult err = NS_OK;
return err;
}
NS_IMETHODIMP
nsDOMPropsCore::ShowProperties(const nsString& aUrl, nsIDOMWindow* aParent, nsIDOMNode* aNode) {
nsresult rv;
nsIAppShellService *appShell;
nsCOMPtr<nsIURI> urlObj;
#ifndef NECKO
rv = NS_NewURL(getter_AddRefs(urlObj), aUrl);
#else
NS_WITH_SERVICE(nsIIOService, service, kIOServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsIURI *uri = nsnull;
const char *uriStr = aUrl.GetBuffer();
rv = service->NewURI(uriStr, nsnull, &uri);
if (NS_FAILED(rv)) return rv;
rv = uri->QueryInterface(nsIURI::GetIID(), (void**)&urlObj);
NS_RELEASE(uri);
#endif // NECKO
if (NS_FAILED(rv))
return rv;
rv = nsServiceManager::GetService(kAppShellServiceCID, kIAppShellServiceIID,
(nsISupports**) &appShell);
if (NS_FAILED(rv))
return rv;
nsPropertiesDialog *dialog = new nsPropertiesDialog(aNode);
nsCOMPtr<nsIWebShellWindow> parent = DOMWindowToWebShellWindow(aParent);
nsCOMPtr<nsIWebShellWindow> newWindow;
rv = appShell->CreateTopLevelWindow(parent, urlObj, PR_TRUE, getter_AddRefs(newWindow),
nsnull, dialog, NS_SIZETOCONTENT, NS_SIZETOCONTENT);
nsServiceManager::ReleaseService(kAppShellServiceCID, appShell);
return rv;
}
NS_IMETHODIMP
nsDOMPropsCore::Commit() {
nsresult rv = NS_OK;
return rv;
}
NS_IMETHODIMP
nsDOMPropsCore::Cancel() {
nsresult rv = NS_OK;
return rv;
}
// horribly complicated routine to simply convert from one to the other
nsCOMPtr<nsIWebShellWindow>
nsDOMPropsCore::DOMWindowToWebShellWindow(nsIDOMWindow *DOMWindow) const {
nsCOMPtr<nsIWebShellWindow> webWindow;
nsCOMPtr<nsIScriptGlobalObject> globalScript(do_QueryInterface(DOMWindow));
nsCOMPtr<nsIWebShell> webshell;
if (globalScript)
globalScript->GetWebShell(getter_AddRefs(webshell));
if (webshell) {
nsCOMPtr<nsIWebShellContainer> webshellContainer;
webshell->GetContainer(*getter_AddRefs(webshellContainer));
webWindow = do_QueryInterface(webshellContainer);
}
return webWindow;
}

Просмотреть файл

@ -214,7 +214,7 @@ nsToolkitCore::ShowWindow(const nsString& aUrl, nsIDOMWindow* aParent) {
DOMWindowToWebShellWindow(aParent, &parent);
nsCOMPtr<nsIWebShellWindow> window;
appShell->CreateTopLevelWindow(parent, urlObj, PR_TRUE, getter_AddRefs(window),
nsnull, nsnull, 615, 480);
nsnull, nsnull, NS_SIZETOCONTENT, NS_SIZETOCONTENT);
if (window)
window->Show(PR_TRUE);
@ -339,7 +339,7 @@ nsToolkitCore::ShowWindowWithArgs(const nsString& aUrl,
nsCOMPtr<nsIWebShellWindow> window;
appShell->CreateTopLevelWindow(parent, urlObj, PR_TRUE, getter_AddRefs(window),
nsnull, cb, 615, 650);
nsnull, cb, NS_SIZETOCONTENT, NS_SIZETOCONTENT);
if (window)
window->Show(PR_TRUE);

Просмотреть файл

@ -35,6 +35,8 @@ interface nsICmdLineService;
struct PRThread;
class nsIFactory;
#define NS_SIZETOCONTENT -1
// e5e5af70-8a38-11d2-9938-0080c7cb1080
#define NS_IAPPSHELL_SERVICE_IID \
{ 0xe5e5af70, 0x8a38, 0x11d2, \

Просмотреть файл

@ -496,9 +496,18 @@ nsAppShellService::CreateTopLevelWindow(nsIWebShellWindow *aParent,
nsWidgetInitData widgetInitData;
widgetInitData.mBorderStyle = eBorderStyle_window;
if (aInitialWidth == NS_SIZETOCONTENT ||
aInitialHeight == NS_SIZETOCONTENT) {
aInitialWidth = 0;
aInitialHeight = 0;
showWindow = PR_FALSE; // Don't show until we have the intrinsic size figured out.
window->SetIntrinsicallySized(PR_TRUE);
}
rv = window->Initialize((nsIWebShellWindow *) nsnull, mAppShell, aUrl,
anObserver, aCallbacks,
aInitialWidth, aInitialHeight, widgetInitData);
if (NS_SUCCEEDED(rv))
{
// this does the AddRef of the return value
@ -547,6 +556,14 @@ nsAppShellService::CreateDialogWindow(nsIWebShellWindow * aParent,
nsWidgetInitData widgetInitData;
widgetInitData.mBorderStyle = eBorderStyle_window;
if (aInitialWidth == NS_SIZETOCONTENT ||
aInitialHeight == NS_SIZETOCONTENT) {
aInitialWidth = 0;
aInitialHeight = 0;
showWindow = PR_FALSE; // Don't show until we have the intrinsic size figured out.
window->SetIntrinsicallySized(PR_TRUE);
}
rv = window->Initialize((nsIWebShellWindow *) nsnull, mAppShell, aUrl,
anObserver, aCallbacks,
aInitialWidth, aInitialHeight, widgetInitData);

Просмотреть файл

@ -1009,7 +1009,7 @@ nsIWebShellWindow* FindWebShellWindow(nsIXULWindowCallbacks* inCallbacks)
&aWindow,
nsnull,
inCallbacks, // callbacks
windowWidth, windowHeight);
NS_SIZETOCONTENT, NS_SIZETOCONTENT);
if (NS_FAILED(rv))
return nsnull;
return aWindow;

Просмотреть файл

@ -205,6 +205,7 @@ nsWebShellWindow::nsWebShellWindow()
mLockedUntilChromeLoad = PR_FALSE;
mContentShells = nsnull;
mChromeMask = NS_CHROME_ALL_CHROME;
mIntrinsicallySized = PR_FALSE;
}
@ -1375,7 +1376,7 @@ nsWebShellWindow::NewWebShell(PRUint32 aChromeMask, PRBool aVisible,
// Just do a nice normal create of a web shell and
// return it immediately.
rv = appShell->CreateTopLevelWindow(nsnull, nsnull, PR_FALSE, getter_AddRefs(newWindow),
nsnull, nsnull, 615, 480);
nsnull, nsnull, NS_SIZETOCONTENT, NS_SIZETOCONTENT);
if (NS_SUCCEEDED(rv)) {
nsCOMPtr<nsIBrowserWindow> browser(do_QueryInterface(newWindow));
if (browser)
@ -1777,44 +1778,9 @@ nsWebShellWindow::OnEndDocumentLoad(nsIDocumentLoader* loader,
SetTitleFromXUL();
ShowAppropriateChrome();
LoadContentAreas();
#if 0
nsCOMPtr<nsIDOMDocument> toolbarDOMDoc(GetNamedDOMDoc(nsAutoString("browser.toolbar")));
nsCOMPtr<nsIDOMDocument> contentDOMDoc(GetNamedDOMDoc(nsAutoString("browser.webwindow")));
nsCOMPtr<nsIDocument> contentDoc(do_QueryInterface(contentDOMDoc));
nsCOMPtr<nsIDocument> statusDoc(do_QueryInterface(statusDOMDoc));
nsCOMPtr<nsIDocument> toolbarDoc(do_QueryInterface(toolbarDOMDoc));
nsIWebShell* statusWebShell = nsnull;
mWebShell->FindChildWithName(nsAutoString("browser.status"), statusWebShell);
PRInt32 actualStatusHeight = GetDocHeight(statusDoc);
PRInt32 actualToolbarHeight = GetDocHeight(toolbarDoc);
PRInt32 height = 0;
PRInt32 x,y,w,h;
PRInt32 contentHeight;
PRInt32 toolbarHeight;
PRInt32 statusHeight;
mWebShell->GetBounds(x, y, w, h);
toolbarWebShell->GetBounds(x, y, w, toolbarHeight);
contentWebShell->GetBounds(x, y, w, contentHeight);
statusWebShell->GetBounds(x, y, w, statusHeight);
//h = toolbarHeight + contentHeight + statusHeight;
contentHeight = h - actualStatusHeight - actualToolbarHeight;
toolbarWebShell->GetBounds(x, y, w, h);
toolbarWebShell->SetBounds(x, y, w, actualToolbarHeight);
contentWebShell->GetBounds(x, y, w, h);
contentWebShell->SetBounds(x, y, w, contentHeight);
statusWebShell->GetBounds(x, y, w, h);
statusWebShell->SetBounds(x, y, w, actualStatusHeight);
#endif
// Always show the window at this point.
mWindow->Show(PR_TRUE);
return NS_OK;
}
@ -2213,26 +2179,11 @@ void nsWebShellWindow::SetSizeFromXUL()
specWidth = specSize;
}
if (specWidth != currentSize.width || specHeight != currentSize.height)
if (specWidth != currentSize.width || specHeight != currentSize.height) {
windowWidget->Resize(specWidth, specHeight, PR_TRUE);
#if 0
// adjust height to fit contents?
if (fitHeight == PR_TRUE) {
nsCOMPtr<nsIContentViewer> cv;
mWebShell->GetContentViewer(getter_AddRefs(cv));
if (cv) {
nsCOMPtr<nsIDocumentViewer> docv(do_QueryInterface(cv));
if (docv) {
nsCOMPtr<nsIDocument> doc;
docv->GetDocument(*getter_AddRefs(doc));
if (doc)
specHeight = GetDocHeight(doc);
}
}
mWindow->GetBounds(currentSize);
mIntrinsicallySized = PR_FALSE;
}
#endif
} // SetSizeFromXUL
@ -2610,17 +2561,50 @@ NS_IMETHODIMP nsWebShellWindow::MoveTo(PRInt32 aX, PRInt32 aY)
return NS_OK;
}
NS_IMETHODIMP nsWebShellWindow::SizeTo(PRInt32 aWidth, PRInt32 aHeight)
NS_IMETHODIMP nsWebShellWindow::SizeWindowTo(PRInt32 aWidth, PRInt32 aHeight)
{
// XXX We have to look at the delta between our content shell's
// size and the size passed in and then resize ourselves based on that
// delta.
mIntrinsicallySized = PR_FALSE; // We got changed. No more intrinsic sizing here.
mWindow->Resize(aWidth, aHeight, PR_TRUE);
return NS_OK;
}
NS_IMETHODIMP nsWebShellWindow::GetBounds(nsRect& aResult)
NS_IMETHODIMP nsWebShellWindow::SizeContentTo(PRInt32 aWidth, PRInt32 aHeight)
{
mWindow->GetClientBounds(aResult);
PRInt32 x,y,width,height;
mWebShell->GetBounds(x,y,width,height);
PRInt32 aWidthDelta = aWidth - width;
PRInt32 aHeightDelta = aHeight - height;
nsRect windowBounds;
mWindow->GetBounds(windowBounds);
mWindow->Resize(windowBounds.width + aWidthDelta,
windowBounds.height + aHeightDelta,
PR_TRUE);
return NS_OK;
}
NS_IMETHODIMP nsWebShellWindow::GetContentBounds(nsRect& aResult)
{
// Should return the size of the content webshell.
nsCOMPtr<nsIWebShell> contentShell;
GetContentWebShell(getter_AddRefs(contentShell));
if (!contentShell) {
NS_ERROR("Attempt to retrieve the content bounds for a window with no content.");
return NS_ERROR_FAILURE;
}
PRInt32 x,y,width,height;
contentShell->GetBounds(x,y,width,height);
aResult.x = x;
aResult.y = y;
aResult.width = width;
aResult.height = height;
return NS_OK;
}
NS_IMETHODIMP nsWebShellWindow::GetWindowBounds(nsRect& aResult)
{

Просмотреть файл

@ -125,6 +125,8 @@ public:
nsWidgetInitData& widgetInitData);
nsIWidget* GetWidget(void) { return mWindow; }
void SetIntrinsicallySized(PRBool isIntrinsicallySized) { mIntrinsicallySized = isIntrinsicallySized; };
void DoContextMenu(
nsMenuEvent * aMenuEvent,
nsIDOMNode * aMenuNode,
@ -224,8 +226,9 @@ public:
PRUint32 aChromeMask,
PRBool aAllowPlugins = PR_TRUE);
NS_IMETHOD MoveTo(PRInt32 aX, PRInt32 aY);
NS_IMETHOD SizeTo(PRInt32 aWidth, PRInt32 aHeight);
NS_IMETHOD GetBounds(nsRect& aResult);
NS_IMETHOD SizeContentTo(PRInt32 aWidth, PRInt32 aHeight);
NS_IMETHOD SizeWindowTo(PRInt32 aWidth, PRInt32 aHeight);
NS_IMETHOD GetContentBounds(nsRect& aResult);
NS_IMETHOD GetWindowBounds(nsRect& aResult);
NS_IMETHOD Show() { Show(PR_TRUE); return NS_OK; }
NS_IMETHOD Hide() { Show(PR_FALSE); return NS_OK; }
@ -285,6 +288,9 @@ protected:
nsIDOMNode * contextMenuTest;
nsString mStatus;
PRBool mIntrinsicallySized; // Whether or not this window gets sized to its content.
private:
static void * HandleModalDialogEvent(PLEvent *aEvent);

Просмотреть файл

@ -614,7 +614,7 @@ int main(int argc, char* argv[])
nsCOMPtr<nsIWebShellWindow> profWindow;
rv = profAppShell->CreateTopLevelWindow(nsnull, profURL, PR_TRUE, getter_AddRefs(profWindow),
nsnull, nsnull, profWinWidth, profWinHeight);
nsnull, nsnull, NS_SIZETOCONTENT, NS_SIZETOCONTENT);
NS_RELEASE(profURL);
@ -643,7 +643,7 @@ int main(int argc, char* argv[])
if ( !useArgs ) {
nsCOMPtr<nsIWebShellWindow> newWindow;
rv = appShell->CreateTopLevelWindow(nsnull, url, PR_TRUE, getter_AddRefs(newWindow),
nsnull, nsnull, widthVal, heightVal);
nsnull, nsnull, NS_SIZETOCONTENT, NS_SIZETOCONTENT);
} else {
nsIDOMToolkitCore* toolkit = nsnull;
rv = nsServiceManager::GetService(kToolkitCoreCID,

Просмотреть файл

@ -262,7 +262,7 @@ Contributor(s): ______________________________________. -->
<!-- Statusbar -->
<!ENTITY notifCom.label "[Notification Component]">
<!ENTITY statusText.label "Document: Done">
<!ENTITY buildId.label "Build ID: 1999062312">
<!ENTITY buildId.label "Build ID: 1999070317">
<!ENTITY security-button.label "Secure Conn">
<!-- taskbar -->

Просмотреть файл

@ -1009,7 +1009,7 @@ nsIWebShellWindow* FindWebShellWindow(nsIXULWindowCallbacks* inCallbacks)
&aWindow,
nsnull,
inCallbacks, // callbacks
windowWidth, windowHeight);
NS_SIZETOCONTENT, NS_SIZETOCONTENT);
if (NS_FAILED(rv))
return nsnull;
return aWindow;