2001-09-25 22:43:09 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2005-08-15 18:16:42 +00:00
|
|
|
/* vim: set sw=2 ts=2 et tw=80: */
|
2001-09-25 22:43:09 +00:00
|
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
2004-04-17 21:52:36 +00:00
|
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
1998-07-16 01:16:47 +00:00
|
|
|
*
|
2004-04-17 21:52:36 +00:00
|
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
* the License. You may obtain a copy of the License at
|
|
|
|
* http://www.mozilla.org/MPL/
|
1998-07-16 01:16:47 +00:00
|
|
|
*
|
2001-09-25 22:43:09 +00:00
|
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
* for the specific language governing rights and limitations under the
|
|
|
|
* License.
|
1998-07-16 01:16:47 +00:00
|
|
|
*
|
1999-11-06 03:40:37 +00:00
|
|
|
* The Original Code is mozilla.org code.
|
|
|
|
*
|
2004-04-17 21:52:36 +00:00
|
|
|
* The Initial Developer of the Original Code is
|
2001-09-25 22:43:09 +00:00
|
|
|
* Netscape Communications Corporation.
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
1999-11-06 03:40:37 +00:00
|
|
|
*
|
2001-09-25 22:43:09 +00:00
|
|
|
* Contributor(s):
|
2000-02-08 13:40:10 +00:00
|
|
|
* Travis Bogard <travis@netscape.com>
|
2000-08-09 03:30:46 +00:00
|
|
|
* Brendan Eich <brendan@mozilla.org>
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
* David Hyatt (hyatt@netscape.com)
|
2001-04-18 06:06:31 +00:00
|
|
|
* Dan Rosen <dr@netscape.com>
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
* Vidur Apparao <vidur@netscape.com>
|
|
|
|
* Johnny Stenback <jst@netscape.com>
|
2001-09-25 22:43:09 +00:00
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
2004-04-17 21:52:36 +00:00
|
|
|
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
|
|
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
2001-09-25 22:43:09 +00:00
|
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
2004-04-17 21:52:36 +00:00
|
|
|
* use your version of this file under the terms of the MPL, indicate your
|
2001-09-25 22:43:09 +00:00
|
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
* the provisions above, a recipient may use your version of this file under
|
2004-04-17 21:52:36 +00:00
|
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
2001-09-25 22:43:09 +00:00
|
|
|
*
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
// Local Includes
|
1998-07-24 05:05:42 +00:00
|
|
|
#include "nsGlobalWindow.h"
|
2000-02-08 13:40:10 +00:00
|
|
|
#include "nsScreen.h"
|
|
|
|
#include "nsHistory.h"
|
|
|
|
#include "nsBarProps.h"
|
|
|
|
|
|
|
|
// Helper Classes
|
|
|
|
#include "nsXPIDLString.h"
|
|
|
|
#include "nsJSUtils.h"
|
1998-07-16 01:16:47 +00:00
|
|
|
#include "prmem.h"
|
2000-08-22 03:51:17 +00:00
|
|
|
#include "jsdbgapi.h" // for JS_ClearWatchPointsForObject
|
2000-08-23 17:27:06 +00:00
|
|
|
#include "nsReadableUtils.h"
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
#include "nsDOMClassInfo.h"
|
2000-02-08 13:40:10 +00:00
|
|
|
|
|
|
|
// Other Classes
|
2000-12-30 19:22:22 +00:00
|
|
|
#include "nsIEventListenerManager.h"
|
2000-02-08 13:40:10 +00:00
|
|
|
#include "nsEscape.h"
|
|
|
|
#include "nsStyleCoord.h"
|
|
|
|
#include "nsMimeTypeArray.h"
|
|
|
|
#include "nsNetUtil.h"
|
|
|
|
#include "nsPluginArray.h"
|
2001-04-04 22:09:56 +00:00
|
|
|
#include "nsIPluginHost.h"
|
2003-03-25 06:54:52 +00:00
|
|
|
#ifdef OJI
|
2001-05-02 22:04:10 +00:00
|
|
|
#include "nsIJVMManager.h"
|
2003-03-25 06:54:52 +00:00
|
|
|
#endif
|
2001-02-22 03:01:34 +00:00
|
|
|
#include "nsContentCID.h"
|
2000-02-08 13:40:10 +00:00
|
|
|
|
|
|
|
// Interfaces Needed
|
2001-10-31 23:43:27 +00:00
|
|
|
#include "nsIWidget.h"
|
2000-02-08 13:40:10 +00:00
|
|
|
#include "nsIBaseWindow.h"
|
|
|
|
#include "nsICharsetConverterManager.h"
|
|
|
|
#include "nsIContent.h"
|
|
|
|
#include "nsIContentViewerEdit.h"
|
|
|
|
#include "nsIDocShell.h"
|
2000-03-30 22:38:32 +00:00
|
|
|
#include "nsIDocShellLoadInfo.h"
|
2000-02-08 13:40:10 +00:00
|
|
|
#include "nsIDocShellTreeItem.h"
|
|
|
|
#include "nsIDocShellTreeNode.h"
|
2001-05-17 02:15:27 +00:00
|
|
|
#include "nsIDocCharset.h"
|
2000-02-08 13:40:10 +00:00
|
|
|
#include "nsIDocument.h"
|
2004-08-27 21:06:19 +00:00
|
|
|
#include "nsIHTMLDocument.h"
|
2000-05-11 19:17:07 +00:00
|
|
|
#include "nsIDOMCrypto.h"
|
2000-02-08 13:40:10 +00:00
|
|
|
#include "nsIDOMDocument.h"
|
2004-10-24 22:57:06 +00:00
|
|
|
#include "nsIDOMNSDocument.h"
|
2000-04-26 13:58:56 +00:00
|
|
|
#include "nsIDOMDocumentView.h"
|
2002-02-20 03:33:52 +00:00
|
|
|
#include "nsIDOMElement.h"
|
|
|
|
#include "nsIDOMDocumentEvent.h"
|
|
|
|
#include "nsIDOMEvent.h"
|
2004-04-01 23:00:44 +00:00
|
|
|
#include "nsIDOMKeyEvent.h"
|
2003-04-16 00:00:55 +00:00
|
|
|
#include "nsIDOMPopupBlockedEvent.h"
|
2000-05-11 19:17:07 +00:00
|
|
|
#include "nsIDOMPkcs11.h"
|
2004-04-01 19:44:17 +00:00
|
|
|
#include "nsDOMString.h"
|
2002-01-05 02:20:55 +00:00
|
|
|
#include "nsIEmbeddingSiteWindow2.h"
|
1999-10-18 15:06:38 +00:00
|
|
|
#include "nsIEventQueueService.h"
|
2000-04-24 04:41:27 +00:00
|
|
|
#include "nsIEventStateManager.h"
|
2001-05-11 21:05:08 +00:00
|
|
|
#include "nsIHttpProtocolHandler.h"
|
2000-03-31 03:33:49 +00:00
|
|
|
#include "nsIJSContextStack.h"
|
2000-10-15 23:23:12 +00:00
|
|
|
#include "nsIJSRuntimeService.h"
|
2000-02-08 22:45:45 +00:00
|
|
|
#include "nsIMarkupDocumentViewer.h"
|
2002-11-25 23:21:25 +00:00
|
|
|
#include "nsIPrefBranch.h"
|
2000-02-08 13:40:10 +00:00
|
|
|
#include "nsIPresShell.h"
|
1998-07-24 05:05:42 +00:00
|
|
|
#include "nsIPrivateDOMEvent.h"
|
2001-08-31 04:06:39 +00:00
|
|
|
#include "nsIProgrammingLanguage.h"
|
2001-04-10 18:30:25 +00:00
|
|
|
#include "nsIAuthPrompt.h"
|
2000-02-08 13:40:10 +00:00
|
|
|
#include "nsIServiceManager.h"
|
|
|
|
#include "nsIScriptGlobalObjectOwner.h"
|
1999-07-07 07:50:03 +00:00
|
|
|
#include "nsIScriptSecurityManager.h"
|
2001-01-27 16:58:15 +00:00
|
|
|
#include "nsIScrollableView.h"
|
2000-02-08 13:40:10 +00:00
|
|
|
#include "nsISelectionController.h"
|
2000-09-14 11:45:01 +00:00
|
|
|
#include "nsISelection.h"
|
2000-04-28 14:02:29 +00:00
|
|
|
#include "nsIFrameSelection.h"
|
2000-08-07 20:55:36 +00:00
|
|
|
#include "nsIPrompt.h"
|
2000-02-08 13:40:10 +00:00
|
|
|
#include "nsIWebNavigation.h"
|
|
|
|
#include "nsIWebBrowser.h"
|
|
|
|
#include "nsIWebBrowserChrome.h"
|
2001-09-30 19:56:32 +00:00
|
|
|
#include "nsIWebBrowserFind.h" // For window.find()
|
|
|
|
#include "nsIWindowMediator.h" // For window.find()
|
2000-05-17 06:38:43 +00:00
|
|
|
#include "nsIComputedDOMStyle.h"
|
2000-10-30 23:33:34 +00:00
|
|
|
#include "nsIEntropyCollector.h"
|
2000-05-11 19:17:07 +00:00
|
|
|
#include "nsDOMCID.h"
|
2000-05-03 13:03:17 +00:00
|
|
|
#include "nsDOMError.h"
|
2004-06-20 16:42:13 +00:00
|
|
|
#include "nsDOMWindowUtils.h"
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
#include "nsIWindowWatcher.h"
|
2001-02-17 02:46:48 +00:00
|
|
|
#include "nsPIWindowWatcher.h"
|
2001-07-16 02:40:48 +00:00
|
|
|
#include "nsIContentViewer.h"
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
#include "nsISupportsPrimitives.h"
|
|
|
|
#include "nsDOMClassInfo.h"
|
|
|
|
#include "nsIJSNativeInitializer.h"
|
2002-02-20 03:33:52 +00:00
|
|
|
#include "nsIFullScreen.h"
|
2002-03-20 11:23:13 +00:00
|
|
|
#include "nsIStringBundle.h"
|
2002-12-11 00:03:34 +00:00
|
|
|
#include "nsIScriptEventManager.h" // For GetInterface()
|
2002-12-04 02:51:47 +00:00
|
|
|
#include "nsIConsoleService.h"
|
2003-04-12 03:08:23 +00:00
|
|
|
#include "nsIControllerContext.h"
|
|
|
|
#include "nsGlobalWindowCommands.h"
|
2003-04-25 22:24:37 +00:00
|
|
|
#include "nsAutoPtr.h"
|
2004-04-29 23:34:19 +00:00
|
|
|
#include "nsContentUtils.h"
|
2004-10-01 17:15:15 +00:00
|
|
|
#include "nsCSSProps.h"
|
2005-07-06 07:38:36 +00:00
|
|
|
#include "nsIURIFixup.h"
|
|
|
|
#include "nsCDefaultURIFixup.h"
|
2002-01-12 12:37:31 +00:00
|
|
|
|
2002-02-06 04:37:26 +00:00
|
|
|
#include "plbase64.h"
|
|
|
|
|
2005-09-16 02:25:37 +00:00
|
|
|
#ifdef NS_PRINTING
|
2002-01-15 01:11:16 +00:00
|
|
|
#include "nsIPrintSettings.h"
|
2004-11-04 22:40:02 +00:00
|
|
|
#include "nsIPrintSettingsService.h"
|
2005-09-16 02:25:37 +00:00
|
|
|
#include "nsIWebBrowserPrint.h"
|
|
|
|
#endif
|
1999-04-20 19:41:17 +00:00
|
|
|
|
2000-11-04 08:21:20 +00:00
|
|
|
#include "nsWindowRoot.h"
|
2003-04-16 00:00:55 +00:00
|
|
|
#include "nsNetCID.h"
|
2000-11-04 08:21:20 +00:00
|
|
|
|
2000-09-22 05:02:20 +00:00
|
|
|
// XXX An unfortunate dependency exists here (two XUL files).
|
2000-02-11 00:57:54 +00:00
|
|
|
#include "nsIDOMXULDocument.h"
|
|
|
|
#include "nsIDOMXULCommandDispatcher.h"
|
2000-09-22 05:02:20 +00:00
|
|
|
|
2000-09-08 06:59:14 +00:00
|
|
|
#include "nsIBindingManager.h"
|
2000-09-22 05:02:20 +00:00
|
|
|
#include "nsIXBLService.h"
|
|
|
|
|
2002-10-25 02:31:12 +00:00
|
|
|
// used for popup blocking, needs to be converted to something
|
|
|
|
// belonging to the back-end like nsIContentPolicy
|
2002-10-08 03:30:26 +00:00
|
|
|
#include "nsIPopupWindowManager.h"
|
2000-02-11 00:57:54 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsIScriptSecurityManager *nsGlobalWindow::sSecMan = nsnull;
|
|
|
|
nsIFactory *nsGlobalWindow::sComputedDOMStyleFactory = nsnull;
|
2004-09-04 19:28:46 +00:00
|
|
|
|
2002-11-25 23:21:25 +00:00
|
|
|
static nsIEntropyCollector *gEntropyCollector = nsnull;
|
2002-07-08 07:11:59 +00:00
|
|
|
static PRInt32 gRefCnt = 0;
|
2004-02-03 02:22:54 +00:00
|
|
|
static PRInt32 gOpenPopupSpamCount = 0;
|
2004-09-04 19:28:46 +00:00
|
|
|
static PopupControlState gPopupControlState = openAbused;
|
|
|
|
static PRInt32 gRunningTimeoutDepth = 0;
|
|
|
|
|
2002-12-12 22:37:07 +00:00
|
|
|
#ifdef DEBUG_jst
|
|
|
|
PRInt32 gTimeoutCnt = 0;
|
|
|
|
#endif
|
2002-06-19 00:42:23 +00:00
|
|
|
|
2005-08-09 21:29:23 +00:00
|
|
|
#if defined(DEBUG_bryner) || defined(DEBUG_chb)
|
2005-05-04 20:22:32 +00:00
|
|
|
#define DEBUG_PAGE_CACHE
|
|
|
|
#endif
|
|
|
|
|
2002-07-08 07:11:59 +00:00
|
|
|
#define DOM_MIN_TIMEOUT_VALUE 10 // 10ms
|
2000-10-30 23:33:34 +00:00
|
|
|
|
2005-08-12 04:11:00 +00:00
|
|
|
#define FORWARD_TO_OUTER(method, args, err_rval) \
|
2005-07-30 20:57:07 +00:00
|
|
|
PR_BEGIN_MACRO \
|
|
|
|
if (IsInnerWindow()) { \
|
2005-08-12 04:11:00 +00:00
|
|
|
nsGlobalWindow *outer = GetOuterWindowInternal(); \
|
|
|
|
if (!outer) { \
|
|
|
|
NS_WARNING("No outer window available!"); \
|
|
|
|
return err_rval; \
|
|
|
|
} \
|
|
|
|
return outer->method args; \
|
2005-07-30 20:57:07 +00:00
|
|
|
} \
|
|
|
|
PR_END_MACRO
|
|
|
|
|
|
|
|
#define FORWARD_TO_OUTER_VOID(method, args) \
|
|
|
|
PR_BEGIN_MACRO \
|
|
|
|
if (IsInnerWindow()) { \
|
2005-08-12 04:11:00 +00:00
|
|
|
nsGlobalWindow *outer = GetOuterWindowInternal(); \
|
|
|
|
if (!outer) { \
|
|
|
|
NS_WARNING("No outer window available!"); \
|
|
|
|
return; \
|
|
|
|
} \
|
|
|
|
outer->method args; \
|
2005-07-30 20:57:07 +00:00
|
|
|
return; \
|
|
|
|
} \
|
|
|
|
PR_END_MACRO
|
|
|
|
|
2005-08-12 04:11:00 +00:00
|
|
|
#define FORWARD_TO_OUTER_CHROME(method, args, err_rval) \
|
2005-07-30 20:57:07 +00:00
|
|
|
PR_BEGIN_MACRO \
|
|
|
|
if (IsInnerWindow()) { \
|
2005-08-12 04:11:00 +00:00
|
|
|
nsGlobalWindow *outer = GetOuterWindowInternal(); \
|
|
|
|
if (!outer) { \
|
|
|
|
NS_WARNING("No outer window available!"); \
|
|
|
|
return err_rval; \
|
|
|
|
} \
|
|
|
|
return ((nsGlobalChromeWindow *)outer)->method args; \
|
2005-07-30 20:57:07 +00:00
|
|
|
} \
|
|
|
|
PR_END_MACRO
|
|
|
|
|
2005-08-12 04:11:00 +00:00
|
|
|
#define FORWARD_TO_INNER(method, args, err_rval) \
|
2005-07-30 20:57:07 +00:00
|
|
|
PR_BEGIN_MACRO \
|
2005-08-12 04:11:00 +00:00
|
|
|
if (IsOuterWindow()) { \
|
|
|
|
if (!mInnerWindow) { \
|
|
|
|
NS_WARNING("No inner window available!"); \
|
|
|
|
return err_rval; \
|
|
|
|
} \
|
2005-07-30 20:57:07 +00:00
|
|
|
return GetCurrentInnerWindowInternal()->method args; \
|
|
|
|
} \
|
|
|
|
PR_END_MACRO
|
|
|
|
|
|
|
|
#define FORWARD_TO_INNER_VOID(method, args) \
|
|
|
|
PR_BEGIN_MACRO \
|
2005-08-12 04:11:00 +00:00
|
|
|
if (IsOuterWindow()) { \
|
|
|
|
if (!mInnerWindow) { \
|
|
|
|
NS_WARNING("No inner window available!"); \
|
|
|
|
return; \
|
|
|
|
} \
|
2005-07-30 20:57:07 +00:00
|
|
|
GetCurrentInnerWindowInternal()->method args; \
|
|
|
|
return; \
|
|
|
|
} \
|
|
|
|
PR_END_MACRO
|
|
|
|
|
2005-10-04 01:08:18 +00:00
|
|
|
// Same as FORWARD_TO_INNER, but this will create a fresh inner if an
|
|
|
|
// inner doesn't already exists.
|
|
|
|
#define FORWARD_TO_INNER_CREATE(method, args) \
|
|
|
|
PR_BEGIN_MACRO \
|
|
|
|
if (IsOuterWindow()) { \
|
|
|
|
if (!mInnerWindow) { \
|
|
|
|
if (mIsClosed) { \
|
|
|
|
return NS_ERROR_NOT_AVAILABLE; \
|
|
|
|
} \
|
|
|
|
nsCOMPtr<nsIDOMDocument> doc; \
|
|
|
|
nsresult fwdic_nr = GetDocument(getter_AddRefs(doc)); \
|
|
|
|
NS_ENSURE_SUCCESS(fwdic_nr, fwdic_nr); \
|
|
|
|
if (!mInnerWindow) { \
|
|
|
|
return NS_ERROR_NOT_AVAILABLE; \
|
|
|
|
} \
|
|
|
|
} \
|
|
|
|
return GetCurrentInnerWindowInternal()->method args; \
|
|
|
|
} \
|
|
|
|
PR_END_MACRO
|
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
// CIDs
|
2002-11-25 23:21:25 +00:00
|
|
|
static NS_DEFINE_CID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID);
|
2003-03-25 06:54:52 +00:00
|
|
|
#ifdef OJI
|
2001-05-02 22:04:10 +00:00
|
|
|
static NS_DEFINE_CID(kJVMServiceCID, NS_JVMMANAGER_CID);
|
2003-03-25 06:54:52 +00:00
|
|
|
#endif
|
2001-05-11 21:05:08 +00:00
|
|
|
static NS_DEFINE_CID(kHTTPHandlerCID, NS_HTTPPROTOCOLHANDLER_CID);
|
2000-02-08 13:40:10 +00:00
|
|
|
static NS_DEFINE_CID(kXULControllersCID, NS_XULCONTROLLERS_CID);
|
2000-08-22 03:51:17 +00:00
|
|
|
static NS_DEFINE_CID(kCharsetConverterManagerCID,
|
|
|
|
NS_ICHARSETCONVERTERMANAGER_CID);
|
2001-09-30 19:56:32 +00:00
|
|
|
static NS_DEFINE_CID(kWindowMediatorCID, NS_WINDOWMEDIATOR_CID); // For window.find()
|
2002-03-20 11:23:13 +00:00
|
|
|
static NS_DEFINE_CID(kCStringBundleServiceCID, NS_STRINGBUNDLESERVICE_CID);
|
|
|
|
|
2003-04-09 00:52:48 +00:00
|
|
|
static const char sJSStackContractID[] = "@mozilla.org/js/xpc/ContextStack;1";
|
2002-02-26 05:28:26 +00:00
|
|
|
|
2003-04-09 00:52:48 +00:00
|
|
|
static const char kDOMBundleURL[] = "chrome://global/locale/commonDialogs.properties";
|
2005-02-23 16:53:28 +00:00
|
|
|
static const char kDOMSecurityWarningsBundleURL[] = "chrome://global/locale/dom/dom.properties";
|
2002-03-20 11:23:13 +00:00
|
|
|
|
2003-04-09 00:52:48 +00:00
|
|
|
static const char kCryptoContractID[] = NS_CRYPTO_CONTRACTID;
|
|
|
|
static const char kPkcs11ContractID[] = NS_PKCS11_CONTRACTID;
|
1999-10-14 10:58:25 +00:00
|
|
|
|
2004-02-03 02:22:54 +00:00
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
//*** nsGlobalWindow: Object Management
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
nsGlobalWindow::nsGlobalWindow(nsGlobalWindow *aOuterWindow)
|
|
|
|
: nsPIDOMWindow(aOuterWindow),
|
2005-08-19 20:09:38 +00:00
|
|
|
mIsFrozen(PR_FALSE),
|
2002-11-28 01:35:45 +00:00
|
|
|
mFullScreen(PR_FALSE),
|
2004-06-23 01:11:06 +00:00
|
|
|
mIsClosed(PR_FALSE),
|
2004-12-07 16:09:22 +00:00
|
|
|
mInClose(PR_FALSE),
|
2005-10-14 21:56:21 +00:00
|
|
|
mHavePendingClose(PR_FALSE),
|
2003-06-20 22:44:33 +00:00
|
|
|
mOpenerWasCleared(PR_FALSE),
|
2004-02-03 02:22:54 +00:00
|
|
|
mIsPopupSpam(PR_FALSE),
|
2005-07-30 20:57:07 +00:00
|
|
|
mArguments(nsnull),
|
2005-08-15 18:16:42 +00:00
|
|
|
mGlobalObjectOwner(nsnull),
|
|
|
|
mDocShell(nsnull),
|
2004-06-23 01:11:06 +00:00
|
|
|
mTimeouts(nsnull),
|
|
|
|
mTimeoutInsertionPoint(&mTimeouts),
|
|
|
|
mTimeoutPublicIdCounter(1),
|
|
|
|
mTimeoutFiringDepth(0),
|
2005-08-15 18:16:42 +00:00
|
|
|
mJSObject(nsnull)
|
1999-12-17 00:50:17 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
// Initialize the PRCList (this).
|
2005-07-30 20:57:07 +00:00
|
|
|
PR_INIT_CLIST(this);
|
|
|
|
|
|
|
|
if (aOuterWindow) {
|
2005-08-12 04:11:00 +00:00
|
|
|
// |this| is an inner window, add this inner window to the outer
|
|
|
|
// |window list of inners.
|
|
|
|
PR_INSERT_AFTER(this, aOuterWindow);
|
2005-07-30 20:57:07 +00:00
|
|
|
}
|
2004-05-03 21:48:36 +00:00
|
|
|
|
2001-05-18 00:02:52 +00:00
|
|
|
// We could have failed the first time through trying
|
|
|
|
// to create the entropy collector, so we should
|
|
|
|
// try to get one until we succeed.
|
|
|
|
if (gRefCnt++ == 0 || !gEntropyCollector) {
|
2002-11-25 23:21:25 +00:00
|
|
|
CallGetService(NS_ENTROPYCOLLECTOR_CONTRACTID, &gEntropyCollector);
|
|
|
|
}
|
2004-01-21 21:13:39 +00:00
|
|
|
#ifdef DEBUG
|
|
|
|
printf("++DOMWINDOW == %d\n", gRefCnt);
|
|
|
|
#endif
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2002-05-17 22:24:06 +00:00
|
|
|
if (!sSecMan) {
|
2002-11-25 23:21:25 +00:00
|
|
|
CallGetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &sSecMan);
|
2002-05-17 22:24:06 +00:00
|
|
|
}
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::~nsGlobalWindow()
|
2000-08-22 03:51:17 +00:00
|
|
|
{
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
if (!--gRefCnt) {
|
|
|
|
NS_IF_RELEASE(gEntropyCollector);
|
|
|
|
}
|
2004-01-21 21:13:39 +00:00
|
|
|
#ifdef DEBUG
|
|
|
|
printf("--DOMWINDOW == %d\n", gRefCnt);
|
|
|
|
#endif
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2005-08-12 04:11:00 +00:00
|
|
|
if (IsOuterWindow()) {
|
|
|
|
// An outer window is destroyed with inner windows still possibly
|
|
|
|
// alive, iterate through the inner windows and null out their
|
|
|
|
// back pointer to this outer, and pull them out of the list of
|
|
|
|
// inner windows.
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2005-08-12 04:11:00 +00:00
|
|
|
nsGlobalWindow *w;
|
2005-07-30 20:57:07 +00:00
|
|
|
while ((w = (nsGlobalWindow *)PR_LIST_HEAD(this)) != this) {
|
|
|
|
NS_ASSERTION(w->mOuterWindow == this, "Uh, bad outer window pointer?");
|
|
|
|
|
|
|
|
w->mOuterWindow = nsnull;
|
|
|
|
|
|
|
|
PR_REMOVE_AND_INIT_LINK(w);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// An inner window is destroyed, pull it out of the outer window's
|
|
|
|
// list if inner windows.
|
|
|
|
|
|
|
|
PR_REMOVE_LINK(this);
|
2005-08-12 04:11:00 +00:00
|
|
|
|
|
|
|
// If our outer window's inner window is this window, null out the
|
|
|
|
// outer window's reference to this window that's being deleted.
|
|
|
|
nsGlobalWindow *outer = GetOuterWindowInternal();
|
|
|
|
if (outer && outer->mInnerWindow == this) {
|
|
|
|
outer->mInnerWindow = nsnull;
|
|
|
|
}
|
2005-07-30 20:57:07 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
mDocument = nsnull; // Forces Release
|
2005-10-20 23:32:54 +00:00
|
|
|
mDoc = nsnull;
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2005-08-12 04:11:00 +00:00
|
|
|
NS_ASSERTION(!mArguments, "mArguments wasn't cleaned up properly!");
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
CleanUp();
|
1999-12-17 00:50:17 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
// static
|
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ShutDown()
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
{
|
2002-05-17 22:24:06 +00:00
|
|
|
NS_IF_RELEASE(sSecMan);
|
2002-07-08 07:11:59 +00:00
|
|
|
NS_IF_RELEASE(sComputedDOMStyleFactory);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
}
|
|
|
|
|
2002-12-20 08:00:08 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::CleanUp()
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2003-06-20 23:51:46 +00:00
|
|
|
mNavigator = nsnull;
|
|
|
|
mScreen = nsnull;
|
|
|
|
mHistory = nsnull;
|
|
|
|
mMenubar = nsnull;
|
|
|
|
mToolbar = nsnull;
|
|
|
|
mLocationbar = nsnull;
|
|
|
|
mPersonalbar = nsnull;
|
|
|
|
mStatusbar = nsnull;
|
|
|
|
mScrollbars = nsnull;
|
|
|
|
mLocation = nsnull;
|
|
|
|
mFrames = nsnull;
|
2002-12-20 08:00:08 +00:00
|
|
|
|
|
|
|
ClearControllers();
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
mOpener = nsnull; // Forces Release
|
2005-02-20 17:02:02 +00:00
|
|
|
if (mContext) {
|
|
|
|
mContext->SetOwner(nsnull);
|
|
|
|
mContext = nsnull; // Forces Release
|
|
|
|
}
|
2001-06-26 21:29:08 +00:00
|
|
|
mChromeEventHandler = nsnull; // Forces Release
|
2004-02-03 02:22:54 +00:00
|
|
|
|
2004-05-03 21:48:36 +00:00
|
|
|
if (IsPopupSpamWindow()) {
|
2004-02-03 02:22:54 +00:00
|
|
|
SetPopupSpamWindow(PR_FALSE);
|
|
|
|
--gOpenPopupSpamCount;
|
|
|
|
}
|
2005-07-30 20:57:07 +00:00
|
|
|
|
|
|
|
nsGlobalWindow *inner = GetCurrentInnerWindowInternal();
|
|
|
|
|
|
|
|
if (inner) {
|
|
|
|
inner->CleanUp();
|
|
|
|
}
|
|
|
|
|
|
|
|
mInnerWindowHolder = nsnull;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
|
|
|
|
2002-12-20 08:00:08 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ClearControllers()
|
2002-12-20 08:00:08 +00:00
|
|
|
{
|
2003-04-12 03:08:23 +00:00
|
|
|
if (mControllers) {
|
|
|
|
PRUint32 count;
|
|
|
|
mControllers->GetControllerCount(&count);
|
2002-12-20 08:00:08 +00:00
|
|
|
|
2003-04-12 03:08:23 +00:00
|
|
|
while (count--) {
|
|
|
|
nsCOMPtr<nsIController> controller;
|
|
|
|
mControllers->GetControllerAt(count, getter_AddRefs(controller));
|
2002-12-20 08:00:08 +00:00
|
|
|
|
2003-04-15 19:55:10 +00:00
|
|
|
nsCOMPtr<nsIControllerContext> context = do_QueryInterface(controller);
|
2003-04-12 03:08:23 +00:00
|
|
|
if (context)
|
|
|
|
context->SetCommandContext(nsnull);
|
2002-12-20 08:00:08 +00:00
|
|
|
}
|
|
|
|
|
2003-04-12 03:08:23 +00:00
|
|
|
mControllers = nsnull;
|
|
|
|
}
|
2002-12-20 08:00:08 +00:00
|
|
|
}
|
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
void
|
|
|
|
nsGlobalWindow::FreeInnerObjects(JSContext *cx)
|
|
|
|
{
|
|
|
|
NS_ASSERTION(IsInnerWindow(), "Don't free inner objects on an outer window");
|
|
|
|
|
|
|
|
ClearAllTimeouts();
|
|
|
|
|
|
|
|
mChromeEventHandler = nsnull;
|
|
|
|
|
|
|
|
if (mListenerManager) {
|
|
|
|
mListenerManager->RemoveAllListeners(PR_FALSE);
|
|
|
|
mListenerManager = nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mDocument) {
|
2005-10-20 23:32:54 +00:00
|
|
|
NS_ASSERTION(mDoc, "Why is mDoc null?");
|
2005-08-15 18:16:42 +00:00
|
|
|
|
|
|
|
// Remember the document's principal.
|
2005-10-20 23:32:54 +00:00
|
|
|
mDocumentPrincipal = mDoc->GetPrincipal();
|
2005-08-15 18:16:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Remove our reference to the document and the document principal.
|
|
|
|
mDocument = nsnull;
|
2005-10-20 23:32:54 +00:00
|
|
|
mDoc = nsnull;
|
2005-08-15 18:16:42 +00:00
|
|
|
|
|
|
|
if (mJSObject && cx) {
|
|
|
|
::JS_ClearScope(cx, mJSObject);
|
|
|
|
::JS_ClearWatchPointsForObject(cx, mJSObject);
|
|
|
|
|
|
|
|
nsWindowSH::InvalidateGlobalScopePolluter(cx, mJSObject);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow::nsISupports
|
2000-08-22 03:51:17 +00:00
|
|
|
//*****************************************************************************
|
2000-02-08 13:40:10 +00:00
|
|
|
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
// QueryInterface implementation for nsGlobalWindow
|
|
|
|
NS_INTERFACE_MAP_BEGIN(nsGlobalWindow)
|
2005-08-02 01:23:40 +00:00
|
|
|
// Make sure this matches the cast in nsGlobalWindow::FromWrapper()
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIScriptGlobalObject)
|
2000-09-01 01:54:35 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMWindowInternal)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMWindow)
|
2004-05-26 18:10:47 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMWindow2)
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMJSWindow)
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIScriptGlobalObject)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIScriptObjectPrincipal)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMEventReceiver)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMEventTarget)
|
2002-11-09 00:25:25 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOM3EventTarget)
|
2005-04-28 23:48:28 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMNSEventTarget)
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsPIDOMWindow)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMViewCSS)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMAbstractView)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
|
2001-05-17 02:15:27 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(Window)
|
2000-02-08 13:40:10 +00:00
|
|
|
NS_INTERFACE_MAP_END
|
1998-07-16 01:16:47 +00:00
|
|
|
|
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
NS_IMPL_ADDREF(nsGlobalWindow)
|
|
|
|
NS_IMPL_RELEASE(nsGlobalWindow)
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow::nsIScriptGlobalObject
|
2000-08-22 03:51:17 +00:00
|
|
|
//*****************************************************************************
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetContext(nsIScriptContext* aContext)
|
1999-05-14 03:10:51 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
NS_ASSERTION(IsOuterWindow(), "Uh, SetContext() called on inner window!");
|
2005-08-12 04:11:00 +00:00
|
|
|
NS_ASSERTION(!aContext || !mContext, "Bad call to SetContext()!");
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
// if setting the context to null, then we won't get to clean up the
|
|
|
|
// named reference, so do it now
|
|
|
|
if (!aContext) {
|
|
|
|
NS_WARNING("Possibly early removal of script object, see bug #41608");
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
} else {
|
|
|
|
JSContext *cx = (JSContext *)aContext->GetNativeContext();
|
|
|
|
|
|
|
|
mJSObject = ::JS_GetGlobalObject(cx);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
|
|
|
|
2005-02-20 17:02:02 +00:00
|
|
|
if (mContext) {
|
|
|
|
mContext->SetOwner(nsnull);
|
|
|
|
}
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
mContext = aContext;
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2001-10-19 04:13:37 +00:00
|
|
|
if (mContext) {
|
2004-07-05 15:51:31 +00:00
|
|
|
if (IsFrame()) {
|
2001-10-19 04:13:37 +00:00
|
|
|
// This window is a [i]frame, don't bother GC'ing when the
|
|
|
|
// frame's context is destroyed since a GC will happen when the
|
|
|
|
// frameset or host document is destroyed anyway.
|
|
|
|
|
|
|
|
mContext->SetGCOnDestruction(PR_FALSE);
|
|
|
|
}
|
|
|
|
}
|
1999-05-14 03:10:51 +00:00
|
|
|
}
|
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
nsIScriptContext *
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetContext()
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetContext, (), nsnull);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
return mContext;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1999-07-27 20:51:39 +00:00
|
|
|
|
2005-08-23 00:24:57 +00:00
|
|
|
PRBool
|
|
|
|
nsGlobalWindow::WouldReuseInnerWindow(nsIDocument *aNewDocument)
|
|
|
|
{
|
|
|
|
return WouldReuseInnerWindow(aNewDocument, PR_TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
PRBool
|
|
|
|
nsGlobalWindow::WouldReuseInnerWindow(nsIDocument *aNewDocument, PRBool useDocURI)
|
|
|
|
{
|
|
|
|
// We reuse the inner window when:
|
|
|
|
// a. We are currently at about:blank
|
|
|
|
// b. At least one of the following conditions are true:
|
|
|
|
// -- We are not currently a content window (i.e., we're currently a chrome
|
|
|
|
// window).
|
|
|
|
// -- The new document is the same as the old document. This means that we're
|
|
|
|
// getting called from document.open().
|
|
|
|
// -- The new URI has the same origin as the script opener uri for our current
|
|
|
|
// window.
|
|
|
|
|
2005-10-20 23:32:54 +00:00
|
|
|
if (!mDoc || !aNewDocument) {
|
2005-08-23 00:24:57 +00:00
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIURI> newURI;
|
|
|
|
if (useDocURI) {
|
|
|
|
newURI = aNewDocument->GetDocumentURI();
|
|
|
|
} else {
|
|
|
|
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(mDocShell));
|
|
|
|
|
|
|
|
if (webNav) {
|
|
|
|
webNav->GetCurrentURI(getter_AddRefs(newURI));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-10-20 23:32:54 +00:00
|
|
|
nsIURI* curURI = mDoc->GetDocumentURI();
|
2005-08-23 00:24:57 +00:00
|
|
|
if (!curURI || !newURI) {
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PRBool isAbout;
|
|
|
|
if (NS_FAILED(curURI->SchemeIs("about", &isAbout)) || !isAbout) {
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCAutoString uri;
|
|
|
|
curURI->GetSpec(uri);
|
|
|
|
if (!uri.EqualsLiteral("about:blank")) {
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Great, we're an about:blank document, check for one of the other
|
|
|
|
// conditions.
|
2005-10-20 23:32:54 +00:00
|
|
|
if (mDoc == aNewDocument) {
|
2005-08-23 00:24:57 +00:00
|
|
|
// aClearScopeHint is false.
|
|
|
|
return PR_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mOpenerScriptURL) {
|
|
|
|
if (sSecMan) {
|
|
|
|
PRBool isSameOrigin = PR_FALSE;
|
|
|
|
sSecMan->SecurityCompareURIs(mOpenerScriptURL, newURI, &isSameOrigin);
|
|
|
|
if (isSameOrigin) {
|
|
|
|
// The origin is the same.
|
|
|
|
return PR_TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> treeItem(do_QueryInterface(mDocShell));
|
|
|
|
|
|
|
|
if (treeItem) {
|
|
|
|
PRInt32 itemType = nsIDocShellTreeItem::typeContent;
|
|
|
|
treeItem->GetItemType(&itemType);
|
|
|
|
|
|
|
|
// If we're a chrome window, then we want to reuse the inner window.
|
|
|
|
return itemType == nsIDocShellTreeItem::typeChrome;
|
|
|
|
}
|
|
|
|
|
|
|
|
// No treeItem: don't reuse the current inner window.
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
|
2004-05-03 21:48:36 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetOpenerScriptURL(nsIURI* aURI)
|
2003-05-05 20:55:37 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
FORWARD_TO_OUTER_VOID(SetOpenerScriptURL, (aURI));
|
|
|
|
|
2003-05-05 20:55:37 +00:00
|
|
|
mOpenerScriptURL = aURI;
|
|
|
|
}
|
|
|
|
|
2004-09-04 19:28:46 +00:00
|
|
|
PopupControlState
|
2004-09-23 23:39:16 +00:00
|
|
|
PushPopupControlState(PopupControlState aState, PRBool aForce)
|
2004-09-04 19:28:46 +00:00
|
|
|
{
|
|
|
|
PopupControlState oldState = gPopupControlState;
|
|
|
|
|
2004-09-23 23:39:16 +00:00
|
|
|
if (aState < gPopupControlState || aForce) {
|
2004-09-04 19:28:46 +00:00
|
|
|
gPopupControlState = aState;
|
|
|
|
}
|
|
|
|
|
|
|
|
return oldState;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
PopPopupControlState(PopupControlState aState)
|
|
|
|
{
|
|
|
|
gPopupControlState = aState;
|
|
|
|
}
|
|
|
|
|
|
|
|
PopupControlState
|
2005-06-18 06:06:45 +00:00
|
|
|
nsGlobalWindow::PushPopupControlState(PopupControlState aState,
|
|
|
|
PRBool aForce) const
|
2004-09-04 19:28:46 +00:00
|
|
|
{
|
2005-06-18 06:06:45 +00:00
|
|
|
return ::PushPopupControlState(aState, aForce);
|
2004-09-04 19:28:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::PopPopupControlState(PopupControlState aState) const
|
2004-09-04 19:28:46 +00:00
|
|
|
{
|
|
|
|
::PopPopupControlState(aState);
|
|
|
|
}
|
|
|
|
|
|
|
|
PopupControlState
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetPopupControlState() const
|
2004-09-04 19:28:46 +00:00
|
|
|
{
|
|
|
|
return gPopupControlState;
|
|
|
|
}
|
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
#define WINDOWSTATEHOLDER_IID \
|
2005-09-01 23:02:57 +00:00
|
|
|
{0x0b917c3e, 0xbd50, 0x4683, {0xaf, 0xc9, 0xc7, 0x81, 0x07, 0xae, 0x33, 0x26}}
|
2005-08-15 18:16:42 +00:00
|
|
|
|
|
|
|
class WindowStateHolder : public nsISupports
|
|
|
|
{
|
|
|
|
public:
|
2005-11-11 14:36:26 +00:00
|
|
|
NS_DECLARE_STATIC_IID_ACCESSOR(WINDOWSTATEHOLDER_IID)
|
2005-08-15 18:16:42 +00:00
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
|
|
|
|
WindowStateHolder(nsGlobalWindow *aWindow,
|
|
|
|
nsIXPConnectJSObjectHolder *aHolder,
|
2005-08-23 01:42:49 +00:00
|
|
|
nsNavigator *aNavigator,
|
2005-09-01 23:02:57 +00:00
|
|
|
nsLocation *aLocation,
|
|
|
|
nsIXPConnectJSObjectHolder *aOuterProto);
|
2005-08-15 18:16:42 +00:00
|
|
|
|
|
|
|
// Get the contents of focus memory when the state was saved
|
|
|
|
// (if the focus was inside of this window).
|
|
|
|
nsIDOMElement* GetFocusedElement() { return mFocusedElement; }
|
|
|
|
nsIDOMWindowInternal* GetFocusedWindow() { return mFocusedWindow; }
|
|
|
|
|
|
|
|
nsGlobalWindow* GetInnerWindow() { return mInnerWindow; }
|
|
|
|
nsIXPConnectJSObjectHolder* GetInnerWindowHolder()
|
|
|
|
{ return mInnerWindowHolder; }
|
|
|
|
|
|
|
|
nsNavigator* GetNavigator() { return mNavigator; }
|
2005-08-23 01:42:49 +00:00
|
|
|
nsLocation* GetLocation() { return mLocation; }
|
2005-09-01 23:02:57 +00:00
|
|
|
nsIXPConnectJSObjectHolder* GetOuterProto() { return mOuterProto; }
|
2005-08-15 18:16:42 +00:00
|
|
|
|
|
|
|
void DidRestoreWindow()
|
|
|
|
{
|
|
|
|
mInnerWindow = nsnull;
|
|
|
|
mInnerWindowHolder = nsnull;
|
|
|
|
mNavigator = nsnull;
|
2005-08-23 01:42:49 +00:00
|
|
|
mLocation = nsnull;
|
2005-09-01 23:02:57 +00:00
|
|
|
mOuterProto = nsnull;
|
2005-08-15 18:16:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
~WindowStateHolder();
|
|
|
|
|
|
|
|
nsGlobalWindow *mInnerWindow;
|
|
|
|
// We hold onto this to make sure the inner window doesn't go away. The outer
|
|
|
|
// window ends up recalculating it anyway.
|
|
|
|
nsCOMPtr<nsIXPConnectJSObjectHolder> mInnerWindowHolder;
|
|
|
|
nsRefPtr<nsNavigator> mNavigator;
|
2005-08-23 01:42:49 +00:00
|
|
|
nsRefPtr<nsLocation> mLocation;
|
2005-08-15 18:16:42 +00:00
|
|
|
nsCOMPtr<nsIDOMElement> mFocusedElement;
|
|
|
|
nsCOMPtr<nsIDOMWindowInternal> mFocusedWindow;
|
2005-09-01 23:02:57 +00:00
|
|
|
nsCOMPtr<nsIXPConnectJSObjectHolder> mOuterProto;
|
2005-08-15 18:16:42 +00:00
|
|
|
};
|
|
|
|
|
2005-11-11 14:36:26 +00:00
|
|
|
NS_DEFINE_STATIC_IID_ACCESSOR(WindowStateHolder, WINDOWSTATEHOLDER_IID)
|
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
WindowStateHolder::WindowStateHolder(nsGlobalWindow *aWindow,
|
|
|
|
nsIXPConnectJSObjectHolder *aHolder,
|
2005-08-23 01:42:49 +00:00
|
|
|
nsNavigator *aNavigator,
|
2005-09-01 23:02:57 +00:00
|
|
|
nsLocation *aLocation,
|
|
|
|
nsIXPConnectJSObjectHolder *aOuterProto)
|
2005-08-15 18:16:42 +00:00
|
|
|
: mInnerWindow(aWindow),
|
|
|
|
mInnerWindowHolder(aHolder),
|
2005-08-23 01:42:49 +00:00
|
|
|
mNavigator(aNavigator),
|
2005-09-01 23:02:57 +00:00
|
|
|
mLocation(aLocation),
|
|
|
|
mOuterProto(aOuterProto)
|
2005-08-15 18:16:42 +00:00
|
|
|
{
|
|
|
|
NS_PRECONDITION(aWindow, "null window");
|
|
|
|
NS_PRECONDITION(aWindow->IsInnerWindow(), "Saving an outer window");
|
|
|
|
|
|
|
|
nsIFocusController *fc = aWindow->GetRootFocusController();
|
|
|
|
NS_ASSERTION(fc, "null focus controller");
|
|
|
|
|
|
|
|
// We want to save the focused element/window only if they are inside of
|
|
|
|
// this window.
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMWindowInternal> focusWinInternal;
|
|
|
|
fc->GetFocusedWindow(getter_AddRefs(focusWinInternal));
|
|
|
|
|
|
|
|
nsCOMPtr<nsPIDOMWindow> focusedWindow = do_QueryInterface(focusWinInternal);
|
|
|
|
|
|
|
|
// The outer window is used for focus purposes, so make sure that's what
|
|
|
|
// we're looking for.
|
|
|
|
nsPIDOMWindow *targetWindow = aWindow->GetOuterWindow();
|
|
|
|
|
|
|
|
while (focusedWindow) {
|
|
|
|
if (focusedWindow == targetWindow) {
|
|
|
|
fc->GetFocusedWindow(getter_AddRefs(mFocusedWindow));
|
|
|
|
fc->GetFocusedElement(getter_AddRefs(mFocusedElement));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
focusedWindow =
|
|
|
|
NS_STATIC_CAST(nsGlobalWindow*,
|
|
|
|
NS_STATIC_CAST(nsPIDOMWindow*,
|
|
|
|
focusedWindow))->GetPrivateParent();
|
|
|
|
}
|
|
|
|
|
|
|
|
aWindow->SuspendTimeouts();
|
|
|
|
}
|
|
|
|
|
|
|
|
WindowStateHolder::~WindowStateHolder()
|
|
|
|
{
|
|
|
|
if (mInnerWindow) {
|
|
|
|
// This window was left in the bfcache and is now going away. We need to
|
|
|
|
// free it up.
|
|
|
|
nsCOMPtr<nsIThreadJSContextStack> stack(do_GetService(sJSStackContractID));
|
|
|
|
JSContext *cx = nsnull;
|
|
|
|
|
|
|
|
if (stack)
|
|
|
|
stack->GetSafeJSContext(&cx);
|
|
|
|
|
|
|
|
if (!cx) {
|
|
|
|
NS_WARNING("Trusting GC to finish cleaning up this inner window");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
mInnerWindow->FreeInnerObjects(cx);
|
2005-08-23 01:42:49 +00:00
|
|
|
|
|
|
|
if (mLocation) {
|
|
|
|
// Don't leave the weak reference to the docshell lying around.
|
|
|
|
mLocation->SetDocShell(nsnull);
|
|
|
|
}
|
2005-08-15 18:16:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMPL_ISUPPORTS1(WindowStateHolder, WindowStateHolder)
|
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetNewDocument(nsIDOMDocument* aDocument,
|
2005-08-15 18:16:42 +00:00
|
|
|
nsISupports* aState,
|
2004-12-10 19:48:22 +00:00
|
|
|
PRBool aRemoveEventListeners,
|
|
|
|
PRBool aClearScopeHint)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-08-15 18:16:42 +00:00
|
|
|
return SetNewDocument(aDocument, aState, aRemoveEventListeners,
|
|
|
|
aClearScopeHint, PR_FALSE);
|
2005-07-30 20:57:07 +00:00
|
|
|
}
|
2000-09-20 23:38:28 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
nsresult
|
|
|
|
nsGlobalWindow::SetNewDocument(nsIDOMDocument* aDocument,
|
2005-08-15 18:16:42 +00:00
|
|
|
nsISupports* aState,
|
2005-07-30 20:57:07 +00:00
|
|
|
PRBool aRemoveEventListeners,
|
|
|
|
PRBool aClearScopeHint,
|
|
|
|
PRBool aIsInternalCall)
|
|
|
|
{
|
2005-07-31 16:44:28 +00:00
|
|
|
NS_WARN_IF_FALSE(mDocumentPrincipal == nsnull,
|
|
|
|
"mDocumentPrincipal prematurely set!");
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
if (!aIsInternalCall && IsInnerWindow()) {
|
2005-08-12 04:11:00 +00:00
|
|
|
if (!mOuterWindow) {
|
|
|
|
return NS_ERROR_NOT_INITIALIZED;
|
|
|
|
}
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
return GetOuterWindowInternal()->SetNewDocument(aDocument,
|
2005-08-15 18:16:42 +00:00
|
|
|
aState,
|
2005-07-30 20:57:07 +00:00
|
|
|
aRemoveEventListeners,
|
|
|
|
aClearScopeHint, PR_TRUE);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-08-09 03:30:46 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
if (!aDocument) {
|
|
|
|
NS_ERROR("SetNewDocument(null) called!");
|
|
|
|
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
2005-07-31 16:44:28 +00:00
|
|
|
NS_ASSERTION(!GetCurrentInnerWindow() ||
|
|
|
|
GetCurrentInnerWindow()->GetExtantDocument() == mDocument,
|
|
|
|
"Uh, mDocument doesn't match the current inner window "
|
|
|
|
"document!");
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
nsCOMPtr<nsIDocument> newDoc(do_QueryInterface(aDocument));
|
|
|
|
NS_ENSURE_TRUE(newDoc, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
nsresult rv = NS_OK;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> oldDoc(do_QueryInterface(mDocument));
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
// Always clear watchpoints, to deal with two cases:
|
|
|
|
// 1. The first document for this window is loading, and a miscreant has
|
|
|
|
// preset watchpoints on the window object in order to attack the new
|
|
|
|
// document's privileged information.
|
|
|
|
// 2. A document loaded and used watchpoints on its own window, leaving
|
2002-11-28 01:04:18 +00:00
|
|
|
// them set until the next document loads. We must clean up window
|
2000-08-22 03:51:17 +00:00
|
|
|
// watchpoints here.
|
|
|
|
// Watchpoints set on document and subordinate objects are all cleared
|
|
|
|
// when those sub-window objects are finalized, after JS_ClearScope and
|
|
|
|
// a GC run that finds them to be garbage.
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
// XXXjst: Update above comment.
|
|
|
|
nsIScriptContext *scx = GetContextInternal();
|
2005-08-19 20:09:38 +00:00
|
|
|
NS_ENSURE_TRUE(scx, NS_ERROR_NOT_INITIALIZED);
|
|
|
|
|
|
|
|
JSContext *cx = (JSContext *)scx->GetNativeContext();
|
2003-06-18 23:48:57 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
// clear smartcard events, our document has gone away.
|
|
|
|
if (mCrypto) {
|
|
|
|
mCrypto->SetEnableSmartCardEvents(PR_FALSE);
|
|
|
|
}
|
2003-06-18 23:48:57 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
if (!mDocument) {
|
|
|
|
// First document load.
|
2003-06-18 23:48:57 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
// Get our private root. If it is equal to us, then we need to
|
2005-08-19 09:46:25 +00:00
|
|
|
// attach our global key bindings that handles browser scrolling
|
2005-07-30 20:57:07 +00:00
|
|
|
// and other browser commands.
|
|
|
|
nsIDOMWindowInternal *internal = nsGlobalWindow::GetPrivateRoot();
|
2003-06-18 23:48:57 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
if (internal == NS_STATIC_CAST(nsIDOMWindowInternal *, this)) {
|
|
|
|
nsCOMPtr<nsIXBLService> xblService = do_GetService("@mozilla.org/xbl;1");
|
|
|
|
if (xblService) {
|
|
|
|
nsCOMPtr<nsIDOMEventReceiver> rec =
|
|
|
|
do_QueryInterface(mChromeEventHandler);
|
|
|
|
xblService->AttachGlobalKeyHandler(rec);
|
2003-06-18 23:48:57 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
// for now, the only way to get drag/drop is to use the XUL
|
|
|
|
// wrapper. There are just too many things that need to be
|
|
|
|
// added to hookup DnD with XBL (pinkerton)
|
|
|
|
//xblService->AttachGlobalDragHandler(rec);
|
2003-06-18 23:48:57 +00:00
|
|
|
}
|
|
|
|
}
|
2005-07-30 20:57:07 +00:00
|
|
|
}
|
2003-06-18 23:48:57 +00:00
|
|
|
|
2005-08-12 04:11:00 +00:00
|
|
|
/* No mDocShell means we're either an inner window or we're already
|
2005-07-30 20:57:07 +00:00
|
|
|
been partially closed down. When that happens, setting status
|
|
|
|
isn't a big requirement, so don't. (Doesn't happen under normal
|
|
|
|
circumstances, but bug 49615 describes a case.) */
|
2005-06-02 01:17:35 +00:00
|
|
|
|
2005-08-12 04:11:00 +00:00
|
|
|
SetStatus(EmptyString());
|
|
|
|
SetDefaultStatus(EmptyString());
|
2002-06-21 19:34:54 +00:00
|
|
|
|
2005-08-12 04:11:00 +00:00
|
|
|
// This code should not be called during shutdown any more (now that
|
|
|
|
// we don't ever call SetNewDocument(nsnull), so no need to null
|
|
|
|
// check xpc here.
|
2005-07-30 20:57:07 +00:00
|
|
|
nsIXPConnect *xpc = nsContentUtils::XPConnect();
|
|
|
|
|
2005-08-23 00:24:57 +00:00
|
|
|
PRBool reUseInnerWindow = WouldReuseInnerWindow(newDoc, PR_FALSE);
|
2000-09-14 06:18:09 +00:00
|
|
|
|
2005-08-23 00:24:57 +00:00
|
|
|
// XXX We used to share event listeners between inner windows in special
|
|
|
|
// circumstances (that were remarkably close to the conditions that we set
|
|
|
|
// reUseInnerWindow in) but that left dangling pointers to the old (destroyed)
|
|
|
|
// inner window (bug 303765). Setting this here should be a no-op.
|
|
|
|
aRemoveEventListeners = !reUseInnerWindow;
|
2000-09-22 05:02:20 +00:00
|
|
|
|
2005-07-31 16:44:28 +00:00
|
|
|
// Remember the old document's principal.
|
|
|
|
nsIPrincipal *oldPrincipal = nsnull;
|
|
|
|
|
|
|
|
if (oldDoc) {
|
|
|
|
oldPrincipal = oldDoc->GetPrincipal();
|
|
|
|
}
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
// Drop our reference to the navigator object unless we're reusing
|
|
|
|
// the existing inner window or the new document is from the same
|
|
|
|
// origin as the old document.
|
2005-07-31 16:44:28 +00:00
|
|
|
if (!reUseInnerWindow && mNavigator && oldPrincipal) {
|
2005-07-30 20:57:07 +00:00
|
|
|
nsIPrincipal *newPrincipal = newDoc->GetPrincipal();
|
|
|
|
rv = NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
if (newPrincipal) {
|
|
|
|
rv = sSecMan->CheckSameOriginPrincipal(oldPrincipal, newPrincipal);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
// Different origins. Release the navigator object so it gets
|
|
|
|
// recreated for the new document. The plugins or mime types
|
|
|
|
// arrays may have changed. See bug 150087.
|
|
|
|
mNavigator->SetDocShell(nsnull);
|
|
|
|
|
|
|
|
mNavigator = nsnull;
|
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-08-09 03:30:46 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
if (mNavigator && newDoc != oldDoc) {
|
|
|
|
// We didn't drop our reference to our old navigator object and
|
|
|
|
// we're loading a new document. Notify the navigator object about
|
|
|
|
// the new document load so that it can make sure it is ready for
|
|
|
|
// the new document.
|
2002-07-09 03:43:15 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
mNavigator->LoadingNewDocument();
|
2000-10-06 00:22:56 +00:00
|
|
|
}
|
2000-08-29 02:04:44 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
// Set mDocument even if this is an outer window to avoid
|
|
|
|
// having to *always* reach into the inner window to find the
|
|
|
|
// document.
|
2000-08-09 03:30:46 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
mDocument = aDocument;
|
2005-10-20 23:32:54 +00:00
|
|
|
mDoc = newDoc;
|
2001-07-13 01:30:44 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
if (IsOuterWindow()) {
|
|
|
|
scx->WillInitializeContext();
|
2001-07-11 09:09:30 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
nsGlobalWindow *currentInner = GetCurrentInnerWindowInternal();
|
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
if (currentInner && !currentInner->IsFrozen()) {
|
2005-07-30 20:57:07 +00:00
|
|
|
if (!reUseInnerWindow) {
|
|
|
|
currentInner->ClearAllTimeouts();
|
|
|
|
|
|
|
|
currentInner->mChromeEventHandler = nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aRemoveEventListeners && currentInner->mListenerManager) {
|
|
|
|
currentInner->mListenerManager->RemoveAllListeners(PR_FALSE);
|
|
|
|
currentInner->mListenerManager = nsnull;
|
|
|
|
}
|
|
|
|
|
2005-08-29 22:04:39 +00:00
|
|
|
if (!reUseInnerWindow || newDoc != oldDoc) {
|
|
|
|
nsWindowSH::InvalidateGlobalScopePolluter(cx, currentInner->mJSObject);
|
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-08-09 03:30:46 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
nsRefPtr<nsGlobalWindow> newInnerWindow;
|
2002-07-10 02:00:45 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
nsCOMPtr<nsIDOMChromeWindow> thisChrome =
|
|
|
|
do_QueryInterface(NS_STATIC_CAST(nsIDOMWindow *, this));
|
|
|
|
nsCOMPtr<nsIXPConnectJSObjectHolder> navigatorHolder;
|
2002-07-10 02:00:45 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
PRUint32 flags = 0;
|
|
|
|
|
2005-08-19 20:09:38 +00:00
|
|
|
// Make sure to clear scope on the outer window *before* we
|
|
|
|
// initialize the new inner window. If we don't, things
|
|
|
|
// (Object.prototype etc) could leak from the old outer to the new
|
|
|
|
// inner scope.
|
|
|
|
::JS_ClearScope(cx, mJSObject);
|
|
|
|
::JS_ClearWatchPointsForObject(cx, mJSObject);
|
|
|
|
|
|
|
|
// Clear the regexp statics for the new page unconditionally.
|
|
|
|
// XXX They don't get restored on the inner window when we go back.
|
|
|
|
::JS_ClearRegExpStatics(cx);
|
|
|
|
|
2005-08-23 01:42:49 +00:00
|
|
|
if (reUseInnerWindow) {
|
2005-07-30 20:57:07 +00:00
|
|
|
// We're reusing the current inner window.
|
2005-08-23 01:42:49 +00:00
|
|
|
NS_ASSERTION(!currentInner->IsFrozen(),
|
|
|
|
"We should never be reusing a shared inner window");
|
2005-07-30 20:57:07 +00:00
|
|
|
newInnerWindow = currentInner;
|
|
|
|
} else {
|
2005-08-15 18:16:42 +00:00
|
|
|
if (aState) {
|
|
|
|
nsCOMPtr<WindowStateHolder> wsh = do_QueryInterface(aState);
|
|
|
|
NS_ASSERTION(wsh, "What kind of weird state are you giving me here?");
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
newInnerWindow = wsh->GetInnerWindow();
|
|
|
|
mInnerWindowHolder = wsh->GetInnerWindowHolder();
|
2005-08-23 01:42:49 +00:00
|
|
|
|
|
|
|
// These assignments addref.
|
|
|
|
mNavigator = wsh->GetNavigator();
|
|
|
|
mLocation = wsh->GetLocation();
|
2005-08-18 18:43:33 +00:00
|
|
|
|
2005-08-19 17:11:30 +00:00
|
|
|
if (mNavigator) {
|
|
|
|
// Update mNavigator's docshell pointer now.
|
|
|
|
mNavigator->SetDocShell(mDocShell);
|
|
|
|
mNavigator->LoadingNewDocument();
|
|
|
|
}
|
2005-07-30 20:57:07 +00:00
|
|
|
} else {
|
2005-08-15 18:16:42 +00:00
|
|
|
if (thisChrome) {
|
|
|
|
newInnerWindow = new nsGlobalChromeWindow(this);
|
|
|
|
|
|
|
|
flags = nsIXPConnect::FLAG_SYSTEM_GLOBAL_OBJECT;
|
|
|
|
} else {
|
|
|
|
newInnerWindow = new nsGlobalWindow(this);
|
|
|
|
}
|
2005-08-23 01:42:49 +00:00
|
|
|
|
|
|
|
mLocation = nsnull;
|
2002-07-10 02:00:45 +00:00
|
|
|
}
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
if (!newInnerWindow) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
2003-05-05 20:55:37 +00:00
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
if (!aState) {
|
|
|
|
// This is redundant if we're restoring from a previous inner window.
|
|
|
|
nsIScriptGlobalObject *sgo =
|
|
|
|
(nsIScriptGlobalObject *)newInnerWindow.get();
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2005-08-19 20:09:38 +00:00
|
|
|
// Freeze the outer window and null out the inner window so
|
|
|
|
// that initializing classes on the new inner doesn't end up
|
|
|
|
// reaching into the old inner window for classes etc.
|
|
|
|
//
|
|
|
|
// [This happens with Object.prototype when XPConnect creates
|
|
|
|
// a temporary global while initializing classes; the reason
|
|
|
|
// being that xpconnect creates the temp global w/o a parent
|
|
|
|
// and proto, which makes the JS engine look up classes in
|
|
|
|
// cx->globalObject, i.e. this outer window].
|
|
|
|
|
|
|
|
mInnerWindow = nsnull;
|
|
|
|
|
2005-09-01 23:02:57 +00:00
|
|
|
Freeze();
|
|
|
|
rv = xpc->
|
2005-08-15 18:16:42 +00:00
|
|
|
InitClassesWithNewWrappedGlobal(cx, sgo, NS_GET_IID(nsISupports),
|
|
|
|
flags,
|
|
|
|
getter_AddRefs(mInnerWindowHolder));
|
2005-08-19 20:09:38 +00:00
|
|
|
Thaw();
|
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
mInnerWindowHolder->GetJSObject(&newInnerWindow->mJSObject);
|
|
|
|
}
|
2005-07-30 20:57:07 +00:00
|
|
|
|
|
|
|
if (currentInner && currentInner->mJSObject) {
|
2005-08-15 18:16:42 +00:00
|
|
|
if (mNavigator && !aState) {
|
2005-07-30 20:57:07 +00:00
|
|
|
// Hold on to the navigator wrapper so that we can set
|
|
|
|
// window.navigator in the new window to point to the same
|
|
|
|
// object (assuming we didn't change origins etc). See bug
|
|
|
|
// 163645 for more on why we need this.
|
|
|
|
|
|
|
|
nsIDOMNavigator* navigator =
|
|
|
|
NS_STATIC_CAST(nsIDOMNavigator*, mNavigator.get());
|
|
|
|
xpc->WrapNative(cx, currentInner->mJSObject, navigator,
|
|
|
|
NS_GET_IID(nsIDOMNavigator),
|
|
|
|
getter_AddRefs(navigatorHolder));
|
2003-05-05 20:55:37 +00:00
|
|
|
}
|
2002-07-10 02:00:45 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
PRBool termFuncSet = PR_FALSE;
|
2003-06-18 23:48:57 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
if (oldDoc == newDoc) {
|
|
|
|
nsCOMPtr<nsIJSContextStack> stack =
|
|
|
|
do_GetService(sJSStackContractID);
|
2004-08-27 21:06:19 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
JSContext *cx = nsnull;
|
2003-03-25 00:17:27 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
if (stack) {
|
|
|
|
stack->Peek(&cx);
|
|
|
|
}
|
2004-08-27 21:06:19 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
nsIScriptContext *callerScx;
|
2005-08-23 01:42:49 +00:00
|
|
|
if (cx && (callerScx = GetScriptContextFromJSContext(cx))) {
|
2005-07-30 20:57:07 +00:00
|
|
|
// We're called from document.open() (and document.open() is
|
|
|
|
// called from JS), clear the scope etc in a termination
|
|
|
|
// function on the calling context to prevent clearing the
|
|
|
|
// calling scope.
|
2005-08-23 01:42:49 +00:00
|
|
|
NS_ASSERTION(!currentInner->IsFrozen(),
|
|
|
|
"How does this opened window get into session history");
|
2005-07-30 20:57:07 +00:00
|
|
|
callerScx->SetTerminationFunction(ClearWindowScope,
|
|
|
|
NS_STATIC_CAST(nsIDOMWindow *,
|
|
|
|
currentInner));
|
|
|
|
|
|
|
|
termFuncSet = PR_TRUE;
|
2004-08-27 21:06:19 +00:00
|
|
|
}
|
2005-07-30 20:57:07 +00:00
|
|
|
}
|
2004-08-27 21:06:19 +00:00
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
// Don't clear scope on our current inner window if it's going to be
|
|
|
|
// held in the bfcache.
|
|
|
|
if (!currentInner->IsFrozen()) {
|
|
|
|
if (!termFuncSet) {
|
|
|
|
::JS_ClearScope(cx, currentInner->mJSObject);
|
|
|
|
::JS_ClearWatchPointsForObject(cx, currentInner->mJSObject);
|
|
|
|
}
|
2005-08-13 03:54:29 +00:00
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
// Make the current inner window release its strong references
|
|
|
|
// to the document to prevent it from keeping everything
|
|
|
|
// around. But remember the document's principal.
|
|
|
|
currentInner->mDocument = nsnull;
|
2005-10-20 23:32:54 +00:00
|
|
|
currentInner->mDoc = nsnull;
|
2005-08-15 18:16:42 +00:00
|
|
|
currentInner->mDocumentPrincipal = oldPrincipal;
|
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2003-11-26 15:45:40 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
mInnerWindow = newInnerWindow;
|
2005-08-19 20:09:38 +00:00
|
|
|
}
|
2003-11-26 15:45:40 +00:00
|
|
|
|
2005-08-29 22:04:39 +00:00
|
|
|
if ((!reUseInnerWindow || newDoc != oldDoc) && !aState) {
|
2005-08-19 20:09:38 +00:00
|
|
|
nsCOMPtr<nsIHTMLDocument> html_doc(do_QueryInterface(mDocument));
|
|
|
|
nsWindowSH::InstallGlobalScopePolluter(cx, newInnerWindow->mJSObject,
|
|
|
|
html_doc);
|
|
|
|
}
|
2005-02-23 23:31:37 +00:00
|
|
|
|
2005-09-01 23:02:57 +00:00
|
|
|
if (!aState && !reUseInnerWindow) {
|
|
|
|
// Loading a new page and creating a new inner window, *not*
|
|
|
|
// restoring from session history.
|
|
|
|
|
|
|
|
// InitClassesWithNewWrappedGlobal() for the new inner window
|
|
|
|
// sets the global object in cx to be the new wrapped global. We
|
|
|
|
// don't want that, but re-initializing the outer window will
|
|
|
|
// fix that for us. And perhaps more importantly, this will
|
|
|
|
// ensure that the outer window gets a new prototype so we don't
|
|
|
|
// leak prototype properties from the old inner window to the
|
|
|
|
// new one.
|
|
|
|
|
|
|
|
scx->InitContext(this);
|
|
|
|
|
|
|
|
// Now that both the the inner and outer windows are initialized
|
|
|
|
// we can clear the outer scope again to make *all* properties
|
|
|
|
// forward to the inner window.
|
|
|
|
::JS_ClearScope(cx, mJSObject);
|
|
|
|
|
|
|
|
// Make the inner and outer window both share the same
|
|
|
|
// prototype. The prototype we share is the outer window's
|
|
|
|
// prototype, this way XPConnect can still find the wrapper to
|
|
|
|
// use when making a call like alert() (w/o qualifying it with
|
|
|
|
// "window."). XPConnect looks up the wrapper based on the
|
|
|
|
// function object's parent, which is the object the function
|
|
|
|
// was called on, and when calling alert() we'll be calling the
|
|
|
|
// alert() function from the outer window's prototype off of the
|
|
|
|
// inner window. In this case XPConnect is able to find the
|
|
|
|
// outer (through the JSExtendedClass hook outerObject), so this
|
|
|
|
// prototype sharing works.
|
|
|
|
|
|
|
|
// We do *not* want to use anything else out of the outer
|
|
|
|
// object's prototype chain than the first prototype, which is
|
|
|
|
// the XPConnect prototype. The rest we want from the inner
|
|
|
|
// window's prototype, i.e. the global scope polluter and
|
|
|
|
// Object.prototype. This way the outer also gets the benefits
|
|
|
|
// of the global scope polluter, and the inner window's
|
|
|
|
// Object.prototype.
|
|
|
|
JSObject *proto = ::JS_GetPrototype(cx, mJSObject);
|
|
|
|
JSObject *innerProto = ::JS_GetPrototype(cx, newInnerWindow->mJSObject);
|
|
|
|
JSObject *innerProtoProto = ::JS_GetPrototype(cx, innerProto);
|
|
|
|
|
|
|
|
::JS_SetPrototype(cx, newInnerWindow->mJSObject, proto);
|
|
|
|
::JS_SetPrototype(cx, proto, innerProtoProto);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aState) {
|
|
|
|
// Restoring from session history.
|
|
|
|
|
|
|
|
nsCOMPtr<WindowStateHolder> wsh = do_QueryInterface(aState);
|
|
|
|
NS_ASSERTION(wsh, "What kind of weird state are you giving me here?");
|
|
|
|
|
|
|
|
// Restore the prototype for the Window/ChromeWindow class in
|
|
|
|
// the outer window scope.
|
|
|
|
nsCOMPtr<nsIClassInfo> ci =
|
|
|
|
do_QueryInterface((nsIScriptGlobalObject *)this);
|
|
|
|
|
|
|
|
rv = xpc->RestoreWrappedNativePrototype(cx, mJSObject, ci,
|
|
|
|
wsh->GetOuterProto());
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
// Refresh the outer window's prototype to what it was when the
|
|
|
|
// window state was saved. This will make the outer window
|
|
|
|
// object (and wrapper) pick up the prototype it had when the
|
|
|
|
// window state was saved. This means Object.prototype etc from
|
|
|
|
// the old inner will again be on the outer window's prototype
|
|
|
|
// chain.
|
|
|
|
|
|
|
|
nsCOMPtr<nsIXPConnectWrappedNative> wrapper;
|
|
|
|
rv = xpc->GetWrappedNativeOfJSObject(cx, mJSObject,
|
|
|
|
getter_AddRefs(wrapper));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
rv = wrapper->RefreshPrototype();
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
if (newDoc) {
|
|
|
|
newDoc->SetScriptGlobalObject(newInnerWindow);
|
2003-06-18 23:48:57 +00:00
|
|
|
}
|
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
if (!aState) {
|
|
|
|
if (reUseInnerWindow) {
|
|
|
|
newInnerWindow->mDocument = aDocument;
|
2005-10-20 23:32:54 +00:00
|
|
|
newInnerWindow->mDoc = newDoc;
|
2005-08-19 20:09:38 +00:00
|
|
|
|
|
|
|
// We're reusing the inner window for a new document. In this
|
|
|
|
// case we don't clear the inner window's scope, but we must
|
|
|
|
// make sure the cached document property gets updated.
|
|
|
|
|
|
|
|
::JS_DeleteProperty(cx, currentInner->mJSObject, "document");
|
2005-08-15 18:16:42 +00:00
|
|
|
} else {
|
|
|
|
rv = newInnerWindow->SetNewDocument(aDocument, nsnull,
|
|
|
|
aRemoveEventListeners,
|
|
|
|
aClearScopeHint, PR_TRUE);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
// Initialize DOM classes etc on the inner window.
|
|
|
|
rv = scx->InitClasses(newInnerWindow->mJSObject);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
if (navigatorHolder) {
|
|
|
|
// Restore window.navigator onto the new inner window.
|
|
|
|
JSObject *nav;
|
|
|
|
navigatorHolder->GetJSObject(&nav);
|
|
|
|
|
|
|
|
::JS_DefineProperty(cx, newInnerWindow->mJSObject, "navigator",
|
|
|
|
OBJECT_TO_JSVAL(nav), nsnull, nsnull,
|
|
|
|
JSPROP_ENUMERATE);
|
|
|
|
}
|
2005-07-30 20:57:07 +00:00
|
|
|
}
|
2004-10-18 22:45:48 +00:00
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
if (mArguments) {
|
|
|
|
jsval args = OBJECT_TO_JSVAL(mArguments);
|
2004-10-18 22:45:48 +00:00
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
::JS_SetProperty(cx, newInnerWindow->mJSObject, "arguments",
|
|
|
|
&args);
|
2004-08-27 21:06:19 +00:00
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
::JS_UnlockGCThing(cx, mArguments);
|
|
|
|
mArguments = nsnull;
|
|
|
|
}
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
// Give the new inner window our chrome event handler (since it
|
|
|
|
// doesn't have one).
|
|
|
|
newInnerWindow->mChromeEventHandler = mChromeEventHandler;
|
2002-04-27 00:03:47 +00:00
|
|
|
}
|
2004-08-26 03:49:17 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
// Add an extra ref in case we release mContext during GC.
|
|
|
|
nsCOMPtr<nsIScriptContext> kungFuDeathGrip = scx;
|
|
|
|
scx->GC();
|
2004-10-18 22:45:48 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
scx->DidInitializeContext();
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2000-11-27 07:55:20 +00:00
|
|
|
// Clear our mutation bitfield.
|
|
|
|
mMutationBits = 0;
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1999-06-09 19:04:18 +00:00
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetDocShell(nsIDocShell* aDocShell)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
NS_ASSERTION(IsOuterWindow(), "Uh, SetDocShell() called on inner window!");
|
|
|
|
|
2000-09-22 05:02:20 +00:00
|
|
|
if (aDocShell == mDocShell)
|
2004-02-09 22:48:53 +00:00
|
|
|
return;
|
2000-09-22 05:02:20 +00:00
|
|
|
|
2002-07-10 04:58:59 +00:00
|
|
|
// SetDocShell(nsnull) means the window is being torn down. Drop our
|
|
|
|
// reference to the script context, allowing it to be deleted
|
|
|
|
// later. Meanwhile, keep our weak reference to the script object
|
|
|
|
// (mJSObject) so that it can be retrieved later (until it is
|
|
|
|
// finalized by the JS GC).
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!aDocShell && mContext) {
|
2005-08-12 04:11:00 +00:00
|
|
|
NS_ASSERTION(!mTimeouts, "Uh, outer window holds timeouts!");
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
JSContext *cx = (JSContext *)mContext->GetNativeContext();
|
2005-08-13 03:54:29 +00:00
|
|
|
nsGlobalWindow *currentInner = GetCurrentInnerWindowInternal();
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
if (currentInner) {
|
|
|
|
currentInner->FreeInnerObjects(cx);
|
2005-08-12 04:11:00 +00:00
|
|
|
|
2005-10-20 23:32:54 +00:00
|
|
|
NS_ASSERTION(mDoc, "Must have doc!");
|
|
|
|
|
2005-07-31 16:44:28 +00:00
|
|
|
// Remember the document's principal.
|
2005-10-20 23:32:54 +00:00
|
|
|
mDocumentPrincipal = mDoc->GetPrincipal();
|
2005-07-31 16:44:28 +00:00
|
|
|
|
2005-08-12 04:11:00 +00:00
|
|
|
// Release our document reference
|
2005-07-30 20:57:07 +00:00
|
|
|
mDocument = nsnull;
|
2005-10-20 23:32:54 +00:00
|
|
|
mDoc = nsnull;
|
2005-07-30 20:57:07 +00:00
|
|
|
|
|
|
|
if (mJSObject) {
|
|
|
|
::JS_ClearScope(cx, mJSObject);
|
|
|
|
::JS_ClearWatchPointsForObject(cx, mJSObject);
|
|
|
|
|
|
|
|
// An outer window shouldn't have a global scope polluter, but
|
|
|
|
// in case code on a webpage took one and put it in an outer
|
|
|
|
// object's prototype, we need to invalidate it nonetheless.
|
|
|
|
nsWindowSH::InvalidateGlobalScopePolluter(cx, mJSObject);
|
|
|
|
}
|
|
|
|
|
|
|
|
::JS_ClearRegExpStatics(cx);
|
|
|
|
}
|
|
|
|
|
2002-07-10 04:58:59 +00:00
|
|
|
// if we are closing the window while in full screen mode, be sure
|
|
|
|
// to restore os chrome
|
2002-02-20 03:33:52 +00:00
|
|
|
if (mFullScreen) {
|
2004-05-03 21:48:36 +00:00
|
|
|
nsIFocusController *focusController =
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetRootFocusController();
|
2002-02-20 03:33:52 +00:00
|
|
|
PRBool isActive = PR_FALSE;
|
|
|
|
focusController->GetActive(&isActive);
|
|
|
|
// only restore OS chrome if the closing window was active
|
2002-07-10 04:58:59 +00:00
|
|
|
|
2002-02-20 03:33:52 +00:00
|
|
|
if (isActive) {
|
|
|
|
nsCOMPtr<nsIFullScreen> fullScreen =
|
|
|
|
do_GetService("@mozilla.org/browser/fullscreen;1");
|
2002-07-10 04:58:59 +00:00
|
|
|
|
2002-02-20 03:33:52 +00:00
|
|
|
if (fullScreen)
|
|
|
|
fullScreen->ShowAllOSChrome();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-12-20 08:00:08 +00:00
|
|
|
ClearControllers();
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
mChromeEventHandler = nsnull; // force release now
|
|
|
|
|
|
|
|
if (mArguments) {
|
|
|
|
// We got no new document after someone called
|
|
|
|
// SetNewArguments(), drop our reference to the arguments.
|
|
|
|
::JS_UnlockGCThing(cx, mArguments);
|
|
|
|
mArguments = nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
mInnerWindowHolder = nsnull;
|
2003-06-18 23:48:57 +00:00
|
|
|
|
2002-09-04 02:18:52 +00:00
|
|
|
mContext->GC();
|
|
|
|
|
2005-02-20 17:02:02 +00:00
|
|
|
if (mContext) {
|
|
|
|
mContext->SetOwner(nsnull);
|
|
|
|
mContext = nsnull; // force release now
|
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2002-07-10 04:58:59 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
mDocShell = aDocShell; // Weak Reference
|
|
|
|
|
2001-01-23 22:29:41 +00:00
|
|
|
if (mNavigator)
|
|
|
|
mNavigator->SetDocShell(aDocShell);
|
2005-08-23 01:42:49 +00:00
|
|
|
if (mLocation)
|
|
|
|
mLocation->SetDocShell(aDocShell);
|
2000-08-22 03:51:17 +00:00
|
|
|
if (mHistory)
|
|
|
|
mHistory->SetDocShell(aDocShell);
|
|
|
|
if (mFrames)
|
|
|
|
mFrames->SetDocShell(aDocShell);
|
|
|
|
if (mScreen)
|
|
|
|
mScreen->SetDocShell(aDocShell);
|
|
|
|
|
|
|
|
if (mDocShell) {
|
|
|
|
// tell our member elements about the new browserwindow
|
|
|
|
if (mMenubar) {
|
|
|
|
nsCOMPtr<nsIWebBrowserChrome> browserChrome;
|
|
|
|
GetWebBrowserChrome(getter_AddRefs(browserChrome));
|
|
|
|
mMenubar->SetWebBrowserChrome(browserChrome);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get our enclosing chrome shell and retrieve its global window impl, so
|
|
|
|
// that we can do some forwarding to the chrome document.
|
2000-11-04 08:21:20 +00:00
|
|
|
mDocShell->GetChromeEventHandler(getter_AddRefs(mChromeEventHandler));
|
|
|
|
if (!mChromeEventHandler) {
|
|
|
|
// We have no chrome event handler. If we have a parent,
|
2002-11-28 01:04:18 +00:00
|
|
|
// get our chrome event handler from the parent. If
|
2000-11-04 08:21:20 +00:00
|
|
|
// we don't have a parent, then we need to make a new
|
|
|
|
// window root object that will function as a chrome event
|
|
|
|
// handler and receive all events that occur anywhere inside
|
|
|
|
// our window.
|
|
|
|
nsCOMPtr<nsIDOMWindow> parentWindow;
|
|
|
|
GetParent(getter_AddRefs(parentWindow));
|
|
|
|
if (parentWindow.get() != NS_STATIC_CAST(nsIDOMWindow*,this)) {
|
|
|
|
nsCOMPtr<nsPIDOMWindow> piWindow(do_QueryInterface(parentWindow));
|
2004-05-03 21:48:36 +00:00
|
|
|
mChromeEventHandler = piWindow->GetChromeEventHandler();
|
2000-11-04 08:21:20 +00:00
|
|
|
}
|
|
|
|
else NS_NewWindowRoot(this, getter_AddRefs(mChromeEventHandler));
|
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1998-08-07 04:45:03 +00:00
|
|
|
}
|
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
nsIDocShell *
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetDocShell()
|
1999-02-10 16:25:11 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
return GetDocShellInternal();
|
1999-02-10 16:25:11 +00:00
|
|
|
}
|
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetOpenerWindow(nsIDOMWindowInternal* aOpener)
|
1998-09-03 01:19:58 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
FORWARD_TO_OUTER_VOID(SetOpenerWindow, (aOpener));
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
mOpener = aOpener;
|
1999-12-03 09:24:22 +00:00
|
|
|
}
|
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetGlobalObjectOwner(nsIScriptGlobalObjectOwner* aOwner)
|
1999-12-03 09:24:22 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
FORWARD_TO_OUTER_VOID(SetGlobalObjectOwner, (aOwner));
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
mGlobalObjectOwner = aOwner; // Note this is supposed to be a weak ref.
|
1999-12-03 09:24:22 +00:00
|
|
|
}
|
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
nsIScriptGlobalObjectOwner *
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetGlobalObjectOwner()
|
1999-12-03 09:24:22 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetGlobalObjectOwner, (), nsnull);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
return mGlobalObjectOwner;
|
1998-09-03 01:19:58 +00:00
|
|
|
}
|
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::HandleDOMEvent(nsPresContext* aPresContext, nsEvent* aEvent,
|
|
|
|
nsIDOMEvent** aDOMEvent, PRUint32 aFlags,
|
|
|
|
nsEventStatus* aEventStatus)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
FORWARD_TO_INNER(HandleDOMEvent,
|
2005-08-12 04:11:00 +00:00
|
|
|
(aPresContext, aEvent, aDOMEvent, aFlags, aEventStatus),
|
2005-10-04 01:08:18 +00:00
|
|
|
NS_OK);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
|
|
|
nsGlobalWindow *outer = GetOuterWindowInternal();
|
|
|
|
|
2005-06-22 01:53:58 +00:00
|
|
|
// Make sure to tell the event that dispatch has started.
|
|
|
|
NS_MARK_EVENT_DISPATCH_STARTED(aEvent);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsresult ret = NS_OK;
|
2001-04-17 05:52:11 +00:00
|
|
|
PRBool externalDOMEvent = PR_FALSE;
|
2000-08-22 03:51:17 +00:00
|
|
|
nsIDOMEvent *domEvent = nsnull;
|
2001-05-18 00:02:52 +00:00
|
|
|
static PRUint32 count = 0;
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
/* mChromeEventHandler and mContext go dangling in the middle of this
|
2000-02-08 13:40:10 +00:00
|
|
|
function under some circumstances (events that destroy the window)
|
|
|
|
without this addref. */
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIChromeEventHandler> kungFuDeathGrip1(mChromeEventHandler);
|
2005-07-30 20:57:07 +00:00
|
|
|
nsCOMPtr<nsIScriptContext> kungFuDeathGrip2(GetContextInternal());
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
/* If this is a mouse event, use the struct to provide entropy for
|
2000-10-30 23:33:34 +00:00
|
|
|
* the system.
|
|
|
|
*/
|
2002-02-09 03:36:55 +00:00
|
|
|
if (gEntropyCollector &&
|
2002-11-09 00:25:25 +00:00
|
|
|
(NS_EVENT_FLAG_CAPTURE & aFlags) &&
|
2001-05-18 00:02:52 +00:00
|
|
|
(aEvent->message == NS_MOUSE_MOVE)) {
|
|
|
|
//I'd like to not come in here if there is a mChromeEventHandler
|
2002-02-09 03:36:55 +00:00
|
|
|
//present, but there is always one when the message is
|
2001-05-18 00:02:52 +00:00
|
|
|
//NS_MOUSE_MOVE.
|
|
|
|
//
|
|
|
|
//Chances are this counter will overflow during the life of the
|
2002-11-28 01:04:18 +00:00
|
|
|
//process, but that's OK for our case. Means we get a little
|
2001-05-18 00:02:52 +00:00
|
|
|
//more entropy.
|
|
|
|
if (count++ % 100 == 0) {
|
2002-02-09 03:36:55 +00:00
|
|
|
//Since the high bits seem to be zero's most of the time,
|
2001-05-18 00:02:52 +00:00
|
|
|
//let's only take the lowest half of the point structure.
|
2005-08-23 03:57:07 +00:00
|
|
|
PRInt16 myCoord[2];
|
2001-05-18 00:02:52 +00:00
|
|
|
|
2005-08-23 03:57:07 +00:00
|
|
|
myCoord[0] = aEvent->refPoint.x;
|
|
|
|
myCoord[1] = aEvent->refPoint.y;
|
2001-05-18 00:02:52 +00:00
|
|
|
gEntropyCollector->RandomUpdate((void*)myCoord, sizeof(myCoord));
|
|
|
|
gEntropyCollector->RandomUpdate((void*)&aEvent->time, sizeof(PRUint32));
|
|
|
|
}
|
2000-10-30 23:33:34 +00:00
|
|
|
}
|
|
|
|
|
2002-02-20 03:33:52 +00:00
|
|
|
// if the window is deactivated while in full screen mode,
|
|
|
|
// restore OS chrome, and hide it again upon re-activation
|
2005-08-12 04:11:00 +00:00
|
|
|
if (outer && outer->mFullScreen && (NS_EVENT_FLAG_BUBBLE & aFlags)) {
|
2002-02-20 03:33:52 +00:00
|
|
|
if (aEvent->message == NS_DEACTIVATE || aEvent->message == NS_ACTIVATE) {
|
|
|
|
nsCOMPtr<nsIFullScreen> fullScreen =
|
|
|
|
do_GetService("@mozilla.org/browser/fullscreen;1");
|
|
|
|
if (fullScreen) {
|
|
|
|
if (aEvent->message == NS_DEACTIVATE)
|
|
|
|
fullScreen->ShowAllOSChrome();
|
|
|
|
else
|
|
|
|
fullScreen->HideAllOSChrome();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (NS_EVENT_FLAG_INIT & aFlags) {
|
2001-04-17 05:52:11 +00:00
|
|
|
if (aDOMEvent) {
|
|
|
|
if (*aDOMEvent) {
|
2002-02-09 03:36:55 +00:00
|
|
|
externalDOMEvent = PR_TRUE;
|
2001-04-17 05:52:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
2000-08-22 03:51:17 +00:00
|
|
|
aDOMEvent = &domEvent;
|
|
|
|
}
|
2002-11-09 00:25:25 +00:00
|
|
|
aEvent->flags |= aFlags;
|
2000-08-22 03:51:17 +00:00
|
|
|
aFlags &= ~(NS_EVENT_FLAG_CANT_BUBBLE | NS_EVENT_FLAG_CANT_CANCEL);
|
2002-11-09 00:25:25 +00:00
|
|
|
aFlags |= NS_EVENT_FLAG_BUBBLE | NS_EVENT_FLAG_CAPTURE;
|
2000-09-08 06:59:14 +00:00
|
|
|
|
|
|
|
// Execute bindingdetached handlers before we tear ourselves
|
|
|
|
// down.
|
2005-08-12 04:11:00 +00:00
|
|
|
if (aEvent->message == NS_PAGE_UNLOAD && mDocument &&
|
|
|
|
!(aFlags & NS_EVENT_FLAG_SYSTEM_EVENT)) {
|
2005-10-20 23:32:54 +00:00
|
|
|
NS_ASSERTION(mDoc, "Must have doc");
|
|
|
|
mDoc->BindingManager()->ExecuteDetachedHandlers();
|
2000-09-08 06:59:14 +00:00
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2001-08-31 04:06:39 +00:00
|
|
|
if (aEvent->message == NS_PAGE_UNLOAD) {
|
|
|
|
mIsDocumentLoaded = PR_FALSE;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
// Capturing stage
|
2002-11-09 00:25:25 +00:00
|
|
|
if ((NS_EVENT_FLAG_CAPTURE & aFlags) && mChromeEventHandler) {
|
2000-08-22 03:51:17 +00:00
|
|
|
// Check chrome document capture here.
|
2000-10-05 21:40:13 +00:00
|
|
|
// XXX The chrome can not handle this, see bug 51211
|
|
|
|
if (aEvent->message != NS_IMAGE_LOAD) {
|
|
|
|
mChromeEventHandler->HandleChromeEvent(aPresContext, aEvent, aDOMEvent,
|
2002-11-09 00:25:25 +00:00
|
|
|
aFlags & NS_EVENT_CAPTURE_MASK,
|
2000-10-05 21:40:13 +00:00
|
|
|
aEventStatus);
|
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2004-10-20 02:19:57 +00:00
|
|
|
if (aEvent->message == NS_RESIZE_EVENT) {
|
|
|
|
mIsHandlingResizeEvent = PR_TRUE;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
// Local handling stage
|
2005-08-12 04:11:00 +00:00
|
|
|
if (outer && (aEvent->message != NS_BLUR_CONTENT || !GetBlurSuppression()) &&
|
2003-02-24 20:15:59 +00:00
|
|
|
mListenerManager &&
|
2005-08-12 04:11:00 +00:00
|
|
|
!((NS_EVENT_FLAG_CANT_BUBBLE & aEvent->flags) &&
|
|
|
|
(NS_EVENT_FLAG_BUBBLE & aFlags) &&
|
|
|
|
!(NS_EVENT_FLAG_INIT & aFlags))) {
|
2000-08-22 03:51:17 +00:00
|
|
|
aEvent->flags |= aFlags;
|
2005-08-02 01:23:40 +00:00
|
|
|
mListenerManager->HandleEvent(aPresContext, aEvent, aDOMEvent,
|
2005-08-12 04:11:00 +00:00
|
|
|
outer, aFlags, aEventStatus);
|
2000-08-22 03:51:17 +00:00
|
|
|
aEvent->flags &= ~aFlags;
|
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2004-10-20 02:19:57 +00:00
|
|
|
if (aEvent->message == NS_RESIZE_EVENT) {
|
|
|
|
mIsHandlingResizeEvent = PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aEvent->message == NS_PAGE_LOAD) {
|
2001-08-31 04:06:39 +00:00
|
|
|
mIsDocumentLoaded = PR_TRUE;
|
2004-10-20 02:19:57 +00:00
|
|
|
}
|
2001-08-31 04:06:39 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
// Bubbling stage
|
2002-11-09 00:25:25 +00:00
|
|
|
if ((NS_EVENT_FLAG_BUBBLE & aFlags) && mChromeEventHandler) {
|
2000-08-22 03:51:17 +00:00
|
|
|
// Bubble to a chrome document if it exists
|
|
|
|
// XXX Need a way to know if an event should really bubble or not.
|
|
|
|
// For now filter out load and unload, since they cause problems.
|
|
|
|
if ((aEvent->message != NS_PAGE_LOAD) &&
|
|
|
|
(aEvent->message != NS_PAGE_UNLOAD) &&
|
2000-09-07 20:37:01 +00:00
|
|
|
(aEvent->message != NS_IMAGE_LOAD) &&
|
2000-08-22 03:51:17 +00:00
|
|
|
(aEvent->message != NS_FOCUS_CONTENT) &&
|
|
|
|
(aEvent->message != NS_BLUR_CONTENT)) {
|
|
|
|
mChromeEventHandler->HandleChromeEvent(aPresContext, aEvent,
|
2005-08-12 04:11:00 +00:00
|
|
|
aDOMEvent,
|
|
|
|
aFlags & NS_EVENT_BUBBLE_MASK,
|
2000-08-22 03:51:17 +00:00
|
|
|
aEventStatus);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-04-17 04:17:16 +00:00
|
|
|
if (aEvent->message == NS_PAGE_LOAD) {
|
2005-07-30 20:57:07 +00:00
|
|
|
nsCOMPtr<nsIContent> content(do_QueryInterface(GetFrameElementInternal()));
|
2002-04-17 04:17:16 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> treeItem =
|
|
|
|
do_QueryInterface(GetDocShellInternal());
|
2002-04-17 04:17:16 +00:00
|
|
|
|
|
|
|
PRInt32 itemType = nsIDocShellTreeItem::typeChrome;
|
|
|
|
|
|
|
|
if (treeItem) {
|
|
|
|
treeItem->GetItemType(&itemType);
|
|
|
|
}
|
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
if (content && GetParentInternal() &&
|
|
|
|
itemType != nsIDocShellTreeItem::typeChrome) {
|
2002-04-17 04:17:16 +00:00
|
|
|
// If we're not in chrome, or at a chrome boundary, fire the
|
|
|
|
// onload event for the frame element.
|
|
|
|
|
|
|
|
nsEventStatus status = nsEventStatus_eIgnore;
|
2005-04-28 23:48:28 +00:00
|
|
|
nsEvent event(NS_IS_TRUSTED_EVENT(aEvent), NS_PAGE_LOAD);
|
2002-04-17 04:17:16 +00:00
|
|
|
|
2002-05-29 17:56:50 +00:00
|
|
|
// Most of the time we could get a pres context to pass in here,
|
|
|
|
// but not always (i.e. if this window is not shown there won't
|
|
|
|
// be a pres context available). Since we're not firing a GUI
|
|
|
|
// event we don't need a pres context anyway so we just pass
|
|
|
|
// null as the pres context all the time here.
|
|
|
|
|
2002-09-20 22:58:40 +00:00
|
|
|
ret = content->HandleDOMEvent(nsnull, &event, nsnull,
|
|
|
|
NS_EVENT_FLAG_INIT, &status);
|
2002-04-17 04:17:16 +00:00
|
|
|
}
|
|
|
|
}
|
2001-08-31 04:06:39 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (NS_EVENT_FLAG_INIT & aFlags) {
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
// We're leaving the DOM event loop so if we created an event,
|
|
|
|
// release here.
|
2001-04-17 05:52:11 +00:00
|
|
|
if (*aDOMEvent && !externalDOMEvent) {
|
2000-08-22 03:51:17 +00:00
|
|
|
nsrefcnt rc;
|
|
|
|
NS_RELEASE2(*aDOMEvent, rc);
|
|
|
|
if (rc) {
|
|
|
|
// Okay, so someone in the DOM loop (a listener, JS object) still has
|
|
|
|
// a ref to the DOM Event but the internal data hasn't been malloc'd.
|
|
|
|
// Force a copy of the data here so the DOM Event is still valid.
|
|
|
|
nsCOMPtr<nsIPrivateDOMEvent>
|
|
|
|
privateEvent(do_QueryInterface(*aDOMEvent));
|
|
|
|
if (privateEvent)
|
|
|
|
privateEvent->DuplicatePrivateData();
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
2001-04-17 05:52:11 +00:00
|
|
|
aDOMEvent = nsnull;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2005-06-22 01:53:58 +00:00
|
|
|
|
|
|
|
// Now that we're done with this event, remove the flag that says
|
|
|
|
// we're in the process of dispatching this event.
|
|
|
|
NS_MARK_EVENT_DISPATCH_DONE(aEvent);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return ret;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
JSObject *
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetGlobalJSObject()
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
{
|
|
|
|
return mJSObject;
|
|
|
|
}
|
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::OnFinalize(JSObject *aJSObject)
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
{
|
|
|
|
if (aJSObject == mJSObject) {
|
|
|
|
mJSObject = nsnull;
|
|
|
|
} else if (mJSObject) {
|
|
|
|
NS_ERROR("Huh? XPConnect created more than one wrapper for this global!");
|
|
|
|
} else {
|
|
|
|
NS_WARNING("Weird, we're finalized with a null mJSObject?");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetScriptsEnabled(PRBool aEnabled, PRBool aFireTimeouts)
|
2001-11-27 09:18:28 +00:00
|
|
|
{
|
2005-07-30 22:06:42 +00:00
|
|
|
FORWARD_TO_INNER_VOID(SetScriptsEnabled, (aEnabled, aFireTimeouts));
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-02-09 02:48:31 +00:00
|
|
|
if (aEnabled && aFireTimeouts) {
|
2001-11-27 09:18:28 +00:00
|
|
|
// Scripts are enabled (again?) on this context, run timeouts that
|
|
|
|
// fired on this context while scripts were disabled.
|
|
|
|
|
|
|
|
RunTimeout(nsnull);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
nsresult
|
2005-10-12 20:16:35 +00:00
|
|
|
nsGlobalWindow::SetNewArguments(PRUint32 aArgc, void* aArgv)
|
2005-07-30 20:57:07 +00:00
|
|
|
{
|
2005-09-28 02:44:16 +00:00
|
|
|
FORWARD_TO_OUTER(SetNewArguments, (aArgc, aArgv), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
|
|
|
JSContext *cx;
|
2005-09-28 02:44:16 +00:00
|
|
|
NS_ENSURE_TRUE(mContext &&
|
2005-07-30 20:57:07 +00:00
|
|
|
(cx = (JSContext *)mContext->GetNativeContext()),
|
|
|
|
NS_ERROR_NOT_INITIALIZED);
|
|
|
|
|
2005-09-28 02:44:16 +00:00
|
|
|
if (mArguments) {
|
|
|
|
::JS_UnlockGCThing(cx, mArguments);
|
|
|
|
mArguments = nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aArgc == 0) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2005-10-12 20:16:35 +00:00
|
|
|
jsval* argv = NS_STATIC_CAST(jsval*, aArgv);
|
|
|
|
|
|
|
|
NS_ASSERTION(argv, "Must have argv!");
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2005-09-28 02:44:16 +00:00
|
|
|
// Freeze the outer here so that we don't create a bogus new inner
|
|
|
|
// just because we're trying to resolve the Array class on cx.
|
|
|
|
// Resolving it for window.arguments on the outer window should be
|
|
|
|
// fine, I think.
|
|
|
|
Freeze();
|
2005-10-12 20:16:35 +00:00
|
|
|
JSObject *argArray = ::JS_NewArrayObject(cx, aArgc, argv);
|
2005-09-28 02:44:16 +00:00
|
|
|
Thaw();
|
|
|
|
|
|
|
|
NS_ENSURE_TRUE(argArray, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
|
|
|
|
// Note that currentInner may be non-null if someone's doing a
|
|
|
|
// window.open with an existing window name.
|
|
|
|
nsGlobalWindow *currentInner = GetCurrentInnerWindowInternal();
|
|
|
|
|
|
|
|
jsval args = OBJECT_TO_JSVAL(argArray);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2005-09-28 02:44:16 +00:00
|
|
|
// The object newborn keeps argArray alive across this set.
|
2005-07-30 20:57:07 +00:00
|
|
|
if (currentInner && currentInner->mJSObject) {
|
|
|
|
if (!::JS_SetProperty(cx, currentInner->mJSObject, "arguments", &args)) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Hold on to the arguments so that we can re-set them once the next
|
|
|
|
// document is loaded.
|
2005-09-28 02:44:16 +00:00
|
|
|
mArguments = argArray;
|
2005-07-30 20:57:07 +00:00
|
|
|
::JS_LockGCThing(cx, mArguments);
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow::nsIScriptObjectPrincipal
|
2000-08-22 03:51:17 +00:00
|
|
|
//*****************************************************************************
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2004-04-18 00:28:47 +00:00
|
|
|
nsIPrincipal*
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetPrincipal()
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2005-10-20 23:32:54 +00:00
|
|
|
if (mDoc) {
|
2000-09-20 23:38:28 +00:00
|
|
|
// If we have a document, get the principal from the document
|
2005-10-20 23:32:54 +00:00
|
|
|
return mDoc->GetPrincipal();
|
2000-09-20 23:38:28 +00:00
|
|
|
}
|
2000-09-19 05:21:00 +00:00
|
|
|
|
2005-07-31 16:44:28 +00:00
|
|
|
if (mDocumentPrincipal) {
|
|
|
|
return mDocumentPrincipal;
|
|
|
|
}
|
|
|
|
|
2000-09-20 23:38:28 +00:00
|
|
|
// If we don't have a principal and we don't have a document we
|
|
|
|
// ask the parent window for the principal. This can happen when
|
|
|
|
// loading a frameset that has a <frame src="javascript:xxx">, in
|
|
|
|
// that case the global window is used in JS before we've loaded
|
|
|
|
// a document into the window.
|
2000-07-13 21:48:25 +00:00
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
nsCOMPtr<nsIScriptObjectPrincipal> objPrincipal =
|
|
|
|
do_QueryInterface(GetParentInternal());
|
2000-09-20 23:38:28 +00:00
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
if (objPrincipal) {
|
2004-04-18 00:28:47 +00:00
|
|
|
return objPrincipal->GetPrincipal();
|
2000-09-20 23:38:28 +00:00
|
|
|
}
|
|
|
|
|
2004-04-18 00:28:47 +00:00
|
|
|
return nsnull;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow::nsIDOMWindow
|
2000-08-22 03:51:17 +00:00
|
|
|
//*****************************************************************************
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetDocument(nsIDOMDocument** aDocument)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
// This method *should* forward calls to the outer window, but since
|
|
|
|
// there's nothing here that *depends* on anything in the outer
|
|
|
|
// (GetDocShellInternal() eliminates that dependency), we won't do
|
|
|
|
// that to avoid the extra virtual function call.
|
|
|
|
|
2002-04-17 04:17:16 +00:00
|
|
|
// lazily instantiate an about:blank document if necessary, and if
|
|
|
|
// we have what it takes to do so. Note that domdoc here is the same
|
|
|
|
// thing as our mDocument, but we don't have to explicitly set the
|
|
|
|
// member variable because the docshell has already called
|
|
|
|
// SetNewDocument().
|
2005-07-30 20:57:07 +00:00
|
|
|
nsIDocShell *docShell;
|
|
|
|
if (!mDocument && (docShell = GetDocShellInternal()))
|
|
|
|
nsCOMPtr<nsIDOMDocument> domdoc(do_GetInterface(docShell));
|
2001-11-16 02:14:53 +00:00
|
|
|
|
2003-06-21 07:15:32 +00:00
|
|
|
NS_IF_ADDREF(*aDocument = mDocument);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
2000-09-01 01:54:35 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow::nsIDOMWindowInternal
|
2000-09-01 01:54:35 +00:00
|
|
|
//*****************************************************************************
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetWindow(nsIDOMWindowInternal** aWindow)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetWindow, (aWindow), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-09-01 01:54:35 +00:00
|
|
|
*aWindow = NS_STATIC_CAST(nsIDOMWindowInternal *, this);
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ADDREF(*aWindow);
|
|
|
|
return NS_OK;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetSelf(nsIDOMWindowInternal** aWindow)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetSelf, (aWindow), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-09-01 01:54:35 +00:00
|
|
|
*aWindow = NS_STATIC_CAST(nsIDOMWindowInternal *, this);
|
|
|
|
NS_ADDREF(*aWindow);
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetNavigator(nsIDOMNavigator** aNavigator)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetNavigator, (aNavigator), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-06-21 07:15:32 +00:00
|
|
|
*aNavigator = nsnull;
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mNavigator) {
|
2004-12-10 19:48:22 +00:00
|
|
|
mNavigator = new nsNavigator(mDocShell);
|
2003-06-20 23:51:46 +00:00
|
|
|
if (!mNavigator) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2003-06-20 23:51:46 +00:00
|
|
|
NS_ADDREF(*aNavigator = mNavigator);
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetScreen(nsIDOMScreen** aScreen)
|
1999-01-28 23:12:54 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetScreen, (aScreen), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-06-21 07:15:32 +00:00
|
|
|
*aScreen = nsnull;
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mScreen && mDocShell) {
|
2004-12-10 19:48:22 +00:00
|
|
|
mScreen = new nsScreen(mDocShell);
|
2003-06-20 23:51:46 +00:00
|
|
|
if (!mScreen) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
2003-06-21 07:15:32 +00:00
|
|
|
}
|
2003-06-20 23:51:46 +00:00
|
|
|
|
2003-06-21 09:36:03 +00:00
|
|
|
NS_IF_ADDREF(*aScreen = mScreen);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1999-01-28 23:12:54 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetHistory(nsIDOMHistory** aHistory)
|
1999-01-28 23:12:54 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetHistory, (aHistory), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-06-21 07:15:32 +00:00
|
|
|
*aHistory = nsnull;
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mHistory && mDocShell) {
|
2004-12-10 19:48:22 +00:00
|
|
|
mHistory = new nsHistory(mDocShell);
|
2003-06-20 23:51:46 +00:00
|
|
|
if (!mHistory) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
2003-06-21 07:15:32 +00:00
|
|
|
}
|
2003-06-20 23:51:46 +00:00
|
|
|
|
2003-07-12 21:23:40 +00:00
|
|
|
NS_IF_ADDREF(*aHistory = mHistory);
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1999-01-28 23:12:54 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetParent(nsIDOMWindow** aParent)
|
1999-06-09 19:04:18 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetParent, (aParent), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
*aParent = nsnull;
|
|
|
|
if (!mDocShell)
|
|
|
|
return NS_OK;
|
1999-06-09 19:04:18 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellAsItem(do_QueryInterface(mDocShell));
|
|
|
|
NS_ENSURE_TRUE(docShellAsItem, NS_ERROR_FAILURE);
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> parent;
|
|
|
|
docShellAsItem->GetSameTypeParent(getter_AddRefs(parent));
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (parent) {
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> globalObject(do_GetInterface(parent));
|
|
|
|
NS_ENSURE_SUCCESS(CallQueryInterface(globalObject.get(), aParent),
|
|
|
|
NS_ERROR_FAILURE);
|
|
|
|
}
|
|
|
|
else {
|
2000-09-01 01:54:35 +00:00
|
|
|
*aParent = NS_STATIC_CAST(nsIDOMWindowInternal *, this);
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ADDREF(*aParent);
|
|
|
|
}
|
|
|
|
return NS_OK;
|
1999-06-09 19:04:18 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetTop(nsIDOMWindow** aTop)
|
1999-06-09 19:04:18 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetTop, (aTop), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsresult ret = NS_OK;
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
*aTop = nsnull;
|
|
|
|
if (mDocShell) {
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellAsItem(do_QueryInterface(mDocShell));
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> root;
|
|
|
|
docShellAsItem->GetSameTypeRootTreeItem(getter_AddRefs(root));
|
|
|
|
|
|
|
|
if (root) {
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> globalObject(do_GetInterface(root));
|
|
|
|
CallQueryInterface(globalObject.get(), aTop);
|
|
|
|
}
|
|
|
|
}
|
1999-06-09 19:04:18 +00:00
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
return ret;
|
1999-06-09 19:04:18 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetContent(nsIDOMWindow** aContent)
|
1999-06-09 19:04:18 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetContent, (aContent), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
*aContent = nsnull;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> primaryContent;
|
2004-11-19 22:39:04 +00:00
|
|
|
|
|
|
|
if (!IsCallerChrome()) {
|
|
|
|
// If we're called by non-chrome code, make sure we don't return
|
|
|
|
// the primary content window if the calling tab is hidden. In
|
|
|
|
// such a case we return the same-type root in the hidden tab,
|
|
|
|
// which is "good enough", for now.
|
|
|
|
nsCOMPtr<nsIBaseWindow> baseWin(do_QueryInterface(mDocShell));
|
|
|
|
|
|
|
|
if (baseWin) {
|
|
|
|
PRBool visible = PR_FALSE;
|
|
|
|
baseWin->GetVisibility(&visible);
|
|
|
|
|
|
|
|
if (!visible) {
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> treeItem(do_QueryInterface(mDocShell));
|
|
|
|
|
|
|
|
treeItem->GetSameTypeRootTreeItem(getter_AddRefs(primaryContent));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!primaryContent) {
|
|
|
|
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwner));
|
|
|
|
NS_ENSURE_TRUE(treeOwner, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
treeOwner->GetPrimaryContentShell(getter_AddRefs(primaryContent));
|
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-09-01 01:54:35 +00:00
|
|
|
nsCOMPtr<nsIDOMWindowInternal> domWindow(do_GetInterface(primaryContent));
|
2003-06-21 07:15:32 +00:00
|
|
|
NS_IF_ADDREF(*aContent = domWindow);
|
1999-06-09 19:04:18 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetPrompter(nsIPrompt** aPrompt)
|
2000-08-07 20:55:36 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetPrompter, (aPrompt), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mDocShell)
|
2000-08-07 20:55:36 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIPrompt> prompter(do_GetInterface(mDocShell));
|
|
|
|
NS_ENSURE_TRUE(prompter, NS_ERROR_NO_INTERFACE);
|
|
|
|
|
|
|
|
NS_ADDREF(*aPrompt = prompter);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetMenubar(nsIDOMBarProp** aMenubar)
|
1999-06-09 19:04:18 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetMenubar, (aMenubar), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-06-21 07:15:32 +00:00
|
|
|
*aMenubar = nsnull;
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mMenubar) {
|
2004-12-10 19:48:22 +00:00
|
|
|
mMenubar = new nsMenubarProp();
|
2003-06-20 23:51:46 +00:00
|
|
|
if (!mMenubar) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2003-06-20 23:51:46 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIWebBrowserChrome> browserChrome;
|
|
|
|
GetWebBrowserChrome(getter_AddRefs(browserChrome));
|
|
|
|
|
|
|
|
mMenubar->SetWebBrowserChrome(browserChrome);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1999-06-09 19:04:18 +00:00
|
|
|
|
2003-06-20 23:51:46 +00:00
|
|
|
NS_ADDREF(*aMenubar = mMenubar);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1999-06-09 19:04:18 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetToolbar(nsIDOMBarProp** aToolbar)
|
1999-06-09 19:04:18 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetToolbar, (aToolbar), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-06-21 07:15:32 +00:00
|
|
|
*aToolbar = nsnull;
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mToolbar) {
|
2004-12-10 19:48:22 +00:00
|
|
|
mToolbar = new nsToolbarProp();
|
2003-06-20 23:51:46 +00:00
|
|
|
if (!mToolbar) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2003-06-20 23:51:46 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIWebBrowserChrome> browserChrome;
|
|
|
|
GetWebBrowserChrome(getter_AddRefs(browserChrome));
|
|
|
|
|
|
|
|
mToolbar->SetWebBrowserChrome(browserChrome);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1999-06-09 19:04:18 +00:00
|
|
|
|
2003-06-20 23:51:46 +00:00
|
|
|
NS_ADDREF(*aToolbar = mToolbar);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1999-06-09 19:04:18 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetLocationbar(nsIDOMBarProp** aLocationbar)
|
1999-06-09 19:04:18 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetLocationbar, (aLocationbar), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-06-21 07:15:32 +00:00
|
|
|
*aLocationbar = nsnull;
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mLocationbar) {
|
2004-12-10 19:48:22 +00:00
|
|
|
mLocationbar = new nsLocationbarProp();
|
2003-06-20 23:51:46 +00:00
|
|
|
if (!mLocationbar) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2003-06-20 23:51:46 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIWebBrowserChrome> browserChrome;
|
|
|
|
GetWebBrowserChrome(getter_AddRefs(browserChrome));
|
|
|
|
|
|
|
|
mLocationbar->SetWebBrowserChrome(browserChrome);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1999-06-09 19:04:18 +00:00
|
|
|
|
2003-06-20 23:51:46 +00:00
|
|
|
NS_ADDREF(*aLocationbar = mLocationbar);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1999-06-09 19:04:18 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetPersonalbar(nsIDOMBarProp** aPersonalbar)
|
1999-06-09 19:04:18 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetPersonalbar, (aPersonalbar), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-06-21 07:15:32 +00:00
|
|
|
*aPersonalbar = nsnull;
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mPersonalbar) {
|
2004-12-10 19:48:22 +00:00
|
|
|
mPersonalbar = new nsPersonalbarProp();
|
2003-06-20 23:51:46 +00:00
|
|
|
if (!mPersonalbar) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2003-06-20 23:51:46 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIWebBrowserChrome> browserChrome;
|
|
|
|
GetWebBrowserChrome(getter_AddRefs(browserChrome));
|
|
|
|
|
|
|
|
mPersonalbar->SetWebBrowserChrome(browserChrome);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2003-06-20 23:51:46 +00:00
|
|
|
NS_ADDREF(*aPersonalbar = mPersonalbar);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1999-06-09 19:04:18 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetStatusbar(nsIDOMBarProp** aStatusbar)
|
1998-08-13 23:37:54 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetStatusbar, (aStatusbar), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-06-21 07:15:32 +00:00
|
|
|
*aStatusbar = nsnull;
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mStatusbar) {
|
2004-12-10 19:48:22 +00:00
|
|
|
mStatusbar = new nsStatusbarProp();
|
2003-06-20 23:51:46 +00:00
|
|
|
if (!mStatusbar) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2003-06-20 23:51:46 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIWebBrowserChrome> browserChrome;
|
|
|
|
GetWebBrowserChrome(getter_AddRefs(browserChrome));
|
|
|
|
|
|
|
|
mStatusbar->SetWebBrowserChrome(browserChrome);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1998-08-13 23:37:54 +00:00
|
|
|
|
2003-06-20 23:51:46 +00:00
|
|
|
NS_ADDREF(*aStatusbar = mStatusbar);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-08-13 23:37:54 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetScrollbars(nsIDOMBarProp** aScrollbars)
|
1998-09-03 01:19:58 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetScrollbars, (aScrollbars), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-06-21 07:15:32 +00:00
|
|
|
*aScrollbars = nsnull;
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mScrollbars) {
|
2004-12-10 19:48:22 +00:00
|
|
|
mScrollbars = new nsScrollbarsProp(this);
|
2003-06-20 23:51:46 +00:00
|
|
|
if (!mScrollbars) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2003-06-20 23:51:46 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIWebBrowserChrome> browserChrome;
|
|
|
|
GetWebBrowserChrome(getter_AddRefs(browserChrome));
|
|
|
|
|
|
|
|
mScrollbars->SetWebBrowserChrome(browserChrome);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2003-06-20 23:51:46 +00:00
|
|
|
NS_ADDREF(*aScrollbars = mScrollbars);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-09-03 01:19:58 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetDirectories(nsIDOMBarProp** aDirectories)
|
1998-08-13 23:37:54 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
return GetPersonalbar(aDirectories);
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1998-08-15 00:13:51 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetClosed(PRBool* aClosed)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetClosed, (aClosed), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-05-29 00:48:35 +00:00
|
|
|
// If someone called close(), or if we don't have a docshell, we're
|
|
|
|
// closed.
|
|
|
|
*aClosed = mIsClosed || !mDocShell;
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1999-12-17 22:25:22 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetFrames(nsIDOMWindowCollection** aFrames)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetFrames, (aFrames), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-06-21 07:15:32 +00:00
|
|
|
*aFrames = nsnull;
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mFrames && mDocShell) {
|
|
|
|
mFrames = new nsDOMWindowList(mDocShell);
|
2003-06-20 23:51:46 +00:00
|
|
|
if (!mFrames) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
2003-06-21 07:15:32 +00:00
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2003-06-21 09:36:03 +00:00
|
|
|
*aFrames = NS_STATIC_CAST(nsIDOMWindowCollection *, mFrames);
|
|
|
|
NS_IF_ADDREF(*aFrames);
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetCrypto(nsIDOMCrypto** aCrypto)
|
2000-05-11 19:17:07 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetCrypto, (aCrypto), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mCrypto) {
|
2003-06-21 07:15:32 +00:00
|
|
|
mCrypto = do_CreateInstance(kCryptoContractID);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2003-06-21 07:15:32 +00:00
|
|
|
|
|
|
|
NS_IF_ADDREF(*aCrypto = mCrypto);
|
|
|
|
|
2000-05-16 23:52:42 +00:00
|
|
|
return NS_OK;
|
2000-05-11 19:17:07 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetPkcs11(nsIDOMPkcs11** aPkcs11)
|
2000-05-11 19:17:07 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetPkcs11, (aPkcs11), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mPkcs11) {
|
2003-06-21 07:15:32 +00:00
|
|
|
mPkcs11 = do_CreateInstance(kPkcs11ContractID);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2003-06-21 07:15:32 +00:00
|
|
|
|
|
|
|
NS_IF_ADDREF(*aPkcs11 = mPkcs11);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
2000-05-11 19:17:07 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetControllers(nsIControllers** aResult)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetControllers, (aResult), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mControllers) {
|
2002-12-20 08:00:08 +00:00
|
|
|
nsresult rv;
|
|
|
|
mControllers = do_CreateInstance(kXULControllersCID, &rv);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2003-04-12 03:08:23 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
// Add in the default controller
|
2003-04-12 03:08:23 +00:00
|
|
|
nsCOMPtr<nsIController> controller = do_CreateInstance(
|
|
|
|
NS_WINDOWCONTROLLER_CONTRACTID, &rv);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
mControllers->InsertControllerAt(0, controller);
|
|
|
|
nsCOMPtr<nsIControllerContext> controllerContext = do_QueryInterface(controller);
|
|
|
|
if (!controllerContext) return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
controllerContext->SetCommandContext(NS_STATIC_CAST(nsIDOMWindow*, this));
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2003-04-12 03:08:23 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
*aResult = mControllers;
|
|
|
|
NS_ADDREF(*aResult);
|
|
|
|
return NS_OK;
|
1998-08-13 23:37:54 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetOpener(nsIDOMWindowInternal** aOpener)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetOpener, (aOpener), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-02-26 04:50:21 +00:00
|
|
|
*aOpener = nsnull;
|
2002-02-28 00:22:59 +00:00
|
|
|
// First, check if we were called from a privileged chrome script
|
2002-05-17 22:24:06 +00:00
|
|
|
|
2005-03-06 18:43:07 +00:00
|
|
|
if (IsCallerChrome()) {
|
2002-02-28 00:22:59 +00:00
|
|
|
*aOpener = mOpener;
|
|
|
|
NS_IF_ADDREF(*aOpener);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-02-26 04:50:21 +00:00
|
|
|
// We don't want to reveal the opener if the opener is a mail window,
|
|
|
|
// because opener can be used to spoof the contents of a message (bug 105050).
|
|
|
|
// So, we look in the opener's root docshell to see if it's a mail window.
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> openerSGO(do_QueryInterface(mOpener));
|
|
|
|
if (openerSGO) {
|
2004-02-09 22:48:53 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellAsItem =
|
|
|
|
do_QueryInterface(openerSGO->GetDocShell());
|
|
|
|
|
2002-02-26 04:50:21 +00:00
|
|
|
if (docShellAsItem) {
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> openerRootItem;
|
|
|
|
docShellAsItem->GetRootTreeItem(getter_AddRefs(openerRootItem));
|
|
|
|
nsCOMPtr<nsIDocShell> openerRootDocShell(do_QueryInterface(openerRootItem));
|
|
|
|
if (openerRootDocShell) {
|
|
|
|
PRUint32 appType;
|
|
|
|
nsresult rv = openerRootDocShell->GetAppType(&appType);
|
|
|
|
if (NS_SUCCEEDED(rv) && appType != nsIDocShell::APP_TYPE_MAIL) {
|
|
|
|
*aOpener = mOpener;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2002-11-28 01:04:18 +00:00
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_IF_ADDREF(*aOpener);
|
|
|
|
return NS_OK;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetOpener(nsIDOMWindowInternal* aOpener)
|
1998-08-07 04:45:03 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(SetOpener, (aOpener), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-05-05 20:55:37 +00:00
|
|
|
// check if we were called from a privileged chrome script.
|
|
|
|
// If not, opener is settable only to null.
|
|
|
|
if (aOpener && !IsCallerChrome()) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2003-06-20 22:44:33 +00:00
|
|
|
if (mOpener && !aOpener)
|
|
|
|
mOpenerWasCleared = PR_TRUE;
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
mOpener = aOpener;
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1999-06-15 03:17:11 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetStatus(nsAString& aStatus)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetStatus, (aStatus), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
aStatus = mStatus;
|
|
|
|
return NS_OK;
|
1998-08-13 23:37:54 +00:00
|
|
|
}
|
1998-08-07 04:45:03 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetStatus(const nsAString& aStatus)
|
1999-06-26 21:48:29 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(SetStatus, (aStatus), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
/*
|
|
|
|
* If caller is not chrome and dom.disable_window_status_change is true,
|
|
|
|
* prevent setting window.status by exiting early
|
|
|
|
*/
|
|
|
|
|
2004-04-30 05:14:22 +00:00
|
|
|
if (!CanSetProperty("dom.disable_window_status_change")) {
|
2002-04-12 10:11:00 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
mStatus = aStatus;
|
1999-06-26 21:48:29 +00:00
|
|
|
|
2002-02-05 06:04:56 +00:00
|
|
|
nsCOMPtr<nsIWebBrowserChrome> browserChrome;
|
|
|
|
GetWebBrowserChrome(getter_AddRefs(browserChrome));
|
|
|
|
if(browserChrome) {
|
|
|
|
browserChrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT,
|
|
|
|
PromiseFlatString(aStatus).get());
|
|
|
|
}
|
1999-06-26 21:48:29 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1999-06-26 21:48:29 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetDefaultStatus(nsAString& aDefaultStatus)
|
1998-08-13 23:37:54 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetDefaultStatus, (aDefaultStatus),
|
|
|
|
NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
aDefaultStatus = mDefaultStatus;
|
|
|
|
return NS_OK;
|
1998-08-13 23:37:54 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetDefaultStatus(const nsAString& aDefaultStatus)
|
1998-08-21 21:39:27 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(SetDefaultStatus, (aDefaultStatus),
|
|
|
|
NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
/*
|
|
|
|
* If caller is not chrome and dom.disable_window_status_change is true,
|
|
|
|
* prevent setting window.defaultStatus by exiting early
|
|
|
|
*/
|
|
|
|
|
2004-04-30 05:14:22 +00:00
|
|
|
if (!CanSetProperty("dom.disable_window_status_change")) {
|
2002-04-12 10:11:00 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
mDefaultStatus = aDefaultStatus;
|
1998-08-21 21:39:27 +00:00
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
nsCOMPtr<nsIWebBrowserChrome> browserChrome;
|
|
|
|
GetWebBrowserChrome(getter_AddRefs(browserChrome));
|
|
|
|
if (browserChrome) {
|
|
|
|
browserChrome->SetStatus(nsIWebBrowserChrome::STATUS_SCRIPT_DEFAULT,
|
|
|
|
PromiseFlatString(aDefaultStatus).get());
|
|
|
|
}
|
1998-08-21 21:39:27 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-08-21 21:39:27 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetName(nsAString& aName)
|
1998-08-13 23:37:54 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetName, (aName), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsXPIDLString name;
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellAsItem(do_QueryInterface(mDocShell));
|
|
|
|
if (docShellAsItem)
|
|
|
|
docShellAsItem->GetName(getter_Copies(name));
|
1998-08-13 23:37:54 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
aName.Assign(name);
|
|
|
|
return NS_OK;
|
1998-08-13 23:37:54 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetName(const nsAString& aName)
|
1998-08-13 23:37:54 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(SetName, (aName), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsresult result = NS_OK;
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellAsItem(do_QueryInterface(mDocShell));
|
|
|
|
if (docShellAsItem)
|
2001-04-02 19:40:52 +00:00
|
|
|
result = docShellAsItem->SetName(PromiseFlatString(aName).get());
|
2000-08-22 03:51:17 +00:00
|
|
|
return result;
|
1998-08-13 23:37:54 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetInnerWidth(PRInt32* aInnerWidth)
|
1998-08-13 23:37:54 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetInnerWidth, (aInnerWidth), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2004-08-08 17:39:20 +00:00
|
|
|
EnsureSizeUpToDate();
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> docShellWin(do_QueryInterface(mDocShell));
|
|
|
|
*aInnerWidth = 0;
|
2002-05-20 20:06:29 +00:00
|
|
|
PRInt32 notused;
|
2000-08-22 03:51:17 +00:00
|
|
|
if (docShellWin)
|
2002-05-20 20:06:29 +00:00
|
|
|
docShellWin->GetSize(aInnerWidth, ¬used);
|
2000-08-22 03:51:17 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
1998-08-13 23:37:54 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetInnerWidth(PRInt32 aInnerWidth)
|
1998-08-13 23:37:54 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(SetInnerWidth, (aInnerWidth), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
/*
|
|
|
|
* If caller is not chrome and dom.disable_window_move_resize is true,
|
|
|
|
* prevent setting window.innerWidth by exiting early
|
|
|
|
*/
|
|
|
|
|
2004-07-05 15:51:31 +00:00
|
|
|
if (!CanSetProperty("dom.disable_window_move_resize") || IsFrame()) {
|
2002-04-12 10:11:00 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellAsItem(do_QueryInterface(mDocShell));
|
|
|
|
NS_ENSURE_TRUE(docShellAsItem, NS_ERROR_FAILURE);
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
|
|
|
|
docShellAsItem->GetTreeOwner(getter_AddRefs(treeOwner));
|
|
|
|
NS_ENSURE_TRUE(treeOwner, NS_ERROR_FAILURE);
|
2000-06-21 00:20:39 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_SUCCESS(CheckSecurityWidthAndHeight(&aInnerWidth, nsnull),
|
|
|
|
NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIBaseWindow> docShellAsWin(do_QueryInterface(mDocShell));
|
2005-08-19 09:46:25 +00:00
|
|
|
PRInt32 notused, height = 0;
|
|
|
|
docShellAsWin->GetSize(¬used, &height);
|
|
|
|
NS_ENSURE_SUCCESS(treeOwner->SizeShellTo(docShellAsItem, aInnerWidth, height),
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ERROR_FAILURE);
|
1998-08-13 23:37:54 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetInnerHeight(PRInt32* aInnerHeight)
|
1998-08-13 23:37:54 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetInnerHeight, (aInnerHeight), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2004-08-08 17:39:20 +00:00
|
|
|
EnsureSizeUpToDate();
|
2000-08-22 03:51:17 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIBaseWindow> docShellWin(do_QueryInterface(mDocShell));
|
|
|
|
*aInnerHeight = 0;
|
2002-05-20 20:06:29 +00:00
|
|
|
PRInt32 notused;
|
2000-08-22 03:51:17 +00:00
|
|
|
if (docShellWin)
|
2002-05-20 20:06:29 +00:00
|
|
|
docShellWin->GetSize(¬used, aInnerHeight);
|
1999-07-16 01:14:59 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetInnerHeight(PRInt32 aInnerHeight)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(SetInnerHeight, (aInnerHeight), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
/*
|
|
|
|
* If caller is not chrome and dom.disable_window_move_resize is true,
|
|
|
|
* prevent setting window.innerHeight by exiting early
|
|
|
|
*/
|
|
|
|
|
2004-07-05 15:51:31 +00:00
|
|
|
if (!CanSetProperty("dom.disable_window_move_resize") || IsFrame()) {
|
2002-04-12 10:11:00 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellAsItem(do_QueryInterface(mDocShell));
|
|
|
|
NS_ENSURE_TRUE(docShellAsItem, NS_ERROR_FAILURE);
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
|
|
|
|
docShellAsItem->GetTreeOwner(getter_AddRefs(treeOwner));
|
|
|
|
NS_ENSURE_TRUE(treeOwner, NS_ERROR_FAILURE);
|
2000-06-21 00:20:39 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_SUCCESS(CheckSecurityWidthAndHeight(nsnull, &aInnerHeight),
|
|
|
|
NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIBaseWindow> docShellAsWin(do_QueryInterface(mDocShell));
|
2005-08-19 09:46:25 +00:00
|
|
|
PRInt32 width = 0, notused;
|
|
|
|
docShellAsWin->GetSize(&width, ¬used);
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_SUCCESS(treeOwner->
|
2005-08-19 09:46:25 +00:00
|
|
|
SizeShellTo(docShellAsItem, width, aInnerHeight),
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ERROR_FAILURE);
|
2000-02-08 13:40:10 +00:00
|
|
|
return NS_OK;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetOuterWidth(PRInt32* aOuterWidth)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetOuterWidth, (aOuterWidth), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
NS_ENSURE_TRUE(treeOwnerAsWin, NS_ERROR_FAILURE);
|
1999-03-29 23:48:47 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow* rootWindow =
|
|
|
|
NS_STATIC_CAST(nsGlobalWindow *, GetPrivateRoot());
|
2004-05-27 22:08:42 +00:00
|
|
|
if (rootWindow) {
|
|
|
|
rootWindow->FlushPendingNotifications(Flush_Layout);
|
|
|
|
}
|
2002-05-20 20:06:29 +00:00
|
|
|
PRInt32 notused;
|
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->GetSize(aOuterWidth, ¬used),
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ERROR_FAILURE);
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetOuterWidth(PRInt32 aOuterWidth)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(SetOuterWidth, (aOuterWidth), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
/*
|
|
|
|
* If caller is not chrome and dom.disable_window_move_resize is true,
|
|
|
|
* prevent setting window.outerWidth by exiting early
|
|
|
|
*/
|
|
|
|
|
2004-04-30 05:14:22 +00:00
|
|
|
if (!CanSetProperty("dom.disable_window_move_resize")) {
|
2002-04-12 10:11:00 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
NS_ENSURE_TRUE(treeOwnerAsWin, NS_ERROR_FAILURE);
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_SUCCESS(CheckSecurityWidthAndHeight(&aOuterWidth, nsnull),
|
|
|
|
NS_ERROR_FAILURE);
|
2000-06-21 00:20:39 +00:00
|
|
|
|
2005-08-19 09:46:25 +00:00
|
|
|
PRInt32 notused, height;
|
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->GetSize(¬used, &height), NS_ERROR_FAILURE);
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2005-08-19 09:46:25 +00:00
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->SetSize(aOuterWidth, height, PR_TRUE),
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ERROR_FAILURE);
|
1999-07-28 07:03:29 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetOuterHeight(PRInt32* aOuterHeight)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetOuterHeight, (aOuterHeight), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
NS_ENSURE_TRUE(treeOwnerAsWin, NS_ERROR_FAILURE);
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow* rootWindow =
|
|
|
|
NS_STATIC_CAST(nsGlobalWindow *, GetPrivateRoot());
|
2004-05-27 22:08:42 +00:00
|
|
|
if (rootWindow) {
|
|
|
|
rootWindow->FlushPendingNotifications(Flush_Layout);
|
|
|
|
}
|
2000-02-11 07:14:41 +00:00
|
|
|
|
2002-05-20 20:06:29 +00:00
|
|
|
PRInt32 notused;
|
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->GetSize(¬used, aOuterHeight),
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ERROR_FAILURE);
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetOuterHeight(PRInt32 aOuterHeight)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(SetOuterHeight, (aOuterHeight), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
/*
|
|
|
|
* If caller is not chrome and dom.disable_window_move_resize is true,
|
|
|
|
* prevent setting window.outerHeight by exiting early
|
|
|
|
*/
|
|
|
|
|
2004-04-30 05:14:22 +00:00
|
|
|
if (!CanSetProperty("dom.disable_window_move_resize")) {
|
2002-04-12 10:11:00 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
NS_ENSURE_TRUE(treeOwnerAsWin, NS_ERROR_FAILURE);
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_SUCCESS(CheckSecurityWidthAndHeight(nsnull, &aOuterHeight),
|
|
|
|
NS_ERROR_FAILURE);
|
2000-06-21 00:20:39 +00:00
|
|
|
|
2005-08-19 09:46:25 +00:00
|
|
|
PRInt32 width, notused;
|
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->GetSize(&width, ¬used), NS_ERROR_FAILURE);
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2005-08-19 09:46:25 +00:00
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->SetSize(width, aOuterHeight, PR_TRUE),
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ERROR_FAILURE);
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetScreenX(PRInt32* aScreenX)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetScreenX, (aScreenX), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
NS_ENSURE_TRUE(treeOwnerAsWin, NS_ERROR_FAILURE);
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2001-06-22 00:48:50 +00:00
|
|
|
PRInt32 y;
|
|
|
|
|
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->GetPosition(aScreenX, &y),
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ERROR_FAILURE);
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetScreenX(PRInt32 aScreenX)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(SetScreenX, (aScreenX), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
/*
|
|
|
|
* If caller is not chrome and dom.disable_window_move_resize is true,
|
|
|
|
* prevent setting window.screenX by exiting early
|
|
|
|
*/
|
|
|
|
|
2004-04-30 05:14:22 +00:00
|
|
|
if (!CanSetProperty("dom.disable_window_move_resize")) {
|
2002-04-12 10:11:00 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
NS_ENSURE_TRUE(treeOwnerAsWin, NS_ERROR_FAILURE);
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_SUCCESS(CheckSecurityLeftAndTop(&aScreenX, nsnull),
|
|
|
|
NS_ERROR_FAILURE);
|
2000-06-21 00:20:39 +00:00
|
|
|
|
2001-06-22 00:48:50 +00:00
|
|
|
PRInt32 x, y;
|
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->GetPosition(&x, &y),
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ERROR_FAILURE);
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->SetPosition(aScreenX, y),
|
|
|
|
NS_ERROR_FAILURE);
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetScreenY(PRInt32* aScreenY)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetScreenY, (aScreenY), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
NS_ENSURE_TRUE(treeOwnerAsWin, NS_ERROR_FAILURE);
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2001-06-22 00:48:50 +00:00
|
|
|
PRInt32 x;
|
|
|
|
|
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->GetPosition(&x, aScreenY),
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ERROR_FAILURE);
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetScreenY(PRInt32 aScreenY)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(SetScreenY, (aScreenY), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
/*
|
|
|
|
* If caller is not chrome and dom.disable_window_move_resize is true,
|
|
|
|
* prevent setting window.screenY by exiting early
|
|
|
|
*/
|
|
|
|
|
2004-04-30 05:14:22 +00:00
|
|
|
if (!CanSetProperty("dom.disable_window_move_resize")) {
|
2002-04-12 10:11:00 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
NS_ENSURE_TRUE(treeOwnerAsWin, NS_ERROR_FAILURE);
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_SUCCESS(CheckSecurityLeftAndTop(nsnull, &aScreenY),
|
|
|
|
NS_ERROR_FAILURE);
|
2000-06-21 00:20:39 +00:00
|
|
|
|
2001-06-22 00:48:50 +00:00
|
|
|
PRInt32 x, y;
|
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->GetPosition(&x, &y),
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ERROR_FAILURE);
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->SetPosition(x, aScreenY),
|
|
|
|
NS_ERROR_FAILURE);
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2000-06-21 00:20:39 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::CheckSecurityWidthAndHeight(PRInt32* aWidth, PRInt32* aHeight)
|
2000-06-21 00:20:39 +00:00
|
|
|
{
|
2002-11-28 01:04:18 +00:00
|
|
|
// This one is easy. Just ensure the variable is greater than 100;
|
2000-06-21 00:20:39 +00:00
|
|
|
if ((aWidth && *aWidth < 100) || (aHeight && *aHeight < 100)) {
|
2000-08-22 03:51:17 +00:00
|
|
|
// Check security state for use in determing window dimensions
|
2002-05-17 22:24:06 +00:00
|
|
|
|
|
|
|
NS_ENSURE_TRUE(sSecMan, NS_ERROR_FAILURE);
|
2000-06-21 00:20:39 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
PRBool enabled;
|
2002-05-17 22:24:06 +00:00
|
|
|
nsresult res = sSecMan->IsCapabilityEnabled("UniversalBrowserWrite",
|
|
|
|
&enabled);
|
2000-06-21 00:20:39 +00:00
|
|
|
|
|
|
|
if (NS_FAILED(res) || !enabled) {
|
|
|
|
//sec check failed
|
|
|
|
if (aWidth && *aWidth < 100) {
|
|
|
|
*aWidth = 100;
|
|
|
|
}
|
|
|
|
if (aHeight && *aHeight < 100) {
|
|
|
|
*aHeight = 100;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::CheckSecurityLeftAndTop(PRInt32* aLeft, PRInt32* aTop)
|
2000-06-21 00:20:39 +00:00
|
|
|
{
|
2002-11-28 01:04:18 +00:00
|
|
|
// This one is harder. We have to get the screen size and window dimensions.
|
2000-06-21 00:20:39 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
// Check security state for use in determing window dimensions
|
2002-05-17 22:24:06 +00:00
|
|
|
|
|
|
|
NS_ENSURE_TRUE(sSecMan, NS_ERROR_FAILURE);
|
2000-06-21 00:20:39 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
PRBool enabled;
|
2002-05-17 22:24:06 +00:00
|
|
|
nsresult res = sSecMan->IsCapabilityEnabled("UniversalBrowserWrite",
|
|
|
|
&enabled);
|
2000-06-21 00:20:39 +00:00
|
|
|
if (NS_FAILED(res)) {
|
2000-08-22 03:51:17 +00:00
|
|
|
enabled = PR_FALSE;
|
2000-06-21 00:20:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!enabled) {
|
2001-03-09 02:12:51 +00:00
|
|
|
PRInt32 screenLeft, screenTop, screenWidth, screenHeight;
|
|
|
|
PRInt32 winLeft, winTop, winWidth, winHeight;
|
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow* rootWindow =
|
|
|
|
NS_STATIC_CAST(nsGlobalWindow*, GetPrivateRoot());
|
2004-05-27 22:08:42 +00:00
|
|
|
if (rootWindow) {
|
|
|
|
rootWindow->FlushPendingNotifications(Flush_Layout);
|
|
|
|
}
|
2001-03-09 02:12:51 +00:00
|
|
|
|
|
|
|
// Get the window size
|
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwner;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwner));
|
|
|
|
if (treeOwner)
|
|
|
|
treeOwner->GetPositionAndSize(&winLeft, &winTop, &winWidth, &winHeight);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
// Get the screen dimensions
|
2001-03-09 02:12:51 +00:00
|
|
|
// XXX This should use nsIScreenManager once it's fully fleshed out.
|
2000-06-21 00:20:39 +00:00
|
|
|
nsCOMPtr<nsIDOMScreen> screen;
|
2001-03-09 02:12:51 +00:00
|
|
|
GetScreen(getter_AddRefs(screen));
|
|
|
|
if (screen) {
|
|
|
|
screen->GetAvailLeft(&screenLeft);
|
2000-08-22 03:51:17 +00:00
|
|
|
screen->GetAvailWidth(&screenWidth);
|
|
|
|
screen->GetAvailHeight(&screenHeight);
|
2001-11-10 23:30:13 +00:00
|
|
|
#if defined(XP_MAC) || defined(XP_MACOSX)
|
2001-03-09 02:12:51 +00:00
|
|
|
/* The mac's coordinate system is different from the assumed Windows'
|
|
|
|
system. It offsets by the height of the menubar so that a window
|
|
|
|
placed at (0,0) will be entirely visible. Unfortunately that
|
|
|
|
correction is made elsewhere (in Widget) and the meaning of
|
|
|
|
the Avail... coordinates is overloaded. Here we allow a window
|
|
|
|
to be placed at (0,0) because it does make sense to do so.
|
|
|
|
*/
|
|
|
|
screen->GetTop(&screenTop);
|
|
|
|
#else
|
|
|
|
screen->GetAvailTop(&screenTop);
|
|
|
|
#endif
|
2000-06-21 00:20:39 +00:00
|
|
|
}
|
|
|
|
|
2001-03-09 02:12:51 +00:00
|
|
|
if (screen && treeOwner) {
|
|
|
|
if (aLeft) {
|
|
|
|
if (screenLeft+screenWidth < *aLeft+winWidth)
|
|
|
|
*aLeft = screenLeft+screenWidth - winWidth;
|
|
|
|
if (screenLeft > *aLeft)
|
|
|
|
*aLeft = screenLeft;
|
|
|
|
}
|
|
|
|
if (aTop) {
|
|
|
|
if (screenTop+screenHeight < *aTop+winHeight)
|
|
|
|
*aTop = screenTop+screenHeight - winHeight;
|
|
|
|
if (screenTop > *aTop)
|
|
|
|
*aTop = screenTop;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (aLeft)
|
|
|
|
*aLeft = 0;
|
|
|
|
if (aTop)
|
|
|
|
*aTop = 0;
|
2000-06-21 00:20:39 +00:00
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-06-21 00:20:39 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetPageXOffset(PRInt32* aPageXOffset)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
return GetScrollX(aPageXOffset);
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetPageYOffset(PRInt32* aPageYOffset)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
return GetScrollY(aPageYOffset);
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2003-04-15 13:40:46 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetScrollMaxXY(PRInt32* aScrollMaxX, PRInt32* aScrollMaxY)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetScrollMaxXY, (aScrollMaxX, aScrollMaxY),
|
|
|
|
NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-04-15 13:40:46 +00:00
|
|
|
nsresult rv;
|
2001-06-18 07:37:11 +00:00
|
|
|
nsIScrollableView *view = nsnull; // no addref/release for views
|
2000-08-22 03:51:17 +00:00
|
|
|
float p2t, t2p;
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2004-08-08 17:39:20 +00:00
|
|
|
FlushPendingNotifications(Flush_Layout);
|
2000-08-22 03:51:17 +00:00
|
|
|
GetScrollInfo(&view, &p2t, &t2p);
|
2003-04-15 13:40:46 +00:00
|
|
|
if (!view)
|
2004-04-28 12:56:02 +00:00
|
|
|
return NS_OK; // bug 230965 changed from NS_ERROR_FAILURE
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2003-04-15 13:40:46 +00:00
|
|
|
nsSize scrolledSize;
|
|
|
|
rv = view->GetContainerSize(&scrolledSize.width, &scrolledSize.height);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2004-09-20 22:25:07 +00:00
|
|
|
nsRect portRect = view->View()->GetBounds();
|
2003-04-15 13:40:46 +00:00
|
|
|
|
|
|
|
if (aScrollMaxX)
|
|
|
|
*aScrollMaxX = PR_MAX(0,
|
|
|
|
(PRInt32)floor(t2p*(scrolledSize.width - portRect.width)));
|
|
|
|
if (aScrollMaxY)
|
|
|
|
*aScrollMaxY = PR_MAX(0,
|
|
|
|
(PRInt32)floor(t2p*(scrolledSize.height - portRect.height)));
|
|
|
|
|
|
|
|
return NS_OK;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetScrollMaxX(PRInt32* aScrollMaxX)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2003-04-15 13:40:46 +00:00
|
|
|
NS_ENSURE_ARG_POINTER(aScrollMaxX);
|
|
|
|
*aScrollMaxX = 0;
|
|
|
|
return GetScrollMaxXY(aScrollMaxX, nsnull);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetScrollMaxY(PRInt32* aScrollMaxY)
|
2003-04-15 13:40:46 +00:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aScrollMaxY);
|
|
|
|
*aScrollMaxY = 0;
|
|
|
|
return GetScrollMaxXY(nsnull, aScrollMaxY);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetScrollXY(PRInt32* aScrollX, PRInt32* aScrollY,
|
|
|
|
PRBool aDoFlush)
|
2003-04-15 13:40:46 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetScrollXY, (aScrollX, aScrollY, aDoFlush),
|
|
|
|
NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-04-15 13:40:46 +00:00
|
|
|
nsresult rv;
|
2001-06-18 07:37:11 +00:00
|
|
|
nsIScrollableView *view = nsnull; // no addref/release for views
|
2000-08-22 03:51:17 +00:00
|
|
|
float p2t, t2p;
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2004-08-08 17:39:20 +00:00
|
|
|
if (aDoFlush) {
|
|
|
|
FlushPendingNotifications(Flush_Layout);
|
|
|
|
} else {
|
|
|
|
EnsureSizeUpToDate();
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
GetScrollInfo(&view, &p2t, &t2p);
|
2003-04-15 13:40:46 +00:00
|
|
|
if (!view)
|
2003-04-18 13:52:49 +00:00
|
|
|
return NS_OK; // bug 202206 changed from NS_ERROR_FAILURE
|
2003-04-15 13:40:46 +00:00
|
|
|
|
|
|
|
nscoord xPos, yPos;
|
|
|
|
rv = view->GetScrollPosition(xPos, yPos);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2004-08-08 17:39:20 +00:00
|
|
|
|
|
|
|
if ((xPos != 0 || yPos != 0) && !aDoFlush) {
|
|
|
|
// Oh, well. This is the expensive case -- the window is scrolled and we
|
|
|
|
// didn't actually flush yet. Repeat, but with a flush, since the content
|
|
|
|
// may get shorter and hence our scroll position may decrease.
|
|
|
|
return GetScrollXY(aScrollX, aScrollY, PR_TRUE);
|
|
|
|
}
|
|
|
|
|
2003-04-15 13:40:46 +00:00
|
|
|
if (aScrollX)
|
|
|
|
*aScrollX = NSTwipsToIntPixels(xPos, t2p);
|
|
|
|
if (aScrollY)
|
2000-08-22 03:51:17 +00:00
|
|
|
*aScrollY = NSTwipsToIntPixels(yPos, t2p);
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2003-04-15 13:40:46 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetScrollX(PRInt32* aScrollX)
|
2003-04-15 13:40:46 +00:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aScrollX);
|
|
|
|
*aScrollX = 0;
|
2004-08-08 17:39:20 +00:00
|
|
|
return GetScrollXY(aScrollX, nsnull, PR_FALSE);
|
2003-04-15 13:40:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetScrollY(PRInt32* aScrollY)
|
2003-04-15 13:40:46 +00:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aScrollY);
|
|
|
|
*aScrollY = 0;
|
2004-08-08 17:39:20 +00:00
|
|
|
return GetScrollXY(nsnull, aScrollY, PR_FALSE);
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetLength(PRUint32* aLength)
|
Beginnings of massive landing of joki changes.
Relevant nsbeta3+ bugs 43309, 44503, 2634, 2504,5981, 24698, 25758, 33577,
36062, 36217, 41191, 41491, 42356, 42829, 43016
r=saari (joki code). also been tested by heikki and bryner
2000-08-08 21:19:03 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIDOMWindowCollection> frames;
|
|
|
|
if (NS_SUCCEEDED(GetFrames(getter_AddRefs(frames))) && frames) {
|
|
|
|
return frames->GetLength(aLength);
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
Beginnings of massive landing of joki changes.
Relevant nsbeta3+ bugs 43309, 44503, 2634, 2504,5981, 24698, 25758, 33577,
36062, 36217, 41191, 41491, 42356, 42829, 43016
r=saari (joki code). also been tested by heikki and bryner
2000-08-08 21:19:03 +00:00
|
|
|
}
|
|
|
|
|
2004-11-03 17:06:21 +00:00
|
|
|
PRBool
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::DispatchCustomEvent(const char *aEventName)
|
2004-11-03 17:06:21 +00:00
|
|
|
{
|
2005-03-04 02:01:54 +00:00
|
|
|
PRBool defaultActionEnabled = PR_TRUE;
|
2005-10-10 18:38:57 +00:00
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(mDocument));
|
|
|
|
nsContentUtils::DispatchTrustedEvent(doc,
|
|
|
|
NS_STATIC_CAST(
|
|
|
|
nsIScriptGlobalObject*, this),
|
|
|
|
NS_ConvertASCIItoUTF16(aEventName),
|
|
|
|
PR_TRUE, PR_TRUE, &defaultActionEnabled);
|
2004-11-03 17:06:21 +00:00
|
|
|
|
2005-03-04 02:01:54 +00:00
|
|
|
return defaultActionEnabled;
|
2004-11-03 17:06:21 +00:00
|
|
|
}
|
|
|
|
|
2005-01-11 19:36:40 +00:00
|
|
|
static already_AddRefed<nsIDocShellTreeItem>
|
|
|
|
GetCallerDocShellTreeItem()
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIJSContextStack> stack =
|
|
|
|
do_GetService(sJSStackContractID);
|
|
|
|
|
|
|
|
JSContext *cx = nsnull;
|
|
|
|
|
|
|
|
if (stack) {
|
|
|
|
stack->Peek(&cx);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIDocShellTreeItem *callerItem = nsnull;
|
|
|
|
|
|
|
|
if (cx) {
|
|
|
|
nsCOMPtr<nsIWebNavigation> callerWebNav =
|
|
|
|
do_GetInterface(nsJSUtils::GetDynamicScriptGlobal(cx));
|
|
|
|
|
|
|
|
if (callerWebNav) {
|
|
|
|
CallQueryInterface(callerWebNav, &callerItem);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return callerItem;
|
|
|
|
}
|
|
|
|
|
|
|
|
PRBool
|
|
|
|
nsGlobalWindow::WindowExists(const nsAString& aName)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> caller = GetCallerDocShellTreeItem();
|
|
|
|
PRBool foundWindow = PR_FALSE;
|
|
|
|
|
|
|
|
if (!caller) {
|
|
|
|
// If we can't reach a caller, try to use our own docshell
|
2005-07-30 20:57:07 +00:00
|
|
|
caller = do_QueryInterface(GetDocShellInternal());
|
2005-01-11 19:36:40 +00:00
|
|
|
}
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShell =
|
|
|
|
do_QueryInterface(GetDocShellInternal());
|
2005-01-11 19:36:40 +00:00
|
|
|
|
|
|
|
if (docShell) {
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> namedItem;
|
|
|
|
|
|
|
|
docShell->FindItemWithName(PromiseFlatString(aName).get(), nsnull, caller,
|
|
|
|
getter_AddRefs(namedItem));
|
|
|
|
|
|
|
|
foundWindow = !!namedItem;
|
|
|
|
} else {
|
|
|
|
// No caller reachable and we don't have a docshell any more. Fall
|
|
|
|
// back to using the windowwatcher service to find any window by
|
|
|
|
// name.
|
|
|
|
|
|
|
|
nsCOMPtr<nsIWindowWatcher> wwatch =
|
|
|
|
do_GetService(NS_WINDOWWATCHER_CONTRACTID);
|
|
|
|
if (wwatch) {
|
|
|
|
nsCOMPtr<nsIDOMWindow> namedWindow;
|
|
|
|
wwatch->GetWindowByName(PromiseFlatString(aName).get(), nsnull,
|
|
|
|
getter_AddRefs(namedWindow));
|
|
|
|
|
|
|
|
foundWindow = !!namedWindow;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return foundWindow;
|
|
|
|
}
|
|
|
|
|
2005-03-06 18:43:07 +00:00
|
|
|
already_AddRefed<nsIWidget>
|
|
|
|
nsGlobalWindow::GetMainWidget()
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
|
|
|
|
nsIWidget *widget = nsnull;
|
|
|
|
|
|
|
|
if (treeOwnerAsWin) {
|
|
|
|
treeOwnerAsWin->GetMainWidget(&widget);
|
|
|
|
}
|
|
|
|
|
|
|
|
return widget;
|
|
|
|
}
|
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsGlobalWindow::SetFullScreen(PRBool aFullScreen)
|
2002-02-20 03:33:52 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(SetFullScreen, (aFullScreen), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-12-03 06:08:08 +00:00
|
|
|
// Only chrome can change our fullScreen mode.
|
|
|
|
if (aFullScreen == mFullScreen || !IsCallerChrome()) {
|
2002-02-20 03:33:52 +00:00
|
|
|
return NS_OK;
|
2002-12-03 06:08:08 +00:00
|
|
|
}
|
2002-02-20 03:33:52 +00:00
|
|
|
|
|
|
|
// SetFullScreen needs to be called on the root window, so get that
|
2002-11-28 01:04:18 +00:00
|
|
|
// via the DocShell tree, and if we are not already the root,
|
2002-02-20 03:33:52 +00:00
|
|
|
// call SetFullScreen on that window instead.
|
2004-02-09 22:48:53 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> treeItem = do_QueryInterface(mDocShell);
|
2002-02-20 03:33:52 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> rootItem;
|
|
|
|
treeItem->GetRootTreeItem(getter_AddRefs(rootItem));
|
|
|
|
nsCOMPtr<nsIDOMWindowInternal> window = do_GetInterface(rootItem);
|
|
|
|
if (!window)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
if (rootItem != treeItem)
|
|
|
|
return window->SetFullScreen(aFullScreen);
|
|
|
|
|
|
|
|
// make sure we don't try to set full screen on a non-chrome window,
|
|
|
|
// which might happen in embedding world
|
|
|
|
PRInt32 itemType;
|
|
|
|
treeItem->GetItemType(&itemType);
|
|
|
|
if (itemType != nsIDocShellTreeItem::typeChrome)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2004-11-03 17:06:21 +00:00
|
|
|
// dispatch a "fullscreen" DOM event so that XUL apps can
|
2002-02-20 03:33:52 +00:00
|
|
|
// respond visually if we are kicked into full screen mode
|
2004-11-03 17:06:21 +00:00
|
|
|
if (!DispatchCustomEvent("fullscreen")) {
|
|
|
|
// event handlers can prevent us from going into full-screen mode
|
2002-02-20 03:33:52 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
2004-11-03 17:06:21 +00:00
|
|
|
}
|
2002-02-20 03:33:52 +00:00
|
|
|
|
2005-03-06 18:43:07 +00:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetMainWidget();
|
2002-11-06 09:35:13 +00:00
|
|
|
if (widget)
|
|
|
|
widget->MakeFullScreen(aFullScreen);
|
|
|
|
|
2002-02-20 03:33:52 +00:00
|
|
|
mFullScreen = aFullScreen;
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsGlobalWindow::GetFullScreen(PRBool* aFullScreen)
|
2002-02-20 03:33:52 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetFullScreen, (aFullScreen), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-02-20 03:33:52 +00:00
|
|
|
*aFullScreen = mFullScreen;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Dump(const nsAString& aStr)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2001-08-30 08:07:07 +00:00
|
|
|
#if !(defined(NS_DEBUG) || defined(MOZ_ENABLE_JS_DUMP))
|
2001-06-22 10:54:23 +00:00
|
|
|
{
|
|
|
|
// In optimized builds we check a pref that controls if we should
|
|
|
|
// enable output from dump() or not, in debug builds it's always
|
|
|
|
// enabled.
|
|
|
|
|
|
|
|
// if pref doesn't exist, disable dump output.
|
2004-04-29 23:34:19 +00:00
|
|
|
PRBool enable_dump =
|
|
|
|
nsContentUtils::GetBoolPref("browser.dom.window.dump.enabled");
|
2001-06-22 10:54:23 +00:00
|
|
|
|
2004-04-29 23:34:19 +00:00
|
|
|
if (!enable_dump) {
|
2001-06-22 10:54:23 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2000-08-23 17:27:06 +00:00
|
|
|
char *cstr = ToNewUTF8String(aStr);
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2003-04-12 03:08:23 +00:00
|
|
|
#if defined(XP_MAC) || defined(XP_MACOSX)
|
2000-08-22 03:51:17 +00:00
|
|
|
// have to convert \r to \n so that printing to the console works
|
|
|
|
char *c = cstr, *cEnd = cstr + aStr.Length();
|
|
|
|
while (c < cEnd) {
|
|
|
|
if (*c == '\r')
|
|
|
|
*c = '\n';
|
|
|
|
c++;
|
|
|
|
}
|
1999-08-03 12:43:06 +00:00
|
|
|
#endif
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (cstr) {
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("%s", cstr);
|
2004-01-25 14:53:21 +00:00
|
|
|
nsMemory::Free(cstr);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
|
|
|
|
1998-07-16 01:16:47 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-02-05 05:47:22 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::EnsureReflowFlushAndPaint()
|
2001-04-25 19:52:49 +00:00
|
|
|
{
|
2002-02-05 05:47:22 +00:00
|
|
|
NS_ASSERTION(mDocShell, "EnsureReflowFlushAndPaint() called with no "
|
|
|
|
"docshell!");
|
2001-04-25 19:52:49 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIPresShell> presShell;
|
2002-02-05 05:47:22 +00:00
|
|
|
mDocShell->GetPresShell(getter_AddRefs(presShell));
|
2001-04-25 19:52:49 +00:00
|
|
|
|
|
|
|
if (!presShell)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Flush pending reflows.
|
2005-10-20 23:32:54 +00:00
|
|
|
if (mDoc) {
|
|
|
|
mDoc->FlushPendingNotifications(Flush_Layout);
|
2002-02-05 05:47:22 +00:00
|
|
|
}
|
2001-04-25 19:52:49 +00:00
|
|
|
|
|
|
|
// Unsuppress painting.
|
2001-05-01 22:54:11 +00:00
|
|
|
presShell->UnsuppressPainting();
|
2001-04-25 19:52:49 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetTextZoom(float *aZoom)
|
2002-01-16 03:03:53 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetTextZoom, (aZoom), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-01-16 03:03:53 +00:00
|
|
|
if (mDocShell) {
|
|
|
|
nsCOMPtr<nsIContentViewer> contentViewer;
|
|
|
|
mDocShell->GetContentViewer(getter_AddRefs(contentViewer));
|
|
|
|
nsCOMPtr<nsIMarkupDocumentViewer> markupViewer(do_QueryInterface(contentViewer));
|
|
|
|
|
|
|
|
if (markupViewer) {
|
|
|
|
return markupViewer->GetTextZoom(aZoom);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetTextZoom(float aZoom)
|
2002-01-16 03:03:53 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(SetTextZoom, (aZoom), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-01-16 03:03:53 +00:00
|
|
|
if (mDocShell) {
|
|
|
|
nsCOMPtr<nsIContentViewer> contentViewer;
|
|
|
|
mDocShell->GetContentViewer(getter_AddRefs(contentViewer));
|
|
|
|
nsCOMPtr<nsIMarkupDocumentViewer> markupViewer(do_QueryInterface(contentViewer));
|
|
|
|
|
|
|
|
if (markupViewer)
|
|
|
|
return markupViewer->SetTextZoom(aZoom);
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2002-05-17 22:24:06 +00:00
|
|
|
// static
|
|
|
|
PRBool
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::IsCallerChrome()
|
2002-05-17 22:24:06 +00:00
|
|
|
{
|
2004-05-05 09:03:48 +00:00
|
|
|
NS_ENSURE_TRUE(sSecMan, PR_FALSE);
|
2002-05-17 22:24:06 +00:00
|
|
|
|
2004-05-05 09:03:48 +00:00
|
|
|
PRBool isChrome = PR_FALSE;
|
|
|
|
nsresult rv = sSecMan->SubjectPrincipalIsSystem(&isChrome);
|
2002-05-17 22:24:06 +00:00
|
|
|
|
2004-05-05 09:03:48 +00:00
|
|
|
return NS_SUCCEEDED(rv) ? isChrome : PR_FALSE;
|
2002-05-17 22:24:06 +00:00
|
|
|
}
|
|
|
|
|
2004-06-23 01:11:06 +00:00
|
|
|
// static
|
2002-03-20 11:23:13 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::MakeScriptDialogTitle(const nsAString &aInTitle,
|
|
|
|
nsAString &aOutTitle)
|
2002-03-20 11:23:13 +00:00
|
|
|
{
|
2004-06-23 01:11:06 +00:00
|
|
|
aOutTitle.Truncate();
|
2002-03-20 11:23:13 +00:00
|
|
|
|
2005-07-06 07:38:36 +00:00
|
|
|
// Try to get a host from the running principal -- this will do the
|
|
|
|
// right thing for javascript: and data: documents.
|
|
|
|
|
|
|
|
nsresult rv = NS_OK;
|
|
|
|
NS_WARN_IF_FALSE(sSecMan, "Global Window has no security manager!");
|
|
|
|
if (sSecMan) {
|
|
|
|
nsCOMPtr<nsIPrincipal> principal;
|
|
|
|
rv = sSecMan->GetSubjectPrincipal(getter_AddRefs(principal));
|
|
|
|
|
|
|
|
if (NS_SUCCEEDED(rv) && principal) {
|
|
|
|
nsCOMPtr<nsIURI> uri;
|
|
|
|
rv = principal->GetURI(getter_AddRefs(uri));
|
|
|
|
|
|
|
|
if (NS_SUCCEEDED(rv) && uri) {
|
|
|
|
// remove user:pass for privacy and spoof prevention
|
|
|
|
|
|
|
|
nsCOMPtr<nsIURIFixup> fixup(do_GetService(NS_URIFIXUP_CONTRACTID));
|
|
|
|
if (fixup) {
|
|
|
|
nsCOMPtr<nsIURI> fixedURI;
|
|
|
|
rv = fixup->CreateExposableURI(uri, getter_AddRefs(fixedURI));
|
|
|
|
if (NS_SUCCEEDED(rv) && fixedURI) {
|
|
|
|
nsCAutoString host;
|
|
|
|
fixedURI->GetHost(host);
|
|
|
|
|
|
|
|
if (!host.IsEmpty()) {
|
|
|
|
// if this URI has a host we'll show it. For other
|
|
|
|
// schemes (e.g. file:) we fall back to the localized
|
|
|
|
// generic string
|
|
|
|
|
|
|
|
nsCAutoString prepath;
|
|
|
|
fixedURI->GetPrePath(prepath);
|
|
|
|
|
|
|
|
aOutTitle = NS_ConvertUTF8toUTF16(prepath);
|
|
|
|
if (!aInTitle.IsEmpty()) {
|
|
|
|
aOutTitle.Append(NS_LITERAL_STRING(" - ") + aInTitle);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else { // failed to get subject principal
|
|
|
|
NS_WARNING("No script principal? Who is calling alert/confirm/prompt?!");
|
|
|
|
}
|
|
|
|
}
|
2004-06-23 01:11:06 +00:00
|
|
|
|
2005-07-06 07:38:36 +00:00
|
|
|
if (aOutTitle.IsEmpty()) {
|
|
|
|
// We didn't find a host so use the generic title modifier. Load
|
|
|
|
// the string to be prepended to titles for script
|
|
|
|
// confirm/alert/prompt boxes.
|
|
|
|
|
|
|
|
nsCOMPtr<nsIStringBundleService> stringBundleService =
|
|
|
|
do_GetService(kCStringBundleServiceCID);
|
|
|
|
|
|
|
|
if (stringBundleService) {
|
|
|
|
nsCOMPtr<nsIStringBundle> stringBundle;
|
|
|
|
stringBundleService->CreateBundle(kDOMBundleURL,
|
|
|
|
getter_AddRefs(stringBundle));
|
|
|
|
|
|
|
|
if (stringBundle) {
|
|
|
|
nsAutoString inTitle(aInTitle);
|
|
|
|
nsXPIDLString tempString;
|
|
|
|
const PRUnichar *formatStrings[1];
|
|
|
|
formatStrings[0] = inTitle.get();
|
|
|
|
stringBundle->FormatStringFromName(
|
|
|
|
NS_LITERAL_STRING("ScriptDlgTitle").get(),
|
|
|
|
formatStrings, 1, getter_Copies(tempString));
|
|
|
|
if (tempString) {
|
|
|
|
aOutTitle = tempString.get();
|
|
|
|
}
|
|
|
|
}
|
2002-03-20 11:23:13 +00:00
|
|
|
}
|
|
|
|
}
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2002-03-20 11:23:13 +00:00
|
|
|
// Just in case
|
|
|
|
if (aOutTitle.IsEmpty()) {
|
|
|
|
NS_WARNING("could not get ScriptDlgTitle string from string bundle");
|
2004-06-17 00:13:25 +00:00
|
|
|
aOutTitle.AssignLiteral("[Script] ");
|
2002-03-20 11:23:13 +00:00
|
|
|
aOutTitle.Append(aInTitle);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Alert(const nsAString& aString)
|
2000-08-22 03:51:17 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(Alert, (aString), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2004-11-03 17:06:21 +00:00
|
|
|
nsCOMPtr<nsIPrompt> prompter(do_GetInterface(mDocShell));
|
|
|
|
NS_ENSURE_TRUE(prompter, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
// Reset popup state while opening a modal dialog, and firing events
|
|
|
|
// about the dialog, to prevent the current state from being active
|
|
|
|
// the whole time a modal dialog is open.
|
|
|
|
nsAutoPopupStatePusher popupStatePusher(openAbused, PR_TRUE);
|
|
|
|
|
2004-04-08 01:53:40 +00:00
|
|
|
// Special handling for alert(null) in JS for backwards
|
|
|
|
// compatibility.
|
1999-06-11 23:57:25 +00:00
|
|
|
|
2004-04-08 01:53:40 +00:00
|
|
|
NS_NAMED_LITERAL_STRING(null_str, "null");
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2004-04-08 01:53:40 +00:00
|
|
|
const nsAString *str = DOMStringIsNull(aString) ? &null_str : &aString;
|
1999-11-16 20:05:21 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
// Before bringing up the window, unsuppress painting and flush
|
|
|
|
// pending reflows.
|
2002-02-05 05:47:22 +00:00
|
|
|
EnsureReflowFlushAndPaint();
|
2001-04-25 19:52:49 +00:00
|
|
|
|
2005-10-26 08:54:56 +00:00
|
|
|
nsAutoString title;
|
|
|
|
MakeScriptDialogTitle(EmptyString(), title);
|
|
|
|
|
|
|
|
return prompter->Alert(title.get(), PromiseFlatString(*str).get());
|
1999-06-11 23:57:25 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Confirm(const nsAString& aString, PRBool* aReturn)
|
1999-06-11 23:57:25 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(Confirm, (aString, aReturn), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2004-11-03 17:06:21 +00:00
|
|
|
nsCOMPtr<nsIPrompt> prompter(do_GetInterface(mDocShell));
|
|
|
|
NS_ENSURE_TRUE(prompter, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
// Reset popup state while opening a modal dialog, and firing events
|
|
|
|
// about the dialog, to prevent the current state from being active
|
|
|
|
// the whole time a modal dialog is open.
|
|
|
|
nsAutoPopupStatePusher popupStatePusher(openAbused, PR_TRUE);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
*aReturn = PR_FALSE;
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
|
|
|
// Before bringing up the window, unsuppress painting and flush
|
|
|
|
// pending reflows.
|
2002-02-05 05:47:22 +00:00
|
|
|
EnsureReflowFlushAndPaint();
|
2001-04-25 19:52:49 +00:00
|
|
|
|
2005-10-26 08:54:56 +00:00
|
|
|
nsAutoString title;
|
|
|
|
MakeScriptDialogTitle(EmptyString(), title);
|
|
|
|
|
|
|
|
return prompter->Confirm(title.get(), PromiseFlatString(aString).get(), aReturn);
|
1999-06-11 23:57:25 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Prompt(const nsAString& aMessage, const nsAString& aInitial,
|
|
|
|
const nsAString& aTitle, PRUint32 aSavePassword,
|
|
|
|
nsAString& aReturn)
|
1999-06-11 23:57:25 +00:00
|
|
|
{
|
2004-05-05 09:03:48 +00:00
|
|
|
SetDOMStringToNull(aReturn);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2005-03-17 23:48:26 +00:00
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIWindowWatcher> wwatch =
|
|
|
|
do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIAuthPrompt> prompter;
|
|
|
|
wwatch->GetNewAuthPrompter(this, getter_AddRefs(prompter));
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_ENSURE_TRUE(prompter, NS_ERROR_FAILURE);
|
|
|
|
|
2004-11-03 17:06:21 +00:00
|
|
|
// Reset popup state while opening a modal dialog, and firing events
|
|
|
|
// about the dialog, to prevent the current state from being active
|
|
|
|
// the whole time a modal dialog is open.
|
|
|
|
nsAutoPopupStatePusher popupStatePusher(openAbused, PR_TRUE);
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
PRBool b;
|
|
|
|
nsXPIDLString uniResult;
|
|
|
|
|
|
|
|
// Before bringing up the window, unsuppress painting and flush
|
|
|
|
// pending reflows.
|
2002-02-05 05:47:22 +00:00
|
|
|
EnsureReflowFlushAndPaint();
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2002-03-20 11:23:13 +00:00
|
|
|
nsAutoString title;
|
2005-10-26 08:54:56 +00:00
|
|
|
MakeScriptDialogTitle(aTitle, title);
|
2002-03-20 11:23:13 +00:00
|
|
|
|
2005-03-17 23:48:26 +00:00
|
|
|
rv = prompter->Prompt(title.get(), PromiseFlatString(aMessage).get(), nsnull,
|
|
|
|
aSavePassword, PromiseFlatString(aInitial).get(),
|
|
|
|
getter_Copies(uniResult), &b);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
if (uniResult && b) {
|
|
|
|
aReturn.Assign(uniResult);
|
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Prompt(nsAString& aReturn)
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(Prompt, (aReturn), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_ENSURE_STATE(mDocShell);
|
|
|
|
|
|
|
|
nsresult rv = NS_OK;
|
|
|
|
nsCOMPtr<nsIXPCNativeCallContext> ncc;
|
|
|
|
|
2004-09-01 16:50:12 +00:00
|
|
|
rv = nsContentUtils::XPConnect()->
|
|
|
|
GetCurrentNativeCallContext(getter_AddRefs(ncc));
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
if (!ncc)
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
|
|
|
|
JSContext *cx = nsnull;
|
|
|
|
|
|
|
|
rv = ncc->GetJSContext(&cx);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsAutoString message, initial, title;
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
|
|
|
PRUint32 argc;
|
|
|
|
jsval *argv = nsnull;
|
|
|
|
|
|
|
|
ncc->GetArgc(&argc);
|
|
|
|
ncc->GetArgvPtr(&argv);
|
|
|
|
|
2001-04-10 18:30:25 +00:00
|
|
|
PRUint32 savePassword = nsIAuthPrompt::SAVE_PASSWORD_NEVER;
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (argc > 0) {
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsJSUtils::ConvertJSValToString(message, cx, argv[0]);
|
2000-06-17 01:57:36 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (argc > 1) {
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsJSUtils::ConvertJSValToString(initial, cx, argv[1]);
|
2000-06-17 01:57:36 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (argc > 2) {
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsJSUtils::ConvertJSValToString(title, cx, argv[2]);
|
2000-08-22 03:51:17 +00:00
|
|
|
|
|
|
|
if (argc > 3) {
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsJSUtils::ConvertJSValToUint32(&savePassword, cx, argv[3]);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
1999-11-16 20:05:21 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
return Prompt(message, initial, title, savePassword, aReturn);
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Focus()
|
1998-09-03 01:19:58 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(Focus, (), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2005-10-17 21:37:49 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> baseWin = do_QueryInterface(mDocShell);
|
|
|
|
|
|
|
|
PRBool isVisible = PR_FALSE;
|
|
|
|
if (baseWin) {
|
|
|
|
baseWin->GetVisibility(&isVisible);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!isVisible) {
|
|
|
|
// A hidden tab is being focused, ignore this call.
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
/*
|
|
|
|
* If caller is not chrome and dom.disable_window_flip is true,
|
2005-09-30 23:51:04 +00:00
|
|
|
* prevent bringing a window to the front if the window is not the
|
|
|
|
* currently active window, but do change the currently focused
|
|
|
|
* window in the focus controller so that focus is in the right
|
|
|
|
* place when the window is activated again.
|
2002-04-12 10:11:00 +00:00
|
|
|
*/
|
|
|
|
|
2005-09-30 23:51:04 +00:00
|
|
|
PRBool canFocus = CanSetProperty("dom.disable_window_flip");
|
|
|
|
|
|
|
|
PRBool isActive = PR_FALSE;
|
|
|
|
nsIFocusController *focusController =
|
|
|
|
nsGlobalWindow::GetRootFocusController();
|
|
|
|
if (focusController) {
|
|
|
|
focusController->GetActive(&isActive);
|
2002-04-12 10:11:00 +00:00
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
2005-09-30 23:51:04 +00:00
|
|
|
if (treeOwnerAsWin && (canFocus || isActive)) {
|
2002-03-04 22:50:11 +00:00
|
|
|
PRBool isEnabled = PR_TRUE;
|
|
|
|
if (NS_SUCCEEDED(treeOwnerAsWin->GetEnabled(&isEnabled)) && !isEnabled) {
|
|
|
|
NS_WARNING( "Should not try to set the focus on a disabled window" );
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
treeOwnerAsWin->SetVisibility(PR_TRUE);
|
2002-01-16 00:11:51 +00:00
|
|
|
nsCOMPtr<nsIEmbeddingSiteWindow> embeddingWin(do_GetInterface(treeOwnerAsWin));
|
|
|
|
if (embeddingWin)
|
|
|
|
embeddingWin->SetFocus();
|
|
|
|
}
|
1999-07-02 19:43:26 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIPresShell> presShell;
|
2001-05-22 23:52:17 +00:00
|
|
|
if (mDocShell) {
|
2005-10-04 05:44:45 +00:00
|
|
|
// Don't look for a presshell if we're a root chrome window that's got
|
|
|
|
// about:blank loaded. We don't want to focus our widget in that case.
|
|
|
|
PRBool lookForPresShell = PR_TRUE;
|
|
|
|
PRInt32 itemType = nsIDocShellTreeItem::typeContent;
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> treeItem(do_QueryInterface(mDocShell));
|
|
|
|
NS_ASSERTION(treeItem, "What happened?");
|
|
|
|
treeItem->GetItemType(&itemType);
|
|
|
|
if (itemType == nsIDocShellTreeItem::typeChrome &&
|
|
|
|
GetPrivateRoot() == NS_STATIC_CAST(nsIDOMWindowInternal*, this) &&
|
|
|
|
mDocument) {
|
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(mDocument));
|
|
|
|
NS_ASSERTION(doc, "Bogus doc?");
|
|
|
|
nsIURI* ourURI = doc->GetDocumentURI();
|
|
|
|
PRBool isAbout;
|
|
|
|
if (ourURI && NS_SUCCEEDED(ourURI->SchemeIs("about", &isAbout)) &&
|
|
|
|
isAbout) {
|
|
|
|
nsCAutoString spec;
|
|
|
|
ourURI->GetSpec(spec);
|
|
|
|
lookForPresShell = !spec.EqualsLiteral("about:blank");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lookForPresShell) {
|
|
|
|
mDocShell->GetEldestPresShell(getter_AddRefs(presShell));
|
|
|
|
}
|
2001-05-22 23:52:17 +00:00
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
|
|
|
|
nsresult result = NS_OK;
|
2005-09-30 23:51:04 +00:00
|
|
|
if (presShell && (canFocus || isActive)) {
|
2003-09-23 17:05:29 +00:00
|
|
|
nsIViewManager* vm = presShell->GetViewManager();
|
2000-08-22 03:51:17 +00:00
|
|
|
if (vm) {
|
|
|
|
nsCOMPtr<nsIWidget> widget;
|
|
|
|
vm->GetWidget(getter_AddRefs(widget));
|
|
|
|
if (widget)
|
2001-03-19 17:56:04 +00:00
|
|
|
// raise the window since this was a focus call on the window.
|
|
|
|
result = widget->SetFocus(PR_TRUE);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
|
|
|
}
|
2001-06-30 00:25:09 +00:00
|
|
|
else {
|
2005-07-30 20:57:07 +00:00
|
|
|
if (focusController) {
|
2001-06-30 00:25:09 +00:00
|
|
|
focusController->SetFocusedWindow(this);
|
2005-07-30 20:57:07 +00:00
|
|
|
}
|
2001-06-30 00:25:09 +00:00
|
|
|
}
|
1998-09-03 01:19:58 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return result;
|
1998-09-03 01:19:58 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Blur()
|
2000-01-26 22:48:16 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(Blur, (), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-01-05 02:20:55 +00:00
|
|
|
nsresult rv = NS_ERROR_FAILURE;
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2002-01-05 02:20:55 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwner));
|
2002-04-18 21:50:11 +00:00
|
|
|
nsCOMPtr<nsIEmbeddingSiteWindow2> siteWindow(do_GetInterface(treeOwner));
|
2002-01-05 02:20:55 +00:00
|
|
|
if (siteWindow)
|
|
|
|
rv = siteWindow->Blur();
|
2000-01-26 22:48:16 +00:00
|
|
|
|
2002-01-05 02:20:55 +00:00
|
|
|
if (NS_SUCCEEDED(rv))
|
2001-05-22 23:52:17 +00:00
|
|
|
mDocShell->SetHasFocus(PR_FALSE);
|
|
|
|
|
2002-01-05 02:20:55 +00:00
|
|
|
return rv;
|
2000-01-26 22:48:16 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Back()
|
1998-09-04 00:46:06 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(Back, (), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(mDocShell));
|
|
|
|
NS_ENSURE_TRUE(webNav, NS_ERROR_FAILURE);
|
1999-12-17 00:50:17 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return webNav->GoBack();
|
1998-09-04 00:46:06 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Forward()
|
1999-10-28 14:12:56 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(Forward, (), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(mDocShell));
|
|
|
|
NS_ENSURE_TRUE(webNav, NS_ERROR_FAILURE);
|
1999-10-28 14:12:56 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return webNav->GoForward();
|
1999-10-28 14:12:56 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Home()
|
1999-10-28 14:12:56 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(Home, (), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mDocShell)
|
|
|
|
return NS_OK;
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2004-04-29 23:34:19 +00:00
|
|
|
nsAdoptingString homeURL =
|
|
|
|
nsContentUtils::GetLocalizedStringPref(PREF_BROWSER_STARTUP_HOMEPAGE);
|
1999-10-28 14:12:56 +00:00
|
|
|
|
2004-04-29 23:34:19 +00:00
|
|
|
if (homeURL.IsEmpty()) {
|
2000-08-22 03:51:17 +00:00
|
|
|
// if all else fails, use this
|
2000-10-28 22:17:53 +00:00
|
|
|
#ifdef DEBUG_seth
|
|
|
|
printf("all else failed. using %s as the home page\n", DEFAULT_HOME_PAGE);
|
|
|
|
#endif
|
2004-04-29 23:34:19 +00:00
|
|
|
CopyASCIItoUTF16(DEFAULT_HOME_PAGE, homeURL);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2001-11-30 22:35:33 +00:00
|
|
|
|
|
|
|
nsresult rv;
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(mDocShell));
|
|
|
|
NS_ENSURE_TRUE(webNav, NS_ERROR_FAILURE);
|
2002-02-09 03:36:55 +00:00
|
|
|
rv = webNav->LoadURI(homeURL.get(),
|
2001-11-30 22:35:33 +00:00
|
|
|
nsIWebNavigation::LOAD_FLAGS_NONE,
|
|
|
|
nsnull,
|
|
|
|
nsnull,
|
|
|
|
nsnull);
|
|
|
|
NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1999-10-28 14:12:56 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Stop()
|
2000-01-15 02:26:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(Stop, (), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(mDocShell));
|
2005-09-01 21:14:47 +00:00
|
|
|
if (!webNav)
|
|
|
|
return NS_OK;
|
|
|
|
|
2001-08-14 04:46:20 +00:00
|
|
|
return webNav->Stop(nsIWebNavigation::STOP_ALL);
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Print()
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-09-16 02:25:37 +00:00
|
|
|
#ifdef NS_PRINTING
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(Print, (), NS_ERROR_NOT_INITIALIZED);
|
|
|
|
|
2002-02-01 14:52:11 +00:00
|
|
|
nsCOMPtr<nsIWebBrowserPrint> webBrowserPrint;
|
2002-02-09 03:36:55 +00:00
|
|
|
if (NS_SUCCEEDED(GetInterface(NS_GET_IID(nsIWebBrowserPrint),
|
|
|
|
getter_AddRefs(webBrowserPrint)))) {
|
2004-11-04 22:40:02 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIPrintSettingsService> printSettingsService =
|
|
|
|
do_GetService("@mozilla.org/gfx/printsettings-service;1");
|
2005-09-01 21:14:47 +00:00
|
|
|
|
2002-05-07 12:03:37 +00:00
|
|
|
nsCOMPtr<nsIPrintSettings> printSettings;
|
2004-11-04 22:40:02 +00:00
|
|
|
if (printSettingsService) {
|
2005-06-10 18:26:31 +00:00
|
|
|
PRBool printSettingsAreGlobal =
|
|
|
|
nsContentUtils::GetBoolPref("print.use_global_printsettings", PR_FALSE);
|
2004-11-04 22:40:02 +00:00
|
|
|
|
2005-06-10 18:26:31 +00:00
|
|
|
if (printSettingsAreGlobal) {
|
|
|
|
printSettingsService->GetGlobalPrintSettings(getter_AddRefs(printSettings));
|
|
|
|
|
|
|
|
nsXPIDLString printerName;
|
|
|
|
printSettingsService->GetDefaultPrinterName(getter_Copies(printerName));
|
|
|
|
if (printerName)
|
|
|
|
printSettingsService->InitPrintSettingsFromPrinter(printerName, printSettings);
|
|
|
|
printSettingsService->InitPrintSettingsFromPrefs(printSettings,
|
2004-11-04 22:40:02 +00:00
|
|
|
PR_TRUE,
|
2005-06-10 18:26:31 +00:00
|
|
|
nsIPrintSettings::kInitSaveAll);
|
|
|
|
} else {
|
|
|
|
printSettingsService->GetNewPrintSettings(getter_AddRefs(printSettings));
|
|
|
|
}
|
|
|
|
|
2004-11-04 22:40:02 +00:00
|
|
|
webBrowserPrint->Print(printSettings, nsnull);
|
2005-06-10 18:26:31 +00:00
|
|
|
|
|
|
|
PRBool savePrintSettings =
|
|
|
|
nsContentUtils::GetBoolPref("print.save_print_settings", PR_FALSE);
|
|
|
|
if (printSettingsAreGlobal && savePrintSettings) {
|
2005-09-15 15:16:04 +00:00
|
|
|
printSettingsService->
|
|
|
|
SavePrintSettingsToPrefs(printSettings,
|
|
|
|
PR_TRUE,
|
|
|
|
nsIPrintSettings::kInitSaveAll);
|
|
|
|
printSettingsService->
|
|
|
|
SavePrintSettingsToPrefs(printSettings,
|
|
|
|
PR_FALSE,
|
|
|
|
nsIPrintSettings::kInitSavePrinterName);
|
2005-06-10 18:26:31 +00:00
|
|
|
}
|
2004-11-04 22:40:02 +00:00
|
|
|
} else {
|
|
|
|
webBrowserPrint->GetGlobalPrintSettings(getter_AddRefs(printSettings));
|
|
|
|
webBrowserPrint->Print(printSettings, nsnull);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
2005-09-16 02:25:37 +00:00
|
|
|
#else
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
#endif
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::MoveTo(PRInt32 aXPos, PRInt32 aYPos)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(MoveTo, (aXPos, aYPos), NS_ERROR_NOT_INITIALIZED);
|
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
/*
|
|
|
|
* If caller is not chrome and dom.disable_window_move_resize is true,
|
|
|
|
* prevent window.moveTo() by exiting early
|
|
|
|
*/
|
|
|
|
|
2005-01-12 19:21:28 +00:00
|
|
|
if (!CanSetProperty("dom.disable_window_move_resize") || IsFrame()) {
|
2002-04-12 10:11:00 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
NS_ENSURE_TRUE(treeOwnerAsWin, NS_ERROR_FAILURE);
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_SUCCESS(CheckSecurityLeftAndTop(&aXPos, &aYPos),
|
|
|
|
NS_ERROR_FAILURE);
|
2000-06-21 00:20:39 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->SetPosition(aXPos, aYPos),
|
|
|
|
NS_ERROR_FAILURE);
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::MoveBy(PRInt32 aXDif, PRInt32 aYDif)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(MoveBy, (aXDif, aYDif), NS_ERROR_NOT_INITIALIZED);
|
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
/*
|
|
|
|
* If caller is not chrome and dom.disable_window_move_resize is true,
|
|
|
|
* prevent window.moveBy() by exiting early
|
|
|
|
*/
|
|
|
|
|
2005-01-12 19:21:28 +00:00
|
|
|
if (!CanSetProperty("dom.disable_window_move_resize") || IsFrame()) {
|
2002-04-12 10:11:00 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
NS_ENSURE_TRUE(treeOwnerAsWin, NS_ERROR_FAILURE);
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
PRInt32 x, y;
|
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->GetPosition(&x, &y), NS_ERROR_FAILURE);
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
PRInt32 newX = x + aXDif;
|
|
|
|
PRInt32 newY = y + aYDif;
|
|
|
|
NS_ENSURE_SUCCESS(CheckSecurityLeftAndTop(&newX, &newY), NS_ERROR_FAILURE);
|
2000-06-21 00:20:39 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->SetPosition(newX, newY),
|
|
|
|
NS_ERROR_FAILURE);
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ResizeTo(PRInt32 aWidth, PRInt32 aHeight)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(ResizeTo, (aWidth, aHeight), NS_ERROR_NOT_INITIALIZED);
|
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
/*
|
|
|
|
* If caller is not chrome and dom.disable_window_move_resize is true,
|
|
|
|
* prevent window.resizeTo() by exiting early
|
|
|
|
*/
|
|
|
|
|
2004-07-05 15:51:31 +00:00
|
|
|
if (!CanSetProperty("dom.disable_window_move_resize") || IsFrame()) {
|
2002-04-12 10:11:00 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
NS_ENSURE_TRUE(treeOwnerAsWin, NS_ERROR_FAILURE);
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_SUCCESS(CheckSecurityWidthAndHeight(&aWidth, &aHeight),
|
|
|
|
NS_ERROR_FAILURE);
|
2000-06-21 00:20:39 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->SetSize(aWidth, aHeight, PR_TRUE),
|
|
|
|
NS_ERROR_FAILURE);
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
2000-01-15 02:26:10 +00:00
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ResizeBy(PRInt32 aWidthDif, PRInt32 aHeightDif)
|
2000-01-15 02:26:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(ResizeBy, (aWidthDif, aHeightDif), NS_ERROR_NOT_INITIALIZED);
|
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
/*
|
|
|
|
* If caller is not chrome and dom.disable_window_move_resize is true,
|
|
|
|
* prevent window.resizeBy() by exiting early
|
|
|
|
*/
|
|
|
|
|
2004-07-05 15:51:31 +00:00
|
|
|
if (!CanSetProperty("dom.disable_window_move_resize") || IsFrame()) {
|
2002-04-12 10:11:00 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
NS_ENSURE_TRUE(treeOwnerAsWin, NS_ERROR_FAILURE);
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2005-08-19 09:46:25 +00:00
|
|
|
PRInt32 width, height;
|
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->GetSize(&width, &height), NS_ERROR_FAILURE);
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2005-08-19 09:46:25 +00:00
|
|
|
PRInt32 newWidth = width + aWidthDif;
|
|
|
|
PRInt32 newHeight = height + aHeightDif;
|
|
|
|
NS_ENSURE_SUCCESS(CheckSecurityWidthAndHeight(&newWidth, &newHeight),
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ERROR_FAILURE);
|
2000-06-21 00:20:39 +00:00
|
|
|
|
2005-08-19 09:46:25 +00:00
|
|
|
NS_ENSURE_SUCCESS(treeOwnerAsWin->SetSize(newWidth, newHeight,
|
2000-08-22 03:51:17 +00:00
|
|
|
PR_TRUE), NS_ERROR_FAILURE);
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
2000-01-15 02:26:10 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SizeToContent()
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(SizeToContent, (), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
|
|
|
if (!mDocShell) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-04-12 10:11:00 +00:00
|
|
|
/*
|
|
|
|
* If caller is not chrome and dom.disable_window_move_resize is true,
|
|
|
|
* block window.SizeToContent() by exiting
|
|
|
|
*/
|
|
|
|
|
2005-01-12 19:21:28 +00:00
|
|
|
if (!CanSetProperty("dom.disable_window_move_resize") || IsFrame()) {
|
2002-04-12 10:11:00 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2004-05-28 16:03:09 +00:00
|
|
|
// The content viewer does a check to make sure that it's a content
|
|
|
|
// viewer for a toplevel docshell.
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIContentViewer> cv;
|
|
|
|
mDocShell->GetContentViewer(getter_AddRefs(cv));
|
|
|
|
nsCOMPtr<nsIMarkupDocumentViewer> markupViewer(do_QueryInterface(cv));
|
|
|
|
NS_ENSURE_TRUE(markupViewer, NS_ERROR_FAILURE);
|
|
|
|
NS_ENSURE_SUCCESS(markupViewer->SizeToContent(), NS_ERROR_FAILURE);
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
2000-01-15 02:26:10 +00:00
|
|
|
}
|
|
|
|
|
2004-05-26 18:10:47 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetWindowRoot(nsIDOMEventTarget **aWindowRoot)
|
2004-05-26 18:10:47 +00:00
|
|
|
{
|
|
|
|
*aWindowRoot = nsnull;
|
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsIDOMWindowInternal *rootWindow = nsGlobalWindow::GetPrivateRoot();
|
2004-05-26 18:10:47 +00:00
|
|
|
nsCOMPtr<nsPIDOMWindow> piWin(do_QueryInterface(rootWindow));
|
|
|
|
if (!piWin) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIChromeEventHandler *chromeHandler = piWin->GetChromeEventHandler();
|
|
|
|
if (!chromeHandler) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
return CallQueryInterface(chromeHandler, aWindowRoot);
|
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Scroll(PRInt32 aXScroll, PRInt32 aYScroll)
|
1998-10-07 18:06:23 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
return ScrollTo(aXScroll, aYScroll);
|
1998-10-07 18:06:23 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ScrollTo(PRInt32 aXScroll, PRInt32 aYScroll)
|
1998-10-07 18:06:23 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
nsresult result;
|
2001-06-18 07:37:11 +00:00
|
|
|
nsIScrollableView *view = nsnull; // no addref/release for views
|
2000-08-22 03:51:17 +00:00
|
|
|
float p2t, t2p;
|
1999-04-28 20:33:43 +00:00
|
|
|
|
2004-08-08 17:39:20 +00:00
|
|
|
FlushPendingNotifications(Flush_Layout);
|
2000-08-22 03:51:17 +00:00
|
|
|
result = GetScrollInfo(&view, &p2t, &t2p);
|
|
|
|
|
|
|
|
if (view) {
|
2001-06-22 00:48:50 +00:00
|
|
|
// Here we calculate what the max pixel value is that we can
|
|
|
|
// scroll to, we do this by dividing maxint with the pixel to
|
|
|
|
// twips conversion factor, and substracting 4, the 4 comes from
|
|
|
|
// experimenting with this value, anything less makes the view
|
|
|
|
// code not scroll correctly, I have no idea why. -- jst
|
|
|
|
const PRInt32 maxpx = (PRInt32)((float)0x7fffffff / p2t) - 4;
|
|
|
|
|
|
|
|
if (aXScroll > maxpx) {
|
|
|
|
aXScroll = maxpx;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aYScroll > maxpx) {
|
|
|
|
aYScroll = maxpx;
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
result = view->ScrollTo(NSIntPixelsToTwips(aXScroll, p2t),
|
|
|
|
NSIntPixelsToTwips(aYScroll, p2t),
|
|
|
|
NS_VMREFRESH_IMMEDIATE);
|
|
|
|
}
|
2000-06-03 01:01:48 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return result;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1999-06-15 03:17:11 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ScrollBy(PRInt32 aXScrollDif, PRInt32 aYScrollDif)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
nsresult result;
|
2001-06-18 07:37:11 +00:00
|
|
|
nsIScrollableView *view = nsnull; // no addref/release for views
|
2000-08-22 03:51:17 +00:00
|
|
|
float p2t, t2p;
|
|
|
|
|
2004-08-08 17:39:20 +00:00
|
|
|
FlushPendingNotifications(Flush_Layout);
|
2000-08-22 03:51:17 +00:00
|
|
|
result = GetScrollInfo(&view, &p2t, &t2p);
|
|
|
|
|
|
|
|
if (view) {
|
|
|
|
nscoord xPos, yPos;
|
|
|
|
result = view->GetScrollPosition(xPos, yPos);
|
|
|
|
if (NS_SUCCEEDED(result)) {
|
2001-06-22 00:48:50 +00:00
|
|
|
result = ScrollTo(NSTwipsToIntPixels(xPos, t2p) + aXScrollDif,
|
|
|
|
NSTwipsToIntPixels(yPos, t2p) + aYScrollDif);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
|
|
|
}
|
1999-04-28 20:33:43 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return result;
|
1998-10-07 18:06:23 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ScrollByLines(PRInt32 numLines)
|
2000-09-13 13:06:07 +00:00
|
|
|
{
|
|
|
|
nsresult result;
|
|
|
|
nsIScrollableView *view = nsnull; // no addref/release for views
|
|
|
|
float p2t, t2p;
|
|
|
|
|
2004-08-08 17:39:20 +00:00
|
|
|
FlushPendingNotifications(Flush_Layout);
|
2000-09-13 13:06:07 +00:00
|
|
|
result = GetScrollInfo(&view, &p2t, &t2p);
|
2003-06-18 23:48:57 +00:00
|
|
|
if (view) {
|
2000-09-13 13:06:07 +00:00
|
|
|
result = view->ScrollByLines(0, numLines);
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ScrollByPages(PRInt32 numPages)
|
2000-09-13 13:06:07 +00:00
|
|
|
{
|
|
|
|
nsresult result;
|
|
|
|
nsIScrollableView *view = nsnull; // no addref/release for views
|
|
|
|
float p2t, t2p;
|
|
|
|
|
2004-08-08 17:39:20 +00:00
|
|
|
FlushPendingNotifications(Flush_Layout);
|
2000-09-13 13:06:07 +00:00
|
|
|
result = GetScrollInfo(&view, &p2t, &t2p);
|
2003-06-18 23:48:57 +00:00
|
|
|
if (view) {
|
2003-03-12 03:22:11 +00:00
|
|
|
result = view->ScrollByPages(0, numPages);
|
2000-09-13 13:06:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ClearTimeout()
|
1998-10-07 18:06:23 +00:00
|
|
|
{
|
2002-03-27 00:55:57 +00:00
|
|
|
return ClearTimeoutOrInterval();
|
1998-10-07 18:06:23 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ClearInterval()
|
1999-01-27 04:15:19 +00:00
|
|
|
{
|
2002-03-27 00:55:57 +00:00
|
|
|
return ClearTimeoutOrInterval();
|
1999-01-27 04:15:19 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetTimeout(PRBool *_retval)
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
{
|
|
|
|
return SetTimeoutOrInterval(PR_FALSE, _retval);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetInterval(PRBool *_retval)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
return SetTimeoutOrInterval(PR_TRUE, _retval);
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1998-10-01 22:21:59 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetResizable(PRBool aResizable)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
// nop
|
|
|
|
|
|
|
|
return NS_OK;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::CaptureEvents(PRInt32 aEventFlags)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIEventListenerManager> manager;
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (NS_SUCCEEDED(GetListenerManager(getter_AddRefs(manager)))) {
|
|
|
|
manager->CaptureEvent(aEventFlags);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ReleaseEvents(PRInt32 aEventFlags)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIEventListenerManager> manager;
|
2000-02-16 06:59:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (NS_SUCCEEDED(GetListenerManager(getter_AddRefs(manager)))) {
|
|
|
|
manager->ReleaseEvent(aEventFlags);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2000-02-16 06:59:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::RouteEvent(nsIDOMEvent* aEvt)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
//XXX Not the best solution -joki
|
|
|
|
return NS_OK;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::EnableExternalCapture()
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::DisableExternalCapture()
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
1998-10-01 22:21:59 +00:00
|
|
|
}
|
|
|
|
|
2002-10-08 03:30:26 +00:00
|
|
|
static
|
2002-10-25 02:31:12 +00:00
|
|
|
PRBool IsPopupBlocked(nsIDOMDocument* aDoc)
|
2002-10-08 03:30:26 +00:00
|
|
|
{
|
2004-09-04 19:28:46 +00:00
|
|
|
nsCOMPtr<nsIPopupWindowManager> pm =
|
|
|
|
do_GetService(NS_POPUPWINDOWMANAGER_CONTRACTID);
|
|
|
|
|
|
|
|
if (!pm) {
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PRBool blocked = PR_TRUE;
|
2002-10-08 03:30:26 +00:00
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(aDoc));
|
2004-09-04 19:28:46 +00:00
|
|
|
|
|
|
|
if (doc) {
|
2002-10-25 02:31:12 +00:00
|
|
|
PRUint32 permission = nsIPopupWindowManager::ALLOW_POPUP;
|
2004-01-09 23:54:21 +00:00
|
|
|
pm->TestPermission(doc->GetDocumentURI(), &permission);
|
2002-10-25 02:31:12 +00:00
|
|
|
blocked = (permission == nsIPopupWindowManager::DENY_POPUP);
|
2002-10-08 03:30:26 +00:00
|
|
|
}
|
2002-10-25 02:31:12 +00:00
|
|
|
return blocked;
|
2002-10-08 03:30:26 +00:00
|
|
|
}
|
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
static
|
2003-04-16 00:00:55 +00:00
|
|
|
void FirePopupBlockedEvent(nsIDOMDocument* aDoc,
|
2004-02-10 18:22:23 +00:00
|
|
|
nsIURI *aRequestingURI, nsIURI *aPopupURI,
|
2005-11-01 01:41:00 +00:00
|
|
|
const nsAString &aPopupWindowName,
|
2004-02-10 18:22:23 +00:00
|
|
|
const nsAString &aPopupWindowFeatures)
|
2002-10-08 03:30:26 +00:00
|
|
|
{
|
|
|
|
if (aDoc) {
|
|
|
|
// Fire a "DOMPopupBlocked" event so that the UI can hear about blocked popups.
|
|
|
|
nsCOMPtr<nsIDOMDocumentEvent> docEvent(do_QueryInterface(aDoc));
|
|
|
|
nsCOMPtr<nsIDOMEvent> event;
|
2003-04-16 00:00:55 +00:00
|
|
|
docEvent->CreateEvent(NS_LITERAL_STRING("PopupBlockedEvents"), getter_AddRefs(event));
|
2002-10-08 03:30:26 +00:00
|
|
|
if (event) {
|
2003-04-16 00:00:55 +00:00
|
|
|
nsCOMPtr<nsIDOMPopupBlockedEvent> pbev(do_QueryInterface(event));
|
|
|
|
pbev->InitPopupBlockedEvent(NS_LITERAL_STRING("DOMPopupBlocked"),
|
2005-11-01 01:41:00 +00:00
|
|
|
PR_TRUE, PR_TRUE, aRequestingURI, aPopupURI, aPopupWindowName, aPopupWindowFeatures);
|
2004-10-28 00:36:30 +00:00
|
|
|
nsCOMPtr<nsIPrivateDOMEvent> privateEvent(do_QueryInterface(event));
|
|
|
|
privateEvent->SetTrusted(PR_TRUE);
|
|
|
|
|
2002-10-08 03:30:26 +00:00
|
|
|
nsCOMPtr<nsIDOMEventTarget> targ(do_QueryInterface(aDoc));
|
2005-03-04 02:01:54 +00:00
|
|
|
PRBool defaultActionEnabled;
|
|
|
|
targ->DispatchEvent(event, &defaultActionEnabled);
|
2002-10-08 03:30:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-03-26 02:03:13 +00:00
|
|
|
void FirePopupWindowEvent(nsIDOMDocument* aDoc)
|
|
|
|
{
|
2005-10-10 18:38:57 +00:00
|
|
|
// Fire a "PopupWindow" event
|
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(aDoc));
|
|
|
|
nsContentUtils::DispatchTrustedEvent(doc, aDoc,
|
|
|
|
NS_LITERAL_STRING("PopupWindow"),
|
|
|
|
PR_TRUE, PR_TRUE);
|
2003-03-26 02:03:13 +00:00
|
|
|
}
|
|
|
|
|
2002-11-25 23:21:25 +00:00
|
|
|
// static
|
|
|
|
PRBool
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::CanSetProperty(const char *aPrefName)
|
2002-11-25 23:21:25 +00:00
|
|
|
{
|
2004-04-30 05:14:22 +00:00
|
|
|
// Chrome can set any property.
|
|
|
|
if (IsCallerChrome()) {
|
|
|
|
return PR_TRUE;
|
|
|
|
}
|
2002-11-25 23:21:25 +00:00
|
|
|
|
|
|
|
// If the pref is set to true, we can not set the property
|
|
|
|
// and vice versa.
|
2004-04-30 05:14:22 +00:00
|
|
|
return !nsContentUtils::GetBoolPref(aPrefName, PR_TRUE);
|
2002-11-25 23:21:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-08-31 04:06:39 +00:00
|
|
|
/*
|
2002-01-08 09:19:01 +00:00
|
|
|
* Examine the current document state to see if we're in a way that is
|
2004-02-03 02:22:54 +00:00
|
|
|
* typically abused by web designers. The window.open code uses this
|
|
|
|
* routine to determine whether to allow the new window.
|
2004-07-04 15:04:22 +00:00
|
|
|
* Returns a value from the CheckForAbusePoint enum.
|
2001-08-31 04:06:39 +00:00
|
|
|
*/
|
2004-09-04 19:28:46 +00:00
|
|
|
PopupControlState
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::CheckForAbusePoint()
|
2001-08-31 04:06:39 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(CheckForAbusePoint, (), openAbused);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-03-08 21:48:28 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> item(do_QueryInterface(mDocShell));
|
2002-01-08 09:19:01 +00:00
|
|
|
|
2002-03-08 21:48:28 +00:00
|
|
|
if (item) {
|
|
|
|
PRInt32 type = nsIDocShellTreeItem::typeChrome;
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2002-03-08 21:48:28 +00:00
|
|
|
item->GetItemType(&type);
|
|
|
|
if (type != nsIDocShellTreeItem::typeContent)
|
2004-02-04 03:10:17 +00:00
|
|
|
return openAllowed;
|
2002-03-08 21:48:28 +00:00
|
|
|
}
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2004-09-04 19:28:46 +00:00
|
|
|
// level of abuse we've detected, initialized to the current popup
|
2004-09-23 23:39:16 +00:00
|
|
|
// state
|
|
|
|
PopupControlState abuse = gPopupControlState;
|
2004-02-04 03:10:17 +00:00
|
|
|
|
|
|
|
// limit the number of simultaneously open popups
|
|
|
|
if (abuse == openAbused || abuse == openControlled) {
|
2004-06-26 02:06:37 +00:00
|
|
|
PRInt32 popupMax = nsContentUtils::GetIntPref("dom.popup_maximum", -1);
|
|
|
|
if (popupMax >= 0 && gOpenPopupSpamCount >= popupMax)
|
2004-02-04 03:10:17 +00:00
|
|
|
abuse = openOverridden;
|
2004-02-03 02:22:54 +00:00
|
|
|
}
|
|
|
|
|
2004-02-04 03:10:17 +00:00
|
|
|
return abuse;
|
2001-08-31 04:06:39 +00:00
|
|
|
}
|
|
|
|
|
2003-06-25 23:38:45 +00:00
|
|
|
/* Allow or deny a window open based on whether popups are suppressed.
|
2004-02-03 02:22:54 +00:00
|
|
|
A popup generally will be allowed if it's from a white-listed domain,
|
|
|
|
or if its target is an extant window.
|
2004-07-04 15:04:22 +00:00
|
|
|
Returns a value from the CheckOpenAllow enum. */
|
2004-12-07 16:09:22 +00:00
|
|
|
OpenAllowValue
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::CheckOpenAllow(PopupControlState aAbuseLevel,
|
|
|
|
const nsAString &aName)
|
2003-06-25 23:38:45 +00:00
|
|
|
{
|
2004-12-07 16:09:22 +00:00
|
|
|
OpenAllowValue allowWindow = allowNoAbuse; // (also used for openControlled)
|
2003-06-25 23:38:45 +00:00
|
|
|
|
2004-06-26 02:18:28 +00:00
|
|
|
if (aAbuseLevel >= openAbused) {
|
|
|
|
allowWindow = allowNot;
|
|
|
|
|
2003-06-25 23:38:45 +00:00
|
|
|
// However it might still not be blocked.
|
2004-06-26 02:18:28 +00:00
|
|
|
if (aAbuseLevel == openAbused && !IsPopupBlocked(mDocument))
|
|
|
|
allowWindow = allowWhitelisted;
|
|
|
|
else {
|
|
|
|
// Special case items that don't actually open new windows.
|
2005-01-11 19:36:40 +00:00
|
|
|
if (!aName.IsEmpty()) {
|
2004-06-26 02:18:28 +00:00
|
|
|
// _main is an IE target which should be case-insensitive but isn't
|
|
|
|
// see bug 217886 for details
|
2005-01-11 19:36:40 +00:00
|
|
|
if (aName.LowerCaseEqualsLiteral("_top") ||
|
|
|
|
aName.LowerCaseEqualsLiteral("_self") ||
|
|
|
|
aName.LowerCaseEqualsLiteral("_content") ||
|
|
|
|
aName.EqualsLiteral("_main"))
|
2004-06-26 02:18:28 +00:00
|
|
|
allowWindow = allowSelf;
|
|
|
|
else {
|
2005-01-11 19:36:40 +00:00
|
|
|
if (WindowExists(aName)) {
|
|
|
|
allowWindow = allowExtant;
|
2004-06-26 02:18:28 +00:00
|
|
|
}
|
2004-02-09 17:38:31 +00:00
|
|
|
}
|
2003-06-25 23:38:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return allowWindow;
|
|
|
|
}
|
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
OpenAllowValue
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetOpenAllow(const nsAString &aName)
|
2004-12-07 16:09:22 +00:00
|
|
|
{
|
|
|
|
return CheckOpenAllow(CheckForAbusePoint(), aName);
|
|
|
|
}
|
|
|
|
|
2003-06-25 23:38:45 +00:00
|
|
|
/* If a window open is blocked, fire the appropriate DOM events.
|
|
|
|
aBlocked signifies we just blocked a popup.
|
|
|
|
aWindow signifies we just opened what is probably a popup.
|
|
|
|
*/
|
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::FireAbuseEvents(PRBool aBlocked, PRBool aWindow,
|
|
|
|
const nsAString &aPopupURL,
|
2005-11-01 01:41:00 +00:00
|
|
|
const nsAString &aPopupWindowName,
|
2004-12-10 19:48:22 +00:00
|
|
|
const nsAString &aPopupWindowFeatures)
|
2003-06-25 23:38:45 +00:00
|
|
|
{
|
2004-01-02 17:43:53 +00:00
|
|
|
// fetch the URI of the window requesting the opened window
|
|
|
|
|
2003-06-25 23:38:45 +00:00
|
|
|
nsCOMPtr<nsIDOMWindow> topWindow;
|
|
|
|
GetTop(getter_AddRefs(topWindow));
|
2004-02-09 15:46:39 +00:00
|
|
|
if (!topWindow)
|
|
|
|
return;
|
|
|
|
|
2003-06-25 23:38:45 +00:00
|
|
|
nsCOMPtr<nsIDOMDocument> topDoc;
|
|
|
|
topWindow->GetDocument(getter_AddRefs(topDoc));
|
|
|
|
|
|
|
|
nsCOMPtr<nsIURI> requestingURI;
|
|
|
|
nsCOMPtr<nsIURI> popupURI;
|
|
|
|
nsCOMPtr<nsIWebNavigation> webNav(do_GetInterface(topWindow));
|
|
|
|
if (webNav)
|
|
|
|
webNav->GetCurrentURI(getter_AddRefs(requestingURI));
|
2004-01-02 17:43:53 +00:00
|
|
|
|
|
|
|
// build the URI of the would-have-been popup window
|
|
|
|
// (see nsWindowWatcher::URIfromURL)
|
|
|
|
|
|
|
|
// first, fetch the opener's base URI
|
|
|
|
|
|
|
|
nsIURI *baseURL = 0;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIJSContextStack> stack = do_GetService(sJSStackContractID);
|
|
|
|
nsCOMPtr<nsIDOMWindow> contextWindow;
|
|
|
|
if (stack) {
|
|
|
|
JSContext *cx = nsnull;
|
|
|
|
stack->Peek(&cx);
|
|
|
|
if (cx) {
|
2004-02-09 22:48:53 +00:00
|
|
|
nsIScriptContext *currentCX = nsJSUtils::GetDynamicScriptContext(cx);
|
2004-01-02 17:43:53 +00:00
|
|
|
if (currentCX) {
|
2004-02-09 22:48:53 +00:00
|
|
|
contextWindow = do_QueryInterface(currentCX->GetGlobalObject());
|
2004-01-02 17:43:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!contextWindow)
|
|
|
|
contextWindow = NS_STATIC_CAST(nsIDOMWindow*,this);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMDocument> domdoc;
|
|
|
|
contextWindow->GetDocument(getter_AddRefs(domdoc));
|
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(domdoc));
|
|
|
|
if (doc)
|
2004-01-09 23:54:21 +00:00
|
|
|
baseURL = doc->GetBaseURI();
|
2004-01-02 17:43:53 +00:00
|
|
|
|
|
|
|
// use the base URI to build what would have been the popup's URI
|
|
|
|
nsCOMPtr<nsIIOService> ios(do_GetService(NS_IOSERVICE_CONTRACTID));
|
2003-06-25 23:38:45 +00:00
|
|
|
if (ios)
|
2004-01-02 17:43:53 +00:00
|
|
|
ios->NewURI(NS_ConvertUCS2toUTF8(aPopupURL), 0, baseURL,
|
2003-06-25 23:38:45 +00:00
|
|
|
getter_AddRefs(popupURI));
|
|
|
|
|
2004-01-02 17:43:53 +00:00
|
|
|
// fire an event chock full of informative URIs
|
2003-06-25 23:38:45 +00:00
|
|
|
if (aBlocked)
|
2005-11-01 01:41:00 +00:00
|
|
|
FirePopupBlockedEvent(topDoc, requestingURI, popupURI, aPopupWindowName, aPopupWindowFeatures);
|
2003-06-25 23:38:45 +00:00
|
|
|
if (aWindow)
|
|
|
|
FirePopupWindowEvent(topDoc);
|
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Open(const nsAString& aUrl, const nsAString& aName,
|
|
|
|
const nsAString& aOptions, nsIDOMWindow **_retval)
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
{
|
2003-06-25 23:38:45 +00:00
|
|
|
nsresult rv;
|
|
|
|
|
2004-09-04 19:28:46 +00:00
|
|
|
PopupControlState abuseLevel = CheckForAbusePoint();
|
2004-12-07 16:09:22 +00:00
|
|
|
OpenAllowValue allowReason = CheckOpenAllow(abuseLevel, aName);
|
2004-06-26 02:18:28 +00:00
|
|
|
if (allowReason == allowNot) {
|
2005-11-01 01:41:00 +00:00
|
|
|
FireAbuseEvents(PR_TRUE, PR_FALSE, aUrl, aName, aOptions);
|
2003-06-25 23:38:45 +00:00
|
|
|
return NS_ERROR_FAILURE; // unlike the public Open method, return an error
|
|
|
|
}
|
|
|
|
|
|
|
|
rv = OpenInternal(aUrl, aName, aOptions, PR_FALSE, nsnull, 0, nsnull,
|
2004-06-23 01:11:06 +00:00
|
|
|
_retval);
|
2004-02-03 02:22:54 +00:00
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2004-06-26 02:18:28 +00:00
|
|
|
if (abuseLevel >= openControlled && allowReason != allowSelf) {
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow *opened = NS_STATIC_CAST(nsGlobalWindow *, *_retval);
|
2004-06-26 02:18:28 +00:00
|
|
|
if (!opened->IsPopupSpamWindow()) {
|
|
|
|
opened->SetPopupSpamWindow(PR_TRUE);
|
|
|
|
++gOpenPopupSpamCount;
|
|
|
|
}
|
2004-02-03 02:22:54 +00:00
|
|
|
}
|
|
|
|
if (abuseLevel >= openAbused)
|
2005-11-01 01:41:00 +00:00
|
|
|
FireAbuseEvents(PR_FALSE, PR_TRUE, aUrl, aName, aOptions);
|
2004-02-03 02:22:54 +00:00
|
|
|
}
|
2003-06-25 23:38:45 +00:00
|
|
|
return rv;
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Open(nsIDOMWindow **_retval)
|
1999-09-03 22:41:56 +00:00
|
|
|
{
|
2002-07-23 23:22:20 +00:00
|
|
|
*_retval = nsnull;
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsCOMPtr<nsIXPCNativeCallContext> ncc;
|
|
|
|
|
2004-09-01 16:50:12 +00:00
|
|
|
nsresult rv = nsContentUtils::XPConnect()->
|
|
|
|
GetCurrentNativeCallContext(getter_AddRefs(ncc));
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
if (!ncc)
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
|
|
|
|
JSContext *cx = nsnull;
|
|
|
|
|
|
|
|
rv = ncc->GetJSContext(&cx);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
nsAutoString url, name, options;
|
|
|
|
|
|
|
|
PRUint32 argc;
|
|
|
|
jsval *argv = nsnull;
|
|
|
|
|
|
|
|
ncc->GetArgc(&argc);
|
|
|
|
ncc->GetArgvPtr(&argv);
|
|
|
|
|
|
|
|
if (argc > 0) {
|
|
|
|
nsJSUtils::ConvertJSValToString(url, cx, argv[0]);
|
|
|
|
|
|
|
|
if (argc > 1) {
|
|
|
|
nsJSUtils::ConvertJSValToString(name, cx, argv[1]);
|
|
|
|
|
|
|
|
if (argc > 2) {
|
|
|
|
nsJSUtils::ConvertJSValToString(options, cx, argv[2]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-09-04 19:28:46 +00:00
|
|
|
PopupControlState abuseLevel = CheckForAbusePoint();
|
2004-12-07 16:09:22 +00:00
|
|
|
OpenAllowValue allowReason = CheckOpenAllow(abuseLevel, name);
|
2004-06-26 02:18:28 +00:00
|
|
|
if (allowReason == allowNot) {
|
2005-11-01 01:41:00 +00:00
|
|
|
FireAbuseEvents(PR_TRUE, PR_FALSE, url, name, options);
|
2003-06-25 23:38:45 +00:00
|
|
|
return NS_OK; // don't open the window, but also don't throw a JS exception
|
2002-07-23 23:22:20 +00:00
|
|
|
}
|
|
|
|
|
2003-01-06 22:37:54 +00:00
|
|
|
rv = OpenInternal(url, name, options, PR_FALSE, nsnull, 0, nsnull, _retval);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMChromeWindow> chrome_win(do_QueryInterface(*_retval));
|
|
|
|
|
2003-03-26 02:03:13 +00:00
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
if (!chrome_win) {
|
2003-01-06 22:37:54 +00:00
|
|
|
// A new non-chrome window was created from a call to
|
|
|
|
// window.open() from JavaScript, make sure there's a document in
|
|
|
|
// the new window. We do this by simply asking the new window for
|
|
|
|
// its document, this will synchronously create an empty document
|
|
|
|
// if there is no document in the window.
|
|
|
|
|
|
|
|
#ifdef DEBUG_jst
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsPIDOMWindow> pidomwin(do_QueryInterface(*_retval));
|
|
|
|
|
2004-05-30 03:07:10 +00:00
|
|
|
nsIDOMDocument *temp = pidomwin->GetExtantDocument();
|
2003-01-06 22:37:54 +00:00
|
|
|
|
|
|
|
NS_ASSERTION(temp, "No document in new window!!!");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2003-03-26 02:03:13 +00:00
|
|
|
nsCOMPtr<nsIDOMDocument> doc;
|
|
|
|
(*_retval)->GetDocument(getter_AddRefs(doc));
|
|
|
|
}
|
|
|
|
|
2004-06-26 02:18:28 +00:00
|
|
|
if (abuseLevel >= openControlled && allowReason != allowSelf) {
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow *opened = NS_STATIC_CAST(nsGlobalWindow*, *_retval);
|
2004-06-26 02:18:28 +00:00
|
|
|
if (!opened->IsPopupSpamWindow()) {
|
|
|
|
opened->SetPopupSpamWindow(PR_TRUE);
|
|
|
|
++gOpenPopupSpamCount;
|
|
|
|
}
|
2004-02-03 02:22:54 +00:00
|
|
|
}
|
|
|
|
if (abuseLevel >= openAbused)
|
2005-11-01 01:41:00 +00:00
|
|
|
FireAbuseEvents(PR_FALSE, PR_TRUE, url, name, options);
|
2003-01-06 22:37:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
1999-09-03 22:41:56 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
// like Open, but attaches to the new window any extra parameters past
|
2000-02-08 13:40:10 +00:00
|
|
|
// [features] as a JS property named "arguments"
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::OpenDialog(const nsAString& aUrl, const nsAString& aName,
|
|
|
|
const nsAString& aOptions,
|
|
|
|
nsISupports* aExtraArgument, nsIDOMWindow** _retval)
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
{
|
|
|
|
return OpenInternal(aUrl, aName, aOptions, PR_TRUE, nsnull, 0,
|
|
|
|
aExtraArgument, _retval);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::OpenDialog(nsIDOMWindow** _retval)
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
{
|
2002-05-17 22:24:06 +00:00
|
|
|
if (!IsCallerChrome()) {
|
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsCOMPtr<nsIXPCNativeCallContext> ncc;
|
2004-09-01 16:50:12 +00:00
|
|
|
nsresult rv = nsContentUtils::XPConnect()->
|
|
|
|
GetCurrentNativeCallContext(getter_AddRefs(ncc));
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
if (!ncc)
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
|
|
|
|
JSContext *cx = nsnull;
|
|
|
|
|
|
|
|
rv = ncc->GetJSContext(&cx);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
nsAutoString url, name, options;
|
|
|
|
|
|
|
|
PRUint32 argc;
|
|
|
|
jsval *argv = nsnull;
|
|
|
|
|
|
|
|
ncc->GetArgc(&argc);
|
|
|
|
ncc->GetArgvPtr(&argv);
|
|
|
|
|
|
|
|
if (argc > 0) {
|
|
|
|
nsJSUtils::ConvertJSValToString(url, cx, argv[0]);
|
|
|
|
|
|
|
|
if (argc > 1) {
|
|
|
|
nsJSUtils::ConvertJSValToString(name, cx, argv[1]);
|
|
|
|
|
|
|
|
if (argc > 2) {
|
|
|
|
nsJSUtils::ConvertJSValToString(options, cx, argv[2]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return OpenInternal(url, name, options, PR_TRUE, argv, argc, nsnull,
|
|
|
|
_retval);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetFrames(nsIDOMWindow** aFrames)
|
1999-12-17 06:11:45 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetFrames, (aFrames), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
*aFrames = this;
|
|
|
|
NS_ADDREF(*aFrames);
|
|
|
|
|
2004-05-27 22:08:42 +00:00
|
|
|
FlushPendingNotifications(Flush_ContentAndNotify);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
1999-12-17 06:11:45 +00:00
|
|
|
}
|
|
|
|
|
2003-04-25 22:24:37 +00:00
|
|
|
struct nsCloseEvent : public PLEvent {
|
2004-12-10 19:48:22 +00:00
|
|
|
nsCloseEvent (nsGlobalWindow *aWindow)
|
2003-04-25 22:24:37 +00:00
|
|
|
: mWindow(aWindow)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void HandleEvent() {
|
|
|
|
if (mWindow)
|
|
|
|
mWindow->ReallyCloseWindow();
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult PostCloseEvent();
|
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsRefPtr<nsGlobalWindow> mWindow;
|
2003-04-25 22:24:37 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static void PR_CALLBACK HandleCloseEvent(nsCloseEvent* aEvent)
|
|
|
|
{
|
|
|
|
aEvent->HandleEvent();
|
|
|
|
}
|
|
|
|
static void PR_CALLBACK DestroyCloseEvent(nsCloseEvent* aEvent)
|
|
|
|
{
|
|
|
|
delete aEvent;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsCloseEvent::PostCloseEvent()
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIEventQueueService> eventService(do_GetService(kEventQueueServiceCID));
|
|
|
|
if (eventService) {
|
|
|
|
nsCOMPtr<nsIEventQueue> eventQueue;
|
|
|
|
eventService->GetThreadEventQueue(PR_GetCurrentThread(), getter_AddRefs(eventQueue));
|
|
|
|
if (eventQueue) {
|
|
|
|
|
|
|
|
PL_InitEvent(this, nsnull, (PLHandleEventProc) ::HandleCloseEvent, (PLDestroyEventProc) ::DestroyCloseEvent);
|
|
|
|
return eventQueue->PostEvent(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Close()
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(Close, (), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2004-07-13 23:09:43 +00:00
|
|
|
if (IsFrame() || !mDocShell) {
|
|
|
|
// window.close() is called on a frame in a frameset, or on a
|
|
|
|
// window that's already closed. Ignore such calls.
|
2002-02-26 05:28:26 +00:00
|
|
|
|
2001-10-16 21:19:05 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2005-10-14 21:56:21 +00:00
|
|
|
if (mHavePendingClose) {
|
|
|
|
// We're going to be closed anyway; do nothing since we don't want
|
|
|
|
// to double-close
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-10-25 01:08:29 +00:00
|
|
|
// Don't allow scripts from content to close windows
|
|
|
|
// that were not opened by script
|
2005-03-06 18:43:07 +00:00
|
|
|
nsresult rv = NS_OK;
|
2003-06-20 22:44:33 +00:00
|
|
|
if (!mOpener && !mOpenerWasCleared) {
|
2005-03-06 18:43:07 +00:00
|
|
|
PRBool allowClose = PR_FALSE;
|
|
|
|
|
|
|
|
// UniversalBrowserWrite will be enabled if it's been explicitly
|
|
|
|
// enabled, or if we're called from chrome.
|
|
|
|
rv = sSecMan->IsCapabilityEnabled("UniversalBrowserWrite",
|
|
|
|
&allowClose);
|
|
|
|
|
|
|
|
if (NS_SUCCEEDED(rv) && !allowClose) {
|
|
|
|
allowClose =
|
|
|
|
nsContentUtils::GetBoolPref("dom.allow_scripts_to_close_windows",
|
|
|
|
PR_TRUE);
|
|
|
|
if (!allowClose) {
|
|
|
|
// We're blocking the close operation
|
|
|
|
// report localized error msg in JS console
|
|
|
|
nsCOMPtr<nsIStringBundleService> stringBundleService =
|
|
|
|
do_GetService(kCStringBundleServiceCID);
|
|
|
|
if (stringBundleService) {
|
|
|
|
nsCOMPtr<nsIStringBundle> stringBundle;
|
|
|
|
stringBundleService->CreateBundle(kDOMSecurityWarningsBundleURL,
|
|
|
|
getter_AddRefs(stringBundle));
|
|
|
|
if (stringBundle) {
|
|
|
|
nsXPIDLString errorMsg;
|
|
|
|
rv = stringBundle->GetStringFromName(
|
|
|
|
NS_LITERAL_STRING("WindowCloseBlockedWarning").get(),
|
|
|
|
getter_Copies(errorMsg));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
nsCOMPtr<nsIConsoleService> console =
|
|
|
|
do_GetService("@mozilla.org/consoleservice;1");
|
|
|
|
if (console)
|
|
|
|
console->LogStringMessage(errorMsg.get());
|
2002-12-04 01:55:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2005-03-06 18:43:07 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
2002-10-25 01:08:29 +00:00
|
|
|
}
|
2002-12-04 01:55:56 +00:00
|
|
|
}
|
2002-10-25 01:08:29 +00:00
|
|
|
}
|
|
|
|
|
2003-09-26 21:45:15 +00:00
|
|
|
// Ask the content viewer whether the toplevel window can close.
|
|
|
|
// If the content viewer returns false, it is responsible for calling
|
|
|
|
// Close() as soon as it is possible for the window to close.
|
|
|
|
// This allows us to not close the window while printing is happening.
|
|
|
|
|
|
|
|
nsCOMPtr<nsIContentViewer> cv;
|
|
|
|
mDocShell->GetContentViewer(getter_AddRefs(cv));
|
2004-12-07 16:09:22 +00:00
|
|
|
if (!mInClose && !mIsClosed && cv) {
|
2003-09-26 21:45:15 +00:00
|
|
|
PRBool canClose;
|
2004-02-11 06:09:51 +00:00
|
|
|
|
|
|
|
rv = cv->PermitUnload(&canClose);
|
|
|
|
if (NS_SUCCEEDED(rv) && !canClose)
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
rv = cv->RequestWindowClose(&canClose);
|
|
|
|
if (NS_SUCCEEDED(rv) && !canClose)
|
2003-09-26 21:45:15 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-06-05 00:31:45 +00:00
|
|
|
// Fire a DOM event notifying listeners that this window is about to
|
|
|
|
// be closed. The tab UI code may choose to cancel the default
|
|
|
|
// action for this event, if so, we won't actually close the window
|
|
|
|
// (since the tab UI code will close the tab in stead). Sure, this
|
|
|
|
// could be abused by content code, but do we care? I don't think
|
|
|
|
// so...
|
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
PRBool wasInClose = mInClose;
|
|
|
|
mInClose = PR_TRUE;
|
|
|
|
|
2004-11-03 17:06:21 +00:00
|
|
|
if (!DispatchCustomEvent("DOMWindowClose")) {
|
|
|
|
// Someone chose to prevent the default action for this event, if
|
|
|
|
// so, let's not close this window after all...
|
2002-06-05 00:31:45 +00:00
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
mInClose = wasInClose;
|
2004-11-03 17:06:21 +00:00
|
|
|
return NS_OK;
|
2002-06-05 00:31:45 +00:00
|
|
|
}
|
|
|
|
|
2003-05-29 00:48:35 +00:00
|
|
|
// Flag that we were closed.
|
|
|
|
mIsClosed = PR_TRUE;
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsCOMPtr<nsIJSContextStack> stack =
|
2002-03-20 11:23:13 +00:00
|
|
|
do_GetService(sJSStackContractID);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2001-08-07 05:27:42 +00:00
|
|
|
JSContext *cx = nsnull;
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
|
|
|
if (stack) {
|
|
|
|
stack->Peek(&cx);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (cx) {
|
2004-02-09 22:48:53 +00:00
|
|
|
nsIScriptContext *currentCX = nsJSUtils::GetDynamicScriptContext(cx);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
|
|
|
if (currentCX && currentCX == mContext) {
|
2005-06-09 15:42:19 +00:00
|
|
|
// We ignore the return value here. If setting the termination function
|
|
|
|
// fails, it's better to fail to close the window than it is to crash
|
|
|
|
// (which is what would tend to happen if we did this synchronously
|
|
|
|
// here).
|
2005-10-14 21:56:21 +00:00
|
|
|
rv = currentCX->SetTerminationFunction(CloseWindow,
|
|
|
|
NS_STATIC_CAST(nsIDOMWindow *,
|
|
|
|
this));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
mHavePendingClose = PR_TRUE;
|
|
|
|
}
|
2004-02-09 22:48:53 +00:00
|
|
|
return NS_OK;
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-04-25 22:24:37 +00:00
|
|
|
|
|
|
|
// We may have plugins on the page that have issued this close from their
|
|
|
|
// event loop and because we currently destroy the plugin window with
|
|
|
|
// frames, we crash. So, if we are called from Javascript, post an event
|
|
|
|
// to really close the window.
|
|
|
|
rv = NS_ERROR_FAILURE;
|
|
|
|
if (!IsCallerChrome()) {
|
|
|
|
nsCloseEvent *ev = new nsCloseEvent(this);
|
|
|
|
|
|
|
|
if (ev) {
|
|
|
|
rv = ev->PostCloseEvent();
|
|
|
|
|
|
|
|
if (NS_FAILED(rv)) {
|
2003-10-06 01:46:31 +00:00
|
|
|
PL_DestroyEvent(ev);
|
2003-04-25 22:24:37 +00:00
|
|
|
}
|
|
|
|
} else rv = NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
|
|
|
|
2004-05-03 21:48:36 +00:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
ReallyCloseWindow();
|
|
|
|
rv = NS_OK;
|
2005-10-14 21:56:21 +00:00
|
|
|
} else {
|
|
|
|
mHavePendingClose = PR_TRUE;
|
2004-05-03 21:48:36 +00:00
|
|
|
}
|
2003-04-25 22:24:37 +00:00
|
|
|
|
|
|
|
return rv;
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
}
|
|
|
|
|
2003-04-25 22:24:37 +00:00
|
|
|
|
2004-05-03 21:48:36 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ReallyCloseWindow()
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
FORWARD_TO_OUTER_VOID(ReallyCloseWindow, ());
|
|
|
|
|
2005-10-14 21:56:21 +00:00
|
|
|
// Make sure we never reenter this method.
|
|
|
|
mHavePendingClose = PR_TRUE;
|
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
|
2001-10-16 06:38:04 +00:00
|
|
|
// If there's no treeOwnerAsWin, this window must already be closed.
|
|
|
|
|
|
|
|
if (treeOwnerAsWin) {
|
2004-12-07 16:09:22 +00:00
|
|
|
|
|
|
|
// but if we're a browser window we could be in some nasty
|
|
|
|
// self-destroying cascade that we should mostly ignore
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docItem(do_QueryInterface(mDocShell));
|
|
|
|
if (docItem) {
|
|
|
|
nsCOMPtr<nsIBrowserDOMWindow> bwin;
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> rootItem;
|
|
|
|
docItem->GetRootTreeItem(getter_AddRefs(rootItem));
|
|
|
|
nsCOMPtr<nsIDOMWindow> rootWin(do_GetInterface(rootItem));
|
|
|
|
nsCOMPtr<nsIDOMChromeWindow> chromeWin(do_QueryInterface(rootWin));
|
|
|
|
if (chromeWin)
|
|
|
|
chromeWin->GetBrowserDOMWindow(getter_AddRefs(bwin));
|
|
|
|
|
|
|
|
if (rootWin) {
|
|
|
|
/* Normally we destroy the entire window, but not if
|
|
|
|
this DOM window belongs to a tabbed browser and doesn't
|
|
|
|
correspond to a tab. This allows a well-behaved tab
|
|
|
|
to destroy the container as it should but is a final measure
|
|
|
|
to prevent an errant tab from doing so when it shouldn't.
|
|
|
|
This works because we reach this code when we shouldn't only
|
|
|
|
in the particular circumstance that we belong to a tab
|
|
|
|
that has just been closed (and is therefore already missing
|
|
|
|
from the list of browsers) (and has an unload handler
|
|
|
|
that closes the window). */
|
2005-10-14 21:56:21 +00:00
|
|
|
// XXXbz now that we have mHavePendingClose, is this needed?
|
2004-12-07 16:09:22 +00:00
|
|
|
PRBool isTab = PR_FALSE;
|
|
|
|
if (rootWin == this ||
|
2005-08-12 04:11:00 +00:00
|
|
|
!bwin || (bwin->IsTabContentWindow(GetOuterWindowInternal(),
|
|
|
|
&isTab), isTab))
|
2004-12-07 16:09:22 +00:00
|
|
|
treeOwnerAsWin->Destroy();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-10-16 06:38:04 +00:00
|
|
|
CleanUp();
|
|
|
|
}
|
1999-10-06 22:07:42 +00:00
|
|
|
}
|
|
|
|
|
2002-04-17 04:17:16 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetFrameElement(nsIDOMElement** aFrameElement)
|
2002-04-17 04:17:16 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetFrameElement, (aFrameElement), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-04-17 04:17:16 +00:00
|
|
|
*aFrameElement = nsnull;
|
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellTI(do_QueryInterface(mDocShell));
|
2002-04-17 04:17:16 +00:00
|
|
|
|
|
|
|
if (!docShellTI) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> parent;
|
|
|
|
docShellTI->GetSameTypeParent(getter_AddRefs(parent));
|
|
|
|
|
|
|
|
if (!parent || parent == docShellTI) {
|
|
|
|
// We're at a chrome boundary, don't expose the chrome iframe
|
|
|
|
// element to content code.
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
*aFrameElement = mFrameElement;
|
|
|
|
NS_IF_ADDREF(*aFrameElement);
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::UpdateCommands(const nsAString& anAction)
|
1999-11-25 00:00:21 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
nsPIDOMWindow *rootWindow = nsGlobalWindow::GetPrivateRoot();
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
if (!rootWindow)
|
|
|
|
return NS_OK;
|
2000-02-11 00:57:54 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
nsCOMPtr<nsIDOMXULDocument> xulDoc =
|
|
|
|
do_QueryInterface(rootWindow->GetExtantDocument());
|
|
|
|
// See if we contain a XUL document.
|
|
|
|
if (xulDoc) {
|
|
|
|
// Retrieve the command dispatcher and call updateCommands on it.
|
|
|
|
nsCOMPtr<nsIDOMXULCommandDispatcher> xulCommandDispatcher;
|
|
|
|
xulDoc->GetCommandDispatcher(getter_AddRefs(xulCommandDispatcher));
|
|
|
|
xulCommandDispatcher->UpdateCommands(anAction);
|
2000-02-11 00:57:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2003-01-27 22:02:44 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ConvertCharset(const nsAString& aStr, char** aDest)
|
1998-10-01 22:21:59 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
nsresult result = NS_OK;
|
|
|
|
nsCOMPtr<nsIUnicodeEncoder> encoder;
|
1999-10-06 22:07:42 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsICharsetConverterManager>
|
|
|
|
ccm(do_GetService(kCharsetConverterManagerCID));
|
|
|
|
NS_ENSURE_TRUE(ccm, NS_ERROR_FAILURE);
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
// Get the document character set
|
2003-06-17 16:40:34 +00:00
|
|
|
nsCAutoString charset(NS_LITERAL_CSTRING("UTF-8")); // default to utf-8
|
2005-10-20 23:32:54 +00:00
|
|
|
if (mDoc) {
|
|
|
|
charset = mDoc->GetDocumentCharacterSet();
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Get an encoder for the character set
|
2003-06-17 16:40:34 +00:00
|
|
|
result = ccm->GetUnicodeEncoderRaw(charset.get(),
|
2003-06-11 18:16:03 +00:00
|
|
|
getter_AddRefs(encoder));
|
2000-08-22 03:51:17 +00:00
|
|
|
if (NS_FAILED(result))
|
|
|
|
return result;
|
|
|
|
|
|
|
|
result = encoder->Reset();
|
|
|
|
if (NS_FAILED(result))
|
|
|
|
return result;
|
|
|
|
|
|
|
|
PRInt32 maxByteLen, srcLen;
|
|
|
|
srcLen = aStr.Length();
|
2000-09-13 03:24:57 +00:00
|
|
|
|
2001-04-02 19:40:52 +00:00
|
|
|
const nsPromiseFlatString& flatSrc = PromiseFlatString(aStr);
|
2000-09-13 03:24:57 +00:00
|
|
|
const PRUnichar* src = flatSrc.get();
|
2000-08-22 03:51:17 +00:00
|
|
|
|
|
|
|
// Get the expected length of result string
|
|
|
|
result = encoder->GetMaxLength(src, srcLen, &maxByteLen);
|
|
|
|
if (NS_FAILED(result))
|
|
|
|
return result;
|
|
|
|
|
|
|
|
// Allocate a buffer of the maximum length
|
2003-01-27 22:02:44 +00:00
|
|
|
*aDest = (char *) nsMemory::Alloc(maxByteLen + 1);
|
2000-08-22 03:51:17 +00:00
|
|
|
PRInt32 destLen2, destLen = maxByteLen;
|
2003-01-27 22:02:44 +00:00
|
|
|
if (!*aDest)
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
2002-02-09 03:36:55 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
// Convert from unicode to the character set
|
2003-01-27 22:02:44 +00:00
|
|
|
result = encoder->Convert(src, &srcLen, *aDest, &destLen);
|
|
|
|
if (NS_FAILED(result)) {
|
|
|
|
nsMemory::Free(*aDest);
|
|
|
|
*aDest = nsnull;
|
2000-08-22 03:51:17 +00:00
|
|
|
return result;
|
|
|
|
}
|
1998-10-01 22:21:59 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
// Allow the encoder to finish the conversion
|
|
|
|
destLen2 = maxByteLen - destLen;
|
2003-01-27 22:02:44 +00:00
|
|
|
encoder->Finish(*aDest + destLen, &destLen2);
|
|
|
|
(*aDest)[destLen + destLen2] = '\0';
|
1999-10-06 22:07:42 +00:00
|
|
|
|
2003-01-27 22:02:44 +00:00
|
|
|
return result;
|
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2003-02-24 20:15:59 +00:00
|
|
|
PRBool
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetBlurSuppression()
|
2003-02-24 20:15:59 +00:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
PRBool suppress = PR_FALSE;
|
|
|
|
if (treeOwnerAsWin)
|
|
|
|
treeOwnerAsWin->GetBlurSuppression(&suppress);
|
|
|
|
return suppress;
|
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetSelection(nsISelection** aSelection)
|
2000-04-28 14:02:29 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetSelection, (aSelection), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-04-28 14:02:29 +00:00
|
|
|
NS_ENSURE_ARG_POINTER(aSelection);
|
|
|
|
*aSelection = nsnull;
|
|
|
|
|
|
|
|
if (!mDocShell)
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIPresShell> presShell;
|
|
|
|
mDocShell->GetPresShell(getter_AddRefs(presShell));
|
|
|
|
|
|
|
|
if (!presShell)
|
|
|
|
return NS_OK;
|
|
|
|
|
2004-08-29 03:08:44 +00:00
|
|
|
return presShell->FrameSelection()->
|
|
|
|
GetSelection(nsISelectionController::SELECTION_NORMAL, aSelection);
|
2000-04-28 14:02:29 +00:00
|
|
|
}
|
|
|
|
|
2001-09-30 19:56:32 +00:00
|
|
|
// Non-scriptable version of window.find(), part of nsIDOMWindowInternal
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Find(const nsAString& aStr, PRBool aCaseSensitive,
|
|
|
|
PRBool aBackwards, PRBool aWrapAround, PRBool aWholeWord,
|
|
|
|
PRBool aSearchInFrames, PRBool aShowDialog,
|
|
|
|
PRBool *aDidFind)
|
2001-09-30 19:56:32 +00:00
|
|
|
{
|
|
|
|
return FindInternal(aStr, aCaseSensitive, aBackwards, aWrapAround,
|
|
|
|
aWholeWord, aSearchInFrames, aShowDialog, aDidFind);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Scriptable version of window.find() which takes a variable number of
|
|
|
|
// arguments, part of nsIDOMJSWindow.
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Find(PRBool *aDidFind)
|
2001-09-30 19:56:32 +00:00
|
|
|
{
|
|
|
|
nsresult rv = NS_OK;
|
|
|
|
|
|
|
|
// We get the arguments passed to the function using the XPConnect native
|
|
|
|
// call context.
|
|
|
|
nsCOMPtr<nsIXPCNativeCallContext> ncc;
|
|
|
|
|
2004-09-01 16:50:12 +00:00
|
|
|
rv = nsContentUtils::XPConnect()->
|
|
|
|
GetCurrentNativeCallContext(getter_AddRefs(ncc));
|
2001-09-30 19:56:32 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
NS_ASSERTION(ncc, "No Native Call Context."
|
|
|
|
"Please don't call this method from C++.");
|
|
|
|
if (!ncc) {
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
JSContext *cx = nsnull;
|
|
|
|
|
|
|
|
rv = ncc->GetJSContext(&cx);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
PRUint32 argc;
|
|
|
|
jsval *argv = nsnull;
|
|
|
|
|
|
|
|
ncc->GetArgc(&argc);
|
|
|
|
ncc->GetArgvPtr(&argv);
|
|
|
|
|
|
|
|
// Parse the arguments passed to the function
|
|
|
|
nsAutoString searchStr;
|
|
|
|
PRBool caseSensitive = PR_FALSE;
|
|
|
|
PRBool backwards = PR_FALSE;
|
|
|
|
PRBool wrapAround = PR_FALSE;
|
|
|
|
PRBool showDialog = PR_FALSE;
|
|
|
|
PRBool wholeWord = PR_FALSE;
|
|
|
|
PRBool searchInFrames = PR_FALSE;
|
|
|
|
|
|
|
|
if (argc > 0) {
|
|
|
|
// First arg is the search pattern
|
|
|
|
nsJSUtils::ConvertJSValToString(searchStr, cx, argv[0]);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (argc > 1 && !JS_ValueToBoolean(cx, argv[1], &caseSensitive)) {
|
|
|
|
// Second arg is the case sensitivity
|
|
|
|
caseSensitive = PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (argc > 2 && !JS_ValueToBoolean(cx, argv[2], &backwards)) {
|
|
|
|
// Third arg specifies whether to search backwards
|
|
|
|
backwards = PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (argc > 3 && !JS_ValueToBoolean(cx, argv[3], &wrapAround)) {
|
|
|
|
// Fourth arg specifies whether we should wrap the search
|
|
|
|
wrapAround = PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (argc > 4 && !JS_ValueToBoolean(cx, argv[4], &wholeWord)) {
|
|
|
|
// Fifth arg specifies whether we should show the Find dialog
|
|
|
|
wholeWord = PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (argc > 5 && !JS_ValueToBoolean(cx, argv[5], &searchInFrames)) {
|
|
|
|
// Sixth arg specifies whether we should search only for whole words
|
|
|
|
searchInFrames = PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (argc > 6 && !JS_ValueToBoolean(cx, argv[6], &showDialog)) {
|
|
|
|
// Seventh arg specifies whether we should search in all frames
|
|
|
|
showDialog = PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FindInternal(searchStr, caseSensitive, backwards, wrapAround,
|
|
|
|
wholeWord, searchInFrames, showDialog, aDidFind);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::FindInternal(const nsAString& aStr, PRBool caseSensitive,
|
|
|
|
PRBool backwards, PRBool wrapAround,
|
|
|
|
PRBool wholeWord, PRBool searchInFrames,
|
|
|
|
PRBool showDialog, PRBool *aDidFind)
|
2001-09-30 19:56:32 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
FORWARD_TO_OUTER(FindInternal, (aStr, caseSensitive, backwards, wrapAround,
|
|
|
|
wholeWord, searchInFrames, showDialog,
|
2005-08-12 04:11:00 +00:00
|
|
|
aDidFind), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2001-09-30 19:56:32 +00:00
|
|
|
NS_ENSURE_ARG_POINTER(aDidFind);
|
|
|
|
nsresult rv = NS_OK;
|
|
|
|
*aDidFind = PR_FALSE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIWebBrowserFind> finder(do_GetInterface(mDocShell));
|
|
|
|
|
|
|
|
// Set the options of the search
|
|
|
|
rv = finder->SetSearchString(PromiseFlatString(aStr).get());
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
finder->SetMatchCase(caseSensitive);
|
|
|
|
finder->SetFindBackwards(backwards);
|
|
|
|
finder->SetWrapFind(wrapAround);
|
|
|
|
finder->SetEntireWord(wholeWord);
|
|
|
|
finder->SetSearchFrames(searchInFrames);
|
|
|
|
|
2003-04-19 00:49:11 +00:00
|
|
|
// the nsIWebBrowserFind is initialized to use this window
|
|
|
|
// as the search root, but uses focus to set the current search
|
|
|
|
// frame. If we're being called from JS (as here), this window
|
|
|
|
// should be the current search frame.
|
|
|
|
nsCOMPtr<nsIWebBrowserFindInFrames> framesFinder(do_QueryInterface(finder));
|
|
|
|
if (framesFinder) {
|
|
|
|
framesFinder->SetRootSearchFrame(this); // paranoia
|
|
|
|
framesFinder->SetCurrentSearchFrame(this);
|
|
|
|
}
|
|
|
|
|
2001-09-30 19:56:32 +00:00
|
|
|
// The Find API does not accept empty strings. Launch the Find Dialog.
|
|
|
|
if (aStr.IsEmpty() || showDialog) {
|
|
|
|
// See if the find dialog is already up using nsIWindowMediator
|
|
|
|
nsCOMPtr<nsIWindowMediator> windowMediator =
|
|
|
|
do_GetService(kWindowMediatorCID);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMWindowInternal> findDialog;
|
|
|
|
|
|
|
|
if (windowMediator) {
|
|
|
|
windowMediator->GetMostRecentWindow(NS_LITERAL_STRING("findInPage").get(),
|
|
|
|
getter_AddRefs(findDialog));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (findDialog) {
|
|
|
|
// The Find dialog is already open, bring it to the top.
|
|
|
|
rv = findDialog->Focus();
|
|
|
|
} else { // Open a Find dialog
|
|
|
|
if (finder) {
|
|
|
|
nsCOMPtr<nsIDOMWindow> dialog;
|
|
|
|
rv = OpenDialog(NS_LITERAL_STRING("chrome://global/content/finddialog.xul"),
|
|
|
|
NS_LITERAL_STRING("_blank"),
|
|
|
|
NS_LITERAL_STRING("chrome, resizable=no, dependent=yes"),
|
|
|
|
finder, getter_AddRefs(dialog));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Launch the search with the passed in search string
|
|
|
|
rv = finder->FindNext(aDidFind);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2002-02-06 04:37:26 +00:00
|
|
|
static PRBool
|
|
|
|
Is8bit(const nsAString& aString)
|
|
|
|
{
|
|
|
|
static const PRUnichar EIGHT_BIT = PRUnichar(~0x00FF);
|
|
|
|
|
|
|
|
nsAString::const_iterator done_reading;
|
|
|
|
aString.EndReading(done_reading);
|
|
|
|
|
|
|
|
// for each chunk of |aString|...
|
|
|
|
PRUint32 fragmentLength = 0;
|
|
|
|
nsAString::const_iterator iter;
|
|
|
|
for (aString.BeginReading(iter); iter != done_reading;
|
|
|
|
iter.advance(PRInt32(fragmentLength))) {
|
|
|
|
fragmentLength = PRUint32(iter.size_forward());
|
|
|
|
const PRUnichar* c = iter.get();
|
|
|
|
const PRUnichar* fragmentEnd = c + fragmentLength;
|
|
|
|
|
|
|
|
// for each character in this chunk...
|
|
|
|
while (c < fragmentEnd)
|
|
|
|
if (*c++ & EIGHT_BIT)
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return PR_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Atob(const nsAString& aAsciiBase64String,
|
|
|
|
nsAString& aBinaryData)
|
2002-02-06 04:37:26 +00:00
|
|
|
{
|
|
|
|
aBinaryData.Truncate();
|
|
|
|
|
|
|
|
if (!Is8bit(aAsciiBase64String)) {
|
|
|
|
return NS_ERROR_DOM_INVALID_CHARACTER_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *base64 = ToNewCString(aAsciiBase64String);
|
|
|
|
if (!base64) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
|
|
|
|
|
|
|
PRInt32 dataLen = aAsciiBase64String.Length();
|
|
|
|
|
|
|
|
PRInt32 resultLen = dataLen;
|
|
|
|
if (base64[dataLen - 1] == '=') {
|
|
|
|
if (base64[dataLen - 2] == '=') {
|
|
|
|
resultLen = dataLen - 2;
|
|
|
|
} else {
|
|
|
|
resultLen = dataLen - 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
resultLen = ((resultLen * 3) / 4);
|
|
|
|
|
2005-07-28 16:22:42 +00:00
|
|
|
char *bin_data = PL_Base64Decode(base64, dataLen,
|
2002-02-06 04:37:26 +00:00
|
|
|
nsnull);
|
|
|
|
if (!bin_data) {
|
|
|
|
nsMemory::Free(base64);
|
|
|
|
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
|
|
|
|
|
|
|
CopyASCIItoUCS2(Substring(bin_data, bin_data + resultLen), aBinaryData);
|
|
|
|
|
|
|
|
nsMemory::Free(base64);
|
|
|
|
PR_Free(bin_data);
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::Btoa(const nsAString& aBinaryData,
|
|
|
|
nsAString& aAsciiBase64String)
|
2002-02-06 04:37:26 +00:00
|
|
|
{
|
|
|
|
aAsciiBase64String.Truncate();
|
|
|
|
|
|
|
|
if (!Is8bit(aBinaryData)) {
|
|
|
|
return NS_ERROR_DOM_INVALID_CHARACTER_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *bin_data = ToNewCString(aBinaryData);
|
|
|
|
if (!bin_data) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
|
|
|
|
|
|
|
PRInt32 resultLen = ((aBinaryData.Length() + 2) / 3) * 4;
|
|
|
|
|
|
|
|
char *base64 = PL_Base64Encode(bin_data, aBinaryData.Length(), nsnull);
|
|
|
|
if (!base64) {
|
|
|
|
nsMemory::Free(bin_data);
|
|
|
|
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
|
|
|
|
|
|
|
CopyASCIItoUCS2(nsDependentCString(base64, resultLen), aAsciiBase64String);
|
|
|
|
|
|
|
|
PR_Free(base64);
|
|
|
|
nsMemory::Free(bin_data);
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow::nsIDOMEventTarget
|
2000-08-22 03:51:17 +00:00
|
|
|
//*****************************************************************************
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::AddEventListener(const nsAString& aType,
|
|
|
|
nsIDOMEventListener* aListener,
|
|
|
|
PRBool aUseCapture)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-10-04 01:08:18 +00:00
|
|
|
FORWARD_TO_INNER_CREATE(AddEventListener, (aType, aListener, aUseCapture));
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2005-06-02 23:36:08 +00:00
|
|
|
return AddEventListener(aType, aListener, aUseCapture,
|
2005-10-20 23:32:54 +00:00
|
|
|
!nsContentUtils::IsChromeDoc(mDoc));
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1999-09-17 20:13:52 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::RemoveEventListener(const nsAString& aType,
|
|
|
|
nsIDOMEventListener* aListener,
|
|
|
|
PRBool aUseCapture)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2002-11-09 00:25:25 +00:00
|
|
|
return RemoveGroupedEventListener(aType, aListener, aUseCapture, nsnull);
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::DispatchEvent(nsIDOMEvent* aEvent, PRBool* _retval)
|
2000-05-16 11:35:12 +00:00
|
|
|
{
|
2005-10-04 01:08:18 +00:00
|
|
|
FORWARD_TO_INNER(DispatchEvent, (aEvent, _retval), NS_OK);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2005-10-20 23:32:54 +00:00
|
|
|
if (!mDoc) {
|
2004-10-28 00:26:27 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2003-09-27 04:18:26 +00:00
|
|
|
|
2004-10-28 00:26:27 +00:00
|
|
|
// Obtain a presentation shell
|
2005-10-20 23:32:54 +00:00
|
|
|
nsIPresShell *shell = mDoc->GetShellAt(0);
|
2004-10-28 00:26:27 +00:00
|
|
|
if (!shell) {
|
|
|
|
return NS_OK;
|
2000-05-16 11:35:12 +00:00
|
|
|
}
|
2003-09-27 04:18:26 +00:00
|
|
|
|
2004-10-28 00:26:27 +00:00
|
|
|
// Retrieve the context
|
2005-03-04 02:01:54 +00:00
|
|
|
nsCOMPtr<nsPresContext> presContext = shell->GetPresContext();
|
|
|
|
return presContext->EventStateManager()->
|
2005-08-02 01:23:40 +00:00
|
|
|
DispatchNewEvent(GetOuterWindow(), aEvent, _retval);
|
2000-05-16 11:35:12 +00:00
|
|
|
}
|
|
|
|
|
2002-11-09 00:25:25 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow::nsIDOM3EventTarget
|
2002-11-09 00:25:25 +00:00
|
|
|
//*****************************************************************************
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::AddGroupedEventListener(const nsAString & aType,
|
|
|
|
nsIDOMEventListener *aListener,
|
|
|
|
PRBool aUseCapture,
|
|
|
|
nsIDOMEventGroup *aEvtGrp)
|
2002-11-09 00:25:25 +00:00
|
|
|
{
|
2005-10-04 01:08:18 +00:00
|
|
|
FORWARD_TO_INNER_CREATE(AddGroupedEventListener,
|
|
|
|
(aType, aListener, aUseCapture, aEvtGrp));
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-11-09 00:25:25 +00:00
|
|
|
nsCOMPtr<nsIEventListenerManager> manager;
|
|
|
|
|
|
|
|
if (NS_SUCCEEDED(GetListenerManager(getter_AddRefs(manager)))) {
|
|
|
|
PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE;
|
|
|
|
|
|
|
|
manager->AddEventListenerByType(aListener, aType, flags, aEvtGrp);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::RemoveGroupedEventListener(const nsAString & aType,
|
|
|
|
nsIDOMEventListener *aListener,
|
|
|
|
PRBool aUseCapture,
|
|
|
|
nsIDOMEventGroup *aEvtGrp)
|
2002-11-09 00:25:25 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
FORWARD_TO_INNER(RemoveGroupedEventListener,
|
2005-08-12 04:11:00 +00:00
|
|
|
(aType, aListener, aUseCapture, aEvtGrp),
|
|
|
|
NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-11-09 00:25:25 +00:00
|
|
|
if (mListenerManager) {
|
|
|
|
PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE;
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
mListenerManager->RemoveEventListenerByType(aListener, aType, flags,
|
|
|
|
aEvtGrp);
|
2002-11-09 00:25:25 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::CanTrigger(const nsAString & type, PRBool *_retval)
|
2002-11-09 00:25:25 +00:00
|
|
|
{
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::IsRegisteredHere(const nsAString & type, PRBool *_retval)
|
2002-11-09 00:25:25 +00:00
|
|
|
{
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
2005-04-28 23:48:28 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsGlobalWindow::AddEventListener(const nsAString& aType,
|
|
|
|
nsIDOMEventListener *aListener,
|
|
|
|
PRBool aUseCapture, PRBool aWantsUntrusted)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIEventListenerManager> manager;
|
|
|
|
nsresult rv = GetListenerManager(getter_AddRefs(manager));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
PRInt32 flags = aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE;
|
|
|
|
|
|
|
|
if (aWantsUntrusted) {
|
|
|
|
flags |= NS_PRIV_EVENT_UNTRUSTED_PERMITTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
return manager->AddEventListenerByType(aListener, aType, flags, nsnull);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow::nsIDOMEventReceiver
|
2000-08-22 03:51:17 +00:00
|
|
|
//*****************************************************************************
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::AddEventListenerByIID(nsIDOMEventListener* aListener,
|
|
|
|
const nsIID& aIID)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIEventListenerManager> manager;
|
1999-06-11 21:49:41 +00:00
|
|
|
|
2003-03-12 03:22:11 +00:00
|
|
|
if (NS_SUCCEEDED (GetListenerManager(getter_AddRefs(manager)))) {
|
2000-08-22 03:51:17 +00:00
|
|
|
manager->AddEventListenerByIID(aListener, aIID, NS_EVENT_FLAG_BUBBLE);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::RemoveEventListenerByIID(nsIDOMEventListener* aListener,
|
|
|
|
const nsIID& aIID)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_INNER(RemoveEventListenerByIID, (aListener, aIID),
|
|
|
|
NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (mListenerManager) {
|
|
|
|
mListenerManager->RemoveEventListenerByIID(aListener, aIID,
|
|
|
|
NS_EVENT_FLAG_BUBBLE);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetListenerManager(nsIEventListenerManager **aResult)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-10-04 01:08:18 +00:00
|
|
|
FORWARD_TO_INNER_CREATE(GetListenerManager, (aResult));
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2001-05-17 06:04:04 +00:00
|
|
|
if (!mListenerManager) {
|
|
|
|
static NS_DEFINE_CID(kEventListenerManagerCID,
|
|
|
|
NS_EVENTLISTENERMANAGER_CID);
|
|
|
|
nsresult rv;
|
1999-07-12 23:40:01 +00:00
|
|
|
|
2001-05-17 06:04:04 +00:00
|
|
|
mListenerManager = do_CreateInstance(kEventListenerManagerCID, &rv);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2001-05-17 06:04:04 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
NS_ADDREF(*aResult = mListenerManager);
|
|
|
|
|
|
|
|
return NS_OK;
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1999-07-12 23:40:01 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::HandleEvent(nsIDOMEvent *aEvent)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-03-04 02:01:54 +00:00
|
|
|
PRBool defaultActionEnabled;
|
|
|
|
return DispatchEvent(aEvent, &defaultActionEnabled);
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetSystemEventGroup(nsIDOMEventGroup **aGroup)
|
2000-02-16 06:59:07 +00:00
|
|
|
{
|
2002-11-09 00:25:25 +00:00
|
|
|
nsCOMPtr<nsIEventListenerManager> manager;
|
|
|
|
if (NS_SUCCEEDED(GetListenerManager(getter_AddRefs(manager))) && manager) {
|
|
|
|
return manager->GetSystemEventGroupLM(aGroup);
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
2000-02-16 06:59:07 +00:00
|
|
|
}
|
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow::nsPIDOMWindow
|
2000-08-22 03:51:17 +00:00
|
|
|
//*****************************************************************************
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2004-05-03 21:48:36 +00:00
|
|
|
nsPIDOMWindow*
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetPrivateParent()
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetPrivateParent, (), nsnull);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIDOMWindow> parent;
|
|
|
|
GetParent(getter_AddRefs(parent));
|
(13163, r=alecf, scc, waterson, others; names available on request)
- Fix most of bug 13163 (see TODO for rest). This entails adding a version-string argument to nsIScriptContext::EvaluateString and passing it around lots of places in content sinks.
- Fix leaks and confusion about mSecurityManager and mNameSpaceManager in nsJSEnvironment.cpp. These still need to move from nsJSContext to nsGlobalWindow or thereabouts, jband and vidur are looking at that.
- Added comments and expanded tabs in nsJSEnvironment.cpp, esp. to EvaluateString. Also changed various nsresult vars to be named rv. Also restored brace/style conformity to nsJSProtocolHandler.cpp.
- Factored CompileFunction from AddScriptEventListener to pave the way for brutal sharing of compiled JS event handlers via JS_CloneFunctionObject.
- Lots of nsCOMPtr uses added. I'm using one for mNameSpaceManager. Hold mSecurityManager as a service explicitly, on the other hand (awaiting scc's fix to allow comptrs for services), and release in nsJSContext's dtor (fixing a leak). These two managers should be moved to the window object -- TODO item below.
- Hold JSRuntimeService along with JSRuntime for live of nsJSEnvironment, fix for shaver.
- Fix window.setTimeout etc. so the filename and line number of the timeout expr is propagated. This meant factoring nsJSUtils.cpp code.
- Fix all content sinks to use the same, and up-to-date JavaScript version parsing (whether for script type or for old language attribute); also fix SplitMimeType clones to strip whitespace.
- With waterson, fix bug in brutal-sharing version of XUL content sink: script src= should not evaluate the inline content of its tag.
1999-10-31 00:43:30 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (NS_STATIC_CAST(nsIDOMWindow *, this) == parent.get()) {
|
|
|
|
nsCOMPtr<nsIContent> chromeElement(do_QueryInterface(mChromeEventHandler));
|
|
|
|
if (!chromeElement)
|
2004-05-27 22:08:42 +00:00
|
|
|
return nsnull; // This is ok, just means a null parent.
|
1999-07-12 23:40:01 +00:00
|
|
|
|
2003-07-28 21:35:53 +00:00
|
|
|
nsIDocument* doc = chromeElement->GetDocument();
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!doc)
|
2004-05-27 22:08:42 +00:00
|
|
|
return nsnull; // This is ok, just means a null parent.
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2003-10-22 06:09:48 +00:00
|
|
|
nsIScriptGlobalObject *globalObject = doc->GetScriptGlobalObject();
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!globalObject)
|
2004-05-27 22:08:42 +00:00
|
|
|
return nsnull; // This is ok, just means a null parent.
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
parent = do_QueryInterface(globalObject);
|
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2004-05-03 21:48:36 +00:00
|
|
|
if (parent) {
|
2004-12-10 19:48:22 +00:00
|
|
|
return NS_STATIC_CAST(nsGlobalWindow *,
|
2004-05-03 21:48:36 +00:00
|
|
|
NS_STATIC_CAST(nsIDOMWindow*, parent.get()));
|
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2004-05-03 21:48:36 +00:00
|
|
|
return nsnull;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
2004-05-03 21:48:36 +00:00
|
|
|
nsPIDOMWindow*
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetPrivateRoot()
|
2000-02-11 00:57:54 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetPrivateRoot, (), nsnull);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIDOMWindow> parent;
|
|
|
|
GetTop(getter_AddRefs(parent));
|
2000-02-11 00:57:54 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIScriptGlobalObject> parentTop = do_QueryInterface(parent);
|
2000-10-30 23:47:11 +00:00
|
|
|
NS_ASSERTION(parentTop, "cannot get parentTop");
|
2004-05-03 21:48:36 +00:00
|
|
|
if (!parentTop)
|
|
|
|
return nsnull;
|
2004-02-09 22:48:53 +00:00
|
|
|
|
|
|
|
nsIDocShell *docShell = parentTop->GetDocShell();
|
2000-11-04 08:21:20 +00:00
|
|
|
|
|
|
|
// Get the chrome event handler from the doc shell, since we only
|
|
|
|
// want to deal with XUL chrome handlers and not the new kind of
|
|
|
|
// window root handler.
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIChromeEventHandler> chromeEventHandler;
|
|
|
|
docShell->GetChromeEventHandler(getter_AddRefs(chromeEventHandler));
|
2000-02-11 00:57:54 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIContent> chromeElement(do_QueryInterface(mChromeEventHandler));
|
|
|
|
if (chromeElement) {
|
2003-07-28 21:35:53 +00:00
|
|
|
nsIDocument* doc = chromeElement->GetDocument();
|
2000-08-22 03:51:17 +00:00
|
|
|
if (doc) {
|
2003-10-22 06:09:48 +00:00
|
|
|
parent = do_QueryInterface(doc->GetScriptGlobalObject());
|
2005-05-04 20:22:32 +00:00
|
|
|
if (parent) {
|
|
|
|
nsCOMPtr<nsIDOMWindow> tempParent;
|
|
|
|
parent->GetTop(getter_AddRefs(tempParent));
|
2005-07-30 20:57:07 +00:00
|
|
|
tempParent.swap(parent);
|
2005-05-04 20:22:32 +00:00
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
|
|
|
}
|
2000-02-11 00:57:54 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
return NS_STATIC_CAST(nsGlobalWindow *,
|
|
|
|
NS_STATIC_CAST(nsIDOMWindow *, parent));
|
2000-02-11 00:57:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetLocation(nsIDOMLocation ** aLocation)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2005-08-23 01:42:49 +00:00
|
|
|
FORWARD_TO_OUTER(GetLocation, (aLocation), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2003-06-21 07:15:32 +00:00
|
|
|
*aLocation = nsnull;
|
|
|
|
|
2005-08-23 01:42:49 +00:00
|
|
|
if (!mLocation && mDocShell) {
|
|
|
|
mLocation = new nsLocation(mDocShell);
|
2003-06-20 23:51:46 +00:00
|
|
|
if (!mLocation) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
2003-06-21 07:15:32 +00:00
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2003-06-21 09:36:03 +00:00
|
|
|
NS_IF_ADDREF(*aLocation = mLocation);
|
2005-08-12 04:11:00 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
2004-05-03 21:48:36 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetObjectProperty(const PRUnichar *aProperty,
|
|
|
|
nsISupports ** aObject)
|
2000-03-31 03:33:49 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_INNER(GetObjectProperty, (aProperty, aObject),
|
|
|
|
NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_ENSURE_TRUE(mJSObject, NS_ERROR_NOT_AVAILABLE);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
// Get JSContext from stack.
|
2001-06-20 01:25:09 +00:00
|
|
|
nsCOMPtr<nsIThreadJSContextStack> stack(do_GetService(sJSStackContractID));
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_TRUE(stack, NS_ERROR_FAILURE);
|
2000-03-31 03:33:49 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
JSContext *cx;
|
|
|
|
NS_ENSURE_SUCCESS(stack->Peek(&cx), NS_ERROR_FAILURE);
|
2000-03-31 03:33:49 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!cx) {
|
|
|
|
stack->GetSafeJSContext(&cx);
|
|
|
|
NS_ENSURE_TRUE(cx, NS_ERROR_FAILURE);
|
|
|
|
}
|
2000-03-31 03:33:49 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
jsval propertyVal;
|
2000-03-31 03:33:49 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
if (!::JS_LookupUCProperty(cx, mJSObject,
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_REINTERPRET_CAST(const jschar *, aProperty),
|
|
|
|
nsCRT::strlen(aProperty), &propertyVal)) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2000-03-31 03:33:49 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
if (!nsJSUtils::ConvertJSValToXPCObject(aObject, NS_GET_IID(nsISupports),
|
|
|
|
cx, propertyVal)) {
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2000-03-31 03:33:49 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
2000-03-31 03:33:49 +00:00
|
|
|
}
|
|
|
|
|
2005-09-30 23:51:04 +00:00
|
|
|
static nsresult
|
|
|
|
FireWidgetEvent(nsIDocShell *aDocShell, PRUint32 aMsg)
|
1998-08-07 04:45:03 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIPresShell> presShell;
|
2005-09-30 23:51:04 +00:00
|
|
|
aDocShell->GetPresShell(getter_AddRefs(presShell));
|
2005-08-06 20:28:42 +00:00
|
|
|
NS_ENSURE_TRUE(presShell, NS_ERROR_FAILURE);
|
2000-02-11 23:42:11 +00:00
|
|
|
|
2003-09-23 17:05:29 +00:00
|
|
|
nsIViewManager* vm = presShell->GetViewManager();
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_TRUE(vm, NS_ERROR_FAILURE);
|
2000-02-11 23:42:11 +00:00
|
|
|
|
2004-05-17 16:29:13 +00:00
|
|
|
nsIView *rootView;
|
|
|
|
vm->GetRootView(rootView);
|
|
|
|
NS_ENSURE_TRUE(rootView, NS_ERROR_FAILURE);
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2003-09-23 17:05:29 +00:00
|
|
|
// We're holding a STRONG REF to the widget to ensure it doesn't go away
|
|
|
|
// during event processing
|
|
|
|
nsCOMPtr<nsIWidget> widget = rootView->GetWidget();
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_TRUE(widget, NS_ERROR_FAILURE);
|
2000-02-11 23:42:11 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsEventStatus status;
|
2000-02-11 23:42:11 +00:00
|
|
|
|
2005-09-30 23:51:04 +00:00
|
|
|
nsGUIEvent guiEvent(PR_TRUE, aMsg, widget);
|
2000-08-22 03:51:17 +00:00
|
|
|
guiEvent.time = PR_IntervalNow();
|
2000-02-11 23:42:11 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
vm->DispatchEvent(&guiEvent, &status);
|
2000-02-11 23:42:11 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1999-05-17 18:52:21 +00:00
|
|
|
}
|
|
|
|
|
2004-05-03 21:48:36 +00:00
|
|
|
nsresult
|
2005-09-30 23:51:04 +00:00
|
|
|
nsGlobalWindow::Activate()
|
1999-05-17 18:52:21 +00:00
|
|
|
{
|
2005-09-30 23:51:04 +00:00
|
|
|
FORWARD_TO_OUTER(Activate, (), NS_ERROR_NOT_INITIALIZED);
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2005-09-30 23:51:04 +00:00
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwnerAsWin));
|
|
|
|
if (treeOwnerAsWin) {
|
|
|
|
PRBool isEnabled = PR_TRUE;
|
|
|
|
if (NS_SUCCEEDED(treeOwnerAsWin->GetEnabled(&isEnabled)) && !isEnabled) {
|
|
|
|
NS_WARNING( "Should not try to activate a disabled window" );
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2005-09-30 23:51:04 +00:00
|
|
|
treeOwnerAsWin->SetVisibility(PR_TRUE);
|
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2005-09-30 23:51:04 +00:00
|
|
|
return FireWidgetEvent(mDocShell, NS_ACTIVATE);
|
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2005-09-30 23:51:04 +00:00
|
|
|
nsresult
|
|
|
|
nsGlobalWindow::Deactivate()
|
|
|
|
{
|
|
|
|
FORWARD_TO_OUTER(Deactivate, (), NS_ERROR_NOT_INITIALIZED);
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2005-09-30 23:51:04 +00:00
|
|
|
return FireWidgetEvent(mDocShell, NS_DEACTIVATE);
|
1999-05-17 18:52:21 +00:00
|
|
|
}
|
|
|
|
|
2004-05-03 21:48:36 +00:00
|
|
|
nsIFocusController*
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetRootFocusController()
|
2000-06-23 00:42:21 +00:00
|
|
|
{
|
2004-12-10 19:48:22 +00:00
|
|
|
nsIDOMWindowInternal *rootWindow = nsGlobalWindow::GetPrivateRoot();
|
2005-09-30 23:51:04 +00:00
|
|
|
nsCOMPtr<nsIFocusController> fc;
|
|
|
|
|
2000-09-22 05:02:20 +00:00
|
|
|
if (rootWindow) {
|
2000-11-04 08:21:20 +00:00
|
|
|
// Obtain the chrome event handler.
|
|
|
|
nsCOMPtr<nsPIDOMWindow> piWin(do_QueryInterface(rootWindow));
|
2004-05-03 21:48:36 +00:00
|
|
|
nsIChromeEventHandler *chromeHandler = piWin->GetChromeEventHandler();
|
2000-11-04 08:21:20 +00:00
|
|
|
if (chromeHandler) {
|
|
|
|
nsCOMPtr<nsPIWindowRoot> windowRoot(do_QueryInterface(chromeHandler));
|
|
|
|
if (windowRoot) {
|
2004-05-03 21:48:36 +00:00
|
|
|
windowRoot->GetFocusController(getter_AddRefs(fc));
|
2000-11-04 08:21:20 +00:00
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
|
|
|
}
|
2005-09-30 23:51:04 +00:00
|
|
|
|
|
|
|
// this reference is going away, but the root (if found) holds onto
|
|
|
|
// it
|
|
|
|
return fc;
|
2000-06-23 00:42:21 +00:00
|
|
|
}
|
|
|
|
|
2000-05-03 13:03:17 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow::nsIDOMViewCSS
|
2000-08-22 03:51:17 +00:00
|
|
|
//*****************************************************************************
|
2000-05-03 13:03:17 +00:00
|
|
|
|
2000-08-23 17:27:06 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetComputedStyle(nsIDOMElement* aElt,
|
|
|
|
const nsAString& aPseudoElt,
|
|
|
|
nsIDOMCSSStyleDeclaration** aReturn)
|
2000-05-03 13:03:17 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetComputedStyle, (aElt, aPseudoElt, aReturn),
|
|
|
|
NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-05-03 13:03:17 +00:00
|
|
|
NS_ENSURE_ARG_POINTER(aReturn);
|
|
|
|
*aReturn = nsnull;
|
|
|
|
|
2002-08-31 19:57:10 +00:00
|
|
|
if (!aElt) {
|
|
|
|
NS_ERROR("Don't call getComputedStyle with a null DOMElement reference!");
|
|
|
|
return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
|
|
|
|
}
|
|
|
|
|
2002-07-08 07:11:59 +00:00
|
|
|
if (!mDocShell) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2000-05-03 13:03:17 +00:00
|
|
|
|
2000-05-17 06:38:43 +00:00
|
|
|
nsCOMPtr<nsIPresShell> presShell;
|
|
|
|
mDocShell->GetPresShell(getter_AddRefs(presShell));
|
2002-07-08 07:11:59 +00:00
|
|
|
|
|
|
|
if (!presShell) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2000-05-17 06:38:43 +00:00
|
|
|
|
|
|
|
nsresult rv = NS_OK;
|
|
|
|
nsCOMPtr<nsIComputedDOMStyle> compStyle;
|
|
|
|
|
2002-07-08 07:11:59 +00:00
|
|
|
if (!sComputedDOMStyleFactory) {
|
2004-11-01 18:50:36 +00:00
|
|
|
rv = CallGetClassObject("@mozilla.org/DOM/Level2/CSS/computedStyleDeclaration;1",
|
|
|
|
&sComputedDOMStyleFactory);
|
2002-07-08 07:11:59 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
}
|
|
|
|
|
|
|
|
rv =
|
|
|
|
sComputedDOMStyleFactory->CreateInstance(nsnull,
|
|
|
|
NS_GET_IID(nsIComputedDOMStyle),
|
|
|
|
getter_AddRefs(compStyle));
|
|
|
|
|
2000-05-17 06:38:43 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
rv = compStyle->Init(aElt, aPseudoElt, presShell);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
return compStyle->QueryInterface(NS_GET_IID(nsIDOMCSSStyleDeclaration),
|
2000-08-22 03:51:17 +00:00
|
|
|
(void **) aReturn);
|
2000-05-03 13:03:17 +00:00
|
|
|
}
|
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow::nsIDOMAbstractView
|
2000-08-22 03:51:17 +00:00
|
|
|
//*****************************************************************************
|
1998-08-07 04:45:03 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetDocument(nsIDOMDocumentView ** aDocumentView)
|
2000-04-26 13:58:56 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_ARG_POINTER(aDocumentView);
|
2000-04-26 13:58:56 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsresult rv = NS_OK;
|
2000-04-26 13:58:56 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (mDocument) {
|
2005-10-20 23:32:54 +00:00
|
|
|
rv = CallQueryInterface(mDocument, aDocumentView);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
*aDocumentView = nsnull;
|
|
|
|
}
|
2000-04-26 13:58:56 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return rv;
|
2000-04-26 13:58:56 +00:00
|
|
|
}
|
1998-09-03 01:19:58 +00:00
|
|
|
|
2001-05-17 02:15:27 +00:00
|
|
|
///*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow::nsIInterfaceRequestor
|
2002-02-09 03:36:55 +00:00
|
|
|
//*****************************************************************************
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetInterface(const nsIID & aIID, void **aSink)
|
2001-05-17 02:15:27 +00:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aSink);
|
|
|
|
*aSink = nsnull;
|
|
|
|
|
|
|
|
if (aIID.Equals(NS_GET_IID(nsIDocCharset))) {
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetInterface, (aIID, aSink), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2001-05-17 02:15:27 +00:00
|
|
|
if (mDocShell) {
|
|
|
|
nsCOMPtr<nsIDocCharset> docCharset(do_QueryInterface(mDocShell));
|
2004-06-20 16:42:13 +00:00
|
|
|
if (docCharset) {
|
|
|
|
*aSink = docCharset;
|
|
|
|
NS_ADDREF(((nsISupports *) *aSink));
|
|
|
|
}
|
2001-05-17 02:15:27 +00:00
|
|
|
}
|
|
|
|
}
|
2001-07-24 22:39:11 +00:00
|
|
|
else if (aIID.Equals(NS_GET_IID(nsIWebNavigation))) {
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetInterface, (aIID, aSink), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2001-07-24 22:39:11 +00:00
|
|
|
if (mDocShell) {
|
2002-02-01 20:12:35 +00:00
|
|
|
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(mDocShell));
|
2004-06-20 16:42:13 +00:00
|
|
|
if (webNav) {
|
|
|
|
*aSink = webNav;
|
|
|
|
NS_ADDREF(((nsISupports *) *aSink));
|
|
|
|
}
|
2001-07-24 22:39:11 +00:00
|
|
|
}
|
|
|
|
}
|
2005-09-16 02:25:37 +00:00
|
|
|
#ifdef NS_PRINTING
|
2002-02-01 14:52:11 +00:00
|
|
|
else if (aIID.Equals(NS_GET_IID(nsIWebBrowserPrint))) {
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetInterface, (aIID, aSink), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-02-01 14:52:11 +00:00
|
|
|
if (mDocShell) {
|
|
|
|
nsCOMPtr<nsIContentViewer> viewer;
|
|
|
|
mDocShell->GetContentViewer(getter_AddRefs(viewer));
|
|
|
|
if (viewer) {
|
|
|
|
nsCOMPtr<nsIWebBrowserPrint> webBrowserPrint(do_QueryInterface(viewer));
|
2004-06-20 16:42:13 +00:00
|
|
|
if (webBrowserPrint) {
|
|
|
|
*aSink = webBrowserPrint;
|
|
|
|
NS_ADDREF(((nsISupports *) *aSink));
|
|
|
|
}
|
2002-02-01 14:52:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2005-09-16 02:25:37 +00:00
|
|
|
#endif
|
2002-11-09 00:15:42 +00:00
|
|
|
else if (aIID.Equals(NS_GET_IID(nsIScriptEventManager))) {
|
2005-10-20 23:32:54 +00:00
|
|
|
if (mDoc) {
|
|
|
|
nsIScriptEventManager* mgr = mDoc->GetScriptEventManager();
|
2002-11-09 00:15:42 +00:00
|
|
|
if (mgr) {
|
|
|
|
*aSink = mgr;
|
2004-06-20 16:42:13 +00:00
|
|
|
NS_ADDREF(((nsISupports *) *aSink));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (aIID.Equals(NS_GET_IID(nsIDOMWindowUtils))) {
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetInterface, (aIID, aSink), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2004-06-20 16:42:13 +00:00
|
|
|
nsCOMPtr<nsISupports> utils(do_QueryReferent(mWindowUtils));
|
|
|
|
if (utils) {
|
|
|
|
*aSink = utils;
|
|
|
|
NS_ADDREF(((nsISupports *) *aSink));
|
|
|
|
} else {
|
|
|
|
nsDOMWindowUtils *utilObj = new nsDOMWindowUtils(this);
|
|
|
|
nsCOMPtr<nsISupports> utilsIfc =
|
|
|
|
NS_ISUPPORTS_CAST(nsIDOMWindowUtils *, utilObj);
|
|
|
|
if (utilsIfc) {
|
|
|
|
mWindowUtils = do_GetWeakReference(utilsIfc);
|
|
|
|
*aSink = utilsIfc;
|
|
|
|
NS_ADDREF(((nsISupports *) *aSink));
|
2002-11-09 00:15:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2001-05-17 02:15:27 +00:00
|
|
|
else {
|
|
|
|
return QueryInterface(aIID, aSink);
|
|
|
|
}
|
|
|
|
|
2004-12-06 20:33:04 +00:00
|
|
|
return *aSink ? NS_OK : NS_ERROR_NO_INTERFACE;
|
2001-05-17 02:15:27 +00:00
|
|
|
}
|
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow: Window Control Functions
|
2000-08-22 03:51:17 +00:00
|
|
|
//*****************************************************************************
|
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
nsIDOMWindowInternal *
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetParentInternal()
|
2001-10-31 23:52:52 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetParentInternal, (), nsnull);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
nsIDOMWindowInternal *parentInternal = nsnull;
|
2001-10-31 23:52:52 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMWindow> parent;
|
|
|
|
GetParent(getter_AddRefs(parent));
|
|
|
|
|
|
|
|
if (parent && parent != NS_STATIC_CAST(nsIDOMWindow *, this)) {
|
2004-02-09 22:48:53 +00:00
|
|
|
nsCOMPtr<nsIDOMWindowInternal> tmp(do_QueryInterface(parent));
|
|
|
|
NS_ASSERTION(parent, "Huh, parent not an nsIDOMWindowInternal?");
|
|
|
|
|
|
|
|
parentInternal = tmp;
|
2001-10-31 23:52:52 +00:00
|
|
|
}
|
2004-02-09 22:48:53 +00:00
|
|
|
|
|
|
|
return parentInternal;
|
2001-10-31 23:52:52 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::OpenInternal(const nsAString& aUrl, const nsAString& aName,
|
|
|
|
const nsAString& aOptions, PRBool aDialog,
|
|
|
|
jsval *argv, PRUint32 argc,
|
|
|
|
nsISupports *aExtraArgument,
|
|
|
|
nsIDOMWindow **aReturn)
|
2000-08-22 03:51:17 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
FORWARD_TO_OUTER(OpenInternal, (aUrl, aName, aOptions, aDialog, argv, argc,
|
2005-08-12 04:11:00 +00:00
|
|
|
aExtraArgument, aReturn),
|
|
|
|
NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2005-09-10 04:16:59 +00:00
|
|
|
nsCOMPtr<nsIWebBrowserChrome> chrome;
|
|
|
|
GetWebBrowserChrome(getter_AddRefs(chrome));
|
|
|
|
if (!chrome) {
|
|
|
|
// No chrome means we don't want to go through with this open call
|
|
|
|
// -- see nsIWindowWatcher.idl
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
}
|
|
|
|
|
2003-02-01 00:39:31 +00:00
|
|
|
nsXPIDLCString url;
|
2003-01-27 22:02:44 +00:00
|
|
|
nsresult rv = NS_OK;
|
2001-02-17 02:46:48 +00:00
|
|
|
|
|
|
|
*aReturn = nsnull;
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
if (!aUrl.IsEmpty()) {
|
|
|
|
// fix bug 35076
|
2003-01-27 22:02:44 +00:00
|
|
|
// Escape all non ASCII characters in the url.
|
|
|
|
// Earlier, this code used to call Escape() and would escape characters like
|
|
|
|
// '?', '&', and '=' in the url. This caused bug 174628.
|
|
|
|
if (IsASCII(aUrl)) {
|
2003-12-23 15:41:10 +00:00
|
|
|
AppendUTF16toUTF8(aUrl, url);
|
2003-01-27 22:02:44 +00:00
|
|
|
}
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
else {
|
2003-01-27 22:02:44 +00:00
|
|
|
nsXPIDLCString dest;
|
|
|
|
rv = ConvertCharset(aUrl, getter_Copies(dest));
|
|
|
|
if (NS_SUCCEEDED(rv))
|
|
|
|
NS_EscapeURL(dest, esc_AlwaysCopy | esc_OnlyNonASCII, url);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
else
|
2003-12-23 15:41:10 +00:00
|
|
|
AppendUTF16toUTF8(aUrl, url);
|
2003-01-06 22:37:54 +00:00
|
|
|
}
|
2001-06-20 01:25:09 +00:00
|
|
|
|
|
|
|
/* Check whether the URI is allowed, but not for dialogs --
|
|
|
|
see bug 56851. The security of this function depends on
|
|
|
|
window.openDialog being inaccessible from web scripts */
|
2003-01-06 22:37:54 +00:00
|
|
|
if (url.get() && !aDialog)
|
|
|
|
rv = SecurityCheckURL(url.get());
|
2001-02-17 02:46:48 +00:00
|
|
|
}
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
if (NS_FAILED(rv))
|
|
|
|
return rv;
|
|
|
|
|
|
|
|
// determine whether we must divert the open window to a new tab.
|
|
|
|
|
2005-10-26 12:40:05 +00:00
|
|
|
PRBool divertOpen = !WindowExists(aName);
|
2004-12-07 16:09:22 +00:00
|
|
|
|
2005-01-11 19:36:40 +00:00
|
|
|
// also check what the prefs prescribe?
|
|
|
|
// XXXbz this duplicates docshell code. Need to consolidate.
|
2004-12-07 16:09:22 +00:00
|
|
|
|
|
|
|
PRInt32 containerPref = nsIBrowserDOMWindow::OPEN_NEWWINDOW;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIURI> tabURI;
|
|
|
|
if (!aUrl.IsEmpty()) {
|
|
|
|
PRBool whoCares;
|
|
|
|
BuildURIfromBase(url.get(), getter_AddRefs(tabURI), &whoCares, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (divertOpen) { // no such named window
|
|
|
|
divertOpen = PR_FALSE; // more tests to pass:
|
|
|
|
if (!aExtraArgument) {
|
|
|
|
nsCOMPtr<nsIDOMChromeWindow> thisChrome =
|
|
|
|
do_QueryInterface(NS_STATIC_CAST(nsIDOMWindow *, this));
|
|
|
|
PRBool chromeTab = PR_FALSE;
|
|
|
|
if (tabURI)
|
|
|
|
tabURI->SchemeIs("chrome", &chromeTab);
|
|
|
|
|
2005-01-11 19:36:40 +00:00
|
|
|
if (!thisChrome && !chromeTab) {
|
2005-06-07 23:34:22 +00:00
|
|
|
containerPref =
|
|
|
|
nsContentUtils::GetIntPref("browser.link.open_newwindow",
|
|
|
|
nsIBrowserDOMWindow::OPEN_NEWWINDOW);
|
2004-12-07 16:09:22 +00:00
|
|
|
PRInt32 restrictionPref = nsContentUtils::GetIntPref(
|
|
|
|
"browser.link.open_newwindow.restriction");
|
|
|
|
/* The restriction pref is a power-user's fine-tuning pref. values:
|
|
|
|
0: no restrictions - divert everything
|
|
|
|
1: don't divert window.open at all
|
|
|
|
2: don't divert window.open with features */
|
|
|
|
|
|
|
|
if (containerPref == nsIBrowserDOMWindow::OPEN_NEWTAB ||
|
|
|
|
containerPref == nsIBrowserDOMWindow::OPEN_CURRENTWINDOW) {
|
|
|
|
divertOpen = restrictionPref != 1;
|
|
|
|
if (divertOpen && !aOptions.IsEmpty() && restrictionPref == 2)
|
|
|
|
divertOpen = PR_FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-01-06 22:37:54 +00:00
|
|
|
nsCOMPtr<nsIDOMWindow> domReturn;
|
2001-02-17 02:46:48 +00:00
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
// divert the window.open into a new tab or into this window, if required
|
|
|
|
|
|
|
|
if (divertOpen) {
|
|
|
|
if (containerPref == nsIBrowserDOMWindow::OPEN_NEWTAB ||
|
|
|
|
!aUrl.IsEmpty()) {
|
|
|
|
#ifdef DEBUG
|
|
|
|
printf("divert window.open to new tab\n");
|
|
|
|
#endif
|
|
|
|
// get nsIBrowserDOMWindow interface
|
|
|
|
|
|
|
|
nsCOMPtr<nsIBrowserDOMWindow> bwin;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docItem(do_QueryInterface(mDocShell));
|
|
|
|
if (docItem) {
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> rootItem;
|
|
|
|
docItem->GetRootTreeItem(getter_AddRefs(rootItem));
|
|
|
|
nsCOMPtr<nsIDOMWindow> rootWin(do_GetInterface(rootItem));
|
|
|
|
nsCOMPtr<nsIDOMChromeWindow> chromeWin(do_QueryInterface(rootWin));
|
|
|
|
if (chromeWin)
|
|
|
|
chromeWin->GetBrowserDOMWindow(getter_AddRefs(bwin));
|
|
|
|
}
|
|
|
|
|
|
|
|
// open new tab
|
|
|
|
|
|
|
|
if (bwin) {
|
|
|
|
// open the tab with the URL
|
|
|
|
// discard features (meaningless in this case)
|
|
|
|
bwin->OpenURI(tabURI, this,
|
|
|
|
containerPref, nsIBrowserDOMWindow::OPEN_NEW,
|
|
|
|
getter_AddRefs(domReturn));
|
|
|
|
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> domObj(do_GetInterface(domReturn));
|
|
|
|
if (domObj) {
|
|
|
|
domObj->SetOpenerWindow(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
#ifdef DEBUG
|
|
|
|
printf("divert window.open to current window\n");
|
|
|
|
#endif
|
|
|
|
GetTop(getter_AddRefs(domReturn));
|
|
|
|
}
|
|
|
|
|
2005-01-11 19:36:40 +00:00
|
|
|
if (domReturn && !aName.LowerCaseEqualsLiteral("_blank") &&
|
|
|
|
!aName.LowerCaseEqualsLiteral("_new"))
|
2004-12-07 16:09:22 +00:00
|
|
|
domReturn->SetName(aName);
|
|
|
|
}
|
|
|
|
|
|
|
|
// lacking specific instructions, or just as an error fallback,
|
|
|
|
// open a new window.
|
|
|
|
|
|
|
|
if (!domReturn) {
|
2003-01-06 22:37:54 +00:00
|
|
|
nsCOMPtr<nsIWindowWatcher> wwatch =
|
|
|
|
do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv);
|
|
|
|
|
2001-06-20 01:25:09 +00:00
|
|
|
if (wwatch) {
|
2003-01-06 22:37:54 +00:00
|
|
|
NS_ConvertUCS2toUTF8 options(aOptions);
|
|
|
|
NS_ConvertUCS2toUTF8 name(aName);
|
|
|
|
|
|
|
|
const char *options_ptr = aOptions.IsEmpty() ? nsnull : options.get();
|
|
|
|
const char *name_ptr = aName.IsEmpty() ? nsnull : name.get();
|
|
|
|
|
2004-09-30 01:08:01 +00:00
|
|
|
{
|
|
|
|
// Reset popup state while opening a window to prevent the
|
|
|
|
// current state from being active the whole time a modal
|
|
|
|
// dialog is open.
|
|
|
|
nsAutoPopupStatePusher popupStatePusher(openAbused, PR_TRUE);
|
|
|
|
|
|
|
|
if (argc) {
|
|
|
|
nsCOMPtr<nsPIWindowWatcher> pwwatch(do_QueryInterface(wwatch));
|
2005-04-21 20:22:57 +00:00
|
|
|
if (pwwatch) {
|
|
|
|
PRUint32 extraArgc = argc >= 3 ? argc - 3 : 0;
|
|
|
|
rv = pwwatch->OpenWindowJS(this, url.get(), name_ptr, options_ptr,
|
|
|
|
aDialog, extraArgc, argv + 3,
|
|
|
|
getter_AddRefs(domReturn));
|
|
|
|
} else {
|
|
|
|
NS_ERROR("WindowWatcher service not a nsPIWindowWatcher!");
|
|
|
|
|
|
|
|
rv = NS_ERROR_UNEXPECTED;
|
|
|
|
}
|
2004-09-30 01:08:01 +00:00
|
|
|
} else {
|
|
|
|
rv = wwatch->OpenWindow(this, url.get(), name_ptr, options_ptr,
|
|
|
|
aExtraArgument, getter_AddRefs(domReturn));
|
|
|
|
}
|
2001-06-20 01:25:09 +00:00
|
|
|
}
|
2004-12-07 16:09:22 +00:00
|
|
|
}
|
|
|
|
}
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
// success!
|
|
|
|
|
|
|
|
if (domReturn) {
|
|
|
|
CallQueryInterface(domReturn, aReturn);
|
|
|
|
|
|
|
|
// Save the principal of the calling script
|
|
|
|
// We need it to decide whether to clear the scope in SetNewDocument
|
|
|
|
NS_ASSERTION(sSecMan, "No Security Manager Found!");
|
|
|
|
if (sSecMan) {
|
|
|
|
nsCOMPtr<nsIPrincipal> principal;
|
|
|
|
sSecMan->GetSubjectPrincipal(getter_AddRefs(principal));
|
|
|
|
if (principal) {
|
|
|
|
nsCOMPtr<nsIURI> subjectURI;
|
|
|
|
principal->GetURI(getter_AddRefs(subjectURI));
|
|
|
|
if (subjectURI) {
|
|
|
|
nsCOMPtr<nsPIDOMWindow> domReturnPrivate(do_QueryInterface(domReturn));
|
|
|
|
domReturnPrivate->SetOpenerScriptURL(subjectURI);
|
2003-05-05 20:55:37 +00:00
|
|
|
}
|
|
|
|
}
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
}
|
2001-02-17 02:46:48 +00:00
|
|
|
}
|
2001-03-23 03:16:51 +00:00
|
|
|
|
2001-07-13 01:30:44 +00:00
|
|
|
return rv;
|
1998-08-07 04:45:03 +00:00
|
|
|
}
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
// static
|
2002-02-09 03:36:55 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::CloseWindow(nsISupports *aWindow)
|
1998-08-07 04:45:03 +00:00
|
|
|
{
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsCOMPtr<nsPIDOMWindow> win(do_QueryInterface(aWindow));
|
1998-08-07 04:45:03 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
NS_STATIC_CAST(nsGlobalWindow *,
|
2004-05-03 21:48:36 +00:00
|
|
|
NS_STATIC_CAST(nsPIDOMWindow*, win))->ReallyCloseWindow();
|
1998-08-07 04:45:03 +00:00
|
|
|
}
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
// static
|
|
|
|
void
|
|
|
|
nsGlobalWindow::ClearWindowScope(nsISupports *aWindow)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> sgo(do_QueryInterface(aWindow));
|
|
|
|
|
|
|
|
nsIScriptContext *scx = sgo->GetContext();
|
|
|
|
|
|
|
|
if (scx) {
|
|
|
|
JSContext *cx = (JSContext *)scx->GetNativeContext();
|
|
|
|
JSObject *global = sgo->GetGlobalJSObject();
|
|
|
|
|
|
|
|
if (global) {
|
|
|
|
::JS_ClearScope(cx, global);
|
|
|
|
::JS_ClearWatchPointsForObject(cx, global);
|
|
|
|
}
|
|
|
|
|
|
|
|
::JS_ClearRegExpStatics(cx);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow: Timeout Functions
|
2000-08-22 03:51:17 +00:00
|
|
|
//*****************************************************************************
|
1999-11-17 23:05:29 +00:00
|
|
|
|
2003-04-09 00:52:48 +00:00
|
|
|
static const char kSetIntervalStr[] = "setInterval";
|
|
|
|
static const char kSetTimeoutStr[] = "setTimeout";
|
1998-08-07 04:45:03 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SetTimeoutOrInterval(PRBool aIsInterval, PRInt32 *aReturn)
|
1998-08-13 23:37:54 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_INNER(SetTimeoutOrInterval, (aIsInterval, aReturn),
|
|
|
|
NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
|
|
|
nsIScriptContext *scx = GetContextInternal();
|
|
|
|
|
|
|
|
if (!scx) {
|
2002-11-28 01:04:18 +00:00
|
|
|
// This window was already closed, or never properly initialized,
|
|
|
|
// don't let a timer be scheduled on such a window.
|
|
|
|
|
|
|
|
return NS_ERROR_NOT_INITIALIZED;
|
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsCOMPtr<nsIXPCNativeCallContext> ncc;
|
2004-09-01 16:50:12 +00:00
|
|
|
nsresult rv = nsContentUtils::XPConnect()->
|
|
|
|
GetCurrentNativeCallContext(getter_AddRefs(ncc));
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
if (!ncc)
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
|
|
|
|
JSContext *cx = nsnull;
|
|
|
|
|
|
|
|
rv = ncc->GetJSContext(&cx);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
PRUint32 argc;
|
|
|
|
jsval *argv = nsnull;
|
|
|
|
|
|
|
|
ncc->GetArgc(&argc);
|
|
|
|
ncc->GetArgvPtr(&argv);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
JSString *expr = nsnull;
|
|
|
|
JSObject *funobj = nsnull;
|
2004-12-10 19:48:22 +00:00
|
|
|
nsTimeout *timeout;
|
2001-08-10 01:45:54 +00:00
|
|
|
jsdouble interval = 0.0;
|
1998-08-13 23:37:54 +00:00
|
|
|
|
2001-08-10 01:45:54 +00:00
|
|
|
if (argc < 1) {
|
2001-08-14 08:05:28 +00:00
|
|
|
::JS_ReportError(cx, "Function %s requires at least 1 parameter",
|
2000-08-22 03:51:17 +00:00
|
|
|
aIsInterval ? kSetIntervalStr : kSetTimeoutStr);
|
2001-08-16 04:05:10 +00:00
|
|
|
|
|
|
|
return ncc->SetExceptionWasThrown(PR_TRUE);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2001-08-10 01:45:54 +00:00
|
|
|
if (argc > 1 && !::JS_ValueToNumber(cx, argv[1], &interval)) {
|
2000-08-22 03:51:17 +00:00
|
|
|
::JS_ReportError(cx,
|
|
|
|
"Second argument to %s must be a millisecond interval",
|
|
|
|
aIsInterval ? kSetIntervalStr : kSetTimeoutStr);
|
2001-08-16 04:05:10 +00:00
|
|
|
|
|
|
|
return ncc->SetExceptionWasThrown(PR_TRUE);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
switch (::JS_TypeOfValue(cx, argv[0])) {
|
|
|
|
case JSTYPE_FUNCTION:
|
|
|
|
funobj = JSVAL_TO_OBJECT(argv[0]);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case JSTYPE_STRING:
|
|
|
|
case JSTYPE_OBJECT:
|
2004-06-22 09:44:17 +00:00
|
|
|
expr = ::JS_ValueToString(cx, argv[0]);
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!expr)
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
argv[0] = STRING_TO_JSVAL(expr);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
::JS_ReportError(cx, "useless %s call (missing quotes around argument?)",
|
2000-02-08 13:40:10 +00:00
|
|
|
aIsInterval ? kSetIntervalStr : kSetTimeoutStr);
|
2001-08-16 04:05:10 +00:00
|
|
|
|
|
|
|
return ncc->SetExceptionWasThrown(PR_TRUE);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2002-06-19 00:42:23 +00:00
|
|
|
if (interval < DOM_MIN_TIMEOUT_VALUE) {
|
|
|
|
// Don't allow timeouts less than DOM_MIN_TIMEOUT_VALUE from
|
|
|
|
// now...
|
|
|
|
|
|
|
|
interval = DOM_MIN_TIMEOUT_VALUE;
|
|
|
|
}
|
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
timeout = new nsTimeout();
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!timeout)
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
|
2005-08-31 19:47:48 +00:00
|
|
|
// Increment the timeout's reference count to represent this function's hold
|
|
|
|
// on the timeout.
|
2002-11-28 01:04:18 +00:00
|
|
|
timeout->AddRef();
|
2005-08-31 19:47:48 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
if (aIsInterval) {
|
2002-11-28 01:35:45 +00:00
|
|
|
timeout->mInterval = (PRInt32)interval;
|
2002-11-28 01:04:18 +00:00
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (expr) {
|
2002-11-28 01:35:45 +00:00
|
|
|
if (!::JS_AddNamedRoot(cx, &timeout->mExpr, "timeout.mExpr")) {
|
2005-07-30 20:57:07 +00:00
|
|
|
timeout->Release(scx);
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
timeout->mExpr = expr;
|
2002-11-28 01:04:18 +00:00
|
|
|
} else if (funobj) {
|
2000-08-22 03:51:17 +00:00
|
|
|
/* Leave an extra slot for a secret final argument that
|
|
|
|
indicates to the called function how "late" the timeout is. */
|
2002-11-28 01:35:45 +00:00
|
|
|
timeout->mArgv = (jsval *) PR_MALLOC((argc - 1) * sizeof(jsval));
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
if (!timeout->mArgv) {
|
2005-07-30 20:57:07 +00:00
|
|
|
timeout->Release(scx);
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
if (!::JS_AddNamedRoot(cx, &timeout->mFunObj, "timeout.mFunObj")) {
|
2005-07-30 20:57:07 +00:00
|
|
|
timeout->Release(scx);
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
timeout->mFunObj = funobj;
|
|
|
|
timeout->mArgc = 0;
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
for (PRInt32 i = 2; (PRUint32)i < argc; ++i) {
|
|
|
|
timeout->mArgv[i - 2] = argv[i];
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
if (!::JS_AddNamedRoot(cx, &timeout->mArgv[i - 2], "timeout.mArgv[i]")) {
|
2005-07-30 20:57:07 +00:00
|
|
|
timeout->Release(scx);
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
1998-10-06 20:59:39 +00:00
|
|
|
}
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
timeout->mArgc++;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *filename;
|
2002-11-28 01:35:45 +00:00
|
|
|
if (nsJSUtils::GetCallingLocation(cx, &filename, &timeout->mLineNo)) {
|
|
|
|
timeout->mFileName = PL_strdup(filename);
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
if (!timeout->mFileName) {
|
2005-07-30 20:57:07 +00:00
|
|
|
timeout->Release(scx);
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
timeout->mVersion = ::JS_VersionToString(::JS_GetVersion(cx));
|
2000-08-22 03:51:17 +00:00
|
|
|
|
|
|
|
// Get principal of currently executing code, save for execution of timeout
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
rv = sSecMan->GetSubjectPrincipal(getter_AddRefs(timeout->mPrincipal));
|
2001-08-15 05:35:02 +00:00
|
|
|
|
|
|
|
if (NS_FAILED(rv)) {
|
2005-07-30 20:57:07 +00:00
|
|
|
timeout->Release(scx);
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
2001-08-15 05:35:02 +00:00
|
|
|
}
|
1998-08-13 23:37:54 +00:00
|
|
|
|
2005-08-31 19:47:48 +00:00
|
|
|
PRIntervalTime delta = PR_MillisecondsToInterval((PRUint32)interval);
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2005-08-31 19:47:48 +00:00
|
|
|
if (!IsFrozen()) {
|
|
|
|
// If we're not currently frozen, then we set timeout->mWhen to be the
|
|
|
|
// actual firing time of the timer (i.e., now + delta). We also actually
|
|
|
|
// create a timer and fire it off.
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2005-08-31 19:47:48 +00:00
|
|
|
timeout->mWhen = PR_IntervalNow() + delta;
|
1998-08-13 23:37:54 +00:00
|
|
|
|
2005-08-31 19:47:48 +00:00
|
|
|
timeout->mTimer = do_CreateInstance("@mozilla.org/timer;1", &rv);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
timeout->Release(scx);
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2005-08-31 19:47:48 +00:00
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
rv = timeout->mTimer->InitWithFuncCallback(TimerCallback, timeout,
|
|
|
|
(PRInt32)interval,
|
|
|
|
nsITimer::TYPE_ONE_SHOT);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
timeout->Release(scx);
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
// The timeout is now also held in the timer's closure.
|
|
|
|
timeout->AddRef();
|
|
|
|
} else {
|
|
|
|
// If we are frozen, however, then we instead simply set timeout->mWhen to
|
|
|
|
// be the "time remaining" in the timeout (i.e., the interval itself). We
|
|
|
|
// don't create a timer for it, since that will happen when we are thawed
|
|
|
|
// and the timeout will then get a timer and run to completion.
|
|
|
|
|
|
|
|
timeout->mWhen = delta;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
timeout->mWindow = this;
|
|
|
|
NS_ADDREF(timeout->mWindow);
|
1998-07-24 05:05:42 +00:00
|
|
|
|
2004-09-04 19:28:46 +00:00
|
|
|
// No popups from timeouts by default
|
|
|
|
timeout->mPopupState = openAbused;
|
|
|
|
|
|
|
|
if (gRunningTimeoutDepth == 0 && gPopupControlState < openAbused) {
|
|
|
|
// This timeout is *not* set from another timeout and it's set
|
|
|
|
// while popups are enabled. Propagate the state to the timeout if
|
|
|
|
// its delay (interval) is equal to or less than what
|
2004-09-07 17:55:57 +00:00
|
|
|
// "dom.disable_open_click_delay" is set to (in ms).
|
2004-09-04 19:28:46 +00:00
|
|
|
|
|
|
|
PRInt32 delay =
|
|
|
|
nsContentUtils::GetIntPref("dom.disable_open_click_delay");
|
|
|
|
|
2004-09-07 17:55:57 +00:00
|
|
|
if (interval <= delay) {
|
2004-09-04 19:28:46 +00:00
|
|
|
timeout->mPopupState = gPopupControlState;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-15 19:22:03 +00:00
|
|
|
InsertTimeoutIntoList(mTimeoutInsertionPoint, timeout);
|
2005-08-31 19:47:48 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
timeout->mPublicId = ++mTimeoutPublicIdCounter;
|
|
|
|
*aReturn = timeout->mPublicId;
|
1998-07-24 05:05:42 +00:00
|
|
|
|
2005-08-31 19:47:48 +00:00
|
|
|
// Our hold on the timeout is expiring. Note that this should not actually
|
|
|
|
// free the timeout (since the list should have taken ownership as well).
|
|
|
|
timeout->Release(scx);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-07-24 05:05:42 +00:00
|
|
|
}
|
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
// static
|
2002-02-09 03:36:55 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::RunTimeout(nsTimeout *aTimeout)
|
2000-02-08 13:40:10 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
NS_ASSERTION(IsInnerWindow(), "Timeout running on outer window!");
|
2005-08-31 19:47:48 +00:00
|
|
|
NS_ASSERTION(!IsFrozen(), "Timeout running on a window in the bfcache!");
|
2005-07-30 20:57:07 +00:00
|
|
|
|
|
|
|
// Make sure that the script context doesn't go away as a result of
|
|
|
|
// running timeouts
|
|
|
|
nsCOMPtr<nsIScriptContext> scx = GetContextInternal();
|
|
|
|
|
|
|
|
if (!scx) {
|
2002-11-28 01:04:18 +00:00
|
|
|
// No context means this window was closed or never properly
|
|
|
|
// initialized.
|
|
|
|
|
2001-12-12 01:01:38 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
if (!scx->GetScriptsEnabled()) {
|
2001-11-27 09:18:28 +00:00
|
|
|
// Scripts were enabled once in this window (unless aTimeout ==
|
|
|
|
// nsnull) but now scripts are disabled (we might be in
|
|
|
|
// print-preview, for instance), this means we shouldn't run any
|
|
|
|
// timeouts at this point.
|
|
|
|
//
|
2004-07-22 04:34:29 +00:00
|
|
|
// If scripts are enabled in this window again we'll fire the
|
2001-11-27 09:18:28 +00:00
|
|
|
// timeouts that are due at that point.
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsTimeout *next, *prev, *timeout;
|
|
|
|
nsTimeout *last_expired_timeout, **last_insertion_point;
|
|
|
|
nsTimeout dummy_timeout;
|
2000-02-15 01:32:19 +00:00
|
|
|
JSContext *cx;
|
2000-08-22 03:51:17 +00:00
|
|
|
PRUint32 firingDepth = mTimeoutFiringDepth + 1;
|
2000-02-15 01:32:19 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
// Make sure that the window and the script context don't go away as
|
2001-10-24 06:58:11 +00:00
|
|
|
// a result of running timeouts
|
2001-08-15 05:35:02 +00:00
|
|
|
nsCOMPtr<nsIScriptGlobalObject> windowKungFuDeathGrip(this);
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
cx = (JSContext *)scx->GetNativeContext();
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
// A native timer has gone off. See which of our timeouts need
|
2001-10-24 06:58:11 +00:00
|
|
|
// servicing
|
2005-08-30 20:07:58 +00:00
|
|
|
PRIntervalTime now = PR_IntervalNow();
|
|
|
|
PRIntervalTime deadline;
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2005-08-30 20:07:58 +00:00
|
|
|
if (aTimeout && aTimeout->mWhen > now) {
|
2001-10-24 06:58:11 +00:00
|
|
|
// The OS timer fired early (yikes!), and possibly out of order
|
|
|
|
// too. Set |deadline| to be the time when the OS timer *should*
|
|
|
|
// have fired so that any timers that *should* have fired before
|
|
|
|
// aTimeout *will* be fired now. This happens most of the time on
|
|
|
|
// Win2k.
|
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
deadline = aTimeout->mWhen;
|
2001-10-24 06:58:11 +00:00
|
|
|
} else {
|
|
|
|
deadline = now;
|
|
|
|
}
|
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
// The timeout list is kept in deadline order. Discover the latest
|
|
|
|
// timeout whose deadline has expired. On some platforms, native
|
|
|
|
// timeout events fire "early", so we need to test the timer as well
|
|
|
|
// as the deadline.
|
2000-02-15 01:32:19 +00:00
|
|
|
last_expired_timeout = nsnull;
|
2002-11-28 01:35:45 +00:00
|
|
|
for (timeout = mTimeouts; timeout; timeout = timeout->mNext) {
|
2005-08-30 20:07:58 +00:00
|
|
|
if (((timeout == aTimeout) || (timeout->mWhen <= deadline)) &&
|
2002-11-28 01:35:45 +00:00
|
|
|
(timeout->mFiringDepth == 0)) {
|
2002-11-28 01:04:18 +00:00
|
|
|
// Mark any timeouts that are on the list to be fired with the
|
|
|
|
// firing depth so that we can reentrantly run timeouts
|
2002-11-28 01:35:45 +00:00
|
|
|
timeout->mFiringDepth = firingDepth;
|
2000-02-15 01:32:19 +00:00
|
|
|
last_expired_timeout = timeout;
|
|
|
|
}
|
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
// Maybe the timeout that the event was fired for has been deleted
|
|
|
|
// and there are no others timeouts with deadlines that make them
|
|
|
|
// eligible for execution yet. Go away.
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!last_expired_timeout) {
|
2001-08-15 05:35:02 +00:00
|
|
|
return;
|
2000-02-15 01:32:19 +00:00
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
// Insert a dummy timeout into the list of timeouts between the
|
|
|
|
// portion of the list that we are about to process now and those
|
|
|
|
// timeouts that will be processed in a future call to
|
|
|
|
// win_run_timeout(). This dummy timeout serves as the head of the
|
|
|
|
// list for any timeouts inserted as a result of running a timeout.
|
2002-11-28 01:35:45 +00:00
|
|
|
dummy_timeout.mFiringDepth = firingDepth;
|
|
|
|
dummy_timeout.mNext = last_expired_timeout->mNext;
|
|
|
|
last_expired_timeout->mNext = &dummy_timeout;
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
// Don't let ClearWindowTimeouts throw away our stack-allocated
|
|
|
|
// dummy timeout.
|
|
|
|
dummy_timeout.AddRef();
|
|
|
|
dummy_timeout.AddRef();
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2000-02-15 01:32:19 +00:00
|
|
|
last_insertion_point = mTimeoutInsertionPoint;
|
2002-11-28 01:35:45 +00:00
|
|
|
mTimeoutInsertionPoint = &dummy_timeout.mNext;
|
1998-08-13 04:34:53 +00:00
|
|
|
|
2000-02-15 01:32:19 +00:00
|
|
|
prev = nsnull;
|
2000-08-22 03:51:17 +00:00
|
|
|
for (timeout = mTimeouts; timeout != &dummy_timeout; timeout = next) {
|
2002-11-28 01:35:45 +00:00
|
|
|
next = timeout->mNext;
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
if (timeout->mFiringDepth != firingDepth) {
|
2002-11-28 01:04:18 +00:00
|
|
|
// We skip the timeout since it's on the list to run at another
|
|
|
|
// depth.
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
prev = timeout;
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
continue;
|
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
// The timeout is on the list to run at this depth, go ahead and
|
|
|
|
// process it.
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsTimeout *last_running_timeout = mRunningTimeout;
|
2002-11-28 01:04:18 +00:00
|
|
|
mRunningTimeout = timeout;
|
2003-08-01 03:40:24 +00:00
|
|
|
timeout->mRunning = PR_TRUE;
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2004-09-05 08:24:29 +00:00
|
|
|
// Push this timeout's popup control state, which should only be
|
2004-09-04 19:28:46 +00:00
|
|
|
// eabled the first time a timeout fires that was created while
|
|
|
|
// popups were enabled and with a delay less than
|
|
|
|
// "dom.disable_open_click_delay".
|
|
|
|
nsAutoPopupStatePusher popupStatePusher(timeout->mPopupState);
|
|
|
|
|
|
|
|
// Clear the timeout's popup state, if any, to prevent interval
|
|
|
|
// timeouts from repeatedly opening poups.
|
|
|
|
timeout->mPopupState = openAbused;
|
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
// Hold on to the timeout in case mExpr or mFunObj releases its
|
|
|
|
// doc.
|
2002-11-28 01:04:18 +00:00
|
|
|
timeout->AddRef();
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2004-09-04 19:28:46 +00:00
|
|
|
++gRunningTimeoutDepth;
|
2002-11-28 01:04:18 +00:00
|
|
|
++mTimeoutFiringDepth;
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
if (timeout->mExpr) {
|
2002-11-28 01:04:18 +00:00
|
|
|
// Evaluate the timeout expression.
|
|
|
|
const PRUnichar *script =
|
|
|
|
NS_REINTERPRET_CAST(const PRUnichar *,
|
2002-11-28 01:35:45 +00:00
|
|
|
::JS_GetStringChars(timeout->mExpr));
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
PRBool is_undefined;
|
2005-07-30 20:57:07 +00:00
|
|
|
scx->EvaluateString(nsDependentString(script), mJSObject,
|
|
|
|
timeout->mPrincipal, timeout->mFileName,
|
|
|
|
timeout->mLineNo, timeout->mVersion, nsnull,
|
|
|
|
&is_undefined);
|
2002-11-28 01:04:18 +00:00
|
|
|
} else {
|
|
|
|
// Add a "secret" final argument that indicates timeout lateness
|
|
|
|
// in milliseconds
|
2005-08-30 20:07:58 +00:00
|
|
|
PRIntervalTime lateness =
|
|
|
|
PR_IntervalToMilliseconds(now - timeout->mWhen);
|
2002-11-28 01:35:45 +00:00
|
|
|
timeout->mArgv[timeout->mArgc] = INT_TO_JSVAL((jsint) lateness);
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2004-02-11 06:09:51 +00:00
|
|
|
jsval dummy;
|
2005-07-30 20:57:07 +00:00
|
|
|
scx->CallEventHandler(mJSObject, timeout->mFunObj, timeout->mArgc + 1,
|
|
|
|
timeout->mArgv, &dummy);
|
2002-11-28 01:04:18 +00:00
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
--mTimeoutFiringDepth;
|
2004-09-04 19:28:46 +00:00
|
|
|
--gRunningTimeoutDepth;
|
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
mRunningTimeout = last_running_timeout;
|
2003-08-01 03:40:24 +00:00
|
|
|
timeout->mRunning = PR_FALSE;
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
// We ignore any failures from calling EvaluateString() or
|
|
|
|
// CallEventHandler() on the context here since we're in a loop
|
|
|
|
// where we're likely to be running timeouts whose OS timers
|
|
|
|
// didn't fire in time and we don't want to not fire those timers
|
|
|
|
// now just because execution of one timer failed. We can't
|
|
|
|
// propagate the error to anyone who cares about it from this
|
|
|
|
// point anyway so we just drop it.
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2002-12-11 00:03:34 +00:00
|
|
|
// If all timeouts were cleared and |timeout != aTimeout| then
|
|
|
|
// |timeout| may be the last reference to the timeout so check if
|
|
|
|
// it was cleared before releasing it.
|
|
|
|
PRBool timeout_was_cleared = timeout->mCleared;
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
timeout->Release(scx);
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2002-12-11 00:03:34 +00:00
|
|
|
if (timeout_was_cleared) {
|
2002-11-28 01:04:18 +00:00
|
|
|
// The running timeout's window was cleared, this means that
|
|
|
|
// ClearAllTimeouts() was called from a *nested* call, possibly
|
|
|
|
// through a timeout that fired while a modal (to this window)
|
|
|
|
// dialog was open or through other non-obvious paths.
|
|
|
|
|
|
|
|
mTimeoutInsertionPoint = last_insertion_point;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If we have a regular interval timer, we re-schedule the
|
|
|
|
// timeout, accounting for clock drift.
|
2002-11-28 01:35:45 +00:00
|
|
|
if (timeout->mInterval) {
|
2002-11-28 01:04:18 +00:00
|
|
|
// Compute time to next timeout for interval timer.
|
2005-08-30 20:07:58 +00:00
|
|
|
timeout->mWhen += PR_MillisecondsToInterval(timeout->mInterval);
|
|
|
|
PRInt32 delay = timeout->mWhen - PR_IntervalNow();
|
2002-11-28 01:04:18 +00:00
|
|
|
|
|
|
|
// If the next interval timeout is already supposed to have
|
|
|
|
// happened then run the timeout immediately.
|
2005-08-30 20:07:58 +00:00
|
|
|
if (delay < 0) {
|
|
|
|
delay = 0;
|
2002-12-12 22:37:07 +00:00
|
|
|
}
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2005-08-30 20:07:58 +00:00
|
|
|
delay = PR_IntervalToMilliseconds(delay);
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2005-08-30 20:07:58 +00:00
|
|
|
if (delay < DOM_MIN_TIMEOUT_VALUE) {
|
2002-11-28 01:04:18 +00:00
|
|
|
// Don't let intervals starve the message pump, no matter
|
|
|
|
// what. Just like we do for non-interval timeouts.
|
|
|
|
|
2005-08-30 20:07:58 +00:00
|
|
|
delay = DOM_MIN_TIMEOUT_VALUE;
|
2000-02-15 01:32:19 +00:00
|
|
|
}
|
2000-02-26 02:28:27 +00:00
|
|
|
|
2002-12-12 22:37:07 +00:00
|
|
|
// Reschedule the OS timer. Don't bother returning any error
|
|
|
|
// codes if this fails since nobody who cares about them is
|
|
|
|
// listening anyways.
|
2004-02-20 20:46:22 +00:00
|
|
|
nsresult rv =
|
2005-08-30 20:07:58 +00:00
|
|
|
timeout->mTimer->InitWithFuncCallback(TimerCallback, timeout, delay,
|
2004-02-20 20:46:22 +00:00
|
|
|
nsITimer::TYPE_ONE_SHOT);
|
2002-12-12 22:37:07 +00:00
|
|
|
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
NS_ERROR("Error initializing timer for DOM timeout!");
|
|
|
|
|
|
|
|
// We failed to initialize the new OS timer, this timer does
|
|
|
|
// us no good here so we just cancel it (just in case) and
|
|
|
|
// null out the pointer to the OS timer, this will release the
|
|
|
|
// OS timer. As we continue executing the code below we'll end
|
|
|
|
// up deleting the timeout since it's not an interval timeout
|
|
|
|
// any more (since timeout->mTimer == nsnull).
|
|
|
|
timeout->mTimer->Cancel();
|
|
|
|
timeout->mTimer = nsnull;
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2002-12-12 22:37:07 +00:00
|
|
|
// Now that the OS timer no longer has a reference to the
|
|
|
|
// timeout we need to drop that reference.
|
2005-07-30 20:57:07 +00:00
|
|
|
timeout->Release(scx);
|
2002-12-12 22:37:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
PRBool isInterval = PR_FALSE;
|
|
|
|
|
|
|
|
if (timeout->mTimer) {
|
|
|
|
if (timeout->mInterval) {
|
|
|
|
isInterval = PR_TRUE;
|
2002-11-28 01:04:18 +00:00
|
|
|
} else {
|
2002-12-12 22:37:07 +00:00
|
|
|
// The timeout still has an OS timer, and it's not an
|
|
|
|
// interval, that means that the OS timer could still fire (if
|
|
|
|
// it didn't already, i.e. aTimeout == timeout), cancel the OS
|
|
|
|
// timer and release it's reference to the timeout.
|
|
|
|
timeout->mTimer->Cancel();
|
|
|
|
timeout->mTimer = nsnull;
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
timeout->Release(scx);
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
2002-11-28 01:04:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Running a timeout can cause another timeout to be deleted, so
|
|
|
|
// we need to reset the pointer to the following timeout.
|
2002-11-28 01:35:45 +00:00
|
|
|
next = timeout->mNext;
|
2002-11-28 01:04:18 +00:00
|
|
|
|
|
|
|
if (!prev) {
|
|
|
|
mTimeouts = next;
|
2001-08-15 05:35:02 +00:00
|
|
|
} else {
|
2002-11-28 01:35:45 +00:00
|
|
|
prev->mNext = next;
|
2002-11-28 01:04:18 +00:00
|
|
|
}
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2002-12-12 22:37:07 +00:00
|
|
|
// Release the timeout struct since it's out of the list
|
2005-07-30 20:57:07 +00:00
|
|
|
timeout->Release(scx);
|
2002-11-28 01:04:18 +00:00
|
|
|
|
|
|
|
if (isInterval) {
|
|
|
|
// Reschedule an interval timeout. Insert interval timeout
|
|
|
|
// onto list sorted in deadline order.
|
|
|
|
|
|
|
|
InsertTimeoutIntoList(mTimeoutInsertionPoint, timeout);
|
2000-02-15 01:32:19 +00:00
|
|
|
}
|
|
|
|
}
|
1998-07-24 05:05:42 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
// Take the dummy timeout off the head of the list
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
if (!prev) {
|
2002-11-28 01:35:45 +00:00
|
|
|
mTimeouts = dummy_timeout.mNext;
|
2001-08-15 05:35:02 +00:00
|
|
|
} else {
|
2002-11-28 01:35:45 +00:00
|
|
|
prev->mNext = dummy_timeout.mNext;
|
2000-02-15 01:32:19 +00:00
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2000-02-15 01:32:19 +00:00
|
|
|
mTimeoutInsertionPoint = last_insertion_point;
|
1998-07-24 05:05:42 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsTimeout::Release(nsIScriptContext *aContext)
|
2000-08-22 03:51:17 +00:00
|
|
|
{
|
2002-11-28 01:04:18 +00:00
|
|
|
if (--mRefCnt > 0)
|
2000-08-22 03:51:17 +00:00
|
|
|
return;
|
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
if (mExpr || mFunObj) {
|
2004-02-09 22:48:53 +00:00
|
|
|
nsIScriptContext *scx = aContext;
|
2002-11-28 01:04:18 +00:00
|
|
|
JSRuntime *rt = nsnull;
|
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
if (!scx && mWindow) {
|
2004-02-09 22:48:53 +00:00
|
|
|
scx = mWindow->GetContext();
|
2002-11-28 01:04:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (scx) {
|
|
|
|
JSContext *cx;
|
|
|
|
cx = (JSContext *)scx->GetNativeContext();
|
|
|
|
rt = ::JS_GetRuntime(cx);
|
|
|
|
} else {
|
|
|
|
// XXX The timeout *must* be unrooted, even if !scx. This can be
|
|
|
|
// done without a JS context using the JSRuntime. This is safe
|
|
|
|
// enough, but it would be better to drop all a window's
|
|
|
|
// timeouts before its context is cleared. Bug 50705 describes a
|
|
|
|
// situation where we're not. In that case, at the time the
|
|
|
|
// context is cleared, a timeout (actually an Interval) is still
|
|
|
|
// active, but temporarily removed from the window's list of
|
|
|
|
// timers (placed instead on the timer manager's list). This
|
|
|
|
// makes the nearly handy ClearAllTimeouts routine useless, so
|
|
|
|
// we settled on using the JSRuntime rather than relying on the
|
|
|
|
// window having a context. It would be good to remedy this
|
|
|
|
// workable but clumsy situation someday.
|
|
|
|
|
|
|
|
nsCOMPtr<nsIJSRuntimeService> rtsvc =
|
|
|
|
do_GetService("@mozilla.org/js/xpc/RuntimeService;1");
|
|
|
|
|
|
|
|
if (rtsvc)
|
|
|
|
rtsvc->GetRuntime(&rt);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!rt) {
|
|
|
|
// most unexpected. not much choice but to bail.
|
2000-10-15 23:23:12 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
NS_ERROR("nsTimeout::Release() with no JSRuntime. eek!");
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
if (mExpr) {
|
|
|
|
::JS_RemoveRootRT(rt, &mExpr);
|
2002-11-28 01:04:18 +00:00
|
|
|
} else {
|
2002-11-28 01:35:45 +00:00
|
|
|
::JS_RemoveRootRT(rt, &mFunObj);
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
if (mArgv) {
|
|
|
|
for (PRInt32 i = 0; i < mArgc; ++i) {
|
|
|
|
::JS_RemoveRootRT(rt, &mArgv[i]);
|
2002-11-28 01:04:18 +00:00
|
|
|
}
|
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
PR_FREEIF(mArgv);
|
2002-11-28 01:04:18 +00:00
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
|
|
|
}
|
2000-10-15 23:23:12 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
if (mTimer) {
|
|
|
|
mTimer->Cancel();
|
|
|
|
mTimer = nsnull;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2004-01-25 14:53:21 +00:00
|
|
|
if (mFileName) {
|
|
|
|
PL_strfree(mFileName);
|
|
|
|
}
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
NS_IF_RELEASE(mWindow);
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
delete this;
|
1998-07-24 05:05:42 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsTimeout::AddRef()
|
1998-07-24 05:05:42 +00:00
|
|
|
{
|
2002-11-28 01:04:18 +00:00
|
|
|
++mRefCnt;
|
1998-07-24 05:05:42 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ClearTimeoutOrInterval()
|
1998-07-24 05:05:42 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_INNER(ClearTimeoutOrInterval, (), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-03-27 00:55:57 +00:00
|
|
|
nsresult rv = NS_OK;
|
|
|
|
nsCOMPtr<nsIXPCNativeCallContext> ncc;
|
|
|
|
|
2004-09-01 16:50:12 +00:00
|
|
|
rv = nsContentUtils::XPConnect()->
|
|
|
|
GetCurrentNativeCallContext(getter_AddRefs(ncc));
|
2002-03-27 00:55:57 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
if (!ncc)
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
|
|
|
|
JSContext *cx = nsnull;
|
|
|
|
|
|
|
|
rv = ncc->GetJSContext(&cx);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
PRUint32 argc;
|
|
|
|
|
|
|
|
ncc->GetArgc(&argc);
|
|
|
|
|
|
|
|
if (argc < 1) {
|
|
|
|
// No arguments, return early.
|
1998-07-24 05:05:42 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2002-03-27 00:55:57 +00:00
|
|
|
|
|
|
|
jsval *argv = nsnull;
|
|
|
|
|
|
|
|
ncc->GetArgvPtr(&argv);
|
|
|
|
|
|
|
|
int32 timer_id;
|
|
|
|
|
|
|
|
if (argv[0] == JSVAL_VOID || !::JS_ValueToInt32(cx, argv[0], &timer_id) ||
|
|
|
|
timer_id <= 0) {
|
|
|
|
// Undefined or non-positive number passed as argument, return
|
|
|
|
// early.
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
PRUint32 public_id = (PRUint32)timer_id;
|
2004-12-10 19:48:22 +00:00
|
|
|
nsTimeout **top, *timeout;
|
2005-07-30 20:57:07 +00:00
|
|
|
nsIScriptContext *scx = GetContextInternal();
|
2002-03-27 00:55:57 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
for (top = &mTimeouts; (timeout = *top) != NULL; top = &timeout->mNext) {
|
|
|
|
if (timeout->mPublicId == public_id) {
|
2003-08-01 03:40:24 +00:00
|
|
|
if (timeout->mRunning) {
|
2002-11-28 01:04:18 +00:00
|
|
|
/* We're running from inside the timeout. Mark this
|
2000-08-22 03:51:17 +00:00
|
|
|
timeout for deferred deletion by the code in
|
2003-08-01 03:40:24 +00:00
|
|
|
RunTimeout() */
|
2002-11-28 01:35:45 +00:00
|
|
|
timeout->mInterval = 0;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* Delete the timeout from the pending timeout list */
|
2002-11-28 01:35:45 +00:00
|
|
|
*top = timeout->mNext;
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
if (timeout->mTimer) {
|
|
|
|
timeout->mTimer->Cancel();
|
|
|
|
timeout->mTimer = nsnull;
|
2005-07-30 20:57:07 +00:00
|
|
|
timeout->Release(scx);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2005-07-30 20:57:07 +00:00
|
|
|
timeout->Release(scx);
|
2000-02-08 13:40:10 +00:00
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-07-24 05:05:42 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::ClearAllTimeouts()
|
1998-07-24 05:05:42 +00:00
|
|
|
{
|
2004-12-10 19:48:22 +00:00
|
|
|
nsTimeout *timeout, *next;
|
2005-07-30 20:57:07 +00:00
|
|
|
nsIScriptContext *scx = GetContextInternal();
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
for (timeout = mTimeouts; timeout; timeout = next) {
|
|
|
|
/* If RunTimeout() is higher up on the stack for this
|
|
|
|
window, e.g. as a result of document.write from a timeout,
|
|
|
|
then we need to reset the list insertion point for
|
|
|
|
newly-created timeouts in case the user adds a timeout,
|
|
|
|
before we pop the stack back to RunTimeout. */
|
|
|
|
if (mRunningTimeout == timeout)
|
2000-09-15 19:22:03 +00:00
|
|
|
mTimeoutInsertionPoint = &mTimeouts;
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
next = timeout->mNext;
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
if (timeout->mTimer) {
|
|
|
|
timeout->mTimer->Cancel();
|
|
|
|
timeout->mTimer = nsnull;
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
// Drop the count since the timer isn't going to hold on
|
|
|
|
// anymore.
|
2005-07-30 20:57:07 +00:00
|
|
|
timeout->Release(scx);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
// Set timeout->mCleared to true to indicate that the timeout was
|
2002-11-28 01:04:18 +00:00
|
|
|
// cleared and taken out of the list of timeouts
|
2002-11-28 01:35:45 +00:00
|
|
|
timeout->mCleared = PR_TRUE;
|
2002-11-28 01:04:18 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
// Drop the count since we're removing it from the list.
|
2005-07-30 20:57:07 +00:00
|
|
|
timeout->Release(scx);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
mTimeouts = NULL;
|
1998-07-24 05:05:42 +00:00
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::InsertTimeoutIntoList(nsTimeout **aList,
|
|
|
|
nsTimeout *aTimeout)
|
1998-07-24 05:05:42 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
NS_ASSERTION(IsInnerWindow(),
|
|
|
|
"InsertTimeoutIntoList() called on outer window!");
|
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsTimeout *to;
|
2000-08-22 03:51:17 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_ASSERTION(aList,
|
2004-12-10 19:48:22 +00:00
|
|
|
"nsGlobalWindow::InsertTimeoutIntoList null timeoutList");
|
2000-08-22 03:51:17 +00:00
|
|
|
while ((to = *aList) != nsnull) {
|
2005-08-30 20:07:58 +00:00
|
|
|
if (to->mWhen > aTimeout->mWhen)
|
2000-08-22 03:51:17 +00:00
|
|
|
break;
|
2002-11-28 01:35:45 +00:00
|
|
|
aList = &to->mNext;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2002-11-28 01:35:45 +00:00
|
|
|
aTimeout->mFiringDepth = 0;
|
|
|
|
aTimeout->mNext = to;
|
2000-08-22 03:51:17 +00:00
|
|
|
*aList = aTimeout;
|
2001-10-24 06:58:11 +00:00
|
|
|
|
2002-11-28 01:04:18 +00:00
|
|
|
// Increment the timeout's reference count since it's now held on to
|
|
|
|
// by the list
|
|
|
|
aTimeout->AddRef();
|
1998-07-24 05:05:42 +00:00
|
|
|
}
|
|
|
|
|
2001-10-24 06:58:11 +00:00
|
|
|
// static
|
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::TimerCallback(nsITimer *aTimer, void *aClosure)
|
1998-07-24 05:05:42 +00:00
|
|
|
{
|
2004-12-10 19:48:22 +00:00
|
|
|
nsTimeout *timeout = (nsTimeout *)aClosure;
|
1998-07-24 05:05:42 +00:00
|
|
|
|
2002-12-12 22:37:07 +00:00
|
|
|
// Hold on to the timeout to ensure it doesn't go away while it's
|
|
|
|
// being handled (aka kungFuDeathGrip).
|
|
|
|
timeout->AddRef();
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
timeout->mWindow->RunTimeout(timeout);
|
2001-08-15 05:35:02 +00:00
|
|
|
|
2002-12-12 22:37:07 +00:00
|
|
|
// Drop our reference to the timeout now that we're done with it.
|
2002-11-28 01:04:18 +00:00
|
|
|
timeout->Release(nsnull);
|
1998-07-24 05:05:42 +00:00
|
|
|
}
|
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow: Helper Functions
|
2000-08-22 03:51:17 +00:00
|
|
|
//*****************************************************************************
|
1999-03-28 22:19:42 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetTreeOwner(nsIDocShellTreeOwner **aTreeOwner)
|
1999-03-28 22:19:42 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetTreeOwner, (aTreeOwner), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellAsItem(do_QueryInterface(mDocShell));
|
2001-10-16 06:38:04 +00:00
|
|
|
|
|
|
|
// If there's no docShellAsItem, this window must have been closed,
|
|
|
|
// in that case there is no tree owner.
|
|
|
|
|
|
|
|
if (!docShellAsItem) {
|
|
|
|
*aTreeOwner = nsnull;
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
1999-03-28 22:19:42 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return docShellAsItem->GetTreeOwner(aTreeOwner);
|
1999-03-28 22:19:42 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetTreeOwner(nsIBaseWindow **aTreeOwner)
|
1999-03-28 22:19:42 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetTreeOwner, (aTreeOwner), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeItem> docShellAsItem(do_QueryInterface(mDocShell));
|
|
|
|
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
|
2001-10-16 06:38:04 +00:00
|
|
|
|
|
|
|
// If there's no docShellAsItem, this window must have been closed,
|
|
|
|
// in that case there is no tree owner.
|
|
|
|
|
|
|
|
if (docShellAsItem) {
|
|
|
|
docShellAsItem->GetTreeOwner(getter_AddRefs(treeOwner));
|
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!treeOwner) {
|
|
|
|
*aTreeOwner = nsnull;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return CallQueryInterface(treeOwner, aTreeOwner);
|
1998-07-24 05:05:42 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetWebBrowserChrome(nsIWebBrowserChrome **aBrowserChrome)
|
1998-07-24 05:05:42 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
|
|
|
|
GetTreeOwner(getter_AddRefs(treeOwner));
|
1998-07-24 05:05:42 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
nsCOMPtr<nsIWebBrowserChrome> browserChrome(do_GetInterface(treeOwner));
|
2003-06-21 07:15:32 +00:00
|
|
|
NS_IF_ADDREF(*aBrowserChrome = browserChrome);
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-07-24 05:05:42 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::GetScrollInfo(nsIScrollableView **aScrollableView, float *aP2T,
|
|
|
|
float *aT2P)
|
1998-07-24 05:05:42 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER(GetScrollInfo, (aScrollableView, aP2T, aT2P),
|
|
|
|
NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2001-06-18 07:37:11 +00:00
|
|
|
*aScrollableView = nsnull;
|
2002-09-04 02:22:35 +00:00
|
|
|
*aP2T = 0.0f;
|
|
|
|
*aT2P = 0.0f;
|
|
|
|
|
|
|
|
if (!mDocShell) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2001-06-18 07:37:11 +00:00
|
|
|
|
2004-07-31 23:15:21 +00:00
|
|
|
nsCOMPtr<nsPresContext> presContext;
|
2000-08-22 03:51:17 +00:00
|
|
|
mDocShell->GetPresContext(getter_AddRefs(presContext));
|
|
|
|
if (presContext) {
|
2004-02-11 04:57:07 +00:00
|
|
|
*aP2T = presContext->PixelsToTwips();
|
|
|
|
*aT2P = presContext->TwipsToPixels();
|
2000-02-08 13:40:10 +00:00
|
|
|
|
2003-09-23 17:05:29 +00:00
|
|
|
nsIViewManager* vm = presContext->GetViewManager();
|
|
|
|
if (vm)
|
|
|
|
return vm->GetRootScrollableView(aScrollableView);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
|
|
|
return NS_OK;
|
1998-07-24 05:05:42 +00:00
|
|
|
}
|
|
|
|
|
2001-06-20 01:25:09 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::BuildURIfromBase(const char *aURL, nsIURI **aBuiltURI,
|
|
|
|
PRBool *aFreeSecurityPass,
|
|
|
|
JSContext **aCXused)
|
2001-06-20 01:25:09 +00:00
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
nsIScriptContext *scx = GetContextInternal();
|
2001-08-07 05:27:42 +00:00
|
|
|
JSContext *cx = nsnull;
|
2001-06-20 01:25:09 +00:00
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
*aBuiltURI = nsnull;
|
|
|
|
*aFreeSecurityPass = PR_FALSE;
|
|
|
|
if (aCXused)
|
|
|
|
*aCXused = nsnull;
|
|
|
|
|
2001-06-20 01:25:09 +00:00
|
|
|
// get JSContext
|
2005-07-30 20:57:07 +00:00
|
|
|
NS_ASSERTION(scx, "opening window missing its context");
|
2001-06-20 01:25:09 +00:00
|
|
|
NS_ASSERTION(mDocument, "opening window missing its document");
|
2005-07-30 20:57:07 +00:00
|
|
|
if (!scx || !mDocument)
|
2001-06-20 01:25:09 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2004-06-07 21:50:25 +00:00
|
|
|
nsCOMPtr<nsIDOMChromeWindow> chrome_win =
|
|
|
|
do_QueryInterface(NS_STATIC_CAST(nsIDOMWindow *, this));
|
|
|
|
|
|
|
|
if (IsCallerChrome() && !chrome_win) {
|
|
|
|
// If open() is called from chrome on a non-chrome window, we'll
|
|
|
|
// use the context from the window on which open() is being called
|
|
|
|
// to prevent giving chrome priveleges to new windows opened in
|
|
|
|
// such a way. This also makes us get the appropriate base URI for
|
|
|
|
// the below URI resolution code.
|
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
cx = (JSContext *)scx->GetNativeContext();
|
2004-06-07 21:50:25 +00:00
|
|
|
} else {
|
|
|
|
// get the JSContext from the call stack
|
|
|
|
nsCOMPtr<nsIThreadJSContextStack> stack(do_GetService(sJSStackContractID));
|
|
|
|
if (stack)
|
|
|
|
stack->Peek(&cx);
|
|
|
|
}
|
2001-06-20 01:25:09 +00:00
|
|
|
|
|
|
|
/* resolve the URI, which could be relative to the calling window
|
|
|
|
(note the algorithm to get the base URI should match the one
|
|
|
|
used to actually kick off the load in nsWindowWatcher.cpp). */
|
2004-12-07 16:09:22 +00:00
|
|
|
nsCAutoString charset(NS_LITERAL_CSTRING("UTF-8")); // default to utf-8
|
2003-10-22 06:09:48 +00:00
|
|
|
nsIURI* baseURI = nsnull;
|
2001-06-20 01:25:09 +00:00
|
|
|
nsCOMPtr<nsIURI> uriToLoad;
|
2004-12-07 16:09:22 +00:00
|
|
|
nsCOMPtr<nsIDOMWindow> sourceWindow;
|
2001-06-20 01:25:09 +00:00
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
if (cx) {
|
|
|
|
nsIScriptContext *scriptcx = nsJSUtils::GetDynamicScriptContext(cx);
|
|
|
|
if (scriptcx)
|
|
|
|
sourceWindow = do_QueryInterface(scriptcx->GetGlobalObject());
|
|
|
|
}
|
2003-06-24 21:43:01 +00:00
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
if (!sourceWindow) {
|
|
|
|
sourceWindow = do_QueryInterface(NS_ISUPPORTS_CAST(nsIDOMWindow *, this));
|
|
|
|
*aFreeSecurityPass = PR_TRUE;
|
|
|
|
}
|
2004-02-09 22:48:53 +00:00
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
if (sourceWindow) {
|
|
|
|
nsCOMPtr<nsIDOMDocument> domDoc;
|
|
|
|
sourceWindow->GetDocument(getter_AddRefs(domDoc));
|
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(domDoc));
|
|
|
|
if (doc) {
|
|
|
|
baseURI = doc->GetBaseURI();
|
|
|
|
charset = doc->GetDocumentCharacterSet();
|
2001-06-20 01:25:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
if (aCXused)
|
|
|
|
*aCXused = cx;
|
|
|
|
return NS_NewURI(aBuiltURI, nsDependentCString(aURL), charset.get(), baseURI);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::SecurityCheckURL(const char *aURL)
|
2004-12-07 16:09:22 +00:00
|
|
|
{
|
|
|
|
JSContext *cx;
|
|
|
|
PRBool freePass;
|
|
|
|
nsCOMPtr<nsIURI> uri;
|
2001-06-20 01:25:09 +00:00
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
if (NS_FAILED(BuildURIfromBase(aURL, getter_AddRefs(uri), &freePass, &cx)))
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
if (!freePass && NS_FAILED(sSecMan->CheckLoadURIFromScript(cx, uri)))
|
2001-06-20 01:25:09 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::FlushPendingNotifications(mozFlushType aType)
|
1999-09-21 14:18:52 +00:00
|
|
|
{
|
2005-10-20 23:32:54 +00:00
|
|
|
if (mDoc) {
|
|
|
|
mDoc->FlushPendingNotifications(aType);
|
2000-08-29 00:14:23 +00:00
|
|
|
}
|
|
|
|
}
|
1999-09-21 14:18:52 +00:00
|
|
|
|
2004-08-08 17:39:20 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow::EnsureSizeUpToDate()
|
2004-08-08 17:39:20 +00:00
|
|
|
{
|
|
|
|
// If we're a subframe, make sure our size is up to date. It's OK that this
|
|
|
|
// crosses the content/chrome boundary, since chrome can have pending reflows
|
|
|
|
// too.
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow *parent =
|
|
|
|
NS_STATIC_CAST(nsGlobalWindow *, GetPrivateParent());
|
2004-08-08 17:39:20 +00:00
|
|
|
if (parent) {
|
|
|
|
parent->FlushPendingNotifications(Flush_Layout);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-05-04 20:22:32 +00:00
|
|
|
nsresult
|
|
|
|
nsGlobalWindow::SaveWindowState(nsISupports **aState)
|
|
|
|
{
|
2005-08-15 18:16:42 +00:00
|
|
|
NS_PRECONDITION(IsOuterWindow(), "Can't save the inner window's state");
|
|
|
|
|
2005-05-04 20:22:32 +00:00
|
|
|
*aState = nsnull;
|
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
if (!mContext || !mJSObject) {
|
2005-05-04 20:22:32 +00:00
|
|
|
// The window may be getting torn down; don't bother saving state.
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
nsGlobalWindow *inner = GetCurrentInnerWindowInternal();
|
|
|
|
NS_ASSERTION(inner, "No inner window to save");
|
2005-08-13 03:54:29 +00:00
|
|
|
|
2005-09-01 23:02:57 +00:00
|
|
|
// Remember the outer window's XPConnect prototype.
|
|
|
|
nsCOMPtr<nsIClassInfo> ci =
|
|
|
|
do_QueryInterface((nsIScriptGlobalObject *)this);
|
|
|
|
nsCOMPtr<nsIXPConnectJSObjectHolder> proto;
|
|
|
|
nsresult rv = nsContentUtils::XPConnect()->
|
|
|
|
GetWrappedNativePrototype((JSContext *)mContext->GetNativeContext(),
|
|
|
|
mJSObject, ci, getter_AddRefs(proto));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
nsCOMPtr<nsISupports> state = new WindowStateHolder(inner,
|
|
|
|
mInnerWindowHolder,
|
2005-08-23 01:42:49 +00:00
|
|
|
mNavigator,
|
2005-09-01 23:02:57 +00:00
|
|
|
mLocation,
|
|
|
|
proto);
|
2005-08-09 01:46:01 +00:00
|
|
|
NS_ENSURE_TRUE(state, NS_ERROR_OUT_OF_MEMORY);
|
2005-05-04 20:22:32 +00:00
|
|
|
|
|
|
|
#ifdef DEBUG_PAGE_CACHE
|
2005-08-15 23:35:14 +00:00
|
|
|
printf("saving window state, state = %p\n", (void*)state);
|
2005-05-04 20:22:32 +00:00
|
|
|
#endif
|
2005-08-15 18:16:42 +00:00
|
|
|
|
|
|
|
// Don't do anything else to this inner window!
|
|
|
|
inner->Freeze();
|
2005-05-04 20:22:32 +00:00
|
|
|
|
2005-08-09 01:46:01 +00:00
|
|
|
state.swap(*aState);
|
2005-05-04 20:22:32 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsGlobalWindow::RestoreWindowState(nsISupports *aState)
|
|
|
|
{
|
2005-08-15 18:16:42 +00:00
|
|
|
NS_ASSERTION(IsOuterWindow(), "Cannot restore an inner window");
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
if (!mContext || !mJSObject) {
|
2005-05-04 20:22:32 +00:00
|
|
|
// The window may be getting torn down; don't bother restoring state.
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<WindowStateHolder> holder = do_QueryInterface(aState);
|
|
|
|
NS_ENSURE_TRUE(holder, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
#ifdef DEBUG_PAGE_CACHE
|
2005-08-15 23:35:14 +00:00
|
|
|
printf("restoring window state, state = %p\n", (void*)holder);
|
2005-05-04 20:22:32 +00:00
|
|
|
#endif
|
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
nsGlobalWindow *inner = GetCurrentInnerWindowInternal();
|
2005-05-04 20:22:32 +00:00
|
|
|
|
|
|
|
nsIDOMElement *focusedElement = holder->GetFocusedElement();
|
|
|
|
nsIDOMWindowInternal *focusedWindow = holder->GetFocusedWindow();
|
|
|
|
|
|
|
|
// If the toplevel window isn't focused, just update the focus controller.
|
|
|
|
nsIFocusController *fc = nsGlobalWindow::GetRootFocusController();
|
|
|
|
NS_ENSURE_TRUE(fc, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
PRBool active;
|
|
|
|
fc->GetActive(&active);
|
|
|
|
if (active) {
|
|
|
|
PRBool didFocusContent = PR_FALSE;
|
|
|
|
nsCOMPtr<nsIContent> focusedContent = do_QueryInterface(focusedElement);
|
|
|
|
|
|
|
|
if (focusedContent) {
|
|
|
|
// We don't bother checking whether the element or frame is focusable.
|
|
|
|
// If it was focusable when we stored the presentation, it must be
|
|
|
|
// focusable now.
|
|
|
|
nsIDocument *doc = focusedContent->GetCurrentDoc();
|
|
|
|
if (doc) {
|
|
|
|
nsIPresShell *shell = doc->GetShellAt(0);
|
|
|
|
if (shell) {
|
|
|
|
nsPresContext *pc = shell->GetPresContext();
|
|
|
|
if (pc) {
|
|
|
|
pc->EventStateManager()->SetContentState(focusedContent,
|
|
|
|
NS_EVENT_STATE_FOCUS);
|
|
|
|
didFocusContent = PR_TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!didFocusContent && focusedWindow)
|
|
|
|
focusedWindow->Focus();
|
|
|
|
} else if (focusedWindow) {
|
|
|
|
// Just update the saved focus memory.
|
|
|
|
fc->SetFocusedWindow(focusedWindow);
|
|
|
|
fc->SetFocusedElement(focusedElement);
|
|
|
|
}
|
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
// And we're ready to go!
|
|
|
|
inner->Thaw();
|
2005-05-04 20:22:32 +00:00
|
|
|
|
2005-08-15 18:16:42 +00:00
|
|
|
holder->DidRestoreWindow();
|
2005-05-04 20:22:32 +00:00
|
|
|
|
2005-08-25 07:06:59 +00:00
|
|
|
return NS_OK;
|
2005-05-04 20:22:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
nsGlobalWindow::SuspendTimeouts()
|
|
|
|
{
|
2005-07-30 20:57:07 +00:00
|
|
|
FORWARD_TO_INNER_VOID(SuspendTimeouts, ());
|
|
|
|
|
2005-08-30 20:07:58 +00:00
|
|
|
PRIntervalTime now = PR_IntervalNow();
|
2005-05-04 20:22:32 +00:00
|
|
|
for (nsTimeout *t = mTimeouts; t; t = t->mNext) {
|
2005-08-30 20:07:58 +00:00
|
|
|
// Change mWhen to be the time remaining for this timer.
|
2005-08-31 20:10:41 +00:00
|
|
|
if (t->mWhen > now)
|
|
|
|
t->mWhen -= now;
|
|
|
|
else
|
|
|
|
t->mWhen = 0;
|
2005-05-04 20:22:32 +00:00
|
|
|
|
|
|
|
// Drop the XPCOM timer; we'll reschedule when restoring the state.
|
|
|
|
if (t->mTimer) {
|
|
|
|
t->mTimer->Cancel();
|
|
|
|
t->mTimer = nsnull;
|
|
|
|
}
|
|
|
|
|
2005-08-31 19:47:48 +00:00
|
|
|
// Drop the reference that the timer's closure had on this timeout, we'll
|
|
|
|
// add it back in ResumeTimeouts. Note that it shouldn't matter that we're
|
|
|
|
// passing null for the context, since this shouldn't actually release this
|
|
|
|
// timeout.
|
|
|
|
t->Release(nsnull);
|
2005-05-04 20:22:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Suspend our children as well.
|
2005-08-12 04:11:00 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeNode> node =
|
|
|
|
do_QueryInterface(GetDocShellInternal());
|
2005-05-04 20:22:32 +00:00
|
|
|
if (node) {
|
|
|
|
PRInt32 childCount = 0;
|
|
|
|
node->GetChildCount(&childCount);
|
|
|
|
|
|
|
|
for (PRInt32 i = 0; i < childCount; ++i) {
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> childShell;
|
|
|
|
node->GetChildAt(i, getter_AddRefs(childShell));
|
|
|
|
NS_ASSERTION(childShell, "null child shell");
|
|
|
|
|
|
|
|
nsCOMPtr<nsPIDOMWindow> pWin = do_GetInterface(childShell);
|
|
|
|
if (pWin) {
|
|
|
|
nsGlobalWindow *win =
|
|
|
|
NS_STATIC_CAST(nsGlobalWindow*,
|
|
|
|
NS_STATIC_CAST(nsPIDOMWindow*, pWin));
|
|
|
|
|
|
|
|
win->SuspendTimeouts();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsGlobalWindow::ResumeTimeouts()
|
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_INNER(ResumeTimeouts, (), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2005-05-04 20:22:32 +00:00
|
|
|
// Restore all of the timeouts, using the stored time remaining.
|
|
|
|
|
2005-08-30 20:07:58 +00:00
|
|
|
PRIntervalTime now = PR_IntervalNow();
|
2005-05-04 20:22:32 +00:00
|
|
|
nsresult rv;
|
|
|
|
|
|
|
|
for (nsTimeout *t = mTimeouts; t; t = t->mNext) {
|
2005-08-31 20:10:41 +00:00
|
|
|
PRUint32 delay = PR_MAX(PR_IntervalToMilliseconds(t->mWhen),
|
|
|
|
DOM_MIN_TIMEOUT_VALUE);
|
2005-08-30 20:07:58 +00:00
|
|
|
t->mWhen += now;
|
2005-05-04 20:22:32 +00:00
|
|
|
|
|
|
|
t->mTimer = do_CreateInstance("@mozilla.org/timer;1");
|
|
|
|
NS_ENSURE_TRUE(t->mTimer, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
|
2005-08-30 20:07:58 +00:00
|
|
|
rv = t->mTimer->InitWithFuncCallback(TimerCallback, t, delay,
|
2005-05-04 20:22:32 +00:00
|
|
|
nsITimer::TYPE_ONE_SHOT);
|
2005-08-31 19:47:48 +00:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
t->mTimer = nsnull;
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add a reference for the new timer's closure.
|
|
|
|
t->AddRef();
|
2005-05-04 20:22:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Resume our children as well.
|
2005-08-12 04:11:00 +00:00
|
|
|
nsCOMPtr<nsIDocShellTreeNode> node =
|
|
|
|
do_QueryInterface(GetDocShellInternal());
|
2005-05-04 20:22:32 +00:00
|
|
|
if (node) {
|
|
|
|
PRInt32 childCount = 0;
|
|
|
|
node->GetChildCount(&childCount);
|
|
|
|
|
|
|
|
for (PRInt32 i = 0; i < childCount; ++i) {
|
|
|
|
nsCOMPtr<nsIDocShellTreeItem> childShell;
|
|
|
|
node->GetChildAt(i, getter_AddRefs(childShell));
|
|
|
|
NS_ASSERTION(childShell, "null child shell");
|
|
|
|
|
|
|
|
nsCOMPtr<nsPIDOMWindow> pWin = do_GetInterface(childShell);
|
|
|
|
if (pWin) {
|
|
|
|
nsGlobalWindow *win =
|
|
|
|
NS_STATIC_CAST(nsGlobalWindow*,
|
|
|
|
NS_STATIC_CAST(nsPIDOMWindow*, pWin));
|
|
|
|
|
|
|
|
rv = win->ResumeTimeouts();
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
// QueryInterface implementation for nsGlobalChromeWindow
|
|
|
|
NS_INTERFACE_MAP_BEGIN(nsGlobalChromeWindow)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMChromeWindow)
|
|
|
|
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(ChromeWindow)
|
2004-12-10 19:48:22 +00:00
|
|
|
NS_INTERFACE_MAP_END_INHERITING(nsGlobalWindow)
|
2002-02-09 03:36:55 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
NS_IMPL_ADDREF_INHERITED(nsGlobalChromeWindow, nsGlobalWindow)
|
|
|
|
NS_IMPL_RELEASE_INHERITED(nsGlobalChromeWindow, nsGlobalWindow)
|
2002-02-09 03:36:55 +00:00
|
|
|
|
|
|
|
// nsGlobalChromeWindow implementation
|
|
|
|
|
2004-10-24 22:57:06 +00:00
|
|
|
static void TitleConsoleWarning()
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIConsoleService> console(do_GetService("@mozilla.org/consoleservice;1"));
|
|
|
|
if (console)
|
|
|
|
console->LogStringMessage(NS_LITERAL_STRING("Deprecated property window.title used. Please use document.title instead.").get());
|
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_IMETHODIMP
|
2002-03-24 00:16:18 +00:00
|
|
|
nsGlobalChromeWindow::GetTitle(nsAString& aTitle)
|
2002-02-09 03:36:55 +00:00
|
|
|
{
|
2004-10-24 22:57:06 +00:00
|
|
|
NS_ERROR("nsIDOMChromeWindow::GetTitle is deprecated, use nsIDOMNSDocument instead");
|
|
|
|
TitleConsoleWarning();
|
|
|
|
|
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIDOMNSDocument> nsdoc(do_QueryInterface(mDocument, &rv));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2005-10-26 12:40:05 +00:00
|
|
|
return nsdoc->GetTitle(aTitle);
|
2002-02-09 03:36:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2002-03-24 00:16:18 +00:00
|
|
|
nsGlobalChromeWindow::SetTitle(const nsAString& aTitle)
|
2002-02-09 03:36:55 +00:00
|
|
|
{
|
2004-10-24 22:57:06 +00:00
|
|
|
NS_ERROR("nsIDOMChromeWindow::SetTitle is deprecated, use nsIDOMNSDocument instead");
|
|
|
|
TitleConsoleWarning();
|
2002-02-09 03:36:55 +00:00
|
|
|
|
2004-10-24 22:57:06 +00:00
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIDOMNSDocument> nsdoc(do_QueryInterface(mDocument, &rv));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2005-10-26 12:40:05 +00:00
|
|
|
return nsdoc->SetTitle(aTitle);
|
2002-02-09 03:36:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsGlobalChromeWindow::GetWindowState(PRUint16* aWindowState)
|
|
|
|
{
|
|
|
|
*aWindowState = nsIDOMChromeWindow::STATE_NORMAL;
|
|
|
|
|
2005-03-06 18:43:07 +00:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetMainWidget();
|
2002-02-09 03:36:55 +00:00
|
|
|
|
|
|
|
PRInt32 aMode = 0;
|
|
|
|
|
|
|
|
if (widget) {
|
2005-03-06 18:43:07 +00:00
|
|
|
nsresult rv = widget->GetSizeMode(&aMode);
|
2002-02-09 03:36:55 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (aMode) {
|
|
|
|
case nsSizeMode_Minimized:
|
|
|
|
*aWindowState = nsIDOMChromeWindow::STATE_MINIMIZED;
|
|
|
|
break;
|
|
|
|
case nsSizeMode_Maximized:
|
|
|
|
*aWindowState = nsIDOMChromeWindow::STATE_MAXIMIZED;
|
|
|
|
break;
|
|
|
|
case nsSizeMode_Normal:
|
|
|
|
*aWindowState = nsIDOMChromeWindow::STATE_NORMAL;
|
2002-04-17 04:17:16 +00:00
|
|
|
break;
|
2002-02-09 03:36:55 +00:00
|
|
|
default:
|
|
|
|
NS_WARNING("Illegal window state for this chrome window");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2005-03-06 18:43:07 +00:00
|
|
|
return NS_OK;
|
2002-02-09 03:36:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsGlobalChromeWindow::Maximize()
|
|
|
|
{
|
2005-03-06 18:43:07 +00:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetMainWidget();
|
|
|
|
nsresult rv = NS_OK;
|
2002-02-09 03:36:55 +00:00
|
|
|
|
|
|
|
if (widget) {
|
|
|
|
rv = widget->SetSizeMode(nsSizeMode_Maximized);
|
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsGlobalChromeWindow::Minimize()
|
|
|
|
{
|
2005-03-06 18:43:07 +00:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetMainWidget();
|
|
|
|
nsresult rv = NS_OK;
|
2002-02-09 03:36:55 +00:00
|
|
|
|
|
|
|
if (widget) {
|
2002-02-20 03:33:52 +00:00
|
|
|
// minimize doesn't send deactivate events on windows,
|
|
|
|
// so we need to forcefully restore the os chrome
|
|
|
|
nsCOMPtr<nsIFullScreen> fullScreen =
|
|
|
|
do_GetService("@mozilla.org/browser/fullscreen;1");
|
|
|
|
if (fullScreen)
|
|
|
|
fullScreen->ShowAllOSChrome();
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
rv = widget->SetSizeMode(nsSizeMode_Minimized);
|
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsGlobalChromeWindow::Restore()
|
|
|
|
{
|
2005-03-06 18:43:07 +00:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetMainWidget();
|
|
|
|
nsresult rv = NS_OK;
|
2002-02-09 03:36:55 +00:00
|
|
|
|
|
|
|
if (widget) {
|
|
|
|
rv = widget->SetSizeMode(nsSizeMode_Normal);
|
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsGlobalChromeWindow::GetAttention()
|
2004-02-11 03:46:30 +00:00
|
|
|
{
|
|
|
|
return GetAttentionWithCycleCount(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsGlobalChromeWindow::GetAttentionWithCycleCount(PRInt32 aCycleCount)
|
2002-02-09 03:36:55 +00:00
|
|
|
{
|
2005-03-06 18:43:07 +00:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetMainWidget();
|
|
|
|
nsresult rv = NS_OK;
|
2002-02-09 03:36:55 +00:00
|
|
|
|
|
|
|
if (widget) {
|
2004-02-11 03:46:30 +00:00
|
|
|
rv = widget->GetAttention(aCycleCount);
|
2002-02-09 03:36:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
//Note: This call will lock the cursor, it will not change as it moves.
|
|
|
|
//To unlock, the cursor must be set back to CURSOR_AUTO.
|
|
|
|
NS_IMETHODIMP
|
2002-03-24 00:16:18 +00:00
|
|
|
nsGlobalChromeWindow::SetCursor(const nsAString& aCursor)
|
2002-02-09 03:36:55 +00:00
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER_CHROME(SetCursor, (aCursor), NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
nsresult rv = NS_OK;
|
|
|
|
PRInt32 cursor;
|
|
|
|
|
2003-04-12 03:08:23 +00:00
|
|
|
// use C strings to keep the code/data size down
|
|
|
|
NS_ConvertUCS2toUTF8 cursorString(aCursor);
|
2004-10-01 17:15:15 +00:00
|
|
|
|
2003-04-12 03:08:23 +00:00
|
|
|
if (cursorString.Equals("auto"))
|
2002-02-09 03:36:55 +00:00
|
|
|
cursor = NS_STYLE_CURSOR_AUTO;
|
2004-10-01 17:15:15 +00:00
|
|
|
else {
|
|
|
|
nsCSSKeyword keyword = nsCSSKeywords::LookupKeyword(aCursor);
|
|
|
|
if (eCSSKeyword_UNKNOWN == keyword ||
|
|
|
|
!nsCSSProps::FindKeyword(keyword, nsCSSProps::kCursorKTable, cursor)) {
|
|
|
|
// XXX remove the following three values (leave return NS_OK) after 1.8
|
|
|
|
// XXX since they should have been -moz- prefixed (covered by FindKeyword).
|
|
|
|
// XXX (also remove |cursorString| at that point?).
|
|
|
|
if (cursorString.Equals("grab"))
|
|
|
|
cursor = NS_STYLE_CURSOR_GRAB;
|
|
|
|
else if (cursorString.Equals("grabbing"))
|
|
|
|
cursor = NS_STYLE_CURSOR_GRABBING;
|
|
|
|
else if (cursorString.Equals("spinning"))
|
|
|
|
cursor = NS_STYLE_CURSOR_SPINNING;
|
|
|
|
else
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
}
|
2002-02-09 03:36:55 +00:00
|
|
|
|
2004-07-31 23:15:21 +00:00
|
|
|
nsCOMPtr<nsPresContext> presContext;
|
2005-07-30 20:57:07 +00:00
|
|
|
if (mDocShell) {
|
|
|
|
mDocShell->GetPresContext(getter_AddRefs(presContext));
|
|
|
|
}
|
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
if (presContext) {
|
2004-02-27 17:17:37 +00:00
|
|
|
// Need root widget.
|
|
|
|
nsCOMPtr<nsIPresShell> presShell;
|
|
|
|
mDocShell->GetPresShell(getter_AddRefs(presShell));
|
|
|
|
NS_ENSURE_TRUE(presShell, NS_ERROR_FAILURE);
|
2002-02-09 03:36:55 +00:00
|
|
|
|
2004-02-27 17:17:37 +00:00
|
|
|
nsIViewManager* vm = presShell->GetViewManager();
|
|
|
|
NS_ENSURE_TRUE(vm, NS_ERROR_FAILURE);
|
2002-02-09 03:36:55 +00:00
|
|
|
|
2004-05-17 16:29:13 +00:00
|
|
|
nsIView *rootView;
|
|
|
|
vm->GetRootView(rootView);
|
|
|
|
NS_ENSURE_TRUE(rootView, NS_ERROR_FAILURE);
|
2002-02-09 03:36:55 +00:00
|
|
|
|
2004-02-27 17:17:37 +00:00
|
|
|
nsIWidget* widget = rootView->GetWidget();
|
|
|
|
NS_ENSURE_TRUE(widget, NS_ERROR_FAILURE);
|
2002-02-09 03:36:55 +00:00
|
|
|
|
2004-02-27 17:17:37 +00:00
|
|
|
// Call esm and set cursor.
|
2005-07-01 04:29:42 +00:00
|
|
|
rv = presContext->EventStateManager()->SetCursor(cursor, nsnull,
|
|
|
|
PR_FALSE, 0.0f, 0.0f,
|
|
|
|
widget, PR_TRUE);
|
2002-02-09 03:36:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsGlobalChromeWindow::GetBrowserDOMWindow(nsIBrowserDOMWindow **aBrowserWindow)
|
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER_CHROME(GetBrowserDOMWindow, (aBrowserWindow),
|
|
|
|
NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
NS_ENSURE_ARG_POINTER(aBrowserWindow);
|
|
|
|
|
|
|
|
*aBrowserWindow = mBrowserDOMWindow;
|
|
|
|
NS_IF_ADDREF(*aBrowserWindow);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsGlobalChromeWindow::SetBrowserDOMWindow(nsIBrowserDOMWindow *aBrowserWindow)
|
|
|
|
{
|
2005-08-12 04:11:00 +00:00
|
|
|
FORWARD_TO_OUTER_CHROME(SetBrowserDOMWindow, (aBrowserWindow),
|
|
|
|
NS_ERROR_NOT_INITIALIZED);
|
2005-07-30 20:57:07 +00:00
|
|
|
|
2004-12-07 16:09:22 +00:00
|
|
|
mBrowserDOMWindow = aBrowserWindow;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2002-02-09 03:36:55 +00:00
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsGlobalWindow: Creator Function (This should go away)
|
2000-08-22 03:51:17 +00:00
|
|
|
//*****************************************************************************
|
1999-07-07 07:50:03 +00:00
|
|
|
|
2002-02-09 03:36:55 +00:00
|
|
|
nsresult
|
|
|
|
NS_NewScriptGlobalObject(PRBool aIsChrome, nsIScriptGlobalObject **aResult)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
*aResult = nsnull;
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsGlobalWindow *global;
|
2002-02-09 03:36:55 +00:00
|
|
|
|
|
|
|
if (aIsChrome) {
|
2005-07-30 20:57:07 +00:00
|
|
|
global = new nsGlobalChromeWindow(nsnull);
|
2002-02-09 03:36:55 +00:00
|
|
|
} else {
|
2005-07-30 20:57:07 +00:00
|
|
|
global = new nsGlobalWindow(nsnull);
|
2002-02-09 03:36:55 +00:00
|
|
|
}
|
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_ENSURE_TRUE(global, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
|
|
|
|
return CallQueryInterface(NS_STATIC_CAST(nsIScriptGlobalObject *, global),
|
|
|
|
aResult);
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
//*** nsNavigator: Object Management
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
1999-07-07 07:50:03 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::nsNavigator(nsIDocShell *aDocShell)
|
2004-07-22 03:22:36 +00:00
|
|
|
: mDocShell(aDocShell)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::~nsNavigator()
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2002-02-13 04:20:46 +00:00
|
|
|
sPrefInternal_id = JSVAL_VOID;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsNavigator::nsISupports
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
|
|
|
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
// QueryInterface implementation for nsNavigator
|
|
|
|
NS_INTERFACE_MAP_BEGIN(nsNavigator)
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMNavigator)
|
2000-08-22 03:51:17 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMNavigator)
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMJSNavigator)
|
|
|
|
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(Navigator)
|
2000-02-08 13:40:10 +00:00
|
|
|
NS_INTERFACE_MAP_END
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
NS_IMPL_ADDREF(nsNavigator)
|
|
|
|
NS_IMPL_RELEASE(nsNavigator)
|
1998-07-16 01:16:47 +00:00
|
|
|
|
2001-01-23 22:29:41 +00:00
|
|
|
|
2005-07-30 20:57:07 +00:00
|
|
|
void
|
|
|
|
nsNavigator::SetDocShell(nsIDocShell *aDocShell)
|
2001-01-23 22:29:41 +00:00
|
|
|
{
|
|
|
|
mDocShell = aDocShell;
|
|
|
|
if (mPlugins)
|
|
|
|
mPlugins->SetDocShell(aDocShell);
|
|
|
|
}
|
|
|
|
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
2004-12-10 19:48:22 +00:00
|
|
|
// nsNavigator::nsIDOMNavigator
|
2000-02-08 13:40:10 +00:00
|
|
|
//*****************************************************************************
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetUserAgent(nsAString& aUserAgent)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2004-07-22 03:22:36 +00:00
|
|
|
nsresult rv;
|
2001-05-11 21:05:08 +00:00
|
|
|
nsCOMPtr<nsIHttpProtocolHandler>
|
2004-07-22 03:22:36 +00:00
|
|
|
service(do_GetService(kHTTPHandlerCID, &rv));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2002-03-20 22:50:33 +00:00
|
|
|
nsCAutoString ua;
|
2004-07-22 03:22:36 +00:00
|
|
|
rv = service->GetUserAgent(ua);
|
2002-03-20 22:50:33 +00:00
|
|
|
CopyASCIItoUCS2(ua, aUserAgent);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1999-08-03 19:00:51 +00:00
|
|
|
|
2004-07-22 03:22:36 +00:00
|
|
|
return rv;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetAppCodeName(nsAString& aAppCodeName)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2004-07-22 03:22:36 +00:00
|
|
|
nsresult rv;
|
2001-05-11 21:05:08 +00:00
|
|
|
nsCOMPtr<nsIHttpProtocolHandler>
|
2004-07-22 03:22:36 +00:00
|
|
|
service(do_GetService(kHTTPHandlerCID, &rv));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2002-03-20 22:50:33 +00:00
|
|
|
nsCAutoString appName;
|
2004-07-22 03:22:36 +00:00
|
|
|
rv = service->GetAppName(appName);
|
|
|
|
CopyASCIItoUTF16(appName, aAppCodeName);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1998-09-17 00:55:35 +00:00
|
|
|
|
2004-07-22 03:22:36 +00:00
|
|
|
return rv;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetAppVersion(nsAString& aAppVersion)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2004-12-10 19:48:22 +00:00
|
|
|
if (!nsGlobalWindow::IsCallerChrome()) {
|
2004-12-07 09:04:49 +00:00
|
|
|
const nsAdoptingCString& override =
|
|
|
|
nsContentUtils::GetCharPref("general.appversion.override");
|
2004-07-22 03:22:36 +00:00
|
|
|
|
2004-12-07 09:04:49 +00:00
|
|
|
if (override) {
|
|
|
|
CopyUTF8toUTF16(override, aAppVersion);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2004-07-22 03:22:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
nsresult rv;
|
2001-05-11 21:05:08 +00:00
|
|
|
nsCOMPtr<nsIHttpProtocolHandler>
|
2004-07-22 03:22:36 +00:00
|
|
|
service(do_GetService(kHTTPHandlerCID, &rv));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2002-03-20 22:50:33 +00:00
|
|
|
nsCAutoString str;
|
2004-07-22 03:22:36 +00:00
|
|
|
rv = service->GetAppVersion(str);
|
|
|
|
CopyASCIItoUTF16(str, aAppVersion);
|
|
|
|
if (NS_FAILED(rv))
|
|
|
|
return rv;
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2004-06-17 00:13:25 +00:00
|
|
|
aAppVersion.AppendLiteral(" (");
|
2004-07-22 03:22:36 +00:00
|
|
|
|
|
|
|
rv = service->GetPlatform(str);
|
|
|
|
if (NS_FAILED(rv))
|
|
|
|
return rv;
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2003-12-23 15:41:10 +00:00
|
|
|
AppendASCIItoUTF16(str, aAppVersion);
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2004-06-17 00:13:25 +00:00
|
|
|
aAppVersion.AppendLiteral("; ");
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2004-07-22 03:22:36 +00:00
|
|
|
rv = service->GetLanguage(str);
|
|
|
|
if (NS_FAILED(rv))
|
|
|
|
return rv;
|
2003-12-23 15:41:10 +00:00
|
|
|
AppendASCIItoUTF16(str, aAppVersion);
|
2000-08-22 03:51:17 +00:00
|
|
|
|
2000-08-23 17:27:06 +00:00
|
|
|
aAppVersion.Append(PRUnichar(')'));
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1998-09-17 00:55:35 +00:00
|
|
|
|
2004-07-22 03:22:36 +00:00
|
|
|
return rv;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetAppName(nsAString& aAppName)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2004-12-10 19:48:22 +00:00
|
|
|
if (!nsGlobalWindow::IsCallerChrome()) {
|
2004-12-07 09:04:49 +00:00
|
|
|
const nsAdoptingCString& override =
|
|
|
|
nsContentUtils::GetCharPref("general.appname.override");
|
|
|
|
|
|
|
|
if (override) {
|
|
|
|
CopyUTF8toUTF16(override, aAppName);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2004-07-22 03:22:36 +00:00
|
|
|
}
|
|
|
|
|
2004-06-17 00:13:25 +00:00
|
|
|
aAppName.AssignLiteral("Netscape");
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetLanguage(nsAString& aLanguage)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2004-07-22 03:22:36 +00:00
|
|
|
nsresult rv;
|
2001-05-11 21:05:08 +00:00
|
|
|
nsCOMPtr<nsIHttpProtocolHandler>
|
2004-07-22 03:22:36 +00:00
|
|
|
service(do_GetService(kHTTPHandlerCID, &rv));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2002-03-20 22:50:33 +00:00
|
|
|
nsCAutoString lang;
|
2004-07-22 03:22:36 +00:00
|
|
|
rv = service->GetLanguage(lang);
|
2002-03-20 22:50:33 +00:00
|
|
|
CopyASCIItoUCS2(lang, aLanguage);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1998-09-17 00:55:35 +00:00
|
|
|
|
2004-07-22 03:22:36 +00:00
|
|
|
return rv;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetPlatform(nsAString& aPlatform)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2004-12-10 19:48:22 +00:00
|
|
|
if (!nsGlobalWindow::IsCallerChrome()) {
|
2004-12-07 09:04:49 +00:00
|
|
|
const nsAdoptingCString& override =
|
|
|
|
nsContentUtils::GetCharPref("general.platform.override");
|
|
|
|
|
|
|
|
if (override) {
|
|
|
|
CopyUTF8toUTF16(override, aPlatform);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2004-07-22 03:22:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
nsresult rv;
|
2001-05-11 21:05:08 +00:00
|
|
|
nsCOMPtr<nsIHttpProtocolHandler>
|
2004-07-22 03:22:36 +00:00
|
|
|
service(do_GetService(kHTTPHandlerCID, &rv));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
// sorry for the #if platform ugliness, but Communicator is
|
|
|
|
// likewise hardcoded and we're seeking backward compatibility
|
|
|
|
// here (bug 47080)
|
2000-09-22 04:52:22 +00:00
|
|
|
#if defined(WIN32)
|
2004-06-17 00:13:25 +00:00
|
|
|
aPlatform.AssignLiteral("Win32");
|
2005-10-18 19:32:01 +00:00
|
|
|
#elif defined(XP_MACOSX) && defined(__ppc__)
|
2004-06-17 00:13:25 +00:00
|
|
|
aPlatform.AssignLiteral("MacPPC");
|
2005-10-18 19:32:01 +00:00
|
|
|
#elif defined(XP_MACOSX) && defined(__i386__)
|
|
|
|
aPlatform.AssignLiteral("MacIntel");
|
2003-01-15 23:10:56 +00:00
|
|
|
#elif defined(XP_OS2)
|
2004-06-17 00:13:25 +00:00
|
|
|
aPlatform.AssignLiteral("OS/2");
|
2000-09-22 04:52:22 +00:00
|
|
|
#else
|
|
|
|
// XXX Communicator uses compiled-in build-time string defines
|
|
|
|
// to indicate the platform it was compiled *for*, not what it is
|
|
|
|
// currently running *on* which is what this does.
|
2002-03-20 22:50:33 +00:00
|
|
|
nsCAutoString plat;
|
2004-07-22 03:22:36 +00:00
|
|
|
rv = service->GetOscpu(plat);
|
|
|
|
CopyASCIItoUTF16(plat, aPlatform);
|
2000-09-22 04:52:22 +00:00
|
|
|
#endif
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1998-09-17 00:55:35 +00:00
|
|
|
|
2004-07-22 03:22:36 +00:00
|
|
|
return rv;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetOscpu(nsAString& aOSCPU)
|
2000-03-21 22:39:54 +00:00
|
|
|
{
|
2004-07-22 03:22:36 +00:00
|
|
|
nsresult rv;
|
2001-05-11 21:05:08 +00:00
|
|
|
nsCOMPtr<nsIHttpProtocolHandler>
|
2004-07-22 03:22:36 +00:00
|
|
|
service(do_GetService(kHTTPHandlerCID, &rv));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2002-03-20 22:50:33 +00:00
|
|
|
nsCAutoString oscpu;
|
2004-07-22 03:22:36 +00:00
|
|
|
rv = service->GetOscpu(oscpu);
|
2002-03-20 22:50:33 +00:00
|
|
|
CopyASCIItoUCS2(oscpu, aOSCPU);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-03-21 22:39:54 +00:00
|
|
|
|
2004-07-22 03:22:36 +00:00
|
|
|
return rv;
|
2000-03-21 22:39:54 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetVendor(nsAString& aVendor)
|
2000-03-21 22:39:54 +00:00
|
|
|
{
|
2004-07-22 03:22:36 +00:00
|
|
|
nsresult rv;
|
2001-05-11 21:05:08 +00:00
|
|
|
nsCOMPtr<nsIHttpProtocolHandler>
|
2004-07-22 03:22:36 +00:00
|
|
|
service(do_GetService(kHTTPHandlerCID, &rv));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2002-03-20 22:50:33 +00:00
|
|
|
nsCAutoString vendor;
|
2004-07-22 03:22:36 +00:00
|
|
|
rv = service->GetVendor(vendor);
|
2002-03-20 22:50:33 +00:00
|
|
|
CopyASCIItoUCS2(vendor, aVendor);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-03-21 22:39:54 +00:00
|
|
|
|
2004-07-22 03:22:36 +00:00
|
|
|
return rv;
|
2000-03-21 22:39:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetVendorSub(nsAString& aVendorSub)
|
2000-03-21 22:39:54 +00:00
|
|
|
{
|
2004-07-22 03:22:36 +00:00
|
|
|
nsresult rv;
|
2001-05-11 21:05:08 +00:00
|
|
|
nsCOMPtr<nsIHttpProtocolHandler>
|
2004-07-22 03:22:36 +00:00
|
|
|
service(do_GetService(kHTTPHandlerCID, &rv));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2002-03-20 22:50:33 +00:00
|
|
|
nsCAutoString vendor;
|
2004-07-22 03:22:36 +00:00
|
|
|
rv = service->GetVendorSub(vendor);
|
2002-03-20 22:50:33 +00:00
|
|
|
CopyASCIItoUCS2(vendor, aVendorSub);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-03-21 22:39:54 +00:00
|
|
|
|
2004-07-22 03:22:36 +00:00
|
|
|
return rv;
|
2000-03-21 22:39:54 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetProduct(nsAString& aProduct)
|
2000-03-21 22:39:54 +00:00
|
|
|
{
|
2004-07-22 03:22:36 +00:00
|
|
|
nsresult rv;
|
2001-05-11 21:05:08 +00:00
|
|
|
nsCOMPtr<nsIHttpProtocolHandler>
|
2004-07-22 03:22:36 +00:00
|
|
|
service(do_GetService(kHTTPHandlerCID, &rv));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2002-03-20 22:50:33 +00:00
|
|
|
nsCAutoString product;
|
2004-07-22 03:22:36 +00:00
|
|
|
rv = service->GetProduct(product);
|
2002-03-20 22:50:33 +00:00
|
|
|
CopyASCIItoUCS2(product, aProduct);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-03-21 22:39:54 +00:00
|
|
|
|
2004-07-22 03:22:36 +00:00
|
|
|
return rv;
|
2000-03-21 22:39:54 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetProductSub(nsAString& aProductSub)
|
2000-03-21 22:39:54 +00:00
|
|
|
{
|
2004-07-22 03:22:36 +00:00
|
|
|
nsresult rv;
|
2001-05-11 21:05:08 +00:00
|
|
|
nsCOMPtr<nsIHttpProtocolHandler>
|
2004-07-22 03:22:36 +00:00
|
|
|
service(do_GetService(kHTTPHandlerCID, &rv));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2002-03-20 22:50:33 +00:00
|
|
|
nsCAutoString productSub;
|
2004-07-22 03:22:36 +00:00
|
|
|
rv = service->GetProductSub(productSub);
|
2002-03-20 22:50:33 +00:00
|
|
|
CopyASCIItoUCS2(productSub, aProductSub);
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
2000-03-21 22:39:54 +00:00
|
|
|
|
2004-07-22 03:22:36 +00:00
|
|
|
return rv;
|
2000-03-21 22:39:54 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetSecurityPolicy(nsAString& aSecurityPolicy)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetMimeTypes(nsIDOMMimeTypeArray **aMimeTypes)
|
1999-04-15 21:44:18 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mMimeTypes) {
|
2004-12-10 19:48:22 +00:00
|
|
|
mMimeTypes = new nsMimeTypeArray(this);
|
2003-06-20 23:51:46 +00:00
|
|
|
if (!mMimeTypes) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1999-04-20 19:41:17 +00:00
|
|
|
|
2003-06-20 23:51:46 +00:00
|
|
|
NS_ADDREF(*aMimeTypes = mMimeTypes);
|
1999-04-20 19:41:17 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1999-04-15 21:44:18 +00:00
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetPlugins(nsIDOMPluginArray **aPlugins)
|
1999-04-15 21:44:18 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
if (!mPlugins) {
|
2004-12-10 19:48:22 +00:00
|
|
|
mPlugins = new nsPluginArray(this, mDocShell);
|
2003-06-20 23:51:46 +00:00
|
|
|
if (!mPlugins) {
|
2001-04-04 22:09:56 +00:00
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
2003-06-20 23:51:46 +00:00
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1999-04-20 19:41:17 +00:00
|
|
|
|
2003-06-20 23:51:46 +00:00
|
|
|
NS_ADDREF(*aPlugins = mPlugins);
|
1999-04-20 19:41:17 +00:00
|
|
|
|
2000-08-22 03:51:17 +00:00
|
|
|
return NS_OK;
|
1999-04-15 21:44:18 +00:00
|
|
|
}
|
|
|
|
|
2003-10-16 20:54:29 +00:00
|
|
|
// values for the network.cookie.cookieBehavior pref are documented in
|
|
|
|
// nsCookieService.cpp.
|
|
|
|
#define COOKIE_BEHAVIOR_REJECT 2
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetCookieEnabled(PRBool *aCookieEnabled)
|
1999-12-22 22:42:06 +00:00
|
|
|
{
|
2004-04-29 23:34:19 +00:00
|
|
|
*aCookieEnabled =
|
|
|
|
(nsContentUtils::GetIntPref("network.cookie.cookieBehavior",
|
|
|
|
COOKIE_BEHAVIOR_REJECT) !=
|
|
|
|
COOKIE_BEHAVIOR_REJECT);
|
1999-12-22 22:42:06 +00:00
|
|
|
|
2004-04-29 23:34:19 +00:00
|
|
|
return NS_OK;
|
2001-03-29 02:11:48 +00:00
|
|
|
}
|
1999-12-22 22:42:06 +00:00
|
|
|
|
2004-04-13 18:00:18 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::GetOnLine(PRBool* aOnline)
|
2004-04-13 18:00:18 +00:00
|
|
|
{
|
|
|
|
NS_PRECONDITION(aOnline, "Null out param");
|
|
|
|
|
|
|
|
*aOnline = PR_FALSE; // No ioservice would mean this is the case
|
|
|
|
|
|
|
|
nsCOMPtr<nsIIOService> ios(do_GetService(NS_IOSERVICE_CONTRACTID));
|
|
|
|
if (ios) {
|
|
|
|
ios->GetOffline(aOnline);
|
|
|
|
*aOnline = !*aOnline;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::JavaEnabled(PRBool *aReturn)
|
1998-07-16 01:16:47 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
nsresult rv = NS_OK;
|
|
|
|
*aReturn = PR_FALSE;
|
|
|
|
|
2003-03-25 06:54:52 +00:00
|
|
|
#ifdef OJI
|
2000-08-22 03:51:17 +00:00
|
|
|
// determine whether user has enabled java.
|
|
|
|
// if pref doesn't exist, map result to false.
|
2004-04-29 23:34:19 +00:00
|
|
|
*aReturn = nsContentUtils::GetBoolPref("security.enable_java");
|
2001-04-04 22:09:56 +00:00
|
|
|
|
|
|
|
// if Java is not enabled, result is false and return reight away
|
|
|
|
if (!*aReturn)
|
|
|
|
return NS_OK;
|
|
|
|
|
2001-05-02 22:04:10 +00:00
|
|
|
// Ask the nsIJVMManager if Java is enabled
|
|
|
|
nsCOMPtr<nsIJVMManager> jvmService = do_GetService(kJVMServiceCID);
|
|
|
|
if (jvmService) {
|
|
|
|
jvmService->GetJavaEnabled(aReturn);
|
2001-04-04 22:09:56 +00:00
|
|
|
}
|
2001-05-02 22:04:10 +00:00
|
|
|
else {
|
|
|
|
*aReturn = PR_FALSE;
|
2001-04-04 22:09:56 +00:00
|
|
|
}
|
2003-03-25 06:54:52 +00:00
|
|
|
#endif
|
2000-08-22 03:51:17 +00:00
|
|
|
return rv;
|
1998-07-16 01:16:47 +00:00
|
|
|
}
|
1999-08-12 22:08:17 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::TaintEnabled(PRBool *aReturn)
|
1999-08-27 06:05:42 +00:00
|
|
|
{
|
2000-08-22 03:51:17 +00:00
|
|
|
*aReturn = PR_FALSE;
|
|
|
|
return NS_OK;
|
1999-08-27 06:05:42 +00:00
|
|
|
}
|
|
|
|
|
2002-02-13 04:20:46 +00:00
|
|
|
jsval
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::sPrefInternal_id = JSVAL_VOID;
|
2002-02-13 04:20:46 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::Preference()
|
1999-08-27 06:05:42 +00:00
|
|
|
{
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsCOMPtr<nsIXPCNativeCallContext> ncc;
|
2004-09-01 16:50:12 +00:00
|
|
|
nsresult rv = nsContentUtils::XPConnect()->
|
|
|
|
GetCurrentNativeCallContext(getter_AddRefs(ncc));
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
1999-12-18 20:29:29 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
if (!ncc)
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
2000-08-22 03:51:17 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
PRUint32 argc;
|
|
|
|
|
|
|
|
ncc->GetArgc(&argc);
|
|
|
|
|
|
|
|
if (argc == 0) {
|
|
|
|
// No arguments means there's nothing to be done here.
|
|
|
|
|
|
|
|
return NS_OK;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1999-12-17 22:25:22 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
jsval *argv = nsnull;
|
2000-08-22 03:51:17 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
ncc->GetArgvPtr(&argv);
|
|
|
|
NS_ENSURE_TRUE(argv, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
JSContext *cx = nsnull;
|
|
|
|
|
|
|
|
rv = ncc->GetJSContext(&cx);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
//--Check to see if the caller is allowed to access prefs
|
2002-05-17 22:24:06 +00:00
|
|
|
if (sPrefInternal_id == JSVAL_VOID) {
|
|
|
|
sPrefInternal_id =
|
|
|
|
STRING_TO_JSVAL(::JS_InternString(cx, "preferenceinternal"));
|
|
|
|
}
|
2002-02-13 04:20:46 +00:00
|
|
|
|
2001-05-08 19:43:47 +00:00
|
|
|
PRUint32 action;
|
2002-05-17 22:24:06 +00:00
|
|
|
if (argc == 1) {
|
2001-05-08 19:43:47 +00:00
|
|
|
action = nsIXPCSecurityManager::ACCESS_GET_PROPERTY;
|
2002-05-17 22:24:06 +00:00
|
|
|
} else {
|
2001-05-08 19:43:47 +00:00
|
|
|
action = nsIXPCSecurityManager::ACCESS_SET_PROPERTY;
|
2002-05-17 22:24:06 +00:00
|
|
|
}
|
2002-02-13 04:20:46 +00:00
|
|
|
|
2002-05-17 22:24:06 +00:00
|
|
|
nsCOMPtr<nsIScriptSecurityManager> secMan =
|
|
|
|
do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
rv = secMan->CheckPropertyAccess(cx, nsnull, "Navigator", sPrefInternal_id,
|
|
|
|
action);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return NS_OK;
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
}
|
|
|
|
|
2004-04-29 23:34:19 +00:00
|
|
|
nsIPrefBranch *prefBranch = nsContentUtils::GetPrefBranch();
|
|
|
|
NS_ENSURE_STATE(prefBranch);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
|
|
|
JSString *str = ::JS_ValueToString(cx, argv[0]);
|
|
|
|
NS_ENSURE_TRUE(str, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
|
|
|
|
jsval *retval = nsnull;
|
|
|
|
|
|
|
|
rv = ncc->GetRetValPtr(&retval);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
char *prefStr = ::JS_GetStringBytes(str);
|
|
|
|
if (argc == 1) {
|
|
|
|
PRInt32 prefType;
|
|
|
|
|
2002-11-25 23:21:25 +00:00
|
|
|
prefBranch->GetPrefType(prefStr, &prefType);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2002-11-25 23:21:25 +00:00
|
|
|
switch (prefType) {
|
|
|
|
case nsIPrefBranch::PREF_STRING:
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
{
|
|
|
|
nsXPIDLCString prefCharVal;
|
2002-11-25 23:21:25 +00:00
|
|
|
rv = prefBranch->GetCharPref(prefStr, getter_Copies(prefCharVal));
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
JSString *retStr = ::JS_NewStringCopyZ(cx, prefCharVal);
|
|
|
|
NS_ENSURE_TRUE(retStr, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
|
|
|
|
*retval = STRING_TO_JSVAL(retStr);
|
|
|
|
|
|
|
|
break;
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2002-11-25 23:21:25 +00:00
|
|
|
case nsIPrefBranch::PREF_INT:
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
{
|
|
|
|
PRInt32 prefIntVal;
|
2002-11-25 23:21:25 +00:00
|
|
|
rv = prefBranch->GetIntPref(prefStr, &prefIntVal);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
*retval = INT_TO_JSVAL(prefIntVal);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2002-11-25 23:21:25 +00:00
|
|
|
case nsIPrefBranch::PREF_BOOL:
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
{
|
|
|
|
PRBool prefBoolVal;
|
|
|
|
|
2002-11-25 23:21:25 +00:00
|
|
|
rv = prefBranch->GetBoolPref(prefStr, &prefBoolVal);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
*retval = BOOLEAN_TO_JSVAL(prefBoolVal);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
// Nothing we can do here...
|
|
|
|
|
|
|
|
return ncc->SetReturnValueWasSet(PR_FALSE);
|
1999-11-17 00:43:19 +00:00
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
|
|
|
ncc->SetReturnValueWasSet(PR_TRUE);
|
|
|
|
} else {
|
|
|
|
if (JSVAL_IS_STRING(argv[1])) {
|
|
|
|
JSString *valueJSStr = ::JS_ValueToString(cx, argv[1]);
|
|
|
|
NS_ENSURE_TRUE(valueJSStr, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
|
2002-11-25 23:21:25 +00:00
|
|
|
rv = prefBranch->SetCharPref(prefStr, ::JS_GetStringBytes(valueJSStr));
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
} else if (JSVAL_IS_INT(argv[1])) {
|
|
|
|
jsint valueInt = JSVAL_TO_INT(argv[1]);
|
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
rv = prefBranch->SetIntPref(prefStr, (PRInt32)valueInt);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
} else if (JSVAL_IS_BOOLEAN(argv[1])) {
|
|
|
|
JSBool valueBool = JSVAL_TO_BOOLEAN(argv[1]);
|
|
|
|
|
2002-11-28 01:35:45 +00:00
|
|
|
rv = prefBranch->SetBoolPref(prefStr, (PRBool)valueBool);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
} else if (JSVAL_IS_NULL(argv[1])) {
|
2002-11-25 23:21:25 +00:00
|
|
|
rv = prefBranch->DeleteBranch(prefStr);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
}
|
2000-08-22 03:51:17 +00:00
|
|
|
}
|
1999-11-17 00:43:19 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
return rv;
|
1999-10-14 23:28:17 +00:00
|
|
|
}
|
|
|
|
|
2003-06-18 23:48:57 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::LoadingNewDocument()
|
2003-06-18 23:48:57 +00:00
|
|
|
{
|
|
|
|
// Release these so that they will be recreated for the
|
|
|
|
// new document (if requested). The plugins or mime types
|
|
|
|
// arrays may have changed. See bug 150087.
|
2003-06-20 23:51:46 +00:00
|
|
|
mMimeTypes = nsnull;
|
|
|
|
mPlugins = nsnull;
|
2003-06-18 23:48:57 +00:00
|
|
|
}
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2001-07-23 05:36:52 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsNavigator::RefreshMIMEArray()
|
2001-07-23 05:36:52 +00:00
|
|
|
{
|
|
|
|
nsresult rv = NS_OK;
|
|
|
|
if (mMimeTypes)
|
|
|
|
rv = mMimeTypes->Refresh();
|
|
|
|
return rv;
|
|
|
|
}
|