2007-03-22 10:30:00 -07:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
|
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
|
|
*
|
|
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
* the License. You may obtain a copy of the License at
|
|
|
|
* http://www.mozilla.org/MPL/
|
|
|
|
*
|
|
|
|
* 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 the Initial Developer are Copyright (C) 1998
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s):
|
|
|
|
* Pierre Phaneuf <pp@ludusdesign.com>
|
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
|
|
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
|
|
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
* the provisions above, a recipient may use your version of this file under
|
|
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
|
|
*
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
|
|
|
|
|
|
|
|
#include "nsWebShellWindow.h"
|
|
|
|
|
|
|
|
#include "nsLayoutCID.h"
|
|
|
|
#include "nsContentCID.h"
|
|
|
|
#include "nsIWeakReference.h"
|
|
|
|
|
|
|
|
#include "nsIComponentManager.h"
|
|
|
|
#include "nsIServiceManager.h"
|
|
|
|
#include "nsIURL.h"
|
|
|
|
#include "nsIIOService.h"
|
|
|
|
#include "nsIURL.h"
|
|
|
|
#include "nsNetCID.h"
|
|
|
|
#include "nsIStringBundle.h"
|
|
|
|
#include "nsReadableUtils.h"
|
|
|
|
|
|
|
|
#include "nsEscape.h"
|
|
|
|
#include "nsPIDOMWindow.h"
|
|
|
|
#include "nsIDOMEventTarget.h"
|
|
|
|
#include "nsIPrivateDOMEvent.h"
|
|
|
|
#include "nsIEventListenerManager.h"
|
|
|
|
#include "nsIDOMFocusListener.h"
|
|
|
|
#include "nsIWebNavigation.h"
|
|
|
|
#include "nsIWindowWatcher.h"
|
|
|
|
|
|
|
|
#include "nsIDOMXULElement.h"
|
|
|
|
|
|
|
|
#include "nsGUIEvent.h"
|
|
|
|
#include "nsWidgetsCID.h"
|
|
|
|
#include "nsIWidget.h"
|
|
|
|
#include "nsIAppShell.h"
|
|
|
|
|
|
|
|
#include "nsIAppShellService.h"
|
|
|
|
|
|
|
|
#include "nsIDOMCharacterData.h"
|
|
|
|
#include "nsIDOMNodeList.h"
|
|
|
|
|
|
|
|
#include "nsITimer.h"
|
2007-11-28 12:18:11 -08:00
|
|
|
#include "nsXULPopupManager.h"
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
#include "prmem.h"
|
|
|
|
|
|
|
|
#include "nsIDOMXULDocument.h"
|
|
|
|
|
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 11:00:39 -07:00
|
|
|
#include "nsFocusManager.h"
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
#include "nsIWebProgress.h"
|
|
|
|
#include "nsIWebProgressListener.h"
|
|
|
|
|
|
|
|
#include "nsIDocumentViewer.h"
|
|
|
|
#include "nsIDocument.h"
|
|
|
|
#include "nsIDOMDocument.h"
|
|
|
|
#include "nsIDOMNode.h"
|
|
|
|
#include "nsIDOMElement.h"
|
|
|
|
#include "nsIDocumentLoaderFactory.h"
|
|
|
|
#include "nsIObserverService.h"
|
|
|
|
#include "prprf.h"
|
|
|
|
|
2010-10-08 11:51:50 -07:00
|
|
|
#include "nsIScreenManager.h"
|
|
|
|
#include "nsIScreen.h"
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
#include "nsIContent.h" // for menus
|
|
|
|
|
|
|
|
// For calculating size
|
|
|
|
#include "nsIFrame.h"
|
|
|
|
#include "nsIPresShell.h"
|
|
|
|
#include "nsPresContext.h"
|
|
|
|
|
|
|
|
#include "nsIBaseWindow.h"
|
|
|
|
#include "nsIDocShellTreeItem.h"
|
|
|
|
#include "nsIDocShellTreeNode.h"
|
|
|
|
|
|
|
|
#include "nsIMarkupDocumentViewer.h"
|
|
|
|
|
2008-06-28 00:55:30 -07:00
|
|
|
#ifdef XP_MACOSX
|
|
|
|
#include "nsINativeMenuService.h"
|
2007-03-22 10:30:00 -07:00
|
|
|
#define USE_NATIVE_MENUS
|
|
|
|
#endif
|
|
|
|
|
Rollup of bug 645263 and bug 646259: Switch to mozilla:: sync primitives. r=cjones,dbaron,doublec,ehsan src=bsmedberg
Bug 645263, part 0: Count sync primitive ctor/dtors. r=dbaron
Bug 645263, part 1: Migrate content/media to mozilla:: sync primitives. r=doublec
Bug 645263, part 2: Migrate modules/plugin to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 3: Migrate nsComponentManagerImpl to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 4: Migrate everything else to mozilla:: sync primitives. r=dbaron
Bug 645263, part 5: Remove nsAutoLock.*. sr=bsmedberg
Bug 645263, part 6: Make editor test be nicer to deadlock detector. r=ehsan
Bug 645263, part 7: Disable tracemalloc backtraces for xpcshell tests. r=dbaron
Bug 646259: Fix nsCacheService to use a CondVar for notifying. r=cjones
2011-03-31 21:29:02 -07:00
|
|
|
using namespace mozilla;
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
/* Define Class IDs */
|
|
|
|
static NS_DEFINE_CID(kWindowCID, NS_WINDOW_CID);
|
|
|
|
|
|
|
|
#define SIZE_PERSISTENCE_TIMEOUT 500 // msec
|
|
|
|
|
2009-08-14 04:00:44 -07:00
|
|
|
nsWebShellWindow::nsWebShellWindow(PRUint32 aChromeFlags)
|
|
|
|
: nsXULWindow(aChromeFlags)
|
Rollup of bug 645263 and bug 646259: Switch to mozilla:: sync primitives. r=cjones,dbaron,doublec,ehsan src=bsmedberg
Bug 645263, part 0: Count sync primitive ctor/dtors. r=dbaron
Bug 645263, part 1: Migrate content/media to mozilla:: sync primitives. r=doublec
Bug 645263, part 2: Migrate modules/plugin to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 3: Migrate nsComponentManagerImpl to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 4: Migrate everything else to mozilla:: sync primitives. r=dbaron
Bug 645263, part 5: Remove nsAutoLock.*. sr=bsmedberg
Bug 645263, part 6: Make editor test be nicer to deadlock detector. r=ehsan
Bug 645263, part 7: Disable tracemalloc backtraces for xpcshell tests. r=dbaron
Bug 646259: Fix nsCacheService to use a CondVar for notifying. r=cjones
2011-03-31 21:29:02 -07:00
|
|
|
, mSPTimerLock("nsWebShellWindow.mSPTimerLock")
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
nsWebShellWindow::~nsWebShellWindow()
|
|
|
|
{
|
2008-07-18 08:54:12 -07:00
|
|
|
if (mWindow) {
|
2007-03-22 10:30:00 -07:00
|
|
|
mWindow->SetClientData(0);
|
2008-07-18 08:54:12 -07:00
|
|
|
mWindow->Destroy();
|
|
|
|
mWindow = nsnull; // Force release here.
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
|
Rollup of bug 645263 and bug 646259: Switch to mozilla:: sync primitives. r=cjones,dbaron,doublec,ehsan src=bsmedberg
Bug 645263, part 0: Count sync primitive ctor/dtors. r=dbaron
Bug 645263, part 1: Migrate content/media to mozilla:: sync primitives. r=doublec
Bug 645263, part 2: Migrate modules/plugin to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 3: Migrate nsComponentManagerImpl to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 4: Migrate everything else to mozilla:: sync primitives. r=dbaron
Bug 645263, part 5: Remove nsAutoLock.*. sr=bsmedberg
Bug 645263, part 6: Make editor test be nicer to deadlock detector. r=ehsan
Bug 645263, part 7: Disable tracemalloc backtraces for xpcshell tests. r=dbaron
Bug 646259: Fix nsCacheService to use a CondVar for notifying. r=cjones
2011-03-31 21:29:02 -07:00
|
|
|
MutexAutoLock lock(mSPTimerLock);
|
|
|
|
if (mSPTimer)
|
|
|
|
mSPTimer->Cancel();
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMPL_ADDREF_INHERITED(nsWebShellWindow, nsXULWindow)
|
|
|
|
NS_IMPL_RELEASE_INHERITED(nsWebShellWindow, nsXULWindow)
|
|
|
|
|
|
|
|
NS_INTERFACE_MAP_BEGIN(nsWebShellWindow)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener)
|
|
|
|
NS_INTERFACE_MAP_END_INHERITING(nsXULWindow)
|
|
|
|
|
|
|
|
nsresult nsWebShellWindow::Initialize(nsIXULWindow* aParent,
|
2009-09-28 19:20:46 -07:00
|
|
|
nsIXULWindow* aOpener,
|
|
|
|
nsIAppShell* aShell, nsIURI* aUrl,
|
2007-03-22 10:30:00 -07:00
|
|
|
PRInt32 aInitialWidth,
|
|
|
|
PRInt32 aInitialHeight,
|
|
|
|
PRBool aIsHiddenWindow,
|
|
|
|
nsWidgetInitData& widgetInitData)
|
|
|
|
{
|
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIWidget> parentWidget;
|
|
|
|
|
|
|
|
mIsHiddenWindow = aIsHiddenWindow;
|
2009-09-28 19:20:46 -07:00
|
|
|
|
2010-10-08 11:51:50 -07:00
|
|
|
PRInt32 initialX = 0, initialY = 0;
|
2009-09-28 19:20:46 -07:00
|
|
|
nsCOMPtr<nsIBaseWindow> base(do_QueryInterface(aOpener));
|
|
|
|
if (base) {
|
|
|
|
rv = base->GetPositionAndSize(&mOpenerScreenRect.x,
|
|
|
|
&mOpenerScreenRect.y,
|
|
|
|
&mOpenerScreenRect.width,
|
|
|
|
&mOpenerScreenRect.height);
|
|
|
|
if (NS_FAILED(rv)) {
|
2011-04-18 20:07:23 -07:00
|
|
|
mOpenerScreenRect.SetEmpty();
|
2010-10-08 11:51:50 -07:00
|
|
|
} else {
|
|
|
|
initialX = mOpenerScreenRect.x;
|
|
|
|
initialY = mOpenerScreenRect.y;
|
|
|
|
ConstrainToOpenerScreen(&initialX, &initialY);
|
2009-09-28 19:20:46 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
// XXX: need to get the default window size from prefs...
|
|
|
|
// Doesn't come from prefs... will come from CSS/XUL/RDF
|
2010-10-08 11:51:50 -07:00
|
|
|
nsIntRect r(initialX, initialY, aInitialWidth, aInitialHeight);
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
// Create top level window
|
|
|
|
mWindow = do_CreateInstance(kWindowCID, &rv);
|
|
|
|
if (NS_OK != rv) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* This next bit is troublesome. We carry two different versions of a pointer
|
|
|
|
to our parent window. One is the parent window's widget, which is passed
|
|
|
|
to our own widget. The other is a weak reference we keep here to our
|
|
|
|
parent WebShellWindow. The former is useful to the widget, and we can't
|
|
|
|
trust its treatment of the parent reference because they're platform-
|
|
|
|
specific. The latter is useful to this class.
|
|
|
|
A better implementation would be one in which the parent keeps strong
|
|
|
|
references to its children and closes them before it allows itself
|
|
|
|
to be closed. This would mimic the behaviour of OSes that support
|
|
|
|
top-level child windows in OSes that do not. Later.
|
|
|
|
*/
|
|
|
|
nsCOMPtr<nsIBaseWindow> parentAsWin(do_QueryInterface(aParent));
|
|
|
|
if (parentAsWin) {
|
|
|
|
parentAsWin->GetMainWidget(getter_AddRefs(parentWidget));
|
|
|
|
mParentWindow = do_GetWeakReference(aParent);
|
|
|
|
}
|
|
|
|
|
|
|
|
mWindow->SetClientData(this);
|
|
|
|
mWindow->Create((nsIWidget *)parentWidget, // Parent nsIWidget
|
2009-09-23 23:18:10 -07:00
|
|
|
nsnull, // Native parent widget
|
2007-03-22 10:30:00 -07:00
|
|
|
r, // Widget dimensions
|
|
|
|
nsWebShellWindow::HandleEvent, // Event handler function
|
|
|
|
nsnull, // Device context
|
|
|
|
aShell, // Application shell
|
|
|
|
nsnull, // nsIToolkit
|
|
|
|
&widgetInitData); // Widget initialization data
|
|
|
|
mWindow->GetClientBounds(r);
|
2010-09-08 08:21:56 -07:00
|
|
|
// Match the default background color of content. Important on windows
|
|
|
|
// since we no longer use content child widgets.
|
|
|
|
mWindow->SetBackgroundColor(NS_RGB(255,255,255));
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
// Create web shell
|
2009-05-07 12:21:53 -07:00
|
|
|
mDocShell = do_CreateInstance("@mozilla.org/docshell;1");
|
2007-03-22 10:30:00 -07:00
|
|
|
NS_ENSURE_TRUE(mDocShell, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
// Make sure to set the item type on the docshell _before_ calling
|
|
|
|
// Create() so it knows what type it is.
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellAsItem(do_QueryInterface(mDocShell));
|
|
|
|
NS_ENSURE_TRUE(docShellAsItem, NS_ERROR_FAILURE);
|
|
|
|
NS_ENSURE_SUCCESS(EnsureChromeTreeOwner(), NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
docShellAsItem->SetTreeOwner(mChromeTreeOwner);
|
|
|
|
docShellAsItem->SetItemType(nsIDocShellTreeItem::typeChrome);
|
|
|
|
|
|
|
|
r.x = r.y = 0;
|
|
|
|
nsCOMPtr<nsIBaseWindow> docShellAsWin(do_QueryInterface(mDocShell));
|
|
|
|
NS_ENSURE_SUCCESS(docShellAsWin->InitWindow(nsnull, mWindow,
|
|
|
|
r.x, r.y, r.width, r.height), NS_ERROR_FAILURE);
|
|
|
|
NS_ENSURE_SUCCESS(docShellAsWin->Create(), NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
// Attach a WebProgress listener.during initialization...
|
|
|
|
nsCOMPtr<nsIWebProgress> webProgress(do_GetInterface(mDocShell, &rv));
|
|
|
|
if (webProgress) {
|
|
|
|
webProgress->AddProgressListener(this, nsIWebProgress::NOTIFY_STATE_NETWORK);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (nsnull != aUrl) {
|
2009-08-14 04:00:44 -07:00
|
|
|
nsCString tmpStr;
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
rv = aUrl->GetSpec(tmpStr);
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
NS_ConvertUTF8toUTF16 urlString(tmpStr);
|
|
|
|
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(mDocShell));
|
|
|
|
NS_ENSURE_TRUE(webNav, NS_ERROR_FAILURE);
|
|
|
|
rv = webNav->LoadURI(urlString.get(),
|
|
|
|
nsIWebNavigation::LOAD_FLAGS_NONE,
|
|
|
|
nsnull,
|
|
|
|
nsnull,
|
|
|
|
nsnull);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Toolbar
|
|
|
|
*/
|
|
|
|
nsresult
|
|
|
|
nsWebShellWindow::Toolbar()
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIXULWindow> kungFuDeathGrip(this);
|
|
|
|
nsCOMPtr<nsIWebBrowserChrome> wbc(do_GetInterface(kungFuDeathGrip));
|
|
|
|
if (!wbc)
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
|
|
|
|
// rjc: don't use "nsIWebBrowserChrome::CHROME_EXTRA"
|
|
|
|
// due to components with multiple sidebar components
|
|
|
|
// (such as Mail/News, Addressbook, etc)... and frankly,
|
|
|
|
// Mac IE, OmniWeb, and other Mac OS X apps all work this way
|
|
|
|
|
|
|
|
PRUint32 chromeMask = (nsIWebBrowserChrome::CHROME_TOOLBAR |
|
|
|
|
nsIWebBrowserChrome::CHROME_LOCATIONBAR |
|
|
|
|
nsIWebBrowserChrome::CHROME_PERSONAL_TOOLBAR);
|
|
|
|
|
|
|
|
PRUint32 chromeFlags, newChromeFlags = 0;
|
|
|
|
wbc->GetChromeFlags(&chromeFlags);
|
|
|
|
newChromeFlags = chromeFlags & chromeMask;
|
|
|
|
if (!newChromeFlags) chromeFlags |= chromeMask;
|
|
|
|
else chromeFlags &= (~newChromeFlags);
|
|
|
|
wbc->SetChromeFlags(chromeFlags);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Event handler function...
|
|
|
|
*
|
|
|
|
* This function is called to process events for the nsIWidget of the
|
|
|
|
* nsWebShellWindow...
|
|
|
|
*/
|
2008-10-10 08:04:34 -07:00
|
|
|
nsEventStatus
|
2007-03-22 10:30:00 -07:00
|
|
|
nsWebShellWindow::HandleEvent(nsGUIEvent *aEvent)
|
|
|
|
{
|
|
|
|
nsEventStatus result = nsEventStatus_eIgnore;
|
|
|
|
nsIDocShell* docShell = nsnull;
|
|
|
|
nsWebShellWindow *eventWindow = nsnull;
|
|
|
|
|
|
|
|
// Get the WebShell instance...
|
|
|
|
if (nsnull != aEvent->widget) {
|
|
|
|
void* data;
|
|
|
|
|
|
|
|
aEvent->widget->GetClientData(data);
|
|
|
|
if (data != nsnull) {
|
2007-07-08 00:08:04 -07:00
|
|
|
eventWindow = reinterpret_cast<nsWebShellWindow *>(data);
|
2007-03-22 10:30:00 -07:00
|
|
|
docShell = eventWindow->mDocShell;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (docShell) {
|
|
|
|
switch(aEvent->message) {
|
|
|
|
/*
|
|
|
|
* For size events, the DocShell must be resized to fill the entire
|
|
|
|
* client area of the window...
|
|
|
|
*/
|
|
|
|
case NS_MOVE: {
|
2010-07-27 06:38:02 -07:00
|
|
|
// Adjust any child popups so that their widget offsets and coordinates
|
|
|
|
// are correct with respect to the new position of the window
|
2007-11-28 12:18:11 -08:00
|
|
|
nsCOMPtr<nsIMenuRollup> pm =
|
|
|
|
do_GetService("@mozilla.org/xul/xul-popup-manager;1");
|
2010-07-27 06:38:02 -07:00
|
|
|
if (pm) {
|
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_GetInterface(docShell);
|
|
|
|
pm->AdjustPopupsOnWindowChange(window);
|
|
|
|
}
|
2007-11-28 12:18:11 -08:00
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
// persist position, but not immediately, in case this OS is firing
|
|
|
|
// repeated move events as the user drags the window
|
|
|
|
eventWindow->SetPersistenceTimer(PAD_POSITION);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case NS_SIZE: {
|
2007-11-28 12:18:11 -08:00
|
|
|
nsCOMPtr<nsIMenuRollup> pm =
|
|
|
|
do_GetService("@mozilla.org/xul/xul-popup-manager;1");
|
2010-07-27 06:38:02 -07:00
|
|
|
if (pm) {
|
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_GetInterface(docShell);
|
|
|
|
pm->AdjustPopupsOnWindowChange(window);
|
|
|
|
}
|
2007-11-28 12:18:11 -08:00
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
nsSizeEvent* sizeEvent = (nsSizeEvent*)aEvent;
|
|
|
|
nsCOMPtr<nsIBaseWindow> shellAsWin(do_QueryInterface(docShell));
|
|
|
|
shellAsWin->SetPositionAndSize(0, 0, sizeEvent->windowSize->width,
|
|
|
|
sizeEvent->windowSize->height, PR_FALSE);
|
|
|
|
// persist size, but not immediately, in case this OS is firing
|
|
|
|
// repeated size events as the user drags the sizing handle
|
|
|
|
if (!eventWindow->IsLocked())
|
2009-08-12 13:47:41 -07:00
|
|
|
eventWindow->SetPersistenceTimer(PAD_POSITION | PAD_SIZE | PAD_MISC);
|
2007-03-22 10:30:00 -07:00
|
|
|
result = nsEventStatus_eConsumeNoDefault;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case NS_SIZEMODE: {
|
|
|
|
nsSizeModeEvent* modeEvent = (nsSizeModeEvent*)aEvent;
|
|
|
|
|
|
|
|
// an alwaysRaised (or higher) window will hide any newly opened
|
|
|
|
// normal browser windows. here we just drop a raised window
|
|
|
|
// to the normal zlevel if it's maximized. we make no provision
|
|
|
|
// for automatically re-raising it when restored.
|
2009-07-08 09:13:13 -07:00
|
|
|
if (modeEvent->mSizeMode == nsSizeMode_Maximized ||
|
|
|
|
modeEvent->mSizeMode == nsSizeMode_Fullscreen) {
|
2007-03-22 10:30:00 -07:00
|
|
|
PRUint32 zLevel;
|
|
|
|
eventWindow->GetZLevel(&zLevel);
|
|
|
|
if (zLevel > nsIXULWindow::normalZ)
|
|
|
|
eventWindow->SetZLevel(nsIXULWindow::normalZ);
|
|
|
|
}
|
|
|
|
|
|
|
|
aEvent->widget->SetSizeMode(modeEvent->mSizeMode);
|
|
|
|
|
|
|
|
// persist mode, but not immediately, because in many (all?)
|
|
|
|
// cases this will merge with the similar call in NS_SIZE and
|
|
|
|
// write the attribute values only once.
|
|
|
|
eventWindow->SetPersistenceTimer(PAD_MISC);
|
|
|
|
result = nsEventStatus_eConsumeDoDefault;
|
|
|
|
|
2010-08-26 21:44:01 -07:00
|
|
|
// min, max, and normal are all the same to apps, but for
|
|
|
|
// fullscreen we need to let them know so they can update
|
|
|
|
// their ui.
|
2011-06-21 08:33:03 -07:00
|
|
|
if (modeEvent->mSizeMode == nsSizeMode_Fullscreen) {
|
2010-08-26 21:44:01 -07:00
|
|
|
nsCOMPtr<nsIDOMWindowInternal> ourWindow = do_GetInterface(docShell);
|
|
|
|
if (ourWindow)
|
2011-06-21 08:33:03 -07:00
|
|
|
ourWindow->SetFullScreen(PR_TRUE);
|
2010-08-26 21:44:01 -07:00
|
|
|
}
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
// Note the current implementation of SetSizeMode just stores
|
|
|
|
// the new state; it doesn't actually resize. So here we store
|
|
|
|
// the state and pass the event on to the OS. The day is coming
|
|
|
|
// when we'll handle the event here, and the return result will
|
|
|
|
// then need to be different.
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case NS_OS_TOOLBAR: {
|
|
|
|
nsCOMPtr<nsIXULWindow> kungFuDeathGrip(eventWindow);
|
|
|
|
eventWindow->Toolbar();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case NS_XUL_CLOSE: {
|
|
|
|
// Calling ExecuteCloseHandler may actually close the window
|
|
|
|
// (it probably shouldn't, but you never know what the users JS
|
|
|
|
// code will do). Therefore we add a death-grip to the window
|
|
|
|
// for the duration of the close handler.
|
|
|
|
nsCOMPtr<nsIXULWindow> kungFuDeathGrip(eventWindow);
|
|
|
|
if (!eventWindow->ExecuteCloseHandler())
|
|
|
|
eventWindow->Destroy();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Notify the ApplicationShellService that the window is being closed...
|
|
|
|
*/
|
|
|
|
case NS_DESTROY: {
|
|
|
|
eventWindow->Destroy();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2010-04-21 07:53:42 -07:00
|
|
|
case NS_UISTATECHANGED: {
|
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_GetInterface(docShell);
|
|
|
|
if (window) {
|
|
|
|
nsUIStateChangeEvent* event = (nsUIStateChangeEvent*)aEvent;
|
|
|
|
window->SetKeyboardIndicators(event->showAccelerators, event->showFocusRings);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
case NS_SETZLEVEL: {
|
|
|
|
nsZLevelEvent *zEvent = (nsZLevelEvent *) aEvent;
|
|
|
|
|
|
|
|
zEvent->mAdjusted = eventWindow->ConstrainToZLevel(zEvent->mImmediate,
|
|
|
|
&zEvent->mPlacement,
|
|
|
|
zEvent->mReqBelow, &zEvent->mActualBelow);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NS_ACTIVATE: {
|
2008-03-20 13:24:36 -07:00
|
|
|
#if defined(DEBUG_saari) || defined(DEBUG_smaug)
|
2007-03-22 10:30:00 -07:00
|
|
|
printf("nsWebShellWindow::NS_ACTIVATE\n");
|
|
|
|
#endif
|
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 11:00:39 -07:00
|
|
|
// focusing the window could cause it to close, so keep a reference to it
|
|
|
|
nsCOMPtr<nsIXULWindow> kungFuDeathGrip(eventWindow);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMWindow> window = do_GetInterface(docShell);
|
|
|
|
nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID);
|
|
|
|
if (fm && window)
|
|
|
|
fm->WindowRaised(window);
|
|
|
|
|
|
|
|
if (eventWindow->mChromeLoaded) {
|
|
|
|
eventWindow->PersistentAttributesDirty(
|
|
|
|
PAD_POSITION | PAD_SIZE | PAD_MISC);
|
|
|
|
eventWindow->SavePersistentAttributes();
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NS_DEACTIVATE: {
|
2008-03-20 13:24:36 -07:00
|
|
|
#if defined(DEBUG_saari) || defined(DEBUG_smaug)
|
2007-03-22 10:30:00 -07:00
|
|
|
printf("nsWebShellWindow::NS_DEACTIVATE\n");
|
|
|
|
#endif
|
|
|
|
|
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 11:00:39 -07:00
|
|
|
nsCOMPtr<nsIDOMWindow> window = do_GetInterface(docShell);
|
|
|
|
nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID);
|
|
|
|
if (fm && window)
|
|
|
|
fm->WindowLowered(window);
|
2007-03-22 10:30:00 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2009-02-08 22:12:23 -08:00
|
|
|
case NS_GETACCESSIBLE: {
|
|
|
|
nsCOMPtr<nsIPresShell> presShell;
|
|
|
|
docShell->GetPresShell(getter_AddRefs(presShell));
|
|
|
|
if (presShell) {
|
|
|
|
presShell->HandleEventWithTarget(aEvent, nsnull, nsnull, &result);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef USE_NATIVE_MENUS
|
2007-09-17 08:06:59 -07:00
|
|
|
static void LoadNativeMenus(nsIDOMDocument *aDOMDoc, nsIWidget *aParentWindow)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
|
|
|
// Find the menubar tag (if there is more than one, we ignore all but
|
|
|
|
// the first).
|
|
|
|
nsCOMPtr<nsIDOMNodeList> menubarElements;
|
|
|
|
aDOMDoc->GetElementsByTagNameNS(NS_LITERAL_STRING("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"),
|
|
|
|
NS_LITERAL_STRING("menubar"),
|
|
|
|
getter_AddRefs(menubarElements));
|
2008-06-28 00:55:30 -07:00
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
nsCOMPtr<nsIDOMNode> menubarNode;
|
|
|
|
if (menubarElements)
|
|
|
|
menubarElements->Item(0, getter_AddRefs(menubarNode));
|
|
|
|
if (!menubarNode)
|
|
|
|
return;
|
|
|
|
|
2008-06-28 00:55:30 -07:00
|
|
|
nsCOMPtr<nsINativeMenuService> nms = do_GetService("@mozilla.org/widget/nativemenuservice;1");
|
|
|
|
nsCOMPtr<nsIContent> menubarContent(do_QueryInterface(menubarNode));
|
|
|
|
if (nms && menubarContent)
|
|
|
|
nms->CreateNativeMenuBar(aParentWindow, menubarContent);
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void
|
|
|
|
nsWebShellWindow::SetPersistenceTimer(PRUint32 aDirtyFlags)
|
|
|
|
{
|
Rollup of bug 645263 and bug 646259: Switch to mozilla:: sync primitives. r=cjones,dbaron,doublec,ehsan src=bsmedberg
Bug 645263, part 0: Count sync primitive ctor/dtors. r=dbaron
Bug 645263, part 1: Migrate content/media to mozilla:: sync primitives. r=doublec
Bug 645263, part 2: Migrate modules/plugin to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 3: Migrate nsComponentManagerImpl to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 4: Migrate everything else to mozilla:: sync primitives. r=dbaron
Bug 645263, part 5: Remove nsAutoLock.*. sr=bsmedberg
Bug 645263, part 6: Make editor test be nicer to deadlock detector. r=ehsan
Bug 645263, part 7: Disable tracemalloc backtraces for xpcshell tests. r=dbaron
Bug 646259: Fix nsCacheService to use a CondVar for notifying. r=cjones
2011-03-31 21:29:02 -07:00
|
|
|
MutexAutoLock lock(mSPTimerLock);
|
2009-02-03 06:42:21 -08:00
|
|
|
if (!mSPTimer) {
|
2007-03-22 10:30:00 -07:00
|
|
|
nsresult rv;
|
|
|
|
mSPTimer = do_CreateInstance("@mozilla.org/timer;1", &rv);
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
NS_ADDREF_THIS(); // for the timer, which holds a reference to this window
|
|
|
|
}
|
|
|
|
}
|
2009-02-03 06:42:21 -08:00
|
|
|
mSPTimer->InitWithFuncCallback(FirePersistenceTimer, this,
|
|
|
|
SIZE_PERSISTENCE_TIMEOUT, nsITimer::TYPE_ONE_SHOT);
|
|
|
|
PersistentAttributesDirty(aDirtyFlags);
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
nsWebShellWindow::FirePersistenceTimer(nsITimer *aTimer, void *aClosure)
|
|
|
|
{
|
2007-07-08 00:08:04 -07:00
|
|
|
nsWebShellWindow *win = static_cast<nsWebShellWindow *>(aClosure);
|
Rollup of bug 645263 and bug 646259: Switch to mozilla:: sync primitives. r=cjones,dbaron,doublec,ehsan src=bsmedberg
Bug 645263, part 0: Count sync primitive ctor/dtors. r=dbaron
Bug 645263, part 1: Migrate content/media to mozilla:: sync primitives. r=doublec
Bug 645263, part 2: Migrate modules/plugin to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 3: Migrate nsComponentManagerImpl to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 4: Migrate everything else to mozilla:: sync primitives. r=dbaron
Bug 645263, part 5: Remove nsAutoLock.*. sr=bsmedberg
Bug 645263, part 6: Make editor test be nicer to deadlock detector. r=ehsan
Bug 645263, part 7: Disable tracemalloc backtraces for xpcshell tests. r=dbaron
Bug 646259: Fix nsCacheService to use a CondVar for notifying. r=cjones
2011-03-31 21:29:02 -07:00
|
|
|
MutexAutoLock lock(win->mSPTimerLock);
|
2007-03-22 10:30:00 -07:00
|
|
|
win->SavePersistentAttributes();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//----------------------------------------
|
|
|
|
// nsIWebProgessListener implementation
|
|
|
|
//----------------------------------------
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsWebShellWindow::OnProgressChange(nsIWebProgress *aProgress,
|
|
|
|
nsIRequest *aRequest,
|
|
|
|
PRInt32 aCurSelfProgress,
|
|
|
|
PRInt32 aMaxSelfProgress,
|
|
|
|
PRInt32 aCurTotalProgress,
|
|
|
|
PRInt32 aMaxTotalProgress)
|
|
|
|
{
|
|
|
|
NS_NOTREACHED("notification excluded in AddProgressListener(...)");
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsWebShellWindow::OnStateChange(nsIWebProgress *aProgress,
|
|
|
|
nsIRequest *aRequest,
|
|
|
|
PRUint32 aStateFlags,
|
|
|
|
nsresult aStatus)
|
|
|
|
{
|
|
|
|
// If the notification is not about a document finishing, then just
|
|
|
|
// ignore it...
|
|
|
|
if (!(aStateFlags & nsIWebProgressListener::STATE_STOP) ||
|
|
|
|
!(aStateFlags & nsIWebProgressListener::STATE_IS_NETWORK)) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mChromeLoaded)
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
// If this document notification is for a frame then ignore it...
|
|
|
|
nsCOMPtr<nsIDOMWindow> eventWin;
|
|
|
|
aProgress->GetDOMWindow(getter_AddRefs(eventWin));
|
|
|
|
nsCOMPtr<nsPIDOMWindow> eventPWin(do_QueryInterface(eventWin));
|
|
|
|
if (eventPWin) {
|
|
|
|
nsPIDOMWindow *rootPWin = eventPWin->GetPrivateRoot();
|
|
|
|
if (eventPWin != rootPWin)
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
mChromeLoaded = PR_TRUE;
|
|
|
|
mLockedUntilChromeLoad = PR_FALSE;
|
|
|
|
|
|
|
|
#ifdef USE_NATIVE_MENUS
|
|
|
|
///////////////////////////////
|
|
|
|
// Find the Menubar DOM and Load the menus, hooking them up to the loaded commands
|
|
|
|
///////////////////////////////
|
|
|
|
nsCOMPtr<nsIDOMDocument> menubarDOMDoc(GetNamedDOMDoc(NS_LITERAL_STRING("this"))); // XXX "this" is a small kludge for code reused
|
|
|
|
if (menubarDOMDoc)
|
2007-09-17 08:06:59 -07:00
|
|
|
LoadNativeMenus(menubarDOMDoc, mWindow);
|
2007-03-22 10:30:00 -07:00
|
|
|
#endif // USE_NATIVE_MENUS
|
|
|
|
|
|
|
|
OnChromeLoaded();
|
|
|
|
LoadContentAreas();
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsWebShellWindow::OnLocationChange(nsIWebProgress *aProgress,
|
|
|
|
nsIRequest *aRequest,
|
|
|
|
nsIURI *aURI)
|
|
|
|
{
|
|
|
|
NS_NOTREACHED("notification excluded in AddProgressListener(...)");
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsWebShellWindow::OnStatusChange(nsIWebProgress* aWebProgress,
|
|
|
|
nsIRequest* aRequest,
|
|
|
|
nsresult aStatus,
|
|
|
|
const PRUnichar* aMessage)
|
|
|
|
{
|
|
|
|
NS_NOTREACHED("notification excluded in AddProgressListener(...)");
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsWebShellWindow::OnSecurityChange(nsIWebProgress *aWebProgress,
|
|
|
|
nsIRequest *aRequest,
|
|
|
|
PRUint32 state)
|
|
|
|
{
|
|
|
|
NS_NOTREACHED("notification excluded in AddProgressListener(...)");
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//----------------------------------------
|
|
|
|
nsCOMPtr<nsIDOMDocument> nsWebShellWindow::GetNamedDOMDoc(const nsAString & aDocShellName)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIDOMDocument> domDoc; // result == nsnull;
|
|
|
|
|
|
|
|
// first get the toolbar child docShell
|
|
|
|
nsCOMPtr<nsIDocShell> childDocShell;
|
|
|
|
if (aDocShellName.EqualsLiteral("this")) { // XXX small kludge for code reused
|
|
|
|
childDocShell = mDocShell;
|
|
|
|
} else {
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellAsItem;
|
|
|
|
nsCOMPtr<nsIDocShellTreeNode> docShellAsNode(do_QueryInterface(mDocShell));
|
|
|
|
docShellAsNode->FindChildWithName(PromiseFlatString(aDocShellName).get(),
|
|
|
|
PR_TRUE, PR_FALSE, nsnull, nsnull, getter_AddRefs(docShellAsItem));
|
|
|
|
childDocShell = do_QueryInterface(docShellAsItem);
|
|
|
|
if (!childDocShell)
|
|
|
|
return domDoc;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIContentViewer> cv;
|
|
|
|
childDocShell->GetContentViewer(getter_AddRefs(cv));
|
|
|
|
if (!cv)
|
|
|
|
return domDoc;
|
2010-01-23 03:41:41 -08:00
|
|
|
|
|
|
|
nsIDocument* doc = cv->GetDocument();
|
2007-03-22 10:30:00 -07:00
|
|
|
if (doc)
|
|
|
|
return nsCOMPtr<nsIDOMDocument>(do_QueryInterface(doc));
|
|
|
|
|
|
|
|
return domDoc;
|
|
|
|
} // nsWebShellWindow::GetNamedDOMDoc
|
|
|
|
|
|
|
|
//----------------------------------------
|
|
|
|
|
|
|
|
// if the main document URL specified URLs for any content areas, start them loading
|
|
|
|
void nsWebShellWindow::LoadContentAreas() {
|
|
|
|
|
|
|
|
nsAutoString searchSpec;
|
|
|
|
|
|
|
|
// fetch the chrome document URL
|
|
|
|
nsCOMPtr<nsIContentViewer> contentViewer;
|
|
|
|
// yes, it's possible for the docshell to be null even this early
|
|
|
|
// see bug 57514.
|
|
|
|
if (mDocShell)
|
|
|
|
mDocShell->GetContentViewer(getter_AddRefs(contentViewer));
|
|
|
|
if (contentViewer) {
|
2010-01-23 03:41:41 -08:00
|
|
|
nsIDocument* doc = contentViewer->GetDocument();
|
|
|
|
if (doc) {
|
|
|
|
nsIURI* mainURL = doc->GetDocumentURI();
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
nsCOMPtr<nsIURL> url = do_QueryInterface(mainURL);
|
|
|
|
if (url) {
|
|
|
|
nsCAutoString search;
|
|
|
|
url->GetQuery(search);
|
|
|
|
|
|
|
|
AppendUTF8toUTF16(search, searchSpec);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// content URLs are specified in the search part of the URL
|
|
|
|
// as <contentareaID>=<escapedURL>[;(repeat)]
|
|
|
|
if (!searchSpec.IsEmpty()) {
|
|
|
|
PRInt32 begPos,
|
|
|
|
eqPos,
|
|
|
|
endPos;
|
|
|
|
nsString contentAreaID,
|
|
|
|
contentURL;
|
|
|
|
char *urlChar;
|
|
|
|
nsresult rv;
|
|
|
|
for (endPos = 0; endPos < (PRInt32)searchSpec.Length(); ) {
|
|
|
|
// extract contentAreaID and URL substrings
|
|
|
|
begPos = endPos;
|
|
|
|
eqPos = searchSpec.FindChar('=', begPos);
|
|
|
|
if (eqPos < 0)
|
|
|
|
break;
|
|
|
|
|
|
|
|
endPos = searchSpec.FindChar(';', eqPos);
|
|
|
|
if (endPos < 0)
|
|
|
|
endPos = searchSpec.Length();
|
|
|
|
searchSpec.Mid(contentAreaID, begPos, eqPos-begPos);
|
|
|
|
searchSpec.Mid(contentURL, eqPos+1, endPos-eqPos-1);
|
|
|
|
endPos++;
|
|
|
|
|
|
|
|
// see if we have a docshell with a matching contentAreaID
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> content;
|
|
|
|
rv = GetContentShellById(contentAreaID.get(), getter_AddRefs(content));
|
|
|
|
if (NS_SUCCEEDED(rv) && content) {
|
|
|
|
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(content));
|
|
|
|
if (webNav) {
|
|
|
|
urlChar = ToNewCString(contentURL);
|
|
|
|
if (urlChar) {
|
|
|
|
nsUnescape(urlChar);
|
|
|
|
contentURL.AssignWithConversion(urlChar);
|
|
|
|
webNav->LoadURI(contentURL.get(),
|
|
|
|
nsIWebNavigation::LOAD_FLAGS_NONE,
|
|
|
|
nsnull,
|
|
|
|
nsnull,
|
|
|
|
nsnull);
|
|
|
|
nsMemory::Free(urlChar);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ExecuteCloseHandler - Run the close handler, if any.
|
|
|
|
* @return PR_TRUE iff we found a close handler to run.
|
|
|
|
*/
|
|
|
|
PRBool nsWebShellWindow::ExecuteCloseHandler()
|
|
|
|
{
|
|
|
|
/* If the event handler closes this window -- a likely scenario --
|
|
|
|
things get deleted out of order without this death grip.
|
|
|
|
(The problem may be the death grip in nsWindow::windowProc,
|
|
|
|
which forces this window's widget to remain alive longer
|
|
|
|
than it otherwise would.) */
|
|
|
|
nsCOMPtr<nsIXULWindow> kungFuDeathGrip(this);
|
|
|
|
|
|
|
|
nsCOMPtr<nsPIDOMWindow> window(do_GetInterface(mDocShell));
|
|
|
|
nsCOMPtr<nsPIDOMEventTarget> eventTarget = do_QueryInterface(window);
|
|
|
|
|
|
|
|
if (eventTarget) {
|
|
|
|
nsCOMPtr<nsIContentViewer> contentViewer;
|
|
|
|
mDocShell->GetContentViewer(getter_AddRefs(contentViewer));
|
|
|
|
nsCOMPtr<nsIDocumentViewer> docViewer(do_QueryInterface(contentViewer));
|
|
|
|
|
|
|
|
if (docViewer) {
|
2010-03-25 06:17:11 -07:00
|
|
|
nsRefPtr<nsPresContext> presContext;
|
2007-03-22 10:30:00 -07:00
|
|
|
docViewer->GetPresContext(getter_AddRefs(presContext));
|
|
|
|
|
|
|
|
nsEventStatus status = nsEventStatus_eIgnore;
|
|
|
|
nsMouseEvent event(PR_TRUE, NS_XUL_CLOSE, nsnull,
|
|
|
|
nsMouseEvent::eReal);
|
|
|
|
|
|
|
|
nsresult rv =
|
|
|
|
eventTarget->DispatchDOMEvent(&event, nsnull, presContext, &status);
|
|
|
|
if (NS_SUCCEEDED(rv) && status == nsEventStatus_eConsumeNoDefault)
|
|
|
|
return PR_TRUE;
|
|
|
|
// else fall through and return PR_FALSE
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return PR_FALSE;
|
|
|
|
} // ExecuteCloseHandler
|
|
|
|
|
2010-10-08 11:51:50 -07:00
|
|
|
void nsWebShellWindow::ConstrainToOpenerScreen(PRInt32* aX, PRInt32* aY)
|
|
|
|
{
|
|
|
|
if (mOpenerScreenRect.IsEmpty()) {
|
|
|
|
*aX = *aY = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
PRInt32 left, top, width, height;
|
|
|
|
// Constrain initial positions to the same screen as opener
|
|
|
|
nsCOMPtr<nsIScreenManager> screenmgr = do_GetService("@mozilla.org/gfx/screenmanager;1");
|
|
|
|
if (screenmgr) {
|
|
|
|
nsCOMPtr<nsIScreen> screen;
|
|
|
|
screenmgr->ScreenForRect(mOpenerScreenRect.x, mOpenerScreenRect.y,
|
|
|
|
mOpenerScreenRect.width, mOpenerScreenRect.height,
|
|
|
|
getter_AddRefs(screen));
|
|
|
|
if (screen) {
|
|
|
|
screen->GetAvailRect(&left, &top, &width, &height);
|
2011-05-10 14:26:48 -07:00
|
|
|
if (*aX < left || *aX > left + width) {
|
2010-10-08 11:51:50 -07:00
|
|
|
*aX = left;
|
|
|
|
}
|
|
|
|
if (*aY < top || *aY > top + height) {
|
|
|
|
*aY = top;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
// nsIBaseWindow
|
|
|
|
NS_IMETHODIMP nsWebShellWindow::Destroy()
|
|
|
|
{
|
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIWebProgress> webProgress(do_GetInterface(mDocShell, &rv));
|
|
|
|
if (webProgress) {
|
|
|
|
webProgress->RemoveProgressListener(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIXULWindow> kungFuDeathGrip(this);
|
Rollup of bug 645263 and bug 646259: Switch to mozilla:: sync primitives. r=cjones,dbaron,doublec,ehsan src=bsmedberg
Bug 645263, part 0: Count sync primitive ctor/dtors. r=dbaron
Bug 645263, part 1: Migrate content/media to mozilla:: sync primitives. r=doublec
Bug 645263, part 2: Migrate modules/plugin to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 3: Migrate nsComponentManagerImpl to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 4: Migrate everything else to mozilla:: sync primitives. r=dbaron
Bug 645263, part 5: Remove nsAutoLock.*. sr=bsmedberg
Bug 645263, part 6: Make editor test be nicer to deadlock detector. r=ehsan
Bug 645263, part 7: Disable tracemalloc backtraces for xpcshell tests. r=dbaron
Bug 646259: Fix nsCacheService to use a CondVar for notifying. r=cjones
2011-03-31 21:29:02 -07:00
|
|
|
{
|
|
|
|
MutexAutoLock lock(mSPTimerLock);
|
|
|
|
if (mSPTimer) {
|
|
|
|
mSPTimer->Cancel();
|
|
|
|
SavePersistentAttributes();
|
|
|
|
mSPTimer = nsnull;
|
|
|
|
NS_RELEASE_THIS(); // the timer held a reference to us
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
return nsXULWindow::Destroy();
|
|
|
|
}
|