2001-09-26 02:43:09 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2006-06-22 02:10:35 +04:00
|
|
|
/* vim: set ts=2 sw=2 et tw=78: */
|
2001-09-26 02:43:09 +04:00
|
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
2004-04-18 01:52:36 +04:00
|
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
(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 03:43:30 +03:00
|
|
|
*
|
2004-04-18 01:52:36 +04: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/
|
(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 03:43:30 +03:00
|
|
|
*
|
2001-09-26 02:43:09 +04: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.
|
(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 03:43:30 +03:00
|
|
|
*
|
1999-11-06 06:40:37 +03:00
|
|
|
* The Original Code is mozilla.org code.
|
|
|
|
*
|
2004-04-18 01:52:36 +04:00
|
|
|
* The Initial Developer of the Original Code is
|
2001-09-26 02:43:09 +04:00
|
|
|
* Netscape Communications Corporation.
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
1999-11-06 06:40:37 +03:00
|
|
|
*
|
2001-05-26 11:44:19 +04:00
|
|
|
* Contributor(s):
|
2006-06-13 07:07:47 +04:00
|
|
|
* Mark Hammond <mhammond@skippinet.com.au>
|
2001-09-26 02:43:09 +04:00
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
2004-04-18 01:52:36 +04: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-26 02:43:09 +04: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-18 01:52:36 +04:00
|
|
|
* use your version of this file under the terms of the MPL, indicate your
|
2001-09-26 02:43:09 +04: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-18 01:52:36 +04:00
|
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
2001-09-26 02:43:09 +04:00
|
|
|
*
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
(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 03:43:30 +03:00
|
|
|
|
2010-03-04 08:02:55 +03:00
|
|
|
#include "jscntxt.h"
|
1998-07-16 05:16:47 +04:00
|
|
|
#include "nsJSEnvironment.h"
|
|
|
|
#include "nsIScriptGlobalObject.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 21:42:36 +04:00
|
|
|
#include "nsIScriptObjectPrincipal.h"
|
2005-06-08 06:13:10 +04:00
|
|
|
#include "nsIDOMChromeWindow.h"
|
2005-11-29 02:56:44 +03:00
|
|
|
#include "nsPIDOMWindow.h"
|
1998-11-21 03:12:33 +03:00
|
|
|
#include "nsIScriptSecurityManager.h"
|
1998-12-23 01:03:20 +03:00
|
|
|
#include "nsDOMCID.h"
|
|
|
|
#include "nsIServiceManager.h"
|
1999-04-24 06:37:41 +04:00
|
|
|
#include "nsIXPConnect.h"
|
1999-08-20 00:36:31 +04:00
|
|
|
#include "nsIJSContextStack.h"
|
1999-09-05 04:43:39 +04:00
|
|
|
#include "nsIJSRuntimeService.h"
|
1999-08-30 01:58:42 +04:00
|
|
|
#include "nsCOMPtr.h"
|
2006-06-13 07:07:47 +04:00
|
|
|
#include "nsISupportsPrimitives.h"
|
2001-09-29 12:28:41 +04:00
|
|
|
#include "nsReadableUtils.h"
|
1999-12-18 23:29:29 +03:00
|
|
|
#include "nsJSUtils.h"
|
2000-04-24 08:41:27 +04:00
|
|
|
#include "nsIDocShell.h"
|
2000-12-07 05:08:21 +03:00
|
|
|
#include "nsIDocShellTreeItem.h"
|
2004-08-01 03:15:21 +04:00
|
|
|
#include "nsPresContext.h"
|
2004-01-04 03:29:27 +03:00
|
|
|
#include "nsIConsoleService.h"
|
2000-12-07 05:08:21 +03:00
|
|
|
#include "nsIScriptError.h"
|
2000-06-24 20:18:41 +04:00
|
|
|
#include "nsIInterfaceRequestor.h"
|
2001-09-06 01:28:38 +04:00
|
|
|
#include "nsIInterfaceRequestorUtils.h"
|
2000-06-24 20:18:41 +04:00
|
|
|
#include "nsIPrompt.h"
|
2000-06-20 07:45:21 +04:00
|
|
|
#include "nsIObserverService.h"
|
2001-07-16 06:40:48 +04:00
|
|
|
#include "nsGUIEvent.h"
|
2006-05-10 21:30:15 +04:00
|
|
|
#include "nsThreadUtils.h"
|
2001-11-27 12:46:38 +03:00
|
|
|
#include "nsITimer.h"
|
2002-07-25 22:31:10 +04:00
|
|
|
#include "nsIAtom.h"
|
2004-04-30 03:34:19 +04:00
|
|
|
#include "nsContentUtils.h"
|
2006-03-07 20:08:51 +03:00
|
|
|
#include "nsEventDispatcher.h"
|
2006-08-25 01:49:14 +04:00
|
|
|
#include "nsIContent.h"
|
2007-01-05 04:44:42 +03:00
|
|
|
#include "nsCycleCollector.h"
|
2007-07-10 02:07:07 +04:00
|
|
|
#include "nsNetUtil.h"
|
2009-01-12 19:05:10 +03:00
|
|
|
#include "nsXPCOMCIDInternal.h"
|
|
|
|
#include "nsIXULRuntime.h"
|
1998-07-16 05:16:47 +04:00
|
|
|
|
2005-12-03 10:42:40 +03:00
|
|
|
#include "nsDOMClassInfo.h"
|
2011-02-16 23:47:08 +03:00
|
|
|
#include "xpcpublic.h"
|
2003-06-25 01:09:57 +04:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
#include "jsdbgapi.h" // for JS_ClearWatchPointsForObject
|
2011-05-03 02:47:10 +04:00
|
|
|
#include "jswrapper.h"
|
2006-06-13 07:07:47 +04:00
|
|
|
#include "jsxdrapi.h"
|
|
|
|
#include "nsIArray.h"
|
|
|
|
#include "nsIObjectInputStream.h"
|
|
|
|
#include "nsIObjectOutputStream.h"
|
|
|
|
#include "nsDOMScriptObjectHolder.h"
|
|
|
|
#include "prmem.h"
|
2010-10-11 02:38:10 +04:00
|
|
|
#include "WrapperFactory.h"
|
2006-07-12 04:26:56 +04:00
|
|
|
#include "nsGlobalWindow.h"
|
2005-06-08 06:13:10 +04:00
|
|
|
|
2010-10-22 09:15:21 +04:00
|
|
|
#ifdef XP_MACOSX
|
|
|
|
// AssertMacros.h defines 'check' and conflicts with AccessCheck.h
|
|
|
|
#undef check
|
|
|
|
#endif
|
|
|
|
#include "AccessCheck.h"
|
|
|
|
|
2006-06-23 01:30:49 +04:00
|
|
|
#ifdef MOZ_JSDEBUGGER
|
|
|
|
#include "jsdIDebuggerService.h"
|
|
|
|
#endif
|
2001-05-05 14:18:53 +04:00
|
|
|
#ifdef MOZ_LOGGING
|
1999-12-03 06:40:30 +03:00
|
|
|
// Force PR_LOGGING so we can get JS strict warnings even in release builds
|
|
|
|
#define FORCE_PR_LOG 1
|
2001-05-05 14:18:53 +04:00
|
|
|
#endif
|
1999-12-03 06:40:30 +03:00
|
|
|
#include "prlog.h"
|
2000-05-15 08:21:04 +04:00
|
|
|
#include "prthread.h"
|
1999-12-03 06:40:30 +03:00
|
|
|
|
2010-05-20 03:22:19 +04:00
|
|
|
#include "mozilla/FunctionTimer.h"
|
2011-05-25 10:31:59 +04:00
|
|
|
#include "mozilla/Preferences.h"
|
2010-05-20 03:22:19 +04:00
|
|
|
|
2011-04-29 02:48:52 +04:00
|
|
|
using namespace mozilla;
|
|
|
|
|
1998-07-16 05:16:47 +04:00
|
|
|
const size_t gStackSize = 8192;
|
|
|
|
|
2000-10-29 02:17:53 +04:00
|
|
|
#ifdef PR_LOGGING
|
2003-06-25 03:06:12 +04:00
|
|
|
static PRLogModuleInfo* gJSDiagnostics;
|
2000-10-29 02:17:53 +04:00
|
|
|
#endif
|
|
|
|
|
2003-06-25 01:09:57 +04:00
|
|
|
// Thank you Microsoft!
|
|
|
|
#ifdef CompareString
|
|
|
|
#undef CompareString
|
|
|
|
#endif
|
2001-11-27 12:46:38 +03:00
|
|
|
|
2007-01-11 03:02:58 +03:00
|
|
|
// The amount of time we wait between a request to GC (due to leaving
|
|
|
|
// a page) and doing the actual GC.
|
2011-02-17 02:47:12 +03:00
|
|
|
#define NS_GC_DELAY 4000 // ms
|
2007-01-11 03:02:58 +03:00
|
|
|
|
|
|
|
// The amount of time we wait from the first request to GC to actually
|
|
|
|
// doing the first GC.
|
|
|
|
#define NS_FIRST_GC_DELAY 10000 // ms
|
2001-11-27 12:46:38 +03:00
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
// The amount of time we wait between a request to CC (after GC ran)
|
|
|
|
// and doing the actual CC.
|
|
|
|
#define NS_CC_DELAY 5000 // ms
|
2006-06-13 07:07:47 +04:00
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
#define JAVASCRIPT nsIProgrammingLanguage::JAVASCRIPT
|
2007-10-23 01:42:25 +04:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// if you add statics here, add them to the list in nsJSRuntime::Startup
|
2004-06-09 22:36:25 +04:00
|
|
|
|
2003-06-25 03:06:12 +04:00
|
|
|
static nsITimer *sGCTimer;
|
2011-02-17 02:47:12 +03:00
|
|
|
static nsITimer *sCCTimer;
|
2001-11-27 12:46:38 +03:00
|
|
|
|
2011-02-23 11:08:36 +03:00
|
|
|
static bool sGCHasRun;
|
|
|
|
|
2007-01-11 03:02:58 +03:00
|
|
|
// The number of currently pending document loads. This count isn't
|
|
|
|
// guaranteed to always reflect reality and can't easily as we don't
|
|
|
|
// have an easy place to know when a load ends or is interrupted in
|
|
|
|
// all cases. This counter also gets reset if we end up GC'ing while
|
|
|
|
// we're waiting for a slow page to load. IOW, this count may be 0
|
|
|
|
// even when there are pending loads.
|
|
|
|
static PRUint32 sPendingLoadCount;
|
2011-02-17 02:47:12 +03:00
|
|
|
static PRBool sLoadingInProgress;
|
2007-01-11 03:02:58 +03:00
|
|
|
|
2011-03-01 01:44:22 +03:00
|
|
|
static PRUint32 sCCollectedWaitingForGC;
|
2011-02-17 02:47:12 +03:00
|
|
|
static PRBool sPostGCEventsToConsole;
|
2007-01-11 03:02:58 +03: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 21:42:36 +04:00
|
|
|
nsScriptNameSpaceManager *gNameSpaceManager;
|
|
|
|
|
2003-06-25 03:06:12 +04:00
|
|
|
static nsIJSRuntimeService *sRuntimeService;
|
2006-06-13 07:07:47 +04:00
|
|
|
JSRuntime *nsJSRuntime::sRuntime;
|
2002-05-03 07:02:07 +04:00
|
|
|
|
|
|
|
static const char kJSRuntimeServiceContractID[] =
|
|
|
|
"@mozilla.org/js/xpc/RuntimeService;1";
|
|
|
|
|
2003-06-25 03:06:12 +04:00
|
|
|
static JSGCCallback gOldJSGCCallback;
|
2002-05-03 07:02:07 +04:00
|
|
|
|
2004-06-09 22:36:25 +04:00
|
|
|
static PRBool sIsInitialized;
|
2003-06-25 03:06:12 +04:00
|
|
|
static PRBool sDidShutdown;
|
2002-05-03 07:02:07 +04:00
|
|
|
|
2003-06-25 03:06:12 +04:00
|
|
|
static PRInt32 sContextCount;
|
2002-05-03 07:02:07 +04:00
|
|
|
|
2004-02-12 01:22:05 +03:00
|
|
|
static PRTime sMaxScriptRunTime;
|
2006-07-28 02:36:36 +04:00
|
|
|
static PRTime sMaxChromeScriptRunTime;
|
2004-02-12 01:22:05 +03:00
|
|
|
|
2003-06-25 03:06:12 +04:00
|
|
|
static nsIScriptSecurityManager *sSecurityManager;
|
2002-05-03 07:02:07 +04:00
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
// nsMemoryPressureObserver observes the memory-pressure notifications
|
2011-07-07 22:27:07 +04:00
|
|
|
// and forces a garbage collection and cycle collection when it happens, if
|
|
|
|
// the appropriate pref is set.
|
|
|
|
|
|
|
|
static PRBool sGCOnMemoryPressure;
|
2007-10-23 01:42:25 +04:00
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
class nsMemoryPressureObserver : public nsIObserver
|
2007-10-23 01:42:25 +04:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
NS_DECL_NSIOBSERVER
|
|
|
|
};
|
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
NS_IMPL_ISUPPORTS1(nsMemoryPressureObserver, nsIObserver)
|
2007-10-23 01:42:25 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2011-02-17 02:47:12 +03:00
|
|
|
nsMemoryPressureObserver::Observe(nsISupports* aSubject, const char* aTopic,
|
|
|
|
const PRUnichar* aData)
|
2007-11-07 00:47:35 +03:00
|
|
|
{
|
2011-07-07 22:27:07 +04:00
|
|
|
if (sGCOnMemoryPressure) {
|
|
|
|
nsJSContext::GarbageCollectNow();
|
|
|
|
nsJSContext::CycleCollectNow();
|
|
|
|
}
|
2007-11-07 00:47:35 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
/****************************************************************
|
|
|
|
************************** AutoFree ****************************
|
|
|
|
****************************************************************/
|
|
|
|
|
|
|
|
class AutoFree {
|
|
|
|
public:
|
|
|
|
AutoFree(void *aPtr) : mPtr(aPtr) {
|
|
|
|
}
|
|
|
|
~AutoFree() {
|
|
|
|
if (mPtr)
|
|
|
|
nsMemory::Free(mPtr);
|
|
|
|
}
|
|
|
|
void Invalidate() {
|
|
|
|
mPtr = 0;
|
|
|
|
}
|
|
|
|
private:
|
|
|
|
void *mPtr;
|
|
|
|
};
|
|
|
|
|
2010-01-25 19:48:07 +03:00
|
|
|
class nsAutoPoolRelease {
|
2006-06-13 07:07:47 +04:00
|
|
|
public:
|
2010-01-25 19:48:07 +03:00
|
|
|
nsAutoPoolRelease(JSArenaPool *p, void *m) : mPool(p), mMark(m) {}
|
|
|
|
~nsAutoPoolRelease() { JS_ARENA_RELEASE(mPool, mMark); }
|
2006-06-13 07:07:47 +04:00
|
|
|
private:
|
2010-01-25 19:48:07 +03:00
|
|
|
JSArenaPool *mPool;
|
|
|
|
void *mMark;
|
2006-06-13 07:07:47 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
// A utility function for script languages to call. Although it looks small,
|
|
|
|
// the use of nsIDocShell and nsPresContext triggers a huge number of
|
|
|
|
// dependencies that most languages would not otherwise need.
|
|
|
|
// XXXmarkh - This function is mis-placed!
|
|
|
|
PRBool
|
|
|
|
NS_HandleScriptError(nsIScriptGlobalObject *aScriptGlobal,
|
|
|
|
nsScriptErrorEvent *aErrorEvent,
|
|
|
|
nsEventStatus *aStatus)
|
|
|
|
{
|
|
|
|
PRBool called = PR_FALSE;
|
|
|
|
nsCOMPtr<nsPIDOMWindow> win(do_QueryInterface(aScriptGlobal));
|
|
|
|
nsIDocShell *docShell = win ? win->GetDocShell() : nsnull;
|
|
|
|
if (docShell) {
|
2010-03-25 16:17:11 +03:00
|
|
|
nsRefPtr<nsPresContext> presContext;
|
2006-06-13 07:07:47 +04:00
|
|
|
docShell->GetPresContext(getter_AddRefs(presContext));
|
|
|
|
|
|
|
|
static PRInt32 errorDepth; // Recursion prevention
|
|
|
|
++errorDepth;
|
2008-07-27 03:17:12 +04:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
if (presContext && errorDepth < 2) {
|
|
|
|
// Dispatch() must be synchronous for the recursion block
|
|
|
|
// (errorDepth) to work.
|
|
|
|
nsEventDispatcher::Dispatch(win, presContext, aErrorEvent, nsnull,
|
|
|
|
aStatus);
|
|
|
|
called = PR_TRUE;
|
|
|
|
}
|
|
|
|
--errorDepth;
|
|
|
|
}
|
|
|
|
return called;
|
|
|
|
}
|
|
|
|
|
2009-12-18 22:27:57 +03:00
|
|
|
class ScriptErrorEvent : public nsRunnable
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
ScriptErrorEvent(nsIScriptGlobalObject* aScriptGlobal,
|
|
|
|
PRUint32 aLineNr, PRUint32 aColumn, PRUint32 aFlags,
|
|
|
|
const nsAString& aErrorMsg,
|
|
|
|
const nsAString& aFileName,
|
|
|
|
const nsAString& aSourceLine,
|
2010-10-21 04:24:15 +04:00
|
|
|
PRBool aDispatchEvent,
|
2011-08-25 00:44:35 +04:00
|
|
|
PRUint64 aInnerWindowID)
|
2009-12-18 22:27:57 +03:00
|
|
|
: mScriptGlobal(aScriptGlobal), mLineNr(aLineNr), mColumn(aColumn),
|
|
|
|
mFlags(aFlags), mErrorMsg(aErrorMsg), mFileName(aFileName),
|
2010-10-21 04:24:15 +04:00
|
|
|
mSourceLine(aSourceLine), mDispatchEvent(aDispatchEvent),
|
2011-08-25 00:44:35 +04:00
|
|
|
mInnerWindowID(aInnerWindowID)
|
2010-10-21 04:24:15 +04:00
|
|
|
{}
|
2009-12-18 22:27:57 +03:00
|
|
|
|
|
|
|
NS_IMETHOD Run()
|
|
|
|
{
|
|
|
|
nsEventStatus status = nsEventStatus_eIgnore;
|
|
|
|
// First, notify the DOM that we have a script error.
|
|
|
|
if (mDispatchEvent) {
|
|
|
|
nsCOMPtr<nsPIDOMWindow> win(do_QueryInterface(mScriptGlobal));
|
|
|
|
nsIDocShell* docShell = win ? win->GetDocShell() : nsnull;
|
|
|
|
if (docShell &&
|
|
|
|
!JSREPORT_IS_WARNING(mFlags) &&
|
|
|
|
!sHandlingScriptError) {
|
|
|
|
sHandlingScriptError = PR_TRUE; // Recursion prevention
|
|
|
|
|
2010-03-25 16:17:11 +03:00
|
|
|
nsRefPtr<nsPresContext> presContext;
|
2009-12-18 22:27:57 +03:00
|
|
|
docShell->GetPresContext(getter_AddRefs(presContext));
|
|
|
|
|
|
|
|
if (presContext) {
|
|
|
|
nsScriptErrorEvent errorevent(PR_TRUE, NS_LOAD_ERROR);
|
|
|
|
|
|
|
|
errorevent.fileName = mFileName.get();
|
|
|
|
|
|
|
|
nsCOMPtr<nsIScriptObjectPrincipal> sop(do_QueryInterface(win));
|
|
|
|
NS_ENSURE_STATE(sop);
|
|
|
|
nsIPrincipal* p = sop->GetPrincipal();
|
|
|
|
NS_ENSURE_STATE(p);
|
|
|
|
|
|
|
|
PRBool sameOrigin = mFileName.IsVoid();
|
|
|
|
|
|
|
|
if (p && !sameOrigin) {
|
|
|
|
nsCOMPtr<nsIURI> errorURI;
|
|
|
|
NS_NewURI(getter_AddRefs(errorURI), mFileName);
|
|
|
|
if (errorURI) {
|
|
|
|
// FIXME: Once error reports contain the origin of the
|
|
|
|
// error (principals) we should change this to do the
|
|
|
|
// security check based on the principals and not
|
|
|
|
// URIs. See bug 387476.
|
|
|
|
sameOrigin = NS_SUCCEEDED(p->CheckMayLoad(errorURI, PR_FALSE));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_NAMED_LITERAL_STRING(xoriginMsg, "Script error.");
|
|
|
|
if (sameOrigin) {
|
|
|
|
errorevent.errorMsg = mErrorMsg.get();
|
|
|
|
errorevent.lineNr = mLineNr;
|
|
|
|
} else {
|
|
|
|
NS_WARNING("Not same origin error!");
|
|
|
|
errorevent.errorMsg = xoriginMsg.get();
|
|
|
|
errorevent.lineNr = 0;
|
2010-06-08 23:58:26 +04:00
|
|
|
// FIXME: once the principal of the script is not tied to
|
|
|
|
// the filename, we can stop using the post-redirect
|
2010-06-09 01:16:26 +04:00
|
|
|
// filename if we want and remove this line. Note that
|
|
|
|
// apparently we can't handle null filenames in the error
|
|
|
|
// event dispatching code.
|
|
|
|
static PRUnichar nullFilename[] = { PRUnichar(0) };
|
|
|
|
errorevent.fileName = nullFilename;
|
2009-12-18 22:27:57 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
nsEventDispatcher::Dispatch(win, presContext, &errorevent, nsnull,
|
|
|
|
&status);
|
|
|
|
}
|
|
|
|
|
|
|
|
sHandlingScriptError = PR_FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (status != nsEventStatus_eConsumeNoDefault) {
|
|
|
|
// Make an nsIScriptError and populate it with information from
|
|
|
|
// this error.
|
|
|
|
nsCOMPtr<nsIScriptError> errorObject =
|
|
|
|
do_CreateInstance("@mozilla.org/scripterror;1");
|
|
|
|
|
|
|
|
if (errorObject != nsnull) {
|
|
|
|
nsresult rv = NS_ERROR_NOT_AVAILABLE;
|
|
|
|
|
|
|
|
// Set category to chrome or content
|
|
|
|
nsCOMPtr<nsIScriptObjectPrincipal> scriptPrincipal =
|
|
|
|
do_QueryInterface(mScriptGlobal);
|
|
|
|
NS_ASSERTION(scriptPrincipal, "Global objects must implement "
|
|
|
|
"nsIScriptObjectPrincipal");
|
|
|
|
nsCOMPtr<nsIPrincipal> systemPrincipal;
|
|
|
|
sSecurityManager->GetSystemPrincipal(getter_AddRefs(systemPrincipal));
|
|
|
|
const char * category =
|
|
|
|
scriptPrincipal->GetPrincipal() == systemPrincipal
|
|
|
|
? "chrome javascript"
|
|
|
|
: "content javascript";
|
|
|
|
|
2010-10-21 04:24:15 +04:00
|
|
|
nsCOMPtr<nsIScriptError2> error2(do_QueryInterface(errorObject));
|
|
|
|
if (error2) {
|
|
|
|
rv = error2->InitWithWindowID(mErrorMsg.get(), mFileName.get(),
|
|
|
|
mSourceLine.get(),
|
|
|
|
mLineNr, mColumn, mFlags,
|
2011-08-25 00:44:35 +04:00
|
|
|
category, mInnerWindowID);
|
2010-10-21 04:24:15 +04:00
|
|
|
} else {
|
|
|
|
rv = errorObject->Init(mErrorMsg.get(), mFileName.get(),
|
|
|
|
mSourceLine.get(),
|
|
|
|
mLineNr, mColumn, mFlags,
|
|
|
|
category);
|
|
|
|
}
|
2009-12-18 22:27:57 +03:00
|
|
|
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
nsCOMPtr<nsIConsoleService> consoleService =
|
|
|
|
do_GetService(NS_CONSOLESERVICE_CONTRACTID, &rv);
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
consoleService->LogMessage(errorObject);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
nsCOMPtr<nsIScriptGlobalObject> mScriptGlobal;
|
|
|
|
PRUint32 mLineNr;
|
|
|
|
PRUint32 mColumn;
|
|
|
|
PRUint32 mFlags;
|
|
|
|
nsString mErrorMsg;
|
|
|
|
nsString mFileName;
|
|
|
|
nsString mSourceLine;
|
|
|
|
PRBool mDispatchEvent;
|
2011-08-25 00:44:35 +04:00
|
|
|
PRUint64 mInnerWindowID;
|
2009-12-18 22:27:57 +03:00
|
|
|
|
|
|
|
static PRBool sHandlingScriptError;
|
|
|
|
};
|
|
|
|
|
|
|
|
PRBool ScriptErrorEvent::sHandlingScriptError = PR_FALSE;
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// NOTE: This function could be refactored to use the above. The only reason
|
|
|
|
// it has not been done is that the code below only fills the error event
|
|
|
|
// after it has a good nsPresContext - whereas using the above function
|
|
|
|
// would involve always filling it. Is that a concern?
|
2008-09-07 02:21:43 +04:00
|
|
|
void
|
(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 03:43:30 +03:00
|
|
|
NS_ScriptErrorReporter(JSContext *cx,
|
|
|
|
const char *message,
|
1999-09-09 03:14:30 +04:00
|
|
|
JSErrorReport *report)
|
1998-08-12 08:56:40 +04:00
|
|
|
{
|
2009-02-26 04:32:48 +03:00
|
|
|
// We don't want to report exceptions too eagerly, but warnings in the
|
|
|
|
// absence of werror are swallowed whole, so report those now.
|
|
|
|
if (!JSREPORT_IS_WARNING(report->flags)) {
|
2008-12-03 17:41:09 +03:00
|
|
|
JSStackFrame * fp = nsnull;
|
|
|
|
while ((fp = JS_FrameIterator(cx, &fp))) {
|
2010-08-16 23:35:04 +04:00
|
|
|
if (JS_IsScriptFrame(cx, fp)) {
|
2008-12-03 17:41:09 +03:00
|
|
|
return;
|
|
|
|
}
|
2008-10-12 22:32:34 +04:00
|
|
|
}
|
|
|
|
|
2009-02-26 04:32:48 +03:00
|
|
|
nsIXPConnect* xpc = nsContentUtils::XPConnect();
|
|
|
|
if (xpc) {
|
|
|
|
nsAXPCNativeCallContext *cc = nsnull;
|
|
|
|
xpc->GetCurrentNativeCallContext(&cc);
|
|
|
|
if (cc) {
|
|
|
|
nsAXPCNativeCallContext *prev = cc;
|
|
|
|
while (NS_SUCCEEDED(prev->GetPreviousCallContext(&prev)) && prev) {
|
|
|
|
PRUint16 lang;
|
|
|
|
if (NS_SUCCEEDED(prev->GetLanguage(&lang)) &&
|
|
|
|
lang == nsAXPCNativeCallContext::LANG_JS) {
|
|
|
|
return;
|
|
|
|
}
|
2008-10-12 22:32:34 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
// XXX this means we are not going to get error reports on non DOM contexts
|
|
|
|
nsIScriptContext *context = nsJSUtils::GetDynamicScriptContext(cx);
|
|
|
|
|
2006-03-03 02:09:43 +03:00
|
|
|
// Note: we must do this before running any more code on cx (if cx is the
|
|
|
|
// dynamic script context).
|
|
|
|
::JS_ClearPendingException(cx);
|
|
|
|
|
1999-12-18 23:29:29 +03:00
|
|
|
if (context) {
|
2007-03-02 04:05:46 +03:00
|
|
|
nsIScriptGlobalObject *globalObject = context->GetGlobalObject();
|
(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 03:43:30 +03:00
|
|
|
|
2007-03-02 04:05:46 +03:00
|
|
|
if (globalObject) {
|
2001-11-02 07:49:07 +03:00
|
|
|
nsAutoString fileName, msg;
|
2009-12-18 22:27:57 +03:00
|
|
|
if (!report->filename) {
|
|
|
|
fileName.SetIsVoid(PR_TRUE);
|
|
|
|
} else {
|
|
|
|
fileName.AssignWithConversion(report->filename);
|
|
|
|
}
|
2001-11-02 07:49:07 +03:00
|
|
|
|
2007-07-12 04:04:11 +04:00
|
|
|
const PRUnichar *m = reinterpret_cast<const PRUnichar*>
|
2007-07-08 11:08:04 +04:00
|
|
|
(report->ucmessage);
|
2007-07-12 04:04:11 +04:00
|
|
|
if (m) {
|
|
|
|
msg.Assign(m);
|
2001-11-02 07:49:07 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (msg.IsEmpty() && message) {
|
|
|
|
msg.AssignWithConversion(message);
|
|
|
|
}
|
|
|
|
|
2009-12-18 22:27:57 +03:00
|
|
|
|
2005-06-08 03:20:06 +04:00
|
|
|
/* We do not try to report Out Of Memory via a dom
|
|
|
|
* event because the dom event handler would encounter
|
|
|
|
* an OOM exception trying to process the event, and
|
|
|
|
* then we'd need to generate a new OOM event for that
|
|
|
|
* new OOM instance -- this isn't pretty.
|
|
|
|
*/
|
2009-12-18 22:27:57 +03:00
|
|
|
nsAutoString sourceLine;
|
|
|
|
sourceLine.Assign(reinterpret_cast<const PRUnichar*>(report->uclinebuf));
|
2010-10-21 04:24:15 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> win = do_QueryInterface(globalObject);
|
2011-08-25 00:44:35 +04:00
|
|
|
PRUint64 innerWindowID = 0;
|
|
|
|
if (win) {
|
|
|
|
nsCOMPtr<nsPIDOMWindow> innerWin = win->GetCurrentInnerWindow();
|
|
|
|
if (innerWin) {
|
|
|
|
innerWindowID = innerWin->WindowID();
|
|
|
|
}
|
|
|
|
}
|
2009-12-18 22:27:57 +03:00
|
|
|
nsContentUtils::AddScriptRunner(
|
|
|
|
new ScriptErrorEvent(globalObject, report->lineno,
|
|
|
|
report->uctokenptr - report->uclinebuf,
|
|
|
|
report->flags, msg, fileName, sourceLine,
|
2010-10-21 04:24:15 +04:00
|
|
|
report->errorNumber != JSMSG_OUT_OF_MEMORY,
|
2011-08-25 00:44:35 +04:00
|
|
|
innerWindowID));
|
1999-09-09 03:14:30 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-01-10 02:54:21 +03:00
|
|
|
#ifdef DEBUG
|
2000-04-15 05:56:47 +04:00
|
|
|
// Print it to stderr as well, for the benefit of those invoking
|
|
|
|
// mozilla with -console.
|
2004-04-13 02:20:03 +04:00
|
|
|
nsCAutoString error;
|
|
|
|
error.Assign("JavaScript ");
|
2007-07-12 04:04:11 +04:00
|
|
|
if (JSREPORT_IS_STRICT(report->flags))
|
|
|
|
error.Append("strict ");
|
|
|
|
if (JSREPORT_IS_WARNING(report->flags))
|
|
|
|
error.Append("warning: ");
|
|
|
|
else
|
|
|
|
error.Append("error: ");
|
|
|
|
error.Append(report->filename);
|
|
|
|
error.Append(", line ");
|
|
|
|
error.AppendInt(report->lineno, 10);
|
|
|
|
error.Append(": ");
|
|
|
|
if (report->ucmessage) {
|
|
|
|
AppendUTF16toUTF8(reinterpret_cast<const PRUnichar*>(report->ucmessage),
|
|
|
|
error);
|
2005-06-08 03:20:06 +04:00
|
|
|
} else {
|
2007-07-12 04:04:11 +04:00
|
|
|
error.Append(message);
|
2005-06-08 03:20:06 +04:00
|
|
|
}
|
2009-12-18 22:27:57 +03:00
|
|
|
|
2004-04-13 02:20:03 +04:00
|
|
|
fprintf(stderr, "%s\n", error.get());
|
|
|
|
fflush(stderr);
|
2001-05-14 13:56:10 +04:00
|
|
|
#endif
|
2000-04-15 05:56:47 +04:00
|
|
|
|
1999-12-03 06:40:30 +03:00
|
|
|
#ifdef PR_LOGGING
|
2007-07-12 04:04:11 +04:00
|
|
|
if (!gJSDiagnostics)
|
|
|
|
gJSDiagnostics = PR_NewLogModule("JSDiagnostics");
|
|
|
|
|
|
|
|
if (gJSDiagnostics) {
|
|
|
|
PR_LOG(gJSDiagnostics,
|
|
|
|
JSREPORT_IS_WARNING(report->flags) ? PR_LOG_WARNING : PR_LOG_ERROR,
|
|
|
|
("file %s, line %u: %s\n%s%s",
|
|
|
|
report->filename, report->lineno, message,
|
|
|
|
report->linebuf ? report->linebuf : "",
|
|
|
|
(report->linebuf &&
|
|
|
|
report->linebuf[strlen(report->linebuf)-1] != '\n')
|
|
|
|
? "\n"
|
|
|
|
: ""));
|
1999-12-03 06:40:30 +03:00
|
|
|
}
|
|
|
|
#endif
|
1998-08-12 08:56:40 +04:00
|
|
|
}
|
|
|
|
|
2006-07-12 01:03:52 +04:00
|
|
|
#ifdef DEBUG
|
|
|
|
// A couple of useful functions to call when you're debugging.
|
|
|
|
nsGlobalWindow *
|
|
|
|
JSObject2Win(JSContext *cx, JSObject *obj)
|
|
|
|
{
|
|
|
|
nsIXPConnect *xpc = nsContentUtils::XPConnect();
|
|
|
|
if (!xpc) {
|
|
|
|
return nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIXPConnectWrappedNative> wrapper;
|
|
|
|
xpc->GetWrappedNativeOfJSObject(cx, obj, getter_AddRefs(wrapper));
|
|
|
|
if (wrapper) {
|
|
|
|
nsCOMPtr<nsPIDOMWindow> win = do_QueryWrappedNative(wrapper);
|
|
|
|
if (win) {
|
2007-07-08 11:08:04 +04:00
|
|
|
return static_cast<nsGlobalWindow *>
|
|
|
|
(static_cast<nsPIDOMWindow *>(win));
|
2006-07-12 01:03:52 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
PrintWinURI(nsGlobalWindow *win)
|
|
|
|
{
|
|
|
|
if (!win) {
|
|
|
|
printf("No window passed in.\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> doc = do_QueryInterface(win->GetExtantDocument());
|
|
|
|
if (!doc) {
|
|
|
|
printf("No document in the window.\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIURI *uri = doc->GetDocumentURI();
|
2006-09-20 04:53:43 +04:00
|
|
|
if (!uri) {
|
2006-07-12 01:03:52 +04:00
|
|
|
printf("Document doesn't have a URI.\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCAutoString spec;
|
|
|
|
uri->GetSpec(spec);
|
|
|
|
printf("%s\n", spec.get());
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
PrintWinCodebase(nsGlobalWindow *win)
|
|
|
|
{
|
|
|
|
if (!win) {
|
|
|
|
printf("No window passed in.\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPrincipal *prin = win->GetPrincipal();
|
|
|
|
if (!prin) {
|
|
|
|
printf("Window doesn't have principals.\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIURI> uri;
|
|
|
|
prin->GetURI(getter_AddRefs(uri));
|
|
|
|
if (!uri) {
|
|
|
|
printf("No URI, maybe the system principal.\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCAutoString spec;
|
|
|
|
uri->GetSpec(spec);
|
|
|
|
printf("%s\n", spec.get());
|
|
|
|
}
|
2010-02-12 04:04:41 +03:00
|
|
|
|
|
|
|
void
|
|
|
|
DumpString(const nsAString &str)
|
|
|
|
{
|
|
|
|
printf("%s\n", NS_ConvertUTF16toUTF8(str).get());
|
|
|
|
}
|
2006-07-12 01:03:52 +04:00
|
|
|
#endif
|
|
|
|
|
2008-08-28 20:40:49 +04:00
|
|
|
static already_AddRefed<nsIPrompt>
|
|
|
|
GetPromptFromContext(nsJSContext* ctx)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsPIDOMWindow> win(do_QueryInterface(ctx->GetGlobalObject()));
|
|
|
|
NS_ENSURE_TRUE(win, nsnull);
|
|
|
|
|
|
|
|
nsIDocShell *docShell = win->GetDocShell();
|
|
|
|
NS_ENSURE_TRUE(docShell, nsnull);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIInterfaceRequestor> ireq(do_QueryInterface(docShell));
|
|
|
|
NS_ENSURE_TRUE(ireq, nsnull);
|
|
|
|
|
|
|
|
// Get the nsIPrompt interface from the docshell
|
|
|
|
nsIPrompt* prompt;
|
|
|
|
ireq->GetInterface(NS_GET_IID(nsIPrompt), (void**)&prompt);
|
|
|
|
return prompt;
|
|
|
|
}
|
|
|
|
|
2008-09-07 02:21:43 +04:00
|
|
|
JSBool
|
2008-01-10 18:39:02 +03:00
|
|
|
nsJSContext::DOMOperationCallback(JSContext *cx)
|
2000-06-24 20:18:41 +04:00
|
|
|
{
|
2008-08-28 20:40:49 +04:00
|
|
|
nsresult rv;
|
|
|
|
|
2000-06-24 20:18:41 +04:00
|
|
|
// Get the native context
|
2007-07-08 11:08:04 +04:00
|
|
|
nsJSContext *ctx = static_cast<nsJSContext *>(::JS_GetContextPrivate(cx));
|
2000-06-24 20:18:41 +04:00
|
|
|
|
2006-10-11 01:32:54 +04:00
|
|
|
if (!ctx) {
|
|
|
|
// Can happen; see bug 355811
|
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
2008-11-27 01:54:40 +03:00
|
|
|
// XXX Save the operation callback time so we can restore it after the GC,
|
|
|
|
// because GCing can cause JS to run on our context, causing our
|
|
|
|
// ScriptEvaluated to be called, and clearing our operation callback time.
|
|
|
|
// See bug 302333.
|
2008-01-10 18:39:02 +03:00
|
|
|
PRTime callbackTime = ctx->mOperationCallbackTime;
|
2009-06-12 04:52:47 +04:00
|
|
|
PRTime modalStateTime = ctx->mModalStateTime;
|
2005-09-21 00:59:16 +04:00
|
|
|
|
2008-11-27 01:54:40 +03:00
|
|
|
// Now restore the callback time and count, in case they got reset.
|
|
|
|
ctx->mOperationCallbackTime = callbackTime;
|
2009-06-12 04:52:47 +04:00
|
|
|
ctx->mModalStateTime = modalStateTime;
|
2008-11-27 01:54:40 +03:00
|
|
|
|
2004-12-09 03:22:53 +03:00
|
|
|
PRTime now = PR_Now();
|
|
|
|
|
2009-06-12 04:52:47 +04:00
|
|
|
if (callbackTime == 0) {
|
2008-01-19 00:28:42 +03:00
|
|
|
// Initialize mOperationCallbackTime to start timing how long the
|
|
|
|
// script has run
|
|
|
|
ctx->mOperationCallbackTime = now;
|
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
2009-06-12 04:52:47 +04:00
|
|
|
if (ctx->mModalStateDepth) {
|
|
|
|
// We're waiting on a modal dialog, nothing more to do here.
|
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PRTime duration = now - callbackTime;
|
2004-02-12 01:22:05 +03:00
|
|
|
|
2005-09-06 18:51:29 +04:00
|
|
|
// Check the amount of time this script has been running, or if the
|
|
|
|
// dialog is disabled.
|
2011-02-20 06:50:19 +03:00
|
|
|
JSObject* global = ::JS_GetGlobalForScopeChain(cx);
|
2008-01-19 00:28:42 +03:00
|
|
|
PRBool isTrackingChromeCodeTime =
|
2011-02-20 06:50:19 +03:00
|
|
|
global && xpc::AccessCheck::isChrome(global->getCompartment());
|
2008-01-19 00:28:42 +03:00
|
|
|
if (duration < (isTrackingChromeCodeTime ?
|
2006-07-28 02:36:36 +04:00
|
|
|
sMaxChromeScriptRunTime : sMaxScriptRunTime)) {
|
2004-02-12 01:22:05 +03:00
|
|
|
return JS_TRUE;
|
2004-12-09 03:22:53 +03:00
|
|
|
}
|
2004-02-12 01:22:05 +03:00
|
|
|
|
2010-04-29 00:23:18 +04:00
|
|
|
if (!nsContentUtils::IsSafeToRunScript()) {
|
|
|
|
// If it isn't safe to run script, then it isn't safe to bring up the
|
|
|
|
// prompt (since that will cause the event loop to spin). In this case
|
|
|
|
// (which is rare), we just stop the script... But report a warning so
|
|
|
|
// that developers have some idea of what went wrong.
|
|
|
|
|
|
|
|
JS_ReportWarning(cx, "A long running script was terminated");
|
|
|
|
return JS_FALSE;
|
|
|
|
}
|
|
|
|
|
2000-06-24 20:18:41 +04:00
|
|
|
// If we get here we're most likely executing an infinite loop in JS,
|
|
|
|
// we'll tell the user about this and we'll give the user the option
|
|
|
|
// of stopping the execution of the script.
|
2008-08-28 20:40:49 +04:00
|
|
|
nsCOMPtr<nsIPrompt> prompt = GetPromptFromContext(ctx);
|
2000-06-24 20:18:41 +04:00
|
|
|
NS_ENSURE_TRUE(prompt, JS_TRUE);
|
|
|
|
|
2006-06-23 01:30:49 +04:00
|
|
|
// Check if we should offer the option to debug
|
2008-01-10 18:39:02 +03:00
|
|
|
JSStackFrame* fp = ::JS_GetScriptedCaller(cx, NULL);
|
2009-02-10 14:45:36 +03:00
|
|
|
PRBool debugPossible = (fp != nsnull && cx->debugHooks &&
|
2008-01-10 18:39:02 +03:00
|
|
|
cx->debugHooks->debuggerHandler != nsnull);
|
2006-06-23 01:30:49 +04:00
|
|
|
#ifdef MOZ_JSDEBUGGER
|
|
|
|
// Get the debugger service if necessary.
|
|
|
|
if (debugPossible) {
|
|
|
|
PRBool jsds_IsOn = PR_FALSE;
|
|
|
|
const char jsdServiceCtrID[] = "@mozilla.org/js/jsd/debugger-service;1";
|
2008-07-27 03:17:12 +04:00
|
|
|
nsCOMPtr<jsdIExecutionHook> jsdHook;
|
2006-06-23 01:30:49 +04:00
|
|
|
nsCOMPtr<jsdIDebuggerService> jsds = do_GetService(jsdServiceCtrID, &rv);
|
2008-07-27 03:17:12 +04:00
|
|
|
|
2006-06-23 01:30:49 +04:00
|
|
|
// Check if there's a user for the debugger service that's 'on' for us
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
jsds->GetDebuggerHook(getter_AddRefs(jsdHook));
|
|
|
|
jsds->GetIsOn(&jsds_IsOn);
|
|
|
|
}
|
|
|
|
|
|
|
|
// If there is a debug handler registered for this runtime AND
|
|
|
|
// ((jsd is on AND has a hook) OR (jsd isn't on (something else debugs)))
|
|
|
|
// then something useful will be done with our request to debug.
|
|
|
|
debugPossible = ((jsds_IsOn && (jsdHook != nsnull)) || !jsds_IsOn);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2005-02-03 00:41:07 +03:00
|
|
|
// Get localizable strings
|
2008-08-28 20:40:49 +04:00
|
|
|
nsXPIDLString title, msg, stopButton, waitButton, debugButton, neverShowDlg;
|
2000-06-24 20:18:41 +04:00
|
|
|
|
2008-08-28 20:40:49 +04:00
|
|
|
rv = nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES,
|
|
|
|
"KillScriptTitle",
|
|
|
|
title);
|
2008-07-27 03:17:12 +04:00
|
|
|
|
2008-08-28 20:40:49 +04:00
|
|
|
rv |= nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES,
|
|
|
|
"StopScriptButton",
|
|
|
|
stopButton);
|
2004-12-09 03:22:53 +03:00
|
|
|
|
2008-08-28 20:40:49 +04:00
|
|
|
rv |= nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES,
|
|
|
|
"WaitForScriptButton",
|
|
|
|
waitButton);
|
|
|
|
|
|
|
|
rv |= nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES,
|
|
|
|
"DontAskAgain",
|
|
|
|
neverShowDlg);
|
2005-02-03 00:41:07 +03:00
|
|
|
|
2006-06-23 01:30:49 +04:00
|
|
|
|
|
|
|
if (debugPossible) {
|
2008-08-28 20:40:49 +04:00
|
|
|
rv |= nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES,
|
|
|
|
"DebugScriptButton",
|
|
|
|
debugButton);
|
|
|
|
|
|
|
|
rv |= nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES,
|
|
|
|
"KillScriptWithDebugMessage",
|
|
|
|
msg);
|
2006-06-23 01:30:49 +04:00
|
|
|
}
|
|
|
|
else {
|
2008-08-28 20:40:49 +04:00
|
|
|
rv |= nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES,
|
|
|
|
"KillScriptMessage",
|
|
|
|
msg);
|
2006-06-23 01:30:49 +04:00
|
|
|
}
|
|
|
|
|
2005-02-03 00:41:07 +03:00
|
|
|
//GetStringFromName can return NS_OK and still give NULL string
|
2005-09-06 18:51:29 +04:00
|
|
|
if (NS_FAILED(rv) || !title || !msg || !stopButton || !waitButton ||
|
2006-06-23 01:30:49 +04:00
|
|
|
(!debugButton && debugPossible) || !neverShowDlg) {
|
2005-02-03 00:41:07 +03:00
|
|
|
NS_ERROR("Failed to get localized strings.");
|
2000-06-24 20:18:41 +04:00
|
|
|
return JS_TRUE;
|
2004-02-12 01:22:05 +03:00
|
|
|
}
|
2000-06-24 20:18:41 +04:00
|
|
|
|
2007-12-03 12:17:40 +03:00
|
|
|
// Append file and line number information, if available
|
2008-01-10 18:39:02 +03:00
|
|
|
JSScript *script = fp ? ::JS_GetFrameScript(cx, fp) : nsnull;
|
2007-12-03 12:17:40 +03:00
|
|
|
if (script) {
|
|
|
|
const char *filename = ::JS_GetScriptFilename(cx, script);
|
|
|
|
if (filename) {
|
|
|
|
nsXPIDLString scriptLocation;
|
|
|
|
NS_ConvertUTF8toUTF16 filenameUTF16(filename);
|
|
|
|
const PRUnichar *formatParams[] = { filenameUTF16.get() };
|
2008-08-28 20:40:49 +04:00
|
|
|
rv = nsContentUtils::FormatLocalizedString(nsContentUtils::eDOM_PROPERTIES,
|
|
|
|
"KillScriptLocation",
|
|
|
|
formatParams, 1,
|
|
|
|
scriptLocation);
|
2007-12-03 12:17:40 +03:00
|
|
|
|
|
|
|
if (NS_SUCCEEDED(rv) && scriptLocation) {
|
|
|
|
msg.AppendLiteral("\n\n");
|
|
|
|
msg.Append(scriptLocation);
|
|
|
|
|
|
|
|
JSStackFrame *fp, *iterator = nsnull;
|
|
|
|
fp = ::JS_FrameIterator(cx, &iterator);
|
|
|
|
if (fp) {
|
|
|
|
jsbytecode *pc = ::JS_GetFramePC(cx, fp);
|
|
|
|
if (pc) {
|
|
|
|
PRUint32 lineno = ::JS_PCToLineNumber(cx, script, pc);
|
|
|
|
msg.Append(':');
|
|
|
|
msg.AppendInt(lineno);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-10-25 14:20:25 +03:00
|
|
|
PRInt32 buttonPressed = 0; //In case user exits dialog by clicking X
|
2005-09-06 18:51:29 +04:00
|
|
|
PRBool neverShowDlgChk = PR_FALSE;
|
2009-10-25 14:20:25 +03:00
|
|
|
PRUint32 buttonFlags = nsIPrompt::BUTTON_POS_1_DEFAULT +
|
|
|
|
(nsIPrompt::BUTTON_TITLE_IS_STRING *
|
2006-06-23 01:30:49 +04:00
|
|
|
(nsIPrompt::BUTTON_POS_0 + nsIPrompt::BUTTON_POS_1));
|
|
|
|
|
|
|
|
// Add a third button if necessary:
|
|
|
|
if (debugPossible)
|
|
|
|
buttonFlags += nsIPrompt::BUTTON_TITLE_IS_STRING * nsIPrompt::BUTTON_POS_2;
|
2005-02-03 00:41:07 +03:00
|
|
|
|
2009-02-10 14:45:36 +03:00
|
|
|
// Null out the operation callback while we're re-entering JS here.
|
|
|
|
::JS_SetOperationCallback(cx, nsnull);
|
|
|
|
|
2005-02-03 00:41:07 +03:00
|
|
|
// Open the dialog.
|
2009-10-25 14:20:25 +03:00
|
|
|
rv = prompt->ConfirmEx(title, msg, buttonFlags, waitButton, stopButton,
|
2006-06-23 01:30:49 +04:00
|
|
|
debugButton, neverShowDlg, &neverShowDlgChk,
|
2005-09-06 18:51:29 +04:00
|
|
|
&buttonPressed);
|
2005-02-03 00:41:07 +03:00
|
|
|
|
2009-02-10 14:45:36 +03:00
|
|
|
::JS_SetOperationCallback(cx, DOMOperationCallback);
|
|
|
|
|
2009-10-25 14:20:25 +03:00
|
|
|
if (NS_FAILED(rv) || (buttonPressed == 0)) {
|
2005-09-06 18:51:29 +04:00
|
|
|
// Allow the script to continue running
|
|
|
|
|
|
|
|
if (neverShowDlgChk) {
|
2011-05-29 03:39:27 +04:00
|
|
|
Preferences::SetInt(isTrackingChromeCodeTime ?
|
|
|
|
"dom.max_chrome_script_run_time" : "dom.max_script_run_time", 0);
|
2005-09-06 18:51:29 +04:00
|
|
|
}
|
|
|
|
|
2008-01-10 18:39:02 +03:00
|
|
|
ctx->mOperationCallbackTime = PR_Now();
|
2005-02-08 19:50:52 +03:00
|
|
|
return JS_TRUE;
|
|
|
|
}
|
2006-06-23 01:30:49 +04:00
|
|
|
else if ((buttonPressed == 2) && debugPossible) {
|
|
|
|
// Debug the script
|
|
|
|
jsval rval;
|
2008-01-10 18:39:02 +03:00
|
|
|
switch(cx->debugHooks->debuggerHandler(cx, script, ::JS_GetFramePC(cx, fp),
|
|
|
|
&rval,
|
2007-06-15 10:44:18 +04:00
|
|
|
cx->debugHooks->
|
|
|
|
debuggerHandlerData)) {
|
2006-06-23 01:30:49 +04:00
|
|
|
case JSTRAP_RETURN:
|
2010-11-08 20:28:12 +03:00
|
|
|
JS_SetFrameReturnValue(cx, fp, rval);
|
2006-06-23 01:30:49 +04:00
|
|
|
return JS_TRUE;
|
|
|
|
case JSTRAP_ERROR:
|
2011-01-07 13:03:14 +03:00
|
|
|
JS_ClearPendingException(cx);
|
2006-06-23 01:30:49 +04:00
|
|
|
return JS_FALSE;
|
|
|
|
case JSTRAP_THROW:
|
|
|
|
JS_SetPendingException(cx, rval);
|
|
|
|
return JS_FALSE;
|
|
|
|
case JSTRAP_CONTINUE:
|
|
|
|
default:
|
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
}
|
2005-02-08 19:50:52 +03:00
|
|
|
|
2009-03-02 16:32:27 +03:00
|
|
|
JS_ClearPendingException(cx);
|
2005-02-08 19:50:52 +03:00
|
|
|
return JS_FALSE;
|
2000-06-24 20:18:41 +04:00
|
|
|
}
|
|
|
|
|
2009-06-12 04:52:47 +04:00
|
|
|
void
|
|
|
|
nsJSContext::EnterModalState()
|
|
|
|
{
|
|
|
|
if (!mModalStateDepth) {
|
|
|
|
mModalStateTime = mOperationCallbackTime ? PR_Now() : 0;
|
|
|
|
}
|
|
|
|
++mModalStateDepth;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
nsJSContext::LeaveModalState()
|
|
|
|
{
|
|
|
|
if (!mModalStateDepth) {
|
|
|
|
NS_ERROR("Uh, mismatched LeaveModalState() call!");
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
--mModalStateDepth;
|
|
|
|
|
|
|
|
// If we're still in a modal dialog, or mOperationCallbackTime is still
|
|
|
|
// uninitialized, do nothing.
|
|
|
|
if (mModalStateDepth || !mOperationCallbackTime) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If mOperationCallbackTime was set when we entered the first dialog
|
|
|
|
// (and mModalStateTime is thus non-zero), adjust mOperationCallbackTime
|
|
|
|
// to account for time spent in the dialog.
|
|
|
|
// If mOperationCallbackTime got set while the modal dialog was open,
|
|
|
|
// simply set mOperationCallbackTime to the closing time of the dialog so
|
|
|
|
// that we never adjust mOperationCallbackTime to be in the future.
|
|
|
|
if (mModalStateTime) {
|
|
|
|
mOperationCallbackTime += PR_Now() - mModalStateTime;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
mOperationCallbackTime = PR_Now();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-02 05:58:51 +04:00
|
|
|
#define JS_OPTIONS_DOT_STR "javascript.options."
|
|
|
|
|
|
|
|
static const char js_options_dot_str[] = JS_OPTIONS_DOT_STR;
|
|
|
|
static const char js_strict_option_str[] = JS_OPTIONS_DOT_STR "strict";
|
2009-12-23 03:52:13 +03:00
|
|
|
#ifdef DEBUG
|
|
|
|
static const char js_strict_debug_option_str[] = JS_OPTIONS_DOT_STR "strict.debug";
|
|
|
|
#endif
|
2000-09-02 05:58:51 +04:00
|
|
|
static const char js_werror_option_str[] = JS_OPTIONS_DOT_STR "werror";
|
2007-11-11 21:59:28 +03:00
|
|
|
static const char js_relimit_option_str[]= JS_OPTIONS_DOT_STR "relimit";
|
|
|
|
#ifdef JS_GC_ZEAL
|
2011-07-22 01:31:36 +04:00
|
|
|
static const char js_zeal_option_str[] = JS_OPTIONS_DOT_STR "gczeal";
|
|
|
|
static const char js_zeal_frequency_str[] = JS_OPTIONS_DOT_STR "gczeal.frequency";
|
|
|
|
static const char js_zeal_compartment_str[] = JS_OPTIONS_DOT_STR "gczeal.compartment_gc";
|
2007-11-11 21:59:28 +03:00
|
|
|
#endif
|
2010-06-30 03:46:10 +04:00
|
|
|
static const char js_tracejit_content_str[] = JS_OPTIONS_DOT_STR "tracejit.content";
|
|
|
|
static const char js_tracejit_chrome_str[] = JS_OPTIONS_DOT_STR "tracejit.chrome";
|
2011-02-12 03:31:32 +03:00
|
|
|
static const char js_methodjit_content_str[] = JS_OPTIONS_DOT_STR "methodjit.content";
|
|
|
|
static const char js_methodjit_chrome_str[] = JS_OPTIONS_DOT_STR "methodjit.chrome";
|
|
|
|
static const char js_profiling_content_str[] = JS_OPTIONS_DOT_STR "jitprofiling.content";
|
|
|
|
static const char js_profiling_chrome_str[] = JS_OPTIONS_DOT_STR "jitprofiling.chrome";
|
|
|
|
static const char js_methodjit_always_str[] = JS_OPTIONS_DOT_STR "methodjit_always";
|
2011-03-04 01:07:48 +03:00
|
|
|
static const char js_typeinfer_str[] = JS_OPTIONS_DOT_STR "typeinference";
|
2011-02-17 02:47:12 +03:00
|
|
|
static const char js_memlog_option_str[] = JS_OPTIONS_DOT_STR "mem.log";
|
2000-09-02 05:58:51 +04:00
|
|
|
|
2008-10-10 19:04:34 +04:00
|
|
|
int
|
2000-09-02 05:58:51 +04:00
|
|
|
nsJSContext::JSOptionChangedCallback(const char *pref, void *data)
|
|
|
|
{
|
2007-07-08 11:08:04 +04:00
|
|
|
nsJSContext *context = reinterpret_cast<nsJSContext *>(data);
|
2004-04-30 03:34:19 +04:00
|
|
|
PRUint32 oldDefaultJSOptions = context->mDefaultJSOptions;
|
|
|
|
PRUint32 newDefaultJSOptions = oldDefaultJSOptions;
|
2000-09-02 05:58:51 +04:00
|
|
|
|
2011-05-25 10:31:59 +04:00
|
|
|
sPostGCEventsToConsole = Preferences::GetBool(js_memlog_option_str);
|
2011-02-17 02:47:12 +03:00
|
|
|
|
2011-05-25 10:31:59 +04:00
|
|
|
PRBool strict = Preferences::GetBool(js_strict_option_str);
|
2004-04-30 03:34:19 +04:00
|
|
|
if (strict)
|
|
|
|
newDefaultJSOptions |= JSOPTION_STRICT;
|
|
|
|
else
|
|
|
|
newDefaultJSOptions &= ~JSOPTION_STRICT;
|
|
|
|
|
2008-07-11 07:05:27 +04:00
|
|
|
nsIScriptGlobalObject *global = context->GetGlobalObject();
|
2008-08-20 19:49:00 +04:00
|
|
|
// XXX should we check for sysprin instead of a chrome window, to make
|
|
|
|
// XXX components be covered by the chrome pref instead of the content one?
|
2008-07-11 07:05:27 +04:00
|
|
|
nsCOMPtr<nsIDOMChromeWindow> chromeWindow(do_QueryInterface(global));
|
2009-01-12 19:05:10 +03:00
|
|
|
|
2011-05-25 10:31:59 +04:00
|
|
|
PRBool useTraceJIT = Preferences::GetBool(chromeWindow ?
|
|
|
|
js_tracejit_chrome_str :
|
|
|
|
js_tracejit_content_str);
|
|
|
|
PRBool useMethodJIT = Preferences::GetBool(chromeWindow ?
|
|
|
|
js_methodjit_chrome_str :
|
|
|
|
js_methodjit_content_str);
|
|
|
|
PRBool useProfiling = Preferences::GetBool(chromeWindow ?
|
|
|
|
js_profiling_chrome_str :
|
|
|
|
js_profiling_content_str);
|
|
|
|
PRBool useMethodJITAlways = Preferences::GetBool(js_methodjit_always_str);
|
2011-06-07 04:12:49 +04:00
|
|
|
PRBool useTypeInference = !chromeWindow && Preferences::GetBool(js_typeinfer_str);
|
2009-01-12 19:05:10 +03:00
|
|
|
nsCOMPtr<nsIXULRuntime> xr = do_GetService(XULRUNTIME_SERVICE_CONTRACTID);
|
|
|
|
if (xr) {
|
|
|
|
PRBool safeMode = PR_FALSE;
|
|
|
|
xr->GetInSafeMode(&safeMode);
|
2010-06-30 03:46:10 +04:00
|
|
|
if (safeMode) {
|
|
|
|
useTraceJIT = PR_FALSE;
|
|
|
|
useMethodJIT = PR_FALSE;
|
2010-10-21 20:36:39 +04:00
|
|
|
useProfiling = PR_FALSE;
|
2011-03-04 01:07:48 +03:00
|
|
|
useTypeInference = PR_FALSE;
|
2011-02-12 03:31:32 +03:00
|
|
|
useMethodJITAlways = PR_TRUE;
|
2010-06-30 03:46:10 +04:00
|
|
|
}
|
2009-01-12 19:05:10 +03:00
|
|
|
}
|
|
|
|
|
2010-06-30 03:46:10 +04:00
|
|
|
if (useTraceJIT)
|
2008-08-20 19:49:00 +04:00
|
|
|
newDefaultJSOptions |= JSOPTION_JIT;
|
|
|
|
else
|
|
|
|
newDefaultJSOptions &= ~JSOPTION_JIT;
|
2008-07-11 07:05:27 +04:00
|
|
|
|
2010-06-30 03:46:10 +04:00
|
|
|
if (useMethodJIT)
|
|
|
|
newDefaultJSOptions |= JSOPTION_METHODJIT;
|
|
|
|
else
|
|
|
|
newDefaultJSOptions &= ~JSOPTION_METHODJIT;
|
|
|
|
|
2010-10-21 20:36:39 +04:00
|
|
|
if (useProfiling)
|
|
|
|
newDefaultJSOptions |= JSOPTION_PROFILING;
|
|
|
|
else
|
|
|
|
newDefaultJSOptions &= ~JSOPTION_PROFILING;
|
|
|
|
|
2011-02-12 03:31:32 +03:00
|
|
|
if (useMethodJITAlways)
|
|
|
|
newDefaultJSOptions |= JSOPTION_METHODJIT_ALWAYS;
|
|
|
|
else
|
|
|
|
newDefaultJSOptions &= ~JSOPTION_METHODJIT_ALWAYS;
|
|
|
|
|
2011-03-04 01:07:48 +03:00
|
|
|
if (useTypeInference)
|
|
|
|
newDefaultJSOptions |= JSOPTION_TYPE_INFERENCE;
|
|
|
|
else
|
|
|
|
newDefaultJSOptions &= ~JSOPTION_TYPE_INFERENCE;
|
|
|
|
|
2007-07-10 12:05:54 +04:00
|
|
|
#ifdef DEBUG
|
2011-01-27 13:54:58 +03:00
|
|
|
// In debug builds, warnings are enabled in chrome context if
|
|
|
|
// javascript.options.strict.debug is true
|
2011-05-25 10:31:59 +04:00
|
|
|
PRBool strictDebug = Preferences::GetBool(js_strict_debug_option_str);
|
2007-07-10 12:05:54 +04:00
|
|
|
// Note this callback is also called from context's InitClasses thus we don't
|
|
|
|
// need to enable this directly from InitContext
|
2009-12-23 03:52:13 +03:00
|
|
|
if (strictDebug && (newDefaultJSOptions & JSOPTION_STRICT) == 0) {
|
2007-07-10 12:05:54 +04:00
|
|
|
if (chromeWindow)
|
|
|
|
newDefaultJSOptions |= JSOPTION_STRICT;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2011-05-25 10:31:59 +04:00
|
|
|
PRBool werror = Preferences::GetBool(js_werror_option_str);
|
2004-04-30 03:34:19 +04:00
|
|
|
if (werror)
|
|
|
|
newDefaultJSOptions |= JSOPTION_WERROR;
|
|
|
|
else
|
|
|
|
newDefaultJSOptions &= ~JSOPTION_WERROR;
|
2000-09-02 05:58:51 +04:00
|
|
|
|
2011-05-25 10:31:59 +04:00
|
|
|
PRBool relimit = Preferences::GetBool(js_relimit_option_str);
|
2007-03-24 00:27:14 +03:00
|
|
|
if (relimit)
|
|
|
|
newDefaultJSOptions |= JSOPTION_RELIMIT;
|
|
|
|
else
|
|
|
|
newDefaultJSOptions &= ~JSOPTION_RELIMIT;
|
|
|
|
|
2011-01-27 13:54:58 +03:00
|
|
|
::JS_SetOptions(context->mContext, newDefaultJSOptions & JSRUNOPTION_MASK);
|
2000-09-02 05:58:51 +04:00
|
|
|
|
2011-01-27 13:54:58 +03:00
|
|
|
// Save the new defaults for the next page load (InitContext).
|
|
|
|
context->mDefaultJSOptions = newDefaultJSOptions;
|
2007-11-11 21:59:28 +03:00
|
|
|
|
|
|
|
#ifdef JS_GC_ZEAL
|
2011-05-25 10:32:00 +04:00
|
|
|
PRInt32 zeal = Preferences::GetInt(js_zeal_option_str, -1);
|
2011-07-22 01:31:36 +04:00
|
|
|
PRInt32 frequency = Preferences::GetInt(js_zeal_frequency_str, JS_DEFAULT_ZEAL_FREQ);
|
2011-08-04 05:59:10 +04:00
|
|
|
PRBool compartment = Preferences::GetBool(js_zeal_compartment_str, PR_FALSE);
|
2007-11-11 21:59:28 +03:00
|
|
|
if (zeal >= 0)
|
2011-07-22 01:31:36 +04:00
|
|
|
::JS_SetGCZeal(context->mContext, (PRUint8)zeal, frequency, compartment);
|
2007-11-11 21:59:28 +03:00
|
|
|
#endif
|
|
|
|
|
2000-09-02 05:58:51 +04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-11-20 02:11:44 +03:00
|
|
|
nsJSContext::nsJSContext(JSRuntime *aRuntime)
|
|
|
|
: mGCOnDestruction(PR_TRUE),
|
|
|
|
mExecuteDepth(0)
|
1998-07-16 05:16:47 +04: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 21:42:36 +04:00
|
|
|
|
2002-05-03 07:02:07 +04:00
|
|
|
++sContextCount;
|
|
|
|
|
2011-06-21 20:53:19 +04:00
|
|
|
mDefaultJSOptions = JSOPTION_PRIVATE_IS_NSISUPPORTS;
|
2000-10-26 07:40:23 +04:00
|
|
|
|
2000-01-08 03:24:24 +03:00
|
|
|
mContext = ::JS_NewContext(aRuntime, gStackSize);
|
1999-12-03 06:40:30 +03:00
|
|
|
if (mContext) {
|
2007-07-08 11:08:04 +04:00
|
|
|
::JS_SetContextPrivate(mContext, static_cast<nsIScriptContext *>(this));
|
1999-12-03 06:40:30 +03:00
|
|
|
|
2010-07-16 04:58:36 +04:00
|
|
|
// Preserve any flags the context callback might have set.
|
|
|
|
mDefaultJSOptions |= ::JS_GetOptions(mContext);
|
|
|
|
|
2001-09-18 07:32:03 +04:00
|
|
|
// Make sure the new context gets the default context options
|
2010-07-16 02:39:06 +04:00
|
|
|
::JS_SetOptions(mContext, mDefaultJSOptions);
|
2001-09-18 07:32:03 +04:00
|
|
|
|
2007-03-24 00:27:14 +03:00
|
|
|
// Watch for the JS boolean options
|
2011-05-29 03:42:57 +04:00
|
|
|
Preferences::RegisterCallback(JSOptionChangedCallback,
|
|
|
|
js_options_dot_str, this);
|
2008-12-23 21:24:09 +03:00
|
|
|
|
2009-02-10 14:45:36 +03:00
|
|
|
::JS_SetOperationCallback(mContext, DOMOperationCallback);
|
2003-06-25 01:09:57 +04:00
|
|
|
|
2010-12-06 23:45:00 +03:00
|
|
|
xpc_LocalizeContext(mContext);
|
1999-12-03 06:40:30 +03:00
|
|
|
}
|
(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 03:43:30 +03:00
|
|
|
mIsInitialized = PR_FALSE;
|
2005-06-09 19:42:19 +04:00
|
|
|
mTerminations = nsnull;
|
2000-03-28 04:15:56 +04:00
|
|
|
mScriptsEnabled = PR_TRUE;
|
2009-06-12 04:52:47 +04:00
|
|
|
mOperationCallbackTime = 0;
|
|
|
|
mModalStateTime = 0;
|
|
|
|
mModalStateDepth = 0;
|
2006-07-28 02:36:36 +04:00
|
|
|
mProcessingScriptTag = PR_FALSE;
|
1998-07-16 05:16:47 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
nsJSContext::~nsJSContext()
|
|
|
|
{
|
2007-09-18 04:30:58 +04:00
|
|
|
#ifdef DEBUG
|
|
|
|
nsCycleCollector_DEBUG_wasFreed(static_cast<nsIScriptContext*>(this));
|
|
|
|
#endif
|
2011-01-28 01:42:19 +03:00
|
|
|
|
|
|
|
// We may still have pending termination functions if the context is destroyed
|
|
|
|
// before they could be executed. In this case, free the references to their
|
|
|
|
// parameters, but don't execute the functions (see bug 622326).
|
|
|
|
delete mTerminations;
|
2007-11-02 01:51:57 +03:00
|
|
|
|
2010-09-04 01:15:50 +04:00
|
|
|
mGlobalObjectRef = nsnull;
|
2009-05-07 22:19:36 +04:00
|
|
|
|
|
|
|
DestroyJSContext();
|
2007-11-02 01:51:57 +03:00
|
|
|
|
|
|
|
--sContextCount;
|
|
|
|
|
|
|
|
if (!sContextCount && sDidShutdown) {
|
|
|
|
// The last context is being deleted, and we're already in the
|
|
|
|
// process of shutting down, release the JS runtime service, and
|
|
|
|
// the security manager.
|
|
|
|
|
|
|
|
NS_IF_RELEASE(sRuntimeService);
|
|
|
|
NS_IF_RELEASE(sSecurityManager);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2009-05-07 22:19:36 +04:00
|
|
|
nsJSContext::DestroyJSContext()
|
2007-11-02 01:51:57 +03:00
|
|
|
{
|
(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 03:43:30 +03:00
|
|
|
if (!mContext)
|
|
|
|
return;
|
|
|
|
|
2001-02-02 09:05:17 +03:00
|
|
|
// Clear our entry in the JSContext, bugzilla bug 66413
|
|
|
|
::JS_SetContextPrivate(mContext, nsnull);
|
|
|
|
|
2000-09-02 05:58:51 +04:00
|
|
|
// Unregister our "javascript.options.*" pref-changed callback.
|
2011-05-29 03:42:57 +04:00
|
|
|
Preferences::UnregisterCallback(JSOptionChangedCallback,
|
|
|
|
js_options_dot_str, this);
|
2000-09-02 05:58:51 +04:00
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
PRBool do_gc = mGCOnDestruction && !sGCTimer;
|
2001-10-31 11:39:09 +03:00
|
|
|
|
2001-08-15 08:49:09 +04:00
|
|
|
// Let xpconnect destroy the JSContext when it thinks the time is right.
|
2004-09-01 20:50:12 +04:00
|
|
|
nsIXPConnect *xpc = nsContentUtils::XPConnect();
|
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 21:42:36 +04:00
|
|
|
if (xpc) {
|
2001-11-27 12:46:38 +03:00
|
|
|
xpc->ReleaseJSContext(mContext, !do_gc);
|
2009-05-07 22:19:36 +04:00
|
|
|
} else if (do_gc) {
|
2009-05-16 18:16:55 +04:00
|
|
|
::JS_DestroyContext(mContext);
|
2009-05-07 22:19:36 +04:00
|
|
|
} else {
|
|
|
|
::JS_DestroyContextNoGC(mContext);
|
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 21:42:36 +04:00
|
|
|
}
|
2007-11-02 01:51:57 +03:00
|
|
|
mContext = nsnull;
|
2007-05-25 12:42:08 +04:00
|
|
|
}
|
|
|
|
|
2001-11-27 12:46:38 +03:00
|
|
|
// QueryInterface implementation for nsJSContext
|
2007-03-08 14:17:16 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_CLASS(nsJSContext)
|
2010-11-08 18:02:49 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsJSContext)
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRACE_END
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsJSContext)
|
2009-05-07 22:19:36 +04:00
|
|
|
NS_ASSERTION(!tmp->mContext || tmp->mContext->outstandingRequests == 0,
|
|
|
|
"Trying to unlink a context with outstanding requests.");
|
|
|
|
tmp->mIsInitialized = PR_FALSE;
|
|
|
|
tmp->mGCOnDestruction = PR_FALSE;
|
|
|
|
tmp->DestroyJSContext();
|
2010-09-04 01:15:50 +04:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mGlobalObjectRef)
|
2007-11-02 01:51:57 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
2009-02-27 17:48:26 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsJSContext)
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_DESCRIBE(nsJSContext, tmp->GetCCRefcnt())
|
2010-09-04 01:15:50 +04:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mGlobalObjectRef)
|
2009-05-07 22:19:36 +04:00
|
|
|
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mContext");
|
2007-11-02 01:51:57 +03:00
|
|
|
nsContentUtils::XPConnect()->NoteJSContext(tmp->mContext, cb);
|
2007-03-08 14:17:16 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
|
|
|
|
2007-04-25 20:35:27 +04:00
|
|
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsJSContext)
|
2001-11-27 12:46:38 +03:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIScriptContext)
|
2010-05-18 16:28:37 +04:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIScriptContextPrincipal)
|
2001-11-27 12:46:38 +03:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIXPCScriptNotify)
|
|
|
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIScriptContext)
|
|
|
|
NS_INTERFACE_MAP_END
|
|
|
|
|
|
|
|
|
2011-03-06 14:11:31 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTING_ADDREF(nsJSContext)
|
|
|
|
NS_IMPL_CYCLE_COLLECTING_RELEASE(nsJSContext)
|
2001-11-27 12:46:38 +03:00
|
|
|
|
2009-05-07 22:19:36 +04:00
|
|
|
nsrefcnt
|
|
|
|
nsJSContext::GetCCRefcnt()
|
|
|
|
{
|
2009-05-22 22:45:26 +04:00
|
|
|
nsrefcnt refcnt = mRefCnt.get();
|
|
|
|
if (NS_LIKELY(mContext))
|
|
|
|
refcnt += mContext->outstandingRequests;
|
|
|
|
return refcnt;
|
2009-05-07 22:19:36 +04:00
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
nsresult
|
2002-03-24 03:16:18 +03:00
|
|
|
nsJSContext::EvaluateStringWithValue(const nsAString& aScript,
|
2000-03-29 05:18:21 +04:00
|
|
|
void *aScopeObject,
|
|
|
|
nsIPrincipal *aPrincipal,
|
|
|
|
const char *aURL,
|
|
|
|
PRUint32 aLineNo,
|
2006-06-13 07:07:47 +04:00
|
|
|
PRUint32 aVersion,
|
2000-03-29 05:18:21 +04:00
|
|
|
void* aRetValue,
|
|
|
|
PRBool* aIsUndefined)
|
|
|
|
{
|
2010-05-20 03:22:19 +04:00
|
|
|
NS_TIME_FUNCTION_MIN_FMT(1.0, "%s (line %d) (url: %s, line: %d)", MOZ_FUNCTION_NAME,
|
|
|
|
__LINE__, aURL, aLineNo);
|
|
|
|
|
2005-08-10 04:15:51 +04:00
|
|
|
NS_ENSURE_TRUE(mIsInitialized, NS_ERROR_NOT_INITIALIZED);
|
|
|
|
|
2000-03-29 05:18:21 +04:00
|
|
|
if (!mScriptsEnabled) {
|
2003-03-12 01:24:02 +03:00
|
|
|
if (aIsUndefined) {
|
|
|
|
*aIsUndefined = PR_TRUE;
|
|
|
|
}
|
|
|
|
|
2000-03-29 05:18:21 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult rv;
|
|
|
|
if (!aScopeObject)
|
|
|
|
aScopeObject = ::JS_GetGlobalObject(mContext);
|
|
|
|
|
|
|
|
// Safety first: get an object representing the script's principals, i.e.,
|
|
|
|
// the entities who signed this script, or the fully-qualified-domain-name
|
|
|
|
// or "codebase" from which it was loaded.
|
|
|
|
JSPrincipals *jsprin;
|
2004-04-18 04:28:47 +04:00
|
|
|
nsIPrincipal *principal = aPrincipal;
|
2005-09-06 18:51:29 +04:00
|
|
|
if (!aPrincipal) {
|
2004-02-10 01:48:53 +03:00
|
|
|
nsIScriptGlobalObject *global = GetGlobalObject();
|
2000-03-29 05:18:21 +04:00
|
|
|
if (!global)
|
|
|
|
return NS_ERROR_FAILURE;
|
2004-02-10 01:48:53 +03:00
|
|
|
nsCOMPtr<nsIScriptObjectPrincipal> objPrincipal =
|
|
|
|
do_QueryInterface(global, &rv);
|
2000-03-29 05:18:21 +04:00
|
|
|
if (NS_FAILED(rv))
|
|
|
|
return NS_ERROR_FAILURE;
|
2004-04-18 04:28:47 +04:00
|
|
|
principal = objPrincipal->GetPrincipal();
|
|
|
|
if (!principal)
|
2000-03-29 05:18:21 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2005-09-06 18:51:29 +04:00
|
|
|
|
|
|
|
principal->GetJSPrincipals(mContext, &jsprin);
|
|
|
|
|
2000-03-29 05:18:21 +04:00
|
|
|
// From here on, we must JSPRINCIPALS_DROP(jsprin) before returning...
|
|
|
|
|
|
|
|
PRBool ok = PR_FALSE;
|
2004-02-10 01:48:53 +03:00
|
|
|
|
|
|
|
rv = sSecurityManager->CanExecuteScripts(mContext, principal, &ok);
|
2000-03-29 05:18:21 +04:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
JSPRINCIPALS_DROP(mContext, jsprin);
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Push our JSContext on the current thread's context stack so JS called
|
|
|
|
// from native code via XPConnect uses the right context. Do this whether
|
|
|
|
// or not the SecurityManager said "ok", in order to simplify control flow
|
|
|
|
// below where we pop before returning.
|
2003-06-25 01:09:57 +04:00
|
|
|
nsCOMPtr<nsIJSContextStack> stack =
|
2001-07-25 11:54:28 +04:00
|
|
|
do_GetService("@mozilla.org/js/xpc/ContextStack;1", &rv);
|
2000-03-29 05:18:21 +04:00
|
|
|
if (NS_FAILED(rv) || NS_FAILED(stack->Push(mContext))) {
|
|
|
|
JSPRINCIPALS_DROP(mContext, jsprin);
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
jsval val;
|
|
|
|
|
2010-07-23 03:35:58 +04:00
|
|
|
rv = sSecurityManager->PushContextPrincipal(mContext, nsnull, principal);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2005-06-09 19:42:19 +04:00
|
|
|
nsJSContext::TerminationFuncHolder holder(this);
|
2000-03-29 05:18:21 +04:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// SecurityManager said "ok", but don't compile if aVersion is unknown.
|
2008-02-16 08:13:16 +03:00
|
|
|
// Since the caller is responsible for parsing the version strings, we just
|
2006-06-13 07:07:47 +04:00
|
|
|
// check it isn't JSVERSION_UNKNOWN.
|
|
|
|
if (ok && ((JSVersion)aVersion) != JSVERSION_UNKNOWN) {
|
2008-02-16 08:13:16 +03:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
JSAutoRequest ar(mContext);
|
2000-03-29 05:18:21 +04:00
|
|
|
|
2010-09-28 02:55:15 +04:00
|
|
|
JSAutoEnterCompartment ac;
|
|
|
|
if (!ac.enter(mContext, (JSObject *)aScopeObject)) {
|
2010-07-20 00:36:49 +04:00
|
|
|
JSPRINCIPALS_DROP(mContext, jsprin);
|
|
|
|
stack->Pop(nsnull);
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2009-11-20 02:11:44 +03:00
|
|
|
++mExecuteDepth;
|
|
|
|
|
2010-09-13 20:38:22 +04:00
|
|
|
ok = ::JS_EvaluateUCScriptForPrincipalsVersion(mContext,
|
|
|
|
(JSObject *)aScopeObject,
|
|
|
|
jsprin,
|
|
|
|
(jschar*)PromiseFlatString(aScript).get(),
|
|
|
|
aScript.Length(),
|
|
|
|
aURL,
|
|
|
|
aLineNo,
|
|
|
|
&val,
|
|
|
|
JSVersion(aVersion));
|
2009-05-20 06:11:01 +04:00
|
|
|
|
2009-11-20 02:11:44 +03:00
|
|
|
--mExecuteDepth;
|
|
|
|
|
2009-05-20 06:11:01 +04:00
|
|
|
if (!ok) {
|
|
|
|
// Tell XPConnect about any pending exceptions. This is needed
|
|
|
|
// to avoid dropping JS exceptions in case we got here through
|
|
|
|
// nested calls through XPConnect.
|
|
|
|
|
|
|
|
ReportPendingException();
|
|
|
|
}
|
2000-03-29 05:18:21 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
// Whew! Finally done with these manually ref-counted things.
|
|
|
|
JSPRINCIPALS_DROP(mContext, jsprin);
|
|
|
|
|
|
|
|
// If all went well, convert val to a string (XXXbe unless undefined?).
|
|
|
|
if (ok) {
|
2003-03-12 01:24:02 +03:00
|
|
|
if (aIsUndefined) {
|
|
|
|
*aIsUndefined = JSVAL_IS_VOID(val);
|
|
|
|
}
|
|
|
|
|
2007-07-08 11:08:04 +04:00
|
|
|
*static_cast<jsval*>(aRetValue) = val;
|
2006-06-13 07:07:47 +04:00
|
|
|
// XXX - nsScriptObjectHolder should be used once this method moves to
|
|
|
|
// the new world order. However, use of 'jsval' appears to make this
|
|
|
|
// tricky...
|
2000-03-29 05:18:21 +04:00
|
|
|
}
|
|
|
|
else {
|
2003-03-12 01:24:02 +03:00
|
|
|
if (aIsUndefined) {
|
|
|
|
*aIsUndefined = PR_TRUE;
|
|
|
|
}
|
2000-03-29 05:18:21 +04:00
|
|
|
}
|
|
|
|
|
2010-07-23 03:35:58 +04:00
|
|
|
sSecurityManager->PopContextPrincipal(mContext);
|
|
|
|
|
2000-03-29 05:18:21 +04:00
|
|
|
// Pop here, after JS_ValueToString and any other possible evaluation.
|
|
|
|
if (NS_FAILED(stack->Pop(nsnull)))
|
|
|
|
rv = NS_ERROR_FAILURE;
|
|
|
|
|
2005-06-09 19:42:19 +04:00
|
|
|
// ScriptEvaluated needs to come after we pop the stack
|
|
|
|
ScriptEvaluated(PR_TRUE);
|
|
|
|
|
2000-03-29 05:18:21 +04:00
|
|
|
return rv;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2003-05-13 02:23:52 +04:00
|
|
|
// Helper function to convert a jsval to an nsAString, and set
|
|
|
|
// exception flags if the conversion fails.
|
|
|
|
static nsresult
|
|
|
|
JSValueToAString(JSContext *cx, jsval val, nsAString *result,
|
|
|
|
PRBool *isUndefined)
|
|
|
|
{
|
|
|
|
if (isUndefined) {
|
|
|
|
*isUndefined = JSVAL_IS_VOID(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!result) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
JSString* jsstring = ::JS_ValueToString(cx, val);
|
2010-12-03 11:24:17 +03:00
|
|
|
if (!jsstring) {
|
|
|
|
goto error;
|
|
|
|
}
|
2003-05-13 02:23:52 +04:00
|
|
|
|
2010-12-03 11:24:17 +03:00
|
|
|
size_t length;
|
|
|
|
const jschar *chars;
|
|
|
|
chars = ::JS_GetStringCharsAndLength(cx, jsstring, &length);
|
|
|
|
if (!chars) {
|
|
|
|
goto error;
|
|
|
|
}
|
2003-05-13 02:23:52 +04:00
|
|
|
|
2010-12-03 11:24:17 +03:00
|
|
|
result->Assign(chars, length);
|
|
|
|
return NS_OK;
|
2003-05-13 02:23:52 +04:00
|
|
|
|
2010-12-03 11:24:17 +03:00
|
|
|
error:
|
|
|
|
// We failed to convert val to a string. We're either OOM, or the
|
|
|
|
// security manager denied access to .toString(), or somesuch, on
|
|
|
|
// an object. Treat this case as if the result were undefined.
|
2003-05-13 02:23:52 +04:00
|
|
|
|
2010-12-03 11:24:17 +03:00
|
|
|
result->Truncate();
|
|
|
|
|
|
|
|
if (isUndefined) {
|
|
|
|
*isUndefined = PR_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!::JS_IsExceptionPending(cx)) {
|
|
|
|
// JS_ValueToString()/JS_GetStringCharsAndLength returned null w/o an
|
|
|
|
// exception pending. That means we're OOM.
|
|
|
|
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
2003-05-13 02:23:52 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2010-05-18 16:28:37 +04:00
|
|
|
nsIScriptObjectPrincipal*
|
|
|
|
nsJSContext::GetObjectPrincipal()
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIScriptObjectPrincipal> prin = do_QueryInterface(GetGlobalObject());
|
|
|
|
return prin;
|
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
nsresult
|
2002-03-24 03:16:18 +03:00
|
|
|
nsJSContext::EvaluateString(const nsAString& aScript,
|
1999-12-08 01:14:17 +03:00
|
|
|
void *aScopeObject,
|
1999-11-12 09:08:14 +03:00
|
|
|
nsIPrincipal *aPrincipal,
|
1999-09-16 00:58:41 +04:00
|
|
|
const char *aURL,
|
|
|
|
PRUint32 aLineNo,
|
2006-06-13 07:07:47 +04:00
|
|
|
PRUint32 aVersion,
|
2004-06-11 04:48:00 +04:00
|
|
|
nsAString *aRetValue,
|
1999-09-16 00:58:41 +04:00
|
|
|
PRBool* aIsUndefined)
|
|
|
|
{
|
2010-05-20 03:22:19 +04:00
|
|
|
NS_TIME_FUNCTION_MIN_FMT(1.0, "%s (line %d) (url: %s, line: %d)", MOZ_FUNCTION_NAME,
|
|
|
|
__LINE__, aURL, aLineNo);
|
|
|
|
|
2005-08-10 04:15:51 +04:00
|
|
|
NS_ENSURE_TRUE(mIsInitialized, NS_ERROR_NOT_INITIALIZED);
|
|
|
|
|
2000-03-28 04:15:56 +04:00
|
|
|
if (!mScriptsEnabled) {
|
2009-04-30 03:48:35 +04:00
|
|
|
if (aIsUndefined) {
|
|
|
|
*aIsUndefined = PR_TRUE;
|
|
|
|
}
|
2004-06-11 04:48:00 +04:00
|
|
|
|
|
|
|
if (aRetValue) {
|
|
|
|
aRetValue->Truncate();
|
|
|
|
}
|
|
|
|
|
2000-03-28 04:15:56 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
1999-08-30 01:58:42 +04:00
|
|
|
nsresult rv;
|
1999-12-08 01:14:17 +03:00
|
|
|
if (!aScopeObject)
|
2000-01-08 03:24:24 +03:00
|
|
|
aScopeObject = ::JS_GetGlobalObject(mContext);
|
(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 03:43:30 +03:00
|
|
|
|
|
|
|
// Safety first: get an object representing the script's principals, i.e.,
|
|
|
|
// the entities who signed this script, or the fully-qualified-domain-name
|
|
|
|
// or "codebase" from which it was loaded.
|
1999-08-30 01:58:42 +04:00
|
|
|
JSPrincipals *jsprin;
|
2004-04-18 04:28:47 +04:00
|
|
|
nsIPrincipal *principal = aPrincipal;
|
1999-11-12 09:08:14 +03:00
|
|
|
if (aPrincipal) {
|
2003-11-03 07:26:55 +03:00
|
|
|
aPrincipal->GetJSPrincipals(mContext, &jsprin);
|
(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 03:43:30 +03:00
|
|
|
}
|
|
|
|
else {
|
2004-02-18 05:17:32 +03:00
|
|
|
nsCOMPtr<nsIScriptObjectPrincipal> objPrincipal =
|
|
|
|
do_QueryInterface(GetGlobalObject(), &rv);
|
(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 03:43:30 +03:00
|
|
|
if (NS_FAILED(rv))
|
1999-09-18 00:13:52 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
2004-04-18 04:28:47 +04:00
|
|
|
principal = objPrincipal->GetPrincipal();
|
|
|
|
if (!principal)
|
(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 03:43:30 +03:00
|
|
|
return NS_ERROR_FAILURE;
|
2003-11-03 07:26:55 +03:00
|
|
|
principal->GetJSPrincipals(mContext, &jsprin);
|
1999-09-18 00:13:52 +04:00
|
|
|
}
|
2004-02-18 05:17:32 +03:00
|
|
|
|
(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 03:43:30 +03:00
|
|
|
// From here on, we must JSPRINCIPALS_DROP(jsprin) before returning...
|
|
|
|
|
|
|
|
PRBool ok = PR_FALSE;
|
2004-02-10 01:48:53 +03:00
|
|
|
|
|
|
|
rv = sSecurityManager->CanExecuteScripts(mContext, principal, &ok);
|
(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 03:43:30 +03:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
JSPRINCIPALS_DROP(mContext, jsprin);
|
1999-09-18 00:13:52 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
(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 03:43:30 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Push our JSContext on the current thread's context stack so JS called
|
|
|
|
// from native code via XPConnect uses the right context. Do this whether
|
|
|
|
// or not the SecurityManager said "ok", in order to simplify control flow
|
|
|
|
// below where we pop before returning.
|
2003-06-25 01:09:57 +04:00
|
|
|
nsCOMPtr<nsIJSContextStack> stack =
|
2001-07-25 11:54:28 +04:00
|
|
|
do_GetService("@mozilla.org/js/xpc/ContextStack;1", &rv);
|
(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 03:43:30 +03:00
|
|
|
if (NS_FAILED(rv) || NS_FAILED(stack->Push(mContext))) {
|
|
|
|
JSPRINCIPALS_DROP(mContext, jsprin);
|
1999-09-18 00:13:52 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
(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 03:43:30 +03:00
|
|
|
|
2008-01-06 04:20:16 +03:00
|
|
|
// The result of evaluation, used only if there were no errors. This need
|
2008-01-10 18:39:02 +03:00
|
|
|
// not be a GC root currently, provided we run the GC only from the
|
|
|
|
// operation callback or from ScriptEvaluated.
|
2008-07-27 03:17:12 +04:00
|
|
|
jsval val = JSVAL_VOID;
|
|
|
|
jsval* vp = aRetValue ? &val : NULL;
|
(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 03:43:30 +03:00
|
|
|
|
2010-07-23 03:35:58 +04:00
|
|
|
rv = sSecurityManager->PushContextPrincipal(mContext, nsnull, principal);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2005-06-09 19:42:19 +04:00
|
|
|
nsJSContext::TerminationFuncHolder holder(this);
|
(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 03:43:30 +03:00
|
|
|
|
2009-11-20 02:11:44 +03:00
|
|
|
++mExecuteDepth;
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// SecurityManager said "ok", but don't compile if aVersion is unknown.
|
2008-02-16 08:13:16 +03:00
|
|
|
// Since the caller is responsible for parsing the version strings, we just
|
2006-06-13 07:07:47 +04:00
|
|
|
// check it isn't JSVERSION_UNKNOWN.
|
|
|
|
if (ok && ((JSVersion)aVersion) != JSVERSION_UNKNOWN) {
|
|
|
|
JSAutoRequest ar(mContext);
|
2010-09-28 02:55:15 +04:00
|
|
|
JSAutoEnterCompartment ac;
|
|
|
|
if (!ac.enter(mContext, (JSObject *)aScopeObject)) {
|
2010-07-20 00:36:49 +04:00
|
|
|
stack->Pop(nsnull);
|
|
|
|
JSPRINCIPALS_DROP(mContext, jsprin);
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2010-09-13 20:38:22 +04:00
|
|
|
ok = ::JS_EvaluateUCScriptForPrincipalsVersion(mContext,
|
|
|
|
(JSObject *)aScopeObject,
|
|
|
|
jsprin,
|
|
|
|
(jschar*)PromiseFlatString(aScript).get(),
|
|
|
|
aScript.Length(),
|
|
|
|
aURL,
|
|
|
|
aLineNo,
|
|
|
|
vp,
|
|
|
|
JSVersion(aVersion));
|
2003-11-21 22:48:35 +03:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
if (!ok) {
|
2008-04-09 10:37:25 +04:00
|
|
|
// Tell XPConnect about any pending exceptions. This is needed
|
|
|
|
// to avoid dropping JS exceptions in case we got here through
|
|
|
|
// nested calls through XPConnect.
|
2003-12-03 01:14:48 +03:00
|
|
|
|
2009-05-20 06:11:01 +04:00
|
|
|
ReportPendingException();
|
(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 03:43:30 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Whew! Finally done with these manually ref-counted things.
|
1999-08-30 01:58:42 +04:00
|
|
|
JSPRINCIPALS_DROP(mContext, jsprin);
|
(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 03:43:30 +03:00
|
|
|
|
2008-07-27 03:17:12 +04:00
|
|
|
// If all went well, convert val to a string if one is wanted.
|
(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 03:43:30 +03:00
|
|
|
if (ok) {
|
2006-06-13 02:39:55 +04:00
|
|
|
JSAutoRequest ar(mContext);
|
2010-10-11 02:35:51 +04:00
|
|
|
JSAutoEnterCompartment ac;
|
|
|
|
if (!ac.enter(mContext, (JSObject *)aScopeObject)) {
|
|
|
|
stack->Pop(nsnull);
|
|
|
|
}
|
2004-06-11 04:48:00 +04:00
|
|
|
rv = JSValueToAString(mContext, val, aRetValue, aIsUndefined);
|
1999-08-20 00:36:31 +04:00
|
|
|
}
|
|
|
|
else {
|
2003-03-12 01:24:02 +03:00
|
|
|
if (aIsUndefined) {
|
|
|
|
*aIsUndefined = PR_TRUE;
|
|
|
|
}
|
|
|
|
|
2004-06-11 04:48:00 +04:00
|
|
|
if (aRetValue) {
|
|
|
|
aRetValue->Truncate();
|
|
|
|
}
|
1999-08-20 00:36:31 +04:00
|
|
|
}
|
(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 03:43:30 +03:00
|
|
|
|
2009-11-20 02:11:44 +03:00
|
|
|
--mExecuteDepth;
|
|
|
|
|
2010-07-23 03:35:58 +04:00
|
|
|
sSecurityManager->PopContextPrincipal(mContext);
|
|
|
|
|
(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 03:43:30 +03:00
|
|
|
// Pop here, after JS_ValueToString and any other possible evaluation.
|
|
|
|
if (NS_FAILED(stack->Pop(nsnull)))
|
1999-11-12 09:08:14 +03:00
|
|
|
rv = NS_ERROR_FAILURE;
|
|
|
|
|
2005-06-09 19:42:19 +04:00
|
|
|
// ScriptEvaluated needs to come after we pop the stack
|
|
|
|
ScriptEvaluated(PR_TRUE);
|
|
|
|
|
1999-11-12 09:08:14 +03:00
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
nsresult
|
1999-11-12 09:08:14 +03:00
|
|
|
nsJSContext::CompileScript(const PRUnichar* aText,
|
|
|
|
PRInt32 aTextLength,
|
|
|
|
void *aScopeObject,
|
|
|
|
nsIPrincipal *aPrincipal,
|
|
|
|
const char *aURL,
|
|
|
|
PRUint32 aLineNo,
|
2006-06-13 07:07:47 +04:00
|
|
|
PRUint32 aVersion,
|
|
|
|
nsScriptObjectHolder &aScriptObject)
|
1999-11-12 09:08:14 +03:00
|
|
|
{
|
2005-08-10 04:15:51 +04:00
|
|
|
NS_ENSURE_TRUE(mIsInitialized, NS_ERROR_NOT_INITIALIZED);
|
|
|
|
|
1999-11-12 09:08:14 +03:00
|
|
|
nsresult rv;
|
|
|
|
NS_ENSURE_ARG_POINTER(aPrincipal);
|
|
|
|
|
|
|
|
if (!aScopeObject)
|
2000-01-08 03:24:24 +03:00
|
|
|
aScopeObject = ::JS_GetGlobalObject(mContext);
|
1999-11-12 09:08:14 +03:00
|
|
|
|
|
|
|
JSPrincipals *jsprin;
|
2003-11-03 07:26:55 +03:00
|
|
|
aPrincipal->GetJSPrincipals(mContext, &jsprin);
|
1999-11-12 09:08:14 +03:00
|
|
|
// From here on, we must JSPRINCIPALS_DROP(jsprin) before returning...
|
|
|
|
|
|
|
|
PRBool ok = PR_FALSE;
|
2004-02-10 01:48:53 +03:00
|
|
|
|
|
|
|
rv = sSecurityManager->CanExecuteScripts(mContext, aPrincipal, &ok);
|
1999-11-12 09:08:14 +03:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
JSPRINCIPALS_DROP(mContext, jsprin);
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
aScriptObject.drop(); // ensure old object not used on failure...
|
2006-06-13 02:39:55 +04:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// SecurityManager said "ok", but don't compile if aVersion is unknown.
|
2008-02-16 08:13:16 +03:00
|
|
|
// Since the caller is responsible for parsing the version strings, we just
|
2006-06-13 07:07:47 +04:00
|
|
|
// check it isn't JSVERSION_UNKNOWN.
|
|
|
|
if (ok && ((JSVersion)aVersion) != JSVERSION_UNKNOWN) {
|
|
|
|
JSAutoRequest ar(mContext);
|
1999-11-12 09:08:14 +03:00
|
|
|
|
2011-02-03 16:06:21 +03:00
|
|
|
JSObject* scriptObj =
|
2010-09-13 20:38:22 +04:00
|
|
|
::JS_CompileUCScriptForPrincipalsVersion(mContext,
|
|
|
|
(JSObject *)aScopeObject,
|
|
|
|
jsprin,
|
|
|
|
(jschar*) aText,
|
|
|
|
aTextLength,
|
|
|
|
aURL,
|
|
|
|
aLineNo,
|
|
|
|
JSVersion(aVersion));
|
2011-02-03 16:06:21 +03:00
|
|
|
if (scriptObj) {
|
|
|
|
NS_ASSERTION(aScriptObject.getScriptTypeID()==JAVASCRIPT,
|
|
|
|
"Expecting JS script object holder");
|
|
|
|
rv = aScriptObject.set(scriptObj);
|
2008-02-16 08:13:16 +03:00
|
|
|
} else {
|
2006-06-13 07:07:47 +04:00
|
|
|
rv = NS_ERROR_OUT_OF_MEMORY;
|
1999-11-12 09:08:14 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// Whew! Finally done.
|
1999-11-12 09:08:14 +03:00
|
|
|
JSPRINCIPALS_DROP(mContext, jsprin);
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
nsresult
|
2006-06-13 07:07:47 +04:00
|
|
|
nsJSContext::ExecuteScript(void *aScriptObject,
|
1999-11-12 09:08:14 +03:00
|
|
|
void *aScopeObject,
|
2002-03-24 03:16:18 +03:00
|
|
|
nsAString* aRetValue,
|
1999-11-12 09:08:14 +03:00
|
|
|
PRBool* aIsUndefined)
|
|
|
|
{
|
2005-08-10 04:15:51 +04:00
|
|
|
NS_ENSURE_TRUE(mIsInitialized, NS_ERROR_NOT_INITIALIZED);
|
|
|
|
|
2000-03-28 04:15:56 +04:00
|
|
|
if (!mScriptsEnabled) {
|
2003-03-12 01:24:02 +03:00
|
|
|
if (aIsUndefined) {
|
2000-11-09 07:35:38 +03:00
|
|
|
*aIsUndefined = PR_TRUE;
|
2003-03-12 01:24:02 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (aRetValue) {
|
2000-09-28 03:08:09 +04:00
|
|
|
aRetValue->Truncate();
|
2003-03-12 01:24:02 +03:00
|
|
|
}
|
|
|
|
|
2000-03-28 04:15:56 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
1999-11-12 09:08:14 +03:00
|
|
|
nsresult rv;
|
|
|
|
|
|
|
|
if (!aScopeObject)
|
2000-01-08 03:24:24 +03:00
|
|
|
aScopeObject = ::JS_GetGlobalObject(mContext);
|
1999-11-12 09:08:14 +03:00
|
|
|
|
|
|
|
// Push our JSContext on our thread's context stack, in case native code
|
|
|
|
// called from JS calls back into JS via XPConnect.
|
2003-06-25 01:09:57 +04:00
|
|
|
nsCOMPtr<nsIJSContextStack> stack =
|
2001-07-25 11:54:28 +04:00
|
|
|
do_GetService("@mozilla.org/js/xpc/ContextStack;1", &rv);
|
1999-11-12 09:08:14 +03:00
|
|
|
if (NS_FAILED(rv) || NS_FAILED(stack->Push(mContext))) {
|
1999-08-30 01:58:42 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
1999-11-12 09:08:14 +03:00
|
|
|
}
|
|
|
|
|
2008-01-06 04:20:16 +03:00
|
|
|
// The result of evaluation, used only if there were no errors. This need
|
2008-01-10 18:39:02 +03:00
|
|
|
// not be a GC root currently, provided we run the GC only from the
|
|
|
|
// operation callback or from ScriptEvaluated.
|
1999-11-12 09:08:14 +03:00
|
|
|
jsval val;
|
|
|
|
JSBool ok;
|
|
|
|
|
2010-07-23 04:04:31 +04:00
|
|
|
JSObject *scriptObj = (JSObject*)aScriptObject;
|
|
|
|
nsCOMPtr<nsIPrincipal> principal;
|
|
|
|
|
|
|
|
rv = sSecurityManager->GetObjectPrincipal(mContext, scriptObj, getter_AddRefs(principal));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2010-07-23 03:35:58 +04:00
|
|
|
rv = sSecurityManager->PushContextPrincipal(mContext, nsnull, principal);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2005-06-09 19:42:19 +04:00
|
|
|
nsJSContext::TerminationFuncHolder holder(this);
|
2006-06-13 02:39:55 +04:00
|
|
|
JSAutoRequest ar(mContext);
|
2009-11-20 02:11:44 +03:00
|
|
|
++mExecuteDepth;
|
2011-02-03 16:06:21 +03:00
|
|
|
ok = ::JS_ExecuteScript(mContext, (JSObject *)aScopeObject, scriptObj, &val);
|
1999-11-12 09:08:14 +03:00
|
|
|
|
|
|
|
if (ok) {
|
|
|
|
// If all went well, convert val to a string (XXXbe unless undefined?).
|
2003-05-13 02:23:52 +04:00
|
|
|
rv = JSValueToAString(mContext, val, aRetValue, aIsUndefined);
|
1999-11-12 09:08:14 +03:00
|
|
|
} else {
|
2011-07-31 02:32:00 +04:00
|
|
|
ReportPendingException();
|
|
|
|
|
2003-03-12 01:24:02 +03:00
|
|
|
if (aIsUndefined) {
|
1999-11-12 09:08:14 +03:00
|
|
|
*aIsUndefined = PR_TRUE;
|
2003-03-12 01:24:02 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (aRetValue) {
|
1999-11-12 09:08:14 +03:00
|
|
|
aRetValue->Truncate();
|
2003-03-12 01:24:02 +03:00
|
|
|
}
|
1999-11-12 09:08:14 +03:00
|
|
|
}
|
|
|
|
|
2009-11-20 02:11:44 +03:00
|
|
|
--mExecuteDepth;
|
|
|
|
|
2010-07-23 03:35:58 +04:00
|
|
|
sSecurityManager->PopContextPrincipal(mContext);
|
|
|
|
|
1999-11-12 09:08:14 +03:00
|
|
|
// Pop here, after JS_ValueToString and any other possible evaluation.
|
|
|
|
if (NS_FAILED(stack->Pop(nsnull)))
|
|
|
|
rv = NS_ERROR_FAILURE;
|
1999-08-30 01:58:42 +04:00
|
|
|
|
2005-06-09 19:42:19 +04:00
|
|
|
// ScriptEvaluated needs to come after we pop the stack
|
|
|
|
ScriptEvaluated(PR_TRUE);
|
|
|
|
|
1999-11-12 09:08:14 +03:00
|
|
|
return rv;
|
1998-07-16 05:16:47 +04:00
|
|
|
}
|
|
|
|
|
(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 03:43:30 +03:00
|
|
|
|
2010-03-08 18:45:00 +03:00
|
|
|
#ifdef DEBUG
|
|
|
|
PRBool
|
|
|
|
AtomIsEventHandlerName(nsIAtom *aName)
|
1999-12-03 06:40:30 +03:00
|
|
|
{
|
2010-03-08 18:45:00 +03:00
|
|
|
const PRUnichar *name = aName->GetUTF16String();
|
1999-12-03 06:40:30 +03:00
|
|
|
|
2010-03-08 18:45:00 +03:00
|
|
|
const PRUnichar *cp;
|
|
|
|
PRUnichar c;
|
2003-07-01 09:11:46 +04:00
|
|
|
for (cp = name; *cp != '\0'; ++cp)
|
|
|
|
{
|
|
|
|
c = *cp;
|
2010-03-08 18:45:00 +03:00
|
|
|
if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z'))
|
|
|
|
return PR_FALSE;
|
2003-07-01 09:11:46 +04:00
|
|
|
}
|
1999-12-03 06:40:30 +03:00
|
|
|
|
2010-03-08 18:45:00 +03:00
|
|
|
return PR_TRUE;
|
1999-12-03 06:40:30 +03:00
|
|
|
}
|
2010-03-08 18:45:00 +03:00
|
|
|
#endif
|
1999-12-03 06:40:30 +03:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// Helper function to find the JSObject associated with a (presumably DOM)
|
|
|
|
// interface.
|
2004-02-10 01:48:53 +03:00
|
|
|
nsresult
|
2006-06-13 07:07:47 +04:00
|
|
|
nsJSContext::JSObjectFromInterface(nsISupports* aTarget, void *aScope, JSObject **aRet)
|
|
|
|
{
|
2009-05-21 12:17:51 +04:00
|
|
|
// It is legal to specify a null target.
|
|
|
|
if (!aTarget) {
|
2006-06-13 07:07:47 +04:00
|
|
|
*aRet = nsnull;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2009-05-21 12:17:51 +04:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// Get the jsobject associated with this target
|
2009-05-21 12:17:51 +04:00
|
|
|
// We don't wrap here because we trust the JS engine to wrap the target
|
|
|
|
// later.
|
2006-06-13 07:07:47 +04:00
|
|
|
nsresult rv;
|
2009-05-13 00:20:42 +04:00
|
|
|
jsval v;
|
2009-08-14 23:00:24 +04:00
|
|
|
rv = nsContentUtils::WrapNative(mContext, (JSObject *)aScope, aTarget, &v);
|
2006-06-13 07:07:47 +04:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2009-05-13 00:20:42 +04:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
#ifdef NS_DEBUG
|
|
|
|
nsCOMPtr<nsISupports> targetSupp = do_QueryInterface(aTarget);
|
2009-05-13 00:20:42 +04:00
|
|
|
nsCOMPtr<nsISupports> native =
|
|
|
|
nsContentUtils::XPConnect()->GetNativeOfWrapper(mContext,
|
|
|
|
JSVAL_TO_OBJECT(v));
|
|
|
|
NS_ASSERTION(native == targetSupp, "Native should be the target!");
|
2006-06-13 07:07:47 +04:00
|
|
|
#endif
|
2009-05-13 00:20:42 +04:00
|
|
|
|
|
|
|
*aRet = JSVAL_TO_OBJECT(v);
|
|
|
|
|
|
|
|
return NS_OK;
|
2006-06-13 07:07:47 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsJSContext::CompileEventHandler(nsIAtom *aName,
|
|
|
|
PRUint32 aArgCount,
|
|
|
|
const char** aArgNames,
|
2002-03-24 03:16:18 +03:00
|
|
|
const nsAString& aBody,
|
2003-07-12 02:54:36 +04:00
|
|
|
const char *aURL, PRUint32 aLineNo,
|
2008-02-16 08:13:16 +03:00
|
|
|
PRUint32 aVersion,
|
2006-06-13 07:07:47 +04:00
|
|
|
nsScriptObjectHolder &aHandler)
|
(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 03:43:30 +03:00
|
|
|
{
|
2010-05-20 03:22:19 +04:00
|
|
|
NS_TIME_FUNCTION_MIN_FMT(1.0, "%s (line %d) (url: %s, line: %d)", MOZ_FUNCTION_NAME,
|
|
|
|
__LINE__, aURL, aLineNo);
|
|
|
|
|
2005-08-10 04:15:51 +04:00
|
|
|
NS_ENSURE_TRUE(mIsInitialized, NS_ERROR_NOT_INITIALIZED);
|
|
|
|
|
2010-03-08 18:45:00 +03:00
|
|
|
NS_PRECONDITION(AtomIsEventHandlerName(aName), "Bad event name");
|
2008-12-03 17:41:09 +03:00
|
|
|
NS_PRECONDITION(!::JS_IsExceptionPending(mContext),
|
|
|
|
"Why are we being called with a pending exception?");
|
|
|
|
|
2003-04-18 00:21:00 +04:00
|
|
|
if (!sSecurityManager) {
|
|
|
|
NS_ERROR("Huh, we need a script security manager to compile "
|
|
|
|
"an event handler!");
|
|
|
|
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
}
|
|
|
|
|
2008-02-16 08:13:16 +03:00
|
|
|
// Don't compile if aVersion is unknown. Since the caller is responsible for
|
|
|
|
// parsing the version strings, we just check it isn't JSVERSION_UNKNOWN.
|
|
|
|
if ((JSVersion)aVersion == JSVERSION_UNKNOWN) {
|
|
|
|
return NS_ERROR_ILLEGAL_VALUE;
|
|
|
|
}
|
|
|
|
|
2009-03-15 06:42:50 +03:00
|
|
|
#ifdef DEBUG
|
|
|
|
JSContext* top = nsContentUtils::GetCurrentJSContext();
|
|
|
|
NS_ASSERTION(mContext == top, "Context not properly pushed!");
|
|
|
|
#endif
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// Event handlers are always shared, and must be bound before use.
|
|
|
|
// Therefore we never bother compiling with principals.
|
|
|
|
// (that probably means we should avoid JS_CompileUCFunctionForPrincipals!)
|
2006-06-13 02:39:55 +04:00
|
|
|
JSAutoRequest ar(mContext);
|
2008-02-16 08:13:16 +03:00
|
|
|
|
1999-12-08 01:14:17 +03:00
|
|
|
JSFunction* fun =
|
2010-09-13 20:38:22 +04:00
|
|
|
::JS_CompileUCFunctionForPrincipalsVersion(mContext,
|
|
|
|
nsnull, nsnull,
|
|
|
|
nsAtomCString(aName).get(), aArgCount, aArgNames,
|
|
|
|
(jschar*)PromiseFlatString(aBody).get(),
|
|
|
|
aBody.Length(),
|
|
|
|
aURL, aLineNo, JSVersion(aVersion));
|
(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 03:43:30 +03:00
|
|
|
|
2003-04-18 00:21:00 +04:00
|
|
|
if (!fun) {
|
2009-05-20 06:11:01 +04:00
|
|
|
ReportPendingException();
|
2007-07-06 05:38:54 +04:00
|
|
|
return NS_ERROR_ILLEGAL_VALUE;
|
2003-04-18 00:21:00 +04:00
|
|
|
}
|
1999-12-17 03:08:28 +03:00
|
|
|
|
2000-01-08 03:24:24 +03:00
|
|
|
JSObject *handler = ::JS_GetFunctionObject(fun);
|
2006-06-13 07:07:47 +04:00
|
|
|
NS_ASSERTION(aHandler.getScriptTypeID()==JAVASCRIPT,
|
|
|
|
"Expecting JS script object holder");
|
|
|
|
return aHandler.set((void *)handler);
|
(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 03:43:30 +03:00
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// XXX - note that CompileFunction doesn't yet play the nsScriptObjectHolder
|
|
|
|
// game - caller must still ensure JS GC root.
|
2004-02-10 01:48:53 +03:00
|
|
|
nsresult
|
2000-03-29 05:18:21 +04:00
|
|
|
nsJSContext::CompileFunction(void* aTarget,
|
2003-06-24 05:20:40 +04:00
|
|
|
const nsACString& aName,
|
2000-03-29 05:18:21 +04:00
|
|
|
PRUint32 aArgCount,
|
|
|
|
const char** aArgArray,
|
2002-03-24 03:16:18 +03:00
|
|
|
const nsAString& aBody,
|
2000-03-29 05:18:21 +04:00
|
|
|
const char* aURL,
|
|
|
|
PRUint32 aLineNo,
|
2008-02-16 08:13:16 +03:00
|
|
|
PRUint32 aVersion,
|
2000-03-29 05:18:21 +04:00
|
|
|
PRBool aShared,
|
|
|
|
void** aFunctionObject)
|
|
|
|
{
|
2010-05-20 03:22:19 +04:00
|
|
|
NS_TIME_FUNCTION_FMT(1.0, "%s (line %d) (function: %s, url: %s, line: %d)", MOZ_FUNCTION_NAME,
|
|
|
|
__LINE__, aName.BeginReading(), aURL, aLineNo);
|
|
|
|
|
2005-08-10 04:15:51 +04:00
|
|
|
NS_ENSURE_TRUE(mIsInitialized, NS_ERROR_NOT_INITIALIZED);
|
|
|
|
|
2008-02-16 08:13:16 +03:00
|
|
|
// Don't compile if aVersion is unknown. Since the caller is responsible for
|
|
|
|
// parsing the version strings, we just check it isn't JSVERSION_UNKNOWN.
|
|
|
|
if ((JSVersion)aVersion == JSVERSION_UNKNOWN) {
|
|
|
|
return NS_ERROR_ILLEGAL_VALUE;
|
|
|
|
}
|
|
|
|
|
2000-03-29 05:18:21 +04:00
|
|
|
JSPrincipals *jsprin = nsnull;
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
nsIScriptGlobalObject *global = GetGlobalObject();
|
2000-03-29 05:18:21 +04:00
|
|
|
if (global) {
|
|
|
|
// XXXbe why the two-step QI? speed up via a new GetGlobalObjectData func?
|
|
|
|
nsCOMPtr<nsIScriptObjectPrincipal> globalData = do_QueryInterface(global);
|
|
|
|
if (globalData) {
|
2004-04-18 04:28:47 +04:00
|
|
|
nsIPrincipal *prin = globalData->GetPrincipal();
|
|
|
|
if (!prin)
|
2000-03-29 05:18:21 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
2003-11-03 07:26:55 +03:00
|
|
|
prin->GetJSPrincipals(mContext, &jsprin);
|
2000-03-29 05:18:21 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
JSObject *target = (JSObject*)aTarget;
|
2006-06-13 02:39:55 +04:00
|
|
|
|
|
|
|
JSAutoRequest ar(mContext);
|
|
|
|
|
2000-03-29 05:18:21 +04:00
|
|
|
JSFunction* fun =
|
2010-09-13 20:38:22 +04:00
|
|
|
::JS_CompileUCFunctionForPrincipalsVersion(mContext,
|
|
|
|
aShared ? nsnull : target, jsprin,
|
|
|
|
PromiseFlatCString(aName).get(),
|
|
|
|
aArgCount, aArgArray,
|
|
|
|
(jschar*)PromiseFlatString(aBody).get(),
|
|
|
|
aBody.Length(),
|
|
|
|
aURL, aLineNo,
|
|
|
|
JSVersion(aVersion));
|
2000-03-29 05:18:21 +04:00
|
|
|
|
|
|
|
if (jsprin)
|
|
|
|
JSPRINCIPALS_DROP(mContext, jsprin);
|
|
|
|
if (!fun)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
JSObject *handler = ::JS_GetFunctionObject(fun);
|
|
|
|
if (aFunctionObject)
|
|
|
|
*aFunctionObject = (void*) handler;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
nsresult
|
2006-06-13 07:07:47 +04:00
|
|
|
nsJSContext::CallEventHandler(nsISupports* aTarget, void *aScope, void *aHandler,
|
|
|
|
nsIArray *aargv, nsIVariant **arv)
|
1999-09-18 00:13:52 +04:00
|
|
|
{
|
2005-08-10 04:15:51 +04:00
|
|
|
NS_ENSURE_TRUE(mIsInitialized, NS_ERROR_NOT_INITIALIZED);
|
|
|
|
|
2002-01-24 16:25:46 +03:00
|
|
|
if (!mScriptsEnabled) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2007-07-27 02:20:29 +04:00
|
|
|
|
2010-11-08 15:17:31 +03:00
|
|
|
#ifdef NS_FUNCTION_TIMER
|
|
|
|
{
|
|
|
|
JSObject *obj = static_cast<JSObject *>(aHandler);
|
2011-07-07 22:30:43 +04:00
|
|
|
if (obj->isFunctionProxy())
|
|
|
|
obj = obj->unwrap(NULL);
|
|
|
|
JSString *id = JS_GetFunctionId(GET_FUNCTION_PRIVATE(mContext, obj));
|
2010-11-08 15:17:31 +03:00
|
|
|
JSAutoByteString bytes;
|
|
|
|
const char *name = !id ? "anonymous" : bytes.encode(mContext, id) ? bytes.ptr() : "<error>";
|
|
|
|
NS_TIME_FUNCTION_FMT(1.0, "%s (line %d) (function: %s)", MOZ_FUNCTION_NAME, __LINE__, name);
|
|
|
|
}
|
|
|
|
#endif
|
2010-05-20 03:22:19 +04:00
|
|
|
|
2010-07-23 15:33:15 +04:00
|
|
|
JSAutoRequest ar(mContext);
|
2006-06-20 04:38:46 +04:00
|
|
|
JSObject* target = nsnull;
|
2009-04-17 17:13:08 +04:00
|
|
|
nsresult rv = JSObjectFromInterface(aTarget, aScope, &target);
|
2006-06-13 07:07:47 +04:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2010-03-30 09:51:52 +04:00
|
|
|
js::AutoObjectRooter targetVal(mContext, target);
|
2006-06-13 07:07:47 +04:00
|
|
|
jsval rval = JSVAL_VOID;
|
2002-01-24 16:25:46 +03:00
|
|
|
|
(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 03:43:30 +03:00
|
|
|
// This one's a lot easier than EvaluateString because we don't have to
|
|
|
|
// hassle with principals: they're already compiled into the JS function.
|
2006-06-13 07:07:47 +04:00
|
|
|
// xxxmarkh - this comment is no longer true - principals are not used at
|
|
|
|
// all now, and never were in some cases.
|
(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 03:43:30 +03:00
|
|
|
|
2010-12-28 22:21:30 +03:00
|
|
|
nsCxPusher pusher;
|
|
|
|
if (!pusher.Push(mContext, PR_TRUE))
|
1999-09-18 00:13:52 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2000-06-21 04:21:50 +04:00
|
|
|
// check if the event handler can be run on the object in question
|
2006-06-13 07:07:47 +04:00
|
|
|
rv = sSecurityManager->CheckFunctionAccess(mContext, aHandler, target);
|
2000-06-21 04:21:50 +04:00
|
|
|
|
2005-06-09 19:42:19 +04:00
|
|
|
nsJSContext::TerminationFuncHolder holder(this);
|
|
|
|
|
2003-12-21 21:01:19 +03:00
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2006-06-13 07:07:47 +04:00
|
|
|
// Convert args to jsvals.
|
|
|
|
PRUint32 argc = 0;
|
|
|
|
jsval *argv = nsnull;
|
2006-06-13 02:39:55 +04:00
|
|
|
|
2010-12-28 22:21:30 +03:00
|
|
|
JSObject *funobj = static_cast<JSObject *>(aHandler);
|
|
|
|
nsCOMPtr<nsIPrincipal> principal;
|
|
|
|
rv = sSecurityManager->GetObjectPrincipal(mContext, funobj,
|
|
|
|
getter_AddRefs(principal));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2008-07-27 03:17:12 +04:00
|
|
|
|
2010-12-28 22:21:30 +03:00
|
|
|
JSStackFrame *currentfp = nsnull;
|
|
|
|
rv = sSecurityManager->PushContextPrincipal(mContext,
|
|
|
|
JS_FrameIterator(mContext, ¤tfp),
|
|
|
|
principal);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
jsval funval = OBJECT_TO_JSVAL(funobj);
|
2010-09-28 02:55:15 +04:00
|
|
|
JSAutoEnterCompartment ac;
|
2011-05-03 02:47:10 +04:00
|
|
|
js::ForceFrame ff(mContext, funobj);
|
|
|
|
if (!ac.enter(mContext, funobj) || !ff.enter() ||
|
|
|
|
!JS_WrapObject(mContext, &target)) {
|
2010-12-28 22:21:30 +03:00
|
|
|
sSecurityManager->PopContextPrincipal(mContext);
|
2010-07-20 00:36:49 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2011-04-29 02:48:52 +04:00
|
|
|
Maybe<nsAutoPoolRelease> poolRelease;
|
|
|
|
Maybe<js::AutoArrayRooter> tvr;
|
2011-01-22 02:25:04 +03:00
|
|
|
|
|
|
|
// Use |target| as the scope for wrapping the arguments, since aScope is
|
|
|
|
// the safe scope in many cases, which isn't very useful. Wrapping aTarget
|
|
|
|
// was OK because those typically have PreCreate methods that give them the
|
|
|
|
// right scope anyway, and we want to make sure that the arguments end up
|
|
|
|
// in the same scope as aTarget.
|
|
|
|
rv = ConvertSupportsTojsvals(aargv, target, &argc,
|
|
|
|
&argv, poolRelease, tvr);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2009-11-20 02:11:44 +03:00
|
|
|
++mExecuteDepth;
|
2006-06-13 07:07:47 +04:00
|
|
|
PRBool ok = ::JS_CallFunctionValue(mContext, target,
|
|
|
|
funval, argc, argv, &rval);
|
2009-11-20 02:11:44 +03:00
|
|
|
--mExecuteDepth;
|
2003-11-21 22:48:35 +03:00
|
|
|
|
2004-02-11 09:09:51 +03:00
|
|
|
if (!ok) {
|
|
|
|
// Don't pass back results from failed calls.
|
2006-06-13 07:07:47 +04:00
|
|
|
rval = JSVAL_VOID;
|
2004-02-20 23:46:22 +03:00
|
|
|
|
|
|
|
// Tell the caller that the handler threw an error.
|
|
|
|
rv = NS_ERROR_FAILURE;
|
2011-04-09 01:28:24 +04:00
|
|
|
} else if (rval == JSVAL_NULL) {
|
|
|
|
*arv = nsnull;
|
|
|
|
} else if (!JS_WrapValue(mContext, &rval)) {
|
|
|
|
rv = NS_ERROR_FAILURE;
|
|
|
|
} else {
|
|
|
|
rv = nsContentUtils::XPConnect()->JSToVariant(mContext, rval, arv);
|
2003-11-21 22:48:35 +03:00
|
|
|
}
|
2010-12-28 22:21:30 +03:00
|
|
|
|
2011-04-09 01:28:24 +04:00
|
|
|
// Tell XPConnect about any pending exceptions. This is needed
|
|
|
|
// to avoid dropping JS exceptions in case we got here through
|
|
|
|
// nested calls through XPConnect.
|
|
|
|
if (NS_FAILED(rv))
|
|
|
|
ReportPendingException();
|
|
|
|
|
2010-12-28 22:21:30 +03:00
|
|
|
sSecurityManager->PopContextPrincipal(mContext);
|
2000-06-21 04:21:50 +04:00
|
|
|
}
|
(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 03:43:30 +03:00
|
|
|
|
2010-12-28 22:21:30 +03:00
|
|
|
pusher.Pop();
|
1999-09-18 00:13:52 +04:00
|
|
|
|
2005-06-09 19:42:19 +04:00
|
|
|
// ScriptEvaluated needs to come after we pop the stack
|
|
|
|
ScriptEvaluated(PR_TRUE);
|
|
|
|
|
2004-02-20 23:46:22 +03:00
|
|
|
return rv;
|
1999-09-18 00:13:52 +04:00
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
nsresult
|
2006-06-13 07:07:47 +04:00
|
|
|
nsJSContext::BindCompiledEventHandler(nsISupports* aTarget, void *aScope,
|
2011-08-24 23:49:25 +04:00
|
|
|
void *aHandler,
|
|
|
|
nsScriptObjectHolder& aBoundHandler)
|
1999-12-03 06:40:30 +03:00
|
|
|
{
|
2006-06-13 07:07:47 +04:00
|
|
|
NS_ENSURE_ARG(aHandler);
|
2005-08-10 04:15:51 +04:00
|
|
|
NS_ENSURE_TRUE(mIsInitialized, NS_ERROR_NOT_INITIALIZED);
|
2011-08-24 23:49:25 +04:00
|
|
|
NS_PRECONDITION(!aBoundHandler, "Shouldn't already have a bound handler!");
|
2010-11-26 17:11:14 +03:00
|
|
|
|
|
|
|
JSAutoRequest ar(mContext);
|
2006-06-13 07:07:47 +04:00
|
|
|
|
|
|
|
// Get the jsobject associated with this target
|
2006-06-20 04:38:46 +04:00
|
|
|
JSObject *target = nsnull;
|
2010-11-26 17:11:14 +03:00
|
|
|
nsresult rv = JSObjectFromInterface(aTarget, aScope, &target);
|
2006-06-13 07:07:47 +04:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
1999-12-03 06:40:30 +03:00
|
|
|
|
1999-12-08 01:14:17 +03:00
|
|
|
JSObject *funobj = (JSObject*) aHandler;
|
1999-12-06 11:27:03 +03:00
|
|
|
|
2010-09-23 04:34:20 +04:00
|
|
|
#ifdef DEBUG
|
|
|
|
{
|
|
|
|
JSAutoEnterCompartment ac;
|
|
|
|
if (!ac.enter(mContext, funobj)) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_ASSERTION(JS_TypeOfValue(mContext,
|
|
|
|
OBJECT_TO_JSVAL(funobj)) == JSTYPE_FUNCTION,
|
|
|
|
"Event handler object not a function");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
JSAutoEnterCompartment ac;
|
|
|
|
if (!ac.enter(mContext, target)) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2005-08-18 23:41:44 +04:00
|
|
|
|
1999-12-06 11:27:03 +03:00
|
|
|
// Make sure the handler function is parented by its event target object
|
2006-06-13 07:07:47 +04:00
|
|
|
if (funobj) { // && ::JS_GetParent(mContext, funobj) != target) {
|
2000-01-08 03:24:24 +03:00
|
|
|
funobj = ::JS_CloneFunctionObject(mContext, funobj, target);
|
1999-12-06 11:27:03 +03:00
|
|
|
if (!funobj)
|
2005-08-18 23:41:44 +04:00
|
|
|
rv = NS_ERROR_OUT_OF_MEMORY;
|
1999-12-06 11:27:03 +03:00
|
|
|
}
|
|
|
|
|
2011-08-24 23:49:25 +04:00
|
|
|
aBoundHandler.set(funobj);
|
2005-08-18 23:41:44 +04:00
|
|
|
|
|
|
|
return rv;
|
1999-12-03 06:40:30 +03:00
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// serialization
|
|
|
|
nsresult
|
|
|
|
nsJSContext::Serialize(nsIObjectOutputStream* aStream, void *aScriptObject)
|
|
|
|
{
|
|
|
|
JSObject *mJSObject = (JSObject *)aScriptObject;
|
|
|
|
if (!mJSObject)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsresult rv;
|
|
|
|
|
|
|
|
JSContext* cx = mContext;
|
|
|
|
JSXDRState *xdr = ::JS_XDRNewMem(cx, JSXDR_ENCODE);
|
|
|
|
if (! xdr)
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
xdr->userdata = (void*) aStream;
|
|
|
|
|
|
|
|
JSAutoRequest ar(cx);
|
2011-02-03 16:06:21 +03:00
|
|
|
if (! ::JS_XDRScriptObject(xdr, &mJSObject)) {
|
2006-06-13 07:07:47 +04:00
|
|
|
rv = NS_ERROR_FAILURE; // likely to be a principals serialization error
|
|
|
|
} else {
|
|
|
|
// Get the encoded JSXDRState data and write it. The JSXDRState owns
|
|
|
|
// this buffer memory and will free it beneath ::JS_XDRDestroy.
|
|
|
|
//
|
|
|
|
// If an XPCOM object needs to be written in the midst of the JS XDR
|
|
|
|
// encoding process, the C++ code called back from the JS engine (e.g.,
|
|
|
|
// nsEncodeJSPrincipals in caps/src/nsJSPrincipals.cpp) will flush data
|
|
|
|
// from the JSXDRState to aStream, then write the object, then return
|
|
|
|
// to JS XDR code with xdr reset so new JS data is encoded at the front
|
|
|
|
// of the xdr's data buffer.
|
|
|
|
//
|
|
|
|
// However many XPCOM objects are interleaved with JS XDR data in the
|
|
|
|
// stream, when control returns here from ::JS_XDRScript, we'll have
|
|
|
|
// one last buffer of data to write to aStream.
|
|
|
|
|
|
|
|
uint32 size;
|
2007-07-08 11:08:04 +04:00
|
|
|
const char* data = reinterpret_cast<const char*>
|
|
|
|
(::JS_XDRMemGetData(xdr, &size));
|
2006-06-13 07:07:47 +04:00
|
|
|
NS_ASSERTION(data, "no decoded JSXDRState data!");
|
|
|
|
|
|
|
|
rv = aStream->Write32(size);
|
|
|
|
if (NS_SUCCEEDED(rv))
|
|
|
|
rv = aStream->WriteBytes(data, size);
|
|
|
|
}
|
|
|
|
|
|
|
|
::JS_XDRDestroy(xdr);
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsJSContext::Deserialize(nsIObjectInputStream* aStream,
|
|
|
|
nsScriptObjectHolder &aResult)
|
|
|
|
{
|
|
|
|
JSObject *result = nsnull;
|
|
|
|
nsresult rv;
|
|
|
|
|
2010-05-20 03:22:19 +04:00
|
|
|
NS_TIME_FUNCTION_MIN(1.0);
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
PRUint32 size;
|
|
|
|
rv = aStream->Read32(&size);
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
char* data;
|
|
|
|
rv = aStream->ReadBytes(size, &data);
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
JSContext* cx = mContext;
|
|
|
|
|
|
|
|
JSXDRState *xdr = ::JS_XDRNewMem(cx, JSXDR_DECODE);
|
|
|
|
if (! xdr) {
|
|
|
|
rv = NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
} else {
|
|
|
|
xdr->userdata = (void*) aStream;
|
|
|
|
JSAutoRequest ar(cx);
|
|
|
|
::JS_XDRMemSetData(xdr, data, size);
|
|
|
|
|
2011-02-03 16:06:21 +03:00
|
|
|
if (! ::JS_XDRScriptObject(xdr, &result)) {
|
2006-06-13 07:07:47 +04:00
|
|
|
rv = NS_ERROR_FAILURE; // principals deserialization error?
|
|
|
|
}
|
|
|
|
|
|
|
|
// Update data in case ::JS_XDRScript called back into C++ code to
|
|
|
|
// read an XPCOM object.
|
|
|
|
//
|
|
|
|
// In that case, the serialization process must have flushed a run
|
|
|
|
// of counted bytes containing JS data at the point where the XPCOM
|
|
|
|
// object starts, after which an encoding C++ callback from the JS
|
|
|
|
// XDR code must have written the XPCOM object directly into the
|
|
|
|
// nsIObjectOutputStream.
|
|
|
|
//
|
|
|
|
// The deserialization process will XDR-decode counted bytes up to
|
|
|
|
// but not including the XPCOM object, then call back into C++ to
|
|
|
|
// read the object, then read more counted bytes and hand them off
|
|
|
|
// to the JSXDRState, so more JS data can be decoded.
|
|
|
|
//
|
|
|
|
// This interleaving of JS XDR data and XPCOM object data may occur
|
|
|
|
// several times beneath the call to ::JS_XDRScript, above. At the
|
|
|
|
// end of the day, we need to free (via nsMemory) the data owned by
|
|
|
|
// the JSXDRState. So we steal it back, nulling xdr's buffer so it
|
|
|
|
// doesn't get passed to ::JS_free by ::JS_XDRDestroy.
|
|
|
|
|
|
|
|
uint32 junk;
|
|
|
|
data = (char*) ::JS_XDRMemGetData(xdr, &junk);
|
|
|
|
if (data)
|
|
|
|
::JS_XDRMemSetData(xdr, NULL, 0);
|
|
|
|
::JS_XDRDestroy(xdr);
|
|
|
|
}
|
|
|
|
|
|
|
|
// If data is null now, it must have been freed while deserializing an
|
|
|
|
// XPCOM object (e.g., a principal) beneath ::JS_XDRScript.
|
|
|
|
if (data)
|
|
|
|
nsMemory::Free(data);
|
|
|
|
NS_ASSERTION(aResult.getScriptTypeID()==JAVASCRIPT,
|
|
|
|
"Expecting JS script object holder");
|
2007-07-21 07:22:24 +04:00
|
|
|
|
|
|
|
// Now that we've cleaned up, handle the case when rv is a failure
|
|
|
|
// code, which could happen for all sorts of reasons above.
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2008-07-27 03:17:12 +04:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
return aResult.set(result);
|
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
void
|
2006-06-13 07:07:47 +04:00
|
|
|
nsJSContext::SetDefaultLanguageVersion(PRUint32 aVersion)
|
(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 03:43:30 +03:00
|
|
|
{
|
2006-06-13 07:07:47 +04:00
|
|
|
::JS_SetVersion(mContext, (JSVersion)aVersion);
|
(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 03:43:30 +03:00
|
|
|
}
|
1999-09-18 00:13:52 +04:00
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
nsIScriptGlobalObject *
|
|
|
|
nsJSContext::GetGlobalObject()
|
1998-07-16 05:16:47 +04:00
|
|
|
{
|
2000-01-08 03:24:24 +03:00
|
|
|
JSObject *global = ::JS_GetGlobalObject(mContext);
|
(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 03:43:30 +03:00
|
|
|
|
2001-05-26 11:44:19 +04:00
|
|
|
if (!global) {
|
2010-09-18 01:54:40 +04:00
|
|
|
return nsnull;
|
|
|
|
}
|
|
|
|
|
2011-04-29 00:28:54 +04:00
|
|
|
if (mGlobalObjectRef)
|
|
|
|
return mGlobalObjectRef;
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
{
|
|
|
|
JSObject *inner = global;
|
|
|
|
OBJ_TO_INNER_OBJECT(mContext, inner);
|
|
|
|
|
|
|
|
// If this assertion hits then it means that we have a window object as
|
|
|
|
// our global, but we never called CreateOuterObject.
|
|
|
|
NS_ASSERTION(inner == global, "Shouldn't be able to innerize here");
|
2001-05-26 11:44:19 +04:00
|
|
|
}
|
2011-04-29 00:28:54 +04:00
|
|
|
#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 21:42:36 +04:00
|
|
|
|
2001-05-26 11:44:19 +04:00
|
|
|
JSClass *c = JS_GET_CLASS(mContext, global);
|
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 21:42:36 +04:00
|
|
|
|
2001-05-26 11:44:19 +04:00
|
|
|
if (!c || ((~c->flags) & (JSCLASS_HAS_PRIVATE |
|
|
|
|
JSCLASS_PRIVATE_IS_NSISUPPORTS))) {
|
2004-02-10 01:48:53 +03:00
|
|
|
return nsnull;
|
2001-05-26 11:44:19 +04: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 21:42:36 +04:00
|
|
|
|
2011-02-02 02:45:46 +03:00
|
|
|
nsISupports *priv = (nsISupports *)global->getPrivate();
|
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 21:42:36 +04:00
|
|
|
|
2001-05-26 11:44:19 +04:00
|
|
|
nsCOMPtr<nsIXPConnectWrappedNative> wrapped_native =
|
2004-02-10 01:48:53 +03:00
|
|
|
do_QueryInterface(priv);
|
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 21:42:36 +04:00
|
|
|
|
2011-02-02 02:45:46 +03:00
|
|
|
nsCOMPtr<nsIScriptGlobalObject> sgo;
|
2001-05-26 11:44:19 +04:00
|
|
|
if (wrapped_native) {
|
|
|
|
// The global object is a XPConnect wrapped native, the native in
|
|
|
|
// the wrapper might be the nsIScriptGlobalObject
|
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 21:42:36 +04:00
|
|
|
|
2005-03-10 03:39:28 +03:00
|
|
|
sgo = do_QueryWrappedNative(wrapped_native);
|
2004-02-10 01:48:53 +03:00
|
|
|
} else {
|
|
|
|
sgo = do_QueryInterface(priv);
|
|
|
|
}
|
2001-06-20 07:27:48 +04:00
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
// This'll return a pointer to something we're about to release, but
|
|
|
|
// that's ok, the JS object will hold it alive long enough.
|
2011-04-29 00:28:54 +04:00
|
|
|
return sgo;
|
1998-07-16 05:16:47 +04:00
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
void *
|
|
|
|
nsJSContext::GetNativeGlobal()
|
|
|
|
{
|
|
|
|
return ::JS_GetGlobalObject(mContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsJSContext::CreateNativeGlobalForInner(
|
|
|
|
nsIScriptGlobalObject *aNewInner,
|
|
|
|
PRBool aIsChrome,
|
2010-07-20 00:36:49 +04:00
|
|
|
nsIPrincipal *aPrincipal,
|
2006-06-13 07:07:47 +04:00
|
|
|
void **aNativeGlobal, nsISupports **aHolder)
|
|
|
|
{
|
|
|
|
nsIXPConnect *xpc = nsContentUtils::XPConnect();
|
|
|
|
PRUint32 flags = aIsChrome? nsIXPConnect::FLAG_SYSTEM_GLOBAL_OBJECT : 0;
|
|
|
|
nsCOMPtr<nsIXPConnectJSObjectHolder> jsholder;
|
2010-09-18 01:54:41 +04:00
|
|
|
|
|
|
|
nsCOMPtr<nsIPrincipal> systemPrincipal;
|
|
|
|
if (aIsChrome) {
|
|
|
|
nsIScriptSecurityManager *ssm = nsContentUtils::GetSecurityManager();
|
|
|
|
ssm->GetSystemPrincipal(getter_AddRefs(systemPrincipal));
|
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
nsresult rv = xpc->
|
|
|
|
InitClassesWithNewWrappedGlobal(mContext,
|
|
|
|
aNewInner, NS_GET_IID(nsISupports),
|
2010-09-18 01:54:41 +04:00
|
|
|
aIsChrome ? systemPrincipal.get() : aPrincipal,
|
2010-10-27 10:57:31 +04:00
|
|
|
nsnull, flags,
|
2006-06-13 07:07:47 +04:00
|
|
|
getter_AddRefs(jsholder));
|
|
|
|
if (NS_FAILED(rv))
|
|
|
|
return rv;
|
2007-07-08 11:08:04 +04:00
|
|
|
jsholder->GetJSObject(reinterpret_cast<JSObject **>(aNativeGlobal));
|
2006-06-13 07:07:47 +04:00
|
|
|
*aHolder = jsholder.get();
|
|
|
|
NS_ADDREF(*aHolder);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsJSContext::ConnectToInner(nsIScriptGlobalObject *aNewInner, void *aOuterGlobal)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG(aNewInner);
|
2011-04-11 08:48:17 +04:00
|
|
|
#ifdef DEBUG
|
2006-06-13 07:07:47 +04:00
|
|
|
JSObject *newInnerJSObject = (JSObject *)aNewInner->GetScriptGlobal(JAVASCRIPT);
|
2011-04-11 08:48:17 +04:00
|
|
|
#endif
|
2010-08-11 02:00:26 +04:00
|
|
|
JSObject *outerGlobal = (JSObject *)aOuterGlobal;
|
2006-06-13 07:07:47 +04:00
|
|
|
|
2010-09-25 05:00:58 +04:00
|
|
|
// Now that we're connecting the outer global to the inner one,
|
|
|
|
// we must have transplanted it. The JS engine tries to maintain
|
|
|
|
// the global object's compartment as its default compartment,
|
|
|
|
// so update that now since it might have changed.
|
|
|
|
JS_SetGlobalObject(mContext, outerGlobal);
|
2010-12-23 03:41:01 +03:00
|
|
|
NS_ASSERTION(JS_GetPrototype(mContext, outerGlobal) ==
|
|
|
|
JS_GetPrototype(mContext, newInnerJSObject),
|
|
|
|
"outer and inner globals should have the same prototype");
|
2010-08-11 02:00:26 +04:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
void *
|
1998-12-21 19:51:10 +03:00
|
|
|
nsJSContext::GetNativeContext()
|
1998-07-16 05:16:47 +04:00
|
|
|
{
|
2004-02-10 01:48:53 +03:00
|
|
|
return mContext;
|
1998-07-16 05:16:47 +04:00
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
nsresult
|
2010-07-16 02:16:29 +04:00
|
|
|
nsJSContext::InitContext()
|
1998-07-16 05:16:47 +04:00
|
|
|
{
|
2005-08-10 04:15:51 +04:00
|
|
|
// Make sure callers of this use
|
|
|
|
// WillInitializeContext/DidInitializeContext around this call.
|
|
|
|
NS_ENSURE_TRUE(!mIsInitialized, NS_ERROR_ALREADY_INITIALIZED);
|
|
|
|
|
(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 03:43:30 +03:00
|
|
|
if (!mContext)
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
|
2001-05-18 11:25:56 +04:00
|
|
|
::JS_SetErrorReporter(mContext, NS_ScriptErrorReporter);
|
|
|
|
|
2010-07-16 02:16:29 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
(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 03:43:30 +03:00
|
|
|
|
2010-07-16 02:16:29 +04:00
|
|
|
nsresult
|
2010-07-20 00:36:49 +04:00
|
|
|
nsJSContext::CreateOuterObject(nsIScriptGlobalObject *aGlobalObject,
|
2010-08-11 02:00:26 +04:00
|
|
|
nsIScriptGlobalObject *aCurrentInner)
|
2010-07-16 02:16:29 +04:00
|
|
|
{
|
2010-09-04 01:15:50 +04:00
|
|
|
mGlobalObjectRef = aGlobalObject;
|
|
|
|
|
2010-07-16 02:16:29 +04:00
|
|
|
nsCOMPtr<nsIDOMChromeWindow> chromeWindow(do_QueryInterface(aGlobalObject));
|
|
|
|
PRUint32 flags = 0;
|
2001-10-31 11:39:09 +03:00
|
|
|
|
2010-07-16 02:16:29 +04:00
|
|
|
if (chromeWindow) {
|
|
|
|
// Flag this window's global object and objects under it as "system",
|
|
|
|
// for optional automated XPCNativeWrapper construction when chrome JS
|
|
|
|
// views a content DOM.
|
|
|
|
flags = nsIXPConnect::FLAG_SYSTEM_GLOBAL_OBJECT;
|
(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 03:43:30 +03:00
|
|
|
|
2010-07-16 02:16:29 +04:00
|
|
|
// Always enable E4X for XUL and other chrome content -- there is no
|
|
|
|
// need to preserve the <!-- script hiding hack from JS-in-HTML daze
|
|
|
|
// (introduced in 1995 for graceful script degradation in Netscape 1,
|
|
|
|
// Mosaic, and other pre-JS browsers).
|
2010-08-11 02:00:26 +04:00
|
|
|
JS_SetOptions(mContext, JS_GetOptions(mContext) | JSOPTION_XML);
|
2010-07-16 02:16:29 +04:00
|
|
|
}
|
2007-11-13 13:35:49 +03:00
|
|
|
|
2010-09-18 01:54:40 +04:00
|
|
|
JSObject *outer =
|
|
|
|
NS_NewOuterWindowProxy(mContext, aCurrentInner->GetGlobalJSObject());
|
|
|
|
if (!outer) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return SetOuterObject(outer);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsJSContext::SetOuterObject(void *aOuterObject)
|
|
|
|
{
|
|
|
|
JSObject *outer = static_cast<JSObject *>(aOuterObject);
|
|
|
|
|
2010-08-11 02:00:26 +04:00
|
|
|
// Force our context's global object to be the outer.
|
2010-09-18 01:54:40 +04:00
|
|
|
JS_SetGlobalObject(mContext, outer);
|
2010-12-23 03:41:01 +03:00
|
|
|
|
|
|
|
// NB: JS_SetGlobalObject sets mContext->compartment.
|
|
|
|
JSObject *inner = JS_GetParent(mContext, outer);
|
|
|
|
|
|
|
|
nsIXPConnect *xpc = nsContentUtils::XPConnect();
|
|
|
|
nsCOMPtr<nsIXPConnectWrappedNative> wrapper;
|
|
|
|
nsresult rv = xpc->GetWrappedNativeOfJSObject(mContext, inner,
|
|
|
|
getter_AddRefs(wrapper));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
NS_ABORT_IF_FALSE(wrapper, "bad wrapper");
|
|
|
|
|
|
|
|
wrapper->RefreshPrototype();
|
|
|
|
JS_SetPrototype(mContext, outer, JS_GetPrototype(mContext, inner));
|
|
|
|
|
2010-07-16 02:16:29 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2005-07-29 19:11:08 +04:00
|
|
|
|
2010-07-16 02:16:29 +04:00
|
|
|
nsresult
|
|
|
|
nsJSContext::InitOuterWindow()
|
|
|
|
{
|
|
|
|
JSObject *global = JS_GetGlobalObject(mContext);
|
2010-09-25 05:00:58 +04:00
|
|
|
OBJ_TO_INNER_OBJECT(mContext, global);
|
2005-07-31 00:57:07 +04:00
|
|
|
|
2010-09-18 01:54:40 +04:00
|
|
|
nsresult rv = InitClasses(global); // this will complete global object initialization
|
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 21:42:36 +04:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2010-07-16 02:16:29 +04:00
|
|
|
return NS_OK;
|
1998-07-16 05:16:47 +04:00
|
|
|
}
|
|
|
|
|
1998-12-31 00:35:35 +03:00
|
|
|
nsresult
|
|
|
|
nsJSContext::InitializeExternalClasses()
|
|
|
|
{
|
2007-11-13 13:35:49 +03:00
|
|
|
nsScriptNameSpaceManager *nameSpaceManager = nsJSRuntime::GetNameSpaceManager();
|
|
|
|
NS_ENSURE_TRUE(nameSpaceManager, 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 21:42:36 +04:00
|
|
|
|
2007-11-13 13:35:49 +03:00
|
|
|
return nameSpaceManager->InitForContext(this);
|
1998-12-31 00:35:35 +03:00
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
nsresult
|
|
|
|
nsJSContext::SetProperty(void *aTarget, const char *aPropName, nsISupports *aArgs)
|
|
|
|
{
|
|
|
|
PRUint32 argc;
|
|
|
|
jsval *argv = nsnull;
|
|
|
|
|
|
|
|
JSAutoRequest ar(mContext);
|
2007-07-26 21:52:26 +04:00
|
|
|
|
2011-04-29 02:48:52 +04:00
|
|
|
Maybe<nsAutoPoolRelease> poolRelease;
|
|
|
|
Maybe<js::AutoArrayRooter> tvr;
|
2010-01-25 19:48:07 +03:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
nsresult rv;
|
|
|
|
rv = ConvertSupportsTojsvals(aArgs, GetNativeGlobal(), &argc,
|
2010-01-25 19:48:07 +03:00
|
|
|
&argv, poolRelease, tvr);
|
2006-06-13 07:07:47 +04:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2007-07-26 21:52:26 +04:00
|
|
|
jsval vargs;
|
|
|
|
|
|
|
|
// got the arguments, now attach them.
|
|
|
|
|
|
|
|
// window.dialogArguments is supposed to be an array if a JS array
|
|
|
|
// was passed to showModalDialog(), deal with that here.
|
2007-08-02 02:38:44 +04:00
|
|
|
if (strcmp(aPropName, "dialogArguments") == 0 && argc <= 1) {
|
|
|
|
vargs = argc ? argv[0] : JSVAL_VOID;
|
2007-07-26 21:52:26 +04:00
|
|
|
} else {
|
2010-09-28 07:40:27 +04:00
|
|
|
for (PRUint32 i = 0; i < argc; ++i) {
|
|
|
|
if (!JS_WrapValue(mContext, &argv[i])) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-07-26 21:52:26 +04:00
|
|
|
JSObject *args = ::JS_NewArrayObject(mContext, argc, argv);
|
|
|
|
vargs = OBJECT_TO_JSVAL(args);
|
|
|
|
}
|
2006-06-13 07:07:47 +04:00
|
|
|
|
2007-07-26 21:52:26 +04:00
|
|
|
// Make sure to use JS_DefineProperty here so that we can override
|
|
|
|
// readonly XPConnect properties here as well (read dialogArguments).
|
|
|
|
rv = ::JS_DefineProperty(mContext, reinterpret_cast<JSObject *>(aTarget),
|
|
|
|
aPropName, vargs, nsnull, nsnull, 0) ?
|
2006-06-13 07:07:47 +04:00
|
|
|
NS_OK : NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsJSContext::ConvertSupportsTojsvals(nsISupports *aArgs,
|
|
|
|
void *aScope,
|
2010-01-25 19:48:07 +03:00
|
|
|
PRUint32 *aArgc,
|
|
|
|
jsval **aArgv,
|
2011-04-29 02:48:52 +04:00
|
|
|
Maybe<nsAutoPoolRelease> &aPoolRelease,
|
|
|
|
Maybe<js::AutoArrayRooter> &aRooter)
|
2006-06-13 07:07:47 +04:00
|
|
|
{
|
|
|
|
nsresult rv = NS_OK;
|
|
|
|
|
|
|
|
// If the array implements nsIJSArgArray, just grab the values directly.
|
|
|
|
nsCOMPtr<nsIJSArgArray> fastArray = do_QueryInterface(aArgs);
|
2010-01-25 19:48:07 +03:00
|
|
|
if (fastArray != nsnull)
|
|
|
|
return fastArray->GetArgs(aArgc, reinterpret_cast<void **>(aArgv));
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// Take the slower path converting each item.
|
|
|
|
// Handle only nsIArray and nsIVariant. nsIArray is only needed for
|
|
|
|
// SetProperty('arguments', ...);
|
|
|
|
|
|
|
|
*aArgv = nsnull;
|
|
|
|
*aArgc = 0;
|
|
|
|
|
|
|
|
nsIXPConnect *xpc = nsContentUtils::XPConnect();
|
|
|
|
NS_ENSURE_TRUE(xpc, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
if (!aArgs)
|
|
|
|
return NS_OK;
|
|
|
|
PRUint32 argCtr, argCount;
|
|
|
|
// This general purpose function may need to convert an arg array
|
|
|
|
// (window.arguments, event-handler args) and a generic property.
|
|
|
|
nsCOMPtr<nsIArray> argsArray(do_QueryInterface(aArgs));
|
|
|
|
|
|
|
|
if (argsArray) {
|
|
|
|
rv = argsArray->GetLength(&argCount);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
if (argCount == 0)
|
|
|
|
return NS_OK;
|
2006-06-22 02:10:35 +04:00
|
|
|
} else {
|
2006-06-13 07:07:47 +04:00
|
|
|
argCount = 1; // the nsISupports which is not an array
|
2006-06-22 02:10:35 +04:00
|
|
|
}
|
2006-06-13 07:07:47 +04:00
|
|
|
|
2010-01-25 19:48:07 +03:00
|
|
|
void *mark = JS_ARENA_MARK(&mContext->tempPool);
|
|
|
|
jsval *argv;
|
2010-02-17 22:32:47 +03:00
|
|
|
size_t nbytes = argCount * sizeof(jsval);
|
|
|
|
JS_ARENA_ALLOCATE_CAST(argv, jsval *, &mContext->tempPool, nbytes);
|
2006-06-13 07:07:47 +04:00
|
|
|
NS_ENSURE_TRUE(argv, NS_ERROR_OUT_OF_MEMORY);
|
2010-02-17 22:32:47 +03:00
|
|
|
memset(argv, 0, nbytes); /* initialize so GC-able */
|
2006-06-13 07:07:47 +04:00
|
|
|
|
2010-02-17 22:32:47 +03:00
|
|
|
// Use the caller's auto guards to release and unroot.
|
2010-01-25 19:48:07 +03:00
|
|
|
aPoolRelease.construct(&mContext->tempPool, mark);
|
|
|
|
aRooter.construct(mContext, argCount, argv);
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
if (argsArray) {
|
|
|
|
for (argCtr = 0; argCtr < argCount && NS_SUCCEEDED(rv); argCtr++) {
|
|
|
|
nsCOMPtr<nsISupports> arg;
|
|
|
|
jsval *thisval = argv + argCtr;
|
2006-06-22 02:10:35 +04:00
|
|
|
argsArray->QueryElementAt(argCtr, NS_GET_IID(nsISupports),
|
|
|
|
getter_AddRefs(arg));
|
|
|
|
if (!arg) {
|
|
|
|
*thisval = JSVAL_NULL;
|
|
|
|
continue;
|
|
|
|
}
|
2006-06-13 07:07:47 +04:00
|
|
|
nsCOMPtr<nsIVariant> variant(do_QueryInterface(arg));
|
|
|
|
if (variant != nsnull) {
|
2008-07-27 03:17:12 +04:00
|
|
|
rv = xpc->VariantToJS(mContext, (JSObject *)aScope, variant,
|
2006-06-13 07:07:47 +04:00
|
|
|
thisval);
|
|
|
|
} else {
|
|
|
|
// And finally, support the nsISupportsPrimitives supplied
|
|
|
|
// by the AppShell. It generally will pass only strings, but
|
|
|
|
// as we have code for handling all, we may as well use it.
|
|
|
|
rv = AddSupportsPrimitiveTojsvals(arg, thisval);
|
|
|
|
if (rv == NS_ERROR_NO_INTERFACE) {
|
2007-07-26 21:52:26 +04:00
|
|
|
// something else - probably an event object or similar -
|
2006-06-13 07:07:47 +04:00
|
|
|
// just wrap it.
|
|
|
|
#ifdef NS_DEBUG
|
|
|
|
// but first, check its not another nsISupportsPrimitive, as
|
|
|
|
// these are now deprecated for use with script contexts.
|
|
|
|
nsCOMPtr<nsISupportsPrimitive> prim(do_QueryInterface(arg));
|
|
|
|
NS_ASSERTION(prim == nsnull,
|
|
|
|
"Don't pass nsISupportsPrimitives - use nsIVariant!");
|
|
|
|
#endif
|
|
|
|
nsCOMPtr<nsIXPConnectJSObjectHolder> wrapper;
|
2009-08-14 23:00:24 +04:00
|
|
|
jsval v;
|
|
|
|
rv = nsContentUtils::WrapNative(mContext, (JSObject *)aScope, arg,
|
|
|
|
&v, getter_AddRefs(wrapper));
|
2006-06-13 07:07:47 +04:00
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2009-08-14 23:00:24 +04:00
|
|
|
*thisval = v;
|
2006-06-13 07:07:47 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
nsCOMPtr<nsIVariant> variant(do_QueryInterface(aArgs));
|
|
|
|
if (variant)
|
|
|
|
rv = xpc->VariantToJS(mContext, (JSObject *)aScope, variant, argv);
|
|
|
|
else {
|
|
|
|
NS_ERROR("Not an array, not an interface?");
|
|
|
|
rv = NS_ERROR_UNEXPECTED;
|
|
|
|
}
|
|
|
|
}
|
2010-01-25 19:48:07 +03:00
|
|
|
if (NS_FAILED(rv))
|
2006-06-13 07:07:47 +04:00
|
|
|
return rv;
|
|
|
|
*aArgv = argv;
|
|
|
|
*aArgc = argCount;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
// This really should go into xpconnect somewhere...
|
|
|
|
nsresult
|
|
|
|
nsJSContext::AddSupportsPrimitiveTojsvals(nsISupports *aArg, jsval *aArgv)
|
|
|
|
{
|
|
|
|
NS_PRECONDITION(aArg, "Empty arg");
|
|
|
|
|
|
|
|
nsCOMPtr<nsISupportsPrimitive> argPrimitive(do_QueryInterface(aArg));
|
|
|
|
if (!argPrimitive)
|
|
|
|
return NS_ERROR_NO_INTERFACE;
|
|
|
|
|
|
|
|
JSContext *cx = mContext;
|
|
|
|
PRUint16 type;
|
|
|
|
argPrimitive->GetType(&type);
|
|
|
|
|
|
|
|
switch(type) {
|
|
|
|
case nsISupportsPrimitive::TYPE_CSTRING : {
|
|
|
|
nsCOMPtr<nsISupportsCString> p(do_QueryInterface(argPrimitive));
|
|
|
|
NS_ENSURE_TRUE(p, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
nsCAutoString data;
|
|
|
|
|
|
|
|
p->GetData(data);
|
|
|
|
|
2008-07-27 03:17:12 +04:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
JSString *str = ::JS_NewStringCopyN(cx, data.get(), data.Length());
|
|
|
|
NS_ENSURE_TRUE(str, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
|
|
|
|
*aArgv = STRING_TO_JSVAL(str);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case nsISupportsPrimitive::TYPE_STRING : {
|
|
|
|
nsCOMPtr<nsISupportsString> p(do_QueryInterface(argPrimitive));
|
|
|
|
NS_ENSURE_TRUE(p, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
nsAutoString data;
|
|
|
|
|
|
|
|
p->GetData(data);
|
|
|
|
|
|
|
|
// cast is probably safe since wchar_t and jschar are expected
|
|
|
|
// to be equivalent; both unsigned 16-bit entities
|
|
|
|
JSString *str =
|
|
|
|
::JS_NewUCStringCopyN(cx,
|
2007-07-08 11:08:04 +04:00
|
|
|
reinterpret_cast<const jschar *>(data.get()),
|
2006-06-13 07:07:47 +04:00
|
|
|
data.Length());
|
|
|
|
NS_ENSURE_TRUE(str, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
|
|
|
|
*aArgv = STRING_TO_JSVAL(str);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case nsISupportsPrimitive::TYPE_PRBOOL : {
|
|
|
|
nsCOMPtr<nsISupportsPRBool> p(do_QueryInterface(argPrimitive));
|
|
|
|
NS_ENSURE_TRUE(p, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
PRBool data;
|
|
|
|
|
|
|
|
p->GetData(&data);
|
|
|
|
|
|
|
|
*aArgv = BOOLEAN_TO_JSVAL(data);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case nsISupportsPrimitive::TYPE_PRUINT8 : {
|
|
|
|
nsCOMPtr<nsISupportsPRUint8> p(do_QueryInterface(argPrimitive));
|
|
|
|
NS_ENSURE_TRUE(p, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
PRUint8 data;
|
|
|
|
|
|
|
|
p->GetData(&data);
|
|
|
|
|
|
|
|
*aArgv = INT_TO_JSVAL(data);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case nsISupportsPrimitive::TYPE_PRUINT16 : {
|
|
|
|
nsCOMPtr<nsISupportsPRUint16> p(do_QueryInterface(argPrimitive));
|
|
|
|
NS_ENSURE_TRUE(p, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
PRUint16 data;
|
|
|
|
|
|
|
|
p->GetData(&data);
|
|
|
|
|
|
|
|
*aArgv = INT_TO_JSVAL(data);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case nsISupportsPrimitive::TYPE_PRUINT32 : {
|
|
|
|
nsCOMPtr<nsISupportsPRUint32> p(do_QueryInterface(argPrimitive));
|
|
|
|
NS_ENSURE_TRUE(p, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
PRUint32 data;
|
|
|
|
|
|
|
|
p->GetData(&data);
|
|
|
|
|
|
|
|
*aArgv = INT_TO_JSVAL(data);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case nsISupportsPrimitive::TYPE_CHAR : {
|
|
|
|
nsCOMPtr<nsISupportsChar> p(do_QueryInterface(argPrimitive));
|
|
|
|
NS_ENSURE_TRUE(p, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
char data;
|
|
|
|
|
|
|
|
p->GetData(&data);
|
|
|
|
|
|
|
|
JSString *str = ::JS_NewStringCopyN(cx, &data, 1);
|
|
|
|
NS_ENSURE_TRUE(str, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
|
|
|
|
*aArgv = STRING_TO_JSVAL(str);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case nsISupportsPrimitive::TYPE_PRINT16 : {
|
|
|
|
nsCOMPtr<nsISupportsPRInt16> p(do_QueryInterface(argPrimitive));
|
|
|
|
NS_ENSURE_TRUE(p, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
PRInt16 data;
|
|
|
|
|
|
|
|
p->GetData(&data);
|
|
|
|
|
|
|
|
*aArgv = INT_TO_JSVAL(data);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case nsISupportsPrimitive::TYPE_PRINT32 : {
|
|
|
|
nsCOMPtr<nsISupportsPRInt32> p(do_QueryInterface(argPrimitive));
|
|
|
|
NS_ENSURE_TRUE(p, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
PRInt32 data;
|
|
|
|
|
|
|
|
p->GetData(&data);
|
|
|
|
|
|
|
|
*aArgv = INT_TO_JSVAL(data);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case nsISupportsPrimitive::TYPE_FLOAT : {
|
|
|
|
nsCOMPtr<nsISupportsFloat> p(do_QueryInterface(argPrimitive));
|
|
|
|
NS_ENSURE_TRUE(p, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
float data;
|
|
|
|
|
|
|
|
p->GetData(&data);
|
|
|
|
|
2008-07-22 00:16:47 +04:00
|
|
|
JSBool ok = ::JS_NewNumberValue(cx, data, aArgv);
|
|
|
|
NS_ENSURE_TRUE(ok, NS_ERROR_OUT_OF_MEMORY);
|
2006-06-13 07:07:47 +04:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case nsISupportsPrimitive::TYPE_DOUBLE : {
|
|
|
|
nsCOMPtr<nsISupportsDouble> p(do_QueryInterface(argPrimitive));
|
|
|
|
NS_ENSURE_TRUE(p, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
double data;
|
|
|
|
|
|
|
|
p->GetData(&data);
|
|
|
|
|
2008-07-22 00:16:47 +04:00
|
|
|
JSBool ok = ::JS_NewNumberValue(cx, data, aArgv);
|
|
|
|
NS_ENSURE_TRUE(ok, NS_ERROR_OUT_OF_MEMORY);
|
2006-06-13 07:07:47 +04:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case nsISupportsPrimitive::TYPE_INTERFACE_POINTER : {
|
|
|
|
nsCOMPtr<nsISupportsInterfacePointer> p(do_QueryInterface(argPrimitive));
|
|
|
|
NS_ENSURE_TRUE(p, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
nsCOMPtr<nsISupports> data;
|
|
|
|
nsIID *iid = nsnull;
|
|
|
|
|
|
|
|
p->GetData(getter_AddRefs(data));
|
|
|
|
p->GetDataIID(&iid);
|
|
|
|
NS_ENSURE_TRUE(iid, NS_ERROR_UNEXPECTED);
|
|
|
|
|
|
|
|
AutoFree iidGuard(iid); // Free iid upon destruction.
|
|
|
|
|
|
|
|
nsCOMPtr<nsIXPConnectJSObjectHolder> wrapper;
|
2009-08-14 23:00:24 +04:00
|
|
|
jsval v;
|
|
|
|
nsresult rv = nsContentUtils::WrapNative(cx, ::JS_GetGlobalObject(cx),
|
|
|
|
data, iid, &v,
|
|
|
|
getter_AddRefs(wrapper));
|
2006-06-13 07:07:47 +04:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2009-08-14 23:00:24 +04:00
|
|
|
*aArgv = v;
|
2006-06-13 07:07:47 +04:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case nsISupportsPrimitive::TYPE_ID :
|
|
|
|
case nsISupportsPrimitive::TYPE_PRUINT64 :
|
|
|
|
case nsISupportsPrimitive::TYPE_PRINT64 :
|
|
|
|
case nsISupportsPrimitive::TYPE_PRTIME :
|
|
|
|
case nsISupportsPrimitive::TYPE_VOID : {
|
|
|
|
NS_WARNING("Unsupported primitive type used");
|
|
|
|
*aArgv = JSVAL_NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default : {
|
|
|
|
NS_WARNING("Unknown primitive type used");
|
|
|
|
*aArgv = JSVAL_NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-04-27 08:02:22 +04:00
|
|
|
#ifdef NS_TRACE_MALLOC
|
|
|
|
|
|
|
|
#include <errno.h> // XXX assume Linux if NS_TRACE_MALLOC
|
|
|
|
#include <fcntl.h>
|
2001-01-26 01:54:05 +03:00
|
|
|
#ifdef XP_UNIX
|
2000-04-27 08:02:22 +04:00
|
|
|
#include <unistd.h>
|
2001-01-26 01:54:05 +03:00
|
|
|
#endif
|
|
|
|
#ifdef XP_WIN32
|
|
|
|
#include <io.h>
|
|
|
|
#endif
|
2000-04-27 08:02:22 +04:00
|
|
|
#include "nsTraceMalloc.h"
|
|
|
|
|
2010-10-18 06:36:25 +04:00
|
|
|
static JSBool
|
|
|
|
CheckUniversalXPConnectForTraceMalloc(JSContext *cx)
|
|
|
|
{
|
|
|
|
PRBool hasCap = PR_FALSE;
|
|
|
|
nsresult rv = nsContentUtils::GetSecurityManager()->
|
|
|
|
IsCapabilityEnabled("UniversalXPConnect", &hasCap);
|
|
|
|
if (NS_SUCCEEDED(rv) && hasCap)
|
|
|
|
return JS_TRUE;
|
|
|
|
JS_ReportError(cx, "trace-malloc functions require UniversalXPConnect");
|
|
|
|
return JS_FALSE;
|
|
|
|
}
|
|
|
|
|
2000-04-27 08:02:22 +04:00
|
|
|
static JSBool
|
2010-08-16 23:35:04 +04:00
|
|
|
TraceMallocDisable(JSContext *cx, uintN argc, jsval *vp)
|
2000-04-27 08:02:22 +04:00
|
|
|
{
|
2010-10-18 06:36:25 +04:00
|
|
|
if (!CheckUniversalXPConnectForTraceMalloc(cx))
|
|
|
|
return JS_FALSE;
|
|
|
|
|
2000-04-27 08:02:22 +04:00
|
|
|
NS_TraceMallocDisable();
|
2010-08-16 23:35:04 +04:00
|
|
|
JS_SET_RVAL(cx, vp, JSVAL_VOID);
|
2000-04-27 08:02:22 +04:00
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static JSBool
|
2010-08-16 23:35:04 +04:00
|
|
|
TraceMallocEnable(JSContext *cx, uintN argc, jsval *vp)
|
2000-04-27 08:02:22 +04:00
|
|
|
{
|
2010-10-18 06:36:25 +04:00
|
|
|
if (!CheckUniversalXPConnectForTraceMalloc(cx))
|
|
|
|
return JS_FALSE;
|
|
|
|
|
2000-04-27 08:02:22 +04:00
|
|
|
NS_TraceMallocEnable();
|
2010-08-16 23:35:04 +04:00
|
|
|
JS_SET_RVAL(cx, vp, JSVAL_VOID);
|
2000-04-27 08:02:22 +04:00
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static JSBool
|
2010-08-16 23:35:04 +04:00
|
|
|
TraceMallocOpenLogFile(JSContext *cx, uintN argc, jsval *vp)
|
2000-04-27 08:02:22 +04:00
|
|
|
{
|
2000-05-17 10:58:48 +04:00
|
|
|
int fd;
|
2000-04-27 08:02:22 +04:00
|
|
|
JSString *str;
|
|
|
|
|
2010-10-18 06:36:25 +04:00
|
|
|
if (!CheckUniversalXPConnectForTraceMalloc(cx))
|
|
|
|
return JS_FALSE;
|
|
|
|
|
2000-05-17 10:58:48 +04:00
|
|
|
if (argc == 0) {
|
2000-04-27 08:02:22 +04:00
|
|
|
fd = -1;
|
|
|
|
} else {
|
2010-08-16 23:35:04 +04:00
|
|
|
str = JS_ValueToString(cx, JS_ARGV(cx, vp)[0]);
|
2000-04-27 08:02:22 +04:00
|
|
|
if (!str)
|
|
|
|
return JS_FALSE;
|
2010-11-11 23:40:29 +03:00
|
|
|
JSAutoByteString filename(cx, str);
|
|
|
|
if (!filename)
|
|
|
|
return JS_FALSE;
|
|
|
|
fd = open(filename.ptr(), O_CREAT | O_WRONLY | O_TRUNC, 0644);
|
2000-04-27 08:02:22 +04:00
|
|
|
if (fd < 0) {
|
2010-11-11 23:40:29 +03:00
|
|
|
JS_ReportError(cx, "can't open %s: %s", filename.ptr(), strerror(errno));
|
2000-04-27 08:02:22 +04:00
|
|
|
return JS_FALSE;
|
|
|
|
}
|
|
|
|
}
|
2010-08-16 23:35:04 +04:00
|
|
|
JS_SET_RVAL(cx, vp, INT_TO_JSVAL(fd));
|
2000-05-17 10:58:48 +04:00
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static JSBool
|
2010-08-16 23:35:04 +04:00
|
|
|
TraceMallocChangeLogFD(JSContext *cx, uintN argc, jsval *vp)
|
2000-05-17 10:58:48 +04:00
|
|
|
{
|
2001-01-26 01:54:05 +03:00
|
|
|
int32 fd, oldfd;
|
2000-05-17 10:58:48 +04:00
|
|
|
|
2010-10-18 06:36:25 +04:00
|
|
|
if (!CheckUniversalXPConnectForTraceMalloc(cx))
|
|
|
|
return JS_FALSE;
|
|
|
|
|
2000-05-17 10:58:48 +04:00
|
|
|
if (argc == 0) {
|
|
|
|
oldfd = -1;
|
|
|
|
} else {
|
2010-08-16 23:35:04 +04:00
|
|
|
if (!JS_ValueToECMAInt32(cx, JS_ARGV(cx, vp)[0], &fd))
|
2000-05-17 10:58:48 +04:00
|
|
|
return JS_FALSE;
|
|
|
|
oldfd = NS_TraceMallocChangeLogFD(fd);
|
|
|
|
if (oldfd == -2) {
|
|
|
|
JS_ReportOutOfMemory(cx);
|
|
|
|
return JS_FALSE;
|
|
|
|
}
|
|
|
|
}
|
2010-08-16 23:35:04 +04:00
|
|
|
JS_SET_RVAL(cx, vp, INT_TO_JSVAL(oldfd));
|
2000-04-27 08:02:22 +04:00
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
2000-05-17 08:44:14 +04:00
|
|
|
static JSBool
|
2010-08-16 23:35:04 +04:00
|
|
|
TraceMallocCloseLogFD(JSContext *cx, uintN argc, jsval *vp)
|
2000-05-17 08:44:14 +04:00
|
|
|
{
|
|
|
|
int32 fd;
|
|
|
|
|
2010-10-18 06:36:25 +04:00
|
|
|
if (!CheckUniversalXPConnectForTraceMalloc(cx))
|
|
|
|
return JS_FALSE;
|
|
|
|
|
2010-08-16 23:35:04 +04:00
|
|
|
JS_SET_RVAL(cx, vp, JSVAL_VOID);
|
2000-05-17 10:58:48 +04:00
|
|
|
if (argc == 0)
|
2000-05-17 08:44:14 +04:00
|
|
|
return JS_TRUE;
|
2010-08-16 23:35:04 +04:00
|
|
|
if (!JS_ValueToECMAInt32(cx, JS_ARGV(cx, vp)[0], &fd))
|
2000-05-17 08:44:14 +04:00
|
|
|
return JS_FALSE;
|
|
|
|
NS_TraceMallocCloseLogFD((int) fd);
|
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
2000-08-09 06:43:09 +04:00
|
|
|
static JSBool
|
2010-08-16 23:35:04 +04:00
|
|
|
TraceMallocLogTimestamp(JSContext *cx, uintN argc, jsval *vp)
|
2000-08-09 06:43:09 +04:00
|
|
|
{
|
2010-10-18 06:36:25 +04:00
|
|
|
if (!CheckUniversalXPConnectForTraceMalloc(cx))
|
|
|
|
return JS_FALSE;
|
|
|
|
|
2010-11-11 23:40:29 +03:00
|
|
|
JSString *str = JS_ValueToString(cx, argc ? JS_ARGV(cx, vp)[0] : JSVAL_VOID);
|
2000-08-09 06:43:09 +04:00
|
|
|
if (!str)
|
|
|
|
return JS_FALSE;
|
2010-11-11 23:40:29 +03:00
|
|
|
JSAutoByteString caption(cx, str);
|
|
|
|
if (!caption)
|
|
|
|
return JS_FALSE;
|
|
|
|
NS_TraceMallocLogTimestamp(caption.ptr());
|
2010-08-16 23:35:04 +04:00
|
|
|
JS_SET_RVAL(cx, vp, JSVAL_VOID);
|
2000-08-09 06:43:09 +04:00
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
2000-08-29 05:52:13 +04:00
|
|
|
static JSBool
|
2010-08-16 23:35:04 +04:00
|
|
|
TraceMallocDumpAllocations(JSContext *cx, uintN argc, jsval *vp)
|
2000-08-29 05:52:13 +04:00
|
|
|
{
|
2010-10-18 06:36:25 +04:00
|
|
|
if (!CheckUniversalXPConnectForTraceMalloc(cx))
|
|
|
|
return JS_FALSE;
|
|
|
|
|
2010-11-11 23:40:29 +03:00
|
|
|
JSString *str = JS_ValueToString(cx, argc ? JS_ARGV(cx, vp)[0] : JSVAL_VOID);
|
2000-08-29 05:52:13 +04:00
|
|
|
if (!str)
|
|
|
|
return JS_FALSE;
|
2010-11-11 23:40:29 +03:00
|
|
|
JSAutoByteString pathname(cx, str);
|
|
|
|
if (!pathname)
|
|
|
|
return JS_FALSE;
|
|
|
|
if (NS_TraceMallocDumpAllocations(pathname.ptr()) < 0) {
|
|
|
|
JS_ReportError(cx, "can't dump to %s: %s", pathname.ptr(), strerror(errno));
|
2000-08-29 05:52:13 +04:00
|
|
|
return JS_FALSE;
|
|
|
|
}
|
2010-08-16 23:35:04 +04:00
|
|
|
JS_SET_RVAL(cx, vp, JSVAL_VOID);
|
2000-08-29 05:52:13 +04:00
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
2000-04-27 08:02:22 +04:00
|
|
|
static JSFunctionSpec TraceMallocFunctions[] = {
|
2010-08-16 23:35:04 +04:00
|
|
|
{"TraceMallocDisable", TraceMallocDisable, 0, 0},
|
|
|
|
{"TraceMallocEnable", TraceMallocEnable, 0, 0},
|
|
|
|
{"TraceMallocOpenLogFile", TraceMallocOpenLogFile, 1, 0},
|
|
|
|
{"TraceMallocChangeLogFD", TraceMallocChangeLogFD, 1, 0},
|
|
|
|
{"TraceMallocCloseLogFD", TraceMallocCloseLogFD, 1, 0},
|
|
|
|
{"TraceMallocLogTimestamp", TraceMallocLogTimestamp, 1, 0},
|
|
|
|
{"TraceMallocDumpAllocations", TraceMallocDumpAllocations, 1, 0},
|
|
|
|
{nsnull, nsnull, 0, 0}
|
2000-04-27 08:02:22 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* NS_TRACE_MALLOC */
|
|
|
|
|
2004-05-11 06:37:25 +04:00
|
|
|
#ifdef MOZ_JPROF
|
|
|
|
|
|
|
|
#include <signal.h>
|
|
|
|
|
|
|
|
inline PRBool
|
|
|
|
IsJProfAction(struct sigaction *action)
|
|
|
|
{
|
|
|
|
return (action->sa_sigaction &&
|
2008-09-06 05:10:35 +04:00
|
|
|
action->sa_flags == (SA_RESTART | SA_SIGINFO));
|
2004-05-11 06:37:25 +04:00
|
|
|
}
|
|
|
|
|
2006-12-12 18:47:47 +03:00
|
|
|
void NS_JProfStartProfiling();
|
|
|
|
void NS_JProfStopProfiling();
|
|
|
|
|
2004-05-11 06:37:25 +04:00
|
|
|
static JSBool
|
2010-09-12 04:06:59 +04:00
|
|
|
JProfStartProfilingJS(JSContext *cx, uintN argc, jsval *vp)
|
2006-12-12 18:47:47 +03:00
|
|
|
{
|
|
|
|
NS_JProfStartProfiling();
|
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void NS_JProfStartProfiling()
|
2004-05-11 06:37:25 +04:00
|
|
|
{
|
|
|
|
// Figure out whether we're dealing with SIGPROF, SIGALRM, or
|
|
|
|
// SIGPOLL profiling (SIGALRM for JP_REALTIME, SIGPOLL for
|
|
|
|
// JP_RTC_HZ)
|
|
|
|
struct sigaction action;
|
|
|
|
|
|
|
|
sigaction(SIGALRM, nsnull, &action);
|
|
|
|
if (IsJProfAction(&action)) {
|
|
|
|
printf("Beginning real-time jprof profiling.\n");
|
|
|
|
raise(SIGALRM);
|
2006-12-12 18:47:47 +03:00
|
|
|
return;
|
2004-05-11 06:37:25 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
sigaction(SIGPROF, nsnull, &action);
|
|
|
|
if (IsJProfAction(&action)) {
|
|
|
|
printf("Beginning process-time jprof profiling.\n");
|
|
|
|
raise(SIGPROF);
|
2006-12-12 18:47:47 +03:00
|
|
|
return;
|
2004-05-11 06:37:25 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
sigaction(SIGPOLL, nsnull, &action);
|
|
|
|
if (IsJProfAction(&action)) {
|
|
|
|
printf("Beginning rtc-based jprof profiling.\n");
|
|
|
|
raise(SIGPOLL);
|
2006-12-12 18:47:47 +03:00
|
|
|
return;
|
2004-05-11 06:37:25 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Could not start jprof-profiling since JPROF_FLAGS was not set.\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
static JSBool
|
2010-09-12 04:06:59 +04:00
|
|
|
JProfStopProfilingJS(JSContext *cx, uintN argc, jsval *vp)
|
2006-12-12 18:47:47 +03:00
|
|
|
{
|
|
|
|
NS_JProfStopProfiling();
|
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
NS_JProfStopProfiling()
|
2004-05-11 06:37:25 +04:00
|
|
|
{
|
|
|
|
raise(SIGUSR1);
|
|
|
|
printf("Stopped jprof profiling.\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
static JSFunctionSpec JProfFunctions[] = {
|
2010-09-12 01:24:00 +04:00
|
|
|
{"JProfStartProfiling", JProfStartProfilingJS, 0, 0},
|
|
|
|
{"JProfStopProfiling", JProfStopProfilingJS, 0, 0},
|
|
|
|
{nsnull, nsnull, 0, 0}
|
2004-05-11 06:37:25 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* defined(MOZ_JPROF) */
|
|
|
|
|
2009-07-30 22:48:02 +04:00
|
|
|
#ifdef MOZ_TRACEVIS
|
|
|
|
static JSFunctionSpec EthogramFunctions[] = {
|
2010-09-12 01:24:00 +04:00
|
|
|
{"initEthogram", js_InitEthogram, 0, 0},
|
|
|
|
{"shutdownEthogram", js_ShutdownEthogram, 0, 0},
|
|
|
|
{nsnull, nsnull, 0, 0}
|
2009-07-30 22:48:02 +04:00
|
|
|
};
|
|
|
|
#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 21:42:36 +04:00
|
|
|
nsresult
|
2006-06-13 07:07:47 +04:00
|
|
|
nsJSContext::InitClasses(void *aGlobalObj)
|
1998-07-16 05:16:47 +04:00
|
|
|
{
|
2000-09-02 05:58:51 +04:00
|
|
|
nsresult rv = NS_OK;
|
(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 03:43:30 +03:00
|
|
|
|
2007-07-08 11:08:04 +04:00
|
|
|
JSObject *globalObj = static_cast<JSObject *>(aGlobalObj);
|
2006-06-13 07:07:47 +04: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 21:42:36 +04:00
|
|
|
rv = InitializeExternalClasses();
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2000-04-27 08:02:22 +04:00
|
|
|
|
2006-06-13 02:39:55 +04:00
|
|
|
JSAutoRequest ar(mContext);
|
|
|
|
|
2011-01-27 13:54:58 +03:00
|
|
|
::JS_SetOptions(mContext, mDefaultJSOptions);
|
2000-09-01 07:10:33 +04:00
|
|
|
|
2011-01-15 04:58:40 +03:00
|
|
|
// Attempt to initialize profiling functions
|
|
|
|
::JS_DefineProfilingFunctions(mContext, globalObj);
|
|
|
|
|
2000-04-27 08:02:22 +04:00
|
|
|
#ifdef NS_TRACE_MALLOC
|
|
|
|
// Attempt to initialize TraceMalloc functions
|
2006-06-13 07:07:47 +04:00
|
|
|
::JS_DefineFunctions(mContext, globalObj, TraceMallocFunctions);
|
2000-04-27 08:02:22 +04:00
|
|
|
#endif
|
|
|
|
|
2004-05-11 06:37:25 +04:00
|
|
|
#ifdef MOZ_JPROF
|
|
|
|
// Attempt to initialize JProf functions
|
2006-06-13 07:07:47 +04:00
|
|
|
::JS_DefineFunctions(mContext, globalObj, JProfFunctions);
|
2004-05-11 06:37:25 +04:00
|
|
|
#endif
|
|
|
|
|
2009-07-30 22:48:02 +04:00
|
|
|
#ifdef MOZ_TRACEVIS
|
|
|
|
// Attempt to initialize Ethogram functions
|
|
|
|
::JS_DefineFunctions(mContext, globalObj, EthogramFunctions);
|
|
|
|
#endif
|
|
|
|
|
2007-07-10 12:05:54 +04:00
|
|
|
JSOptionChangedCallback(js_options_dot_str, this);
|
2008-07-27 03:17:12 +04:00
|
|
|
|
(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 03:43:30 +03:00
|
|
|
return rv;
|
1998-07-16 05:16:47 +04:00
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
void
|
2006-09-20 05:13:59 +04:00
|
|
|
nsJSContext::ClearScope(void *aGlobalObj, PRBool aClearFromProtoChain)
|
2006-06-13 07:07:47 +04:00
|
|
|
{
|
2008-02-22 02:51:02 +03:00
|
|
|
// Push our JSContext on our thread's context stack.
|
|
|
|
nsCOMPtr<nsIJSContextStack> stack =
|
|
|
|
do_GetService("@mozilla.org/js/xpc/ContextStack;1");
|
|
|
|
if (stack && NS_FAILED(stack->Push(mContext))) {
|
|
|
|
stack = nsnull;
|
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
if (aGlobalObj) {
|
|
|
|
JSObject *obj = (JSObject *)aGlobalObj;
|
|
|
|
JSAutoRequest ar(mContext);
|
2010-09-23 04:34:20 +04:00
|
|
|
|
|
|
|
JSAutoEnterCompartment ac;
|
|
|
|
ac.enterAndIgnoreErrors(mContext, obj);
|
|
|
|
|
2010-12-03 03:55:38 +03:00
|
|
|
// Grab a reference to the window property, which is the outer
|
|
|
|
// window, so that we can re-define it once we've cleared
|
|
|
|
// scope. This is what keeps the outer window alive in cases where
|
|
|
|
// nothing else does.
|
|
|
|
jsval window;
|
|
|
|
if (!JS_GetProperty(mContext, obj, "window", &window)) {
|
|
|
|
window = JSVAL_VOID;
|
|
|
|
|
|
|
|
JS_ClearPendingException(mContext);
|
|
|
|
}
|
|
|
|
|
2011-02-14 07:55:33 +03:00
|
|
|
JS_ClearScope(mContext, obj);
|
2011-01-22 05:37:30 +03:00
|
|
|
|
2011-02-16 06:00:55 +03:00
|
|
|
NS_ABORT_IF_FALSE(!xpc::WrapperFactory::IsXrayWrapper(obj), "unexpected wrapper");
|
2010-12-03 03:55:38 +03:00
|
|
|
|
|
|
|
if (window != JSVAL_VOID) {
|
|
|
|
if (!JS_DefineProperty(mContext, obj, "window", window,
|
2011-02-09 22:31:40 +03:00
|
|
|
JS_PropertyStub, JS_StrictPropertyStub,
|
2010-12-03 03:55:38 +03:00
|
|
|
JSPROP_ENUMERATE | JSPROP_READONLY |
|
|
|
|
JSPROP_PERMANENT)) {
|
|
|
|
JS_ClearPendingException(mContext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-09-14 02:53:50 +04:00
|
|
|
if (!obj->getParent()) {
|
|
|
|
JS_ClearRegExpStatics(mContext, obj);
|
|
|
|
}
|
2006-09-20 05:13:59 +04: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
|
|
|
|
// them set until the next document loads. We must clean up window
|
|
|
|
// 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.
|
2006-06-13 07:07:47 +04:00
|
|
|
::JS_ClearWatchPointsForObject(mContext, obj);
|
|
|
|
|
2006-09-20 05:13:59 +04:00
|
|
|
// Since the prototype chain is shared between inner and outer (and
|
|
|
|
// stays with the inner), we don't clear things from the prototype
|
|
|
|
// chain when we're clearing an outer window whose current inner we
|
|
|
|
// still want.
|
|
|
|
if (aClearFromProtoChain) {
|
2010-09-18 01:54:40 +04:00
|
|
|
nsWindowSH::InvalidateGlobalScopePolluter(mContext, obj);
|
2006-09-20 05:13:59 +04:00
|
|
|
|
2007-02-06 07:48:20 +03:00
|
|
|
// Clear up obj's prototype chain, but not Object.prototype.
|
|
|
|
for (JSObject *o = ::JS_GetPrototype(mContext, obj), *next;
|
|
|
|
o && (next = ::JS_GetPrototype(mContext, o)); o = next)
|
2006-09-20 05:13:59 +04:00
|
|
|
::JS_ClearScope(mContext, o);
|
|
|
|
}
|
2006-06-13 07:07:47 +04:00
|
|
|
}
|
2008-02-22 02:51:02 +03:00
|
|
|
|
|
|
|
if (stack) {
|
|
|
|
stack->Pop(nsnull);
|
|
|
|
}
|
2006-06-13 07:07:47 +04:00
|
|
|
}
|
|
|
|
|
2005-07-31 00:57:07 +04:00
|
|
|
void
|
|
|
|
nsJSContext::WillInitializeContext()
|
|
|
|
{
|
|
|
|
mIsInitialized = PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
nsJSContext::DidInitializeContext()
|
|
|
|
{
|
|
|
|
mIsInitialized = PR_TRUE;
|
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
PRBool
|
1998-12-30 05:46:36 +03:00
|
|
|
nsJSContext::IsContextInitialized()
|
|
|
|
{
|
2004-02-10 01:48:53 +03:00
|
|
|
return mIsInitialized;
|
1998-12-30 05:46:36 +03:00
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
void
|
|
|
|
nsJSContext::FinalizeContext()
|
|
|
|
{
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
void
|
2000-09-15 10:17:08 +04:00
|
|
|
nsJSContext::ScriptEvaluated(PRBool aTerminated)
|
1999-03-13 01:24:30 +03:00
|
|
|
{
|
2005-06-09 19:42:19 +04:00
|
|
|
if (aTerminated && mTerminations) {
|
|
|
|
// Make sure to null out mTerminations before doing anything that
|
|
|
|
// might cause new termination funcs to be added!
|
|
|
|
nsJSContext::TerminationFuncClosure* start = mTerminations;
|
|
|
|
mTerminations = nsnull;
|
2008-07-27 03:17:12 +04:00
|
|
|
|
2005-06-09 19:42:19 +04:00
|
|
|
for (nsJSContext::TerminationFuncClosure* cur = start;
|
|
|
|
cur;
|
|
|
|
cur = cur->mNext) {
|
|
|
|
(*(cur->mTerminationFunc))(cur->mTerminationFuncArg);
|
|
|
|
}
|
|
|
|
delete start;
|
1999-10-28 18:12:56 +04:00
|
|
|
}
|
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
JS_MaybeGC(mContext);
|
2008-11-27 01:54:40 +03:00
|
|
|
|
|
|
|
if (aTerminated) {
|
2009-06-12 04:52:47 +04:00
|
|
|
mOperationCallbackTime = 0;
|
|
|
|
mModalStateTime = 0;
|
2008-11-27 01:54:40 +03:00
|
|
|
}
|
1998-11-21 03:12:33 +03:00
|
|
|
}
|
|
|
|
|
2005-06-09 19:42:19 +04:00
|
|
|
nsresult
|
1999-10-28 18:12:56 +04:00
|
|
|
nsJSContext::SetTerminationFunction(nsScriptTerminationFunc aFunc,
|
|
|
|
nsISupports* aRef)
|
|
|
|
{
|
2011-01-28 01:42:19 +03:00
|
|
|
NS_PRECONDITION(GetExecutingScript(), "should be executing script");
|
2006-09-20 05:13:59 +04:00
|
|
|
|
2005-06-09 19:42:19 +04:00
|
|
|
nsJSContext::TerminationFuncClosure* newClosure =
|
|
|
|
new nsJSContext::TerminationFuncClosure(aFunc, aRef, mTerminations);
|
|
|
|
if (!newClosure) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
|
|
|
|
|
|
|
mTerminations = newClosure;
|
|
|
|
return NS_OK;
|
1999-10-28 18:12:56 +04:00
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
PRBool
|
|
|
|
nsJSContext::GetScriptsEnabled()
|
2000-03-28 04:15:56 +04:00
|
|
|
{
|
2004-02-10 01:48:53 +03:00
|
|
|
return mScriptsEnabled;
|
2000-03-28 04:15:56 +04:00
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
void
|
2002-02-05 08:53:56 +03:00
|
|
|
nsJSContext::SetScriptsEnabled(PRBool aEnabled, PRBool aFireTimeouts)
|
2000-03-28 04:15:56 +04:00
|
|
|
{
|
2006-06-13 07:07:47 +04:00
|
|
|
// eeek - this seems the wrong way around - the global should callback
|
|
|
|
// into each context, so every language is disabled.
|
2000-03-28 04:15:56 +04:00
|
|
|
mScriptsEnabled = aEnabled;
|
2001-11-27 12:18:28 +03:00
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
nsIScriptGlobalObject *global = GetGlobalObject();
|
2001-11-27 12:18:28 +03:00
|
|
|
|
2002-02-09 05:48:31 +03:00
|
|
|
if (global) {
|
|
|
|
global->SetScriptsEnabled(aEnabled, aFireTimeouts);
|
2001-11-27 12:18:28 +03:00
|
|
|
}
|
2000-03-28 04:15:56 +04:00
|
|
|
}
|
|
|
|
|
2001-05-16 02:26:19 +04:00
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
PRBool
|
|
|
|
nsJSContext::GetProcessingScriptTag()
|
2001-05-16 02:26:19 +04:00
|
|
|
{
|
2004-02-10 01:48:53 +03:00
|
|
|
return mProcessingScriptTag;
|
2001-05-16 02:26:19 +04:00
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
void
|
2003-06-25 01:09:57 +04:00
|
|
|
nsJSContext::SetProcessingScriptTag(PRBool aFlag)
|
2001-05-16 02:26:19 +04:00
|
|
|
{
|
|
|
|
mProcessingScriptTag = aFlag;
|
|
|
|
}
|
|
|
|
|
2009-11-20 02:11:44 +03:00
|
|
|
PRBool
|
|
|
|
nsJSContext::GetExecutingScript()
|
|
|
|
{
|
|
|
|
return JS_IsRunning(mContext) || mExecuteDepth > 0;
|
|
|
|
}
|
|
|
|
|
2004-02-10 01:48:53 +03:00
|
|
|
void
|
2001-10-19 08:13:37 +04:00
|
|
|
nsJSContext::SetGCOnDestruction(PRBool aGCOnDestruction)
|
|
|
|
{
|
|
|
|
mGCOnDestruction = aGCOnDestruction;
|
|
|
|
}
|
|
|
|
|
2001-09-25 02:57:47 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsJSContext::ScriptExecuted()
|
|
|
|
{
|
2008-03-04 04:44:16 +03:00
|
|
|
ScriptEvaluated(!::JS_IsRunning(mContext));
|
2004-02-10 01:48:53 +03:00
|
|
|
|
|
|
|
return NS_OK;
|
2001-09-25 02:57:47 +04:00
|
|
|
}
|
|
|
|
|
2007-10-23 01:42:25 +04:00
|
|
|
//static
|
|
|
|
void
|
2011-02-17 02:47:12 +03:00
|
|
|
nsJSContext::GarbageCollectNow()
|
2007-10-23 01:42:25 +04:00
|
|
|
{
|
2010-05-20 03:22:19 +04:00
|
|
|
NS_TIME_FUNCTION_MIN(1.0);
|
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
KillGCTimer();
|
2008-02-25 20:47:25 +03:00
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
// Reset sPendingLoadCount in case the timer that fired was a
|
|
|
|
// timer we scheduled due to a normal GC timer firing while
|
|
|
|
// documents were loading. If this happens we're waiting for a
|
|
|
|
// document that is taking a long time to load, and we effectively
|
|
|
|
// ignore the fact that the currently loading documents are still
|
|
|
|
// loading and move on as if they weren't.
|
|
|
|
sPendingLoadCount = 0;
|
|
|
|
sLoadingInProgress = PR_FALSE;
|
2007-10-23 01:42:25 +04:00
|
|
|
|
2011-02-19 02:14:21 +03:00
|
|
|
if (nsContentUtils::XPConnect()) {
|
|
|
|
nsContentUtils::XPConnect()->GarbageCollect();
|
|
|
|
}
|
2007-10-23 01:42:25 +04:00
|
|
|
}
|
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
//Static
|
2007-10-23 01:42:25 +04:00
|
|
|
void
|
2011-02-17 02:47:12 +03:00
|
|
|
nsJSContext::CycleCollectNow(nsICycleCollectorListener *aListener)
|
2007-10-23 01:42:25 +04:00
|
|
|
{
|
2011-02-17 02:47:12 +03:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
return;
|
2007-10-23 01:42:25 +04:00
|
|
|
}
|
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
NS_TIME_FUNCTION_MIN(1.0);
|
|
|
|
|
|
|
|
KillCCTimer();
|
|
|
|
|
|
|
|
PRTime start = PR_Now();
|
|
|
|
|
|
|
|
PRUint32 suspected = nsCycleCollector_suspectedCount();
|
|
|
|
PRUint32 collected = nsCycleCollector_collect(aListener);
|
2011-03-01 01:44:22 +03:00
|
|
|
sCCollectedWaitingForGC += collected;
|
2011-02-17 02:47:12 +03:00
|
|
|
|
2011-03-01 01:44:22 +03:00
|
|
|
// If we collected a substantial amount of cycles, poke the GC since more objects
|
|
|
|
// might be unreachable now.
|
|
|
|
if (sCCollectedWaitingForGC > 250) {
|
2011-02-17 02:47:12 +03:00
|
|
|
PokeGC();
|
2010-11-07 22:07:59 +03:00
|
|
|
}
|
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
if (sPostGCEventsToConsole) {
|
|
|
|
PRTime now = PR_Now();
|
|
|
|
NS_NAMED_LITERAL_STRING(kFmt,
|
2011-03-01 01:44:22 +03:00
|
|
|
"CC timestamp: %lld, collected: %lu (%lu waiting for GC), suspected: %lu, duration: %llu ms.");
|
2011-02-17 02:47:12 +03:00
|
|
|
nsString msg;
|
|
|
|
msg.Adopt(nsTextFormatter::smprintf(kFmt.get(), now,
|
2011-03-01 01:44:22 +03:00
|
|
|
collected, sCCollectedWaitingForGC, suspected,
|
2011-02-17 02:47:12 +03:00
|
|
|
(now - start) / PR_USEC_PER_MSEC));
|
|
|
|
nsCOMPtr<nsIConsoleService> cs =
|
|
|
|
do_GetService(NS_CONSOLESERVICE_CONTRACTID);
|
|
|
|
if (cs) {
|
|
|
|
cs->LogStringMessage(msg.get());
|
|
|
|
}
|
2009-07-08 19:08:22 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-02-12 15:06:59 +03:00
|
|
|
// static
|
|
|
|
void
|
|
|
|
GCTimerFired(nsITimer *aTimer, void *aClosure)
|
2001-11-27 12:46:38 +03:00
|
|
|
{
|
2007-01-11 03:02:58 +03:00
|
|
|
NS_RELEASE(sGCTimer);
|
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
nsJSContext::GarbageCollectNow();
|
|
|
|
}
|
2007-01-26 04:19:31 +03:00
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
// static
|
|
|
|
void
|
|
|
|
CCTimerFired(nsITimer *aTimer, void *aClosure)
|
|
|
|
{
|
|
|
|
NS_RELEASE(sCCTimer);
|
2001-11-27 12:46:38 +03:00
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
nsJSContext::CycleCollectNow();
|
2001-11-27 12:46:38 +03:00
|
|
|
}
|
1998-07-16 05:16:47 +04:00
|
|
|
|
2007-01-11 03:02:58 +03:00
|
|
|
// static
|
2001-11-27 12:46:38 +03:00
|
|
|
void
|
2007-01-11 03:02:58 +03:00
|
|
|
nsJSContext::LoadStart()
|
|
|
|
{
|
2011-02-17 02:47:12 +03:00
|
|
|
sLoadingInProgress = PR_TRUE;
|
2007-01-11 03:02:58 +03:00
|
|
|
++sPendingLoadCount;
|
|
|
|
}
|
|
|
|
|
|
|
|
// static
|
|
|
|
void
|
2007-10-21 20:46:54 +04:00
|
|
|
nsJSContext::LoadEnd()
|
2007-01-11 03:02:58 +03:00
|
|
|
{
|
2011-02-17 02:47:12 +03:00
|
|
|
if (!sLoadingInProgress)
|
|
|
|
return;
|
|
|
|
|
2007-01-11 03:02:58 +03:00
|
|
|
// sPendingLoadCount is not a well managed load counter (and doesn't
|
|
|
|
// need to be), so make sure we don't make it wrap backwards here.
|
|
|
|
if (sPendingLoadCount > 0) {
|
|
|
|
--sPendingLoadCount;
|
2011-02-17 02:47:12 +03:00
|
|
|
return;
|
2007-01-11 03:02:58 +03:00
|
|
|
}
|
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
// Its probably a good idea to GC soon since we have finished loading.
|
|
|
|
sLoadingInProgress = PR_FALSE;
|
|
|
|
PokeGC();
|
2007-01-11 03:02:58 +03:00
|
|
|
}
|
|
|
|
|
2009-02-12 15:06:59 +03:00
|
|
|
// static
|
2007-01-11 03:02:58 +03:00
|
|
|
void
|
2011-02-17 02:47:12 +03:00
|
|
|
nsJSContext::PokeGC()
|
1998-07-16 05:16:47 +04:00
|
|
|
{
|
2005-12-06 08:48:46 +03:00
|
|
|
if (sGCTimer) {
|
|
|
|
// There's already a timer for GC'ing, just return
|
2001-11-27 12:46:38 +03:00
|
|
|
return;
|
(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 03:43:30 +03:00
|
|
|
}
|
2001-11-27 12:46:38 +03:00
|
|
|
|
2004-11-01 21:50:36 +03:00
|
|
|
CallCreateInstance("@mozilla.org/timer;1", &sGCTimer);
|
2001-11-27 12:46:38 +03:00
|
|
|
|
|
|
|
if (!sGCTimer) {
|
2011-05-28 03:53:01 +04:00
|
|
|
// Failed to create timer (probably because we're in XPCOM shutdown)
|
2001-11-27 12:46:38 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PRBool first = PR_TRUE;
|
|
|
|
|
2009-02-12 15:06:59 +03:00
|
|
|
sGCTimer->InitWithFuncCallback(GCTimerFired, nsnull,
|
2011-02-17 02:47:12 +03:00
|
|
|
first
|
|
|
|
? NS_FIRST_GC_DELAY
|
|
|
|
: NS_GC_DELAY,
|
2009-02-12 15:06:59 +03:00
|
|
|
nsITimer::TYPE_ONE_SHOT);
|
2001-11-27 12:46:38 +03:00
|
|
|
|
|
|
|
first = PR_FALSE;
|
1998-07-16 05:16:47 +04:00
|
|
|
}
|
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
// static
|
|
|
|
void
|
|
|
|
nsJSContext::MaybePokeCC()
|
|
|
|
{
|
|
|
|
if (nsCycleCollector_suspectedCount() > 1000) {
|
|
|
|
PokeCC();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// static
|
|
|
|
void
|
|
|
|
nsJSContext::PokeCC()
|
|
|
|
{
|
2011-02-23 11:08:36 +03:00
|
|
|
if (sCCTimer || !sGCHasRun) {
|
|
|
|
// There's already a timer for GC'ing, or GC hasn't run yet, just return.
|
2011-02-17 02:47:12 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
CallCreateInstance("@mozilla.org/timer;1", &sCCTimer);
|
|
|
|
|
|
|
|
if (!sCCTimer) {
|
2011-06-01 04:42:46 +04:00
|
|
|
// Failed to create timer (probably because we're in XPCOM shutdown)
|
2011-02-17 02:47:12 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
sCCTimer->InitWithFuncCallback(CCTimerFired, nsnull,
|
|
|
|
NS_CC_DELAY,
|
|
|
|
nsITimer::TYPE_ONE_SHOT);
|
|
|
|
}
|
|
|
|
|
|
|
|
//static
|
|
|
|
void
|
|
|
|
nsJSContext::KillGCTimer()
|
|
|
|
{
|
|
|
|
if (sGCTimer) {
|
|
|
|
sGCTimer->Cancel();
|
|
|
|
|
|
|
|
NS_RELEASE(sGCTimer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//static
|
|
|
|
void
|
|
|
|
nsJSContext::KillCCTimer()
|
|
|
|
{
|
|
|
|
if (sCCTimer) {
|
|
|
|
sCCTimer->Cancel();
|
|
|
|
|
|
|
|
NS_RELEASE(sCCTimer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
nsJSContext::GC()
|
|
|
|
{
|
|
|
|
PokeGC();
|
|
|
|
}
|
|
|
|
|
2008-09-07 02:21:43 +04:00
|
|
|
static JSBool
|
2000-05-15 08:21:04 +04:00
|
|
|
DOMGCCallback(JSContext *cx, JSGCStatus status)
|
|
|
|
{
|
2011-02-17 02:47:12 +03:00
|
|
|
static PRTime start;
|
|
|
|
|
|
|
|
if (sPostGCEventsToConsole && NS_IsMainThread()) {
|
|
|
|
if (status == JSGC_BEGIN) {
|
|
|
|
start = PR_Now();
|
|
|
|
} else if (status == JSGC_END) {
|
|
|
|
PRTime now = PR_Now();
|
2011-03-01 01:44:22 +03:00
|
|
|
NS_NAMED_LITERAL_STRING(kFmt, "GC mode: %s, timestamp: %lld, duration: %llu ms.");
|
2011-02-17 02:47:12 +03:00
|
|
|
nsString msg;
|
2011-03-01 01:44:22 +03:00
|
|
|
msg.Adopt(nsTextFormatter::smprintf(kFmt.get(),
|
|
|
|
cx->runtime->gcTriggerCompartment ? "compartment" : "full",
|
|
|
|
now,
|
2011-02-17 02:47:12 +03:00
|
|
|
(now - start) / PR_USEC_PER_MSEC));
|
|
|
|
nsCOMPtr<nsIConsoleService> cs = do_GetService(NS_CONSOLESERVICE_CONTRACTID);
|
|
|
|
if (cs) {
|
|
|
|
cs->LogStringMessage(msg.get());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (status == JSGC_END) {
|
2011-03-01 01:44:22 +03:00
|
|
|
sCCollectedWaitingForGC = 0;
|
2011-02-17 02:47:12 +03:00
|
|
|
if (sGCTimer) {
|
|
|
|
// If we were waiting for a GC to happen, kill the timer.
|
|
|
|
nsJSContext::KillGCTimer();
|
|
|
|
|
|
|
|
// If this is a compartment GC, restart it. We still want
|
|
|
|
// a full GC to happen. Compartment GCs usually happen as a
|
|
|
|
// result of last-ditch or MaybeGC. In both cases its
|
|
|
|
// probably a time of heavy activity and we want to delay
|
|
|
|
// the full GC, but we do want it to happen eventually.
|
|
|
|
if (cx->runtime->gcTriggerCompartment) {
|
|
|
|
nsJSContext::PokeGC();
|
|
|
|
|
|
|
|
// We poked the GC, so we can kill any pending CC here.
|
|
|
|
nsJSContext::KillCCTimer();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// If this was a full GC, poke the CC to run soon.
|
|
|
|
if (!cx->runtime->gcTriggerCompartment) {
|
2011-02-23 11:08:36 +03:00
|
|
|
sGCHasRun = true;
|
2011-02-17 02:47:12 +03:00
|
|
|
nsJSContext::PokeCC();
|
|
|
|
}
|
|
|
|
}
|
2011-02-20 09:59:49 +03:00
|
|
|
|
|
|
|
// If we didn't end up scheduling a GC, and there are unused
|
|
|
|
// chunks waiting to expire, make sure we will GC again soon.
|
|
|
|
if (!sGCTimer && JS_GetGCParameter(cx->runtime, JSGC_UNUSED_CHUNKS) > 0) {
|
|
|
|
nsJSContext::PokeGC();
|
|
|
|
}
|
2011-02-17 02:47:12 +03:00
|
|
|
}
|
|
|
|
|
2005-06-08 02:21:41 +04:00
|
|
|
JSBool result = gOldJSGCCallback ? gOldJSGCCallback(cx, status) : JS_TRUE;
|
|
|
|
|
2006-05-10 21:30:15 +04:00
|
|
|
if (status == JSGC_BEGIN && !NS_IsMainThread())
|
2000-05-15 08:21:04 +04:00
|
|
|
return JS_FALSE;
|
2005-04-26 05:23:53 +04:00
|
|
|
|
|
|
|
return result;
|
2000-05-15 08:21:04 +04:00
|
|
|
}
|
(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 03:43:30 +03:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// Script object mananagement - note duplicate implementation
|
|
|
|
// in nsJSRuntime below...
|
|
|
|
nsresult
|
|
|
|
nsJSContext::HoldScriptObject(void* aScriptObject)
|
|
|
|
{
|
|
|
|
NS_ASSERTION(sIsInitialized, "runtime not initialized");
|
|
|
|
if (! nsJSRuntime::sRuntime) {
|
2006-08-06 13:31:14 +04:00
|
|
|
NS_NOTREACHED("couldn't add GC root - no runtime");
|
2006-06-13 07:07:47 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
::JS_LockGCThingRT(nsJSRuntime::sRuntime, aScriptObject);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsJSContext::DropScriptObject(void* aScriptObject)
|
|
|
|
{
|
|
|
|
NS_ASSERTION(sIsInitialized, "runtime not initialized");
|
|
|
|
if (! nsJSRuntime::sRuntime) {
|
|
|
|
NS_NOTREACHED("couldn't remove GC root");
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
::JS_UnlockGCThingRT(nsJSRuntime::sRuntime, aScriptObject);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2008-03-20 03:42:47 +03:00
|
|
|
void
|
2009-05-20 06:11:01 +04:00
|
|
|
nsJSContext::ReportPendingException()
|
2008-03-20 03:42:47 +03:00
|
|
|
{
|
2009-05-20 06:11:01 +04:00
|
|
|
// set aside the frame chain, since it has nothing to do with the
|
|
|
|
// exception we're reporting.
|
2008-03-20 03:42:47 +03:00
|
|
|
if (mIsInitialized && ::JS_IsExceptionPending(mContext)) {
|
2011-05-13 19:56:26 +04:00
|
|
|
PRBool saved = ::JS_SaveFrameChain(mContext);
|
2008-03-20 03:42:47 +03:00
|
|
|
::JS_ReportPendingException(mContext);
|
2011-05-13 19:56:26 +04:00
|
|
|
if (saved)
|
|
|
|
::JS_RestoreFrameChain(mContext);
|
2008-12-13 04:46:43 +03:00
|
|
|
}
|
2008-03-20 03:42:47 +03:00
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
/**********************************************************************
|
|
|
|
* nsJSRuntime implementation
|
|
|
|
*********************************************************************/
|
|
|
|
|
|
|
|
// QueryInterface implementation for nsJSRuntime
|
|
|
|
NS_INTERFACE_MAP_BEGIN(nsJSRuntime)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIScriptRuntime)
|
|
|
|
NS_INTERFACE_MAP_END
|
|
|
|
|
|
|
|
|
|
|
|
NS_IMPL_ADDREF(nsJSRuntime)
|
|
|
|
NS_IMPL_RELEASE(nsJSRuntime)
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsJSRuntime::CreateContext(nsIScriptContext **aContext)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIScriptContext> scriptContext;
|
|
|
|
|
|
|
|
*aContext = new nsJSContext(sRuntime);
|
|
|
|
NS_ENSURE_TRUE(*aContext, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
NS_ADDREF(*aContext);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsJSRuntime::ParseVersion(const nsString &aVersionStr, PRUint32 *flags)
|
|
|
|
{
|
|
|
|
NS_PRECONDITION(flags, "Null flags param?");
|
|
|
|
JSVersion jsVersion = JSVERSION_UNKNOWN;
|
|
|
|
if (aVersionStr.Length() != 3 || aVersionStr[0] != '1' || aVersionStr[1] != '.')
|
|
|
|
jsVersion = JSVERSION_UNKNOWN;
|
|
|
|
else switch (aVersionStr[2]) {
|
|
|
|
case '0': jsVersion = JSVERSION_1_0; break;
|
|
|
|
case '1': jsVersion = JSVERSION_1_1; break;
|
|
|
|
case '2': jsVersion = JSVERSION_1_2; break;
|
|
|
|
case '3': jsVersion = JSVERSION_1_3; break;
|
|
|
|
case '4': jsVersion = JSVERSION_1_4; break;
|
|
|
|
case '5': jsVersion = JSVERSION_1_5; break;
|
2006-06-16 01:47:59 +04:00
|
|
|
case '6': jsVersion = JSVERSION_1_6; break;
|
|
|
|
case '7': jsVersion = JSVERSION_1_7; break;
|
2007-05-30 09:55:55 +04:00
|
|
|
case '8': jsVersion = JSVERSION_1_8; break;
|
2006-06-13 07:07:47 +04:00
|
|
|
default: jsVersion = JSVERSION_UNKNOWN;
|
|
|
|
}
|
|
|
|
*flags = (PRUint32)jsVersion;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2004-06-09 22:36:25 +04:00
|
|
|
//static
|
|
|
|
void
|
2006-06-13 07:07:47 +04:00
|
|
|
nsJSRuntime::Startup()
|
2004-06-09 22:36:25 +04:00
|
|
|
{
|
|
|
|
// initialize all our statics, so that we can restart XPCOM
|
2011-02-17 02:47:12 +03:00
|
|
|
sGCTimer = sCCTimer = nsnull;
|
2011-02-23 11:08:36 +03:00
|
|
|
sGCHasRun = false;
|
2007-01-11 03:02:58 +03:00
|
|
|
sPendingLoadCount = 0;
|
2011-02-17 02:47:12 +03:00
|
|
|
sLoadingInProgress = PR_FALSE;
|
2011-03-01 01:44:22 +03:00
|
|
|
sCCollectedWaitingForGC = 0;
|
2011-02-17 02:47:12 +03:00
|
|
|
sPostGCEventsToConsole = PR_FALSE;
|
2004-06-09 22:36:25 +04:00
|
|
|
gNameSpaceManager = nsnull;
|
|
|
|
sRuntimeService = nsnull;
|
|
|
|
sRuntime = nsnull;
|
|
|
|
gOldJSGCCallback = nsnull;
|
|
|
|
sIsInitialized = PR_FALSE;
|
|
|
|
sDidShutdown = PR_FALSE;
|
|
|
|
sContextCount = 0;
|
|
|
|
sSecurityManager = nsnull;
|
|
|
|
}
|
|
|
|
|
2008-10-10 19:04:34 +04:00
|
|
|
static int
|
2005-09-06 18:51:29 +04:00
|
|
|
MaxScriptRunTimePrefChangedCallback(const char *aPrefName, void *aClosure)
|
|
|
|
{
|
2006-07-28 02:36:36 +04:00
|
|
|
// Default limit on script run time to 10 seconds. 0 means let
|
2005-09-06 18:51:29 +04:00
|
|
|
// scripts run forever.
|
2006-07-28 02:36:36 +04:00
|
|
|
PRBool isChromePref =
|
|
|
|
strcmp(aPrefName, "dom.max_chrome_script_run_time") == 0;
|
2011-05-25 10:32:00 +04:00
|
|
|
PRInt32 time = Preferences::GetInt(aPrefName, isChromePref ? 20 : 10);
|
2005-09-06 18:51:29 +04:00
|
|
|
|
2006-07-28 02:36:36 +04:00
|
|
|
PRTime t;
|
2005-09-06 18:51:29 +04:00
|
|
|
if (time <= 0) {
|
|
|
|
// Let scripts run for a really, really long time.
|
2006-07-28 03:30:45 +04:00
|
|
|
t = LL_INIT(0x40000000, 0);
|
2006-07-28 02:36:36 +04:00
|
|
|
} else {
|
|
|
|
t = time * PR_USEC_PER_SEC;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isChromePref) {
|
|
|
|
sMaxChromeScriptRunTime = t;
|
2005-09-06 18:51:29 +04:00
|
|
|
} else {
|
2006-07-28 02:36:36 +04:00
|
|
|
sMaxScriptRunTime = t;
|
2005-09-06 18:51:29 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-10-10 19:04:34 +04:00
|
|
|
static int
|
2008-04-10 21:35:56 +04:00
|
|
|
ReportAllJSExceptionsPrefChangedCallback(const char* aPrefName, void* aClosure)
|
|
|
|
{
|
2011-05-25 10:31:59 +04:00
|
|
|
PRBool reportAll = Preferences::GetBool(aPrefName, PR_FALSE);
|
2008-04-10 21:35:56 +04:00
|
|
|
nsContentUtils::XPConnect()->SetReportAllJSExceptions(reportAll);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-07-09 16:16:26 +04:00
|
|
|
static int
|
|
|
|
SetMemoryHighWaterMarkPrefChangedCallback(const char* aPrefName, void* aClosure)
|
|
|
|
{
|
2011-05-25 10:32:00 +04:00
|
|
|
PRInt32 highwatermark = Preferences::GetInt(aPrefName, 128);
|
2010-12-03 01:38:00 +03:00
|
|
|
|
|
|
|
JS_SetGCParameter(nsJSRuntime::sRuntime, JSGC_MAX_MALLOC_BYTES,
|
|
|
|
highwatermark * 1024L * 1024L);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
SetMemoryMaxPrefChangedCallback(const char* aPrefName, void* aClosure)
|
|
|
|
{
|
2011-05-25 10:32:00 +04:00
|
|
|
PRInt32 pref = Preferences::GetInt(aPrefName, -1);
|
2011-01-12 20:35:36 +03:00
|
|
|
// handle overflow and negative pref values
|
|
|
|
PRUint32 max = (pref <= 0 || pref >= 0x1000) ? -1 : (PRUint32)pref * 1024 * 1024;
|
|
|
|
JS_SetGCParameter(nsJSRuntime::sRuntime, JSGC_MAX_BYTES, max);
|
2009-07-09 16:16:26 +04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2011-01-10 09:57:21 +03:00
|
|
|
static int
|
|
|
|
SetMemoryGCModePrefChangedCallback(const char* aPrefName, void* aClosure)
|
|
|
|
{
|
2011-05-25 10:31:59 +04:00
|
|
|
PRBool enableCompartmentGC = Preferences::GetBool(aPrefName);
|
2011-01-10 09:57:21 +03:00
|
|
|
JS_SetGCParameter(nsJSRuntime::sRuntime, JSGC_MODE, enableCompartmentGC
|
|
|
|
? JSGC_MODE_COMPARTMENT
|
|
|
|
: JSGC_MODE_GLOBAL);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-09-07 02:21:43 +04:00
|
|
|
static JSPrincipals *
|
2005-05-04 10:28:36 +04:00
|
|
|
ObjectPrincipalFinder(JSContext *cx, JSObject *obj)
|
|
|
|
{
|
2005-07-08 08:47:58 +04:00
|
|
|
if (!sSecurityManager)
|
|
|
|
return nsnull;
|
|
|
|
|
2005-05-04 10:28:36 +04:00
|
|
|
nsCOMPtr<nsIPrincipal> principal;
|
|
|
|
nsresult rv =
|
|
|
|
sSecurityManager->GetObjectPrincipal(cx, obj,
|
|
|
|
getter_AddRefs(principal));
|
|
|
|
|
|
|
|
if (NS_FAILED(rv) || !principal) {
|
|
|
|
return nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
JSPrincipals *jsPrincipals = nsnull;
|
|
|
|
principal->GetJSPrincipals(cx, &jsPrincipals);
|
|
|
|
|
|
|
|
// nsIPrincipal::GetJSPrincipals() returns a strong reference to the
|
|
|
|
// JS principals, but the caller of this function expects a weak
|
|
|
|
// reference. So we need to release here.
|
|
|
|
|
|
|
|
JSPRINCIPALS_DROP(cx, jsPrincipals);
|
|
|
|
|
|
|
|
return jsPrincipals;
|
|
|
|
}
|
|
|
|
|
2011-07-17 23:09:13 +04:00
|
|
|
JSObject*
|
|
|
|
NS_DOMReadStructuredClone(JSContext* cx,
|
|
|
|
JSStructuredCloneReader* reader,
|
|
|
|
uint32 tag,
|
|
|
|
uint32 data,
|
|
|
|
void* closure)
|
2010-10-11 02:39:11 +04:00
|
|
|
{
|
|
|
|
// We don't currently support any extensions to structured cloning.
|
|
|
|
nsDOMClassInfo::ThrowJSException(cx, NS_ERROR_DOM_DATA_CLONE_ERR);
|
|
|
|
return nsnull;
|
|
|
|
}
|
|
|
|
|
2011-07-17 23:09:13 +04:00
|
|
|
JSBool
|
|
|
|
NS_DOMWriteStructuredClone(JSContext* cx,
|
|
|
|
JSStructuredCloneWriter* writer,
|
|
|
|
JSObject* obj,
|
|
|
|
void *closure)
|
2010-10-11 02:39:11 +04:00
|
|
|
{
|
|
|
|
// We don't currently support any extensions to structured cloning.
|
|
|
|
nsDOMClassInfo::ThrowJSException(cx, NS_ERROR_DOM_DATA_CLONE_ERR);
|
|
|
|
return JS_FALSE;
|
|
|
|
}
|
|
|
|
|
2011-07-17 23:09:13 +04:00
|
|
|
void
|
|
|
|
NS_DOMStructuredCloneError(JSContext* cx,
|
|
|
|
uint32 errorid)
|
2010-10-11 02:39:11 +04:00
|
|
|
{
|
|
|
|
// We don't currently support any extensions to structured cloning.
|
|
|
|
nsDOMClassInfo::ThrowJSException(cx, NS_ERROR_DOM_DATA_CLONE_ERR);
|
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
//static
|
2004-02-10 01:48:53 +03:00
|
|
|
nsresult
|
2006-06-13 07:07:47 +04:00
|
|
|
nsJSRuntime::Init()
|
1998-07-16 05:16:47 +04:00
|
|
|
{
|
2004-06-09 22:36:25 +04:00
|
|
|
if (sIsInitialized) {
|
2006-04-16 13:17:46 +04:00
|
|
|
if (!nsContentUtils::XPConnect())
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
|
2001-11-27 12:46:38 +03:00
|
|
|
return NS_OK;
|
2000-06-20 07:45:21 +04:00
|
|
|
}
|
|
|
|
|
2008-09-06 03:26:04 +04:00
|
|
|
nsresult rv = CallGetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID,
|
|
|
|
&sSecurityManager);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
rv = CallGetService(kJSRuntimeServiceContractID, &sRuntimeService);
|
1999-09-05 04:43:39 +04:00
|
|
|
// get the JSRuntime from the runtime svc, if possible
|
2001-11-27 12:46:38 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
rv = sRuntimeService->GetRuntime(&sRuntime);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
(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 03:43:30 +03:00
|
|
|
|
2001-06-05 05:00:48 +04:00
|
|
|
// Let's make sure that our main thread is the same as the xpcom main thread.
|
2006-05-10 21:30:15 +04:00
|
|
|
NS_ASSERTION(NS_IsMainThread(), "bad");
|
2001-06-05 05:00:48 +04:00
|
|
|
|
2001-11-27 12:46:38 +03:00
|
|
|
NS_ASSERTION(!gOldJSGCCallback,
|
2006-06-13 07:07:47 +04:00
|
|
|
"nsJSRuntime initialized more than once");
|
2001-11-27 12:46:38 +03:00
|
|
|
|
2005-05-04 10:28:36 +04:00
|
|
|
// Save the old GC callback to chain to it, for GC-observing generality.
|
2001-11-27 12:46:38 +03:00
|
|
|
gOldJSGCCallback = ::JS_SetGCCallbackRT(sRuntime, DOMGCCallback);
|
2000-05-15 08:21:04 +04:00
|
|
|
|
2008-09-06 03:26:04 +04:00
|
|
|
JSSecurityCallbacks *callbacks = JS_GetRuntimeSecurityCallbacks(sRuntime);
|
|
|
|
NS_ASSERTION(callbacks, "SecMan should have set security callbacks!");
|
|
|
|
|
|
|
|
callbacks->findObjectPrincipals = ObjectPrincipalFinder;
|
2005-05-04 10:28:36 +04:00
|
|
|
|
2010-10-11 02:39:11 +04:00
|
|
|
// Set up the structured clone callbacks.
|
|
|
|
static JSStructuredCloneCallbacks cloneCallbacks = {
|
2011-07-17 23:09:13 +04:00
|
|
|
NS_DOMReadStructuredClone,
|
|
|
|
NS_DOMWriteStructuredClone,
|
|
|
|
NS_DOMStructuredCloneError
|
2010-10-11 02:39:11 +04:00
|
|
|
};
|
|
|
|
JS_SetStructuredCloneCallbacks(sRuntime, &cloneCallbacks);
|
|
|
|
|
2001-06-05 05:00:48 +04:00
|
|
|
// Set these global xpconnect options...
|
2011-05-29 03:42:57 +04:00
|
|
|
Preferences::RegisterCallback(MaxScriptRunTimePrefChangedCallback,
|
|
|
|
"dom.max_script_run_time");
|
2005-09-06 18:51:29 +04:00
|
|
|
MaxScriptRunTimePrefChangedCallback("dom.max_script_run_time", nsnull);
|
2004-02-12 01:22:05 +03:00
|
|
|
|
2011-05-29 03:42:57 +04:00
|
|
|
Preferences::RegisterCallback(MaxScriptRunTimePrefChangedCallback,
|
|
|
|
"dom.max_chrome_script_run_time");
|
2006-07-28 02:36:36 +04:00
|
|
|
MaxScriptRunTimePrefChangedCallback("dom.max_chrome_script_run_time",
|
|
|
|
nsnull);
|
|
|
|
|
2011-05-29 03:42:57 +04:00
|
|
|
Preferences::RegisterCallback(ReportAllJSExceptionsPrefChangedCallback,
|
|
|
|
"dom.report_all_js_exceptions");
|
2008-04-10 21:35:56 +04:00
|
|
|
ReportAllJSExceptionsPrefChangedCallback("dom.report_all_js_exceptions",
|
|
|
|
nsnull);
|
|
|
|
|
2011-05-29 03:42:57 +04:00
|
|
|
Preferences::RegisterCallback(SetMemoryHighWaterMarkPrefChangedCallback,
|
|
|
|
"javascript.options.mem.high_water_mark");
|
2009-07-09 16:16:26 +04:00
|
|
|
SetMemoryHighWaterMarkPrefChangedCallback("javascript.options.mem.high_water_mark",
|
|
|
|
nsnull);
|
|
|
|
|
2011-05-29 03:42:57 +04:00
|
|
|
Preferences::RegisterCallback(SetMemoryMaxPrefChangedCallback,
|
|
|
|
"javascript.options.mem.max");
|
2010-12-03 01:38:00 +03:00
|
|
|
SetMemoryMaxPrefChangedCallback("javascript.options.mem.max",
|
|
|
|
nsnull);
|
|
|
|
|
2011-05-29 03:42:57 +04:00
|
|
|
Preferences::RegisterCallback(SetMemoryGCModePrefChangedCallback,
|
|
|
|
"javascript.options.mem.gc_per_compartment");
|
2011-01-10 09:57:21 +03:00
|
|
|
SetMemoryGCModePrefChangedCallback("javascript.options.mem.gc_per_compartment",
|
|
|
|
nsnull);
|
|
|
|
|
Bug 560095 - Use mozilla::services::GetObserverService(). r=biesi,dveditz,gavin,josh,jst,mrbkap,roc,sdwilsh,shaver,sicking,smontagu,surkov
2010-04-29 20:59:13 +04:00
|
|
|
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
|
|
|
|
if (!obs)
|
|
|
|
return NS_ERROR_FAILURE;
|
2007-10-23 01:42:25 +04:00
|
|
|
|
2011-07-07 22:27:07 +04:00
|
|
|
Preferences::AddBoolVarCache(&sGCOnMemoryPressure,
|
|
|
|
"javascript.options.gc_on_memory_pressure",
|
|
|
|
PR_TRUE);
|
|
|
|
|
2011-02-17 02:47:12 +03:00
|
|
|
nsIObserver* memPressureObserver = new nsMemoryPressureObserver();
|
|
|
|
NS_ENSURE_TRUE(memPressureObserver, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
obs->AddObserver(memPressureObserver, "memory-pressure", PR_FALSE);
|
2007-11-07 00:47:35 +03:00
|
|
|
|
2008-09-06 03:26:04 +04:00
|
|
|
sIsInitialized = PR_TRUE;
|
2001-11-27 12:46:38 +03:00
|
|
|
|
Bug 560095 - Use mozilla::services::GetObserverService(). r=biesi,dveditz,gavin,josh,jst,mrbkap,roc,sdwilsh,shaver,sicking,smontagu,surkov
2010-04-29 20:59:13 +04:00
|
|
|
return NS_OK;
|
1998-07-16 05:16:47 +04:00
|
|
|
}
|
|
|
|
|
2007-11-13 13:35:49 +03:00
|
|
|
//static
|
|
|
|
nsScriptNameSpaceManager*
|
|
|
|
nsJSRuntime::GetNameSpaceManager()
|
|
|
|
{
|
|
|
|
if (sDidShutdown)
|
|
|
|
return nsnull;
|
|
|
|
|
|
|
|
if (!gNameSpaceManager) {
|
|
|
|
gNameSpaceManager = new nsScriptNameSpaceManager;
|
2010-11-17 01:09:50 +03:00
|
|
|
NS_ADDREF(gNameSpaceManager);
|
2007-11-13 13:35:49 +03:00
|
|
|
|
|
|
|
nsresult rv = gNameSpaceManager->Init();
|
|
|
|
NS_ENSURE_SUCCESS(rv, nsnull);
|
|
|
|
}
|
|
|
|
|
|
|
|
return gNameSpaceManager;
|
|
|
|
}
|
|
|
|
|
2008-09-11 17:20:56 +04:00
|
|
|
/* static */
|
|
|
|
void
|
|
|
|
nsJSRuntime::Shutdown()
|
1998-07-16 05:16:47 +04:00
|
|
|
{
|
2011-02-17 02:47:12 +03:00
|
|
|
nsJSContext::KillGCTimer();
|
|
|
|
nsJSContext::KillCCTimer();
|
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 21:42:36 +04:00
|
|
|
|
2010-11-17 01:09:50 +03:00
|
|
|
NS_IF_RELEASE(gNameSpaceManager);
|
2001-11-27 12:46:38 +03:00
|
|
|
|
2002-05-03 07:02:07 +04:00
|
|
|
if (!sContextCount) {
|
|
|
|
// We're being shutdown, and there are no more contexts
|
2003-04-18 00:21:00 +04:00
|
|
|
// alive, release the JS runtime service and the security manager.
|
2002-05-03 07:02:07 +04:00
|
|
|
|
2005-07-08 08:47:58 +04:00
|
|
|
if (sRuntimeService && sSecurityManager) {
|
2008-09-06 03:26:04 +04:00
|
|
|
JSSecurityCallbacks *callbacks = JS_GetRuntimeSecurityCallbacks(sRuntime);
|
|
|
|
if (callbacks) {
|
|
|
|
NS_ASSERTION(callbacks->findObjectPrincipals == ObjectPrincipalFinder,
|
|
|
|
"Fighting over the findObjectPrincipals callback!");
|
|
|
|
callbacks->findObjectPrincipals = NULL;
|
|
|
|
}
|
2005-07-08 08:47:58 +04:00
|
|
|
}
|
2002-05-03 07:02:07 +04:00
|
|
|
NS_IF_RELEASE(sRuntimeService);
|
2003-04-18 00:21:00 +04:00
|
|
|
NS_IF_RELEASE(sSecurityManager);
|
2001-11-27 12:46:38 +03:00
|
|
|
}
|
2002-05-03 07:02:07 +04:00
|
|
|
|
|
|
|
sDidShutdown = PR_TRUE;
|
1998-07-16 05:16:47 +04:00
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// Script object mananagement - note duplicate implementation
|
|
|
|
// in nsJSContext above...
|
2001-11-27 12:46:38 +03:00
|
|
|
nsresult
|
2006-06-13 07:07:47 +04:00
|
|
|
nsJSRuntime::HoldScriptObject(void* aScriptObject)
|
2000-06-20 07:45:21 +04:00
|
|
|
{
|
2006-06-13 07:07:47 +04:00
|
|
|
NS_ASSERTION(sIsInitialized, "runtime not initialized");
|
|
|
|
if (! sRuntime) {
|
|
|
|
NS_NOTREACHED("couldn't remove GC root - no runtime");
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2000-06-20 07:45:21 +04:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
::JS_LockGCThingRT(sRuntime, aScriptObject);
|
|
|
|
return NS_OK;
|
1998-07-16 05:16:47 +04: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 21:42:36 +04:00
|
|
|
nsresult
|
2006-06-13 07:07:47 +04:00
|
|
|
nsJSRuntime::DropScriptObject(void* aScriptObject)
|
1998-07-16 05:16:47 +04:00
|
|
|
{
|
2006-06-13 07:07:47 +04:00
|
|
|
NS_ASSERTION(sIsInitialized, "runtime not initialized");
|
|
|
|
if (! sRuntime) {
|
|
|
|
NS_NOTREACHED("couldn't remove GC root");
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
(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 03:43:30 +03:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
::JS_UnlockGCThingRT(sRuntime, aScriptObject);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
// A factory for the runtime.
|
|
|
|
nsresult NS_CreateJSRuntime(nsIScriptRuntime **aRuntime)
|
|
|
|
{
|
|
|
|
nsresult rv = nsJSRuntime::Init();
|
2001-11-27 12:46:38 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
(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 03:43:30 +03:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
*aRuntime = new nsJSRuntime();
|
|
|
|
if (*aRuntime == nsnull)
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
NS_IF_ADDREF(*aRuntime);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2005-08-10 04:15:51 +04:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// A fast-array class for JS. This class supports both nsIJSScriptArray and
|
|
|
|
// nsIArray. If it is JS itself providing and consuming this class, all work
|
|
|
|
// can be done via nsIJSScriptArray, and avoid the conversion of elements
|
|
|
|
// to/from nsISupports.
|
|
|
|
// When consumed by non-JS (eg, another script language), conversion is done
|
|
|
|
// on-the-fly.
|
|
|
|
class nsJSArgArray : public nsIJSArgArray, public nsIArray {
|
|
|
|
public:
|
|
|
|
nsJSArgArray(JSContext *aContext, PRUint32 argc, jsval *argv, nsresult *prv);
|
|
|
|
~nsJSArgArray();
|
|
|
|
// nsISupports
|
2007-03-08 14:17:16 +03:00
|
|
|
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
2007-10-29 16:45:07 +03:00
|
|
|
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsJSArgArray,
|
|
|
|
nsIJSArgArray)
|
2006-06-13 07:07:47 +04:00
|
|
|
|
|
|
|
// nsIArray
|
|
|
|
NS_DECL_NSIARRAY
|
|
|
|
|
|
|
|
// nsIJSArgArray
|
|
|
|
nsresult GetArgs(PRUint32 *argc, void **argv);
|
2007-03-08 14:17:16 +03:00
|
|
|
|
|
|
|
void ReleaseJSObjects();
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
protected:
|
|
|
|
JSContext *mContext;
|
|
|
|
jsval *mArgv;
|
|
|
|
PRUint32 mArgc;
|
|
|
|
};
|
(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 03:43:30 +03:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
nsJSArgArray::nsJSArgArray(JSContext *aContext, PRUint32 argc, jsval *argv,
|
|
|
|
nsresult *prv) :
|
|
|
|
mContext(aContext),
|
2010-03-06 01:19:30 +03:00
|
|
|
mArgv(nsnull),
|
2006-06-13 07:07:47 +04:00
|
|
|
mArgc(argc)
|
|
|
|
{
|
|
|
|
// copy the array - we don't know its lifetime, and ours is tied to xpcom
|
|
|
|
// refcounting. Alloc zero'd array so cleanup etc is safe.
|
2010-03-06 01:19:30 +03:00
|
|
|
if (argc) {
|
|
|
|
mArgv = (jsval *) PR_CALLOC(argc * sizeof(jsval));
|
|
|
|
if (!mArgv) {
|
|
|
|
*prv = NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
return;
|
|
|
|
}
|
2006-06-13 07:07:47 +04:00
|
|
|
}
|
2007-09-19 04:26:39 +04:00
|
|
|
|
2007-10-29 16:45:07 +03:00
|
|
|
// Callers are allowed to pass in a null argv even for argc > 0. They can
|
|
|
|
// then use GetArgs to initialize the values.
|
|
|
|
if (argv) {
|
|
|
|
for (PRUint32 i = 0; i < argc; ++i)
|
2006-06-13 07:07:47 +04:00
|
|
|
mArgv[i] = argv[i];
|
|
|
|
}
|
2007-10-31 13:52:22 +03:00
|
|
|
|
|
|
|
*prv = argc > 0 ? NS_HOLD_JS_OBJECTS(this, nsJSArgArray) : NS_OK;
|
2006-06-13 07:07:47 +04:00
|
|
|
}
|
2005-08-10 04:15:51 +04:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
nsJSArgArray::~nsJSArgArray()
|
2007-03-08 14:17:16 +03:00
|
|
|
{
|
|
|
|
ReleaseJSObjects();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
nsJSArgArray::ReleaseJSObjects()
|
2006-06-13 07:07:47 +04:00
|
|
|
{
|
2007-10-29 16:45:07 +03:00
|
|
|
if (mArgc > 0)
|
|
|
|
NS_DROP_JS_OBJECTS(this, nsJSArgArray);
|
2006-06-13 07:07:47 +04:00
|
|
|
if (mArgv) {
|
|
|
|
PR_DELETE(mArgv);
|
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 21:42:36 +04:00
|
|
|
}
|
2007-03-08 14:17:16 +03:00
|
|
|
mArgc = 0;
|
2006-06-13 07:07:47 +04: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 21:42:36 +04:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
// QueryInterface implementation for nsJSArgArray
|
2007-03-08 14:17:16 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_CLASS(nsJSArgArray)
|
2010-11-08 18:02:49 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsJSArgArray)
|
2007-03-08 14:17:16 +03:00
|
|
|
tmp->ReleaseJSObjects();
|
2010-11-08 18:02:49 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
2007-03-08 14:17:16 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsJSArgArray)
|
2007-10-29 16:45:07 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
|
|
|
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsJSArgArray)
|
|
|
|
jsval *argv = tmp->mArgv;
|
|
|
|
if (argv) {
|
|
|
|
jsval *end;
|
|
|
|
for (end = argv + tmp->mArgc; argv < end; ++argv) {
|
|
|
|
if (JSVAL_IS_GCTHING(*argv))
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRACE_CALLBACK(JAVASCRIPT,
|
2011-02-02 18:30:03 +03:00
|
|
|
JSVAL_TO_GCTHING(*argv),
|
|
|
|
"mArgv[i]")
|
2007-03-08 14:17:16 +03:00
|
|
|
}
|
|
|
|
}
|
2007-10-29 16:45:07 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRACE_END
|
2007-03-08 14:17:16 +03:00
|
|
|
|
2007-04-25 20:35:27 +04:00
|
|
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsJSArgArray)
|
2006-06-13 07:07:47 +04:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIArray)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIJSArgArray)
|
|
|
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIJSArgArray)
|
|
|
|
NS_INTERFACE_MAP_END
|
2001-11-27 12:46:38 +03:00
|
|
|
|
2011-03-06 14:11:31 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTING_ADDREF(nsJSArgArray)
|
|
|
|
NS_IMPL_CYCLE_COLLECTING_RELEASE(nsJSArgArray)
|
2001-11-27 12:46:38 +03:00
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
nsresult
|
|
|
|
nsJSArgArray::GetArgs(PRUint32 *argc, void **argv)
|
|
|
|
{
|
|
|
|
if (!mArgv) {
|
|
|
|
NS_WARNING("nsJSArgArray has no argv!");
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
}
|
|
|
|
*argv = (void *)mArgv;
|
|
|
|
*argc = mArgc;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
// nsIArray impl
|
|
|
|
NS_IMETHODIMP nsJSArgArray::GetLength(PRUint32 *aLength)
|
|
|
|
{
|
|
|
|
*aLength = mArgc;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* void queryElementAt (in unsigned long index, in nsIIDRef uuid, [iid_is (uuid), retval] out nsQIResult result); */
|
|
|
|
NS_IMETHODIMP nsJSArgArray::QueryElementAt(PRUint32 index, const nsIID & uuid, void * *result)
|
|
|
|
{
|
|
|
|
*result = nsnull;
|
|
|
|
if (index >= mArgc)
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
|
|
|
|
if (uuid.Equals(NS_GET_IID(nsIVariant)) || uuid.Equals(NS_GET_IID(nsISupports))) {
|
|
|
|
return nsContentUtils::XPConnect()->JSToVariant(mContext, mArgv[index],
|
|
|
|
(nsIVariant **)result);
|
|
|
|
}
|
|
|
|
NS_WARNING("nsJSArgArray only handles nsIVariant");
|
|
|
|
return NS_ERROR_NO_INTERFACE;
|
1998-07-16 05:16:47 +04:00
|
|
|
}
|
|
|
|
|
2006-06-13 07:07:47 +04:00
|
|
|
/* unsigned long indexOf (in unsigned long startIndex, in nsISupports element); */
|
|
|
|
NS_IMETHODIMP nsJSArgArray::IndexOf(PRUint32 startIndex, nsISupports *element, PRUint32 *_retval)
|
|
|
|
{
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* nsISimpleEnumerator enumerate (); */
|
|
|
|
NS_IMETHODIMP nsJSArgArray::Enumerate(nsISimpleEnumerator **_retval)
|
|
|
|
{
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
// The factory function
|
|
|
|
nsresult NS_CreateJSArgv(JSContext *aContext, PRUint32 argc, void *argv,
|
|
|
|
nsIArray **aArray)
|
|
|
|
{
|
|
|
|
nsresult rv;
|
|
|
|
nsJSArgArray *ret = new nsJSArgArray(aContext, argc,
|
2007-07-08 11:08:04 +04:00
|
|
|
static_cast<jsval *>(argv), &rv);
|
2006-06-13 07:07:47 +04:00
|
|
|
if (ret == nsnull)
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
delete ret;
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
return ret->QueryInterface(NS_GET_IID(nsIArray), (void **)aArray);
|
|
|
|
}
|