diff --git a/js/src/xpconnect/Makefile.in b/js/src/xpconnect/Makefile.in index 948699c48f13..7cb6ca39d554 100644 --- a/js/src/xpconnect/Makefile.in +++ b/js/src/xpconnect/Makefile.in @@ -23,7 +23,7 @@ include $(DEPTH)/config/autoconf.mk DIRS = public src ifdef ENABLE_TESTS -DIRS += tests +DIRS += tests shell endif include $(topsrcdir)/config/rules.mk diff --git a/js/src/xpconnect/idl/mk.bat b/js/src/xpconnect/idl/mk.bat index c8a514d6c24d..8a4b02f3d9a4 100755 --- a/js/src/xpconnect/idl/mk.bat +++ b/js/src/xpconnect/idl/mk.bat @@ -2,7 +2,7 @@ xpidl -w -m header -o ..\public\nsrootidl nsrootidl.idl xpidl -w -m header -o ..\public\xpccomponents xpccomponents.idl xpidl -w -m header -o ..\public\xpcjsid xpcjsid.idl -xpidl -w -m header -o ..\tests\xpctest xpctest.idl +xpidl -w -m header -o ..\public\xpctest xpctest.idl xpidl -w -m typelib -o ..\typelib\xpccomponents xpccomponents.idl xpidl -w -m typelib -o ..\typelib\xpcjsid xpcjsid.idl diff --git a/js/src/xpconnect/idl/xpcjsid.idl b/js/src/xpconnect/idl/xpcjsid.idl index 7d21c9130959..7d3d6e77fa4e 100644 --- a/js/src/xpconnect/idl/xpcjsid.idl +++ b/js/src/xpconnect/idl/xpcjsid.idl @@ -44,7 +44,8 @@ interface nsIJSIID : nsIJSID [scriptable, uuid(e3a24a60-d651-11d2-9843-006008962422)] interface nsIJSCID : nsIJSID { - nsISupports newInstance(); + nsISupports createInstance(); + nsISupports getService(); }; /* this goes into the C++ header verbatim. */ diff --git a/js/src/xpconnect/makefile.win b/js/src/xpconnect/makefile.win index 7ad27ab0c8c9..6ad5a0bc3695 100644 --- a/js/src/xpconnect/makefile.win +++ b/js/src/xpconnect/makefile.win @@ -17,6 +17,6 @@ DEPTH=..\..\.. IGNORE_MANIFEST=1 -DIRS=public src tests +DIRS=public src tests shell include <$(DEPTH)\config\rules.mak> diff --git a/js/src/xpconnect/public/Makefile.in b/js/src/xpconnect/public/Makefile.in index 15948117a973..8ce0c4f4543c 100644 --- a/js/src/xpconnect/public/Makefile.in +++ b/js/src/xpconnect/public/Makefile.in @@ -29,6 +29,7 @@ EXPORTS = \ xpccomponents.h \ xpcjsid.h \ xpclog.h \ + xpctest.h \ nsrootidl.h \ $(NULL) diff --git a/js/src/xpconnect/public/makefile.win b/js/src/xpconnect/public/makefile.win index af2893c14e20..f382b9c54428 100644 --- a/js/src/xpconnect/public/makefile.win +++ b/js/src/xpconnect/public/makefile.win @@ -25,6 +25,7 @@ EXPORTS = \ xpccomponents.h \ xpcjsid.h \ xpclog.h \ + xpctest.h \ nsrootidl.h \ $(NULL) diff --git a/js/src/xpconnect/public/nsIXPConnect.h b/js/src/xpconnect/public/nsIXPConnect.h index 96bd424b15f3..61220eb98c21 100644 --- a/js/src/xpconnect/public/nsIXPConnect.h +++ b/js/src/xpconnect/public/nsIXPConnect.h @@ -54,6 +54,21 @@ // forward declarations... class nsIXPCScriptable; class nsIInterfaceInfo; +class nsIXPConnectWrappedNative; +class nsIXPConnectFinalizeListener; + + +// {1B2DDB00-EEE8-11d2-BAA4-00805F8A5DD7} +#define NS_IXPCONNECT_FINALIZE_LISTENER_IID \ +{ 0x1b2ddb00, 0xeee8, 0x11d2, \ + { 0xba, 0xa4, 0x0, 0x80, 0x5f, 0x8a, 0x5d, 0xd7 } } +class nsIXPConnectFinalizeListener : public nsISupports +{ +public: + NS_DEFINE_STATIC_IID_ACCESSOR(NS_IXPCONNECT_FINALIZE_LISTENER_IID) + + NS_IMETHOD AboutToRelease(nsISupports* aObj) = 0; +}; // {215DBE02-94A7-11d2-BA58-00805F8A5DD7} #define NS_IXPCONNECT_WRAPPED_NATIVE_IID \ @@ -72,6 +87,8 @@ public: NS_IMETHOD GetInterfaceInfo(nsIInterfaceInfo** info) = 0; NS_IMETHOD GetIID(nsIID** iid) = 0; // returns IAllocatator alloc'd copy NS_IMETHOD DebugDump(int depth) = 0; + NS_IMETHOD SetFinalizeListener(nsIXPConnectFinalizeListener* aListener) = 0; + // XXX other methods? }; @@ -119,13 +136,18 @@ public: NS_DEFINE_STATIC_IID_ACCESSOR(NS_IXPCONNECT_IID) NS_IMETHOD InitJSContext(JSContext* aJSContext, - JSObject* aGlobalJSObj) = 0; + JSObject* aGlobalJSObj, + JSBool AddComponentsObject) = 0; NS_IMETHOD InitJSContextWithNewWrappedGlobal(JSContext* aJSContext, nsISupports* aCOMObj, REFNSIID aIID, + JSBool AddComponentsObject, nsIXPConnectWrappedNative** aWrapper) = 0; + NS_IMETHOD AddNewComponentsObject(JSContext* aJSContext, + JSObject* aGlobalJSObj) = 0; + // XXX add 'AbandonJSContext' method and all that implies? NS_IMETHOD WrapNative(JSContext* aJSContext, diff --git a/js/src/xpconnect/public/xpccomponents.h b/js/src/xpconnect/public/xpccomponents.h index da359d675d09..86c1a4486d71 100644 --- a/js/src/xpconnect/public/xpccomponents.h +++ b/js/src/xpconnect/public/xpccomponents.h @@ -22,10 +22,7 @@ class nsIXPCInterfaces : public nsISupports { public: - static const nsIID& GetIID() { - static nsIID iid = NS_IXPCINTERFACES_IID; - return iid; - } + NS_DEFINE_STATIC_IID_ACCESSOR(NS_IXPCINTERFACES_IID) #ifdef XPIDL_JS_STUBS static NS_EXPORT_(JSObject *) InitJSClass(JSContext *cx); @@ -43,10 +40,7 @@ class nsIXPCInterfaces : public nsISupports { class nsIXPCClasses : public nsISupports { public: - static const nsIID& GetIID() { - static nsIID iid = NS_IXPCCLASSES_IID; - return iid; - } + NS_DEFINE_STATIC_IID_ACCESSOR(NS_IXPCCLASSES_IID) #ifdef XPIDL_JS_STUBS static NS_EXPORT_(JSObject *) InitJSClass(JSContext *cx); @@ -64,32 +58,46 @@ class nsIXPCClasses : public nsISupports { class nsIXPCComponents : public nsISupports { public: - static const nsIID& GetIID() { - static nsIID iid = NS_IXPCCOMPONENTS_IID; - return iid; - } + NS_DEFINE_STATIC_IID_ACCESSOR(NS_IXPCCOMPONENTS_IID) /* readonly attribute nsIXPCInterfaces interfaces; */ NS_IMETHOD GetInterfaces(nsIXPCInterfaces * *aInterfaces) = 0; /* readonly attribute nsIXPCClasses classes; */ NS_IMETHOD GetClasses(nsIXPCClasses * *aClasses) = 0; + enum { RESULT_NS_OK = 0 }; + enum { RESULT_NS_COMFALSE = 1 }; + enum { RESULT_NS_ERROR_NOT_IMPLEMENTED = -2147467263 }; + enum { RESULT_NS_NOINTERFACE = -2147467262 }; + enum { RESULT_NS_ERROR_NO_INTERFACE = -2147467262 }; + enum { RESULT_NS_ERROR_INVALID_POINTER = -2147467261 }; + enum { RESULT_NS_ERROR_NULL_POINTER = -2147467261 }; + enum { RESULT_NS_ERROR_ABORT = -2147467260 }; + enum { RESULT_NS_ERROR_FAILURE = -2147467259 }; + enum { RESULT_NS_ERROR_UNEXPECTED = -2147418113 }; + enum { RESULT_NS_ERROR_OUT_OF_MEMORY = -2147024882 }; + enum { RESULT_NS_ERROR_ILLEGAL_VALUE = -2147024809 }; + enum { RESULT_NS_ERROR_INVALID_ARG = -2147024809 }; + enum { RESULT_NS_ERROR_NO_AGGREGATION = -2147221232 }; + enum { RESULT_NS_ERROR_NOT_AVAILABLE = -2147221231 }; + enum { RESULT_NS_ERROR_FACTORY_NOT_REGISTERED = -2147221164 }; + enum { RESULT_NS_ERROR_FACTORY_NOT_LOADED = -2147221000 }; #ifdef XPIDL_JS_STUBS diff --git a/js/src/xpconnect/public/xpcjsid.h b/js/src/xpconnect/public/xpcjsid.h index dac19f4a02d5..7a2b4c8bc1ba 100644 --- a/js/src/xpconnect/public/xpcjsid.h +++ b/js/src/xpconnect/public/xpcjsid.h @@ -22,10 +22,7 @@ class nsIJSID : public nsISupports { public: - static const nsIID& GetIID() { - static nsIID iid = NS_IJSID_IID; - return iid; - } + NS_DEFINE_STATIC_IID_ACCESSOR(NS_IJSID_IID) /* readonly attribute string name; */ NS_IMETHOD GetName(char * *aName) = 0; @@ -64,10 +61,7 @@ class nsIJSID : public nsISupports { class nsIJSIID : public nsIJSID { public: - static const nsIID& GetIID() { - static nsIID iid = NS_IJSIID_IID; - return iid; - } + NS_DEFINE_STATIC_IID_ACCESSOR(NS_IJSIID_IID) #ifdef XPIDL_JS_STUBS static NS_EXPORT_(JSObject *) InitJSClass(JSContext *cx); @@ -85,13 +79,13 @@ class nsIJSIID : public nsIJSID { class nsIJSCID : public nsIJSID { public: - static const nsIID& GetIID() { - static nsIID iid = NS_IJSCID_IID; - return iid; - } + NS_DEFINE_STATIC_IID_ACCESSOR(NS_IJSCID_IID) - /* nsISupports newInstance (); */ - NS_IMETHOD newInstance(nsISupports **_retval) = 0; + /* nsISupports createInstance (); */ + NS_IMETHOD createInstance(nsISupports **_retval) = 0; + + /* nsISupports getService (); */ + NS_IMETHOD getService(nsISupports **_retval) = 0; #ifdef XPIDL_JS_STUBS static NS_EXPORT_(JSObject *) InitJSClass(JSContext *cx); diff --git a/js/src/xpconnect/tests/xpctest.h b/js/src/xpconnect/public/xpctest.h similarity index 94% rename from js/src/xpconnect/tests/xpctest.h rename to js/src/xpconnect/public/xpctest.h index ab81def8a6f1..085aec1c2f3c 100644 --- a/js/src/xpconnect/tests/xpctest.h +++ b/js/src/xpconnect/public/xpctest.h @@ -22,18 +22,18 @@ class nsITestXPCFoo : public nsISupports { public: - static const nsIID& GetIID() { - static nsIID iid = NS_ITESTXPCFOO_IID; - return iid; - } + NS_DEFINE_STATIC_IID_ACCESSOR(NS_ITESTXPCFOO_IID) /* long Test (in long p1, in long p2); */ NS_IMETHOD Test(PRInt32 p1, PRInt32 p2, PRInt32 *_retval) = 0; /* void Test2 (); */ NS_IMETHOD Test2() = 0; + enum { one = 1 }; + enum { five = 5 }; + enum { six = 6 }; #ifdef XPIDL_JS_STUBS @@ -52,10 +52,7 @@ class nsITestXPCFoo : public nsISupports { class nsITestXPCFoo2 : public nsITestXPCFoo { public: - static const nsIID& GetIID() { - static nsIID iid = NS_ITESTXPCFOO2_IID; - return iid; - } + NS_DEFINE_STATIC_IID_ACCESSOR(NS_ITESTXPCFOO2_IID) #ifdef XPIDL_JS_STUBS static NS_EXPORT_(JSObject *) InitJSClass(JSContext *cx); @@ -73,10 +70,7 @@ class nsITestXPCFoo2 : public nsITestXPCFoo { class nsIEcho : public nsISupports { public: - static const nsIID& GetIID() { - static nsIID iid = NS_IECHO_IID; - return iid; - } + NS_DEFINE_STATIC_IID_ACCESSOR(NS_IECHO_IID) /* void SetReceiver (in nsIEcho aReceiver); */ NS_IMETHOD SetReceiver(nsIEcho *aReceiver) = 0; diff --git a/js/src/xpconnect/shell/.cvsignore b/js/src/xpconnect/shell/.cvsignore new file mode 100644 index 000000000000..d1933418e514 --- /dev/null +++ b/js/src/xpconnect/shell/.cvsignore @@ -0,0 +1,2 @@ +Makefile +mk.bat diff --git a/js/src/xpconnect/shell/Makefile.in b/js/src/xpconnect/shell/Makefile.in new file mode 100644 index 000000000000..e88a9e1cd351 --- /dev/null +++ b/js/src/xpconnect/shell/Makefile.in @@ -0,0 +1,71 @@ +#!gmake +# +# The contents of this file are subject to the Netscape Public License +# Version 1.0 (the "NPL"); you may not use this file except in +# compliance with the NPL. You may obtain a copy of the NPL at +# http://www.mozilla.org/NPL/ +# +# Software distributed under the NPL is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL +# for the specific language governing rights and limitations under the +# NPL. +# +# The Initial Developer of this code under the NPL is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All Rights +# Reserved. + +DEPTH = ../../../.. +topsrcdir = @top_srcdir@ +VPATH = @srcdir@ +srcdir = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +MODULE = xpcshell + +SIMPLE_PROGRAMS = xpcshell + +CPPSRCS = \ + xpcshell.cpp \ + $(NULL) + +include $(topsrcdir)/config/config.mk + +DEFINES += -DJS_THREADSAFE + +LIBS = \ + -L$(DIST)/bin \ + -l$(MOZ_LIB_JS_PREFIX)js \ + -lxpcom \ + -lxpconnect \ + -lxpt \ + -lxptinfo \ + -lxptcall \ + -lxptcmd \ + -lreg \ + -l$(MOZ_LIB_UTIL_PREFIX)util \ + $(NSPR_LIBS) \ + $(NULL) + + +# PROGS = $(OBJDIR)/TestXPC + +# TARGETS= $(PROGS) + +include $(topsrcdir)/config/rules.mk + +# INCLUDES += -I$(PUBLIC)/xpcom -I$(PUBLIC)/js -I$(PUBLIC)/xpconnect \ +# -I$(PUBLIC)/raptor + +#$(PROGS): $(OBJS) +# @$(MAKE_OBJDIR) +# $(CC) -o $@ $(OBJS) $(LD_FLAGS) -L$(DIST)/lib $(LIBS) $(OS_LIBS) + +# export:: $(TARGETS) +# $(INSTALL) $(PROGS) $(DIST)/bin +# $(INSTALL) $(TEST_FILES) $(DIST)/bin + +# clobber:: +# rm -f $(DIST)/bin/TestXPC +# rm -f $(PROGS) $(OBJS) diff --git a/js/src/xpconnect/shell/makefile.win b/js/src/xpconnect/shell/makefile.win new file mode 100644 index 000000000000..c3980ea0fbc1 --- /dev/null +++ b/js/src/xpconnect/shell/makefile.win @@ -0,0 +1,65 @@ +#!nmake +# +# The contents of this file are subject to the Netscape Public License +# Version 1.0 (the "NPL"); you may not use this file except in +# compliance with the NPL. You may obtain a copy of the NPL at +# http://www.mozilla.org/NPL/ +# +# Software distributed under the NPL is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL +# for the specific language governing rights and limitations under the +# NPL. +# +# The Initial Developer of this code under the NPL is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All Rights +# Reserved. + +DEPTH=..\..\..\.. + +IGNORE_MANIFEST=1 + +MAKE_OBJ_TYPE = EXE +PROG1 = .\$(OBJDIR)\xpcshell.exe +PROGRAMS = $(PROG1) + +LCFLAGS=-DUSE_NSREG -DWIN32_LEAN_AND_MEAN + +REQUIRES=xpcom js xpconnect + +LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\js -I$(PUBLIC)\xpconnect \ + -I$(PUBLIC)\raptor -I$(PUBLIC)\xptinfo -I$(PUBLIC)\libxpt + +LLIBS= \ + $(DIST)\lib\xpcom32.lib \ + $(LIBNSPR) \ + $(DIST)\lib\js3250.lib \ + $(DIST)\lib\xpc3250.lib \ + $(DIST)\lib\raptorbase.lib \ + $(NULL) + +include <$(DEPTH)\config\rules.mak> + +install:: $(PROGRAMS) + -for %p in ($(PROGRAMS)) do $(MAKE_INSTALL) %p $(DIST)\bin + +clobber:: + -for %p in ($(PROGRAMS)) do $(RM) %p $(DIST)\bin\%p + +# Move this into config/obj.inc when it's allowed +.cpp{.\$(OBJDIR)\}.exe: + $(CC) @<<$(CFGFILE) + $(CFLAGS) + $(LCFLAGS) + $(LINCS) + $(LINCS_1) + $(INCS) + $(LLIBS) + $(OS_LIBS) + -Fd$(PDBFILE) + -Fe.\$(OBJDIR)\ + -Fo.\$(OBJDIR)\ + $(CURDIR)$(*B).cpp +< +#include "nsIXPConnect.h" +#include "nsIXPCScriptable.h" +#include "nsIInterfaceInfo.h" +#include "nsIInterfaceInfoManager.h" +#include "nsIXPCScriptable.h" +#include "nsIServiceManager.h" +#include "nsIComponentManager.h" +#include "jsapi.h" +#include "xpclog.h" +#include "nscore.h" +#include "nsIAllocator.h" +#include "nsIGenericFactory.h" + +// all this crap is needed to do the interactive shell stuff +#include +#include +#ifdef XP_PC +#include /* for isatty() */ +#endif +#include "jsparse.h" +#include "jsscan.h" +#include "jsemit.h" +#include "jsscript.h" +#include "jsarena.h" +#include "jscntxt.h" + +#include "nsSpecialSystemDirectory.h" // For exe dir + + +/***************************************************************************/ +static NS_DEFINE_CID(kGenericFactoryCID, NS_GENERICFACTORY_CID); +static NS_DEFINE_IID(kIAllocatorIID, NS_IALLOCATOR_IID); +static NS_DEFINE_IID(kAllocatorCID, NS_ALLOCATOR_CID); + +#ifdef XP_PC +#define XPCOM_DLL "xpcom32.dll" +#else +#ifdef XP_MAC +#define XPCOM_DLL "XPCOM_DLL" +#else +#define XPCOM_DLL "libxpcom.so" +#endif +#endif + +static void SetupRegistry() +{ + // Autoregistration happens here. The rest of RegisterComponent() calls should happen + // only for dlls not in the components directory. + + // Create exeDir/"components" + nsSpecialSystemDirectory sysdir(nsSpecialSystemDirectory::OS_CurrentProcessDirectory); + sysdir += "components"; + const char *componentsDir = sysdir.GetCString(); // native path + if (componentsDir != NULL) + { +#ifdef XP_PC + /* The PC version of the directory from filePath is of the form + * /y|/moz/mozilla/dist/bin/components + * We need to remove the initial / and change the | to : + * for all this to work with NSPR. + */ +#endif /* XP_PC */ + printf("nsComponentManager: Using components dir: %s\n", componentsDir); + +#ifdef XP_MAC + nsComponentManager::AutoRegister(nsIComponentManager::NS_Startup, nsnull); +#else + nsComponentManager::AutoRegister(nsIComponentManager::NS_Startup, componentsDir); +#endif /* XP_MAC */ + // XXX Look for user specific components + // XXX UNIX: ~/.mozilla/components + } + +// nsComponentManager::RegisterComponent(kAllocatorCID, NULL, NULL, +// XPCOM_DLL, PR_FALSE, PR_FALSE); + + nsComponentManager::RegisterComponent(kAllocatorCID, NULL, "allocator", + XPCOM_DLL, PR_TRUE, PR_TRUE); + + nsComponentManager::RegisterComponent(kGenericFactoryCID, NULL, NULL, + XPCOM_DLL, PR_FALSE, PR_FALSE); +} +/***************************************************************************/ + +FILE *gOutFile = NULL; +FILE *gErrFile = NULL; + +static void +my_ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report) +{ + printf(message); +} + +static JSBool +Print(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + uintN i, n; + JSString *str; + + for (i = n = 0; i < argc; i++) { + str = JS_ValueToString(cx, argv[i]); + if (!str) + return JS_FALSE; + fprintf(gOutFile, "%s%s", i ? " " : "", JS_GetStringBytes(str)); + } + n++; + if (n) + fputc('\n', gOutFile); + return JS_TRUE; +} + +static JSBool +Load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + uintN i; + JSString *str; + const char *filename; + JSScript *script; + JSBool ok; + jsval result; + + for (i = 0; i < argc; i++) { + str = JS_ValueToString(cx, argv[i]); + if (!str) + return JS_FALSE; + argv[i] = STRING_TO_JSVAL(str); + filename = JS_GetStringBytes(str); + script = JS_CompileFile(cx, obj, filename); + if (!script) + ok = JS_FALSE; + else { + ok = JS_ExecuteScript(cx, obj, script, &result); + JS_DestroyScript(cx, script); + } + if (!ok) + return JS_FALSE; + } + return JS_TRUE; +} + +static JSBool +Version(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + if (argc > 0 && JSVAL_IS_INT(argv[0])) + *rval = INT_TO_JSVAL(JS_SetVersion(cx, JSVersion(JSVAL_TO_INT(argv[0])))); + else + *rval = INT_TO_JSVAL(JS_GetVersion(cx)); + return JS_TRUE; +} + +static JSBool +BuildDate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + fprintf(gOutFile, "built on %s at %s\n", __DATE__, __TIME__); + return JS_TRUE; +} + +static JSBool +Quit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ +#ifdef LIVECONNECT + JSJ_SimpleShutdown(); +#endif + exit(0); + return JS_FALSE; +} + +static JSFunctionSpec glob_functions[] = { + {"print", Print, 0}, + {"load", Load, 1}, + {"quit", Quit, 0}, + {"version", Version, 1}, + {"build", BuildDate, 0}, + {0} +}; + +static JSClass global_class = { + "global", 0, + JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, + JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub +}; + +/***************************************************************************/ + +static void +Process(JSContext *cx, JSObject *obj, char *filename) +{ + JSTokenStream *ts; + JSCodeGenerator cg; + JSBool ok; + JSScript *script; + jsval result; + JSString *str; + + ts = js_NewFileTokenStream(cx, filename, stdin); + if (!ts) + goto out; +#ifdef JSDEBUGGER + if (!filename) + ts->filename = "typein"; +#endif + if (isatty(fileno(ts->file))) { + ts->flags |= TSF_INTERACTIVE; + } else { + /* Support the UNIX #! shell hack; gobble the first line if it starts + * with '#'. TODO - this isn't quite compatible with sharp variables, + * as a legal js program (using sharp variables) might start with '#'. + * But that would require multi-character lookahead. + */ + int ch = fgetc(ts->file); + if (ch == '#') { + while((ch = fgetc(ts->file)) != EOF) { + if(ch == '\n' || ch == '\r') + break; + } + } + ungetc(ch, ts->file); + } + + do { + js_InitCodeGenerator(cx, &cg, ts->filename, ts->lineno, ts->principals); + do { + if (ts->flags & TSF_INTERACTIVE) + fprintf(gOutFile, "js> "); + ok = js_CompileTokenStream(cx, obj, ts, &cg); + if (ts->flags & TSF_ERROR) { + ts->flags &= ~TSF_ERROR; + CLEAR_PUSHBACK(ts); + ok = JS_TRUE; + } + } while (ok && !(ts->flags & TSF_EOF) && CG_OFFSET(&cg) == 0); + if (ok) { + /* Clear any pending exception from previous failed compiles. */ + JS_ClearPendingException(cx); + + script = js_NewScriptFromCG(cx, &cg, NULL); + if (script) { + JSErrorReporter older; + + ok = JS_ExecuteScript(cx, obj, script, &result); + if (ok && + (ts->flags & TSF_INTERACTIVE) && + result != JSVAL_VOID) { + /* + * If JS_ValueToString generates an error, suppress + * the report and print the exception below. + */ + older = JS_SetErrorReporter(cx, NULL); + str = JS_ValueToString(cx, result); + JS_SetErrorReporter(cx, older); + + if (str) + fprintf(gOutFile, "%s\n", JS_GetStringBytes(str)); + else + ok = JS_FALSE; + } + +#if JS_HAS_ERROR_EXCEPTIONS +#if 0 + /* + * Require that any time we return failure, an exception has + * been set. + */ + JS_ASSERT(ok || JS_IsExceptionPending(cx)); + + /* + * Also that any time an exception has been set, we've + * returned failure. + */ + JS_ASSERT(!JS_IsExceptionPending(cx) || !ok); +#endif +#endif /* JS_HAS_ERROR_EXCEPTIONS */ + JS_DestroyScript(cx, script); + } + } + cg.firstLine = ts->lineno; + js_FinishCodeGenerator(cx, &cg); + RESET_TOKENBUF(ts); + } while (!(ts->flags & TSF_EOF)); + +out: + if (ts) + (void) js_CloseTokenStream(cx, ts); + JS_FreeArenaPool(&cx->codePool); + JS_FreeArenaPool(&cx->tempPool); +} + +static int +usage(void) +{ + fprintf(gErrFile, "%s\n", JS_GetImplementationVersion()); + fprintf(gErrFile, "usage: js [-w] [-v version] [-f scriptfile] [scriptfile] [scriptarg...]\n"); + return 2; +} + +static int reportWarnings; + +static int +ProcessArgs(JSContext *cx, JSObject *obj, char **argv, int argc) +{ + int i; + char *filename = NULL; + jsint length; + jsval *vector; + jsval *p; + JSObject *argsObj; + JSBool isInteractive = JS_TRUE; + + for (i=0; i < argc; i++) { + if (argv[i][0] == '-') { + switch (argv[i][1]) { + case 'v': + if (i+1 == argc) { + return usage(); + } + JS_SetVersion(cx, JSVersion(atoi(argv[i+1]))); + i++; + break; + case 'w': + reportWarnings++; + break; + + case 'f': + if (i+1 == argc) { + return usage(); + } + filename = argv[i+1]; + /* "-f -" means read from stdin */ + if (filename[0] == '-' && filename[1] == '\0') + filename = NULL; + Process(cx, obj, filename); + filename = NULL; + /* XXX: js -f foo.js should interpret foo.js and then + * drop into interactive mode, but that breaks test + * harness. Just execute foo.js for now. + */ + isInteractive = JS_FALSE; + i++; + break; + default: + return usage(); + } + } else { + filename = argv[i++]; + isInteractive = JS_FALSE; + break; + } + } + + length = argc - i; + vector = (jsval*) JS_malloc(cx, length * sizeof(jsval)); + p = vector; + + if (vector == NULL) + return 1; + + while (i < argc) { + JSString *str = JS_NewStringCopyZ(cx, argv[i]); + if (str == NULL) + return 1; + *p++ = STRING_TO_JSVAL(str); + i++; + } + argsObj = JS_NewArrayObject(cx, length, vector); + JS_free(cx, vector); + if (argsObj == NULL) + return 1; + + if (!JS_DefineProperty(cx, obj, "arguments", + OBJECT_TO_JSVAL(argsObj), NULL, NULL, 0)) + return 1; + + if (filename || isInteractive) + Process(cx, obj, filename); + return 0; +} + +/***************************************************************************/ + +int +main(int argc, char **argv) +{ + JSRuntime *rt; + JSContext *jscontext; + JSObject *glob; + int result; + + gErrFile = stderr; + gOutFile = stdout; + + SetupRegistry(); + + rt = JS_NewRuntime(8L * 1024L * 1024L); + if (!rt) + return 1; + jscontext = JS_NewContext(rt, 8192); + if (!jscontext) + return 1; + + JS_SetErrorReporter(jscontext, my_ErrorReporter); + + nsIXPConnect* xpc = XPC_GetXPConnect(); + if(!xpc) + { + printf("XPC_GetXPConnect() returned NULL!\n"); + return 1; + } + + glob = JS_NewObject(jscontext, &global_class, NULL, NULL); + if (!glob) + return 1; + + if (!JS_InitStandardClasses(jscontext, glob)) + return 1; + if (!JS_DefineFunctions(jscontext, glob, glob_functions)) + return 1; + + xpc->InitJSContext(jscontext, glob, JS_TRUE); + + argc--; + argv++; + + result = ProcessArgs(jscontext, glob, argv, argc); + + NS_RELEASE(xpc); + JS_DestroyContext(jscontext); + JS_DestroyRuntime(rt); + JS_ShutDown(); + return result; +} + +/***************************************************************************/ + +#include "jsatom.h" +#ifdef DEBUG +int +DumpAtom(JSHashEntry *he, int i, void *arg) +{ + FILE *fp = (FILE *)arg; + JSAtom *atom = (JSAtom *)he; + + fprintf(fp, "%3d %08x %5lu ", + i, (uintN)he->keyHash, (unsigned long)atom->number); + if (ATOM_IS_STRING(atom)) + fprintf(fp, "\"%s\"\n", ATOM_BYTES(atom)); + else if (ATOM_IS_INT(atom)) + fprintf(fp, "%ld\n", (long)ATOM_TO_INT(atom)); + else + fprintf(fp, "%.16g\n", *ATOM_TO_DOUBLE(atom)); + return HT_ENUMERATE_NEXT; +} + +int +DumpSymbol(JSHashEntry *he, int i, void *arg) +{ + FILE *fp = (FILE *)arg; + JSSymbol *sym = (JSSymbol *)he; + + fprintf(fp, "%3d %08x", i, (uintN)he->keyHash); + if (JSVAL_IS_INT(sym_id(sym))) + fprintf(fp, " [%ld]\n", (long)JSVAL_TO_INT(sym_id(sym))); + else + fprintf(fp, " \"%s\"\n", ATOM_BYTES(sym_atom(sym))); + return HT_ENUMERATE_NEXT; +} + +/* These are callable from gdb. */ +JS_BEGIN_EXTERN_C +void Dsym(JSSymbol *sym) { if (sym) DumpSymbol(&sym->entry, 0, gErrFile); } +void Datom(JSAtom *atom) { if (atom) DumpAtom(&atom->entry, 0, gErrFile); } +void Dobj(nsISupports* p, int depth) {if(p)XPC_DUMP(p,depth);} +void Dxpc(int depth) {Dobj(XPC_GetXPConnect(), depth);} +JS_END_EXTERN_C +#endif diff --git a/js/src/xpconnect/src/nsXPConnect.cpp b/js/src/xpconnect/src/nsXPConnect.cpp index dd19a188c35c..36dfb5d33087 100644 --- a/js/src/xpconnect/src/nsXPConnect.cpp +++ b/js/src/xpconnect/src/nsXPConnect.cpp @@ -29,6 +29,8 @@ static NS_DEFINE_IID(kXPConnectIID, NS_IXPCONNECT_IID); NS_IMPL_ISUPPORTS(nsXPConnect, kXPConnectIID) +const char* XPC_COMPONENTS_STR = "Components"; + nsXPConnect* nsXPConnect::mSelf = NULL; static NS_DEFINE_IID(kAllocatorCID, NS_ALLOCATOR_CID); @@ -192,18 +194,24 @@ nsXPConnect::~nsXPConnect() NS_IMETHODIMP nsXPConnect::InitJSContext(JSContext* aJSContext, - JSObject* aGlobalJSObj) + JSObject* aGlobalJSObj, + JSBool AddComponentsObject) { - if(aJSContext) + if(!aJSContext) { - if(!aGlobalJSObj) - aGlobalJSObj = JS_GetGlobalObject(aJSContext); - if(aGlobalJSObj && - !mContextMap->Find(aJSContext) && - NewContext(aJSContext, aGlobalJSObj)) - { - return NS_OK; - } + XPC_LOG_ERROR(("nsXPConnect::InitJSContext failed with null pointer")); + return NS_ERROR_NULL_POINTER; + } + + if(!aGlobalJSObj) + aGlobalJSObj = JS_GetGlobalObject(aJSContext); + if(aGlobalJSObj && + !mContextMap->Find(aJSContext) && + NewContext(aJSContext, aGlobalJSObj)&& + (!AddComponentsObject || + NS_SUCCEEDED(AddNewComponentsObject(aJSContext, aGlobalJSObj)))) + { + return NS_OK; } XPC_LOG_ERROR(("nsXPConnect::InitJSContext failed")); return NS_ERROR_FAILURE; @@ -213,6 +221,7 @@ NS_IMETHODIMP nsXPConnect::InitJSContextWithNewWrappedGlobal(JSContext* aJSContext, nsISupports* aCOMObj, REFNSIID aIID, + JSBool AddComponentsObject, nsIXPConnectWrappedNative** aWrapper) { nsXPCWrappedNative* wrapper = NULL; @@ -224,7 +233,9 @@ nsXPConnect::InitJSContextWithNewWrappedGlobal(JSContext* aJSContext, if(wrapper) { if(JS_InitStandardClasses(aJSContext, wrapper->GetJSObject()) && - xpcc->Init(wrapper->GetJSObject())) + xpcc->Init(wrapper->GetJSObject()) && + (!AddComponentsObject || + NS_SUCCEEDED(AddNewComponentsObject(aJSContext, NULL)))) { *aWrapper = wrapper; return NS_OK; @@ -243,6 +254,49 @@ nsXPConnect::InitJSContextWithNewWrappedGlobal(JSContext* aJSContext, return NS_ERROR_FAILURE; } +NS_IMETHODIMP +nsXPConnect::AddNewComponentsObject(JSContext* aJSContext, + JSObject* aGlobalJSObj) +{ + JSBool success; + + if(!aJSContext) + { + XPC_LOG_ERROR(("nsXPConnect::AddNewComponentsObject failed with null pointer")); + return NS_ERROR_NULL_POINTER; + } + + if(!aGlobalJSObj && !(aGlobalJSObj = JS_GetGlobalObject(aJSContext))) + { + XPC_LOG_ERROR(("nsXPConnect::AddNewComponentsObject failed - no global object")); + return NS_ERROR_FAILURE; + } + + nsIXPCComponents* comp = XPC_GetXPConnectComponentsObject(); + if(!comp) + { + XPC_LOG_ERROR(("nsXPConnect::AddNewComponentsObject failed - could create component object")); + return NS_ERROR_FAILURE; + } + + nsIXPConnectWrappedNative* comp_wrapper; + if(NS_FAILED(WrapNative(aJSContext, comp, + nsIXPCComponents::GetIID(), &comp_wrapper))) + { + XPC_LOG_ERROR(("nsXPConnect::AddNewComponentsObject failed - could not build wrapper")); + NS_RELEASE(comp); + return NS_ERROR_FAILURE; + } + JSObject* comp_jsobj; + comp_wrapper->GetJSObject(&comp_jsobj); + jsval comp_jsval = OBJECT_TO_JSVAL(comp_jsobj); + success = JS_SetProperty(aJSContext, aGlobalJSObj, + "Components", &comp_jsval); + NS_RELEASE(comp_wrapper); + NS_RELEASE(comp); + return success ? NS_OK : NS_ERROR_FAILURE; +} + XPCContext* nsXPConnect::NewContext(JSContext* cx, JSObject* global, JSBool doInit /*= JS_TRUE*/) diff --git a/js/src/xpconnect/src/xpcjsid.cpp b/js/src/xpconnect/src/xpcjsid.cpp index cec5f0760623..185c6f226f28 100644 --- a/js/src/xpconnect/src/xpcjsid.cpp +++ b/js/src/xpconnect/src/xpcjsid.cpp @@ -409,7 +409,7 @@ nsJSCID::toString(char **_retval) } NS_IMETHODIMP -nsJSCID::newInstance(nsISupports **_retval) +nsJSCID::createInstance(nsISupports **_retval) { if(!_retval) return NS_ERROR_NULL_POINTER; @@ -423,6 +423,26 @@ nsJSCID::newInstance(nsISupports **_retval) (void**) _retval); } +// XXX this does not yet address the issue of using the SM to release +// XXX this does not yet address the issue of security protections +// XXX we'll need to make createInstance and getService dynamic to +// support both of these issues + +NS_IMETHODIMP +nsJSCID::getService(nsISupports **_retval) +{ + if(!_retval) + return NS_ERROR_NULL_POINTER; + + *_retval = NULL; + if(mID.Equals(GetInvalidIID())) + return NS_ERROR_FAILURE; + + return nsServiceManager::GetService(mID, + nsISupports::GetIID(), + _retval, NULL); +} + /***************************************************************************/ // additional utilities... diff --git a/js/src/xpconnect/src/xpcprivate.h b/js/src/xpconnect/src/xpcprivate.h index 9bb7d466aca9..4cadbc32c731 100644 --- a/js/src/xpconnect/src/xpcprivate.h +++ b/js/src/xpconnect/src/xpcprivate.h @@ -44,7 +44,8 @@ #include "xpcjsid.h" #include "prlong.h" -extern const char* XPC_VAL_STR; // 'value' property name for out params +extern const char* XPC_VAL_STR; // 'value' property name for out params +extern const char* XPC_COMPONENTS_STR; // 'Components' property name /***************************************************************************/ @@ -54,13 +55,18 @@ class nsXPConnect : public nsIXPConnect NS_DECL_ISUPPORTS NS_IMETHOD InitJSContext(JSContext* aJSContext, - JSObject* aGlobalJSObj); + JSObject* aGlobalJSObj, + JSBool AddComponentsObject); NS_IMETHOD InitJSContextWithNewWrappedGlobal(JSContext* aJSContext, nsISupports* aCOMObj, REFNSIID aIID, + JSBool AddComponentsObject, nsIXPConnectWrappedNative** aWrapper); + NS_IMETHOD AddNewComponentsObject(JSContext* aJSContext, + JSObject* aGlobalJSObj); + NS_IMETHOD WrapNative(JSContext* aJSContext, nsISupports* aCOMObj, REFNSIID aIID, @@ -530,6 +536,7 @@ class nsXPCWrappedNative : public nsIXPConnectWrappedNative NS_IMETHOD GetInterfaceInfo(nsIInterfaceInfo** info); NS_IMETHOD GetIID(nsIID** iid); // returns IAllocatator alloc'd copy NS_IMETHOD DebugDump(int depth); + NS_IMETHOD SetFinalizeListener(nsIXPConnectFinalizeListener* aListener); public: static nsXPCWrappedNative* GetNewOrUsedWrapper(XPCContext* xpcc, @@ -564,6 +571,7 @@ private: nsIXPCScriptable* mDynamicScriptable; // only set in root! nsXPCWrappedNative* mRoot; nsXPCWrappedNative* mNext; + nsIXPConnectFinalizeListener* mFinalizeListener; }; /***************************************************************************/ @@ -670,8 +678,11 @@ public: /* boolean init (in string idString); */ NS_IMETHOD init(const char *idString, PRBool *_retval); - /* nsISupports newInstance (); */ - NS_IMETHOD newInstance(nsISupports **_retval); + /* nsISupports createInstance (); */ + NS_IMETHOD createInstance(nsISupports **_retval); + + /* nsISupports getService (); */ + NS_IMETHOD getService(nsISupports **_retval); /* string toString (); */ NS_IMETHOD toString(char **_retval); diff --git a/js/src/xpconnect/src/xpcthrower.cpp b/js/src/xpconnect/src/xpcthrower.cpp index 9920dfd766a1..c95cea884f6e 100644 --- a/js/src/xpconnect/src/xpcthrower.cpp +++ b/js/src/xpconnect/src/xpcthrower.cpp @@ -93,7 +93,7 @@ XPCJSThrower::ThrowBadResultException(JSContext* cx, format = mFormats[XPCJSError::NATIVE_RETURNED_FAILURE].format; - sz = JS_smprintf("%s %x", format, result); + sz = JS_smprintf("%s 0x%x", format, result); if(sz && mVerbose) Verbosify(cx, clazz, desc, &sz, PR_TRUE); diff --git a/js/src/xpconnect/src/xpcutil.cpp b/js/src/xpconnect/src/xpcutil.cpp deleted file mode 100644 index d356b620cf7e..000000000000 --- a/js/src/xpconnect/src/xpcutil.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -/* Module local methods to use 'standard' interfaces in other modules. */ - -#include "xpcprivate.h" - -// all these methods are class statics - -nsIAllocator* XPCMem::Allocator() -{ - static NS_DEFINE_IID(kAllocatorCID, NS_ALLOCATOR_CID); - static NS_DEFINE_IID(kIAllocatorIID, NS_IALLOCATOR_IID); - static nsIAllocator* al = NULL; - if(!al) - nsServiceManager::GetService(kAllocatorCID, kIAllocatorIID, - (nsISupports **)&al); - NS_ASSERTION(al, "failed to get Allocator!"); - return al; -} - -void* XPCMem::Alloc(PRUint32 size) - {return Allocator()->Alloc(size);} - -void* XPCMem::Realloc(void* ptr, PRUint32 size) - {return Allocator()->Realloc(ptr, size);} - -void XPCMem::Free(void* ptr) - {Allocator()->Free(ptr);} - -void XPCMem::HeapMinimize() - {Allocator()->HeapMinimize();} - -void* XPCMem::Clone(const void* ptr, PRUint32 size) -{ - if(!ptr) return NULL; - void* p = Allocator()->Alloc(size); - if(p) memcpy(p, ptr, size); - return p; -} diff --git a/js/src/xpconnect/src/xpcwrappednative.cpp b/js/src/xpconnect/src/xpcwrappednative.cpp index 3427cdc0f028..c02ad522e5e4 100644 --- a/js/src/xpconnect/src/xpcwrappednative.cpp +++ b/js/src/xpconnect/src/xpcwrappednative.cpp @@ -201,8 +201,8 @@ nsXPCWrappedNative::nsXPCWrappedNative(nsISupports* aObj, mClass(aClass), mDynamicScriptable(NULL), mRoot(root ? root : this), - mNext(NULL) - + mNext(NULL), + mFinalizeListener(NULL) { NS_PRECONDITION(mObj, "bad object to wrap"); NS_PRECONDITION(mClass, "bad class for wrapper"); @@ -272,6 +272,12 @@ nsXPCWrappedNative::~nsXPCWrappedNative() NS_RELEASE(mDynamicScriptable); if(mClass) NS_RELEASE(mClass); + if(mFinalizeListener) + { + if(mObj) + mFinalizeListener->AboutToRelease(mObj); + NS_RELEASE(mFinalizeListener); + } if(mObj) NS_RELEASE(mObj); } @@ -369,6 +375,22 @@ nsXPCWrappedNative::GetIID(nsIID** iid) return *iid ? NS_OK : NS_ERROR_UNEXPECTED; } +NS_IMETHODIMP +nsXPCWrappedNative::SetFinalizeListener(nsIXPConnectFinalizeListener* aListener) +{ + if(mFinalizeListener && aListener) + { + NS_ASSERTION(0,"tried to set two FinalizeListeners on a wrapper"); + return NS_ERROR_FAILURE; + } + if(mFinalizeListener) + NS_RELEASE(mFinalizeListener); + mFinalizeListener = aListener; + if(mFinalizeListener) + NS_ADDREF(mFinalizeListener); + return NS_OK; +} + NS_IMETHODIMP nsXPCWrappedNative::DebugDump(int depth) { diff --git a/js/src/xpconnect/src/xpcwrappednativeclass.cpp b/js/src/xpconnect/src/xpcwrappednativeclass.cpp index 2759fdad61ae..7c26b6a943bf 100644 --- a/js/src/xpconnect/src/xpcwrappednativeclass.cpp +++ b/js/src/xpconnect/src/xpcwrappednativeclass.cpp @@ -1204,11 +1204,13 @@ JSBool nsXPCWrappedNativeClass::InitForContext(XPCContext* xpcc) { // XXX do we really want this class init'd this way? access to ctor? +/* NO if (!JS_InitClass(xpcc->GetJSContext(), xpcc->GetGlobalObject(), 0, &WrappedNative_class, 0, 0, 0, 0, 0, 0)) return JS_FALSE; +*/ return JS_TRUE; } diff --git a/js/src/xpconnect/tests/Makefile.in b/js/src/xpconnect/tests/Makefile.in index a3836b5ce128..d0bf7c855e21 100644 --- a/js/src/xpconnect/tests/Makefile.in +++ b/js/src/xpconnect/tests/Makefile.in @@ -20,6 +20,8 @@ topsrcdir = @top_srcdir@ VPATH = @srcdir@ srcdir = @srcdir@ +DIRS = components + include $(DEPTH)/config/autoconf.mk MODULE = TestXPC @@ -51,7 +53,7 @@ LIBS = \ # PROGS = $(OBJDIR)/TestXPC -TEST_FILES = testxpc.js +TEST_FILES = testxpc.js xpctest_echo.js # TARGETS= $(PROGS) diff --git a/js/src/xpconnect/tests/TestXPC.cpp b/js/src/xpconnect/tests/TestXPC.cpp index 9d05257cd539..d4c553e33821 100644 --- a/js/src/xpconnect/tests/TestXPC.cpp +++ b/js/src/xpconnect/tests/TestXPC.cpp @@ -522,8 +522,9 @@ int main() if (!JS_DefineFunctions(jscontext, glob, glob_functions)) return 1; - xpc->InitJSContext(jscontext, glob); + xpc->InitJSContext(jscontext, glob, JS_TRUE); +#if 0 nsIXPCComponents* comp = XPC_GetXPConnectComponentsObject(); if(!comp) { @@ -543,7 +544,7 @@ int main() JS_SetProperty(jscontext, glob, "Components", &comp_jsval); NS_RELEASE(comp_wrapper); NS_RELEASE(comp); - +#endif char* txt[] = { "load('simpletest.js');", @@ -578,12 +579,12 @@ int main() */ // new code where global object is a wrapped xpcom object if(NS_SUCCEEDED(xpc->InitJSContextWithNewWrappedGlobal( - jscontext, foo, nsITestXPCFoo::GetIID(), &wrapper))) + jscontext, foo, nsITestXPCFoo::GetIID(), JS_TRUE, &wrapper))) { wrapper->GetJSObject(&glob); JS_DefineFunctions(jscontext, glob, glob_functions); - +#if 0 nsIXPCComponents* comp = XPC_GetXPConnectComponentsObject(); if(!comp) { @@ -603,7 +604,7 @@ int main() JS_SetProperty(jscontext, glob, "Components", &comp_jsval); NS_RELEASE(comp_wrapper); NS_RELEASE(comp); - +#endif nsTestXPCFoo* fool = new nsTestXPCFoo(); xpc->WrapNative(jscontext, fool, nsITestXPCFoo2::GetIID(), &fool_wrapper); diff --git a/js/src/xpconnect/tests/components/.cvsignore b/js/src/xpconnect/tests/components/.cvsignore new file mode 100644 index 000000000000..f3c7a7c5da68 --- /dev/null +++ b/js/src/xpconnect/tests/components/.cvsignore @@ -0,0 +1 @@ +Makefile diff --git a/js/src/xpconnect/tests/components/Makefile.in b/js/src/xpconnect/tests/components/Makefile.in new file mode 100644 index 000000000000..6c73bb940ff6 --- /dev/null +++ b/js/src/xpconnect/tests/components/Makefile.in @@ -0,0 +1,38 @@ +#!gmake +# +# The contents of this file are subject to the Netscape Public License +# Version 1.0 (the "NPL"); you may not use this file except in +# compliance with the NPL. You may obtain a copy of the NPL at +# http://www.mozilla.org/NPL/ +# +# Software distributed under the NPL is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL +# for the specific language governing rights and limitations under the +# NPL. +# +# The Initial Developer of this code under the NPL is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All Rights +# Reserved. +# + +DEPTH=../../../../.. + +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +include $(topsrcdir)/config/config.mk + +LIBRARY_NAME=xpctest +MODULE=xpctest + +CPPSRCS= \ + xpctest_echo.cpp \ + xpctest_echo.cpp \ + $(NULL) + +include $(topsrcdir)/config/rules.mk + diff --git a/js/src/xpconnect/tests/components/makefile.win b/js/src/xpconnect/tests/components/makefile.win new file mode 100644 index 000000000000..b88823773b7d --- /dev/null +++ b/js/src/xpconnect/tests/components/makefile.win @@ -0,0 +1,60 @@ +#!nmake +# +# The contents of this file are subject to the Netscape Public License +# Version 1.0 (the "NPL"); you may not use this file except in +# compliance with the NPL. You may obtain a copy of the NPL at +# http://www.mozilla.org/NPL/ +# +# Software distributed under the NPL is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL +# for the specific language governing rights and limitations under the +# NPL. +# +# The Initial Developer of this code under the NPL is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All Rights +# Reserved. + +DEPTH=..\..\..\..\.. +IGNORE_MANIFEST=1 + +MAKE_OBJ_TYPE = DLL +DLLNAME = xpctest +DLL =.\$(OBJDIR)\$(DLLNAME).dll + +MODULE=xpconnect +REQUIRES=xpcom js libxpt xptinfo xptcall + +DEFINES=-DWIN32_LEAN_AND_MEAN + +OBJS= \ + .\$(OBJDIR)\xpctest_echo.obj \ + .\$(OBJDIR)\xpctest_module.obj \ + $(NULL) + +LINCS=-I$(PUBLIC)\xpconnect -I$(PUBLIC)\xpcom -I$(PUBLIC)\js \ + -I$(PUBLIC)\raptor -I$(PUBLIC)\libxpt -I$(PUBLIC)\xptinfo \ + -I$(PUBLIC)\xptcall -I$(PUBLIC)\xpconnect + +LCFLAGS = \ + $(LCFLAGS) \ + $(DEFINES) \ + $(NULL) + +LLIBS= $(LIBNSPR) \ + $(DIST)\lib\js$(MOZ_BITS)$(VERSION_NUMBER).lib \ + $(DIST)\lib\xpcom$(MOZ_BITS).lib \ + $(DIST)\lib\xptinfo$(MOZ_BITS).lib \ + $(DIST)\lib\xptcall$(MOZ_BITS).lib \ + $(DIST)\lib\xpc$(MOZ_BITS)$(VERSION_NUMBER).lib \ + $(NULL) + +include <$(DEPTH)\config\rules.mak> + +install:: $(DLL) + $(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).dll $(DIST)\bin\components +# $(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).lib $(DIST)\lib + +clobber:: +# rm -f $(DIST)\lib\$(DLLNAME).lib + rm -f $(DIST)\bin\$(DLLNAME).dll diff --git a/js/src/xpconnect/tests/components/xpctest_echo.cpp b/js/src/xpconnect/tests/components/xpctest_echo.cpp new file mode 100644 index 000000000000..566dc4bf7de9 --- /dev/null +++ b/js/src/xpconnect/tests/components/xpctest_echo.cpp @@ -0,0 +1,282 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +/* implement nsIEcho for testing. */ + +#include "xpctest_private.h" + +class xpctestEcho : public nsIEcho +{ +public: + NS_DECL_ISUPPORTS + NS_IMETHOD SetReceiver(nsIEcho* aReceiver); + NS_IMETHOD SendOneString(const char* str); + NS_IMETHOD In2OutOneInt(int input, int* output); + NS_IMETHOD In2OutAddTwoInts(int input1, + int input2, + int* output1, + int* output2, + int* result); + NS_IMETHOD In2OutOneString(const char* input, char** output); + NS_IMETHOD SimpleCallNoEcho(); + NS_IMETHOD SendManyTypes(PRUint8 p1, + PRInt16 p2, + PRInt32 p3, + PRInt64 p4, + PRUint8 p5, + PRUint16 p6, + PRUint32 p7, + PRUint64 p8, + float p9, + double p10, + PRBool p11, + char p12, + PRUint16 p13, + nsID* p14, + const char* p15, + const PRUnichar* p16); + NS_IMETHOD SendInOutManyTypes(PRUint8* p1, + PRInt16* p2, + PRInt32* p3, + PRInt64* p4, + PRUint8* p5, + PRUint16* p6, + PRUint32* p7, + PRUint64* p8, + float* p9, + double* p10, + PRBool* p11, + char* p12, + PRUint16* p13, + nsID** p14, + char** p15, + PRUint16** p16); + NS_IMETHOD MethodWithNative(int p1, void* p2); + + NS_IMETHOD ReturnCode(int code); + + NS_IMETHOD FailInJSTest(int fail); + + /* void SharedTest ([shared, retval] out string str); */ + NS_IMETHOD SharedString(char **str); + + /* void ReturnCode_NS_OK (); */ + NS_IMETHOD ReturnCode_NS_OK(); + + /* void ReturnCode_NS_COMFALSE (); */ + NS_IMETHOD ReturnCode_NS_COMFALSE(); + + /* void ReturnCode_NS_ERROR_NULL_POINTER (); */ + NS_IMETHOD ReturnCode_NS_ERROR_NULL_POINTER(); + + /* void ReturnCode_NS_ERROR_UNEXPECTED (); */ + NS_IMETHOD ReturnCode_NS_ERROR_UNEXPECTED(); + + /* void ReturnCode_NS_ERROR_OUT_OF_MEMORY (); */ + NS_IMETHOD ReturnCode_NS_ERROR_OUT_OF_MEMORY(); + + + xpctestEcho(); +private: + nsIEcho* mReceiver; +}; + +/***************************************************************************/ + +static NS_DEFINE_IID(kxpctestEchoIID, NS_IECHO_IID); +NS_IMPL_ISUPPORTS(xpctestEcho, kxpctestEchoIID); + +xpctestEcho::xpctestEcho() + : mReceiver(NULL) +{ + NS_INIT_REFCNT(); + NS_ADDREF_THIS(); +} + +NS_IMETHODIMP xpctestEcho::SetReceiver(nsIEcho* aReceiver) +{ + if(mReceiver) + NS_RELEASE(mReceiver); + mReceiver = aReceiver; + if(mReceiver) + NS_ADDREF(mReceiver); + return NS_OK; +} + +NS_IMETHODIMP xpctestEcho::SendOneString(const char* str) +{ + if(mReceiver) + return mReceiver->SendOneString(str); + return NS_OK; +} + +NS_IMETHODIMP xpctestEcho::In2OutOneInt(int input, int* output) +{ + *output = input; + return NS_OK; +} + +NS_IMETHODIMP xpctestEcho::In2OutAddTwoInts(int input1, + int input2, + int* output1, + int* output2, + int* result) +{ + *output1 = input1; + *output2 = input2; + *result = input1+input2; + return NS_OK; +} + +NS_IMETHODIMP xpctestEcho::In2OutOneString(const char* input, char** output) +{ + char* p; + int len; + if(input && output && + (NULL != (p = (char*)nsAllocator::Alloc(len=strlen(input)+1)))) + { + memcpy(p, input, len); + *output = p; + return NS_OK; + } + if(output) + *output = NULL; + return NS_ERROR_FAILURE; +} + +NS_IMETHODIMP xpctestEcho::SimpleCallNoEcho() +{ + return NS_OK; +} + +NS_IMETHODIMP +xpctestEcho::SendManyTypes(PRUint8 p1, + PRInt16 p2, + PRInt32 p3, + PRInt64 p4, + PRUint8 p5, + PRUint16 p6, + PRUint32 p7, + PRUint64 p8, + float p9, + double p10, + PRBool p11, + char p12, + PRUint16 p13, + nsID* p14, + const char* p15, + const PRUnichar* p16) +{ + if(mReceiver) + return mReceiver->SendManyTypes(p1, p2, p3, p4, p5, p6, p7, p8, p9, + p10, p11, p12, p13, p14, p15, p16); + return NS_OK; +} + +NS_IMETHODIMP +xpctestEcho::SendInOutManyTypes(PRUint8* p1, + PRInt16* p2, + PRInt32* p3, + PRInt64* p4, + PRUint8* p5, + PRUint16* p6, + PRUint32* p7, + PRUint64* p8, + float* p9, + double* p10, + PRBool* p11, + char* p12, + PRUint16* p13, + nsID** p14, + char** p15, + PRUint16** p16) +{ + if(mReceiver) + return mReceiver->SendInOutManyTypes(p1, p2, p3, p4, p5, p6, p7, p8, p9, + p10, p11, p12, p13, p14, p15, p16); + return NS_OK; +} + +NS_IMETHODIMP +xpctestEcho::MethodWithNative(int p1, void* p2) +{ + return NS_OK; +} + +NS_IMETHODIMP +xpctestEcho::ReturnCode(int code) +{ + return (nsresult) code; +} + +NS_IMETHODIMP +xpctestEcho::FailInJSTest(int fail) +{ + if(mReceiver) + return mReceiver->FailInJSTest(fail); + return NS_OK; +} + +NS_IMETHODIMP +xpctestEcho::SharedString(char **str) +{ + *str = "a static string"; +/* + // to do non-shared we clone the string: + char buf[] = "a static string"; + int len; + *str = (char*)nsAllocator::Alloc(len=strlen(buf)+1); + memcpy(*str, buf, len); +*/ + return NS_OK; +} + +NS_IMETHODIMP +xpctestEcho::ReturnCode_NS_OK() +{return NS_OK;} + +NS_IMETHODIMP +xpctestEcho::ReturnCode_NS_COMFALSE() +{return NS_COMFALSE;} + +NS_IMETHODIMP +xpctestEcho::ReturnCode_NS_ERROR_NULL_POINTER() +{return NS_ERROR_NULL_POINTER;} + +NS_IMETHODIMP +xpctestEcho::ReturnCode_NS_ERROR_UNEXPECTED() +{return NS_ERROR_UNEXPECTED;} + +NS_IMETHODIMP +xpctestEcho::ReturnCode_NS_ERROR_OUT_OF_MEMORY() +{return NS_ERROR_OUT_OF_MEMORY;} + +/***************************************************************************/ + +// static +NS_IMETHODIMP +xpctest::ConstructEcho(nsISupports *aOuter, REFNSIID aIID, void **aResult) +{ + nsresult rv; + NS_ASSERTION(aOuter == nsnull, "no aggregation"); + xpctestEcho* obj = new xpctestEcho(); + rv = obj->QueryInterface(aIID, aResult); + NS_ASSERTION(NS_SUCCEEDED(rv), "unable to find correct interface"); + NS_RELEASE(obj); + return rv; +} diff --git a/js/src/xpconnect/tests/components/xpctest_module.cpp b/js/src/xpconnect/tests/components/xpctest_module.cpp new file mode 100644 index 000000000000..1fc7ce3d6004 --- /dev/null +++ b/js/src/xpconnect/tests/components/xpctest_module.cpp @@ -0,0 +1,93 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +/* module registration and factory code. */ + +#include "xpctest_private.h" + +static NS_DEFINE_CID(kComponentManagerCID, NS_COMPONENTMANAGER_CID); +static NS_DEFINE_CID(kGenericFactoryCID, NS_GENERICFACTORY_CID); + +extern "C" PR_IMPLEMENT(nsresult) +NSGetFactory(nsISupports* aServMgr, + const nsCID &aClass, + const char *aClassName, + const char *aProgID, + nsIFactory **aFactory) +{ + nsresult rv; + NS_ASSERTION(aFactory != nsnull, "bad factory pointer"); + + NS_WITH_SERVICE1(nsIComponentManager, compMgr, + aServMgr, kComponentManagerCID, &rv); + if (NS_FAILED(rv)) return rv; + + nsIGenericFactory* factory; + rv = compMgr->CreateInstance(kGenericFactoryCID, nsnull, + nsIGenericFactory::GetIID(), + (void**)&factory); + if (NS_FAILED(rv)) return rv; + + // add more factories as 'if else's below... + + if(aClass.Equals(xpctest::GetEchoCID())) + rv = factory->SetConstructor(xpctest::ConstructEcho); + else + { + NS_ASSERTION(0, "incorrectly registered"); + rv = NS_ERROR_NO_INTERFACE; + } + + if (NS_FAILED(rv)) { + delete factory; + return rv; + } + NS_ADDREF(factory); + *aFactory = factory; + return NS_OK; +} + +extern "C" PR_IMPLEMENT(nsresult) +NSRegisterSelf(nsISupports* aServMgr , const char* aPath) +{ + nsresult rv; + printf("registering xpctest\n"); + NS_WITH_SERVICE1(nsIComponentManager, compMgr, + aServMgr, kComponentManagerCID, &rv); + if (NS_FAILED(rv)) return rv; + + rv = compMgr->RegisterComponent(xpctest::GetEchoCID(), + "nsEcho", "nsEcho", aPath, + PR_TRUE, PR_TRUE); + + return rv; +} + +extern "C" PR_IMPLEMENT(nsresult) +NSUnregisterSelf(nsISupports* aServMgr, const char* aPath) +{ + nsresult rv; + NS_WITH_SERVICE1(nsIComponentManager, compMgr, + aServMgr, kComponentManagerCID, &rv); + if (NS_FAILED(rv)) return rv; + + rv = compMgr->UnregisterComponent(xpctest::GetEchoCID(), aPath); + + return rv; +} + diff --git a/js/src/xpconnect/tests/components/xpctest_private.h b/js/src/xpconnect/tests/components/xpctest_private.h new file mode 100644 index 000000000000..48d898511a91 --- /dev/null +++ b/js/src/xpconnect/tests/components/xpctest_private.h @@ -0,0 +1,50 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +/* local header for xpconnect tests components */ + +#ifndef xpctest_private_h___ +#define xpctest_private_h___ + +#include "nsISupports.h" +#include "nsIFactory.h" +#include "nsIAllocator.h" +#include "nsIServiceManager.h" +#include "nsIComponentManager.h" +#include "nsIGenericFactory.h" +#include "nscore.h" +#include + +#include "xpctest.h" + +// {ED132C20-EED1-11d2-BAA4-00805F8A5DD7} +#define NS_ECHO_CID \ +{ 0xed132c20, 0xeed1, 0x11d2, \ + { 0xba, 0xa4, 0x0, 0x80, 0x5f, 0x8a, 0x5d, 0xd7 } } + +// 'namespace' class +class xpctest +{ +public: + static const nsID& GetEchoCID() {static nsID cid = NS_ECHO_CID; return cid;} + static NS_METHOD ConstructEcho(nsISupports *aOuter, REFNSIID aIID, void **aResult); +private: + xpctest(); // not implemented +}; + +#endif /* xpctest_private_h___ */ diff --git a/js/src/xpconnect/tests/makefile.win b/js/src/xpconnect/tests/makefile.win index 79160d04e533..99ef435a1d76 100644 --- a/js/src/xpconnect/tests/makefile.win +++ b/js/src/xpconnect/tests/makefile.win @@ -19,10 +19,12 @@ DEPTH=..\..\..\.. IGNORE_MANIFEST=1 +DIRS = components + MAKE_OBJ_TYPE = EXE PROG1 = .\$(OBJDIR)\TestXPC.exe PROGRAMS = $(PROG1) -TESTCASES = testxpc.js simpletest.js +TESTCASES = testxpc.js simpletest.js xpctest_echo.js LCFLAGS=-DUSE_NSREG -DWIN32_LEAN_AND_MEAN -DJS_THREADSAFE -DJSFILE diff --git a/js/src/xpconnect/tests/simpletest.js b/js/src/xpconnect/tests/simpletest.js index cc5d9b65202d..84a9a9beccaa 100644 --- a/js/src/xpconnect/tests/simpletest.js +++ b/js/src/xpconnect/tests/simpletest.js @@ -35,7 +35,7 @@ print("equality test "+ (id1.equals(id2) ? "passed" : "failed")); function nsID(str) { - var id = Components.classes.nsIID.newInstance(); + var id = Components.classes.nsIID.createInstance(); id = id.QueryInterface(Components.interfaces.nsIJSID); id.init(str); return id; diff --git a/js/src/xpconnect/tests/testxpc.js b/js/src/xpconnect/tests/testxpc.js index d8854b6afafe..ad82970ffc77 100644 --- a/js/src/xpconnect/tests/testxpc.js +++ b/js/src/xpconnect/tests/testxpc.js @@ -2,7 +2,7 @@ function nsID(str) { - var id = Components.classes.nsIID.newInstance(); + var id = Components.classes.nsIID.createInstance(); id = id.QueryInterface(Components.interfaces.nsIJSIID); id.init(str); return id; diff --git a/js/src/xpconnect/tests/xpctest_echo.js b/js/src/xpconnect/tests/xpctest_echo.js new file mode 100644 index 000000000000..097f4ce01164 --- /dev/null +++ b/js/src/xpconnect/tests/xpctest_echo.js @@ -0,0 +1,501 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +/* xpconnect testing using the nsIEcho interface. */ + +function nsNativeEcho() +{ + var obj = Components.classes.nsEcho.createInstance(); + obj = obj.QueryInterface(Components.interfaces.nsIEcho); + return obj; +} + +function nsID(str) +{ + var id = Components.classes.nsIID.createInstance(); + id = id.QueryInterface(Components.interfaces.nsIJSIID); + id.init(str); + return id; +} + +var NS_ISUPPORTS_IID = new nsID("{00000000-0000-0000-c000-000000000046}"); +var NS_ITESTXPC_FOO_IID = new nsID("{159E36D0-991E-11d2-AC3F-00C09300144B}"); + +print(); +print("Components = "+Components); +print("Components properties:"); +for(i in Components) + print(" Components."+i+" = "+Components[i]); + +print(); +/***************************************************************************/ +print("......................................."); +print("echo tests..."); + +var echo = new nsNativeEcho; + +var receiver = new Object(); +receiver.SetReceiver = function() {}; +receiver.SendOneString = function(str) {receiver_results[0] = str;}; +receiver.SendManyTypes = function() + { + for(var i = 0; i < arguments.length; i++) + receiver_results[i] = arguments[i]; + }; + +echo.SetReceiver(receiver); + +//////////////////// +// SendOneString + +var test_string = "some string"; +var receiver_results = new Object(); +echo.SendOneString(test_string); +print("SendOneString - "+( + receiver_results[0] == test_string + ? "passed" : "failed")); + +//////////////////// +// In2OutOneInt + +print("In2OutOneInt - "+( + echo.In2OutOneInt(102) == 102 + ? "passed" : "failed")); + +//////////////////// +// In2OutAddTwoInts + +var in_out_results1 = new Object(); +var in_out_results2 = new Object(); +var in_out_results = + echo.In2OutAddTwoInts(123, 55, in_out_results1, in_out_results2); +print("In2OutAddTwoInts - "+( + in_out_results1.value == 123 && + in_out_results2.value == 55 && + in_out_results == 178 + ? "passed" : "failed")); + +var test_string2 = "some other string"; +print("In2OutOneString - "+( + echo.In2OutOneString(test_string2) == test_string2 && + echo.In2OutOneString(echo.In2OutOneString(test_string2)) == test_string2 + ? "passed" : "failed")); + + +//////////////////// +// SendManyTypes + +var receiver_results = new Object(); +var send_params = [1,-2,-3,-102020,2,4,6,1023,1.5,2.000008,true,'a','b',NS_ITESTXPC_FOO_IID,"a string","another string"]; +echo.SendManyTypes(send_params[0], + send_params[1], + send_params[2], + send_params[3], + send_params[4], + send_params[5], + send_params[6], + send_params[7], + send_params[8], + send_params[9], + send_params[10], + send_params[11], + send_params[12], + send_params[13], + send_params[14], + send_params[15]); + +var all_ok = true; +for(i = 0; i < 16; i++) { + if(((""+receiver_results[i]).toLowerCase()) != + ((""+send_params[i]).toLowerCase())) { + if(all_ok) + print("SendManyTypes - failed..."); + all_ok = false; + print(" param number "+i+" diff: "+send_params[i]+" -> "+receiver_results[i]) + } +} +if(all_ok) + print("SendManyTypes - passed"); + +//////////////////// +// SendInOutManyTypes + +var receiver_results = new Object(); +var send_params = [1,-2,-3,-102020,2,4,6,1023,1.5,2.000008,true,'a','b',NS_ITESTXPC_FOO_IID,"a string","another string"]; +var resend_params = [2,-3,-7,-10220,18,14,16,123,2.5,8.000008,false,'z','l',NS_ISUPPORTS_IID,"foo string","yet another string"]; + +receiver.SendInOutManyTypes = function() + { + for(var i = 0; i < arguments.length; i++) { + receiver_results[i] = arguments[i].value; + arguments[i].value = resend_params[i]; + } + }; + +var inout_params = [{value:send_params[0] }, + {value:send_params[1] }, + {value:send_params[2] }, + {value:send_params[3] }, + {value:send_params[4] }, + {value:send_params[5] }, + {value:send_params[6] }, + {value:send_params[7] }, + {value:send_params[8] }, + {value:send_params[9] }, + {value:send_params[10]}, + {value:send_params[11]}, + {value:send_params[12]}, + {value:send_params[13]}, + {value:send_params[14]}, + {value:send_params[15]}]; + +echo.SendInOutManyTypes(inout_params[0] , + inout_params[1] , + inout_params[2] , + inout_params[3] , + inout_params[4] , + inout_params[5] , + inout_params[6] , + inout_params[7] , + inout_params[8] , + inout_params[9] , + inout_params[10], + inout_params[11], + inout_params[12], + inout_params[13], + inout_params[14], + inout_params[15]); + +var all_ok = true; +for(i = 0; i < 16; i++) { + if(((""+receiver_results[i]).toLowerCase()) != + ((""+send_params[i]).toLowerCase())) { + if(all_ok) + print("SendInOutManyTypes - failed..."); + all_ok = false; + print(" sent param number "+i+" diff: "+send_params[i]+" -> "+receiver_results[i]); + } +} + +for(i = 0; i < 16; i++) { + if(((""+resend_params[i]).toLowerCase()) != + ((""+inout_params[i].value).toLowerCase())) { + if(all_ok) + print("SendInOutManyTypes - failed..."); + all_ok = false; + print(" resent param number "+i+" diff: "+resend_params[i]+" -> "+inout_params[i].value); + } +} + +if(all_ok) + print("SendInOutManyTypes - passed"); + +//////////////////// +// check exceptions on xpcom error code + +try { + echo.ReturnCode(0); + print("ReturnCode(0) - passed"); +} +catch(e) { + print("ReturnCode(0) exception text: "+e+" - failed"); +} + +try { + echo.ReturnCode(-1); + print("ReturnCode(-1) - failed"); +} +catch(e) { +// print("ReturnCode(-1) exception text: "+e+" - passed"); + print("ReturnCode(-1) - passed"); +} + +var all_ok = true; + +echo.ReturnCode_NS_OK() +if(Components.RESULT_NS_OK != Components.lastResult) { + all_ok = false; + print("expected: RESULT_NS_OK = "+Components.RESULT_NS_OK+" got: "+Components.lastResult); + print(Components.lastResult); +} + +echo.ReturnCode_NS_COMFALSE() +if(Components.RESULT_NS_COMFALSE != Components.lastResult) { + all_ok = false; + print("expected: RESULT_NS_COMFALSE = "+Components.RESULT_NS_COMFALSE+" got: "+Components.lastResult); +} + +try { + echo.ReturnCode_NS_ERROR_NULL_POINTER() + all_ok = false; +} catch(e) { + if(Components.RESULT_NS_ERROR_NULL_POINTER != Components.lastResult) { + all_ok = false; + print("expected: RESULT_NS_ERROR_NULL_POINTER = "+Components.RESULT_NS_ERROR_NULL_POINTER+" got: "+Components.lastResult); + } +} + +try { + echo.ReturnCode_NS_ERROR_UNEXPECTED() + all_ok = false; +} catch(e) { + if(Components.RESULT_NS_ERROR_UNEXPECTED != Components.lastResult) { + all_ok = false; + print("expected: RESULT_NS_ERROR_UNEXPECTED = "+Components.RESULT_NS_ERROR_UNEXPECTED+" got: "+Components.lastResult); + } +} + +try { + echo.ReturnCode_NS_ERROR_OUT_OF_MEMORY() + all_ok = false; +} catch(e) { + if(Components.RESULT_NS_ERROR_OUT_OF_MEMORY != Components.lastResult) { + all_ok = false; + print("expected: RESULT_NS_ERROR_OUT_OF_MEMORY = "+Components.RESULT_NS_ERROR_OUT_OF_MEMORY+" got: "+Components.lastResult); + } +} + +print("Components.lastResult test - "+ (all_ok ? "passed" : "failed") ); + +//////////////////// +// check exceptions on too few args + +try { + echo.ReturnCode(); // supposed to have one arg + print("Too few args test - failed"); +} +catch(e) { +// print("Too few args test -- exception text: "+e+" - passed"); + print("Too few args test - passed"); +} + +//////////////////// +// check exceptions on can't convert + +// XXX this is bad test since null is now convertable. +/* +try { + echo.SetReceiver(null); +// print("Can't convert arg to Native ("+out+")- failed"); + print("Can't convert arg to Native - failed"); +} +catch(e) { +// print("Can't convert arg to Native ("+e+") - passed"); + print("Can't convert arg to Native - passed"); +} +*/ +//////////////////// +// FailInJSTest + +var receiver3 = new Object(); +receiver3.SetReceiver = function() {}; +receiver3.FailInJSTest = function(fail) {if(fail)throw("");}; +echo.SetReceiver(receiver3); + +var all_ok = true; + +try { + echo.FailInJSTest(false); +} +catch(e) { + print("FailInJSTest - failed"); + all_ok = false; +} +try { + echo.FailInJSTest(true); + print("FailInJSTest - failed"); + all_ok = false; +} +catch(e) { +} + +if(all_ok) + print("FailInJSTest - passed"); + +//////////////////// +// nsID tests... + +function idTest(name, iid, same) +{ + result = true; + var idFromName = new nsID(name); + var idFromIID = new nsID(iid); + + if(!idFromName.valid || !idFromIID.valid) { + return (same && idFromName.valid == idFromIID.valid) || + (!same && idFromName.valid != idFromIID.valid); + } + + if(same != idFromName.equals(idFromIID) || + same != idFromIID.equals(idFromName)) { + print("iid equals test failed for "+name+" "+iid); + result = false; + } + + nameNormalized = name.toLowerCase(); + iidNormalized = iid.toLowerCase(); + + idFromName_NameNormalized = idFromName.name ? + idFromName.name.toLowerCase() : + idFromName.name; + + idFromIID_NameNormalized = idFromIID.name ? + idFromIID.name.toLowerCase() : + idFromIID.name; + + idFromName_StringNormalized = idFromName.number ? + idFromName.number.toLowerCase() : + idFromName.number; + + idFromIID_StringNormalized = idFromIID.number ? + idFromIID.number.toLowerCase() : + idFromIID.number; + + if(idFromName_NameNormalized != nameNormalized || + same != (idFromIID_NameNormalized == nameNormalized)) { + print("iid toName test failed for "+name+" "+iid); + result = false; + } + + if(idFromIID_StringNormalized != iidNormalized || + same != (idFromName_StringNormalized == iidNormalized)) { + print("iid toString test failed for "+name+" "+iid); + result = false; + } + + if(!idFromName.equals(new nsID(idFromName)) || + !idFromIID.equals(new nsID(idFromIID))) { + print("new id from id test failed for "+name+" "+iid); + result = false; + } + + return result; +} + +var all_ok = true; +// these 4 should be valid and the same +all_ok = idTest("nsISupports", "{00000000-0000-0000-c000-000000000046}", true) && all_ok; +all_ok = idTest("nsITestXPCFoo", "{159E36D0-991E-11d2-AC3F-00C09300144B}", true) && all_ok; +all_ok = idTest("nsITestXPCFoo2","{5F9D20C0-9B6B-11d2-9FFE-000064657374}", true) && all_ok; +all_ok = idTest("nsIEcho", "{CD2F2F40-C5D9-11d2-9838-006008962422}", true) && all_ok; +// intentional mismatches +all_ok = idTest("nsISupports", "{CD2F2F40-C5D9-11d2-9838-006008962422}", false) && all_ok; +all_ok = idTest("nsITestXPCFoo", "{00000000-0000-0000-c000-000000000046}", false) && all_ok; +// intentional bad name +all_ok = idTest("bogus", "{CD2F2F40-C5D9-11d2-9838-006008962422}", false) && all_ok; +// intentional bad iid +all_ok = idTest("nsISupports", "{XXXXXXXX-C5D9-11d2-9838-006008962422}", false) && all_ok; +// intentional bad name AND iid +all_ok = idTest("bogus", "{XXXXXXXX-C5D9-11d2-9838-006008962422}", true) && all_ok; + +print("nsID tests - "+(all_ok ? "passed" : "failed")); + +/***************************************************************************/ + +all_ok = echo.SharedString() == "a static string"; +print("[shared] test - "+(all_ok ? "passed" : "failed")); + +/***************************************************************************/ +// Components object test... +// print("......................................."); + +// print("Components = "+Components); +// print("Components.interfaces = "+Components.interfaces); +// print("Components.interfaces.nsISupports = "+Components.interfaces.nsISupports); +// print("Components.interfaces.nsISupports.name = "+Components.interfaces.nsISupports.name); +// print("Components.interfaces.nsISupports.number = "+Components.interfaces.nsISupports.number); +// +// print("Components.interfaces.nsIEcho.number = "+Components.interfaces.nsIEcho.number); +// print("Components.interfaces['{CD2F2F40-C5D9-11d2-9838-006008962422}'] = "+Components.interfaces['{CD2F2F40-C5D9-11d2-9838-006008962422}']); +// print("Components.interfaces['{CD2F2F40-C5D9-11d2-9838-006008962422}'].name = "+Components.interfaces['{CD2F2F40-C5D9-11d2-9838-006008962422}'].name); +// +// print("Components.classes = "+Components.classes); +// print("Components.classes.nsIID = "+Components.classes.nsIID); +// print("Components.classes.nsCID = "+Components.classes.nsCID); +// print("Components.classes.nsCID.name = "+Components.classes.nsCID.name); + +/***************************************************************************/ + +print("......................................."); +print("simple speed tests..."); + +var iterations = 1000; + +var receiver2 = new Object(); +receiver2.SetReceiver = function() {}; +receiver2.SendOneString = function(str) {/*print(str);*/}; + +var echoJS = new Object(); +echoJS.SetReceiver = function(r) {this.r = r;}; +echoJS.SendOneString = function(str) {if(this.r)this.r.SendOneString(str)}; +echoJS.SimpleCallNoEcho = function(){} + +/*********************************************/ +/*********************************************/ + +print("\nEcho.SimpleCallNoEcho (just makes call with no params and no callback)"); +var start_time = new Date().getTime()/1000; +echoJS.SetReceiver(receiver2); +for(i = 0; i < iterations; i++) + echoJS.SimpleCallNoEcho(); +var end_time = new Date().getTime()/1000; +var interval = parseInt(100*(end_time - start_time),10)/100; +print("JS control did "+iterations+" iterations in "+interval+ " seconds."); + +var start_time = new Date().getTime()/1000; +echo.SetReceiver(receiver2); +for(i = 0; i < iterations; i++) + echo.SimpleCallNoEcho(); +var end_time = new Date().getTime()/1000; +var interval = parseInt(100*(end_time - start_time),10)/100; +print("XPConnect did "+iterations+" iterations in "+interval+ " seconds."); + +/*********************************************/ + +print("\nEcho.SendOneString (calls a callback that does a call)"); +var start_time = new Date().getTime()/1000; +echoJS.SetReceiver(receiver2); +for(i = 0; i < iterations; i++) + echoJS.SendOneString("foo"); +var end_time = new Date().getTime()/1000; +var interval = parseInt(100*(end_time - start_time),10)/100; +print("JS control did "+iterations+" iterations in "+interval+ " seconds."); + +var start_time = new Date().getTime()/1000; +echo.SetReceiver(receiver2); +for(i = 0; i < iterations; i++) + echo.SendOneString("foo"); +var end_time = new Date().getTime()/1000; +var interval = parseInt(100*(end_time - start_time),10)/100; +print("XPConnect did "+iterations+" iterations in "+interval+ " seconds."); + +print("......................................."); + +if(0){ +print(); +print("this = "+this); +print("global object properties:"); +for(i in this) + print(" this."+i+" = "+ (typeof(this[i])!="function"? this[i] : "[function]")); + +print(); +} + +echoJS.SetReceiver(null); +echo.SetReceiver(null); + diff --git a/js/src/xpconnect/typelib/nsISupports.xpt b/js/src/xpconnect/typelib/nsISupports.xpt index f97f398f91fe..1532c46d445e 100644 Binary files a/js/src/xpconnect/typelib/nsISupports.xpt and b/js/src/xpconnect/typelib/nsISupports.xpt differ diff --git a/js/src/xpconnect/typelib/xpccomponents.xpt b/js/src/xpconnect/typelib/xpccomponents.xpt index ce90b885c65c..2c29706f23aa 100644 Binary files a/js/src/xpconnect/typelib/xpccomponents.xpt and b/js/src/xpconnect/typelib/xpccomponents.xpt differ diff --git a/js/src/xpconnect/typelib/xpcjsid.xpt b/js/src/xpconnect/typelib/xpcjsid.xpt index 7dc35e7da525..87b30a9759dd 100644 Binary files a/js/src/xpconnect/typelib/xpcjsid.xpt and b/js/src/xpconnect/typelib/xpcjsid.xpt differ diff --git a/js/src/xpconnect/typelib/xpctest.xpt b/js/src/xpconnect/typelib/xpctest.xpt index aedcf4e9c48e..57ace1258b75 100644 Binary files a/js/src/xpconnect/typelib/xpctest.xpt and b/js/src/xpconnect/typelib/xpctest.xpt differ