- added an interactive shell for xpconnect testing.

- added tests/components which autregs itself for testing.
- added finalize listener for wrapped natives to support services.
- added getService to CID class.
- renamed newInstance to createInstance in CID class.
- simplified api for Components object (easy attach to global object).
This commit is contained in:
jband%netscape.com 1999-04-10 06:51:01 +00:00
Родитель 84a91f617a
Коммит f9394a892b
37 изменённых файлов: 1864 добавлений и 126 удалений

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

@ -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

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

@ -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

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

@ -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. */

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

@ -17,6 +17,6 @@
DEPTH=..\..\..
IGNORE_MANIFEST=1
DIRS=public src tests
DIRS=public src tests shell
include <$(DEPTH)\config\rules.mak>

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

@ -29,6 +29,7 @@ EXPORTS = \
xpccomponents.h \
xpcjsid.h \
xpclog.h \
xpctest.h \
nsrootidl.h \
$(NULL)

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

@ -25,6 +25,7 @@ EXPORTS = \
xpccomponents.h \
xpcjsid.h \
xpclog.h \
xpctest.h \
nsrootidl.h \
$(NULL)

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

@ -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,

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

@ -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

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

@ -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);

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

@ -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;

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

@ -0,0 +1,2 @@
Makefile
mk.bat

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

@ -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)

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

@ -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
<<KEEP
$(PROG1): $(OBJDIR) xpcshell.cpp

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

@ -0,0 +1,495 @@
/* -*- 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 JavaScript interactive shell. */
#include <stdio.h>
#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 <stdlib.h>
#include <errno.h>
#ifdef XP_PC
#include <io.h> /* 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

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

@ -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*/)

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

@ -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...

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

@ -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);

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

@ -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);

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

@ -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;
}

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

@ -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)
{

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

@ -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;
}

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

@ -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)

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

@ -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);

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

@ -0,0 +1 @@
Makefile

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

@ -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

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

@ -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

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

@ -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;
}

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

@ -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;
}

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

@ -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 <stdio.h>
#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___ */

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

@ -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

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

@ -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;

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

@ -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;

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

@ -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);

Двоичные данные
js/src/xpconnect/typelib/nsISupports.xpt

Двоичный файл не отображается.

Двоичные данные
js/src/xpconnect/typelib/xpccomponents.xpt

Двоичный файл не отображается.

Двоичные данные
js/src/xpconnect/typelib/xpcjsid.xpt

Двоичный файл не отображается.

Двоичные данные
js/src/xpconnect/typelib/xpctest.xpt

Двоичный файл не отображается.