Compare commits

..

12 Commits

Author SHA1 Message Date
mlm
5403cc1fbd - Fix for recurring static variable (make it a member of the window group
structure)


git-svn-id: svn://10.0.0.236/branches/js_ops_BRANCH@1188 18797224-902f-48f8-a5cc-f745e15eee43
1998-05-06 20:16:14 +00:00
mlm
ea8b7ae403 Moving this file for js_ops_BRANCH
git-svn-id: svn://10.0.0.236/branches/js_ops_BRANCH@1187 18797224-902f-48f8-a5cc-f745e15eee43
1998-05-06 20:13:26 +00:00
mlm
792da6f338 - Replace thread safety fixes that I accidentally didn't check in when the
source tree moved to mozilla.

   - Make timeout globals thread-safe as part of the thread group object
   - Add LM locking to go with JS_BeginRequest stuff


git-svn-id: svn://10.0.0.236/branches/js_ops_BRANCH@1162 18797224-902f-48f8-a5cc-f745e15eee43
1998-05-05 22:26:12 +00:00
mlm
8f82414d4c Branch libpref for OPS new functionality for upcoming ns->moz renaming
git-svn-id: svn://10.0.0.236/branches/js_ops_BRANCH@635 18797224-902f-48f8-a5cc-f745e15eee43
1998-04-25 00:10:10 +00:00
mlm
ad93b6b9aa Branch libhook for OPS new functionality for upcoming ns->moz renaming
git-svn-id: svn://10.0.0.236/branches/js_ops_BRANCH@634 18797224-902f-48f8-a5cc-f745e15eee43
1998-04-25 00:09:11 +00:00
mlm
bf3132f22b Branch libparse for OPS new functionality for upcoming ns->moz renaming
git-svn-id: svn://10.0.0.236/branches/js_ops_BRANCH@633 18797224-902f-48f8-a5cc-f745e15eee43
1998-04-25 00:07:25 +00:00
mlm
66d0cd3091 Branch libnet for OPS new functionality for upcoming ns->moz renaming
git-svn-id: svn://10.0.0.236/branches/js_ops_BRANCH@631 18797224-902f-48f8-a5cc-f745e15eee43
1998-04-25 00:06:27 +00:00
mlm
d1186c4663 Branch libmocha for OPS new functionality for upcoming ns->moz renaming
git-svn-id: svn://10.0.0.236/branches/js_ops_BRANCH@630 18797224-902f-48f8-a5cc-f745e15eee43
1998-04-25 00:01:56 +00:00
mlm
6b1115ec03 Branch layout for OPS new functionality for upcoming ns->moz renaming
git-svn-id: svn://10.0.0.236/branches/js_ops_BRANCH@629 18797224-902f-48f8-a5cc-f745e15eee43
1998-04-24 23:43:28 +00:00
mlm
92c4bd320a Branch mozilla.mak for OPS new functionality for upcoming ns->moz renaming
git-svn-id: svn://10.0.0.236/branches/js_ops_BRANCH@628 18797224-902f-48f8-a5cc-f745e15eee43
1998-04-24 23:38:24 +00:00
mlm
f8c60c6777 Branch libevent for OPS new functionality for upcoming ns->moz renaming
git-svn-id: svn://10.0.0.236/branches/js_ops_BRANCH@627 18797224-902f-48f8-a5cc-f745e15eee43
1998-04-24 23:37:38 +00:00
(no author)
bc0482fed5 This commit was manufactured by cvs2svn to create branch 'js_ops_BRANCH'.
git-svn-id: svn://10.0.0.236/branches/js_ops_BRANCH@595 18797224-902f-48f8-a5cc-f745e15eee43
1998-04-24 07:21:02 +00:00
358 changed files with 44147 additions and 32445 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,62 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
/*
jscookie.h -- javascript reflection of cookies for filters.
Created: Frederick G.M. Roeber <roeber@netscape.com>, 12-Jul-97.
Adopted: Judson Valeski, 1997
*/
#ifndef _JSCOOKIE_H_
#define _JSCOOKIE_H_
typedef enum {
JSCF_accept,
JSCF_reject,
JSCF_ask,
JSCF_whatever,
JSCF_error
}
JSCFResult;
typedef struct {
char *path_from_header;
char *host_from_header;
char *name_from_header;
char *cookie_from_header;
time_t expires;
char *url;
Bool secure;
Bool domain;
Bool prompt; /* the preference */
NET_CookieBehaviorEnum preference;
}
JSCFCookieData;
extern JSCFResult JSCF_Execute(
MWContext *mwcontext,
const char *script_name,
JSCFCookieData *data,
Bool *data_changed
);
/* runs the garbage collector on the filter context. Probably a good
idea to call on completion of NET_GetURL or something. */
extern void JSCF_Cleanup(void);
#endif /* _JSCOOKIE_H_ */

755
mozilla/include/libevent.h Normal file
View File

@@ -0,0 +1,755 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
/*
* Header file for event passing between the mozilla thread and
* the mocha thread
*/
#ifndef libevent_h___
#define libevent_h___
#include "libmocha.h"
#include "prtypes.h"
#ifndef NSPR20
#include "prevent.h"
#else
#include "plevent.h"
#endif
#include "shist.h"
#include "fe_proto.h"
#include "lo_ele.h"
#include "jscookie.h"
NSPR_BEGIN_EXTERN_C
extern PREventQueue * mozilla_event_queue;
typedef struct WindowGroup LMWindowGroup;
/*
* XXX - should we use the same event values as layer events?
*/
/* Event bits stored in the low end of decoder->event_mask. */
#define EVENT_MOUSEDOWN 0x00000001
#define EVENT_MOUSEUP 0x00000002
#define EVENT_MOUSEOVER 0x00000004 /* user is mousing over a link */
#define EVENT_MOUSEOUT 0x00000008 /* user is mousing out of a link */
#define EVENT_MOUSEMOVE 0x00000010
#define EVENT_MOUSEDRAG 0x00000020
#define EVENT_CLICK 0x00000040 /* input element click in progress */
#define EVENT_DBLCLICK 0x00000080
#define EVENT_KEYDOWN 0x00000100
#define EVENT_KEYUP 0x00000200
#define EVENT_KEYPRESS 0x00000400
#define EVENT_DRAGDROP 0x00000800 /* not yet implemented */
#define EVENT_FOCUS 0x00001000 /* input focus event in progress */
#define EVENT_BLUR 0x00002000 /* loss of focus event in progress */
#define EVENT_SELECT 0x00004000 /* input field selection in progress */
#define EVENT_CHANGE 0x00008000 /* field value change in progress */
#define EVENT_RESET 0x00010000 /* form submit in progress */
#define EVENT_SUBMIT 0x00020000 /* form submit in progress */
#define EVENT_SCROLL 0x00040000 /* window is being scrolled */
#define EVENT_LOAD 0x00080000 /* layout parsed a loaded document */
#define EVENT_UNLOAD 0x00100000
#define EVENT_XFER_DONE 0x00200000 /* document has loaded */
#define EVENT_ABORT 0x00400000
#define EVENT_ERROR 0x00800000
#define EVENT_LOCATE 0x01000000
#define EVENT_MOVE 0x02000000
#define EVENT_RESIZE 0x04000000
#define EVENT_FORWARD 0x08000000
#define EVENT_HELP 0x10000000 /* for handling of help events */
#define EVENT_BACK 0x20000000
/* #define EVENT_PRINT 0x20000000 *//* To be removed per joki */
#define STATUS_STOP 0x00000001 /* stop processing */
#define STATUS_IGNORE 0x00000002 /* no new messages */
#define EVENT_ALT_MASK 0x00000001
#define EVENT_CONTROL_MASK 0x00000002
#define EVENT_SHIFT_MASK 0x00000004
#define EVENT_META_MASK 0x00000008
#define ARGTYPE_NULL 0x00000001
#define ARGTYPE_INT32 0x00000002
#define ARGTYPE_BOOL 0x00000004
#define ARGTYPE_STRING 0x00000008
#define SIZE_MAX 0x00000001
#define SIZE_MIN 0X00000002
/*
* When the event has been processed by the backend, there will be
* a front-end callback that gets called. If the event processed
* successfully, the callback will be passed EVENT_OK. If the
* event wasn't successful (i.e. the user canceled it) the return
* status will be EVENT_CANCEL. If something radical happened
* and the front-end should do nothing (i.e. mocha changed the
* underlying context) the status will be EVENT_PANIC and the
* front end should treat the context and element passed to the
* exit routine as bogus
*/
typedef enum {
EVENT_OK,
EVENT_CANCEL,
EVENT_PANIC
} ETEventStatus;
/*
* When a given event gets processed we may need to tell the front
* end about it so that they can update the UI / continue the
* operation. The context, lo_element, lType and whatever
* field are all supplied by the original ET_SendEvent() call.
* See ET_SendEvent() for a description of the values for
* the status parameter
*/
typedef void
(*ETClosureFunc)(MWContext * pContext, LO_Element * lo_element,
int32 lType, void * whatever, ETEventStatus status);
/*
* Someone has initiated a call to LM_EvaluateBuffer(). This function
* gets called back with the result
*/
typedef void
(*ETEvalAckFunc)(void * data, char * result_string, size_t result_length,
char * wysiwyg_url, char * base_href, Bool valid);
/*
* This function is called back after a layer's state has been restored
* in a resize_relayout.
*/
typedef void
(*ETRestoreAckFunc)(void * data, LO_BlockInitializeStruct *param);
/*
* Typedef for a function taking a void pointer and
* returning nothing
*/
typedef void
(*ETVoidPtrFunc)(void * data);
/*
* Typedef for a function taking a void pointer and
* returning a bool
*/
typedef PRBool
(*ETBoolPtrFunc)(void * data);
/*
* Typedef for a function taking a void pointer and
* returning a int32
*/
typedef int32
(*ETIntPtrFunc)(void * data);
/*
* Typedef for a function taking a void pointer and
* returning a char *
*/
typedef char *
(*ETStringPtrFunc)(void * data);
/*
* Struct for passing JS typed variable info through C interface calls
*/
typedef union ArgVal {
int32 intArg;
XP_Bool boolArg;
char * stringArg;
} ArgVal;
typedef struct {
uint8 type; /* arg type as defined at top of file */
ArgVal value;
} JSCompArg;
/*
* Typedef for a function used to verify installed components and
* get back components utility functions.
*/
typedef PRBool
(*ETVerifyComponentFunc)(void **active_callback, void **startup_callback);
/*
* Generic function for JS setting values with native calls.
*/
typedef void
(*ETCompPropSetterFunc)(char *name, void *value);
/*
* Generic function for JS getting values from native calls.
*/
typedef void*
(*ETCompPropGetterFunc)(char *name);
/*
* Generic function for JS calling native methods.
*/
typedef void*
(*ETCompMethodFunc)(int32 argc, JSCompArg *argv);
/* --------------------------------------------------------------------------
* Common prologue for talking between the mocha thread and the mozilla
* thread
*/
typedef struct {
PREvent event; /* the PREvent structure */
MWContext* context; /* context */
int32 doc_id; /* doc id of context when event launched */
PRPackedBool handle_eagerly;
} ETEvent;
/*
* Struct to send back from front end in order to get additional
* event information without having to initialize event object
* until necessary. Yow, there is a lot of junk in here now
* can we make a union out of some of these or are they always
* needed?
*/
typedef struct {
ETEvent ce;
MochaDecoder * decoder;
JSObject * object;
int32 type;
int32 layer_id;
int32 id;
LO_Element * lo_element;
ETClosureFunc fnClosure; /* event sender closure */
void * whatever; /* anything other state */
int32 x,y;
int32 docx,docy;
int32 screenx,screeny;
uint32 which;
uint32 modifiers;
void * data;
uint32 dataSize;
PRPackedBool saved;
PRPackedBool event_handled;
} JSEvent;
/*
* Tell the backend about a new event.
* The event is placed onto an event queue, it is not processed
* immediately. If the event is the type that can be cancelled
* by the backend (i.e. a button click or a submit) the front
* end must wait until the callback routine gets called before
* continuing with the operation. The ETEventStatus will be
* EVENT_OK if the operation is to continue or EVENT_CANCEL
* if it got cancelled.
*
* The processing of the event may cause the document to change
* or even the whole window to close. In those cases the callback
* will still get called in case there is any front-end cleanup
* to do but the ETEventStatus will be set to EVENT_PANIC
*
*/
extern JSBool
ET_SendEvent(MWContext * pContext, LO_Element *pElement, JSEvent *pEvent,
ETClosureFunc fnClosure, void * whatever);
/*
* Tell the backend about a new document load event. We need a
* closure so that libparse/layout knows when its safe to discard
* the old document when they were waiting for onunload events to
* finish processing
*/
extern void
ET_SendLoadEvent(MWContext * pContext, int32 type, ETVoidPtrFunc fnClosure,
NET_StreamClass *stream, int32 layer_id, Bool resize_reload);
/*
* Tell the backend about a new image event. Async. No closure
*/
extern void
ET_SendImageEvent(MWContext * pContext, LO_ImageStruct *image_data,
LM_ImageEvent event);
/*
* Send an interrupt event to the current context
* Remove all pending events for the event queue of the given context.
*/
extern void
ET_InterruptContext(MWContext * pContext);
extern JSBool
ET_ContinueProcessing(MWContext * pContext);
/*
* Tell mocha to destroy the given context's data. The callback
* function gets called when mocha is done with all of its data
* that was associated with the context
*/
extern void
ET_RemoveWindowContext(MWContext * context, ETVoidPtrFunc fn,
void * data);
typedef struct {
uint len, line_no;
char * scope_to;
void * data;
JSVersion version;
JSPrincipals * principals;
JSBool want_result;
JSBool unicode;
} ETEvalStuff;
/*
* Evaluate the mocha code in the given buffer
*/
extern void
ET_EvaluateBuffer(MWContext * context, char * buffer, uint buflen,
uint line_no, char * scope_to, JSBool want_result,
ETEvalAckFunc fn, void * data,
JSVersion ver, struct JSPrincipals *);
extern void
ET_EvaluateScript(MWContext * context, char * buffer, ETEvalStuff * stuff,
ETEvalAckFunc fn);
/*
* Ask Mocha to reflect the given object into JavaScript
*/
extern void
ET_ReflectObject(MWContext * pContext, void * lo_ele, void * tag,
int32 layer_id, uint index, ReflectedObject type);
void
ET_ReflectFormElement(MWContext * pContext, void * form,
LO_FormElementStruct * form_element, PA_Tag * tag);
extern void
ET_ReflectWindow(MWContext * pContext,
PA_Block onLoad, PA_Block onUnload,
PA_Block onFocus, PA_Block onBlur, PA_Block onHelp,
PA_Block onMouseOver, PA_Block onMouseOut, PA_Block onDragDrop,
PA_Block onMove, PA_Block onResize,
PA_Block id, char *all,
Bool bDelete, int newline_count);
/*
* Tell mocha we are processing a form
*/
extern void
ET_SetActiveForm(MWContext * pContext, struct lo_FormData_struct * loElement);
/*
* Tell mocha which layer we are processing
*/
void
ET_SetActiveLayer(MWContext * pContext, int32 layer_id);
/*
** Tell mocha where to send its output
*/
extern void
ET_ClearDecoderStream(MWContext * context, NET_StreamClass * old_stream);
extern void
ET_SetDecoderStream(MWContext * context, NET_StreamClass *stream,
URL_Struct *url_struct, JSBool free_stream_on_close);
/*
** Remember the current nesting URL in the MochaDecoder
*/
extern void
ET_SetNestingUrl(MWContext * context, char * szUrl);
/*
** Remember the current language version in the MochaDecoder
*/
extern void
ET_SetVersion(MWContext * context, JSVersion version);
/*
* Tell mocha to trash the current document. around and around...
*/
extern void
ET_ReleaseDocument(MWContext * pContext, JSBool resize_reload);
/*
* Tell mocha to trash the layer's document.
*/
extern void
ET_DestroyLayer(MWContext * pContext, JSObject *layer_obj);
extern void
ET_MochaStreamComplete(MWContext * context, void * buf, int len,
char * content_type, Bool isUnicode);
extern void
ET_MochaStreamAbort(MWContext * context, int status);
/*
* Called when a layer's contents are changing and we want to create
* a new layer document.
*/
extern void
ET_NewLayerDocument(MWContext *pContext, int32 layer_id);
extern void
ET_DocWriteAck(MWContext *pContext, int status);
extern void
ET_RegisterComponent(char *name, void *active_callback, void *startup_callback);
extern void
ET_RegisterComponentProp(char *comp, char *name, uint8 retType, void *setter,
void *getter);
extern void
ET_RegisterComponentMethod(char *comp, char *name, uint8 retType, void *method,
int32 argc);
/* =============================================================== */
/*
* This event can be sent to both the mozilla thread and the moacha thread
*/
typedef struct {
ETEvent ce;
TimeoutCallbackFunction fnCallback;
void* pClosure;
uint32 ulTime;
void* pTimerId;
} MozillaEvent_Timeout;
/* =============================================================== */
/*
* Busy loop waiting for events to come along
*/
extern void PR_CALLBACK
lm_wait_for_events(void *);
/*
* global mocha event queues. It would be nice to not have these
* exported this globally
*/
extern PREventQueue *lm_InterpretQueue;
extern PREventQueue *lm_PriorityQueue;
/*
* Ways to send events to the front end
*/
extern JSBool
ET_PostMessageBox(MWContext* context, char* szMessage,
JSBool bConfirm);
extern void
ET_PostProgress(MWContext* context, const char* szMessage);
/* --- timeout routines --- */
/*
* Set (or clear) a timeout to go off. The timeout will go off in the
* mozilla thread so we will use the routine ET_FireTimeoutCallBack()
* to get back into our thread to actually run the closure
*/
extern void *
ET_PostSetTimeout(TimeoutCallbackFunction fnCallback,
void * pClosure, uint32 ulTime, int32 doc_id);
extern void
ET_PostClearTimeout(void * stuff);
extern void
ET_FireTimeoutCallBack(void *);
/* --- end of timeout routines --- */
extern void
ET_PostDestroyWindow(MWContext * context);
extern void
ET_PostManipulateForm(MWContext * context, LO_Element * pForm, int32 action);
extern void
ET_PostClearView(MWContext * context);
extern void
ET_PostFreeImageElement(MWContext * context, void * stuff);
extern void
ET_PostFreeImageContext(MWContext *context, IL_GroupContext *img_cx);
extern void
ET_PostFreeAnonImages(MWContext *context, IL_GroupContext *img_cx);
extern void
ET_PostDisplayImage(MWContext *, int, LO_ImageStruct *);
extern void
ET_PostGetUrl(MWContext *, URL_Struct * pUrl);
extern char *
ET_PostPrompt(MWContext* context, const char* szMessage,
const char * szDefault);
extern MWContext *
ET_PostNewWindow(MWContext* context, URL_Struct * pUrl,
char * szName, Chrome * pChrome, LMWindowGroup *grp);
extern void
ET_PostUpdateChrome(MWContext* context, Chrome * pChrome);
extern void
ET_PostQueryChrome(MWContext* context, Chrome * pChrome);
extern void
ET_PostGetScreenSize(MWContext* context, int32 *pX, int32 *pY);
extern void
ET_PostGetAvailScreenRect(MWContext* context, int32 *pX, int32 *pY,
int32 *pLeft, int32 *pTop);
extern void
ET_PostGetColorDepth(MWContext* context, int32 *pPixel, int32 *pPallette);
extern char *
ET_PostGetSelectedText(MWContext* context);
extern void
ET_PostScrollDocTo(MWContext* context, int loc, int32 x, int32 y);
extern void
ET_PostScrollDocBy(MWContext* context, int loc, int32 x, int32 y);
extern void
ET_PostBackCommand(MWContext* context);
extern void
ET_PostForwardCommand(MWContext* context);
extern void
ET_PostHomeCommand(MWContext* context);
extern JSBool
ET_PostFindCommand(MWContext* context, char * szName, JSBool matchCase,
JSBool searchBackward);
extern void
ET_PostPrintCommand(MWContext* context);
extern void
ET_PostOpenFileCommand(MWContext* context);
extern void
ET_MakeHTMLAlert(MWContext * context, const char * szString);
/* respond to events sent to the mocha thread by the mozilla thread */
extern void
ET_PostJsEventAck(MWContext* context, LO_Element * pEle, int type,
ETClosureFunc fnClosure, void * pStuff,
ETEventStatus status);
extern void
ET_PostEvalAck(MWContext * context, int doc_id, void * data,
char * str, size_t len, char * wysiwyg_url,
char * base_href, Bool valid, ETEvalAckFunc fn);
extern void
ET_PostRestoreAck(void *data, LO_BlockInitializeStruct *param,
ETRestoreAckFunc fn);
/* netlib events */
extern char *
ET_net_GetCookie(MWContext* context, int32 doc_id);
extern char *
ET_net_SetCookieString(MWContext* context, char * szCookie, int32 doc_id);
extern NET_StreamClass *
ET_net_CacheConverter(FO_Present_Types format, void * obj,
URL_Struct *pUrl, MWContext * pContext);
extern void
ET_net_FindURLInCache(URL_Struct * pUrl, MWContext * pContext);
extern NET_StreamClass *
ET_net_StreamBuilder(FO_Present_Types format, URL_Struct *pUrl,
MWContext * pContext);
/* layout events */
extern void
ET_lo_ResetForm(MWContext * pContext, LO_Element * ele);
void
ET_fe_SubmitInputElement(MWContext * pContext, LO_Element * ele);
/*
* Synchronously shove the given text down the parser's processing
* queue. If the currently loaded document is not equal to
* doc_id, this message should be ignored since it arrived too
* late for the intended document
*/
extern int
ET_lo_DoDocWrite(JSContext *cx, MWContext * context, NET_StreamClass * stream,
char * str, size_t len, int32 doc_id);
extern void
ET_il_GetImage(const char * str, MWContext * pContext, IL_GroupContext *img_cx,
LO_ImageStruct * image_data, NET_ReloadMethod how);
extern void
ET_il_SetGroupObserver(MWContext * pContext, IL_GroupContext *pImgCX, void *pDpyCX,
JSBool bAddObserver);
extern void
ET_InterruptImgCX(MWContext * pContext);
/*
* Tell layout to trash the current document.
*/
extern void
ET_lo_DiscardDocument(MWContext * pContext);
/*
* Tell layout to prepare a layer for writing.
*/
extern Bool
ET_lo_PrepareLayerForWriting(MWContext *context, int32 layer_id,
const char *referer);
/*
* Return a copy of the current history element. Caller must free
*/
extern History_entry *
ET_shist_GetCurrent(MWContext * pContext);
/*
* Return the current security status.
*/
extern int
ET_GetSecurityStatus(MWContext * pContext);
/*
* Make sure Mocha/Java glue is ready. Returns the same return code as
* LM_InitMoja.
*/
extern int
ET_InitMoja(MWContext * pContext);
/*
* Pack up toys and go home
*/
extern void
ET_FinishMocha(void);
/*
* Used to call a stream completion function in the mozilla
* thread
*/
extern void
ET_moz_CallFunction(ETVoidPtrFunc fn, void * data);
extern void
ET_moz_CallFunctionAsync(ETVoidPtrFunc fn, void * data);
extern PRBool
ET_moz_CallFunctionBool(ETBoolPtrFunc fn, void * data);
extern int32
ET_moz_CallFunctionInt(ETIntPtrFunc fn, void * data);
extern char *
ET_moz_CallFunctionString(ETStringPtrFunc fn, void * data);
extern void
ET_moz_CallAsyncAndSubEventLoop(ETVoidPtrFunc fn, void *data,
MWContext *context);
extern void
ET_moz_Abort(MKStreamAbortFunc fn, void * data, int status);
extern void
ET_moz_SetMochaWriteStream(MochaDecoder * decoder);
extern NET_StreamClass *
ET_moz_DocCacheConverter(MWContext * context, URL_Struct * pUrl,
char * wysiwyg_url, int32 layer_id);
extern PRBool
ET_moz_VerifyComponentFunction(ETVerifyComponentFunc fn, ETBoolPtrFunc *pActive_callback,
ETVoidPtrFunc *pStartup_callback);
extern void
ET_moz_CompSetterFunction(ETCompPropSetterFunc fn, char *name, void *data);
extern void *
ET_moz_CompGetterFunction(ETCompPropGetterFunc fn, char *name);
extern void *
ET_moz_CompMethodFunction(ETCompMethodFunc fn, int32 argc, JSCompArg *argv);
typedef enum {
CL_Move,
CL_MoveX,
CL_MoveY,
CL_Offset,
CL_Resize,
CL_SetBboxWidth,
CL_SetBboxHeight,
CL_SetBboxTop,
CL_SetBboxLeft,
CL_SetBboxBottom,
CL_SetBboxRight,
CL_SetHidden,
CL_MoveInZ,
CL_SetSrc,
CL_SetSrcWidth,
CL_SetZ,
CL_SetBgColor,
CL_SetBackdrop
} ETLayerOp;
extern int
ET_TweakLayer(MWContext * context, CL_Layer * layer, int32 x, int32 y,
void *param_ptr, int32 param_val, ETLayerOp op,
const char *referer, int32 doc_id);
extern void
ET_RestoreLayerState(MWContext *context, int32 layer_id,
LO_BlockInitializeStruct *param, ETRestoreAckFunc fn,
void *data);
extern int32
ET_npl_RefreshPluginList(MWContext* context, XP_Bool refreshInstances);
extern JSCFResult
ET_JSCFExecute(MWContext *context, const char *script_name,
JSCFCookieData *data, Bool *data_changed);
extern JSBool
ET_HandlePref(JSContext * cx, uint argc, jsval * argv, jsval * rval);
extern void
ET_SetPluginWindow(MWContext * pContext, void * app);
NSPR_END_EXTERN_C
#endif /* libevent_h___ */

546
mozilla/include/libmocha.h Normal file
View File

@@ -0,0 +1,546 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
/*
* Header file for Mocha in the Navigator (libmocha).
*/
#ifndef libmocha_h___
#define libmocha_h___
#include "ntypes.h"
#include "il_types.h"
#include "prtypes.h"
#include "plhash.h"
#include "prthread.h"
#include "jsapi.h"
/* enable JavaScript Debugger support */
#if defined (_WIN32) || defined(XP_UNIX) || defined(powerc) || defined(__powerc) || defined(XP_OS2)
#ifdef JAVA
#define JSDEBUGGER 1
#endif
#endif
NSPR_BEGIN_EXTERN_C
typedef struct JSTimeout JSTimeout;
typedef struct JSPrincipalsList JSPrincipalsList;
typedef struct JSNestingUrl JSNestingUrl;
/*
* There exists one MochaDecoder per top-level MWContext that decodes Mocha,
* either from an HTML page or from a "mocha:[expr]" URL.
*/
typedef struct MochaDecoder {
int32 forw_count; /* forward reference count */
int32 back_count; /* back (up the tree) count */
JSContext *js_context;
MWContext *window_context;
JSObject *window_object;
NET_StreamClass *stream;
int32 stream_owner; /* id of layer that's loading the stream */
URL_Struct *url_struct;
JSTimeout *timeouts;
JSTimeout *saved_timeouts;
uint16 signature_ordinal;
PRPackedBool replace_location;
PRPackedBool resize_reload;
PRPackedBool load_event_sent;
PRPackedBool visited;
PRPackedBool writing_input;
PRPackedBool free_stream_on_close;
PRPackedBool in_window_quota;
PRPackedBool called_win_close;
PRPackedBool principals_compromised;
const char *source_url;
JSNestingUrl *nesting_url;
uint32 error_count;
uint32 event_mask;
int32 active_layer_id;
uint32 active_form_id;
uint32 event_bit;
int32 doc_id;
/*
* Class prototype objects, in alphabetical order. Must be CLEARed (set
* to null) in LM_PutMochaDecoder, HELD (GC roots added) in lm_NewWindow,
* and DROPped (removed as GC roots) in lm_DestroyWindow.
* XXXbe clean up, clear via bzero, using a sub-structure.
*/
JSObject *anchor_prototype;
JSObject *bar_prototype;
JSObject *document_prototype;
JSObject *event_prototype;
JSObject *event_capturer_prototype;
JSObject *event_receiver_prototype;
JSObject *form_prototype;
JSObject *image_prototype;
JSObject *input_prototype;
JSObject *layer_prototype;
JSObject *option_prototype;
JSObject *rect_prototype;
JSObject *url_prototype;
/*
* Window sub-objects. These must also follow the CLEAR/HOLD/DROP
* protocol mentioned above.
*/
JSObject *document;
JSObject *history;
JSObject *location;
JSObject *navigator;
JSObject *components;
JSObject *screen;
JSObject *hardware;
JSObject *crypto;
JSObject *pkcs11;
/*
* Ad-hoc GC roots.
*/
JSObject *event_receiver;
JSObject *opener;
JSVersion firstVersion; /* First JS script tag version. */
/*
* Security info for all of this decoder's scripts, except those
* contained in layers.
*/
JSPrincipals *principals;
JSPrincipalsList*early_access_list;
IL_GroupContext *image_context; /* Image context for anonymous images */
/*
* Table that maintains an id to JS object mapping for reflected
* elements. This is used during resize to reestablish the connection
* between layout elements and their corresponding JS object.
* Form elements are special, since they can't use the same keying
*/
PRHashTable *id_to_object_map;
} MochaDecoder;
/*
* Number of buckets for the id-to-object hash table.
*/
#define LM_ID_TO_OBJ_MAP_SIZE 20
#define LM_FORM_ELEMENT_MAP_SIZE 10
/*
* Types of objects reflected into Mocha
*/
typedef enum {
LM_APPLETS = 0,
LM_FORMS,
LM_LINKS,
LM_NAMEDANCHORS,
LM_EMBEDS,
LM_IMAGES,
LM_FORMELEMENTS,
LM_LAYERS
} ReflectedObject;
/*
* Generates an id-to-object mapping key from the ReflectedObject
* type, the containing layer id and the id of the object itself.
* The key is 4 bits type, 14 bits layer_id and 14 bits id.
*/
#define LM_GET_MAPPING_KEY(obj_type, layer_id, id) \
(void *)(((((uint32)obj_type) << 28) & 0xF0000000UL) | \
((((uint32)layer_id) << 14) & 0x0FFFC000UL) | \
(((uint32)id) & 0x00003FFFUL))
/*
* Public, well-known string constants.
*/
extern char js_language_name[]; /* "JavaScript" */
extern char js_content_type[]; /* "application/x-javascript" */
/*
* Initialize and finalize Mocha-in-the-client.
*/
extern void LM_InitMocha(void);
extern void LM_FinishMocha(void);
/*
* Force mocha on in the given context, even if the user pref is set to
* disable mocha.
*/
extern void LM_ForceJSEnabled(MWContext *cx);
/*
* Initialize and finalize Mocha-Java connection
*/
#define LM_MOJA_UNINITIALIZED 0
#define LM_MOJA_OK 1
#define LM_MOJA_JAVA_FAILED 2
#define LM_MOJA_OUT_OF_MEMORY 3
extern int LM_InitMoja(void);
extern void LM_FinishMoja(void);
extern int LM_IsMojaInitialized(void);
/*
* Enter or leave the big mocha lock. Any thread which wants to
* preserve JavaScript run-to-completion semantics must bracket
* JavaScript evaluation with these calls.
*/
typedef void
(PR_CALLBACK *JSLockReleaseFunc)(void * data);
extern void PR_CALLBACK LM_LockJS(MWContext *mwc);
extern void PR_CALLBACK LM_UnlockJS(MWContext *mwc);
extern JSBool PR_CALLBACK LM_AttemptLockJS(MWContext *mwc,
JSLockReleaseFunc fn, void * data);
extern JSBool PR_CALLBACK LM_ClearAttemptLockJS(MWContext *mwc,
JSLockReleaseFunc fn,
void * data);
extern PRBool PR_CALLBACK
LM_HandOffJSLock(PRThread * oldOwner, PRThread *newOwner);
/*
* For interruption purposes we will sometimes need to know the
* context who is holding the JS lock
*/
extern void LM_JSLockSetContext(MWContext * context);
extern MWContext * LM_JSLockGetContext(MWContext *mwc);
/*
* Enable/disable for Mocha-in-the-client.
*/
#define LM_SwitchMocha(toggle) LM_SetMochaEnabled(toggle)
extern JSBool
LM_GetMochaEnabled(void);
/*
* Get (create if necessary) a MochaDecoder for context, adding a reference
* to its window_object. Put drops the reference, destroying window_object
* when the count reaches zero. These functions should only be called in
* the mocha thread or while holding the JS-lock
*/
extern MochaDecoder *
LM_GetMochaDecoder(MWContext *context);
extern void
LM_PutMochaDecoder(MochaDecoder *decoder);
/*
* Get the source URL for script being loaded by document. This URL will be
* the document's URL for inline script, or the SRC= URL for included script.
* The returned pointer is safe only within the extent of the function that
* calls LM_GetSourceURL().
*/
extern const char *
LM_GetSourceURL(MochaDecoder *decoder);
/*
* Set the current layer and hence the current scope for script evaluation.
*/
extern void
LM_SetActiveLayer(MWContext * context, int32 layer_id);
/*
* Get the current layer and hence the current scope for script evaluation.
*/
extern int32
LM_GetActiveLayer(MWContext * context);
/*
* Evaluate the contents of a SCRIPT tag. You can specify the JSObject
* to use as the base scope. Pass NULL to use the default window_object
*/
extern JSBool
LM_EvaluateBuffer(MochaDecoder *decoder, void *base, size_t length,
uint lineno, char * scope_to, struct JSPrincipals *principals,
JSBool unicode, jsval *result);
/*
* Evaluate an expression entity in an HTML attribute (WIDTH="&{height/2};").
* Returns null on error, otherwise a pointer to the malloc'd string result.
* The caller is responsible for freeing the string result.
*/
extern char *
LM_EvaluateAttribute(MWContext *context, char *expr, uint lineno);
/*
* Remove any MochaDecoder window_context pointer to an MWContext that's
* being destroyed.
*/
extern void
LM_RemoveWindowContext(MWContext *context, History_entry * he);
extern void
LM_DropSavedWindow(MWContext *context, void *window);
/*
* Set and clear the HTML stream and URL for the MochaDecoder
* associated with the given context
*/
extern JSBool
LM_SetDecoderStream(MWContext * context, NET_StreamClass *stream,
URL_Struct *url_struct, JSBool free_stream_on_close);
/*
* Start caching HTML or plain text generated by document.write() where the
* script is running on mc, the document is being generated into decoder's
* window, and url_struct tells about the generator.
*/
extern NET_StreamClass *
LM_WysiwygCacheConverter(MWContext *context, URL_Struct *url_struct,
const char * wysiwyg_url, const char * base_href);
/*
* Skip over the "wysiwyg://docid/" in url_string and return a pointer to the
* real URL hidden after the prefix. If url_string is not of "wysiwyg:" type,
* just return url_string. Never returns null.
*/
extern const char *
LM_StripWysiwygURLPrefix(const char *url_string);
/*
* This function works only on "wysiwyg:" type URLs -- don't call it unless
* you know that NET_URL_Type(url_string) is WYSIWYG_TYPE_URL. It'll return
* null if url_string seems too short, or if it can't find the third slash.
*/
extern const char *
LM_SkipWysiwygURLPrefix(const char *url_string);
/*
* Return a pointer to a malloc'd string of the form "<BASE HREF=...>" where
* the "..." URL is the directory of cx's origin URL. Such a base URL is the
* default base for relative URLs in generated HTML.
*/
extern char *
LM_GetBaseHrefTag(JSContext *cx, JSPrincipals *principals);
/*
* XXX Make these public LO_... typedefs in lo_ele.h/ntypes.h?
*/
struct lo_FormData_struct;
struct lo_NameList_struct;
extern struct lo_FormData_struct *
LO_GetFormDataByID(MWContext *context, int32 layer_id, intn form_id);
extern uint
LO_EnumerateForms(MWContext *context, int32 layer_id);
extern struct LO_ImageStruct_struct *
LO_GetImageByIndex(MWContext *context, int32 layer_id, intn image_id);
extern uint
LO_EnumerateImages(MWContext *context, int32 layer_id);
/*
* Reflect display layers into Mocha.
*/
extern JSObject *
LM_ReflectLayer(MWContext *context, int32 layer_id, int32 parent_layer_id,
PA_Tag *tag);
extern LO_FormElementStruct *
LO_GetFormElementByIndex(struct lo_FormData_struct *form_data, int32 index);
extern uint
LO_EnumerateFormElements(MWContext *context,
struct lo_FormData_struct *form_data);
/*
* Layout helper function to find a named anchor by its index in the
* document.anchors[] array.
*/
extern struct lo_NameList_struct *
LO_GetNamedAnchorByIndex(MWContext *context, int32 layer_id, uint index);
extern uint
LO_EnumerateNamedAnchors(MWContext *context, int32 layer_id);
/*
* Layout Mocha helper function to find an HREF Anchor by its index in the
* document.links[] array.
*/
extern LO_AnchorData *
LO_GetLinkByIndex(MWContext *context, int32 layer_id, uint index);
extern uint
LO_EnumerateLinks(MWContext *context, int32 layer_id);
extern LO_JavaAppStruct *
LO_GetAppletByIndex(MWContext *context, int32 layer_id, uint index);
extern uint
LO_EnumerateApplets(MWContext *context, int32 layer_id);
extern LO_EmbedStruct *
LO_GetEmbedByIndex(MWContext *context, int32 layer_id, uint index);
extern uint
LO_EnumerateEmbeds(MWContext *context, int32 layer_id);
/*
* Get and set a color attribute in the current document state.
*/
extern void
LO_GetDocumentColor(MWContext *context, int type, LO_Color *color);
extern void
LO_SetDocumentColor(MWContext *context, int type, LO_Color *color);
/*
* Layout function to reallocate the lo_FormElementOptionData array pointed at
* by lo_FormElementSelectData's options member to include space for the number
* of options given by selectData->option_cnt.
*/
extern XP_Bool
LO_ResizeSelectOptions(lo_FormElementSelectData *selectData);
/*
* Discard the current document and all its subsidiary objects.
*/
extern void
LM_ReleaseDocument(MWContext *context, JSBool resize_reload);
/*
* Search if a the event is being captured in the frame hierarchy.
*/
extern XP_Bool
LM_EventCaptureCheck(MWContext *context, uint32 current_event);
/*
* Scroll a window to the given point.
*/
extern void LM_SendOnScroll(MWContext *context, int32 x, int32 y);
/*
* Display a help topic.
*/
extern void LM_SendOnHelp(MWContext *context);
/*
* Send a load or abort event for an image to a callback.
*/
typedef enum LM_ImageEvent {
LM_IMGUNBLOCK = 0,
LM_IMGLOAD = 1,
LM_IMGABORT = 2,
LM_IMGERROR = 3,
LM_LASTEVENT = 3
} LM_ImageEvent;
extern void
LM_ProcessImageEvent(MWContext *context, LO_ImageStruct *image_data,
LM_ImageEvent event);
/* This should be called when a named anchor is located. */
extern JSBool
LM_SendOnLocate(MWContext *context, struct lo_NameList_struct *name_rec);
extern JSObject *
LM_ReflectApplet(MWContext *context, LO_JavaAppStruct *applet_data,
PA_Tag * tag, int32 layer_id, uint index);
extern JSObject *
LM_ReflectEmbed(MWContext *context, LO_EmbedStruct *lo_embed,
PA_Tag * tag, int32 layer_id, uint index);
struct lo_FormData_struct;
struct lo_NameList_struct;
extern JSObject *
LM_ReflectForm(MWContext *context, struct lo_FormData_struct *form_data,
PA_Tag * tag, int32 layer_id, uint index);
extern JSObject *
LM_ReflectFormElement(MWContext *context, int32 layer_id, int32 form_id,
int32 element_id, PA_Tag * tag);
extern JSObject *
LM_ReflectLink(MWContext *context, LO_AnchorData *anchor_data, PA_Tag * tag,
int32 layer_id, uint index);
extern JSObject *
LM_ReflectNamedAnchor(MWContext *context, struct lo_NameList_struct *name_rec,
PA_Tag * tag, int32 layer_id, uint index);
extern JSObject *
LM_ReflectImage(MWContext *context, LO_ImageStruct *image_data,
PA_Tag * tag, int32 layer_id, uint index);
extern JSBool
LM_CanDoJS(MWContext *context);
extern JSBool
LM_IsActive(MWContext *context);
/*
* Security.
*/
extern JSPrincipals *
LM_NewJSPrincipals(URL_Struct *archive, char *name, const char *codebase);
extern char *
LM_ExtractFromPrincipalsArchive(JSPrincipals *principals, char *name,
uint *length);
extern JSBool
LM_SetUntransformedSource(JSPrincipals *principals, char *original,
char *transformed);
extern JSPrincipals * PR_CALLBACK
LM_GetJSPrincipalsFromJavaCaller(JSContext *cx, int callerDepth);
/*
* LM_RegisterPrincipals will verify and register a set of principals
* in the decoder, modifying decoder->principals in the process. It
* returns the modified decoder.
*
* The "name" parameter may be NULL if "principals" was created with a name.
*/
extern JSPrincipals *
LM_RegisterPrincipals(MochaDecoder *decoder, JSPrincipals *principals,
char *name, char *src);
/*
* JavaScript Debugger support
*/
#ifdef JSDEBUGGER
extern NET_StreamClass*
LM_StreamBuilder( int format_out,
void *data_obj,
URL_Struct *URL_s,
MWContext *mwcontext );
extern JSBool
LM_GetJSDebugActive(void);
extern void
LM_JamSourceIntoJSDebug( const char *filename,
const char *str,
int32 len,
MWContext *mwcontext );
#endif
NSPR_END_EXTERN_C
#endif /* libmocha_h___ */

3586
mozilla/lib/layout/layutil.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,95 @@
#!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 = ../..
MODULE = mocha
LIBRARY_NAME = mocha
REQUIRES = lay net parse img js style layer applet dbm nspr security \
htmldlgs util jtools pref java libreg softupdt jsdebug
CSRCS = et_mocha.c \
et_moz.c \
lm_applt.c \
lm_bars.c \
lm_cmpnt.c \
lm_doc.c \
lm_embed.c \
lm_event.c \
lm_form.c \
lm_hardw.c \
lm_hist.c \
lm_href.c \
lm_img.c \
lm_init.c \
lm_input.c \
lm_nav.c \
lm_plgin.c \
lm_screen.c \
lm_supdt.c \
lm_taint.c \
lm_trggr.c \
lm_url.c \
lm_win.c \
lm_layer.c \
lm_wngrp.c \
$(NULL)
ifdef MOZ_JAVA
CSRCS += \
lm_jsd.c \
$(NULL)
endif
ifndef NO_SECURITY
CSRCS += lm_crypt.c lm_pk11.c
endif
include $(DEPTH)/config/rules.mk
DEFINES += -DDLL_SUFFIX=\"$(DLL_SUFFIX)\"
ifdef JS_THREADSAFE
DEFINES += -DJS_THREADSAFE
endif
EMBED_CFLAGS = $(CFLAGS) -I$(DEPTH)/lib/plugin
TAINT_CFLAGS = $(CFLAGS) -I$(DEPTH)/lib/libjar -I$(DEPTH)/sun-java/netscape/security/_jri
ifneq ($(OS_ARCH),OS2)
$(OBJDIR)/lm_embed.o: lm_embed.c
@$(MAKE_OBJDIR)
$(CC) -o $@ -c $(EMBED_CFLAGS) $<
$(OBJDIR)/lm_taint.o: lm_taint.c
@$(MAKE_OBJDIR)
$(CC) -o $@ -c $(TAINT_CFLAGS) $<
else
$(OBJDIR)/lm_embed.o: lm_embed.c
@$(MAKE_OBJDIR)
$(CC) -Fo$@ -c $(EMBED_CFLAGS) $<
$(OBJDIR)/lm_taint.o: lm_taint.c
@$(MAKE_OBJDIR)
$(CC) -Fo$@ -c $(TAINT_CFLAGS) $<
endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

880
mozilla/lib/libmocha/lm.h Normal file
View File

@@ -0,0 +1,880 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
#ifndef lm_h___
#define lm_h___
/*
* JS in the Navigator library-private interface.
*/
#include "xp.h" /* for uint and PA_Block */
#include "prlong.h" /* for int64 time type used below */
#include "libevent.h" /* until its a stand-alone */
#include "libmocha.h"
/*
* Shared string constants for common property names.
*/
extern char lm_argc_err_str[]; /* "incorrect number of arguments" */
extern char lm_unknown_origin_str[]; /* "[unknown origin]" */
extern char lm_onLoad_str[]; /* "onLoad" */
extern char lm_onUnload_str[]; /* "onUnload" */
extern char lm_onAbort_str[]; /* "onAbort" */
extern char lm_onError_str[]; /* "onError" */
extern char lm_onScroll_str[]; /* "onScroll" */
extern char lm_onFocus_str[]; /* "onFocus" */
extern char lm_onBlur_str[]; /* "onBlur" */
extern char lm_onSelect_str[]; /* "onSelect" */
extern char lm_onChange_str[]; /* "onChange" */
extern char lm_onReset_str[]; /* "onReset" */
extern char lm_onSubmit_str[]; /* "onSubmit" */
extern char lm_onClick_str[]; /* "onClick" */
extern char lm_onMouseDown_str[]; /* "onMouseDown" */
extern char lm_onMouseOver_str[]; /* "onMouseOver" */
extern char lm_onMouseOut_str[]; /* "onMouseOut" */
extern char lm_onMouseUp_str[]; /* "onMouseUp" */
extern char lm_onLocate_str[]; /* "onLocate" */
extern char lm_onHelp_str[]; /* "onHelp" [EA] */
extern char lm_focus_str[]; /* "focus" */
extern char lm_blur_str[]; /* "blur" */
extern char lm_select_str[]; /* "select" */
extern char lm_click_str[]; /* "click" */
extern char lm_scroll_str[]; /* "scroll" */
extern char lm_enable_str[]; /* "enable" */
extern char lm_disable_str[]; /* "disable" */
extern char lm_toString_str[]; /* "toString" */
extern char lm_length_str[]; /* "length" */
extern char lm_document_str[]; /* "document" */
extern char lm_forms_str[]; /* "forms" */
extern char lm_links_str[]; /* "links" */
extern char lm_anchors_str[]; /* "anchors" */
extern char lm_applets_str[]; /* "applets" */
extern char lm_embeds_str[]; /* "embeds" */
extern char lm_plugins_str[]; /* "plugins" */
extern char lm_images_str[]; /* "images" */
extern char lm_layers_str[]; /* "layers" */
extern char lm_location_str[]; /* "location" */
extern char lm_navigator_str[]; /* "navigator" */
extern char lm_netcaster_str[]; /* "netcaster" */
extern char lm_components_str[]; /* "components" */
extern char lm_parentLayer_str[]; /* "parentLayer" */
extern char lm_opener_str[]; /* "opener" */
extern char lm_closed_str[]; /* "closed" */
extern char lm_assign_str[]; /* "assign" */
extern char lm_reload_str[]; /* "reload" */
extern char lm_replace_str[]; /* "replace" */
extern char lm_event_str[]; /* "event" */
extern char lm_methodPrefix_str[]; /* "#method" */
extern char lm_methodArgc_str[]; /* "#method" */
extern char lm_methodArgv_str[]; /* "#method" */
extern char lm_getPrefix_str[]; /* "#get_" */
extern char lm_setPrefix_str[]; /* "#set_" */
extern char lm_typePrefix_str[]; /* "#type_" */
extern const char *lm_event_argv[]; /* {lm_event_str} */
extern PRThread *lm_InterpretThread;
extern PRThread *mozilla_thread;
extern PRThread *lm_js_lock_previous_owner;
extern JSContext *lm_writing_context;
/*
* Timeout structure threaded on MochaDecoder.timeouts for cleanup.
*/
struct JSTimeout {
int32 ref_count; /* reference count to shared usage */
char *expr; /* the JS expression to evaluate */
JSObject *funobj; /* or function to call, if !expr */
jsval *argv; /* function actual arguments */
void *toid; /* Identifier, used internally only */
uint32 public_id; /* Returned as value of setTimeout() */
uint16 argc; /* and argument count */
uint16 spare; /* alignment padding */
int32 doc_id; /* document this is for */
int32 interval; /* Non-zero if repetitive timeout */
int64 when; /* nominal time to run this timeout */
JSVersion version; /* Version of JavaScript to execute */
JSPrincipals *principals; /* principals with which to execute */
char *filename; /* filename of setTimeout call */
uint32 lineno; /* line number of setTimeout call */
JSTimeout *next; /* next timeout in list */
};
extern void lm_ClearWindowTimeouts(MochaDecoder *decoder);
struct JSNestingUrl {
JSNestingUrl *next;
char *str;
};
/*
* Event queue stack madness to handle doc.write("<script>doc.write...").
*/
typedef struct QueueStackElement {
PREventQueue * queue;
MWContext * context;
int32 doc_id;
struct QueueStackElement * up;
struct QueueStackElement * down;
PRPackedBool done;
PRPackedBool discarding;
PRPackedBool inherit_parent;
void * retval;
} QueueStackElement;
extern void
et_SubEventLoop(QueueStackElement * qse);
/*
* Stack size per window context, plus one for the navigator.
*/
#define LM_STACK_SIZE 8192
extern JSRuntime *lm_runtime;
extern JSClass lm_window_class;
extern JSClass lm_layer_class;
extern JSClass lm_document_class;
extern JSClass lm_event_class;
extern JSBool lm_SaveParamString(JSContext *cx, PA_Block *bp,
const char *str);
extern MochaDecoder *lm_NewWindow(MWContext *context);
extern void lm_DestroyWindow(MochaDecoder *decoder);
/*
* Hold and drop the reference count for tree back-edges that go from object
* private data to the containing decoder. These refs do not keep the object
* tree under decoder alive from the GC, but they do keep decoder from being
* destroyed and some out of order finalizer tripping over its freed memory.
*/
#ifdef DEBUG
extern MochaDecoder *lm_HoldBackCount(MochaDecoder *decoder);
extern void lm_DropBackCount(MochaDecoder *decoder);
#define HOLD_BACK_COUNT(decoder) lm_HoldBackCount(decoder)
#define DROP_BACK_COUNT(decoder) lm_DropBackCount(decoder)
#else
#define HOLD_BACK_COUNT(decoder) \
(((decoder) ? (decoder)->back_count++ : 0), (decoder))
#define DROP_BACK_COUNT(decoder) \
(((decoder) && --(decoder)->back_count <= 0 && !(decoder)->forw_count) \
? lm_DestroyWindow(decoder) \
: (void)0)
#endif
extern JSBool lm_InitWindowContent(MochaDecoder *decoder);
extern JSBool lm_DefineWindowProps(JSContext *cx,
MochaDecoder *decoder);
extern JSBool lm_ResolveWindowProps(JSContext *cx,
MochaDecoder *decoder,
JSObject *obj,
jsval id);
extern void lm_FreeWindowContent(MochaDecoder *decoder,
JSBool fromDiscard);
extern JSBool lm_SetInputStream(JSContext *cx,
MochaDecoder *decoder,
NET_StreamClass *stream,
URL_Struct *url_struct,
JSBool free_stream_on_close);
extern JSObject *lm_DefineDocument(MochaDecoder *decoder,
int32 layer_id);
extern JSObject *lm_DefineHistory(MochaDecoder *decoder);
extern JSObject *lm_DefineLocation(MochaDecoder *decoder);
extern JSObject *lm_DefineNavigator(MochaDecoder *decoder);
extern JSObject *lm_DefineComponents(MochaDecoder *decoder);
extern JSObject *lm_DefineCrypto(MochaDecoder *decoder);
extern JSObject *lm_DefineScreen(MochaDecoder *decoder,
JSObject *parent);
extern JSObject *lm_DefineHardware(MochaDecoder *decoder,
JSObject *parent);
extern JSBool lm_DefinePluginClasses(MochaDecoder *decoder);
extern JSBool lm_DefineBarClasses(MochaDecoder *decoder);
extern JSBool lm_ResolveBar(JSContext *cx, MochaDecoder *decoder,
const char *name);
extern JSBool lm_DefineTriggers(void);
extern JSObject *lm_NewPluginList(JSContext *cx, JSObject *parent_obj);
extern JSObject *lm_NewMIMETypeList(JSContext *cx);
extern JSObject *lm_GetDocumentFromLayerId(MochaDecoder *decoder,
int32 layer_id);
extern JSObject *lm_DefinePkcs11(MochaDecoder *decoder);
/*
* Get (create if needed) document's form, link, and named anchor arrays.
*/
extern JSObject *lm_GetFormArray(MochaDecoder *decoder,
JSObject *document);
extern JSObject *lm_GetLinkArray(MochaDecoder *decoder,
JSObject *document);
extern JSObject *lm_GetNameArray(MochaDecoder *decoder,
JSObject *document);
extern JSObject *lm_GetAppletArray(MochaDecoder *decoder,
JSObject *document);
extern JSObject *lm_GetEmbedArray(MochaDecoder *decoder,
JSObject *document);
extern JSObject *lm_GetImageArray(MochaDecoder *decoder,
JSObject *document);
extern JSObject *lm_GetDocumentLayerArray(MochaDecoder *decoder,
JSObject *document);
/*
* dummy object for applets and embeds that can't be reflected
*/
extern JSObject *lm_DummyObject;
extern void lm_InitDummyObject(JSContext *cx);
/* bit vector for handlers */
typedef enum {
HANDLER_ONCLICK = 1 << 0,
HANDLER_ONFOCUS = 1 << 1,
HANDLER_ONBLUR = 1 << 2,
HANDLER_ONCHANGE = 1 << 3,
HANDLER_ONSELECT = 1 << 4,
HANDLER_ONSCROLL = 1 << 5,
HANDLER_ONMOUSEDOWN = 1 << 6,
HANDLER_ONMOUSEUP = 1 << 7,
HANDLER_ONKEYDOWN = 1 << 8,
HANDLER_ONKEYUP = 1 << 9,
HANDLER_ONKEYPRESS = 1 << 10,
HANDLER_ONDBLCLICK = 1 << 11
} JSHandlersBitVector;
/*
* Base class of all JS input private object data structures.
*/
typedef struct JSInputBase {
MochaDecoder *decoder; /* this window's JS decoder */
int32 type; /* layout form element type */
JSHandlersBitVector handlers; /* bit vector for handlers */
} JSInputBase;
/*
* Base class of event-handling elements like layers and documents.
*/
typedef struct JSInputHandler {
JSInputBase base; /* decoder and type */
JSObject *object; /* this input handler's JS object */
uint32 event_mask; /* mask of events in progress */
} JSInputHandler;
/*
* Base class of input event-capturing elements like layers and documents.
*/
typedef struct JSEventReceiver {
JSObject *object; /* this event receiver's JS object */
uint32 event_mask; /* mask of events in progress */
} JSEventReceiver;
/*
* Base class of input event-handling elements like anchors and form inputs.
*/
typedef struct JSEventCapturer {
JSEventReceiver base; /* this event capturer's receiver base */
uint32 event_bit; /* mask of events being captured */
} JSEventCapturer;
#define base_decoder base.decoder
#define base_type base.type
#define base_handlers base.handlers
/*
* JS URL object.
*
* Location is a special URL: when you set one of its properties, your client
* window goes to the newly formed address.
*/
typedef struct JSURL {
JSInputHandler handler;
int32 layer_id;
uint32 index;
JSString *href;
JSString *target;
JSString *text;
} JSURL;
/* JS Document Object
* Documents exist per-window and per-layer
*/
typedef struct JSDocument {
JSEventCapturer capturer;
MochaDecoder *decoder;
JSObject *object;
int32 layer_id; /* The containing layer's id */
JSObject *forms;
JSObject *links;
JSObject *anchors;
JSObject *applets;
JSObject *embeds;
JSObject *images;
JSObject *layers;
} JSDocument;
#define URL_NOT_INDEXED ((uint32)-1)
#define url_decoder handler.base_decoder
#define url_type handler.base_type
#define url_object handler.object
#define url_event_mask handler.event_mask
extern JSURL *
lm_NewURL(JSContext *cx, MochaDecoder *decoder,
LO_AnchorData *anchor_data, JSObject *document);
extern void
lm_ReplaceURL(MWContext *context, URL_Struct *url_struct);
extern JSBool
lm_GetURL(JSContext *cx, MochaDecoder *decoder, URL_Struct *url_struct);
extern const char *
lm_CheckURL(JSContext *cx, const char *url_string, JSBool checkFile);
extern JSBool
lm_CheckWindowName(JSContext *cx, const char *window_name);
extern PRHashTable *
lm_GetIdToObjectMap(MochaDecoder *decoder);
extern JSBool PR_CALLBACK
lm_BranchCallback(JSContext *cx, JSScript *script);
extern void PR_CALLBACK
lm_ErrorReporter(JSContext *cx, const char *message,
JSErrorReport *report);
extern JSObject *
lm_GetFormObjectByID(MWContext *context, int32 layer_id, uint form_id);
extern LO_FormElementStruct *
lm_GetFormElementByIndex(JSContext * cx, JSObject *form_obj, int32 index);
extern JSObject *
lm_GetFormElementFromMapping(JSContext *cx, JSObject *form_obj, uint32 index);
extern JSBool
lm_AddFormElement(JSContext *cx, JSObject *form, JSObject *obj,
char *name, uint index);
extern JSBool
lm_ReflectRadioButtonArray(MWContext *context, int32 layer_id, intn form_id,
const char *name, PA_Tag * tag);
extern JSBool
lm_SendEvent(MWContext *context, JSObject *obj, JSEvent *event,
jsval *result);
extern JSBool
lm_HandleEvent(JSContext *cx, JSObject *obj, JSObject *eventObj,
jsval funval, jsval *result);
extern JSBool
lm_FindEventHandler(MWContext *context, JSObject *obj, JSObject *eventObj,
jsval funval, jsval *result);
extern JSObject *
lm_NewEventObject(MochaDecoder * decoder, JSEvent * pEvent);
typedef struct JSEventNames {
const char *lowerName;
const char *mixedName;
} JSEventNames;
extern const char *
lm_EventName(uint32 event_bit);
extern JSEventNames *
lm_GetEventNames(uint32 event_bit);
/*
* Compile the given attribute and attach it to the JSObject
*/
extern JSBool
lm_CompileEventHandler(MochaDecoder * decoder, PA_Block id, PA_Block data,
int newline_(cx, sizeof *option);
if (!option)
goto bad;
option_obj =
JS_NewObject(cx, &lm_option_class,
input->input_decoder->option_prototype, obj);
if (!option_obj || !JS_SetPrivate(cx, option_obj, option)) {
JS_free(cx, option);
goto bad;
}
option->decoder = HOLD_BACK_COUNT(input->input_decoder);
option->object = option_obj;
option->index = (uint32)slot;
option->indexInForm = form_element->element_index;
option->data = NULL;
*vp = OBJECT_TO_JSVAL(option_obj);
goto good;
}
}
break;
case FORM_TYPE_RADIO:
case FORM_TYPE_CHECKBOX:
{
lo_FormElementToggleData *toggle;
toggle = &form_element->element_data->ele_toggle;
switch (input_slot) {
case INPUT_NAME:
str = lm_LocalEncodingToStr(context,
(char *)toggle->name);
break;
case INPUT_VALUE:
str = lm_LocalEncodingToStr(context,
(char *)toggle->value);
break;
case INPUT_STATUS:
*vp = BOOLEAN_TO_JSVAL(toggle->toggled);
goto good;
case INPUT_DEFAULT_STATUS:
*vp = BOOLEAN_TO_JSVAL(toggle->default_toggle);
goto good;
#if DISABLED_READONLY_SUPPORT
case INPUT_DISABLED:
*vp = BOOLEAN_TO_JSVAL(toggle->disabled);
goto good;
case INPUT_READONLY:
*vp = BOOLEAN_TO_JSVAL(FALSE);
goto good;
#endif
default:
/* Don't mess with a user-defined property. */
goto good;
}
}
break;
default:
{
lo_FormElementMinimalData *minimal;
minimal = &form_element->element_data->ele_minimal;
switch (input_slot) {
case INPUT_NAME:
str = lm_LocalEncodingToStr(context,
(char *)minimal->name);
break;
case INPUT_VALUE:
str = lm_LocalEncodingToStr(context,
(char *)minimal->value);
break;
#if DISABLED_READONLY_SUPPORT
case INPUT_DISABLED:
*vp = BOOLEAN_TO_JSVAL(minimal->disabled);
goto good;
case INPUT_READONLY:
*vp = BOOLEAN_TO_JSVAL(FALSE); /* minimal elements don't have the readonly attribute. */
goto good;
#endif
default:
/* Don't mess with a user-defined property. */
goto good;
}
}
break;
}
if (!str)
goto bad;
*vp = STRING_TO_JSVAL(str);
good:
LO_UnlockLayout();
return JS_TRUE;
bad:
LO_UnlockLayout();
return JS_FALSE;
}
char *
lm_FixNewlines(JSContext *cx, const char *value, JSBool formElement)
{
size_t size;
const char *cp;
char *tp, *new_value;
#if defined XP_PC
size = 1;
for (cp = value; *cp != '\0'; cp++) {
switch (*cp) {
case '\r':
if (cp[1] != '\n')
size++;
break;
case '\n':
if (cp > value && cp[-1] != '\r')
size++;
break;
}
}
size += cp - value;
#else
size = XP_STRLEN(value) + 1;
#endif
new_value = JS_malloc(cx, size);
if (!new_value)
return NULL;
for (cp = value, tp = new_value; *cp != '\0'; cp++) {
#if defined XP_MAC
if (*cp == '\n') {
if (cp > value && cp[-1] != '\r')
*tp++ = '\r';
} else {
*tp++ = *cp;
}
#elif defined XP_PC
switch (*cp) {
case '\r':
*tp++ = '\r';
if (cp[1] != '\n' && formElement)
*tp++ = '\n';
break;
case '\n':
if (cp > value && cp[-1] != '\r' && formElement)
*tp++ = '\r';
*tp++ = '\n';
break;
default:
*tp++ = *cp;
break;
}
#else /* XP_UNIX */
if (*cp == '\r') {
if (cp[1] != '\n')
*tp++ = '\n';
} else {
*tp++ = *cp;
}
#endif
}
*tp = '\0';
return new_value;
}
PR_STATIC_CALLBACK(JSBool)
input_setProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
JSInput *input;
enum input_slot input_slot;
const char *prop_name;
char *value = NULL;
LO_FormElementStruct *form_element;
MochaDecoder *decoder;
MWContext *context;
int32 intval;
jsint slot;
input = JS_GetInstancePrivate(cx, obj, &lm_input_class, NULL);
if (!input)
return JS_TRUE;
/* If the property is seting a key handler we find out now so
* that we can tell the front end to send the event. */
if (JSVAL_IS_STRING(id)) {
prop_name = JS_GetStringBytes(JSVAL_TO_STRING(id));
/* XXX use lm_onKeyDown_str etc. initialized by PARAM_ONKEYDOWN */
if (XP_STRCASECMP(prop_name, "onkeydown") == 0 ||
XP_STRCASECMP(prop_name, "onkeyup") == 0 ||
XP_STRCASECMP(prop_name, "onkeypress") == 0) {
form_element = lm_GetFormElementByIndex(cx, JS_GetParent(cx, obj),
input->index);
form_element->event_handler_present = TRUE;
}
return JS_TRUE;
}
XP_ASSERT(JSVAL_IS_INT(id));
slot = JSVAL_TO_INT(id);
decoder = input->input_decoder;
context = decoder->window_context;
input_slot = slot;
switch (input_slot) {
case INPUT_TYPE:
case INPUT_FORM:
case INPUT_OPTIONS:
/* These are immutable. */
break;
case INPUT_NAME:
case INPUT_VALUE:
case INPUT_DEFAULT_VALUE:
/* These are string-valued. */
if (!JSVAL_IS_STRING(*vp) &&
!JS_ConvertValue(cx, *vp, JSTYPE_STRING, vp)) {
return JS_FALSE;
}
value = lm_StrToLocalEncoding(context, JSVAL_TO_STRING(*vp));
break;
case INPUT_STATUS:
case INPUT_DEFAULT_STATUS:
#if DISABLED_READONLY_SUPPORT
case INPUT_READONLY:
case INPUT_DISABLED:
#endif
/* These must be Booleans. */
if (!JSVAL_IS_BOOLEAN(*vp) &&
!JS_ConvertValue(cx, *vp, JSTYPE_BOOLEAN, vp)) {
return JS_FALSE;
}
break;
case INPUT_LENGTH:
case INPUT_SELECTED_INDEX:
/* These should be integers. */
if (JSVAL_IS_INT(*vp))
intval = JSVAL_TO_INT(*vp);
else if (!JS_ValueToInt32(cx, *vp, &intval)) {
return JS_FALSE;
}
break;
}
LO_LockLayout();
form_element = lm_GetFormElementByIndex(cx, JS_GetParent(cx, obj),
input->index);
if (!form_element)
goto good;
switch (form_element->element_data->type) {
case FORM_TYPE_FILE:
/* if we try to set a file upload widget we better be a signed script */
if (!lm_CanAccessTarget(cx, JSTARGET_UNIVERSAL_FILE_READ))
break;
/* else fall through... */
case FORM_TYPE_TEXT:
case FORM_TYPE_TEXTAREA: /* XXX we ASSUME common struct prefixes */
case FORM_TYPE_PASSWORD:
{
lo_FormElementTextData *text;
JSBool ok;
char * fixed_string;
text = &form_element->element_data->ele_text;
switch (input_slot) {
case INPUT_NAME:
if (!lm_SaveParamString(cx, &text->name, value))
goto bad;
break;
case INPUT_VALUE:
case INPUT_DEFAULT_VALUE:
fixed_string = lm_FixNewlines(cx, value, JS_TRUE);
if (!fixed_string)
goto bad;
ok = (input_slot == INPUT_VALUE)
? lm_SaveParamString(cx, &text->current_text, fixed_string)
: lm_SaveParamString(cx, &text->default_text, fixed_string);
JS_free(cx, (char *)fixed_string);
if (!ok)
goto bad;
if (input_slot == INPUT_VALUE && context) {
ET_PostManipulateForm(context, (LO_Element *)form_element,
EVENT_CHANGE);
}
break;
#if DISABLED_READONLY_SUPPORT
case INPUT_DISABLED:
text->disabled = JSVAL_TO_BOOLEAN(*vp);
if (context) {
ET_PostManipulateForm(context, (LO_Element *)form_element,
EVENT_CHANGE);
}
break;
case INPUT_READONLY:
if (form_element->element_data->type == FORM_TYPE_FILE)
break;
text->readonly = JSVAL_TO_BOOLEAN(*vp);
if (context) {
ET_PostManipulateForm(context, (LO_Element *)form_element,
EVENT_CHANGE);
}
break;
#endif
default:
/* Don't mess with option or user-defined property. */
goto good;
}
}
break;
case FORM_TYPE_SELECT_ONE:
case FORM_TYPE_SELECT_MULT:
{
lo_FormElementSelectData *selectData;
lo_FormElementOptionData *optionData;
JSSelectOption *option;
int32 i, new_option_cnt, old_option_cnt;
selectData = &form_element->element_data->ele_select;
switch (slot) {
case INPUT_NAME:
if (!lm_SaveParamString(cx, &selectData->name, value))
goto bad;
break;
case INPUT_LENGTH:
new_option_cnt = intval;
old_option_cnt = selectData->option_cnt;
optionData = (lo_FormElementOptionData *) selectData->options;
/* Remove truncated slots, or clear extended element data. */
if (new_ayer(MWContext *context, int32 wrap_width, int32 parent_layer_id);
extern void
lm_RestoreLayerState(MWContext *context, int32 layer_id,
LO_BlockInitializeStruct *param);
extern PRHashNumber
lm_KeyHash(const void *key);
extern JSBool
lm_jsval_to_rgb(JSContext *cx, jsval *vp, LO_Color **rgbp);
extern JSBool
layer_setBgColorProperty(JSContext *cx, JSObject *obj, jsval *vp);
extern JSObject *
lm_GetActiveContainer(MochaDecoder *decoder);
extern JSBool
lm_GetPrincipalsCompromise(JSContext *cx, JSObject *obj);
extern char *
lm_FixNewlines(JSContext *cx, const char *value, JSBool formElement);
extern JSBool PR_CALLBACK
win_open(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
/* defined in libmocha.h */
#ifdef JSDEBUGGER
extern void
lm_InitJSDebug(JSRuntime *jsruntime);
extern void
lm_ExitJSDebug(JSRuntime *jsruntime);
#endif
#define IS_MESSAGE_WINDOW(context) \
(((context)->type == MWContextMail) || \
((context)->type == MWContextNews) || \
((context)->type == MWContextMailMsg) || \
((context)->type == MWContextNewsMsg))
/* INTL support */
extern char *
lm_StrToLocalEncoding(MWContext * context, JSString * str);
extern JSString *
lm_LocalEncodingToStr(MWContext * context, char * bytes);
/* end INTL support */
/* MLM */
typedef struct lm_lock_waiter {
JSLockReleaseFunc fn;
void * data;
struct lm_lock_waiter * next;
} lm_lock_waiter;
typedef struct ContextListStr ContextList;
typedef struct WindowGroup LMWindowGroup;
struct WindowGroup {
LMWindowGroup *next;
LMWindowGroup *prev;
/* XXXMLM - this entry is currently unused; it should eventually hold
* a shared JSContext for the thread group.
*/
JSContext *js_context;
PRBool interruptCurrentOp;
PRMonitor *owner_monitor;
PRThread *thread;
PRThread *owner;
lm_lock_waiter *waiting_list;
int32 current_count;
PRBool mozWantsLock;
PRBool mozGotLock;
PRBool hasLock;
JSContext *lock_context;
JSTimeout **js_timeout_insertion_point;
JSTimeout *js_timeout_running;
uint inputRecurring;
PREventQueue *interpret_queue;
QueueStackElement *queue_stack;
uint queue_depth;
uint queue_count;
PRMonitor *queue_monitor;
ContextList *mw_contexts;
MWContext *current_context;
PRBool done;
};
extern void lm_InitWindowGroups(void);
extern LMWindowGroup *lm_NewWindowGroup(void);
extern void lm_StartWindowGroup(LMWindowGroup *grp);
extern void lm_DestroyWindowGroup(LMWindowGroup *grp);
extern LMWindowGroup *LM_GetDefaultWindowGroup(MWContext *mwc);
extern LMWindowGroup *lm_MWContextToGroup(MWContext *mwc);
extern LMWindowGroup *lm_QueueStackToGroup(QueueStackElement *qse);
extern PREventQueue *LM_MWContextToQueue(MWContext *mwc);
extern PREventQueue *LM_WindowGroupToQueue(LMWindowGroup *lmg);
extern ContextList *lm_GetEntryForContext(LMWindowGroup *grp, MWContext *cx);
extern void LM_AddContextToGroup(LMWindowGroup *grp, MWContext *cx);
extern void LM_RemoveContextFromGroup(MWContext *cx);
extern PRBool LM_IsLocked(LMWindowGroup *grp);
extern void LM_BeginRequest(LMWindowGroup *grp, JSContext *jsc);
extern void LM_EndRequest(LMWindowGroup *grp, JSContext *jsc);
extern void LM_LockJSByGroup(LMWindowGroup *grp);
extern void LM_UnlockJSByGroup(LMWindowGroup *grp);
extern JSBool lm_inited(void);
extern JSContext *LM_GetCrippledContext(void);
extern MochaDecoder *LM_GetCrippledDecoder(void);
extern void LM_SetCrippledDecoder(MochaDecoder *md);
extern JSBool LM_ShouldRunGC(JSContext *cx, JSGCStatus status);
/* MLM */
#endif /* lm_h___ */

View File

@@ -0,0 +1,675 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
/*
* JS reflection of Navigator Components.
*
* Created: Tom Pixley, 4/22/97
*
*/
#include "lm.h"
#include "prmem.h"
#include "np.h"
#include "net.h"
#include "fe_proto.h"
/*
* -----------------------------------------------------------------------
*
* Data types
*
* -----------------------------------------------------------------------
*/
typedef struct JSComponent
{
MochaDecoder *decoder;
JSObject *obj;
JSString *name;
ETBoolPtrFunc active_callback;
ETVoidPtrFunc startup_callback;
} JSComponent;
typedef struct JSComponentArray
{
MochaDecoder *decoder;
JSObject *obj;
jsint length;
} JSComponentArray;
typedef struct JSPreDefComponent
{
const char *name;
ETVerifyComponentFunc func;
} JSPreDefComponent;
static JSPreDefComponent predef_components[] =
{
{0}
};
/*
* -----------------------------------------------------------------------
*
* Reflection of an installed component.
*
* -----------------------------------------------------------------------
*/
enum component_slot
{
COMPONENT_NAME = -1,
COMPONENT_ACTIVE = -2
};
static JSPropertySpec component_props[] =
{
{"name", COMPONENT_NAME, JSPROP_ENUMERATE | JSPROP_READONLY},
{"active", COMPONENT_ACTIVE, JSPROP_ENUMERATE | JSPROP_READONLY},
{0}
};
extern JSClass lm_component_class;
PR_STATIC_CALLBACK(JSBool)
component_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
JSComponent *component;
JSString *str;
jsint slot;
if (!JSVAL_IS_INT(id))
return JS_TRUE;
slot = JSVAL_TO_INT(id);
component = JS_GetInstancePrivate(cx, obj, &lm_component_class, NULL);
if (!component)
return JS_TRUE;
switch (slot) {
case COMPONENT_NAME:
str = component->name;
if (str)
*vp = STRING_TO_JSVAL(str);
else
*vp = JS_GetEmptyStringValue(cx);
break;
case COMPONENT_ACTIVE:
*vp = JSVAL_FALSE;
if (ET_moz_CallFunctionBool((ETBoolPtrFunc)component->active_callback, NULL))
*vp = JSVAL_TRUE;
break;
default:
break;
}
return JS_TRUE;
}
PR_STATIC_CALLBACK(JSBool)
component_mozilla_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
char *name, *type_str, *get_str;
jsval type, func;
if (!JSVAL_IS_STRING(id))
return JS_TRUE;
name = JS_GetStringBytes(JSVAL_TO_STRING(id));
type_str = JS_malloc(cx, XP_STRLEN(lm_typePrefix_str) + XP_STRLEN(name) + 1);
get_str = JS_malloc(cx, XP_STRLEN(lm_getPrefix_str) + XP_STRLEN(name) + 1);
if (!type_str || !get_str)
return JS_TRUE;
XP_STRCPY(type_str, lm_typePrefix_str);
XP_STRCAT(type_str, name);
XP_STRCPY(get_str, lm_getPrefix_str);
XP_STRCAT(get_str, name);
if (!JS_GetProperty(cx, obj, type_str, &type) ||
!JSVAL_IS_INT(type) ||
!JS_GetProperty(cx, obj, get_str, &func))
return JS_TRUE;
JS_free(cx, type_str);
JS_free(cx, get_str);
switch(JSVAL_TO_INT(type)) {
case ARGTYPE_INT32:
*vp = INT_TO_JSVAL((int32)ET_moz_CompGetterFunction((ETCompPropGetterFunc)JSVAL_TO_INT(func), name));
break;
case ARGTYPE_BOOL:
*vp = BOOLEAN_TO_JSVAL((JSBool)ET_moz_CompGetterFunction((ETCompPropGetterFunc)JSVAL_TO_INT(func), name));
break;
case ARGTYPE_STRING:
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx,
(char*)ET_moz_CompGetterFunction((ETCompPropGetterFunc)JSVAL_TO_INT(func), name)));
break;
}
return JS_TRUE;
}
PR_STATIC_CALLBACK(JSBool)
component_mozilla_setProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
char *name, *type_str, *set_str, *prop_val;
jsval type, func;
if (!JSVAL_IS_STRING(id))
return JS_TRUE;
name = JS_GetStringBytes(JSVAL_TO_STRING(id));
type_str = JS_malloc(cx, XP_STRLEN(lm_typePrefix_str) + XP_STRLEN(name) + 1);
set_str = JS_malloc(cx, XP_STRLEN(lm_setPrefix_str) + XP_STRLEN(name) + 1);
if (!type_str || !set_str)
return JS_TRUE;
XP_STRCPY(type_str, lm_typePrefix_str);
XP_STRCAT(type_str, name);
XP_STRCPY(set_str, lm_setPrefix_str);
XP_STRCAT(set_str, name);
if (!JS_GetProperty(cx, obj, type_str, &type) ||
!JSVAL_IS_INT(type) ||
!JS_GetProperty(cx, obj, set_str, &func))
return JS_TRUE;
JS_free(cx, type_str);
JS_free(cx, set_str);
switch(JSVAL_TO_INT(type)) {
case ARGTYPE_INT32:
if (JSVAL_IS_INT(*vp))
ET_moz_CompSetterFunction((ETCompPropSetterFunc)JSVAL_TO_INT(func), name, (void*)JSVAL_TO_INT(*vp));
break;
case ARGTYPE_BOOL:
if (JSVAL_IS_BOOLEAN(*vp))
ET_moz_CompSetterFunction((ETCompPropSetterFunc)JSVAL_TO_INT(func), name, (void*)JSVAL_TO_BOOLEAN(*vp));
break;
case ARGTYPE_STRING:
if (JSVAL_IS_STRING(*vp)) {
prop_val = JS_GetStringBytes(JSVAL_TO_STRING(*vp));
ET_moz_CompSetterFunction((ETCompPropSetterFunc)JSVAL_TO_INT(func), name, (void*)prop_val);
}
break;
}
return JS_TRUE;
}
void
lm_RegisterComponentProp(const char *comp, const char *targetName,
uint8 retType, ETCompPropSetterFunc setter,
ETCompPropGetterFunc getter)
{
JSContext *cx;
JSObject *arrayObj, *obj;
jsval val;
char *type, *set, *get;
MochaDecoder *cd = LM_GetCrippledDecoder();
if (!comp || !targetName || !(cx = cd->js_context))
return;
arrayObj = lm_DefineComponents(cd);
if (!arrayObj)
return;
if (!JS_GetProperty(cx, arrayObj, comp, &val) ||
!JSVAL_IS_OBJECT(val))
return;
obj = JSVAL_TO_OBJECT(val);
if (!JS_DefineProperty(cx, obj, targetName, JSVAL_VOID, component_mozilla_getProperty,
component_mozilla_setProperty, 0)) {
}
type = JS_malloc(cx, XP_STRLEN(lm_typePrefix_str) + XP_STRLEN(targetName) + 1);
if (type) {
XP_STRCPY(type, lm_typePrefix_str);
XP_STRCAT(type, targetName);
if (!JS_DefineProperty(cx, obj, type,
INT_TO_JSVAL((int32)retType), 0, 0, JSPROP_READONLY)) {
}
JS_free(cx, type);
}
get = JS_malloc(cx, XP_STRLEN(lm_getPrefix_str) + XP_STRLEN(targetName) + 1);
if (get) {
XP_STRCPY(get, lm_getPrefix_str);
XP_STRCAT(get, targetName);
if (!JS_DefineProperty(cx, obj, get,
INT_TO_JSVAL(getter), 0, 0, JSPROP_READONLY)) {
}
JS_free(cx, get);
}
set = JS_malloc(cx, XP_STRLEN(lm_setPrefix_str) + XP_STRLEN(targetName) + 1);
if (set) {
XP_STRCPY(set, lm_setPrefix_str);
XP_STRCAT(set, targetName);
if (!JS_DefineProperty(cx, obj, set,
INT_TO_JSVAL(setter), 0, 0, JSPROP_READONLY)) {
}
JS_free(cx, set);
}
}
PR_STATIC_CALLBACK(JSBool)
component_resolve_name(JSContext *cx, JSObject *obj, jsval id)
{
return JS_TRUE;
}
PR_STATIC_CALLBACK(void)
component_finalize(JSContext *cx, JSObject *obj)
{
JSComponent* component;
component = JS_GetPrivate(cx, obj);
if (!component)
return;
JS_UnlockGCThing(cx, component->name);
DROP_BACK_COUNT(component->decoder);
JS_free(cx, component);
}
JSClass lm_component_class =
{
"Component", JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub,
component_getProperty, component_getProperty, JS_EnumerateStub,
component_resolve_name, JS_ConvertStub, component_finalize
};
PR_STATIC_CALLBACK(JSBool)
component_activate(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
{
JSComponent *component;
component = JS_GetInstancePrivate(cx, obj, &lm_component_class, argv);
if (!component)
return JS_FALSE;
ET_moz_CallFunctionAsync((ETVoidPtrFunc)component->startup_callback, NULL);
return JS_TRUE;
}
static JSFunctionSpec component_methods[] =
{
{"activate", component_activate, 0},
{0}
};
PR_STATIC_CALLBACK(JSBool)
component_mozilla_method_stub(JSContext *cx, JSObject *obj, uint argc,
jsval *argv, jsval *rval)
{
JSFunction *func;
JSObject *func_obj;
jsval type, native;
uint i;
JSCompArg *comp_argv;
func = JS_ValueToFunction(cx, argv[-2]);
func_obj = JS_GetFunctionObject(func);
if (!JS_GetProperty(cx, func_obj, lm_typePrefix_str, &type) ||
!JSVAL_IS_INT(type) ||
!JS_GetProperty(cx, func_obj, lm_methodPrefix_str, &native) ||
!(comp_argv = JS_malloc(cx, argc * sizeof(JSCompArg))))
return JS_TRUE;
for (i=0; i<argc; i++) {
if (JSVAL_IS_INT(argv[i])) {
comp_argv[i].type = ARGTYPE_INT32;
comp_argv[i].value.intArg = JSVAL_TO_INT(argv[i]);
}
else if (JSVAL_IS_BOOLEAN(argv[i])) {
comp_argv[i].type = ARGTYPE_BOOL;
comp_argv[i].value.boolArg = JSVAL_TO_BOOLEAN(argv[i]);
}
else if (JSVAL_IS_STRING(argv[i])) {
comp_argv[i].type = ARGTYPE_STRING;
comp_argv[i].value.stringArg = JS_GetStringBytes(JSVAL_TO_STRING(argv[i]));
}
else {
comp_argv[i].type = ARGTYPE_NULL;
comp_argv[i].value.intArg = 0;
}
}
switch(JSVAL_TO_INT(type)) {
case ARGTYPE_NULL:
ET_moz_CompMethodFunction((ETCompMethodFunc)JSVAL_TO_INT(native), argc, NULL);
*rval = 0;
break;
case ARGTYPE_INT32:
*rval = INT_TO_JSVAL((int32)ET_moz_CompMethodFunction((ETCompMethodFunc)JSVAL_TO_INT(native), argc, comp_argv));
break;
case ARGTYPE_BOOL:
*rval = BOOLEAN_TO_JSVAL((JSBool)ET_moz_CompMethodFunction((ETCompMethodFunc)JSVAL_TO_INT(native), argc, comp_argv));
break;
case ARGTYPE_STRING:
*rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx,
(char*)ET_moz_CompMethodFunction((ETCompMethodFunc)JSVAL_TO_INT(native), argc, comp_argv)));
break;
}
return JS_TRUE;
}
void
lm_RegisterComponentMethod(const char *comp, const char *targetName,
uint8 retType, ETCompMethodFunc method, int32 argc)
{
JSContext *cx;
JSObject *arrayObj, *obj, *func_obj;
JSFunction *func;
jsval val;
MochaDecoder *cd = LM_GetCrippledDecoder();
if (!comp || !targetName || !(cx = cd->js_context))
return;
arrayObj = lm_DefineComponents(cd);
if (!arrayObj)
return;
if (!JS_GetProperty(cx, arrayObj, comp, &val) ||
!JSVAL_IS_OBJECT(val))
return;
obj = JSVAL_TO_OBJECT(val);
if (!(func = JS_DefineFunction(cx, obj, targetName, component_mozilla_method_stub, argc, 0))){
}
func_obj = JS_GetFunctionObject(func);
if (!JS_DefineProperty(cx, func_obj, lm_typePrefix_str,
INT_TO_JSVAL((int32)retType), 0, 0, JSPROP_READONLY))
return;
if (!JS_DefineProperty(cx, func_obj, lm_methodPrefix_str,
INT_TO_JSVAL(method), 0, 0, JSPROP_READONLY))
return;
if (!JS_DefineProperty(cx, func_obj, lm_methodArgc_str,
INT_TO_JSVAL(argc), 0, 0, JSPROP_READONLY))
return;
}
/* Constructor method for a JSComponent object */
static JSComponent*
component_create_self(JSContext *cx, MochaDecoder* decoder, JSComponent *component, const char *name)
{
JSObject *obj;
/* JSComponent may be malloc'd previous to this to make it easier
* to fill in the struct with data from the Mozilla thread
*/
if (!component) {
component = JS_malloc(cx, sizeof(JSComponent));
if (!component)
return NULL;
}
obj = JS_NewObject(cx, &lm_component_class, NULL, NULL);
if (!obj || !JS_SetPrivate(cx, obj, component)) {
JS_free(cx, component);
return NULL;
}
if (!JS_DefineProperties(cx, obj, component_props))
return NULL;
if (!JS_DefineFunctions(cx, obj, component_methods))
return NULL;
/* Fill out static property fields */
component->decoder = HOLD_BACK_COUNT(decoder);
component->obj = obj;
component->name = JS_NewStringCopyZ(cx, name);
if (!component->name || !JS_LockGCThing(cx, component->name))
return NULL;
return component;
}
/*
* -----------------------------------------------------------------------
*
* Reflection of the list of installed components.
* The only static property is the array length;
* the array elements (JSComponents) are added
* lazily when referenced.
*
* -----------------------------------------------------------------------
*/
enum componentarray_slot
{
COMPONENTLIST_ARRAY_LENGTH = -1
};
static JSPropertySpec componentarray_props[] =
{
{"length", COMPONENTLIST_ARRAY_LENGTH, JSPROP_READONLY},
{0}
};
/* Look up the component for the specified slot of the plug-in list */
static JSComponent*
componentarray_create_component(JSContext *cx, JSComponentArray *array,
JSComponent *component, const char *targetName, jsint targetSlot)
{
component = component_create_self(cx, array->decoder, component, targetName);
if (component) {
char *name;
jsval val;
name = JS_GetStringBytes(component->name);
val = OBJECT_TO_JSVAL(component->obj);
JS_DefineProperty(cx, array->obj, name, val, NULL, NULL,
JSPROP_ENUMERATE);
JS_AliasElement(cx, array->obj, name, targetSlot);
array->length++;
return component;
}
return NULL;
}
extern JSClass lm_component_array_class;
void
lm_RegisterComponent(const char *targetName, ETBoolPtrFunc active_callback,
ETVoidPtrFunc startup_callback)
{
JSContext *cx;
JSObject *arrayObj;
JSComponentArray *array;
JSComponent *component;
jsval val;
MochaDecoder *cd = LM_GetCrippledDecoder();
if (!(cx = cd->js_context) || !targetName)
return;
arrayObj = lm_DefineComponents(cd);
if (!arrayObj)
return;
array = JS_GetInstancePrivate(cx, arrayObj, &lm_component_array_class, NULL);
if (!array)
return;
if (JS_GetProperty(cx, arrayObj, targetName, &val) && JSVAL_IS_OBJECT(val)) {
/* We already have a component by this name. Update the active and
* startup callback funcs in case ours are out of date
*/
component = JS_GetPrivate(cx, JSVAL_TO_OBJECT(val));
if (!component)
return;
component->active_callback = active_callback;
component->startup_callback = startup_callback;
return;
}
component = JS_malloc(cx, sizeof(JSComponent));
if (!component)
return;
component->active_callback = active_callback;
component->startup_callback = startup_callback;
componentarray_create_component(cx, array, component, targetName, array->length);
}
PR_STATIC_CALLBACK(JSBool)
componentarray_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
JSComponentArray *array;
jsint slot;
if (!JSVAL_IS_INT(id))
return JS_TRUE;
slot = JSVAL_TO_INT(id);
array = JS_GetInstancePrivate(cx, obj, &lm_component_array_class, NULL);
if (!array)
return JS_TRUE;
switch (slot) {
case COMPONENTLIST_ARRAY_LENGTH:
*vp = INT_TO_JSVAL(array->length);
break;
default:
/* Don't mess with a user-defined property. */
if (slot >= 0 && slot < (jsint) array->length) {
/* Search for an existing JSComponent for this slot */
JSObject* componentObj = NULL;
jsval val = *vp;
if (JSVAL_IS_OBJECT(val)) {
componentObj = JSVAL_TO_OBJECT(val);
}
else {
JSComponent* component;
component = componentarray_create_component(cx, array, NULL,
NULL, slot);
if (component)
componentObj = component->obj;
}
*vp = OBJECT_TO_JSVAL(componentObj);
break;
}
}
return JS_TRUE;
}
PR_STATIC_CALLBACK(void)
componentarray_finalize(JSContext *cx, JSObject *obj)
{
JSComponentArray* array;
array = JS_GetPrivate(cx, obj);
if (!array)
return;
DROP_BACK_COUNT(array->decoder);
JS_free(cx, array);
}
JSClass lm_component_array_class =
{
"ComponentArray", JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub,
componentarray_getProperty, componentarray_getProperty, JS_EnumerateStub,
JS_ResolveStub, JS_ConvertStub, componentarray_finalize
};
JSObject*
lm_DefineComponents(MochaDecoder *decoder)
{
JSObject *obj;
JSComponentArray *array;
JSContext *cx = decoder->js_context;
JSPreDefComponent def_comps;
JSComponent *component;
jsint slot;
obj = decoder->components;
if (obj)
return obj;
array = JS_malloc(cx, sizeof(JSComponentArray));
if (!array)
return NULL;
XP_BZERO(array, sizeof *array);
obj = JS_NewObject(cx, &lm_component_array_class, NULL,
decoder->window_object);
if (!obj || !JS_SetPrivate(cx, obj, array)) {
JS_free(cx, array);
return NULL;
}
if (!JS_DefineProperties(cx, obj, componentarray_props))
return NULL;
array->decoder = HOLD_BACK_COUNT(decoder);
array->obj = obj;
/* Components can be added dynamically but some are predefined */
slot = 0;
array->length = 0;
def_comps = predef_components[slot];
while (def_comps.name) {
component = JS_malloc(cx, sizeof(JSComponent));
if (!component)
return NULL;
if (ET_moz_VerifyComponentFunction(def_comps.func, &(component->active_callback),
&(component->startup_callback))) {
componentarray_create_component(cx, array, component, def_comps.name, array->length);
}
else {
/*Component call failed somewhere.*/
JS_free(cx, component);
}
def_comps = predef_components[++slot];
}
return obj;
}

View File

@@ -0,0 +1,854 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
/*
* Image reflection and event notification
*
* Scott Furman, 3/30/96
*/
#include "lm.h"
#include "lo_ele.h"
#include "prtypes.h"
#include "pa_tags.h"
#include "layout.h"
#define IL_CLIENT
#include "libimg.h" /* Image Library public API. */
enum image_array_slot {
IMAGE_ARRAY_LENGTH = -1
};
static JSPropertySpec image_array_props[] = {
{lm_length_str, IMAGE_ARRAY_LENGTH,
JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT},
{0}
};
extern JSClass lm_image_array_class;
PR_STATIC_CALLBACK(JSBool)
image_array_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
JSObjectArray *array;
MochaDecoder *decoder;
MWContext *context;
jsint count, slot;
LO_ImageStruct *image;
int32 active_layer_id;
if (!JSVAL_IS_INT(id))
return JS_TRUE;
slot = JSVAL_TO_INT(id);
array = JS_GetInstancePrivate(cx, obj, &lm_image_array_class, NULL);
if (!array)
return JS_TRUE;
decoder = array->decoder;
context = decoder->window_context;
if (!context)
return JS_TRUE;
LO_LockLayout();
switch (slot) {
case IMAGE_ARRAY_LENGTH:
active_layer_id = LM_GetActiveLayer(context);
LM_SetActiveLayer(context, array->layer_id);
count = LO_EnumerateImages(context, array->layer_id);
LM_SetActiveLayer(context, active_layer_id);
if (count > array->length)
array->length = count;
*vp = INT_TO_JSVAL(count);
break;
default:
if (slot < 0) {
/* Don't mess with user-defined or method properties. */
LO_UnlockLayout();
return JS_TRUE;
}
if (slot >= array->length)
array->length = slot + 1;
image = LO_GetImageByIndex(context, array->layer_id, (uint)slot);
if (image) {
*vp = OBJECT_TO_JSVAL(LM_ReflectImage(context, image, NULL,
array->layer_id,
(uint)slot));
}
break;
}
LO_UnlockLayout();
return JS_TRUE;
}
PR_STATIC_CALLBACK(void)
image_array_finalize(JSContext *cx, JSObject *obj)
{
JSObjectArray *array;
array = JS_GetPrivate(cx, obj);
if (!array)
return;
DROP_BACK_COUNT(array->decoder);
JS_free(cx, array);
}
JSClass lm_image_array_class = {
"ImageArray", JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub,
image_array_getProperty, image_array_getProperty, JS_EnumerateStub,
JS_ResolveStub, JS_ConvertStub, image_array_finalize
};
enum image_slot {
IMAGE_NAME = -2,
IMAGE_SRC = -3,
IMAGE_LOWSRC = -4,
IMAGE_X = -5,
IMAGE_Y = -6,
IMAGE_HEIGHT = -7,
IMAGE_WIDTH = -8,
IMAGE_BORDER = -9,
IMAGE_VSPACE = -10,
IMAGE_HSPACE = -11,
IMAGE_COMPLETE = -12
};
static JSPropertySpec image_props[] = {
{"name", IMAGE_NAME, JSPROP_ENUMERATE | JSPROP_READONLY},
{"src", IMAGE_SRC, JSPROP_ENUMERATE},
{"lowsrc", IMAGE_LOWSRC, JSPROP_ENUMERATE},
{"x", IMAGE_X, JSPROP_ENUMERATE | JSPROP_READONLY},
{"y", IMAGE_Y, JSPROP_ENUMERATE | JSPROP_READONLY},
{"height", IMAGE_HEIGHT, JSPROP_ENUMERATE | JSPROP_READONLY},
{"width", IMAGE_WIDTH, JSPROP_ENUMERATE | JSPROP_READONLY},
{"border", IMAGE_BORDER, JSPROP_ENUMERATE | JSPROP_READONLY},
{"vspace", IMAGE_VSPACE, JSPROP_ENUMERATE | JSPROP_READONLY},
{"hspace", IMAGE_HSPACE, JSPROP_ENUMERATE | JSPROP_READONLY},
{"complete", IMAGE_COMPLETE, JSPROP_ENUMERATE | JSPROP_READONLY},
{0}
};
/*
* Base image element type.
*/
typedef struct JSImage {
JSEventReceiver receiver;
MochaDecoder *decoder;
LO_ImageStruct *image_data; /* 0 unless made by new Image() */
uint8 pending_events;
int32 layer_id;
uint index;
JSBool complete; /* Finished loading or aborted */
JSString *name;
} JSImage;
#define GET_IMAGE_DATA(context, image) \
((image)->image_data ? (image)->image_data \
: LO_GetImageByIndex((context), (image)->layer_id, (image)->index))
extern JSClass lm_image_class;
/*
* Force the mozilla event queue to flush to make sure any image-set-src
* events have been processed
*/
PR_STATIC_CALLBACK(void)
lm_img_src_sync(void * data)
{
}
PR_STATIC_CALLBACK(JSBool)
image_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
JSImage *image;
LO_ImageStruct *image_data;
enum image_slot image_slot;
JSString *str;
jsint slot;
if (!JSVAL_IS_INT(id))
return JS_TRUE;
slot = JSVAL_TO_INT(id);
image = JS_GetInstancePrivate(cx, obj, &lm_image_class, NULL);
if (!image)
return JS_TRUE;
image_data = GET_IMAGE_DATA(image->decoder->window_context, image);
if (!image_data)
return JS_TRUE; /* Try to handle this case gracefully. */
image_slot = slot;
if (image_slot == IMAGE_SRC || image_slot == IMAGE_LOWSRC) {
if (!lm_CheckPermissions(cx, obj, JSTARGET_UNIVERSAL_BROWSER_READ))
return JS_FALSE;
}
switch (image_slot) {
case IMAGE_NAME:
if (image->name)
*vp = STRING_TO_JSVAL(image->name);
else
*vp = JSVAL_NULL;
break;
case IMAGE_SRC:
if (image_data->pending_mocha_event) {
ET_moz_CallFunction(lm_img_src_sync, NULL);
image_data->pending_mocha_event = PR_FALSE;
}
str = JS_NewStringCopyZ(cx, (char*)image_data->image_url);
if (!str)
return JS_FALSE;
*vp = STRING_TO_JSVAL(str);
break;
case IMAGE_LOWSRC:
if (image_data->pending_mocha_event) {
ET_moz_CallFunction(lm_img_src_sync, NULL);
image_data->pending_mocha_event = PR_FALSE;
}
str = JS_NewStringCopyZ(cx, (char*)image_data->lowres_image_url);
if (!str)
return JS_FALSE;
*vp = STRING_TO_JSVAL(str);
break;
case IMAGE_X:
*vp = INT_TO_JSVAL(image_data->x + image_data->x_offset);
break;
case IMAGE_Y:
*vp = INT_TO_JSVAL(image_data->y + image_data->y_offset);
break;
case IMAGE_HEIGHT:
*vp = INT_TO_JSVAL(image_data->height);
break;
case IMAGE_WIDTH:
*vp = INT_TO_JSVAL(image_data->width);
break;
case IMAGE_BORDER:
*vp = INT_TO_JSVAL(image_data->border_width);
break;
case IMAGE_HSPACE:
*vp = INT_TO_JSVAL(image_data->border_horiz_space);
break;
case IMAGE_VSPACE:
*vp = INT_TO_JSVAL(image_data->border_vert_space);
break;
case IMAGE_COMPLETE:
*vp = BOOLEAN_TO_JSVAL(image->complete);
break;
default:
/* Don't mess with a user-defined or method property. */
return JS_TRUE;
}
return JS_TRUE;
}
static JSBool
image_set_src(JSImage *image, const char *str, LO_ImageStruct *image_data)
{
MochaDecoder *decoder;
MWContext *context;
IL_GroupContext *img_cx;
decoder = image->decoder;
context = decoder->window_context;
img_cx = decoder->image_context;
if (!context) return JS_TRUE;
image_data->pending_mocha_event = PR_TRUE;
image_data->image_attr->attrmask |= LO_ATTR_MOCHA_IMAGE;
ET_il_GetImage(str, context, img_cx, image_data, NET_DONT_RELOAD);
return JS_TRUE;
}
PR_STATIC_CALLBACK(JSBool)
image_setProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
JSBool ok;
JSImage *image;
MochaDecoder *decoder;
MWContext *context;
LO_ImageStruct *image_data;
enum image_slot image_slot;
const char *url;
jsint slot;
image = JS_GetInstancePrivate(cx, obj, &lm_image_class, NULL);
if (!image)
return JS_TRUE;
decoder = image->decoder;
context = decoder->window_context;
if (!context)
return JS_TRUE;
if (!JSVAL_IS_INT(id))
return JS_TRUE;
slot = JSVAL_TO_INT(id);
image_data = GET_IMAGE_DATA(context, image);
if (!image_data)
return JS_TRUE; /* Try to handle this case gracefully. */
image_slot = slot;
switch (image_slot) {
case IMAGE_SRC:
case IMAGE_LOWSRC:
if (!lm_CheckPermissions(cx, obj, JSTARGET_UNIVERSAL_BROWSER_WRITE))
return JS_FALSE;
if (JSVAL_IS_NULL(*vp)) {
url = NULL;
} else {
if (!JSVAL_IS_STRING(*vp) &&
!JS_ConvertValue(cx, *vp, JSTYPE_STRING, vp))
return JS_FALSE;
url = JS_GetStringBytes(JSVAL_TO_STRING(*vp));
url = lm_CheckURL(cx, url, JS_TRUE); /* will allocate new string */
if (!url)
return JS_FALSE;
}
if (image_slot == IMAGE_SRC) {
ok = image_set_src(image, url, image_data);
} else if (url) {
ok = lm_SaveParamString(cx, &image_data->lowres_image_url, url);
}
if (url)
XP_FREE((void *) url);
if (!ok)
return JS_FALSE;
/*
* don't call image_getProperty so that we don't immediately
* turn around and block
*/
return JS_TRUE;
break;
case IMAGE_NAME:
case IMAGE_X:
case IMAGE_Y:
case IMAGE_HEIGHT:
case IMAGE_WIDTH:
case IMAGE_BORDER:
case IMAGE_VSPACE:
case IMAGE_HSPACE:
case IMAGE_COMPLETE:
/* These are immutable. */
break;
}
return image_getProperty(cx, obj, id, vp);
}
PR_STATIC_CALLBACK(void)
image_finalize(JSContext *cx, JSObject *obj)
{
JSImage *image;
LO_ImageStruct *image_data;
MochaDecoder *decoder;
MWContext *context;
image = JS_GetPrivate(cx, obj);
if (!image)
return;
image_data = image->image_data;
decoder = image->decoder;
context = decoder->window_context;
if (image_data) {
/* If this is a layer background image or a reflection of an
existing layout image, then layout will take care of
destroying the image. For anonymous images, however,
we need to handle destruction here. */
if (!image_data->layer) {
ET_PostFreeImageElement(context, image_data);
XP_FREE(image_data->image_attr);
XP_FREE(image_data);
}
} else {
if (context) {
LO_LockLayout();
image_data = LO_GetImageByIndex(context, image->layer_id,
image->index);
if (image_data && image_data->mocha_object == obj)
image_data->mocha_object = NULL;
LO_UnlockLayout();
}
}
DROP_BACK_COUNT(decoder);
JS_UnlockGCThing(cx, image->name);
JS_free(cx, image);
}
JSClass lm_image_class = {
"Image", JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub, image_getProperty, image_setProperty,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, image_finalize
};
/* Fill in native, private part of JS image */
static JSImage *
init_image_object(JSContext *cx, JSObject *obj, LO_ImageStruct *image_data)
{
JSImage *image;
MochaDecoder *decoder;
image = JS_malloc(cx, sizeof *image);
if (!image)
return NULL;
XP_BZERO(image, sizeof *image);
image->image_data = image_data;
decoder = JS_GetPrivate(cx, JS_GetGlobalObject(cx));
image->decoder = HOLD_BACK_COUNT(decoder);
image_data->mocha_object = obj;
/* Events are never blocked for anonymous images
since there is no associated layout. */
image->pending_events = PR_BIT(LM_IMGUNBLOCK);
if (!JS_SetPrivate(cx, obj, image))
return NULL;
return image;
}
JSObject *
lm_NewImage(JSContext *cx,
LO_ImageStruct *image_data)
{
JSObject *obj, *outer_obj;
MochaDecoder *decoder;
decoder = JS_GetPrivate(cx, JS_GetGlobalObject(cx));
outer_obj = lm_GetOuterObject(decoder);
obj = JS_NewObject(cx, &lm_image_class, decoder->image_prototype,
outer_obj);
if (!init_image_object(cx, obj, image_data))
return NULL;
return obj;
}
PR_STATIC_CALLBACK(JSBool)
Image(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
{
jsint width, height;
LO_ImageStruct *image_data;
XP_ASSERT(JS_InstanceOf(cx, obj, &lm_image_class, NULL));
height = width = 0;
if (argc > 0) {
if (argc != 2) {
JS_ReportError(cx, lm_argc_err_str);
return JS_FALSE;
}
if (!JSVAL_IS_INT(argv[0]) ||
!JSVAL_IS_INT(argv[1])) {
return JS_FALSE;
}
width = JSVAL_TO_INT(argv[0]);
height = JSVAL_TO_INT(argv[1]);
}
/* Allocate dummy layout structure. This is not really
used by layout, but the front-ends and the imagelib
need it as a handle on an image instance. */
image_data = XP_NEW_ZAP(LO_ImageStruct);
if (!image_data) {
JS_ReportOutOfMemory(cx);
return JS_FALSE;
}
image_data->image_attr = XP_NEW_ZAP(LO_ImageAttr);
if (!image_data->image_attr) {
XP_FREE(image_data);
JS_ReportOutOfMemory(cx);
return JS_FALSE;
}
image_data->type = LO_IMAGE;
/* Fake layout ID, guaranteed not to match any real layout element */
image_data->ele_id = -1;
if (!init_image_object(cx, obj, image_data)) {
XP_FREE(image_data->image_attr);
XP_FREE(image_data);
return JS_FALSE;
}
/* Process arguments */
/* Width & Height */
if (argc == 2) {
image_data->width = (int)width;
image_data->height = (int)height;
}
return JS_TRUE;
}
static JSObject *
reflect_image_array(MochaDecoder *decoder, JSObject *document)
{
JSContext *cx;
JSObjectArray *array;
JSObject *obj;
JSDocument *doc;
cx = decoder->js_context;
doc = JS_GetPrivate(cx, document);
if (!doc)
return NULL;
array = JS_malloc(cx, sizeof *array);
if (!array)
return NULL;
XP_BZERO(array, sizeof *array);
obj = JS_NewObject(cx, &lm_image_array_class, NULL, document);
if (!obj || !JS_SetPrivate(cx, obj, array)) {
LM_PutMochaDecoder(decoder);
return NULL;
}
if (!JS_DefineProperties(cx, obj, image_array_props))
return NULL;
array->decoder = HOLD_BACK_COUNT(decoder);
array->layer_id = doc->layer_id;
return obj;
}
JSObject *
lm_GetImageArray(MochaDecoder *decoder, JSObject *document)
{
JSObject *obj;
JSDocument *doc;
doc = JS_GetPrivate(decoder->js_context, document);
if (!doc)
return NULL;
obj = doc->images;
if (obj)
return obj;
obj = reflect_image_array(decoder, document);
doc->images = obj;
return obj;
}
JSObject *
LM_ReflectImage(MWContext *context, LO_ImageStruct *image_data,
PA_Tag * tag, int32 layer_id, uint index)
{
JSObject *obj, *array_obj, *outer_obj, *document;
MochaDecoder *decoder;
JSContext *cx;
JSImage *image;
PA_Block name = NULL;
lo_TopState *top_state;
PRHashTable *map;
image_data = LO_GetImageByIndex(context, layer_id, index);
XP_ASSERT(image_data);
if (! image_data)
return NULL;
obj = image_data->mocha_object;
if (obj)
return obj;
decoder = LM_GetMochaDecoder(context);
if (!decoder)
return NULL;
cx = decoder->js_context;
top_state = lo_GetMochaTopState(context);
if (top_state->resize_reload) {
map = lm_GetIdToObjectMap(decoder);
if (map)
obj = (JSObject *)PR_HashTableLookup(map,
LM_GET_MAPPING_KEY(LM_IMAGES, layer_id, index));
if (obj) {
image_data->mocha_object = obj;
goto done;
}
}
/* Get the document object that will hold this link */
document = lm_GetDocumentFromLayerId(decoder, layer_id);
if (!document)
goto done;
array_obj = lm_GetImageArray(decoder, document);
if (!array_obj)
goto done;
image = JS_malloc(cx, sizeof *image);
if (!image)
goto done;
XP_BZERO(image, sizeof *image);
/* if we got a tag passed in try to get the name out of there */
name = lo_FetchParamValue(context, tag, PARAM_NAME);
outer_obj = lm_GetOuterObject(decoder);
obj = JS_NewObject(cx, &lm_image_class, decoder->image_prototype,
outer_obj);
if (!obj || !JS_SetPrivate(cx, obj, image)) {
JS_free(cx, image);
goto done;
}
if (name) {
JSObject *doc_obj;
extern JSClass lm_form_class;
if (!JS_DefineProperty(cx, outer_obj, (const char *) name,
OBJECT_TO_JSVAL(obj), NULL, NULL,
JSPROP_ENUMERATE|JSPROP_READONLY)) {
obj = NULL;
goto done;
}
/* XXX backward compatibility with 3.0 bug: lo_BlockedImageLayout
would eagerly reflect images outside of any active form, so
they'd end up in document scope. */
if (JS_GetClass(cx, outer_obj) == &lm_form_class &&
(doc_obj = JS_GetParent(cx, outer_obj)) != NULL &&
!JS_DefineProperty(cx, doc_obj, (const char *) name,
OBJECT_TO_JSVAL(obj), NULL, NULL,
JSPROP_ENUMERATE|JSPROP_READONLY)) {
obj = NULL;
goto done;
}
}
image->decoder = HOLD_BACK_COUNT(decoder);
image->index = index;
image->layer_id = layer_id;
image->name = JS_NewStringCopyZ(cx, (const char *) name);
if (!JS_LockGCThing(cx, image->name)) {
obj = NULL;
goto done;
}
image_data->mocha_object = obj;
if (!lm_AddObjectToArray(cx, array_obj, (const char *) name,
index, obj)) {
obj = NULL;
goto done;
}
/* Put it in the index to object hash table */
map = lm_GetIdToObjectMap(decoder);
if (map)
PR_HashTableAdd(map,
LM_GET_MAPPING_KEY(LM_IMAGES, layer_id, index),
obj);
/* OK, we've got our image, see if there are any event handlers
* defined with it
*/
if(tag) {
PA_Block onload = lo_FetchParamValue(context, tag, PARAM_ONLOAD);
PA_Block onabort = lo_FetchParamValue(context, tag, PARAM_ONABORT);
PA_Block onerror = lo_FetchParamValue(context, tag, PARAM_ONERROR);
PA_Block onmousedown = lo_FetchParamValue(context, tag, PARAM_ONMOUSEDOWN);
PA_Block onmouseup = lo_FetchParamValue(context, tag, PARAM_ONMOUSEUP);
PA_Block id = lo_FetchParamValue(context, tag, PARAM_ID);
/* don't hold the layout lock across compiles */
LO_UnlockLayout();
if (onload != NULL) {
(void) lm_CompileEventHandler(decoder, id, tag->data,
tag->newline_count, obj,
PARAM_ONLOAD, onload);
PA_FREE(onload);
}
if (onabort != NULL) {
(void) lm_CompileEventHandler(decoder, id, tag->data,
tag->newline_count, obj,
PARAM_ONABORT, onabort);
PA_FREE(onabort);
}
if (onerror != NULL) {
(void) lm_CompileEventHandler(decoder, id, tag->data,
tag->newline_count, obj,
PARAM_ONERROR, onerror);
PA_FREE(onerror);
}
if (onmousedown != NULL) {
(void) lm_CompileEventHandler(decoder, id, tag->data,
tag->newline_count, obj,
PARAM_ONMOUSEDOWN, onmousedown);
PA_FREE(onmousedown);
}
if (onmouseup != NULL) {
(void) lm_CompileEventHandler(decoder, id, tag->data,
tag->newline_count, obj,
PARAM_ONMOUSEUP, onmouseup);
PA_FREE(onmouseup);
}
if (id)
PA_FREE(id);
LO_LockLayout();
}
done:
if(name)
PA_FREE(name);
LM_PutMochaDecoder(decoder);
return obj;
}
void
lm_ProcessImageEvent(MWContext *context, JSObject *obj,
LM_ImageEvent event)
{
uint event_mask;
jsval result;
JSImage *image;
image = JS_GetPrivate(context->mocha_context, obj);
if (!image)
return;
image->pending_events |= PR_BIT(event);
/* Special event used to trigger deferred events */
if (! (image->pending_events & PR_BIT(LM_IMGUNBLOCK)))
return;
for (event = LM_IMGLOAD; event <= LM_LASTEVENT; event++) {
event_mask = PR_BIT(event);
if (image->pending_events & event_mask) {
JSEvent *pEvent;
pEvent=XP_NEW_ZAP(JSEvent);
image->pending_events &= ~event_mask;
switch (event) {
case LM_IMGLOAD:
pEvent->type = EVENT_LOAD;
image->complete = JS_TRUE;
break;
case LM_IMGABORT:
pEvent->type = EVENT_ABORT;
image->complete = JS_TRUE;
break;
case LM_IMGERROR:
pEvent->type = EVENT_ERROR;
image->complete = JS_TRUE;
break;
default:
XP_ABORT(("Unknown image event"));
}
lm_SendEvent(context, obj, pEvent, &result);
}
}
}
JSBool
lm_InitImageClass(MochaDecoder *decoder)
{
JSContext *cx;
JSObject *prototype;
cx = decoder->js_context;
prototype = JS_InitClass(cx, decoder->window_object,
decoder->event_receiver_prototype, &lm_image_class,
Image, 0, image_props, NULL, NULL, NULL);
if (!prototype)
return JS_FALSE;
decoder->image_prototype = prototype;
return JS_TRUE;
}
/* Create an image context for anonymous images and attach it to the specified
mocha decoder. */
JSBool
lm_NewImageContext(MWContext *context, MochaDecoder *decoder)
{
IL_GroupContext *img_cx;
IMGCB* img_cb;
JMCException *exc = NULL;
if (!decoder->image_context) {
img_cb = IMGCBFactory_Create(&exc); /* JMC Module */
if (exc) {
JMC_DELETE_EXCEPTION(&exc); /* XXX Should really return
exception */
JS_ReportOutOfMemory(decoder->js_context);
return JS_FALSE;
}
/* Create an Image Group Context. IL_NewGroupContext augments the
reference count for the JMC callback interface. The opaque argument
to IL_NewGroupContext is the Front End's display context, which will
be passed back to all the Image Library's FE callbacks. */
img_cx = IL_NewGroupContext((void*)context, (IMGCBIF *)img_cb);
if (!img_cx) {
JS_ReportOutOfMemory(decoder->js_context);
return JS_FALSE;
}
/* Attach the IL_GroupContext to the mocha decoder. */
decoder->image_context = img_cx;
/* Allow the context to observe the decoder's image context. */
ET_il_SetGroupObserver(context, decoder->image_context, context, JS_TRUE);
}
return JS_TRUE;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,287 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
/*
* lm_trggr.c
*
* Reflects AutoInstall trigger methods
* into the global JavaScript config object.
*
* See Trigger.java for related functions.
*/
#include "lm.h"
#include "prefapi.h"
#include "VerReg.h"
#include "softupdt.h"
#include "gui.h" /* XP_AppPlatform */
JSBool PR_CALLBACK asd_Version(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
JSBool PR_CALLBACK asd_get_version(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
JSBool PR_CALLBACK asd_start_update(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
JSBool PR_CALLBACK asd_conditional_update(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
JSBool PR_CALLBACK asd_alert(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
JSBool PR_CALLBACK asd_platform(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
PRIVATE JSFunctionSpec autoinstall_methods[] = {
{ "getVersion", asd_get_version, 2 },
{ "startUpdate", asd_start_update, 2 },
{ "conditionalUpdate", asd_conditional_update, 4 },
{ "startUpdateComponent", asd_conditional_update, 4 }, /* old name */
{ NULL, NULL, 0 }
};
PRIVATE JSFunctionSpec globalconfig_methods[] = {
{ "alert", asd_alert, 1 },
{ "getPlatform", asd_platform, 0 },
{ NULL, NULL, 0 }
};
PRIVATE JSClass autoinstall_class = {
"AutoInstall", 0,
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub
};
PRIVATE JSClass version_class = {
"VersionInfo", 0,
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub
};
JSBool lm_DefineTriggers()
{
JSContext *globalContext = NULL;
JSObject *globalObject = NULL;
JSObject *autoInstallObject, *versionObject;
JSBool ans;
/* get global mocha context and object */
PREF_GetConfigContext(&globalContext);
PREF_GetGlobalConfigObject(&globalObject);
if (globalContext == NULL || globalObject == NULL) {
return JS_FALSE;
}
JS_BeginRequest(globalContext);
/* define AutoInstall object in global object */
autoInstallObject = JS_DefineObject(globalContext, globalObject,
"AutoInstall",
&autoinstall_class,
NULL,
JSPROP_ENUMERATE|JSPROP_READONLY);
if (!autoInstallObject) {
JS_EndRequest(globalContext);
return JS_FALSE;
}
/* define Version class in AutoInstall */
versionObject = JS_InitClass(globalContext, autoInstallObject, NULL,
&version_class, asd_Version, 0, NULL, NULL, NULL, NULL);
if (!versionObject) {
JS_EndRequest(globalContext);
return JS_FALSE;
}
/* define some global config utility functions */
JS_DefineFunctions(globalContext, globalObject, globalconfig_methods);
ans = JS_DefineFunctions(globalContext, autoInstallObject,
autoinstall_methods);
JS_EndRequest(globalContext);
return ans;
}
/* Convert VERSION type to Version JS object */
static void asd_versToObj(JSContext *cx, VERSION* vers, JSObject* versObj)
{
jsval val = INT_TO_JSVAL(vers->major);
JS_SetProperty(cx, versObj, "major", &val);
val = INT_TO_JSVAL(vers->minor);
JS_SetProperty(cx, versObj, "minor", &val);
val = INT_TO_JSVAL(vers->release);
JS_SetProperty(cx, versObj, "release", &val);
val = INT_TO_JSVAL(vers->build);
JS_SetProperty(cx, versObj, "build", &val);
}
/* Convert Version JS object to VERSION type */
static void asd_objToVers(JSContext *cx, JSObject* versObj, VERSION* vers)
{
jsval val;
JS_GetProperty(cx, versObj, "major", &val);
vers->major = JSVAL_TO_INT(val);
JS_GetProperty(cx, versObj, "minor", &val);
vers->minor = JSVAL_TO_INT(val);
JS_GetProperty(cx, versObj, "release", &val);
vers->release = JSVAL_TO_INT(val);
JS_GetProperty(cx, versObj, "build", &val);
vers->build = JSVAL_TO_INT(val);
}
/*
* ?? -- move this to VR?
* Returns 0 if versions are equal; < 0 if vers2 is newer; > 0 if vers1 is newer
*/
static int asd_compareVersion(VERSION* vers1, VERSION* vers2)
{
int diff;
if (vers1 == NULL)
diff = -4;
else if (vers2 == NULL)
diff = 4;
else if (vers1->major == vers2->major) {
if (vers1->minor == vers2->minor) {
if (vers1->release == vers2->release) {
if (vers1->build == vers2->build)
diff = 0;
else diff = (vers1->build > vers2->build) ? 1 : -1;
}
else diff = (vers1->release > vers2->release) ? 2 : -2;
}
else diff = (vers1->minor > vers2->minor) ? 3 : -3;
}
else diff = (vers1->major > vers2->major) ? 4 : -4;
return diff;
}
/* Version constructor
(accepts up to four int params to initialize fields) */
JSBool PR_CALLBACK asd_Version
(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
{
VERSION vers;
vers.major = (argc >= 1 && JSVAL_IS_INT(argv[0])) ? JSVAL_TO_INT(argv[0]) : 0;
vers.minor = (argc >= 2 && JSVAL_IS_INT(argv[1])) ? JSVAL_TO_INT(argv[1]) : 0;
vers.release = (argc >= 3 && JSVAL_IS_INT(argv[2])) ? JSVAL_TO_INT(argv[2]) : 0;
vers.build = (argc >= 4 && JSVAL_IS_INT(argv[3])) ? JSVAL_TO_INT(argv[3]) : 0;
asd_versToObj(cx, &vers, obj);
return JS_TRUE;
}
/* arguments:
0. component name
1. version no. to fill in
return:
error status */
JSBool PR_CALLBACK asd_get_version
(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
{
REGERR status = 0;
if (argc >= 2 && JSVAL_IS_STRING(argv[0])
&& JSVAL_IS_OBJECT(argv[1]))
{
VERSION vers;
char* component_path = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
status = VR_GetVersion(component_path, &vers);
if (status == REGERR_OK) {
JSObject* versObj = JSVAL_TO_OBJECT(argv[1]);
asd_versToObj(cx, &vers, versObj);
}
}
*rval = INT_TO_JSVAL(status);
return JS_TRUE;
}
/* arguments:
0. url
1. flags
return:
true if no errors */
JSBool PR_CALLBACK asd_start_update
(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
{
if (argc >= 2 && JSVAL_IS_STRING(argv[0]) &&
JSVAL_IS_INT(argv[1])) {
char* url = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
/* Bookmarks is a hack, you should really get some SmartUpdate context */
MWContext* cx = XP_FindContextOfType(NULL, MWContextBookmarks);
XP_Bool result = SU_StartSoftwareUpdate( cx, url,
NULL, NULL, NULL, JSVAL_TO_INT(argv[1]) );
*rval = BOOLEAN_TO_JSVAL(result);
return JS_TRUE;
}
*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
return JS_TRUE;
}
/* arguments:
0. url
1. component name
2. version no. to compare
3. flags
return:
true if update triggered and no errors */
JSBool PR_CALLBACK asd_conditional_update
(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
{
REGERR status = 0;
if (argc >= 4 && JSVAL_IS_STRING(argv[0]) &&
JSVAL_IS_STRING(argv[1]) &&
JSVAL_IS_OBJECT(argv[2]) &&
JSVAL_IS_INT(argv[3]))
{
VERSION curr_vers;
char* component_path = JS_GetStringBytes(JSVAL_TO_STRING(argv[1]));
status = VR_GetVersion(component_path, &curr_vers);
if (status == REGERR_OK) {
JSObject* versObj = JSVAL_TO_OBJECT(argv[2]);
VERSION req_vers;
asd_objToVers(cx, versObj, &req_vers);
if ( asd_compareVersion(&req_vers, &curr_vers) > 0 ) {
char* url = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
MWContext* cx = XP_FindContextOfType(NULL, MWContextBookmarks);
XP_Bool result = SU_StartSoftwareUpdate( cx, url,
NULL, NULL, NULL, JSVAL_TO_INT(argv[3]) );
*rval = BOOLEAN_TO_JSVAL(result);
return JS_TRUE;
}
}
}
*rval = BOOLEAN_TO_JSVAL(JS_FALSE); /*INT_TO_JSVAL(status);*/
return JS_TRUE;
}
JSBool PR_CALLBACK asd_alert
(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
{
if (argc >= 1 && JSVAL_IS_STRING(argv[0])) {
char* msg = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
MWContext* ctx = XP_FindSomeContext();
if (ctx)
FE_Alert(ctx, msg);
}
return JS_TRUE;
}
JSBool PR_CALLBACK asd_platform
(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
{
*rval = STRING_TO_JSVAL( JS_NewStringCopyZ(cx, XP_AppPlatform) );
return JS_TRUE;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,425 @@
/*
* lm_wngrp.c: Structures and functions to deal with new LM window groups
* and multiple LM threads and what not.
*
* All blame to Mike McCool (mlm@netscape.com) 2/17/98
*/
#include "lm.h"
#include "xp.h"
#include "prclist.h"
#include "prthread.h"
#include "prmon.h"
#ifdef XP_MAC
#include "pprthred.h" /* for PR_CreateThreadGCAble */
#else
#include "private/pprthred.h"
#endif
/*
* Notes to self
*
* - lm_window_count: do we care that there's only one?
* - do we need to add a limit to number of threads we spawn()?
* - JRIEnv: do we need multiple?
* - JSRuntime: do we need multiple?
* - Threading changes: impact on debugger?
* - JS_SetGlobalObject(JSContext) will be important
* - If the global structure is on the mozilla thread, can other threads
* creating a new thread group access, or do I have to post an event?
*
* ? Rename "MochaDecoder" to "LMWindow"
* ? Change so that there is only one JSContext
*/
PRMonitor *wingroups_mon;
LMWindowGroup *wingroups;
PRMonitor *request_mon;
struct ContextListStr {
ContextList *next;
ContextList *prev;
MWContext *context;
};
LMWindowGroup *_lm_NewWindowGroup(int priority);
/* Initialize my globals, from the Mozilla thread
*/
void lm_InitWindowGroups(void)
{
int priority;
/* run at slightly lower priority than the mozilla thread */
priority = PR_GetThreadPriority(PR_CurrentThread());
PR_ASSERT(priority >= PR_PRIORITY_FIRST && priority <= PR_PRIORITY_LAST);
if (priority == PR_PRIORITY_NORMAL)
priority = PR_PRIORITY_LOW;
else if (priority == PR_PRIORITY_HIGH)
priority = PR_PRIORITY_NORMAL;
else if (priority == PR_PRIORITY_URGENT)
priority = PR_PRIORITY_HIGH;
else
priority = PR_PRIORITY_LOW;
wingroups_mon = PR_NewMonitor();
request_mon = PR_NewMonitor();
wingroups = NULL;
wingroups = _lm_NewWindowGroup(priority);
if(wingroups != NULL) {
PR_INIT_CLIST(wingroups);
lm_StartWindowGroup(wingroups);
} /* else huh?! */
}
/* Create a new window group. Create new context, create new monitor, create
* new thread, event queue, queue stack, empty context list.
*/
LMWindowGroup *lm_NewWindowGroup(void)
{
int priority;
/* Run at same priority as current thread (which should be a JS
* thread.
*/
priority = PR_GetThreadPriority(PR_CurrentThread());
PR_ASSERT(priority>=PR_PRIORITY_FIRST && priority<=PR_PRIORITY_LAST);
return _lm_NewWindowGroup(priority);
}
LMWindowGroup *_lm_NewWindowGroup(int priority)
{
LMWindowGroup *newgrp = XP_NEW_ZAP(LMWindowGroup);
if(newgrp != NULL) {
newgrp->done = PR_FALSE;
newgrp->hasLock = PR_FALSE;
/* Create a new JS Context for this set of windows.
* Note: Need to get global runtime lm_runtime from somewhere,
* and perhaps the LM_STACK_SIZE?
*/
/**************************************************** MLM *
newgrp->js_context = JS_NewContext(lm_runtime, LM_STACK_SIZE);
if(newgrp->js_context == NULL) {
XP_DELETE(newgrp);
return NULL;
}
**************************************************** MLM */
newgrp->js_context = NULL;
/* JS_SetGCCallback(newgrp->js_context, LM_ShouldRunGC); */
newgrp->mw_contexts = XP_NEW_ZAP(ContextList);
if(newgrp->mw_contexts == NULL) {
JS_DestroyContext(newgrp->js_context);
XP_DELETE(newgrp);
return NULL;
}
PR_INIT_CLIST(newgrp->mw_contexts);
newgrp->mw_contexts->context = NULL;
newgrp->current_context = NULL;
newgrp->queue_stack = XP_NEW_ZAP(QueueStackElement);
if(!newgrp->queue_stack) {
JS_DestroyContext(newgrp->js_context);
XP_DELETE(newgrp->mw_contexts);
XP_DELETE(newgrp);
return NULL;
}
/* Do this here so we don't race ourselves in lm_wait_for_events */
PR_EnterMonitor(wingroups_mon);
if(wingroups != NULL) {
PR_APPEND_LINK(newgrp, wingroups);
}
PR_ExitMonitor(wingroups_mon);
newgrp->waiting_list = NULL;
newgrp->owner_monitor = PR_NewMonitor();
newgrp->queue_monitor = PR_NewMonitor();
PR_EnterMonitor(newgrp->owner_monitor);
newgrp->thread = PR_CreateThreadGCAble(PR_USER_THREAD,
lm_wait_for_events, newgrp,
priority, PR_LOCAL_THREAD,
PR_UNJOINABLE_THREAD, 0);
newgrp->owner = newgrp->thread;
newgrp->current_count = 0;
newgrp->mozWantsLock = PR_FALSE;
newgrp->mozGotLock = PR_FALSE;
newgrp->interruptCurrentOp = PR_FALSE;
newgrp->queue_depth = 0;
newgrp->queue_count = 0;
/* Note: Need a unique identifier for this queue?
*/
newgrp->interpret_queue = PR_CreateEventQueue("new_event_queue",
newgrp->thread);
newgrp->queue_stack->queue = newgrp->interpret_queue;
newgrp->lock_context = NULL;
newgrp->js_timeout_insertion_point = NULL;
newgrp->js_timeout_running = NULL;
newgrp->inputRecurring = 0;
}
return newgrp;
}
void lm_StartWindowGroup(LMWindowGroup *grp)
{
PR_Notify(grp->owner_monitor);
PR_ExitMonitor(grp->owner_monitor);
}
void lm_DestroyWindowGroup(LMWindowGroup *grp)
{
PR_EnterMonitor(wingroups_mon);
/* Note: Thread terminates when the thread's main function (in
* this case, lm_wait_for_events) exits.
*/
/************************************ MLM *
* JS_DestroyContext(grp->js_context);
************************************ MLM */
PR_DestroyMonitor(grp->owner_monitor);
PR_DestroyMonitor(grp->queue_monitor);
/* Note: How to destroy an event queue or two?
*/
/* Note: Context list should already be null
*/
PR_REMOVE_LINK(grp);
XP_DELETE(grp);
PR_ExitMonitor(wingroups_mon);
}
LMWindowGroup *LM_GetDefaultWindowGroup(MWContext *mwc)
{
LMWindowGroup *ans;
/* Check to see if this is a frame context. If so, check its parent. */
if((mwc != NULL) && (mwc->is_grid_cell)) {
MWContext *grid_parent, *grid_child;
grid_child = mwc;
grid_parent = mwc->grid_parent;
/* Find the root parent. I wonder if I need to add cycle checking. */
while(grid_parent != NULL) {
grid_child = grid_parent;
grid_parent = grid_child->grid_parent;
}
if( (ans = lm_MWContextToGroup(grid_child)) != NULL) {
/* The parent's been found, return its group. */
return ans;
} else { /* Else add the parent to the default group,
* and return that. */
PR_EnterMonitor(wingroups_mon);
LM_AddContextToGroup(wingroups, grid_child);
ans = wingroups;
PR_ExitMonitor(wingroups_mon);
return ans;
}
}
PR_EnterMonitor(wingroups_mon);
ans = wingroups;
PR_ExitMonitor(wingroups_mon);
return ans;
}
LMWindowGroup *lm_MWContextToGroup(MWContext *mwc)
{
LMWindowGroup *ptr = NULL;
LMWindowGroup *ans = NULL;
PR_EnterMonitor(wingroups_mon);
ptr = wingroups;
if(lm_GetEntryForContext(wingroups, mwc) != NULL) {
ans = wingroups;
PR_ExitMonitor(wingroups_mon);
return ans;
}
ptr = PR_NEXT_LINK(ptr);
while(ptr != wingroups) {
if(lm_GetEntryForContext(ptr, mwc) != NULL) {
ans = ptr;
PR_ExitMonitor(wingroups_mon);
return ans;
}
ptr = PR_NEXT_LINK(ptr);
}
PR_ExitMonitor(wingroups_mon);
return NULL;
}
LMWindowGroup *lm_QueueStackToGroup(QueueStackElement *qse)
{
LMWindowGroup *ptr = NULL;
LMWindowGroup *ans = NULL;
PR_EnterMonitor(wingroups_mon);
ptr = wingroups;
if(wingroups->queue_stack == qse) {
ans = wingroups;
PR_ExitMonitor(wingroups_mon);
return ans;
}
ptr = PR_NEXT_LINK(ptr);
while(ptr != wingroups) {
if(ptr->queue_stack == qse) {
ans = ptr;
PR_ExitMonitor(wingroups_mon);
return ans;
}
ptr = PR_NEXT_LINK(ptr);
}
PR_ExitMonitor(wingroups_mon);
return NULL;
}
PREventQueue *LM_MWContextToQueue(MWContext *mwc)
{
/* Note: This gets the interpret queue, need to get top queue as well
*/
LMWindowGroup *grp = lm_MWContextToGroup(mwc);
if(grp != NULL) {
return LM_WindowGroupToQueue(grp);
}
return NULL;
}
PREventQueue *LM_WindowGroupToQueue(LMWindowGroup *lmg)
{
return lmg->interpret_queue;
}
ContextList *lm_GetEntryForContext(LMWindowGroup *grp, MWContext *cx)
{
ContextList *cxl = grp->mw_contexts;
ContextList *ans = NULL;
if(PR_CLIST_IS_EMPTY(cxl)) {
return NULL;
} else {
ContextList *ptr = PR_NEXT_LINK(cxl);
while(ptr != cxl) {
if(ptr->context == cx) {
ans = ptr;
break;
}
ptr = PR_NEXT_LINK(ptr);
}
}
return ans;
}
void LM_AddContextToGroup(LMWindowGroup *grp, MWContext *cx)
{
ContextList *cxl;
if(lm_MWContextToGroup(cx) != NULL) {
/* Hey, why are we adding this stuff twice? */
XP_ASSERT(0);
}
cxl = XP_NEW_ZAP(ContextList);
/* Note: failure?!?!?!
*/
cxl->context = cx;
PR_APPEND_LINK(cxl, grp->mw_contexts);
}
void lm_RemoveContextFromGroup(LMWindowGroup *grp, MWContext *cx);
void LM_RemoveContextFromGroup(MWContext *cx)
{
LMWindowGroup *grp = lm_MWContextToGroup(cx);
if(grp) {
lm_RemoveContextFromGroup(grp, cx);
}
}
void lm_RemoveContextFromGroup(LMWindowGroup *grp, MWContext *cx)
{
if(!PR_CLIST_IS_EMPTY(grp->mw_contexts)) {
ContextList *entry = lm_GetEntryForContext(grp, cx);
if(entry != NULL) {
PR_REMOVE_LINK(entry);
XP_DELETE(entry);
}
}
if(PR_CLIST_IS_EMPTY(grp->mw_contexts) && (grp != wingroups)) {
grp->done = PR_TRUE;
}
}
PRBool LM_IsLocked(LMWindowGroup *grp)
{
PRBool ans;
PR_EnterMonitor(request_mon);
ans = grp->hasLock;
PR_ExitMonitor(request_mon);
return ans;
}
void LM_BeginRequest(LMWindowGroup *grp, JSContext *jsc)
{
PR_EnterMonitor(request_mon);
grp->hasLock = PR_TRUE;
grp->lock_context = jsc;
if((JS_GetContextThread(jsc)) != ((intN) grp->thread)) {
JS_SetContextThread(jsc);
}
PR_ExitMonitor(request_mon);
JS_BeginRequest(jsc);
}
void LM_EndRequest(LMWindowGroup *grp, JSContext *jsc)
{
JS_EndRequest(jsc);
PR_EnterMonitor(request_mon);
grp->lock_context = NULL;
grp->hasLock = PR_FALSE;
PR_ExitMonitor(request_mon);
}
JSBool LM_ShouldRunGC(JSContext *cx, JSGCStatus status)
{
JSBool ans = JS_TRUE;
JSContext *active;
LMWindowGroup *ptr;
if(status != JSGC_BEGIN) {
return JS_TRUE;
}
PR_EnterMonitor(request_mon);
if(wingroups->hasLock) {
active = wingroups->lock_context;
if(active != cx) {
ans=JS_FALSE;
goto bye;
}
}
ptr = PR_NEXT_LINK(wingroups);
while(ptr != wingroups) {
if(ptr->hasLock) {
active = ptr->lock_context;
if(active != cx) {
ans=JS_FALSE;
goto bye;
}
}
ptr = PR_NEXT_LINK(ptr);
}
bye:
PR_ExitMonitor(request_mon);
return ans;
}

View File

@@ -0,0 +1,617 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
/*
jscookie.c -- javascript reflection of cookies for filters.
Created: Frederick G.M. Roeber <roeber@netscape.com>, 12-Jul-97.
Adopted: Judson Valeski, 1997.
Large chunks of this were stolen from jsmsg.c.
*/
#include "mkutils.h"
#include "mkutils.h"
#include "mkparse.h"
#include "mkaccess.h"
#include "prefapi.h"
#include "jsapi.h"
#include "xp_core.h"
#include "xp_mcom.h"
#include "jscookie.h"
#include "ds.h"
#include "htmldlgs.h"
#include "xpgetstr.h"
extern int MK_ACCESS_JAVASCRIPT_COOKIE_FILTER;
static JSObject *filter_obj = NULL;
static JSContext *filter_context = NULL;
static JSBool error_reporter_installed = JS_FALSE;
static JSErrorReporter previous_error_reporter;
/* tells us when we should recompile the file. */
static JSBool need_compile = JS_TRUE;
/* This is the private instance data associated with a cookie */
typedef struct JSCookieData {
JSContext *js_context;
JSObject *js_object;
JSCFCookieData *data;
PRPackedBool property_changed, rejected, accepted, ask, decision_made;
} JSCookieData;
/* The properties of a cookie that we reflect */
enum cookie_slot {
COOKIE_PATH = -1,
COOKIE_DOMAIN = -2,
COOKIE_NAME = -3,
COOKIE_VALUE = -4,
COOKIE_EXPIRES = -5,
COOKIE_URL = -6,
COOKIE_IS_SECURE = -7,
COOKIE_IS_DOMAIN = -8,
COOKIE_PROMPT_PREF = -9,
COOKIE_PREF = -10
};
/*
* Should more of these be readonly? What does it mean for a cookie
* to de secure? -chouck
*/
static JSPropertySpec cookie_props[] = {
{ "path", COOKIE_PATH, JSPROP_ENUMERATE },
{ "domain", COOKIE_DOMAIN, JSPROP_ENUMERATE },
{ "name", COOKIE_NAME, JSPROP_ENUMERATE },
{ "value", COOKIE_VALUE, JSPROP_ENUMERATE },
{ "expires", COOKIE_EXPIRES, JSPROP_ENUMERATE },
{ "url", COOKIE_URL, JSPROP_ENUMERATE|JSPROP_READONLY },
{ "isSecure", COOKIE_IS_SECURE, JSPROP_ENUMERATE },
{ "isDomain", COOKIE_IS_DOMAIN, JSPROP_ENUMERATE },
{ "prompt", COOKIE_PROMPT_PREF, JSPROP_ENUMERATE|JSPROP_READONLY },
{ "preference", COOKIE_PREF, JSPROP_ENUMERATE|JSPROP_READONLY },
{ 0 }
};
PR_STATIC_CALLBACK(JSBool)
cookie_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
JSCookieData *data;
JSString *str;
jsint slot;
data = (JSCookieData *)JS_GetPrivate(cx, obj);
if (!data)
return JS_TRUE;
if (!JSVAL_IS_INT(id))
return JS_TRUE;
slot = JSVAL_TO_INT(id);
switch (slot) {
case COOKIE_PATH:
str = JS_NewStringCopyZ(cx, (const char *)data->data->path_from_header);
if( (JSString *)0 == str )
return JS_FALSE;
*vp = STRING_TO_JSVAL(str);
break;
case COOKIE_DOMAIN:
str = JS_NewStringCopyZ(cx, (const char *)data->data->host_from_header);
if( (JSString *)0 == str )
return JS_FALSE;
*vp = STRING_TO_JSVAL(str);
break;
case COOKIE_NAME:
str = JS_NewStringCopyZ(cx, (const char *)data->data->name_from_header);
if( (JSString *)0 == str )
return JS_FALSE;
*vp = STRING_TO_JSVAL(str);
break;
case COOKIE_VALUE:
str = JS_NewStringCopyZ(cx, (const char *)data->data->cookie_from_header);
if( (JSString *)0 == str )
return JS_FALSE;
*vp = STRING_TO_JSVAL(str);
break;
case COOKIE_EXPIRES:
*vp = INT_TO_JSVAL(data->data->expires);
break;
case COOKIE_URL:
str = JS_NewStringCopyZ(cx, (const char *)data->data->url);
if( (JSString *)0 == str )
return JS_FALSE;
*vp = STRING_TO_JSVAL(str);
break;
case COOKIE_IS_SECURE:
*vp = BOOLEAN_TO_JSVAL(data->data->secure);
break;
case COOKIE_IS_DOMAIN:
*vp = BOOLEAN_TO_JSVAL(data->data->domain);
break;
case COOKIE_PROMPT_PREF:
*vp = BOOLEAN_TO_JSVAL(data->data->prompt);
break;
case COOKIE_PREF:
*vp = INT_TO_JSVAL(data->data->preference);
break;
}
return JS_TRUE;
}
PR_STATIC_CALLBACK(JSBool)
cookie_setProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
JSCookieData *data;
jsint slot;
PRInt32 i;
JSBool b;
data = (JSCookieData *)JS_GetPrivate(cx, obj);
if (!data)
return JS_TRUE;
if (!JSVAL_IS_INT(id))
return JS_TRUE;
slot = JSVAL_TO_INT(id);
if (slot == COOKIE_PATH) {
data->data->path_from_header = JS_GetStringBytes(JSVAL_TO_STRING(*vp));
}
else if (slot == COOKIE_DOMAIN) {
data->data->host_from_header = JS_GetStringBytes(JSVAL_TO_STRING(*vp));
}
else if (slot == COOKIE_NAME) {
data->data->name_from_header = JS_GetStringBytes(JSVAL_TO_STRING(*vp));
}
else if (slot == COOKIE_VALUE) {
data->data->cookie_from_header = JS_GetStringBytes(JSVAL_TO_STRING(*vp));
}
else if (slot == COOKIE_EXPIRES) {
if( !JS_ValueToInt32(cx, *vp, (long *)&i) )
return JS_FALSE;
data->data->expires = i;
}
else if (slot == COOKIE_IS_SECURE) {
if( !JS_ValueToBoolean(cx, *vp, &b) )
return JS_FALSE;
data->data->secure = b;
}
else if (slot == COOKIE_IS_DOMAIN) {
if( !JS_ValueToBoolean(cx, *vp, &b) )
return JS_FALSE;
data->data->domain = b;
}
data->property_changed = TRUE;
return JS_TRUE;
}
PR_STATIC_CALLBACK(void)
cookie_finalize(JSContext *cx, JSObject *obj)
{
JSCookieData *cookie;
cookie = JS_GetPrivate(cx, obj);
FREEIF(cookie);
}
/* So we can possibly add functions "global" to filters... */
static JSClass global_class = {
"CookieFilters", 0 /* no private data */,
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub
};
static JSClass js_cookie_class = {
"Cookie", JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub, cookie_getProperty, cookie_setProperty,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, cookie_finalize
};
/* cookie.accept() -- mark it okay */
PR_STATIC_CALLBACK(JSBool)
cookie_accept(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval * rval)
{
JSCookieData *data;
if (!(data = (JSCookieData*)JS_GetInstancePrivate(cx, obj, &js_cookie_class, argv)))
return JS_FALSE;
data->accepted = TRUE;
data->rejected = FALSE;
data->ask = FALSE;
data->decision_made = TRUE;
return JS_TRUE;
}
/* cookie.reject() -- reject it out of hand */
PR_STATIC_CALLBACK(JSBool)
cookie_reject(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval * rval)
{
JSCookieData *data;
if (!(data = (JSCookieData*)JS_GetInstancePrivate(cx, obj, &js_cookie_class, argv)))
return JS_FALSE;
data->accepted = FALSE;
data->rejected = TRUE;
data->ask = FALSE;
data->decision_made = TRUE;
return JS_TRUE;
}
/* cookie.ask() -- ask the luser, even if that pref is off */
PR_STATIC_CALLBACK(JSBool)
cookie_ask(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval * rval)
{
JSCookieData *data;
if (!(data = (JSCookieData*)JS_GetInstancePrivate(cx, obj, &js_cookie_class, argv)))
return JS_FALSE;
data->accepted = FALSE;
data->rejected = FALSE;
data->ask = TRUE;
data->decision_made = TRUE;
return JS_TRUE;
}
/* cookie.confirm() -- pop up a confirmation box */
PR_STATIC_CALLBACK(JSBool)
cookie_confirm(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval * rval)
{
JSCookieData *data;
JSString *str;
char *msg = (char *)0;
Bool result;
MWContext * context = XP_FindSomeContext();
if (argc < 1 || !context)
return JS_FALSE;
if (!(data = (JSCookieData*)JS_GetInstancePrivate(cx, obj, &js_cookie_class, argv)))
return JS_FALSE;
str = JS_ValueToString(cx, argv[0]);
if (!str)
return JS_FALSE;
StrAllocCopy(msg, XP_GetString(MK_ACCESS_JAVASCRIPT_COOKIE_FILTER));
StrAllocCat(msg, JS_GetStringBytes(str));
if (!msg)
return JS_FALSE;
result = FE_Confirm(context, msg);
FREEIF(msg);
*rval = BOOLEAN_TO_JSVAL(result);
return JS_TRUE;
}
#if DEBUG
/* trace() -- outputs spew to stderr. Actually, this (or something like it
that perhaps outputs to the same file that the rest of the filter logging code
writes to) would probably be very useful in the normal course of writing filters. */
PR_STATIC_CALLBACK(JSBool)
cookie_filter_trace(JSContext *cx, JSObject * obj, uint argc, jsval *argv, jsval * rval)
{
if (argc > 0)
{
JSString *str;
const char *trace_str;
if (!(str = JS_ValueToString(cx, argv[0])))
return JS_FALSE;
trace_str = JS_GetStringBytes(str);
if (*trace_str != '\0')
{
fprintf (stderr, "cookie filter trace: %s\n", trace_str);
}
return JS_TRUE;
}
return JS_FALSE;
}
#endif
static JSFunctionSpec cookie_methods[] = {
{ "accept", cookie_accept, 0 },
{ "reject", cookie_reject, 0 },
{ "ask", cookie_ask, 0 },
{ "confirm", cookie_confirm, 1 },
{ 0 }
};
static JSFunctionSpec filter_methods[] = {
#ifdef DEBUG
{ "trace", cookie_filter_trace, 1 },
#endif
{ 0 }
};
PRIVATE void
destroyJSCookieFilterStuff(void)
{
filter_obj = NULL;
}
/*
* This function used to take an MWContext and store it as the private data
* of the filter object. That is a no-no since the filter_obj is going to
* be around until the end of time but there is no guarentee that the
* context won't get free'd out from under us. The solution is to not
* hold onto any particular context but just call XP_FindSomeContext() or
* some derivative of it when we need to.
*/
PRIVATE JSContext *
initializeJSCookieFilterStuff()
{
/* Only bother initializing once */
if (filter_obj)
return filter_context;
/* If we can't get the mozilla-thread global context just bail */
PREF_GetConfigContext(&filter_context);
if (!filter_context)
return NULL;
JS_BeginRequest(filter_context);
/* create our "global" object. We make the message object a child of this */
filter_obj = JS_NewObject(filter_context, &global_class, NULL, NULL);
/* MLM - don't do JS_InitStandardClasses() twice */
if (!filter_obj
|| !JS_DefineFunctions(filter_context, filter_obj, filter_methods))
{
JS_EndRequest(filter_context);
destroyJSCookieFilterStuff();
return NULL;
}
JS_EndRequest(filter_context);
return filter_context;
}
PRIVATE JSObject *
newCookieObject(void)
{
JSObject *rv;
JSCookieData *cookie_data;
rv = JS_DefineObject(filter_context, filter_obj,
"cookie", &js_cookie_class,
NULL, JSPROP_ENUMERATE);
if( (JSObject *)0 == rv )
return (JSObject *)0;
cookie_data = XP_NEW_ZAP(JSCookieData);
if( (JSCookieData *)0 == cookie_data )
return (JSObject *)0;
if( !JS_SetPrivate(filter_context, rv, cookie_data)
|| !JS_DefineProperties(filter_context, rv, cookie_props)
|| !JS_DefineFunctions(filter_context, rv, cookie_methods)) {
return (JSObject *)0;
}
return rv;
}
PR_STATIC_CALLBACK(void)
jscookie_ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report)
{
char *msg = NULL;
MWContext *context;
context = XP_FindSomeContext();
if(!context || !report)
return;
/*XXX: i18n-ise this */
msg = PR_sprintf_append(NULL,
"JavaScript Cookie Filter Error:\n"
"You will be prompted manually to accept or reject this cookie.\n"
"Filename: %s\n"
"Line #: %u\n"
"%s\n"
"%.*s\n",
report->filename,
report->lineno,
report->linebuf,
(int)(report->tokenptr - report->linebuf) + 1,
"^"
);
if (!msg)
return;
FE_Alert(context, msg);
XP_FREE(msg);
return;
}
PRIVATE JSBool
compileJSCookieFilters(void)
{
static time_t m_time = 0; /* the last modification time of filters.js */
static JSBool ret_val = JS_FALSE;
char *filename;
XP_File fp;
XP_StatStruct stats;
if (!need_compile)
return ret_val;
filename = WH_FileName("", xpJSCookieFilters);
XP_Trace("+Filename for script filter is %s\n", filename);
/* If we can't get to the file, get the hell outa dodge. */
if(XP_Stat(filename, &stats, xpJSCookieFilters))
return ret_val;
if (stats.st_mtime > m_time || need_compile)
{
long fileLength;
char *buffer;
jsval rval;
m_time = stats.st_mtime;
fileLength = stats.st_size;
if (fileLength <= 1)
{
ret_val = JS_FALSE;
return ret_val;
}
if( !(fp = XP_FileOpen(filename, xpJSCookieFilters, "r")) ) {
ret_val = JS_FALSE;
return ret_val;
}
buffer = (char*)malloc(fileLength);
if (!buffer) {
XP_FileClose(fp);
ret_val = JS_FALSE;
return ret_val;
}
fileLength = XP_FileRead(buffer, fileLength, fp);
XP_FileClose(fp);
XP_Trace("+Compiling filters.js...\n");
ret_val = JS_EvaluateScript(filter_context, filter_obj, buffer, fileLength,
filename, 1, &rval);
XP_Trace("+Done.\n");
XP_FREE(buffer);
need_compile = JS_FALSE;
}
return ret_val;
}
PUBLIC JSCFResult
JSCF_Execute(
MWContext *mwcontext,
const char *script_name,
JSCFCookieData *data,
Bool *data_changed
)
{
jsval result;
jsval filter_arg; /* we will this in with the message object we create. */
JSObject *cookie_obj;
JSCookieData *cookie_data;
if (!script_name)
return JSCF_error;
/* initialize the filter stuff, and bomb out early if it fails */
if (!initializeJSCookieFilterStuff())
return JSCF_error;
JS_BeginRequest(filter_context);
/*
* try loading (reloading if necessary) the filter file before bothering
* to create any JS-objects
*/
if (!compileJSCookieFilters()) {
JS_EndRequest(filter_context);
return JSCF_error;
}
if (!error_reporter_installed)
{
error_reporter_installed = JS_TRUE;
previous_error_reporter = JS_SetErrorReporter(filter_context,
jscookie_ErrorReporter);
}
cookie_obj = newCookieObject();
if( (JSObject *)0 == cookie_obj ) {
JS_EndRequest(filter_context);
return JSCF_error;
}
cookie_data = (JSCookieData *)JS_GetPrivate(filter_context, cookie_obj);
cookie_data->js_context = filter_context;
cookie_data->js_object = cookie_obj;
cookie_data->data = data;
cookie_data->property_changed = FALSE;
cookie_data->rejected = FALSE;
cookie_data->accepted = FALSE;
cookie_data->decision_made = FALSE;
filter_arg = OBJECT_TO_JSVAL(cookie_obj);
JS_CallFunctionName(filter_context, filter_obj, script_name, 1,
&filter_arg, &result);
JS_EndRequest(filter_context);
*data_changed = cookie_data->property_changed;
if( cookie_data->decision_made ) {
if( cookie_data->rejected )
return JSCF_reject;
else if( cookie_data->accepted )
return JSCF_accept;
else if( cookie_data->ask )
return JSCF_ask;
}
return JSCF_whatever;
}
PUBLIC void
JSCF_Cleanup(void)
{
TRACEMSG(("+Cleaning up JS Cookie Filters"));
need_compile = JS_TRUE;
if (filter_context)
{
JS_BeginRequest(filter_context);
if (error_reporter_installed)
{
error_reporter_installed = JS_FALSE;
JS_SetErrorReporter(filter_context, previous_error_reporter);
}
JS_GC(filter_context);
destroyJSCookieFilterStuff();
JS_EndRequest(filter_context);
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,751 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
/* Please leave at the top for windows precompiled headers */
#include "mkutils.h"
#include <stddef.h>
#include <memory.h>
#include <time.h>
#include "net.h"
#include "xp.h"
#include "libmocha.h"
#include "mkgeturl.h"
#include "mkmocha.h"
#include "libevent.h"
#include "fe_proto.h"
#include "pa_tags.h" /* included via -I../libparse */
#include "libi18n.h" /* unicode */
#include "layout.h" /* for lo_ContextToCell only */
extern char lm_unknown_origin_str[];
extern int MK_OUT_OF_MEMORY;
extern int MK_MALFORMED_URL_ERROR;
typedef struct {
char * buffer;
size_t offset;
size_t length;
MWContext * context;
char * content_type;
int16 char_set;
} MochaStream;
typedef struct {
int32 ref_count;
ActiveEntry * active_entry;
PRPackedBool is_valid;
PRPackedBool eval_what;
PRPackedBool single_shot;
PRPackedBool polling;
char * str;
size_t len;
MWContext * context;
int status;
char * wysiwyg_url;
char * base_href;
NET_StreamClass * stream;
} MochaConData;
#define HOLD_CON_DATA(con_data) ((con_data)->ref_count++)
#define DROP_CON_DATA(con_data) { \
if (--(con_data)->ref_count == 0) \
free_con_data(con_data); \
}
static void
free_con_data(MochaConData * con_data)
{
XP_FREEIF(con_data->str);
XP_FREEIF(con_data->wysiwyg_url);
XP_FREEIF(con_data->base_href);
XP_FREE(con_data);
}
#define START_POLLING(ae, con_data) { \
(con_data)->polling = TRUE; \
NET_SetCallNetlibAllTheTime((ae)->window_id, "mkmocha"); \
}
#define STOP_POLLING(ae, con_data) { \
NET_ClearCallNetlibAllTheTime((ae)->window_id, "mkmocha"); \
(con_data)->polling = FALSE; \
}
/* forward decl */
PRIVATE int32 net_ProcessMocha(ActiveEntry * ae);
/*
* Add the new bits to our buffer
*/
PRIVATE int
mocha_process(NET_StreamClass *stream, const char *str, int32 len)
{
MochaStream * mocha_stream = (MochaStream *) stream->data_object;
mocha_stream->length += len;
if (!mocha_stream->buffer) {
mocha_stream->buffer = (char *)XP_ALLOC(mocha_stream->length);
}
else {
mocha_stream->buffer = (char *)XP_REALLOC(mocha_stream->buffer,
mocha_stream->length);
}
if (!mocha_stream->buffer) {
return MK_OUT_OF_MEMORY;
}
memcpy(mocha_stream->buffer + mocha_stream->offset, str, len);
mocha_stream->offset += len;
return len;
}
PRIVATE unsigned int
mocha_ready(NET_StreamClass *stream)
{
return MAX_WRITE_READY; /* always ready for writing */
}
/*
* All of the processing for this needs to be done in the mocha thread
*/
PRIVATE void
mocha_complete(NET_StreamClass *stream)
{
void * data;
JSBool isUnicode = JS_FALSE;
MochaStream * mocha_stream = (MochaStream *) stream->data_object;
if (mocha_stream->char_set != CS_DEFAULT) {
uint32 len;
INTL_Unicode * unicode;
/* find out how many unicode characters we'll end up with */
len = INTL_TextToUnicodeLen(mocha_stream->char_set,
(unsigned char *) mocha_stream->buffer,
mocha_stream->length);
unicode = XP_ALLOC(sizeof(INTL_Unicode) * len);
if (!unicode)
return;
/* do the conversion */
mocha_stream->length = INTL_TextToUnicode(mocha_stream->char_set,
(unsigned char *) mocha_stream->buffer,
mocha_stream->length,
unicode,
len);
data = unicode;
isUnicode = JS_TRUE;
XP_FREE(mocha_stream->buffer);
mocha_stream->buffer = NULL;
}
else {
data = mocha_stream->buffer;
}
/* this will grab ownership of data */
ET_MochaStreamComplete(mocha_stream->context, data,
mocha_stream->length,
mocha_stream->content_type,
isUnicode);
XP_FREEIF(mocha_stream->content_type);
XP_FREE(mocha_stream);
}
PRIVATE void
mocha_abort(NET_StreamClass *stream, int status)
{
MochaStream * mocha_stream = (MochaStream *) stream->data_object;
ET_MochaStreamAbort(mocha_stream->context, status);
XP_FREE(mocha_stream->buffer);
XP_FREEIF(mocha_stream->content_type);
XP_FREE(mocha_stream);
}
int16
net_check_for_charset(URL_Struct *url_struct)
{
int i, max;
char *key, *value;
static char charset[] = "charset=";
int len = XP_STRLEN(charset);
max = url_struct->all_headers.empty_index;
for (i = 0; i < max; i++) {
key = url_struct->all_headers.key[i];
/* keep looking until we find the content type one */
if (XP_STRCASECMP(key, "Content-type"))
continue;
value = url_struct->all_headers.value[i];
/* don't bother unless this is a JS file to begin with */
if (!strcasestr(value, APPLICATION_JAVASCRIPT))
return CS_DEFAULT;
value = XP_STRTOK(value, ";");
while (value) {
value = XP_StripLine(value);
if (!strncasecomp(value, charset, len)) {
value += len;
value = XP_StripLine(value);
return (INTL_CharSetNameToID(value));
}
/* move to next arg */
value = XP_STRTOK(NULL, ";");
}
/* found content-type but no charset */
return CS_DEFAULT;
}
/* didn't find content-type */
return CS_DEFAULT;
}
static char *
getOriginFromURLStruct(MWContext *context, URL_Struct *url_struct)
{
char *referer;
/*
* Look in url_struct->origin_url for this javascript: URL's
* original referrer.
*
* In the basis case, a javascript: or *.js URL targets a context
* from a (the same, or not) context loaded with a non-javascript URL.
* The referring document's URL is in url_struct->referer and we
* duplicate it as origin_url. If we find a non-null origin_url
* later, we know by induction where it came from.
*/
referer = url_struct->origin_url;
if (referer == NULL) {
/*
* url_struct->referer (sic) tells the URL of the page in
* which a javascript: or *.js link or form was clicked or submitted.
* If it's non-null, but the context is a frame cell that's
* being (re-)created for this load, don't use referer as the
* decoder's source URL for the evaluation, because the FE has
* arbitrarily set it to the top frameset's URL. Instead, use
* the immediate parent frameset context's wysiwyg URL to get
* the origin of the generator (or the parent's address URL if
* not wysiwyg).
*
* If referer is null, the user typed this javascript: URL or
* its frameset's URL directly into the Location toolbar.
*/
referer = url_struct->referer;
if (referer) {
lo_GridRec *grid = NULL;
if (context->is_grid_cell &&
!lo_ContextToCell(context, FALSE, &grid)) {
/*
* Context is a frame being (re)created: veto referer.
* The javascript: or *.js URL can't be a LAYER SRC= URL in a
* frame because the frame's cell must point to its
* context by the time the first tag (even LAYER) is
* processed by layout.
*/
referer = NULL;
}
}
if (!referer) {
History_entry *he;
if (context->grid_parent) {
/*
* If grid parent, use its history entry to get the
* wysiwyg or real URL, which tells the subject origin
* of (any code in it that may have generated) this
* javascript: or *.js URL open. If no grid parent, this must
* be a javascript: or *.js URL that was typed directly into
* Location.
*/
context = context->grid_parent;
}
he = SHIST_GetCurrent(&context->hist);
if (!he) {
referer = lm_unknown_origin_str;
} else {
referer = he->wysiwyg_url;
if (!referer)
referer = he->address;
}
}
}
XP_ASSERT(referer);
referer = XP_STRDUP(referer);
if (!referer) {
return NULL;
}
url_struct->origin_url = referer;
return referer;
}
NET_StreamClass *
NET_CreateMochaConverter(FO_Present_Types format_out,
void *data_object,
URL_Struct *url_struct,
MWContext *context)
{
MochaStream * mocha_stream;
NET_StreamClass *stream;
char *origin;
mocha_stream = (MochaStream *) XP_NEW_ZAP(MochaStream);
if (!mocha_stream)
return NULL;
mocha_stream->context = context;
mocha_stream->content_type = XP_STRDUP(url_struct->content_type);
mocha_stream->char_set = net_check_for_charset(url_struct);
/* Get the origin from the URL struct. We don't have to free origin
* here because url_struct->origin_url owns it.
*/
origin = getOriginFromURLStruct(context, url_struct);
if (origin == NULL)
return NULL;
if (NET_URL_Type(url_struct->address) == FILE_TYPE_URL &&
NET_URL_Type(origin) != FILE_TYPE_URL)
{
/*
* Don't allow loading a file: URL from a non-file URL to
* prevent privacy attacks against the local machine from
* web pages.
*/
return NULL;
}
stream = NET_NewStream("mocha", mocha_process, mocha_complete,
mocha_abort, mocha_ready, mocha_stream,
context);
return stream;
}
PRIVATE void
mk_mocha_eval_exit_fn(void * data, char * str, size_t len, char * wysiwyg_url,
char * base_href, Bool valid)
{
MochaConData * con_data = (MochaConData *) data;
if (!valid) {
con_data->status = MK_MALFORMED_URL_ERROR;
con_data->is_valid = TRUE;
return;
}
if (str == NULL) {
con_data->status = MK_DATA_LOADED;
con_data->is_valid = TRUE;
return;
}
con_data->base_href = base_href;
con_data->wysiwyg_url = wysiwyg_url;
con_data->str = str;
con_data->len = len;
con_data->is_valid = TRUE;
}
/*
* Handle both 'mocha:<stuff>' urls and the mocha type-in widget
*/
MODULE_PRIVATE int32
net_MochaLoad(ActiveEntry *ae)
{
MWContext *context;
URL_Struct *url_struct;
char *what;
Bool eval_what, single_shot;
MochaConData * con_data;
context = ae->window_id;
url_struct = ae->URL_s;
what = XP_STRCHR(url_struct->address, ':');
XP_ASSERT(what);
what++;
eval_what = FALSE;
single_shot = (*what != '?');
if (single_shot) {
/* Don't use an existing Mocha output window's stream. */
if (*what == '\0') {
/* Generate two grid cells, one for output and one for input. */
what = PR_smprintf("<frameset rows=\"75%%,25%%\">\n"
"<frame name=MochaOutput src=about:blank>\n"
"<frame name=MochaInput src=%.*s#input>\n"
"</frameset>",
what - url_struct->address,
url_struct->address);
} else if (!XP_STRCMP(what, "#input")) {
/* The input cell contains a form with one magic isindex field. */
what = PR_smprintf("<b>%.*s typein</b>\n"
"<form action=%.*s target=MochaOutput"
" onsubmit='this.isindex.focus()'>\n"
"<input name=isindex size=60>\n"
"</form>",
what - url_struct->address - 1,
url_struct->address,
what - url_struct->address,
url_struct->address);
url_struct->internal_url = TRUE;
} else {
eval_what = TRUE;
}
} else {
/* Use the Mocha output window if it exists. */
url_struct->auto_scroll = 1000;
/* Skip the leading question-mark and clean up the string. */
what++;
NET_PlusToSpace(what);
NET_UnEscape(what);
eval_what = TRUE;
}
/* something got hosed. bail */
if (!what) {
ae->status = MK_OUT_OF_MEMORY;
return -1;
}
/* make space for the connection data */
con_data = XP_NEW_ZAP(MochaConData);
if (!con_data) {
ae->status = MK_OUT_OF_MEMORY;
return -1;
}
/* remember for next time */
con_data->ref_count = 1;
con_data->active_entry = ae;
ae->con_data = con_data;
/* set up some state so we remember where we are */
con_data->eval_what = eval_what;
con_data->single_shot = single_shot;
con_data->context = context;
/* fake out netlib so we don't select on the socket id */
ae->socket = NULL;
ae->local_file = TRUE;
if (eval_what) {
char *referer;
JSPrincipals *principals;
ETEvalStuff *stuff;
referer = getOriginFromURLStruct(context, url_struct);
if (!referer) {
ae->status = MK_OUT_OF_MEMORY;
return -1;
}
principals = LM_NewJSPrincipals(NULL, NULL, referer);
if (!principals) {
ae->status = MK_OUT_OF_MEMORY;
return -1;
}
/*
* send the buffer off to be evaluated
*/
stuff = (ETEvalStuff *) XP_NEW_ZAP(ETEvalStuff);
if (!stuff) {
ae->status = MK_OUT_OF_MEMORY;
return -1;
}
stuff->len = XP_STRLEN(what);
stuff->line_no = 0;
stuff->scope_to = NULL;
stuff->want_result = JS_TRUE;
stuff->data = con_data;
stuff->version = JSVERSION_UNKNOWN;
stuff->principals = principals;
ET_EvaluateScript(context, what, stuff, mk_mocha_eval_exit_fn);
}
else {
/* allocated above, don't need to free */
con_data->str = what;
con_data->len = XP_STRLEN(what);
con_data->is_valid = TRUE;
}
/* make sure netlib gets called so we know when our data gets back */
START_POLLING(ae, con_data);
/* ya'll come back now, ya'hear? */
return net_ProcessMocha(ae);
}
PRIVATE int
net_process_mocha(MochaConData * con_data)
{
int32 ref_count;
ref_count = con_data->ref_count;
DROP_CON_DATA(con_data);
if (ref_count == 1 || !con_data->active_entry)
return -1;
return net_ProcessMocha(con_data->active_entry);
}
static char nscp_open_tag[] = "<" PT_NSCP_OPEN ">";
/*
* If the mocha has finished evaluation shove the result
* down the stream and continue else just wait
*/
PRIVATE int32
net_ProcessMocha(ActiveEntry * ae)
{
FO_Present_Types output_format;
Bool to_layout;
Bool first_time;
NET_StreamClass *stream = NULL;
MochaConData * con_data = (MochaConData *) ae->con_data;
MWContext * context;
int status;
/* if we haven't gotten our data yet just return and wait */
if (!con_data || !con_data->is_valid)
return 0;
context = ae->window_id;
/*
* Race with the mocha thread until we can grab the JSLock
*/
if (!con_data->single_shot) {
MochaDecoder * decoder;
HOLD_CON_DATA(con_data);
if (!LM_AttemptLockJS(context,
(JSLockReleaseFunc)net_process_mocha, con_data))
return 0;
DROP_CON_DATA(con_data);
decoder = LM_GetMochaDecoder(context);
if (!decoder) {
LM_UnlockJS(context);
ae->status = MK_OUT_OF_MEMORY;
goto done;
}
stream = decoder->stream;
LM_PutMochaDecoder(decoder);
LM_UnlockJS(context);
}
else {
stream = con_data->stream;
}
/* we've gotten valid data, clear the callme all the time flag */
STOP_POLLING(ae, con_data);
/* see if there were any problems */
if (con_data->status < 0 || con_data->str == NULL) {
ET_SendLoadEvent(context, EVENT_LOAD, NULL, NULL,
LO_DOCUMENT_LAYER_ID, FALSE);
ae->status = con_data->status;
goto done;
}
/*
* If we don't already have a stream to take our output create one now
*/
first_time = !stream;
if (first_time) {
StrAllocCopy(ae->URL_s->content_type, TEXT_HTML);
ae->format_out = CLEAR_CACHE_BIT(ae->format_out);
stream = NET_StreamBuilder(ae->format_out, ae->URL_s, ae->window_id);
if (!stream) {
ae->status = MK_UNABLE_TO_CONVERT;
goto done;
}
}
/*
* If the stream we just created isn't ready for writing just
* hold onto the stream and try again later
*/
if (!stream->is_write_ready(stream)) {
con_data->stream = stream;
START_POLLING(ae, con_data);
return 0;
}
/* XXX this condition is fairly bogus */
output_format = CLEAR_CACHE_BIT(ae->format_out);
to_layout = (output_format != FO_INTERNAL_IMAGE &&
output_format != FO_MULTIPART_IMAGE &&
output_format != FO_EMBED &&
output_format != FO_PLUGIN);
if (to_layout) {
/* The string must end in a newline so the parser will flush it. */
if (con_data->len != 0 && con_data->str[con_data->len-1] != '\n') {
size_t new_len = con_data->len + 1;
char * new_str = XP_ALLOC((new_len + 1) * sizeof(char));
if (!new_str) {
ae->status = MK_OUT_OF_MEMORY;
goto done;
}
XP_MEMCPY(new_str, con_data->str, con_data->len);
new_str[new_len-1] = '\n';
new_str[new_len] = '\0';
con_data->str = new_str;
con_data->len = new_len;
}
}
/*
* If this is the first time do some initial setup. We'll set
* the window title and maybe shove out a <BASE> tag
*/
status = 0;
if (to_layout && first_time && con_data->eval_what) {
/* Feed layout an internal tag so it will create a new top state. */
stream->put_block(stream, nscp_open_tag,
sizeof nscp_open_tag - 1);
(void) LM_WysiwygCacheConverter(context, ae->URL_s,
con_data->wysiwyg_url,
con_data->base_href);
if (*con_data->str != '<') {
char * prefix = NULL;
StrAllocCopy(prefix, "<TITLE>");
StrAllocCat(prefix, ae->URL_s->address);
StrAllocCat(prefix, "</TITLE><PLAINTEXT>");
if (!prefix) {
ae->status = MK_OUT_OF_MEMORY;
goto done;
}
status = (*stream->put_block)(stream, prefix,
XP_STRLEN(prefix));
XP_FREE(prefix);
}
else {
if (con_data->base_href) {
status = (*stream->put_block)(stream,
con_data->base_href,
XP_STRLEN(con_data->base_href));
}
}
}
if (status >= 0) {
status = (*stream->put_block)(stream, con_data->str,
(int32)con_data->len);
}
if (con_data->single_shot && status >= 0)
(*stream->complete)(stream);
if (!con_data->single_shot && status >= 0) {
if (first_time) {
ET_SetDecoderStream(context, stream, ae->URL_s, JS_TRUE);
goto done;
}
} else {
if (status < 0)
(*stream->abort)(stream, status);
if (first_time)
XP_DELETE(stream);
}
ae->status = MK_DATA_LOADED;
done:
ae->con_data = NULL;
con_data->active_entry = NULL;
DROP_CON_DATA(con_data);
return -1;
}
PRIVATE int32
net_InterruptMocha(ActiveEntry *ae)
{
MochaConData * con_data = (MochaConData *) ae->con_data;
if (!con_data)
return MK_INTERRUPTED;
/* do we need to decrement the callme all the time flag? */
if (con_data->polling) {
STOP_POLLING(ae, con_data);
}
/* ae is about to go away, break its connection with con_data */
ae->con_data = NULL;
con_data->active_entry = NULL;
/* ae is about to go away, better get it off the JS lock waiters list */
if (LM_ClearAttemptLockJS(con_data->context,
(JSLockReleaseFunc)net_process_mocha, con_data))
DROP_CON_DATA(con_data);
return ae->status = MK_INTERRUPTED;
}
PRIVATE void
net_CleanupMocha(void)
{
/* nothing so far needs freeing */
return;
}
MODULE_PRIVATE void
NET_InitMochaProtocol(void)
{
static NET_ProtoImpl mocha_proto_impl;
mocha_proto_impl.init = net_MochaLoad;
mocha_proto_impl.process = net_ProcessMocha;
mocha_proto_impl.interrupt = net_InterruptMocha;
mocha_proto_impl.cleanup = net_CleanupMocha;
NET_RegisterProtocolImplementation(&mocha_proto_impl, MOCHA_TYPE_URL);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,28 +0,0 @@
#
# 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
DIRS = public src prefs build resources
include $(topsrcdir)/config/rules.mk

View File

@@ -1,17 +0,0 @@
# 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.
#
nsAbBaseCID.h

View File

@@ -1,49 +0,0 @@
#
# 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
MODULE = addrbook
LIBRARY_NAME = addrbook
IS_COMPONENT = 1
CPPSRCS = nsAbFactory.cpp
EXPORTS = nsAbBaseCID.h
SHARED_LIBRARY_LIBS = \
$(DIST)/lib/libaddrbook_s.a \
$(DIST)/lib/librdfutil_s.a \
$(NULL)
EXTRA_DSO_LDOPTS = \
$(MKSHLIB_FORCE_ALL) \
$(SHARED_LIBRARY_LIBS) \
$(MKSHLIB_UNFORCE_ALL) \
-L$(DIST)/bin \
$(NSPR_LIBS) \
-lxpcom \
$(NULL)
include $(topsrcdir)/config/rules.mk
$(LIBRARY) $(SHARED_LIBRARY): $(SHARED_LIBRARY_LIBS) Makefile

View File

@@ -1,49 +0,0 @@
#!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=..\..\..
MODULE=addrbook
################################################################################
## exports
EXPORTS= \
nsAbBaseCID.h \
$(NULL)
################################################################################
## library
LIBNAME = .\$(OBJDIR)\addrbook
DLL = $(LIBNAME).dll
CPP_OBJS= \
.\$(OBJDIR)\nsAbFactory.obj \
$(NULL)
LLIBS= \
$(DIST)\lib\xpcom.lib \
$(DIST)\lib\addrbook_s.lib \
$(LIBNSPR) \
$(DIST)\lib\rdfutil_s.lib \
$(NULL)
include <$(DEPTH)\config\rules.mak>
install:: $(DLL)
$(MAKE_INSTALL) $(LIBNAME).$(DLL_SUFFIX) $(DIST)\bin\components
$(MAKE_INSTALL) $(LIBNAME).$(LIB_SUFFIX) $(DIST)\lib

View File

@@ -1,154 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
#ifndef nsAbBaseCID_h__
#define nsAbBaseCID_h__
#include "nsISupports.h"
#include "nsIFactory.h"
#include "nsIComponentManager.h"
//
// nsAddressBook
//
#define NS_ADDRESSBOOK_PROGID \
"component://netscape/addressbook"
#define NS_ADDRESSBOOK_CID \
{ /* {D60B84F2-2A8C-11d3-9E07-00A0C92B5F0D} */ \
0xd60b84f2, 0x2a8c, 0x11d3, \
{ 0x9e, 0x7, 0x0, 0xa0, 0xc9, 0x2b, 0x5f, 0xd } \
}
//
// nsAbDirectoryDataSource
//
#define NS_ABDIRECTORYDATASOURCE_PROGID \
NS_RDF_DATASOURCE_PROGID_PREFIX "addressdirectory"
#define NS_ABDIRECTORYDATASOURCE_CID \
{ /* 0A79186D-F754-11d2-A2DA-001083003D0C */ \
0xa79186d, 0xf754, 0x11d2, \
{0xa2, 0xda, 0x0, 0x10, 0x83, 0x0, 0x3d, 0xc} \
}
//
// nsAbDirectory
//
#define NS_ABDIRECTORY_PROGID \
NS_RDF_RESOURCE_FACTORY_PROGID_PREFIX "abdirectory"
#define NS_ABDIRECTORY_CID \
{ /* {6C21831D-FCC2-11d2-A2E2-001083003D0C}*/ \
0x6c21831d, 0xfcc2, 0x11d2, \
{0xa2, 0xe2, 0x0, 0x10, 0x83, 0x0, 0x3d, 0xc} \
}
//
// nsAbCardDataSource
//
#define NS_ABCARDDATASOURCE_PROGID \
NS_RDF_DATASOURCE_PROGID_PREFIX "addresscard"
#define NS_ABCARDDATASOURCE_CID \
{ /* 1920E486-0709-11d3-A2EC-001083003D0C */ \
0x1920e486, 0x709, 0x11d3, \
{0xa2, 0xec, 0x0, 0x10, 0x83, 0x0, 0x3d, 0xc} \
}
//
// nsAbCard
//
#define NS_ABCARD_PROGID \
NS_RDF_RESOURCE_FACTORY_PROGID_PREFIX "abcard"
#define NS_ABCARD_CID \
{ /* {1920E487-0709-11d3-A2EC-001083003D0C}*/ \
0x1920e487, 0x709, 0x11d3, \
{0xa2, 0xec, 0x0, 0x10, 0x83, 0x0, 0x3d, 0xc} \
}
//
// nsAddressBookDB
//
#define NS_ADDRDATABASE_PROGID \
"component://netscape/addressbook/carddatabase"
#define NS_ADDRDATABASE_CID \
{ /* 63187917-1D19-11d3-A302-001083003D0C */ \
0x63187917, 0x1d19, 0x11d3, \
{0xa3, 0x2, 0x0, 0x10, 0x83, 0x0, 0x3d, 0xc} \
}
//
// nsAbCardProperty
//
#define NS_ABCARDPROPERTY_PROGID \
"component://netscape/addressbook/cardproperty"
#define NS_ABCARDPROPERTY_CID \
{ /* 2B722171-2CEA-11d3-9E0B-00A0C92B5F0D */ \
0x2b722171, 0x2cea, 0x11d3, \
{0x9e, 0xb, 0x0, 0xa0, 0xc9, 0x2b, 0x5f, 0xd} \
}
//
// nsAddrBookSession
//
#define NS_ADDRBOOKSESSION_PROGID \
"component://netscape/addressbook/services/session"
#define NS_ADDRBOOKSESSION_CID \
{ /* C5339442-303F-11d3-9E13-00A0C92B5F0D */ \
0xc5339442, 0x303f, 0x11d3, \
{0x9e, 0x13, 0x0, 0xa0, 0xc9, 0x2b, 0x5f, 0xd} \
}
//
// nsAbDirProperty
//
#define NS_ABDIRPROPERTY_PROGID \
"component://netscape/addressbook/directoryproperty"
#define NS_ABDIRPROPERTY_CID \
{ /* 6FD8EC67-3965-11d3-A316-001083003D0C */ \
0x6fd8ec67, 0x3965, 0x11d3, \
{0xa3, 0x16, 0x0, 0x10, 0x83, 0x0, 0x3d, 0xc} \
}
//
// nsAbAutoCompleteSession
//
#define NS_ABAUTOCOMPLETESESSION_PROGID \
"component://netscape/messenger/autocomplete&type=addrbook"
#define NS_ABAUTOCOMPLETESESSION_CID \
{ /* 138DE9BD-362B-11d3-988E-001083010E9B */ \
0x138de9bd, 0x362b, 0x11d3, \
{0x98, 0x8e, 0x0, 0x10, 0x83, 0x1, 0xe, 0x9b} \
}
//
// nsAbAddressCollecter
//
#define NS_ABADDRESSCOLLECTER_PROGID \
"component://netscape/addressbook/services/addressCollecter"
#define NS_ABADDRESSCOLLECTER_CID \
{ /* fe04c8e6-501e-11d3-a527-0060b0fc04b7 */ \
0xfe04c8e6, 0x501e, 0x11d3, \
{0xa5, 0x27, 0x0, 0x60, 0xb0, 0xfc, 0x4, 0xb7} \
}
#endif // nsAbBaseCID_h__

View File

@@ -1,83 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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,1999 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "nsIFactory.h"
#include "nsISupports.h"
#include "nsIGenericFactory.h"
#include "nsIModule.h"
#include "nsAbBaseCID.h"
#include "pratom.h"
#include "nsIComponentManager.h"
#include "nsIServiceManager.h"
#include "rdf.h"
#include "nsCRT.h"
#include "nsCOMPtr.h"
/* Include all of the interfaces our factory can generate components for */
#include "nsDirectoryDataSource.h"
#include "nsCardDataSource.h"
#include "nsAbDirectory.h"
#include "nsAbCard.h"
#include "nsAddrDatabase.h"
#include "nsAddressBook.h"
#include "nsAddrBookSession.h"
#include "nsAbDirProperty.h"
#include "nsAbAutoCompleteSession.h"
#include "nsAbAddressCollecter.h"
NS_GENERIC_FACTORY_CONSTRUCTOR(nsAddressBook)
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsAbDirectoryDataSource,Init)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsAbDirectory)
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsAbCardDataSource,Init)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsAbCard)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsAbCardProperty)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsAddrDatabase)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsAbDirProperty)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsAddrBookSession)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsAbAutoCompleteSession)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsAbAddressCollecter)
struct components_t {
nsCID cid;
nsIGenericFactory::ConstructorProcPtr constructor;
const char *progid;
const char *description;
};
static components_t components[] =
{
{ NS_ADDRESSBOOK_CID, &nsAddressBookConstructor, NS_ADDRESSBOOK_PROGID, },
{ NS_ABDIRECTORYDATASOURCE_CID, &nsAbDirectoryDataSourceConstructor, NS_ABDIRECTORYDATASOURCE_PROGID, },
{ NS_ABDIRECTORY_CID, &nsAbDirectoryConstructor, NS_ABDIRECTORY_PROGID, },
{ NS_ABCARDDATASOURCE_CID, &nsAbCardDataSourceConstructor, NS_ABCARDDATASOURCE_PROGID, },
{ NS_ABCARD_CID, &nsAbCardConstructor, NS_ABCARD_PROGID, },
{ NS_ADDRDATABASE_CID, &nsAddrDatabaseConstructor, NS_ADDRDATABASE_PROGID, },
{ NS_ABCARDPROPERTY_CID, &nsAbCardPropertyConstructor, NS_ABCARDPROPERTY_PROGID, },
{ NS_ABDIRPROPERTY_CID, &nsAbDirPropertyConstructor, NS_ABDIRPROPERTY_PROGID, },
{ NS_ADDRBOOKSESSION_CID, &nsAddrBookSessionConstructor, NS_ADDRBOOKSESSION_PROGID, },
{ NS_ABAUTOCOMPLETESESSION_CID, &nsAbAutoCompleteSessionConstructor, NS_ABAUTOCOMPLETESESSION_PROGID, },
{ NS_ABADDRESSCOLLECTER_CID, &nsAbAddressCollecterConstructor, NS_ABADDRESSCOLLECTER_PROGID, },
};
NS_IMPL_MODULE(components)
NS_IMPL_NSGETMODULE(nsModule)

View File

@@ -1,21 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
#include "MacPrefix.h"

View File

@@ -1,21 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
#include "MacPrefix_debug.h"

View File

@@ -1,22 +0,0 @@
#!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=..\..
DIRS=public src prefs build resources
include <$(DEPTH)\config\rules.mak>

View File

@@ -1,28 +0,0 @@
#
# 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
DIRS = resources
include $(topsrcdir)/config/rules.mk

View File

@@ -1,22 +0,0 @@
#!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=..\..\..
DIRS= resources
include <$(DEPTH)\config\rules.mak>

View File

@@ -1,28 +0,0 @@
#
# 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
DIRS = content locale
include $(topsrcdir)/config/rules.mk

View File

@@ -1,19 +0,0 @@
# 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.
#
# This is a list of local files which get copied to the res\mailnews\messenger directory
#
pref-addressing.xul

View File

@@ -1,37 +0,0 @@
#
# 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
SAMPLES_DIR = $(DIST)/bin/chrome/addressbook/content/default
EXPORT_RESOURCE_SAMPLES = \
pref-addressing.xul \
$(NULL)
include $(topsrcdir)/config/rules.mk
GARBAGE += $(addprefix $(SAMPLES_DIR)/, $(EXPORT_RESOURCE_SAMPLES))
install::
$(INSTALL) $(addprefix $(srcdir)/, $(EXPORT_RESOURCE_SAMPLES)) $(SAMPLES_DIR)

View File

@@ -1,26 +0,0 @@
#!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=..\..\..\..\..
include <$(DEPTH)\config\rules.mak>
install::
$(MAKE_INSTALL) pref-addressing.xul $(DIST)\bin\chrome\addressbook\content\default
clobber::
rm -f $(DIST)\chrome\addressbook\content\default\pref-addressing.xul

View File

@@ -1,66 +0,0 @@
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://pref/skin/pref.css" type="text/css"?>
<!DOCTYPE window SYSTEM "chrome://addressbook/locale/pref-addressing.dtd">
<window xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
onload="StartUp('Mailnews-Main')" >
<html:script language="javascript" src="chrome://pref/content/PrefsWindow.js"/>
<html:div flex="100%">
<html:div id="top">
<html:span id="lefttext">&pane.title;</html:span>
</html:div>
&pinpoint.label;
<html:form>
<html:table>
<html:tr><html:td>&lookFor.label;</html:td></html:tr>
<html:tr><html:td>
<html:input type="checkbox"/>
<html:label>&padCheck.label;</html:label>
</html:td></html:tr>
<html:tr><html:td>
<html:input type="checkbox"/>
<html:label>&dirCheck.label;</html:label>
</html:td></html:tr>
<html:tr><html:td>
<html:select>
<html:option>&nsbook.label;</html:option>
</html:select>
</html:td></html:tr>
<html:tr><html:td>&mulFound.label;</html:td></html:tr>
<html:tr><html:td>
<html:input name="multilist" type="radio"/>
<html:label>&showList.label;</html:label>
</html:td></html:tr>
<html:tr><html:td>
<html:input name="multilist" type="radio"/>
<html:label>&acceptList.label;</html:label>
</html:td></html:tr>
<html:tr><html:td>&oneMatch.label;</html:td></html:tr>
<html:tr><html:td>
<html:input type="checkbox"/>
<html:label>&useAddress.label;</html:label>
</html:td></html:tr>
</html:table>
</html:form>
&displayFullname.label;
<html:form>
<html:table>
<html:tr><html:td>
<html:input name="displayname" type="radio" id="pref:0:int:mail.addr_book.lastnamefirst" checked="true"/>
<html:label>&useDisplayName.label;</html:label>
</html:td></html:tr>
<html:tr><html:td>
<html:input name="displayname" type="radio" id="pref:1:int:mail.addr_book.lastnamefirst"/>
<html:label>&useLastFirst.label;</html:label>
</html:td></html:tr>
</html:table>
</html:form>
</html:div>
</window>

View File

@@ -1,28 +0,0 @@
#
# 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
DIRS = en-US
include $(topsrcdir)/config/rules.mk

View File

@@ -1 +0,0 @@
pref-addressing.dtd

View File

@@ -1,29 +0,0 @@
#
# 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/rules.mk
install::
$(INSTALL) $(srcdir)/pref-addressing.dtd $(DIST)/bin/chrome/addressbook/locale/en-US

View File

@@ -1,29 +0,0 @@
#!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=..\..\..\..\..\..
include <$(DEPTH)\config\rules.mak>
DISTBROWSER=$(DIST)\bin\chrome\addressbook\locale\en-US
install::
$(MAKE_INSTALL) pref-addressing.dtd $(DISTBROWSER)
clobber::
rm -f $(DIST)\bin\chrome\addressbook\locale\en-US\pref-addressing.dtd

View File

@@ -1,35 +0,0 @@
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<!ENTITY window.title "Addressing">
<!ENTITY pane.title "Addressing">
<!ENTITY pinpoint.label "Pinpoint Addressing">
<!ENTITY lookFor.label "Look for addresses in the following">
<!ENTITY padCheck.label "Address Books">
<!ENTITY dirCheck.label "Directory Server">
<!ENTITY nsbook.label "Netscape Phonebook">
<!ENTITY mulFound.label "When there are multiple addresses found:">
<!ENTITY showList.label "Show me a list of choices">
<!ENTITY acceptList.label "Accept what I have typed">
<!ENTITY oneMatch.label "If there is one match in your personal address books:">
<!ENTITY useAddress.label "Use the address and do not search in the directory">
<!ENTITY displayFullname.label "When displaying full names:">
<!ENTITY useDisplayName.label "Show names using display name (from address book card)">
<!ENTITY useLastFirst.label "Show names using last name, first name">

View File

@@ -1,22 +0,0 @@
#!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=..\..\..\..\..
DIRS= en-US
include <$(DEPTH)\config\rules.mak>

View File

@@ -1,22 +0,0 @@
#!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=..\..\..\..
DIRS= content locale
include <$(DEPTH)\config\rules.mak>

View File

@@ -1,18 +0,0 @@
# 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.
#
# This is a list of local files which get copied to the mozilla:dist:mailnews directory
#

View File

@@ -1,6 +0,0 @@
#
# This is a list of local files which get copied to the mozilla:dist:idl directory
#
nsIAbAddressCollecter.idl

View File

@@ -1,43 +0,0 @@
#
# 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
MODULE = addrbook
XPIDLSRCS = \
nsIAbListener.idl \
nsIAbDirectory.idl \
nsIAbCard.idl \
nsIAddrDBAnnouncer.idl \
nsIAddrDBListener.idl \
nsIAddrDatabase.idl \
nsIAddressBook.idl \
nsIAbBase.idl \
nsIAddrBookSession.idl \
nsIAutoCompleteListener.idl \
nsIAutoCompleteSession.idl \
nsIAbAddressCollecter.idl \
$(NULL)
include $(topsrcdir)/config/rules.mk

View File

@@ -1,39 +0,0 @@
#!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=..\..\..
MODULE=addrbook
XPIDLSRCS = \
.\nsIAbListener.idl \
.\nsIAbBase.idl \
.\nsIAbDirectory.idl \
.\nsIAbCard.idl \
.\nsIAddrDBAnnouncer.idl \
.\nsIAddrDBListener.idl \
.\nsIAddrDatabase.idl \
.\nsIAddressBook.idl \
.\nsIAddrBookSession.idl \
.\nsIAutoCompleteSession.idl \
.\nsIAutoCompleteListener.idl \
.\nsIAbAddressCollecter.idl \
$(NULL)
include <$(DEPTH)\config\rules.mak>
include <$(DEPTH)\config\config.mak>

View File

@@ -1,28 +0,0 @@
/* -*- Mode: IDL; tab-width: 4; 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) 1999 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "nsISupports.idl"
[scriptable, uuid(fe04c8e6-501e-11d3-a527-0060b0fc04b7)]
interface nsIAbAddressCollecter : nsISupports {
void CollectAddress(in string address);
};

View File

@@ -1,35 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
#include "nsICollection.idl"
[scriptable, uuid(013DD009-F73B-11d2-A2DA-001083003D0C)]
interface nsIAbBase : nsICollection {
readonly attribute string URI;
attribute string name;
nsISupports GetChildNamed(in string name);
attribute nsIAbBase parent;
nsIEnumerator GetChildNodes();
void AddUnique(in nsISupports element);
void ReplaceElement(in nsISupports element, in nsISupports newElement);
};

View File

@@ -1,97 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
#include "nsISupports.idl"
interface nsIAddrDatabase;
[ptr] native nsVoidArray(nsVoidArray);
%{C++
#include "nsVoidArray.h"
%}
[scriptable, uuid(FA5C977F-04C8-11d3-A2EB-001083003D0C)]
interface nsIAbCard : nsISupports {
attribute wstring FirstName;
attribute wstring LastName;
attribute wstring DisplayName;
attribute wstring NickName;
attribute wstring PrimaryEmail;
attribute wstring SecondEmail;
attribute wstring WorkPhone;
attribute wstring HomePhone;
attribute wstring FaxNumber;
attribute wstring PagerNumber;
attribute wstring CellularNumber;
attribute wstring HomeAddress;
attribute wstring HomeAddress2;
attribute wstring HomeCity;
attribute wstring HomeState;
attribute wstring HomeZipCode;
attribute wstring HomeCountry;
attribute wstring WorkAddress;
attribute wstring WorkAddress2;
attribute wstring WorkCity;
attribute wstring WorkState;
attribute wstring WorkZipCode;
attribute wstring WorkCountry;
attribute wstring JobTitle;
attribute wstring Department;
attribute wstring Company;
attribute wstring WebPage1;
attribute wstring WebPage2;
attribute wstring BirthYear;
attribute wstring BirthMonth;
attribute wstring BirthDay;
attribute wstring Custom1;
attribute wstring Custom2;
attribute wstring Custom3;
attribute wstring Custom4;
attribute wstring Notes;
attribute unsigned long LastModifiedDate;
attribute boolean SendPlainText;
attribute unsigned long DbTableID;
attribute unsigned long DbRowID;
void GetCardValue(in string attrname, out wstring value);
void SetCardValue(in string attrname, in wstring value);
void SetAbDatabase(in nsIAddrDatabase database);
[noscript] void GetAnonymousStrAttrubutesList(out nsVoidArray attrlist);
[noscript] void GetAnonymousStrValuesList(out nsVoidArray valuelist);
[noscript] void GetAnonymousIntAttrubutesList(out nsVoidArray attrlist);
[noscript] void GetAnonymousIntValuesList(out nsVoidArray valuelist);
[noscript] void GetAnonymousBoolAttrubutesList(out nsVoidArray attrlist);
[noscript] void GetAnonymousBoolValuesList(out nsVoidArray valuelist);
void SetAnonymousStringAttribute(in string attrname, in string value);
void SetAnonymousIntAttribute(in string attrname, in unsigned long value);
void SetAnonymousBoolAttribute(in string attrname, in boolean value);
void AddAnonymousAttributesToDB();
void EditAnonymousAttributesInDB();
void GetCardURI(out string uri);
void AddCardToDatabase(in string uri);
void EditCardToDatabase(in string uri);
void CopyCard(in nsIAbCard srcCard);
void GetCollationKey(in wstring str, out wstring key);
};

View File

@@ -1,51 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
#include "nsISupports.idl"
#include "nsIAbCard.idl"
#include "nsISupportsArray.idl"
[ptr] native nsFileSpec(nsFileSpec);
[ptr] native DIR_Server(DIR_Server);
%{C++
#include "nsFileSpec.h"
#include "nsDirPrefs.h"
%}
[scriptable, uuid(1920E485-0709-11d3-A2EC-001083003D0C)]
interface nsIAbDirectory : nsISupports {
attribute wstring DirName;
attribute unsigned long LastModifiedDate;
attribute DIR_Server server;
void GetDirFilePath(out string dbPath);
void GetChildNodes(out nsIEnumerator childList);
void GetChildCards(out nsIEnumerator childCards);
void AddChildCards(in string uriName, out nsIAbCard childCard);
void AddDirectory(in string uriName, out nsIAbDirectory childDir);
void DeleteDirectories(in nsISupportsArray dierctories);
void DeleteCards(in nsISupportsArray cards);
void HasCard(in nsIAbCard cards, out boolean hasCard);
void HasDirectory(in nsIAbDirectory dir, out boolean hasDir);
void GetMailingList(out nsIEnumerator mailingList);
void CreateNewDirectory(in wstring dirName, in string fileName);
void GetDirUri(out string uri);
};

View File

@@ -1,29 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
#include "nsISupports.idl"
#include "nsIEnumerator.idl"
[scriptable, uuid(1920E484-0709-11d3-A2EC-001083003D0C)]
interface nsIAbListener : nsISupports {
void OnItemAdded(in nsISupports parentDir, in nsISupports item);
void OnItemRemoved(in nsISupports parentDir, in nsISupports item);
void OnItemPropertyChanged(in nsISupports item, in string property, in wstring oldValue, in wstring newValue);
};

View File

@@ -1,49 +0,0 @@
/* -*- Mode: IDL; tab-width: 4; 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.
*/
#include "nsISupports.idl"
/*
* The mail session is a replacement for the old 4.x MSG_Master object. It
* contains mail session generic information such as the account manager, etc
* I'm starting this off as an empty interface and as people feel they need to
* add more information to it, they can. I think this is a better approach
* than trying to port over the old MSG_Master in its entirety as that had a
* lot of cruft in it....
*/
#include "nsISupports.idl"
#include "nsIAbListener.idl"
#include "nsIAbDirectory.idl"
#include "nsIAbCard.idl"
[scriptable, uuid(C5339441-303F-11d3-9E13-00A0C92B5F0D)]
interface nsIAddrBookSession : nsISupports {
void AddAddressBookListener(in nsIAbListener listener);
void RemoveAddressBookListener(in nsIAbListener listener);
void NotifyItemPropertyChanged(in nsISupports item,
in string property,
in wstring oldValue,
in wstring newValue);
void NotifyDirectoryItemAdded(in nsIAbDirectory directory, in nsISupports item);
void NotifyDirectoryItemDeleted(in nsIAbDirectory directory, in nsISupports item);
[noscript] void GetUserProfileDirectory(out nsFileSpec userDir);
};

View File

@@ -1,37 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
#include "nsISupports.idl"
#include "nsIAbCard.idl"
interface nsIAddrDBListener;
[scriptable, uuid(A4186D8A-1DD0-11d3-A303-001083003D0C)]
interface nsIAddrDBAnnouncer : nsISupports {
void AddListener(in nsIAddrDBListener listener);
void RemoveListener(in nsIAddrDBListener listener);
void NotifyCardAttribChange(in unsigned long abCode,
in nsIAddrDBListener instigator);
void NotifyCardEntryChange (in unsigned long abCode,
in nsIAbCard card,
in nsIAddrDBListener instigator);
void NotifyAnnouncerGoingAway();
};

View File

@@ -1,32 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
#include "nsISupports.idl"
#include "nsIAbCard.idl"
interface nsIAddrDBAnnouncer;
[scriptable, uuid(A4186D89-1DD0-11d3-A303-001083003D0C)]
interface nsIAddrDBListener : nsISupports {
void OnCardAttribChange(in unsigned long abCode,
in nsIAddrDBListener instigator);
void OnCardEntryChange (in unsigned long abCode,
in nsIAbCard card,
in nsIAddrDBListener instigator);
void OnAnnouncerGoingAway(in nsIAddrDBAnnouncer instigator);
};

View File

@@ -1,109 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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.
*/
/* nsFileSpec is declared in nsIAbDirectory.idl */
#include "nsIAddrDBAnnouncer.idl"
#include "nsIAbCard.idl"
#include "nsIAbDirectory.idl"
[ptr] native nsIMdbTableRowCursor(nsIMdbTableRowCursor);
[ptr] native nsIMdbEnv(nsIMdbEnv);
[ptr] native nsIMdbRow(nsIMdbRow);
%{C++
#include "mdb.h"
%}
[scriptable, uuid(A4186D8B-1DD0-11d3-A303-001083003D0C)]
interface nsIAddrDatabase : nsIAddrDBAnnouncer {
attribute nsFileSpec dbPath;
[noscript] void Open(in nsFileSpec folderName, in boolean create,
out nsIAddrDatabase pCardDB, in boolean upgrading);
void Close(in boolean forceCommit);
[noscript] void OpenMDB(in nsFileSpec dbName, in boolean create);
void CloseMDB(in boolean commit);
void OpenAnonymousDB(out nsIAddrDatabase pCardDB);
void CloseAnonymousDB(in boolean forceCommit);
void Commit(in unsigned long commitType);
void ForceClosed();
void CreateNewCardAndAddToDB(in nsIAbCard newCard, in boolean beNotify);
void EnumerateCards(in nsIAbDirectory directory, out nsIEnumerator result);
void EnumerateMailingLists(in nsIAbDirectory directory, out nsIEnumerator result);
void DeleteCard(in nsIAbCard card, in boolean beNotify);
void EditCard(in nsIAbCard card, in boolean beNotify);
void ContainsCard(in nsIAbCard card, out boolean hasCard);
void GetCardForEmailAddress(in nsIAbDirectory directory, in string emailAddress, out nsIAbCard card);
void SetAnonymousStringAttribute(in string attrname, in string value);
void GetAnonymousStringAttribute(in string attrname, out string value);
void SetAnonymousIntAttribute(in string attrname, in unsigned long value);
void GetAnonymousIntAttribute(in string attrname, out unsigned long value);
void SetAnonymousBoolAttribute(in string attrname, in boolean value);
void GetAnonymousBoolAttribute(in string attrname, out boolean value);
void AddAnonymousAttributesToDB();
void RemoveAnonymousAttributesFromDB();
void EditAnonymousAttributesInDB();
void AddAnonymousAttributesFromCard(in nsIAbCard card);
void RemoveAnonymousAttributesFromCard(in nsIAbCard card);
void EditAnonymousAttributesFromCard(in nsIAbCard card);
[noscript] void GetNewRow(out nsIMdbRow newRow);
[noscript] void AddCardRowToDB(in nsIMdbRow newRow);
[noscript] void AddFirstName(in nsIMdbRow row, in string value);
[noscript] void AddLastName(in nsIMdbRow row, in string value);
[noscript] void AddDisplayName(in nsIMdbRow row, in string value);
[noscript] void AddNickName(in nsIMdbRow row, in string value);
[noscript] void AddPrimaryEmail(in nsIMdbRow row, in string value);
[noscript] void Add2ndEmail(in nsIMdbRow row, in string value);
[noscript] void AddWorkPhone(in nsIMdbRow row, in string value);
[noscript] void AddHomePhone(in nsIMdbRow row, in string value);
[noscript] void AddFaxNumber(in nsIMdbRow row, in string value);
[noscript] void AddPagerNumber(in nsIMdbRow row, in string value);
[noscript] void AddCellularNumber(in nsIMdbRow row, in string value);
[noscript] void AddHomeAddress(in nsIMdbRow row, in string value);
[noscript] void AddHomeAddress2(in nsIMdbRow row, in string value);
[noscript] void AddHomeCity(in nsIMdbRow row, in string value);
[noscript] void AddHomeState(in nsIMdbRow row, in string value);
[noscript] void AddHomeZipCode(in nsIMdbRow row, in string value);
[noscript] void AddHomeCountry(in nsIMdbRow row, in string value);
[noscript] void AddWorkAddress(in nsIMdbRow row, in string value);
[noscript] void AddWorkAddress2(in nsIMdbRow row, in string value);
[noscript] void AddWorkCity(in nsIMdbRow row, in string value);
[noscript] void AddWorkState(in nsIMdbRow row, in string value);
[noscript] void AddWorkZipCode(in nsIMdbRow row, in string value);
[noscript] void AddWorkCountry(in nsIMdbRow row, in string value);
[noscript] void AddJobTitle(in nsIMdbRow row, in string value);
[noscript] void AddDepartment(in nsIMdbRow row, in string value);
[noscript] void AddCompany(in nsIMdbRow row, in string value);
[noscript] void AddWebPage1(in nsIMdbRow row, in string value);
[noscript] void AddWebPage2(in nsIMdbRow row, in string value);
[noscript] void AddBirthYear(in nsIMdbRow row, in string value);
[noscript] void AddBirthMonth(in nsIMdbRow row, in string value);
[noscript] void AddBirthDay(in nsIMdbRow row, in string value);
[noscript] void AddCustom1(in nsIMdbRow row, in string value);
[noscript] void AddCustom2(in nsIMdbRow row, in string value);
[noscript] void AddCustom3(in nsIMdbRow row, in string value);
[noscript] void AddCustom4(in nsIMdbRow row, in string value);
[noscript] void AddNotes(in nsIMdbRow row, in string value);
};

View File

@@ -1,43 +0,0 @@
/* -*- Mode: IDL; tab-width: 4; 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.
*/
#include "nsISupports.idl"
#include "xulstubs.idl"
#include "nsIRDFCompositeDataSource.idl"
#include "nsIAbCard.idl"
%{C++
#include "nsIDOMNodeList.h"
#include "nsIDOMXULElement.h"
%}
interface nsIDOMWindow;
[scriptable, uuid(D60B84F1-2A8C-11d3-9E07-00A0C92B5F0D)]
interface nsIAddressBook : nsISupports {
void DeleteCards(in nsIDOMXULElement tree, in nsIDOMXULElement srcDir, in nsIDOMNodeList node);
void NewAddressBook(in nsIRDFCompositeDataSource db, in nsIDOMXULElement srcDir, in wstring name);
void DeleteAddressBooks(in nsIRDFCompositeDataSource db, in nsIDOMXULElement srcDir, in nsIDOMNodeList node);
void PrintCard();
void PrintAddressbook();
void SetWebShellWindow(in nsIDOMWindow win);
void ImportAddressBook();
};

View File

@@ -1,26 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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) 1999 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "nsISupports.idl"
#include "nsrootidl.idl"
[scriptable, uuid(CA2A6B08-3625-11d3-988E-001083010E9B)]
interface nsIAutoCompleteListener : nsISupports {
void OnAutoCompleteResult(in nsISupports aParam, in wstring aOriginalString, in wstring aMatch);
};

View File

@@ -1,28 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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) 1999 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "nsISupports.idl"
#include "nsrootidl.idl"
interface nsIAutoCompleteListener;
[scriptable, uuid(CA2A6B07-3625-11d3-988E-001083010E9B)]
interface nsIAutoCompleteSession : nsISupports {
void AutoComplete(in nsISupports aParam, in wstring aSearchString, in nsIAutoCompleteListener aResultListener);
};

View File

@@ -1,28 +0,0 @@
#
# 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
DIRS = content locale skin
include $(topsrcdir)/config/rules.mk

View File

@@ -1,33 +0,0 @@
# 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.
#
# This is a list of local files which get copied to the res\mailnews\messenger directory
#
abAddressBookNameDialog.js
abAddressBookNameDialog.xul
abCardOverlay.js
abCardOverlay.xul
abCardViewOverlay.js
abCardViewOverlay.xul
abCommon.js
abDirTreeOverlay.xul
abEditCardDialog.xul
abNewCardDialog.xul
abResultsTreeOverlay.xul
abSelectAddressesDialog.js
abSelectAddressesDialog.xul
addressbook.js
addressbook.xul

View File

@@ -1,51 +0,0 @@
#
# 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
SAMPLES_DIR = $(DIST)/bin/chrome/addressbook/content/default
EXPORT_RESOURCE_SAMPLES = \
abAddressBookNameDialog.js \
abAddressBookNameDialog.xul \
abCardOverlay.js \
abCardOverlay.xul \
abCardViewOverlay.js \
abCardViewOverlay.xul \
abCommon.js \
abDirTreeOverlay.xul \
abEditCardDialog.xul \
abNewCardDialog.xul \
abResultsTreeOverlay.xul \
abSelectAddressesDialog.js \
abSelectAddressesDialog.xul \
addressbook.js \
addressbook.xul \
$(NULL)
include $(topsrcdir)/config/rules.mk
GARBAGE += $(addprefix $(SAMPLES_DIR)/, $(EXPORT_RESOURCE_SAMPLES))
install::
$(INSTALL) $(addprefix $(srcdir)/, $(EXPORT_RESOURCE_SAMPLES)) $(SAMPLES_DIR)

View File

@@ -1,37 +0,0 @@
var okCallback = 0;
function abNameOnLoad()
{
doSetOKCancel(abNameOKButton, 0);
// look in arguments[0] for parameters
if (window.arguments && window.arguments[0])
{
if ( window.arguments[0].title )
{
dump("title = " + window.arguments[0].title + "\n");
var title = window.arguments[0].title;
top.window.title = title;
}
if ( window.arguments[0].okCallback )
top.okCallback = window.arguments[0].okCallback;
}
// focus on input
var name = document.getElementById('name');
if ( name )
name.focus();
}
function abNameOKButton()
{
if ( top.okCallback )
{
var name = document.getElementById('name').value;
top.okCallback(name);
}
return true;
}

View File

@@ -1,51 +0,0 @@
<?xml version="1.0"?>
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<?xul-overlay href="chrome://global/content/dialogOverlay.xul"?>
<!DOCTYPE window SYSTEM "chrome://addressbook/locale/abAddressBookNameDialog.dtd">
<window xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
align="vertical"
class="dialog"
onload="abNameOnLoad()"
style="padding:10px">
<html:script language="JavaScript" src="chrome://addressbook/content/abAddressBookNameDialog.js"/>
<keyset id="keyset"/>
<box align="vertical" style="width:36em; min-height:12em">
<spring flex="100%"/>
<html:div style="margin-bottom:.3em">&name.label;</html:div>
<html:input tabindex="0" type="text" id="name" style="width:100%"/>
<spring flex="100%"/>
<box id="okCancelButtons"/>
</box>
</window>

View File

@@ -1,303 +0,0 @@
var editCard;
var newCardTitlePrefix = "New Card for ";
var editCardTitlePrefix = "Card for ";
var editCardFirstLastSeparator = " ";
var editCardLastFirstSeparator = ", ";
function OnLoadNewCard()
{
InitEditCard();
doSetOKCancel(NewCardOKButton, 0);
editCard.card = 0;
editCard.okCallback = 0;
editCard.titlePrefix = newCardTitlePrefix;
if (window.arguments && window.arguments[0])
{
if ( window.arguments[0].selectedAB )
editCard.selectedAB = window.arguments[0].selectedAB;
}
// set popup with address book names
var abPopup = document.getElementById('abPopup');
if ( editCard.selectedAB )
abPopup.value = editCard.selectedAB;
//// FIX ME - looks like we need to focus on both the text field and the tab widget
//// probably need to do the same in the addressing widget
// focus on first name
var firstName = document.getElementById('FirstName');
if ( firstName )
firstName.focus();
}
function OnLoadEditCard()
{
InitEditCard();
doSetOKCancel(EditCardOKButton, 0);
editCard.titlePrefix = editCardTitlePrefix;
if (window.arguments && window.arguments[0])
{
if ( window.arguments[0].card )
editCard.card = window.arguments[0].card;
if ( window.arguments[0].okCallback )
editCard.okCallback = window.arguments[0].okCallback;
if ( window.arguments[0].abURI )
editCard.abURI = window.arguments[0].abURI;
}
// set global state variables
// if first or last name entered, disable generateDisplayName
if ( editCard.generateDisplayName && (editCard.card.FirstName.length +
editCard.card.LastName.length +
editCard.card.DisplayName.length > 0) )
{
editCard.generateDisplayName = false;
}
GetCardValues(editCard.card, document);
top.window.title = editCard.titlePrefix + editCard.card.DisplayName;
}
function InitEditCard()
{
// create editCard object that contains global variables for editCard.js
editCard = new Object;
// get pointer to nsIPref object
var prefs = Components.classes["component://netscape/preferences"];
if ( prefs )
{
prefs = prefs.getService();
if ( prefs )
{
prefs = prefs.QueryInterface(Components.interfaces.nsIPref);
editCard.prefs = prefs;
}
}
// get specific prefs that editCard will need
if ( prefs )
{
try {
editCard.displayLastNameFirst = prefs.GetBoolPref("mail.addr_book.lastnamefirst");
}
catch (ex) {
dump("failed to get the mail.addr_book.lastnamefirst pref\n");
}
try {
editCard.generateDisplayName = prefs.GetBoolPref("mail.addr_book.displayName.autoGeneration");
}
catch (ex) {
dump("failed to get the mail.addr_book.displayName.autoGeneration pref\n");
}
}
}
function NewCardOKButton()
{
var popup = document.getElementById('abPopup');
if ( popup )
{
var uri = popup.value;
// FIX ME - hack to avoid crashing if no ab selected because of blank option bug from template
// should be able to just remove this if we are not seeing blank lines in the ab popup
if ( !uri )
return false; // don't close window
// -----
var cardproperty = Components.classes["component://netscape/addressbook/cardproperty"].createInstance();
cardproperty = cardproperty.QueryInterface(Components.interfaces.nsIAbCard);
if ( cardproperty )
{
SetCardValues(cardproperty, document);
cardproperty.AddCardToDatabase(uri);
}
}
return true; // close the window
}
function EditCardOKButton()
{
SetCardValues(editCard.card, document);
editCard.card.EditCardToDatabase(editCard.abURI);
// callback to allow caller to update
if ( editCard.okCallback )
editCard.okCallback();
return true; // close the window
}
// Move the data from the cardproperty to the dialog
function GetCardValues(cardproperty, doc)
{
if ( cardproperty )
{
doc.getElementById('FirstName').value = cardproperty.FirstName;
doc.getElementById('LastName').value = cardproperty.LastName;
doc.getElementById('DisplayName').value = cardproperty.DisplayName;
doc.getElementById('NickName').value = cardproperty.NickName;
doc.getElementById('PrimaryEmail').value = cardproperty.PrimaryEmail;
doc.getElementById('SecondEmail').value = cardproperty.SecondEmail;
//doc.getElementById('SendPlainText').value = cardproperty.SendPlainText;
doc.getElementById('WorkPhone').value = cardproperty.WorkPhone;
doc.getElementById('HomePhone').value = cardproperty.HomePhone;
doc.getElementById('FaxNumber').value = cardproperty.FaxNumber;
doc.getElementById('PagerNumber').value = cardproperty.PagerNumber;
doc.getElementById('CellularNumber').value = cardproperty.CellularNumber;
doc.getElementById('HomeAddress').value = cardproperty.HomeAddress;
doc.getElementById('HomeAddress2').value = cardproperty.HomeAddress2;
doc.getElementById('HomeCity').value = cardproperty.HomeCity;
doc.getElementById('HomeState').value = cardproperty.HomeState;
doc.getElementById('HomeZipCode').value = cardproperty.HomeZipCode;
doc.getElementById('HomeCountry').value = cardproperty.HomeCountry;
doc.getElementById('JobTitle').value = cardproperty.JobTitle;
doc.getElementById('Department').value = cardproperty.Department;
doc.getElementById('Company').value = cardproperty.Company;
doc.getElementById('WorkAddress').value = cardproperty.WorkAddress;
doc.getElementById('WorkAddress2').value = cardproperty.WorkAddress2;
doc.getElementById('WorkCity').value = cardproperty.WorkCity;
doc.getElementById('WorkState').value = cardproperty.WorkState;
doc.getElementById('WorkZipCode').value = cardproperty.WorkZipCode;
doc.getElementById('WorkCountry').value = cardproperty.WorkCountry;
doc.getElementById('WebPage1').value = cardproperty.WebPage1;
doc.getElementById('Custom1').value = cardproperty.Custom1;
doc.getElementById('Custom2').value = cardproperty.Custom2;
doc.getElementById('Custom3').value = cardproperty.Custom3;
doc.getElementById('Custom4').value = cardproperty.Custom4;
doc.getElementById('Notes').value = cardproperty.Notes;
}
}
// Move the data from the dialog to the cardproperty to be stored in the database
function SetCardValues(cardproperty, doc)
{
if (cardproperty)
{
cardproperty.FirstName = doc.getElementById('FirstName').value;
cardproperty.LastName = doc.getElementById('LastName').value;
cardproperty.DisplayName = doc.getElementById('DisplayName').value;
cardproperty.NickName = doc.getElementById('NickName').value;
cardproperty.PrimaryEmail = doc.getElementById('PrimaryEmail').value;
cardproperty.SecondEmail = doc.getElementById('SecondEmail').value;
//cardproperty.SendPlainText = doc.getElementById('SendPlainText').value;
cardproperty.WorkPhone = doc.getElementById('WorkPhone').value;
cardproperty.HomePhone = doc.getElementById('HomePhone').value;
cardproperty.FaxNumber = doc.getElementById('FaxNumber').value;
cardproperty.PagerNumber = doc.getElementById('PagerNumber').value;
cardproperty.CellularNumber = doc.getElementById('CellularNumber').value;
cardproperty.HomeAddress = doc.getElementById('HomeAddress').value;
cardproperty.HomeAddress2 = doc.getElementById('HomeAddress2').value;
cardproperty.HomeCity = doc.getElementById('HomeCity').value;
cardproperty.HomeState = doc.getElementById('HomeState').value;
cardproperty.HomeZipCode = doc.getElementById('HomeZipCode').value;
cardproperty.HomeCountry = doc.getElementById('HomeCountry').value;
cardproperty.JobTitle = doc.getElementById('JobTitle').value;
cardproperty.Department = doc.getElementById('Department').value;
cardproperty.Company = doc.getElementById('Company').value;
cardproperty.WorkAddress = doc.getElementById('WorkAddress').value;
cardproperty.WorkAddress2 = doc.getElementById('WorkAddress2').value;
cardproperty.WorkCity = doc.getElementById('WorkCity').value;
cardproperty.WorkState = doc.getElementById('WorkState').value;
cardproperty.WorkZipCode = doc.getElementById('WorkZipCode').value;
cardproperty.WorkCountry = doc.getElementById('WorkCountry').value;
cardproperty.WebPage1 = doc.getElementById('WebPage1').value;
cardproperty.Custom1 = doc.getElementById('Custom1').value;
cardproperty.Custom2 = doc.getElementById('Custom2').value;
cardproperty.Custom3 = doc.getElementById('Custom3').value;
cardproperty.Custom4 = doc.getElementById('Custom4').value;
cardproperty.Notes = doc.getElementById('Notes').value;
}
}
function NewCardCancelButton()
{
top.window.close();
}
function EditCardCancelButton()
{
top.window.close();
}
function GenerateDisplayName()
{
if ( editCard.generateDisplayName )
{
var displayName;
var firstNameField = document.getElementById('FirstName');
var lastNameField = document.getElementById('LastName');
var displayNameField = document.getElementById('DisplayName');
/* todo: i18N work todo here */
/* this used to be XP_GetString(MK_ADDR_FIRST_LAST_SEP) */
/* todo: mscott says there was a pref in 4.5 that would */
/* cause GenerateDisplayName() to do nothing. */
/* the i18N people need it. */
/* find the pref and heed it. */
/* trying to be smart about no using the first last sep */
/* if first or last is missing */
/* todo: is this i18N safe? */
var separator = "";
if ( lastNameField.value && firstNameField.value )
{
if ( editCard.displayLastNameFirst )
separator = editCardLastFirstSeparator;
else
separator = editCardFirstLastSeparator;
}
if ( editCard.displayLastNameFirst )
displayName = lastNameField.value + separator + firstNameField.value;
else
displayName = firstNameField.value + separator + lastNameField.value;
displayNameField.value = displayName;
top.window.title = editCard.titlePrefix + displayName;
}
}
function DisplayNameChanged()
{
// turn off generateDisplayName if the user changes the display name
editCard.generateDisplayName = false;
var title = editCard.titlePrefix + document.getElementById('DisplayName').value;
if ( top.window.title != title )
top.window.title = title;
}

View File

@@ -1,293 +0,0 @@
<?xml version="1.0"?>
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<!DOCTYPE window SYSTEM "chrome://addressbook/locale/abCardOverlay.dtd">
<overlay id="editcardOverlay"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<html:script language="JavaScript" src="chrome://addressbook/content/abCardOverlay.js"/>
<box id="editcard" align="vertical">
<tabcontrol align="vertical" style="margin:5px">
<tabbox align="horizontal">
<tab>&Name.tab;</tab>
<tab>&Address.tab;</tab>
<tab>&Other.tab;</tab>
</tabbox>
<tabpanel align="vertical" flex="100%" style="border:2px groove white">
<!-- ** Name Tab ** -->
<box index="name" align="vertical" flex="100%">
<html:fieldset flex="100%">
<html:legend align="left">
<html:div style="font-weight: bold">&Name.box;</html:div>
</html:legend>
<box align="vertical" style="width:100%">
<box align="horizontal" flex="100%">
<spring flex="100%"/>
<html:label for="FirstName">&FirstName.label;</html:label>
<html:input type="text" id="FirstName" class="CardEdit" onkeyup="top.GenerateDisplayName()" />
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="LastName">&LastName.label;</html:label>
<html:input id="LastName" type="text" class="CardEdit" onkeyup="top.GenerateDisplayName()"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="DisplayName">&DisplayName.label;</html:label>
<html:input id="DisplayName" type="text" class="CardEdit" onkeyup="top.DisplayNameChanged()"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="NickName">&NickName.label;</html:label>
<html:input id="NickName" type="text" class="CardEdit"/>
</box>
</box>
</html:fieldset>
<html:fieldset flex="100%">
<html:legend align="left">
<html:div style="font-weight: bold">&Internet.box;</html:div>
</html:legend>
<box align="vertical" style="width:100%">
<box align="horizontal">
<spring flex="100%"/>
<html:label for="PrimaryEmail">&PrimaryEmail.label;</html:label>
<html:input id="PrimaryEmail" type="text" class="CardEdit"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="SecondEmail">&SecondEmail.label;</html:label>
<html:input id="SecondEmail" type="text" class="CardEdit"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<box class="CardEditWidth">
<html:input id="SendPlainText" type="checkbox"/>
<html:label for="SendPlainText">&SendPlainText.label;</html:label>
</box>
</box>
</box>
</html:fieldset>
<html:fieldset flex="100%">
<html:legend align="left">
<html:div style="font-weight: bold">&Phones.box;</html:div>
</html:legend>
<box align="vertical" style="width:100%">
<box align="horizontal" style="vertical-align:baseline">
<spring flex="100%"/>
<html:label for="WorkPhone" style="vertical-align:baseline">&WorkPhone.label;</html:label>
<html:input id="WorkPhone" type="text" class="CardEdit" style="vertical-align:baseline"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="HomePhone">&HomePhone.label;</html:label>
<html:input id="HomePhone" type="text" class="CardEdit"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="FaxNumber">&FaxNumber.label;</html:label>
<html:input id="FaxNumber" type="text" class="CardEdit"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="PagerNumber">&PagerNumber.label;</html:label>
<html:input id="PagerNumber" type="text" class="CardEdit"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="CellularNumber">&CellularNumber.label;</html:label>
<html:input id="CellularNumber" type="text" class="CardEdit"/>
</box>
</box>
</html:fieldset>
</box>
<!-- ** Address Tab ** -->
<box index="address" align="vertical" flex="100%">
<html:fieldset flex="100%">
<html:legend align="left">
<html:div style="font-weight: bold">&Home.box;</html:div>
</html:legend>
<box align="vertical" style="width:100%">
<box align="horizontal">
<spring flex="100%"/>
<html:label for="HomeAddress">&HomeAddress.label;</html:label>
<html:input type="text" id="HomeAddress" class="CardEdit"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="HomeAddress2">&HomeAddress2.label;</html:label>
<html:input type="text" id="HomeAddress2" class="CardEdit"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="HomeCity">&HomeCity.label;</html:label>
<html:input id="HomeCity" type="text" class="CardEdit"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="HomeState">&HomeState.label;</html:label>
<box class="CardEditWidth">
<html:input id="HomeState" type="text" class="CardEdit" style="min-width:1em; width:8em"/>
<spring flex="100%"/>
<html:label for="HomeZipCode">&HomeZipCode.label;</html:label>
<html:input id="HomeZipCode" type="text" class="CardEdit" style="min-width:1em; width:8em"/>
</box>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="HomeCountry">&HomeCountry.label;</html:label>
<html:input id="HomeCountry" type="text" class="CardEdit"/>
</box>
</box>
</html:fieldset>
<html:fieldset style="width:100%">
<html:legend align="left">
<html:div style="font-weight: bold">&Work.box;</html:div>
</html:legend>
<box align="vertical" style="width:100%">
<box align="horizontal">
<spring flex="100%"/>
<html:label for="JobTitle">&JobTitle.label;</html:label>
<html:input type="text" id="JobTitle" class="CardEdit"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="Department">&Department.label;</html:label>
<html:input type="text" id="Department" class="CardEdit"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="Company">&Company.label;</html:label>
<html:input type="text" id="Company" class="CardEdit"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="WorkAddress">&WorkAddress.label;</html:label>
<html:input type="text" id="WorkAddress" class="CardEdit"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="WorkAddress2">&WorkAddress2.label;</html:label>
<html:input type="text" id="WorkAddress2" class="CardEdit"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="WorkCity">&WorkCity.label;</html:label>
<html:input id="WorkCity" type="text" class="CardEdit"/>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="WorkState">&WorkState.label;</html:label>
<box class="CardEditWidth">
<html:input id="WorkState" type="text" class="CardEdit" style="min-width:1em; width:8em"/>
<spring flex="100%"/>
<html:label for="WorkZipCode">&WorkZipCode.label;</html:label>
<html:input id="WorkZipCode" type="text" class="CardEdit" style="min-width:1em; width:8em"/>
</box>
</box>
<box align="horizontal">
<spring flex="100%"/>
<html:label for="WorkCountry">&WorkCountry.label;</html:label>
<html:input id="WorkCountry" type="text" class="CardEdit"/>
</box>
</box>
</html:fieldset>
<!--html:fieldset style="width:100%">
<html:legend align="left">
<html:div style="font-weight: bold">&Web.box;</html:div>
</html:legend-->
<box align="vertical" style="width:100%">
<box align="horizontal">
<!--spring flex="100%"/-->
<html:label for="WebPage1">&WebPage1.label;</html:label>
<html:input type="text" id="WebPage1" class="CardEdit" flex="100%"/>
</box>
</box>
<!--/html:fieldset-->
</box>
<!-- ** Other Tab ** -->
<box index="other" align="vertical" flex="100%">
<box align="vertical" style="width:100%">
<box align="horizontal" flex="100%">
<spring flex="100%"/>
<html:label for="Custom1">&Custom1.label;</html:label>
<html:input type="text" id="Custom1" class="CardEdit"/>
</box>
<box align="horizontal" flex="100%">
<spring flex="100%"/>
<html:label for="Custom2">&Custom2.label;</html:label>
<html:input type="text" id="Custom2" class="CardEdit"/>
</box>
<box align="horizontal" flex="100%">
<spring flex="100%"/>
<html:label for="Custom3">&Custom3.label;</html:label>
<html:input type="text" id="Custom3" class="CardEdit"/>
</box>
<box align="horizontal" flex="100%">
<spring flex="100%"/>
<html:label for="Custom4">&Custom4.label;</html:label>
<html:input type="text" id="Custom4" class="CardEdit"/>
</box>
</box>
<html:fieldset style="width:100%">
<html:legend align="left">
<html:div style="font-weight: bold">&Notes.box;</html:div>
</html:legend>
<box align="vertical" style="width:100%">
<html:textarea id="Notes" rows="15"/>
</box>
</html:fieldset>
</box>
</tabpanel>
</tabcontrol>
</box>
</overlay>

View File

@@ -1,231 +0,0 @@
var zWork = "Work: ";
var zHome = "Home: ";
var zFax = "Fax: ";
var zCellular = "Cellular: ";
var zPager = "Pager: ";
var zCustom1 = "Custom 1: ";
var zCustom2 = "Custom 2: ";
var zCustom3 = "Custom 3: ";
var zCustom4 = "Custom 4: ";
var rdf;
var cvData;
function OnLoadCardView()
{
// This should be in an onload for the card view window, but that is not currently working
rdf = Components.classes["component://netscape/rdf/rdf-service"].getService();
rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
var doc = document;
/* data for address book, prefixes: "cvb" = card view box
"cvh" = crad view header
"cv" = card view (normal fields) */
cvData = new Object;
// Card View Box
cvData.CardViewBox = doc.getElementById("CardViewBox");
// Title
cvData.CardTitle = doc.getElementById("CardTitle");
// Name section
cvData.cvbName = doc.getElementById("cvbName");
cvData.cvhName = doc.getElementById("cvhName");
cvData.cvNickname = doc.getElementById("cvNickname");
cvData.cvEmail1 = doc.getElementById("cvEmail1");
cvData.cvEmail2 = doc.getElementById("cvEmail2");
// Home section
cvData.cvbHome = doc.getElementById("cvbHome");
cvData.cvhHome = doc.getElementById("cvhHome");
cvData.cvHomeAddress = doc.getElementById("cvHomeAddress");
cvData.cvHomeAddress2 = doc.getElementById("cvHomeAddress2");
cvData.cvHomeCityStZip = doc.getElementById("cvHomeCityStZip");
cvData.cvHomeCountry = doc.getElementById("cvHomeCountry");
// Other section
cvData.cvbOther = doc.getElementById("cvbOther");
cvData.cvhOther = doc.getElementById("cvhOther");
cvData.cvCustom1 = doc.getElementById("cvCustom1");
cvData.cvCustom2 = doc.getElementById("cvCustom2");
cvData.cvCustom3 = doc.getElementById("cvCustom3");
cvData.cvCustom4 = doc.getElementById("cvCustom4");
cvData.cvNotes = doc.getElementById("cvNotes");
// Phone section
cvData.cvbPhone = doc.getElementById("cvbPhone");
cvData.cvhPhone = doc.getElementById("cvhPhone");
cvData.cvPhWork = doc.getElementById("cvPhWork");
cvData.cvPhHome = doc.getElementById("cvPhHome");
cvData.cvPhFax = doc.getElementById("cvPhFax");
cvData.cvPhCellular = doc.getElementById("cvPhCellular");
cvData.cvPhPager = doc.getElementById("cvPhPager");
// Work section
cvData.cvbWork = doc.getElementById("cvbWork");
cvData.cvhWork = doc.getElementById("cvhWork");
cvData.cvJobTitle = doc.getElementById("cvJobTitle");
cvData.cvDepartment = doc.getElementById("cvDepartment");
cvData.cvCompany = doc.getElementById("cvCompany");
cvData.cvWorkAddress = doc.getElementById("cvWorkAddress");
cvData.cvWorkAddress2 = doc.getElementById("cvWorkAddress2");
cvData.cvWorkCityStZip = doc.getElementById("cvWorkCityStZip");
cvData.cvWorkCountry = doc.getElementById("cvWorkCountry");
}
function DisplayCardViewPane(abNode)
{
var uri = abNode.getAttribute('id');
var cardResource = top.rdf.GetResource(uri);
var card = cardResource.QueryInterface(Components.interfaces.nsIAbCard);
// FIX ME - this should use a i18n name routine in JS
var name = card.DisplayName;
if ( card.FirstName.length + card.LastName.length > 0 )
name = card.FirstName + " " + card.LastName;
var nickname;
if ( card.NickName )
nickname = "\"" + card.NickName + "\"";
var data = top.cvData;
var visible;
// set fields in card view pane
cvSetNode(data.CardTitle, "Card for " + card.DisplayName);
// Name section
cvSetNode(data.cvhName, name);
cvSetNode(data.cvNickname, nickname);
cvSetNode(data.cvEmail1, card.PrimaryEmail);
cvSetNode(data.cvEmail2, card.SecondEmail);
// Home section
visible = cvSetNode(data.cvHomeAddress, card.HomeAddress);
visible = cvSetNode(data.cvHomeAddress2, card.HomeAddress2) || visible;
visible = cvSetCityStateZip(data.cvHomeCityStZip, card.HomeCity, card.HomeState, card.HomeZipCode) || visible;
visible = cvSetNode(data.cvHomeCountry, card.HomeCountry) || visible;
cvSetVisible(data.cvhHome, visible);
// Other section
visible = cvSetNodeWithLabel(data.cvCustom1, zCustom1, card.Custom1);
visible = cvSetNodeWithLabel(data.cvCustom2, zCustom2, card.Custom2) || visible;
visible = cvSetNodeWithLabel(data.cvCustom3, zCustom3, card.Custom3) || visible;
visible = cvSetNodeWithLabel(data.cvCustom4, zCustom4, card.Custom4) || visible;
visible = cvSetNode(data.cvNotes, card.Notes) || visible;
cvSetVisible(data.cvhOther, visible);
// Phone section
visible = cvSetNodeWithLabel(data.cvPhWork, zWork, card.WorkPhone);
visible = cvSetNodeWithLabel(data.cvPhHome, zHome, card.HomePhone) || visible;
visible = cvSetNodeWithLabel(data.cvPhFax, zFax, card.FaxNumber) || visible;
visible = cvSetNodeWithLabel(data.cvPhCellular, zCellular, card.CellularNumber) || visible;
visible = cvSetNodeWithLabel(data.cvPhPager, zPager, card.PagerNumber) || visible;
cvSetVisible(data.cvhPhone, visible);
// Work section
visible = cvSetNode(data.cvJobTitle, card.JobTitle);
visible = cvSetNode(data.cvDepartment, card.Department) || visible;
visible = cvSetNode(data.cvCompany, card.Company) || visible;
visible = cvSetNode(data.cvWorkAddress, card.WorkAddress) || visible;
visible = cvSetNode(data.cvWorkAddress2, card.WorkAddress2) || visible;
visible = cvSetCityStateZip(data.cvWorkCityStZip, card.WorkCity, card.WorkState, card.WorkZipCode) || visible;
visible = cvSetNode(data.cvWorkCountry, card.WorkCountry) || visible;
cvSetVisible(data.cvhWork, visible);
// make the card view box visible
cvSetVisible(top.cvData.CardViewBox, true);
}
function ClearCardViewPane()
{
cvSetVisible(top.cvData.CardViewBox, false);
/* can remove this code now that boxes handle display:none
// HACK - we need to be able to set the entire box or div to display:none when bug fixed
var data = top.cvData;
// title
cvSetVisible(data.CardTitle, false);
// Name section
cvSetVisible(data.cvhName, false);
cvSetVisible(data.cvNickname, false);
cvSetVisible(data.cvEmail1, false);
cvSetVisible(data.cvEmail2, false);
// Home section
cvSetVisible(data.cvhHome, false);
cvSetVisible(data.cvHomeAddress, false);
cvSetVisible(data.cvHomeAddress2, false);
cvSetVisible(data.cvHomeCityStZip, false);
cvSetVisible(data.cvHomeCountry, false);
// Other section
cvSetVisible(data.cvhOther, false);
cvSetVisible(data.cvCustom1, false);
cvSetVisible(data.cvCustom2, false);
cvSetVisible(data.cvCustom3, false);
cvSetVisible(data.cvCustom4, false);
cvSetVisible(data.cvNotes, false);
// Phone section
cvSetVisible(data.cvhPhone, false);
cvSetVisible(data.cvPhWork, false);
cvSetVisible(data.cvPhHome, false);
cvSetVisible(data.cvPhFax, false);
cvSetVisible(data.cvPhCellular, false);
cvSetVisible(data.cvPhPager, false);
// Work section
cvSetVisible(data.cvhWork, false);
cvSetVisible(data.cvJobTitle, false);
cvSetVisible(data.cvDepartment, false);
cvSetVisible(data.cvCompany, false);
cvSetVisible(data.cvWorkAddress, false);
cvSetVisible(data.cvWorkAddress2, false);
cvSetVisible(data.cvWorkCityStZip, false);
cvSetVisible(data.cvWorkCountry, false);
*/
}
function cvSetNodeWithLabel(node, label, text)
{
if ( text )
return cvSetNode(node, label + text);
else
{
cvSetVisible(node, false);
return false;
}
}
function cvSetCityStateZip(node, city, state, zip)
{
var text;
if ( city )
{
text = city;
if ( state || zip )
text += ", ";
}
if ( state )
text += state + " ";
if ( zip )
text += zip;
return cvSetNode(node, text);
}
function cvSetNode(node, text)
{
node.childNodes[0].nodeValue = text;
var visible;
if ( text )
visible = true;
else
visible = false;
cvSetVisible(node, visible);
return visible;
}
function cvSetVisible(node, visible)
{
if ( visible )
node.removeAttribute("hide");
else
node.setAttribute("hide", "true");
}

View File

@@ -1,94 +0,0 @@
<?xml version="1.0"?>
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<!DOCTYPE window SYSTEM "chrome://addressbook/locale/abCardViewOverlay.dtd">
<overlay xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<html:script language="JavaScript" src="chrome://addressbook/content/abCardViewOverlay.js"/>
<box id="CardViewBox"
align="vertical"
flex="100%"
style="overflow:auto; background-color:#dddddd; padding-left:5px; padding-right:5px">
<html:div hide="true" style="font-size:150%; font-weight:bold; border-bottom:2px solid black" id="CardTitle">*</html:div>
<box align="horizontal" flex="100%">
<box align="vertical" flex="100%" style="width:100px">
<box id="cvbName" align="vertical">
<html:div class="CardViewHeading" hide="true" id="cvhName">*</html:div>
<html:div class="CardViewText" hide="true" id="cvNickname">*</html:div>
<html:div class="CardViewText" hide="true" id="cvEmail1">*</html:div>
<html:div class="CardViewText" hide="true" id="cvEmail2">*</html:div>
</box>
<box id="cvbHome" align="vertical">
<html:div class="CardViewHeading" hide="true" id="cvhHome">&home.heading;</html:div>
<html:div class="CardViewText" hide="true" id="cvHomeAddress">*</html:div>
<html:div class="CardViewText" hide="true" id="cvHomeAddress2">*</html:div>
<html:div class="CardViewText" hide="true" id="cvHomeCityStZip">*</html:div>
<html:div class="CardViewText" hide="true" id="cvHomeCountry">*</html:div>
</box>
<box id="cvbOther" align="vertical">
<html:div class="CardViewHeading" hide="true" id="cvhOther">&other.heading;</html:div>
<html:div class="CardViewText" hide="true" id="cvCustom1">*</html:div>
<html:div class="CardViewText" hide="true" id="cvCustom2">*</html:div>
<html:div class="CardViewText" hide="true" id="cvCustom3">*</html:div>
<html:div class="CardViewText" hide="true" id="cvCustom4">*</html:div>
<html:div class="CardViewText" hide="true" id="cvNotes">*</html:div>
</box>
</box>
<spring style="width:20px"/>
<box align="vertical" flex="100%" style="width:100px">
<box id="cvbPhone" align="vertical">
<html:div class="CardViewHeading" hide="true" id="cvhPhone">&phone.heading;</html:div>
<html:div class="CardViewText" hide="true" id="cvPhWork">*</html:div>
<html:div class="CardViewText" hide="true" id="cvPhHome">*</html:div>
<html:div class="CardViewText" hide="true" id="cvPhFax">*</html:div>
<html:div class="CardViewText" hide="true" id="cvPhCellular">*</html:div>
<html:div class="CardViewText" hide="true" id="cvPhPager">*</html:div>
</box>
<box id="cvbWork" align="vertical">
<html:div class="CardViewHeading" hide="true" id="cvhWork">&work.heading;</html:div>
<html:div class="CardViewText" hide="true" id="cvJobTitle">*</html:div>
<html:div class="CardViewText" hide="true" id="cvDepartment">*</html:div>
<html:div class="CardViewText" hide="true" id="cvCompany">*</html:div>
<html:div class="CardViewText" hide="true" id="cvWorkAddress">*</html:div>
<html:div class="CardViewText" hide="true" id="cvWorkAddress2">*</html:div>
<html:div class="CardViewText" hide="true" id="cvWorkCityStZip">*</html:div>
<html:div class="CardViewText" hide="true" id="cvWorkCountry">*</html:div>
</box>
</box>
</box>
</box>
</overlay>

View File

@@ -1,257 +0,0 @@
// functions needed from abMainWindow and abSelectAddresses
// Controller object for Results Pane
var ResultsPaneController =
{
IsCommandEnabled: function(command)
{
dump('ResultsPaneController::IsCommandEnabled(' + command + ')\n');
switch ( command )
{
case "cmd_selectAll":
return true;
case "cmd_delete":
var resultsTree = document.getElementById('resultsTree');
if ( resultsTree && resultsTree.selectedItems )
return true;
else
return false;
default:
return false;
}
},
DoCommand: function(command)
{
var resultsTree = document.getElementById('resultsTree');
switch ( command )
{
case "cmd_selectAll":
if ( resultsTree )
{
dump("select all now!!!!!!" + "\n");
resultsTree.selectAll();
}
break;
case "cmd_delete":
if ( resultsTree )
{
var cardList = resultsTree.selectedItems;
top.addressbook.DeleteCards(resultsTree, resultsTree, cardList);
}
break;
}
}
};
// Controller object for Dir Pane
var DirPaneController =
{
IsCommandEnabled: function(command)
{
dump('DirPaneController::IsCommandEnabled(' + command + ')\n');
switch ( command )
{
case "cmd_selectAll":
return true;
case "cmd_delete":
var dirTree = document.getElementById('dirTree');
if ( dirTree && dirTree.selectedItems )
return true;
else
return false;
default:
return false;
}
},
DoCommand: function(command)
{
var dirTree = document.getElementById('dirTree');
switch ( command )
{
case "cmd_selectAll":
if ( dirTree )
{
dump("select all now!!!!!!" + "\n");
dirTree.selectAll();
}
break;
case "cmd_delete":
if ( dirTree )
top.addressbook.DeleteAddressBooks(dirTree.database, dirTree, dirTree.selectedItems);
break;
}
}
};
function SetupCommandUpdateHandlers()
{
var widget;
// dir pane
widget = document.getElementById('dirTree');
if ( widget )
widget.controller = DirPaneController;
// results pane
widget = document.getElementById('resultsTree');
if ( widget )
widget.controller = ResultsPaneController;
}
function AbNewCard()
{
var selectedAB = 0;
var tree = document.getElementById('dirTree');
if ( tree && tree.selectedItems && (tree.selectedItems.length == 1) )
selectedAB = tree.selectedItems[0].getAttribute('id');
goNewCardDialog(selectedAB);
}
function AbEditCard()
{
var rdf = Components.classes["component://netscape/rdf/rdf-service"].getService();
rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
var resultsTree = document.getElementById('resultsTree');
if ( resultsTree.selectedItems && resultsTree.selectedItems.length == 1 )
{
var uri = resultsTree.selectedItems[0].getAttribute('id');
var card = rdf.GetResource(uri);
card = card.QueryInterface(Components.interfaces.nsIAbCard);
goEditCardDialog(document.getElementById('resultsTree').getAttribute('ref'),
card, top.editCardCallback);
}
}
function AbNewMessage()
{
var msgComposeService = Components.classes["component://netscape/messengercompose"].getService();
msgComposeService = msgComposeService.QueryInterface(Components.interfaces.nsIMsgComposeService);
msgComposeService.OpenComposeWindowWithValues(null, 0, GetSelectedAddresses(), null, null,
null, null, null);
}
function GetSelectedAddresses()
{
var item, uri, rdf, cardResource, card;
var selectedAddresses = "";
var resultsTree = document.getElementById('resultsTree');
rdf = Components.classes["component://netscape/rdf/rdf-service"].getService();
rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
if ( resultsTree.selectedItems && resultsTree.selectedItems.length )
{
for ( item = 0; item < resultsTree.selectedItems.length; item++ )
{
uri = resultsTree.selectedItems[item].getAttribute('id');
cardResource = rdf.GetResource(uri);
card = cardResource.QueryInterface(Components.interfaces.nsIAbCard);
if ( selectedAddresses )
selectedAddresses += ",";
selectedAddresses += "\"" + card.DisplayName + "\" <" + card.PrimaryEmail + ">";
}
}
dump("selectedAddresses = " + selectedAddresses + "\n");
return selectedAddresses;
}
function SelectFirstAddressBook()
{
var tree = document.getElementById('dirTree');
var body = document.getElementById('dirTreeBody');
if ( tree && body )
{
var treeitems = body.getElementsByTagName('treeitem');
if ( treeitems && treeitems.length > 0 )
{
tree.selectItem(treeitems[0]);
ChangeDirectoryByDOMNode(treeitems[0]);
}
}
}
function DirPaneSelectionChange()
{
// FIX ME - deselect the items in the results pane to work around tree bug
var resultsTree = document.getElementById('resultsTree');
if ( resultsTree )
resultsTree.clearItemSelection();
// ----
var tree = document.getElementById('dirTree');
if ( tree && tree.selectedItems && (tree.selectedItems.length == 1) )
ChangeDirectoryByDOMNode(tree.selectedItems[0]);
else
{
var tree = document.getElementById('resultsTree');
if ( tree )
tree.setAttribute('ref', null);
}
}
function ChangeDirectoryByDOMNode(dirNode)
{
var uri = dirNode.getAttribute('id');
dump("uri = " + uri + "\n");
var tree = document.getElementById('resultsTree');
if ( tree )
tree.setAttribute('ref', uri);
}
function ResultsPaneSelectionChange()
{
// FIX ME! - Should use some js var to determine abmain vs selectaddress dialog
// not in ab window if no parent.parent.rdf
if ( parent.parent.rdf )
{
var tree = document.getElementById('resultsTree');
if ( tree && tree.selectedItems && (tree.selectedItems.length == 1) )
DisplayCardViewPane(tree.selectedItems[0]);
else
ClearCardViewPane();
}
}
function SortResultPane(column, sortKey)
{
var node = document.getElementById(column);
if(!node) return(false);
var isupports = Components.classes["component://netscape/rdf/xul-sort-service"].getService();
if (!isupports) return(false);
var xulSortService = isupports.QueryInterface(Components.interfaces.nsIXULSortService);
if (!xulSortService) return(false);
// sort!!!
sortDirection = "ascending";
var currentDirection = node.getAttribute('sortDirection');
if (currentDirection == "ascending")
sortDirection = "descending";
else if (currentDirection == "descending")
sortDirection = "ascending";
else sortDirection = "ascending";
xulSortService.Sort(node, sortKey, sortDirection);
return(true);
}

View File

@@ -1,64 +0,0 @@
<?xml version="1.0"?>
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<!DOCTYPE window SYSTEM "chrome://addressbook/locale/abDirTreeOverlay.dtd">
<overlay xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<!-- FIX ME - remove document.commandDispatcher.updateCommands() when tree selection calls this automatically -->
<tree id="dirTree"
class="abDirectory"
style="width:100%; height:100%"
ref="abdirectory://"
open="true"
datasources="rdf:addressdirectory"
onselect="DirPaneSelectionChange(); document.commandDispatcher.updateCommands('select');">
<template>
<rule>
<treechildren>
<treeitem uri="...">
<treerow >
<treecell indent="true" value="rdf:http://home.netscape.com/NC-rdf#DirName"/>
</treerow>
</treeitem>
</treechildren>
</rule>
</template>
<treecol rdf:resource="http://home.netscape.com/NC-rdf#DirName"/>
<treehead>
<treerow>
<treecell>&directoryColumn.label;</treecell>
</treerow>
</treehead>
<treechildren id="dirTreeBody"
rdf:containment="http://home.netscape.com/NC-rdf#child"
rdf:ignore="http://home.netscape.com/NC-rdf#CardChild">
</treechildren>
</tree>
</overlay>

View File

@@ -1,39 +0,0 @@
<?xml version="1.0"?>
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<?xml-stylesheet href="chrome://addressbook/skin/" type="text/css"?>
<?xul-overlay href="chrome://global/content/dialogOverlay.xul"?>
<?xul-overlay href="chrome://addressbook/content/abCardOverlay.xul"?>
<window xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
onload="OnLoadEditCard()"
class="dialog"
align="vertical">
<keyset id="keyset"/>
<box id="editcard"/>
<box id="okCancelButtons"/>
</window>

View File

@@ -1,63 +0,0 @@
<?xml version="1.0"?>
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<?xml-stylesheet href="chrome://addressbook/skin/" type="text/css"?>
<?xul-overlay href="chrome://global/content/dialogOverlay.xul"?>
<?xul-overlay href="chrome://addressbook/content/abCardOverlay.xul"?>
<!DOCTYPE window SYSTEM "chrome://addressbook/locale/abNewCardDialog.dtd">
<window xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
title="&editcardWindow.title;"
onload="OnLoadNewCard()"
class="dialog"
align="vertical">
<!--html:script language="JavaScript" src="resource:/res/samples/DumpDOM.js"/-->
<keyset id="keyset"/>
<box align="horizontal">
<html:label for="abPopup">&chooseAddressBook.label;</html:label>
<html:select id="abPopup" ref="abdirectory://" datasources="rdf:addressdirectory">
<template>
<html:option uri="..." value="rdf:http://home.netscape.com/NC-rdf#DirUri">
<text value="rdf:http://home.netscape.com/NC-rdf#DirName"/>
</html:option>
</template>
</html:select>
</box>
<!--box align="horizontal">
<html:label for="chooseAddressBook">&chooseAddressBook.label;</html:label>
<html:select id="chooseAddressBook">
</html:select>
</box-->
<spring style="height:1em"/>
<box id="editcard"/>
<box id="okCancelButtons"/>
</window>

View File

@@ -1,66 +0,0 @@
<?xml version="1.0"?>
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<!DOCTYPE window SYSTEM "chrome://addressbook/locale/abResultsTreeOverlay.dtd">
<overlay xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<!-- FIX ME - remove document.commandDispatcher.updateCommands() when tree selection calls this automatically -->
<tree id="resultsTree"
class="abResults"
style="width:100%; height:100%"
datasources="rdf:addressdirectory rdf:addresscard"
onselect="top.ResultsPaneSelectionChange(); document.commandDispatcher.updateCommands('select');"
ondblclick="top.AbEditCard()"
containment="http://home.netscape.com/NC-rdf#CardChild">
<template>
<rule>
<treechildren>
<treeitem uri="...">
<treerow >
<treecell indent="true" value="rdf:http://home.netscape.com/NC-rdf#DisplayName"/>
<treecell value="rdf:http://home.netscape.com/NC-rdf#PrimaryEmail"/>
<treecell value="rdf:http://home.netscape.com/NC-rdf#WorkPhone"/>
</treerow>
</treeitem>
</treechildren>
</rule>
</template>
<treecol style="width:20%" id="NameColumn" rdf:resource="http://home.netscape.com/NC-rdf#DisplayName"/>
<treecol style="width:21%" id="EmailColumn" rdf:resource="http://home.netscape.com/NC-rdf#PrimaryEmail"/>
<treecol style="width:20%" id="WorkPhoneColumn" rdf:resource="http://home.netscape.com/NC-rdf#WorkPhone"/>
<treehead>
<treerow>
<treecell onclick="return top.SortResultPane('NameColumn', 'http://home.netscape.com/NC-rdf#DisplayName');">&nameColumn.label;</treecell>
<treecell onclick="return top.SortResultPane('EmailColumn', 'http://home.netscape.com/NC-rdf#PrimaryEmail');">&emailColumn.label;</treecell>
<treecell onclick="return top.SortResultPane('WorkPhoneColumn', 'http://home.netscape.com/NC-rdf#WorkPhone');">&phoneColumn.label;</treecell>
</treerow>
</treehead>
</tree>
</overlay>

View File

@@ -1,183 +0,0 @@
var addressbook = 0;
var composeWindow = 0;
var msgCompFields = 0;
var editCardCallback = 0;
// localization strings
var prefixTo = "To: ";
var prefixCc = "Cc: ";
var prefixBcc = "Bcc: ";
function OnLoadSelectAddress()
{
var toAddress="", ccAddress="", bccAddress="";
doSetOKCancel(SelectAddressOKButton, 0);
top.addressbook = Components.classes["component://netscape/addressbook"].createInstance();
top.addressbook = top.addressbook.QueryInterface(Components.interfaces.nsIAddressBook);
// look in arguments[0] for parameters
if (window.arguments && window.arguments[0])
{
// keep parameters in global for later
if ( window.arguments[0].composeWindow )
top.composeWindow = window.arguments[0].composeWindow;
if ( window.arguments[0].msgCompFields )
top.msgCompFields = window.arguments[0].msgCompFields;
if ( window.arguments[0].toAddress )
toAddress = window.arguments[0].toAddress;
if ( window.arguments[0].ccAddress )
ccAddress = window.arguments[0].ccAddress;
if ( window.arguments[0].bccAddress )
bccAddress = window.arguments[0].bccAddress;
dump("onload top.composeWindow: " + top.composeWindow + "\n");
dump("onload toAddress: " + toAddress + "\n");
// put the addresses into the bucket
AddAddressFromComposeWindow(toAddress, prefixTo);
AddAddressFromComposeWindow(ccAddress, prefixCc);
AddAddressFromComposeWindow(bccAddress, prefixBcc);
}
SelectFirstAddressBook();
}
function AddAddressFromComposeWindow(addresses, prefix)
{
if ( addresses )
{
var addressArray = addresses.split(",");
for ( var index = 0; index < addressArray.length; index++ )
{
// remove leading spaces
while ( addressArray[index][0] == " " )
addressArray[index] = addressArray[index].substring(1, addressArray[index].length);
AddAddressIntoBucket(prefix + addressArray[index]);
}
}
}
function SelectAddressOKButton()
{
var body = document.getElementById('bucketBody');
var item, row, cell, text, colon;
var toAddress="", ccAddress="", bccAddress="";
for ( var index = 0; index < body.childNodes.length; index++ )
{
item = body.childNodes[index];
if ( item.childNodes && item.childNodes.length )
{
row = item.childNodes[0];
if ( row.childNodes && row.childNodes.length )
{
cell = row.childNodes[0];
if ( cell.childNodes && cell.childNodes.length )
{
text = cell.childNodes[0];
if ( text && text.data && text.data.length )
{
switch ( text.data[0] )
{
case prefixTo[0]:
if ( toAddress )
toAddress += ", ";
toAddress += text.data.substring(prefixTo.length, text.data.length);
break;
case prefixCc[0]:
if ( ccAddress )
ccAddress += ", ";
ccAddress += text.data.substring(prefixCc.length, text.data.length);
break;
case prefixBcc[0]:
if ( bccAddress )
bccAddress += ", ";
bccAddress += text.data.substring(prefixBcc.length, text.data.length);
break;
}
}
}
}
}
}
// reset the UI in compose window
msgCompFields.SetTo(toAddress);
msgCompFields.SetCc(ccAddress);
msgCompFields.SetBcc(bccAddress);
top.composeWindow.CompFields2Recipients(top.msgCompFields);
return true;
}
function SelectAddressToButton()
{
AddSelectedAddressesIntoBucket(prefixTo);
}
function SelectAddressCcButton()
{
AddSelectedAddressesIntoBucket(prefixCc);
}
function SelectAddressBccButton()
{
AddSelectedAddressesIntoBucket(prefixBcc);
}
function AddSelectedAddressesIntoBucket(prefix)
{
var item, uri, rdf, cardResource, card, address;
rdf = Components.classes["component://netscape/rdf/rdf-service"].getService();
rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
var resultsTree = document.getElementById('resultsTree');
if ( resultsTree && resultsTree.selectedItems && resultsTree.selectedItems.length )
{
for ( item = 0; item < resultsTree.selectedItems.length; item++ )
{
uri = resultsTree.selectedItems[item].getAttribute('id');
cardResource = rdf.GetResource(uri);
card = cardResource.QueryInterface(Components.interfaces.nsIAbCard);
address = prefix + "\"" + card.DisplayName + "\" <" + card.PrimaryEmail + ">";
AddAddressIntoBucket(address);
}
}
}
function AddAddressIntoBucket(address)
{
var body = document.getElementById("bucketBody");
var item = document.createElement('treeitem');
var row = document.createElement('treerow');
var cell = document.createElement('treecell');
var text = document.createTextNode(address);
cell.appendChild(text);
row.appendChild(cell);
item.appendChild(row);
body.appendChild(item);
}
function RemoveSelectedFromBucket()
{
var bucketTree = document.getElementById("addressBucket");
if ( bucketTree )
{
var body = document.getElementById("bucketBody");
if ( body && bucketTree.selectedItems && bucketTree.selectedItems.length )
{
for ( var item = bucketTree.selectedItems.length - 1; item >= 0; item-- )
body.removeChild(bucketTree.selectedItems[item]);
}
}
}

View File

@@ -1,141 +0,0 @@
<?xml version="1.0"?>
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<?xml-stylesheet href="chrome://addressbook/skin/" type="text/css"?>
<?xul-overlay href="chrome://global/content/dialogOverlay.xul"?>
<?xul-overlay href="chrome://addressbook/content/abDirTreeOverlay.xul"?>
<?xul-overlay href="chrome://addressbook/content/abResultsTreeOverlay.xul"?>
<!DOCTYPE window SYSTEM "chrome://addressbook/locale/abSelectAddressesDialog.dtd">
<window xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
title="&selectAddressWindow.title;"
class="dialog"
width="640" height="480"
style="width:100%; height:100%; padding:0px"
onload="OnLoadSelectAddress()"
align="vertical">
<html:script language="JavaScript" src="chrome://addressbook/content/abCommon.js"/>
<html:script language="JavaScript" src="chrome://addressbook/content/abSelectAddressesDialog.js"/>
<html:script language="JavaScript" src="chrome://messengercompose/content/MsgComposeCommands.js"/>
<html:script language="JavaScript" src="chrome://global/content/globalOverlay.js"/>
<!--html:script language="JavaScript" src="resource:/res/samples/DumpDOM.js"/-->
<keyset id="keyset"/>
<!-- Thin box across top, show names containing & stop, search buttons -->
<box align="horizontal" style="width:100%; padding:0px; padding-top:2px; padding-bottom:2px">
<html:div flex="100%" style="vertical-align: middle;">
<html:label for="searchtext" tabindex="0">&search.label;</html:label>
<html:input type="text" id="searchtext" flex="100%"/>
</html:div>
<spring style="width: 1em;"/>
<titledbutton id="stop" value="&stopButton.label;" class="push" onclick="SelectAddressStopButton()"/>
<spring style="width:5px"/>
<titledbutton id="search" value="&searchButton.label;" class="push" onclick="SelectAddressSearchButton()"/>
</box>
<!-- Main box, 3 pane and majority of buttons -->
<box align="horizontal" flex="100%">
<!-- 3 Pane box -->
<box align="horizontal" flex="100%" style="border-top:solid black 1px; border-bottom:solid black 1px">
<!-- dir tree -->
<box align="horizontal"
style="width:200px; height:100%; background-color:white; border-right:solid black 1px">
<!-- FIX ME - div is hack to make tree scroll properly -->
<html:div style="width:100px;height:100px" flex="1">
<tree id="dirTree"/>
</html:div>
</box>
<splitter collapse="before"/>
<!-- Box that holds results pane, (to,cc,bcc buttons), and address bucket -->
<box align="vertical" flex="100%" style="border-left:solid black 1px; border-right:solid black 1px">
<!-- Box that holds results pane and (to,cc,bcc buttons) -->
<box align="vertical" flex="100%">
<!-- results tree -->
<box flex="100%" align="vertical"
style="background-color:white; border-bottom:solid black 1px">
<!-- FIX ME - div is hack to make tree scroll properly -->
<html:div style="width:100px;height:100px" flex="1">
<tree id="resultsTree"/>
</html:div>
</box>
<!-- Box that holds (to,cc,bcc buttons) -->
<box align="horizontal" style="padding:0.3em; border-bottom:solid black 1px">
<spring flex="50%"/>
<titledbutton id="toButton" value="&toButton.label;" class="push" onclick="SelectAddressToButton()"/>
<spring style="width:10px"/>
<titledbutton id="ccButton" value="&ccButton.label;" class="push" onclick="SelectAddressCcButton()"/>
<spring style="width:10px"/>
<titledbutton id="bccButton" value="&bccButton.label;" class="push" onclick="SelectAddressBccButton()"/>
<spring flex="50%"/>
</box>
</box>
<splitter collapse="after"/>
<!-- Address bucket -->
<box align="vertical" style="height:170px; background-color:white; border-top:solid black 1px">
<html:div style="width:100px;height:100px" flex="1">
<tree id="addressBucket" style="width:100%; height:100%">
<treecol style="width:100%"/>
<treechildren id="bucketBody"/>
</tree>
</html:div>
</box>
</box>
</box>
<!-- Box with buttons on right edge of window -->
<box align="vertical" style="padding: .5em; padding-right: 0px">
<box align="vertical" flex="50%">
<spring style="height:10px"/>
<titledbutton id="new" value="&newButton.label;" class="push" onclick="AbNewCard()"/>
<spring style="height:10px"/>
<titledbutton id="edit" value="&editButton.label;" class="push" onclick="AbEditCard()"/>
<spring style="height:10px"/>
<titledbutton id="view" value="&viewButton.label;" class="push" onclick="SelectAddressViewButton()"/>
<spring flex="100%"/>
</box>
<box align="vertical" flex="50%">
<spring flex="50%"/>
<titledbutton id="remove" value="&removeButton.label;" class="push" onclick="RemoveSelectedFromBucket()"/>
<spring flex="50%"/>
</box>
</box>
</box>
<!-- OK & Cancel buttons -->
<box id="okCancelButtons"/>
</window>

View File

@@ -1,183 +0,0 @@
var addressbook = 0;
var editCardCallback = 0;
// functions used only by addressbook
function OnLoadAddressBook()
{
// FIX ME - later we will be able to use onload from the overlay
OnLoadCardView();
top.addressbook = Components.classes["component://netscape/addressbook"].createInstance();
top.addressbook = top.addressbook.QueryInterface(Components.interfaces.nsIAddressBook);
top.editCardCallback = UpdateCardView;
try {
top.addressbook.SetWebShellWindow(window)
}
catch (ex) {
dump("failed to set webshell window\n");
}
SetupCommandUpdateHandlers();
SelectFirstAddressBook();
}
function CommandUpdate_AddressBook()
{
dump("CommandUpdate_AddressBook\n");
// get selection info from dir pane
var tree = document.getElementById('dirTree');
var oneAddressBookSelected = false;
if ( tree && tree.selectedItems && (tree.selectedItems.length == 1) )
oneAddressBookSelected = true;
dump("oneAddressBookSelected = " + oneAddressBookSelected + "\n");
// get selection info from results pane
var selectedCards = GetSelectedAddresses();
var oneOrMoreCardsSelected = false;
if ( selectedCards )
oneOrMoreCardsSelected = true;
// set commands to enabled / disabled
goSetCommandEnabled('cmd_PrintCard', oneOrMoreCardsSelected);
goSetCommandEnabled('cmd_SortByName', oneAddressBookSelected);
goSetCommandEnabled('cmd_SortByEmail', oneAddressBookSelected);
goSetCommandEnabled('cmd_SortByPhone', oneAddressBookSelected);
AbUpdateCommandDelete();
}
// This function updates the text of the delete menu item and sets the state of the delete button
function AbUpdateCommandDelete()
{
var command = "cmd_delete";
var focusedElement = document.commandDispatcher.focusedElement;
var id = 0;
if ( focusedElement )
id = focusedElement.getAttribute('id');
dump("focusedOn = " + id + "\n");
switch ( id )
{
case "dirTree":
// menu text
goSetMenuValue(command, 'valueAddressBook');
// delete button
var dirTree = document.getElementById('dirTree');
var numSelected = 0;
if ( dirTree && dirTree.selectedItems )
numSelected = dirTree.selectedItems.length;
goSetCommandEnabled('button_delete', (numSelected>0));
break;
case "resultsTree":
// menu text
var resultsTree = document.getElementById('resultsTree');
var numSelected = 0;
if ( resultsTree && resultsTree.selectedItems )
numSelected = resultsTree.selectedItems.length;
if ( numSelected < 2 )
goSetMenuValue(command, 'valueCard');
else
goSetMenuValue(command, 'valueCards');
// delete button
goSetCommandEnabled('button_delete', (numSelected>0));
break;
default:
goSetMenuValue(command, 'valueDefault');
goSetCommandEnabled('button_delete', false);
break;
}
}
function UpdateCardView()
{
var tree = document.getElementById('resultsTree');
if ( tree && tree.selectedItems && (tree.selectedItems.length == 1) )
DisplayCardViewPane(tree.selectedItems[0]);
}
function AbClose()
{
top.window.close();
}
function AbNewAddressBook()
{
var dialog = window.openDialog("chrome://addressbook/content/abAddressBookNameDialog.xul",
"",
"chrome",
{title:"New Address Book",
okCallback:AbCreateNewAddressBook});
}
function AbCreateNewAddressBook(name)
{
top.addressbook.NewAddressBook(document.getElementById('dirTree').database, document.getElementById('resultsTree'), name);
}
function AbPrintCard()
{
dump("print card\n");
try {
addressbook.PrintCard();
}
catch (ex) {
dump("failed to print card\n");
}
}
function AbPrintAddressBook()
{
dump("print address book \n");
try {
addressbook.PrintAddressbook();
}
catch (ex) {
dump("failed to print address book\n");
}
}
function AbImport()
{
addressbook.ImportAddressBook();
}
/*
function AbDelete()
{
// dump("\AbDelete from XUL\n");
var tree = document.getElementById('resultsTree');
if ( tree )
{
//get the selected elements
var cardList = tree.selectedItems;
//get the current folder
var srcDirectory = document.getElementById('resultsTree');
dump("srcDirectory = " + srcDirectory + "\n");
top.addressbook.DeleteCards(tree, srcDirectory, cardList);
}
}
*/
/*
function AbDeleteDirectory()
{
// dump("\AbDeleteDirectory from XUL\n");
var tree = document.getElementById('dirTree');
// if ( tree && tree.selectedItems && tree.selectedItems.length )
if ( tree )
top.addressbook.DeleteAddressBooks(tree.database, tree, tree.selectedItems);
}
*/

View File

@@ -1,247 +0,0 @@
<?xml version="1.0"?>
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<?xml-stylesheet href="chrome://addressbook/skin/" type="text/css"?>
<?xul-overlay href="chrome://global/content/globalOverlay.xul"?>
<?xul-overlay href="chrome://global/content/tasksOverlay.xul"?>
<?xul-overlay href="chrome://addressbook/content/abDirTreeOverlay.xul"?>
<?xul-overlay href="chrome://addressbook/content/abResultsTreeOverlay.xul"?>
<?xul-overlay href="chrome://addressbook/content/abCardViewOverlay.xul"?>
<!DOCTYPE window SYSTEM "chrome://addressbook/locale/abMainWindow.dtd">
<window xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
height="420"
width="600"
align="vertical"
title="&addressbookWindow.title;"
windowtype="mail:addressbook"
onload="OnLoadAddressBook()">
<html:script language="JavaScript" src="chrome://addressbook/content/addressbook.js"/>
<html:script language="JavaScript" src="chrome://addressbook/content/abCommon.js"/>
<!--html:script language="JavaScript" src="resource:/res/samples/DumpDOM.js"/-->
<commands id="commands">
<commandset id="CommandUpdate_AddressBook"
commandupdater="true"
events="focus,blur,select"
oncommandupdate="CommandUpdate_AddressBook()"/>
<commandset id="globalEditMenuItems"/>
</commands>
<broadcasterset id="broadcasterset">
<!-- File Menu -->
<broadcaster id="cmd_newNavigator"/>
<broadcaster id="cmd_newMessage"/>
<broadcaster id="cmd_PrintCard" oncommand="AbPrintCard()" disabled="true"/>
<broadcaster id="cmd_close" oncommand="AbClose()"/>
<broadcaster id="cmd_quit"/>
<!-- Edit Menu -->
<broadcaster id="cmd_undo"/>
<broadcaster id="cmd_redo"/>
<broadcaster id="cmd_cut"/>
<broadcaster id="cmd_copy"/>
<broadcaster id="cmd_paste"/>
<broadcaster id="cmd_delete"
valueAddressBook="&deleteAbCmd.label;"
valueCard="&deleteCardCmd.label;"
valueCards="&deleteCardsCmd.label;"/>
<broadcaster id='cmd_selectAll'/>
<broadcaster id="cmd_preferences"/>
</broadcasterset>
<keyset id="keyset">
<!-- File Menu -->
<key id="key_newNavigator"/>
<key id="key_newMessage"/>
<key id="key_PrintCard" command="true" key="&printCardViewCmd.key;" observes="cmd_PrintCard" />
<key id="key_close"/>
<key id="key_quit"/>
<!-- Edit Menu -->
<key id="key_undo"/>
<key id="key_redo"/>
<key id="key_cut"/>
<key id="key_copy"/>
<key id="key_paste"/>
<key id="key_delete"/>
<key id="key_selectAll"/>
<key id="key_preferences"/>
</keyset>
<toolbox>
<menubar>
<menu id="menu_File">
<menupopup id="menu_FilePopup">
<menuitem value="&newCard.label;" accesskey="&newCard.accesskey;" oncommand="AbNewCard()"/>
<menu id="menu_New">
<menupopup>
<menuitem value="&newListCmd.label;" accesskey="&newListCmd.accesskey;" oncommand="AbNewList()"/>
<menuitem value="&newAddressBookCmd.label;" accesskey="&newAddressBookCmd.accesskey;" oncommand="AbNewAddressBook()"/>
<menuitem value="&newDirectoryCmd.label;" accesskey="&newDirectoryCmd.accesskey;" oncommand="AbNewDirectoryt()"/>
<menuseparator/>
<menuitem id="menu_newNavigator"/>
<menuitem id="menu_newMessage"/>
<menuitem id="cmd_newCard"/>
</menupopup>
</menu>
<menuseparator/>
<menuitem id="menu_close"/>
<menuseparator/>
<menuitem value="&importCmd.label;" oncommand="AbImport()"/>
<menuitem value="&exportCmd.label;" oncommand="AbExport()"/>
<menuseparator/>
<menuitem id="menu_pageSetup"/>
<menuitem value="&printPreviewCmd.label;" oncommand="AbPrintPreview()"/>
<menuitem value="&printCardViewCmd.label;" key="key_PrintCard" observes="cmd_PrintCard"/>
<menuitem value="&printAddressBook.label;" oncommand="AbPrintAddressBook()"/>
<menuseparator/>
</menupopup>
</menu>
<menu id="menu_Edit">
<menupopup>
<menuitem id="menu_undo"/>
<menuitem id="menu_redo"/>
<menuseparator/>
<menuitem id="menu_cut"/>
<menuitem id="menu_copy"/>
<menuitem id="menu_paste"/>
<menuitem id="menu_delete"/>
<menuseparator/>
<menuitem id="menu_selectAll"/>
<menuseparator/>
<menuitem value="&editCardCmd.label;"
accesskey="&editCardCmd.accesskey;"
oncommand="AbEditCard();"/>
<menuitem value="&htmlDomainCmd.label;"
accesskey="&htmlDomainCmd.accesskey;"
oncommand="AbHTMLDomain();"/>
<menuseparator/>
<menuitem id="menu_preferences" oncommand="goPreferences('addressbook.xul', 'chrome://addressbook/content/pref-addressing.xul')"/>
</menupopup>
</menu>
<menu id="menu_View">
<menupopup>
<menu id="menu_Toolbars">
<menupopup>
<menuitem id="menu_showAbToolbar"
value="&showAbToolbarCmd.label;"
accesskey="&showAbToolbarCmd.accesskey;"
oncommand="goToggleToolbar('abToolbar', 'menu_showAbToolbar')"
checked="true"/>
<menuitem id="menu_showTaskbar"/>
</menupopup>
</menu>
<menuitem value="&showCardPane.label;" oncommand="AbShowCardPane()"/>
<menu value="&sortMenu.label;">
<menupopup>
<menuitem value="&sortByNameCmd.label;"
id="cmd_SortByName"
disabled="true"
oncommand="top.SortResultPane('NameColumn', 'http://home.netscape.com/NC-rdf#DisplayName')"/>
<menuitem value="&sortByEmailCmd.label;"
id="cmd_SortByEmail"
disabled="true"
oncommand="top.SortResultPane('EmailColumn', 'http://home.netscape.com/NC-rdf#PrimaryEmail')"/>
<menuitem value="&sortByOrganizationCmd.label;" oncommand="AbSortByOrganization()"/>
<menuitem value="&sortByNicknameCmd.label;" oncommand="AbSortByNickname()"/>
<menuitem value="&sortByPhoneCmd.label;"
id="cmd_SortByPhone"
disabled="true"
oncommand="top.SortResultPane('WorkPhoneColumn', 'http://home.netscape.com/NC-rdf#WorkPhone')"/>
<menuitem value="&sortByCityCmd.label;" oncommand="AbSortByCity()"/>
<menuseparator/>
<menuitem value="&sortAscendingCmd.label;" oncommand="AbSortAscending()"/>
<menuitem value="&sortDescendingCmd.label;" oncommand="AbSortDescending()"/>
</menupopup>
</menu>
</menupopup>
</menu>
<menu id="tasksMenu"/>
<menu id="menu_Help"/>
<spring flex="100%"/>
</menubar>
<toolbar id="abToolbar" persist="collapsed">
<titledbutton src="&newcardButton.img;" align="top" value="&newcardButton.label;" onclick="AbNewCard()"/>
<titledbutton src="&newlistButton.img;" align="top" value="&newlistButton.label;" onclick="AbNewList()"/>
<titledbutton src="&editButton.img;" align="top" value="&editButton.label;" onclick="AbEditCard()"/>
<titledbutton src="&newmsgButton.img;" align="top" value="&newmsgButton.label;" onclick="AbNewMessage()"/>
<titledbutton id="button_delete" disabled="true" src="&deleteButton.img;" align="top" value="&deleteButton.label;" onclick="AbDelete()"/>
<html:div class="separator" align="vertical"/>
<box align="vertical">
<spring flex="100%"/>
<html:div style="padding-left:5px; padding-bottom:2px">&showNames.label;</html:div>
<html:input id="searchtext" type="text" align="bottom" style="min-width:100px; min-height:25px; padding-bottom:0px"/>
</box>
<titledbutton src="&stopButton.img;" align="top" value="&stopButton.label;" onclick="AbStop()"/>
<titledbutton src="&searchButton.img;" align="top" value="&searchButton.label;" onclick="AbSearch()"/>
<spring flex="100%"/>
<titledbutton id="Throbber" align="right" onclick="MsgHome('http://www.mozilla.org/')"/>
</toolbar>
</toolbox>
<!-- The main address book three pane -->
<box align="horizontal" flex="100%">
<!-- dir tree -->
<box align="horizontal"
style="width:200px; height:100%; background-color:white; border-right:solid black 1px">
<!-- FIX ME - div is hack to make tree scroll properly -->
<html:div style="width:100px;height:100px" flex="1">
<tree id="dirTree"/>
</html:div>
</box>
<splitter collapse="before"/>
<box align="vertical" flex="100%" style="border-left:solid black 1px">
<!-- results tree -->
<box flex="50%" align="vertical"
style="background-color:white; border-bottom:solid black 1px">
<!-- FIX ME - div is hack to make tree scroll properly -->
<html:div style="width:100px;height:100px" flex="1">
<tree id="resultsTree"/>
</html:div>
</box>
<splitter collapse="after"/>
<!-- card view -->
<box style="height:170px; border-top:solid black 1px">
<box id="CardViewBox"/>
</box>
</box>
</box>
<toolbox id="taskbox"/>
</window>

View File

@@ -1,58 +0,0 @@
#!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=..\..\..\..
include <$(DEPTH)\config\rules.mak>
install::
$(MAKE_INSTALL) abAddressBookNameDialog.js $(DIST)\bin\chrome\addressbook\content\default
$(MAKE_INSTALL) abAddressBookNameDialog.xul $(DIST)\bin\chrome\addressbook\content\default
$(MAKE_INSTALL) abCardOverlay.js $(DIST)\bin\chrome\addressbook\content\default
$(MAKE_INSTALL) abCardOverlay.xul $(DIST)\bin\chrome\addressbook\content\default
$(MAKE_INSTALL) abCardViewOverlay.js $(DIST)\bin\chrome\addressbook\content\default
$(MAKE_INSTALL) abCardViewOverlay.xul $(DIST)\bin\chrome\addressbook\content\default
$(MAKE_INSTALL) abCommon.js $(DIST)\bin\chrome\addressbook\content\default
$(MAKE_INSTALL) abDirTreeOverlay.xul $(DIST)\bin\chrome\addressbook\content\default
$(MAKE_INSTALL) abEditCardDialog.xul $(DIST)\bin\chrome\addressbook\content\default
$(MAKE_INSTALL) abNewCardDialog.xul $(DIST)\bin\chrome\addressbook\content\default
$(MAKE_INSTALL) abResultsTreeOverlay.xul $(DIST)\bin\chrome\addressbook\content\default
$(MAKE_INSTALL) abSelectAddressesDialog.js $(DIST)\bin\chrome\addressbook\content\default
$(MAKE_INSTALL) abSelectAddressesDialog.xul $(DIST)\bin\chrome\addressbook\content\default
$(MAKE_INSTALL) addressbook.js $(DIST)\bin\chrome\addressbook\content\default
$(MAKE_INSTALL) addressbook.xul $(DIST)\bin\chrome\addressbook\content\default
clobber::
rm -f $(DIST)\chrome\addressbook\content\default\abAddressBookNameDialog.js
rm -f $(DIST)\chrome\addressbook\content\default\abAddressBookNameDialog.xul
rm -f $(DIST)\chrome\addressbook\content\default\abCardOverlay.js
rm -f $(DIST)\chrome\addressbook\content\default\abCardOverlay.xul
rm -f $(DIST)\chrome\addressbook\content\default\abCardViewOverlay.js
rm -f $(DIST)\chrome\addressbook\content\default\abCardViewOverlay.xul
rm -f $(DIST)\chrome\addressbook\content\default\abCommon.js
rm -f $(DIST)\chrome\addressbook\content\default\abDirTreeOverlay.xul
rm -f $(DIST)\chrome\addressbook\content\default\abEditCardDialog.xul
rm -f $(DIST)\chrome\addressbook\content\default\abNewCardDialog.xul
rm -f $(DIST)\chrome\addressbook\content\default\abResultsTreeOverlay.xul
rm -f $(DIST)\chrome\addressbook\content\default\abSelectAddressesDialog.js
rm -f $(DIST)\chrome\addressbook\content\default\abSelectAddressesDialog.xul
rm -f $(DIST)\chrome\addressbook\content\default\addressbook.js
rm -f $(DIST)\chrome\addressbook\content\default\addressbook.xul

View File

@@ -1,28 +0,0 @@
#
# 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
DIRS = en-US
include $(topsrcdir)/config/rules.mk

View File

@@ -1,8 +0,0 @@
abAddressBookNameDialog.dtd
abCardOverlay.dtd
abCardViewOverlay.dtd
abDirTreeOverlay.dtd
abMainWindow.dtd
abNewCardDialog.dtd
abResultsTreeOverlay.dtd
abSelectAddressesDialog.dtd

View File

@@ -1,40 +0,0 @@
#
# 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
EXPORT_RESOURCE_CONTENT = \
$(srcdir)/abAddressBookNameDialog.dtd \
$(srcdir)/abCardOverlay.dtd \
$(srcdir)/abCardViewOverlay.dtd \
$(srcdir)/abDirTreeOverlay.dtd \
$(srcdir)/abMainWindow.dtd \
$(srcdir)/abNewCardDialog.dtd \
$(srcdir)/abResultsTreeOverlay.dtd \
$(srcdir)/abSelectAddressesDialog.dtd \
$(NULL)
include $(topsrcdir)/config/rules.mk
install::
$(INSTALL) $(EXPORT_RESOURCE_CONTENT) $(DIST)/bin/chrome/addressbook/locale/en-US

View File

@@ -1,22 +0,0 @@
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<!-- Labels -->
<!ENTITY name.label "Address Book Name">

View File

@@ -1,65 +0,0 @@
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<!-- Labels -->
<!ENTITY Name.tab "Name">
<!ENTITY Name.box "Name">
<!ENTITY FirstName.label "First:">
<!ENTITY LastName.label "Last:">
<!ENTITY DisplayName.label "Display:">
<!ENTITY NickName.label "Nickname:">
<!ENTITY Internet.box "Internet">
<!ENTITY PrimaryEmail.label "* Email:">
<!ENTITY SecondEmail.label "Additional Email:">
<!ENTITY SendPlainText.label "Send email as plain text (no html)">
<!ENTITY Phones.box "Phones">
<!ENTITY WorkPhone.label "Work:">
<!ENTITY HomePhone.label "Home:">
<!ENTITY FaxNumber.label "Fax:">
<!ENTITY PagerNumber.label "Pager:">
<!ENTITY CellularNumber.label "Cellular:">
<!ENTITY Address.tab "Address">
<!ENTITY Home.box "Home">
<!ENTITY HomeAddress.label "Address:">
<!ENTITY HomeAddress2.label "">
<!ENTITY HomeCity.label "City:">
<!ENTITY HomeState.label "State:">
<!ENTITY HomeZipCode.label "Zip:">
<!ENTITY HomeCountry.label "Country:">
<!ENTITY Work.box "Work">
<!ENTITY JobTitle.label "Title:">
<!ENTITY Department.label "Department:">
<!ENTITY Company.label "Organization:">
<!ENTITY WorkAddress.label "Address:">
<!ENTITY WorkAddress2.label "">
<!ENTITY WorkCity.label "City:">
<!ENTITY WorkState.label "State:">
<!ENTITY WorkZipCode.label "Zip:">
<!ENTITY WorkCountry.label "Country:">
<!--ENTITY Web.box "Web"-->
<!ENTITY WebPage1.label "Web Page:">
<!ENTITY Other.tab "Other">
<!ENTITY Custom1.label "Custom 1:">
<!ENTITY Custom2.label "Custom 2:">
<!ENTITY Custom3.label "Custom 3:">
<!ENTITY Custom4.label "Custom 4:">
<!ENTITY Notes.box "Notes">

View File

@@ -1,25 +0,0 @@
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<!-- Box Headings -->
<!ENTITY home.heading "Home">
<!ENTITY other.heading "Other">
<!ENTITY phone.heading "Phone">
<!ENTITY work.heading "Work">

View File

@@ -1,22 +0,0 @@
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<!-- Column Heading -->
<!ENTITY directoryColumn.label "Directory">

View File

@@ -1,83 +0,0 @@
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<!-- Title -->
<!ENTITY addressbookWindow.title "Address Book">
<!-- Menus: the . means that the menu item isn't implemented yet -->
<!-- File Menu -->
<!ENTITY newCard.label "New Address Book Card">
<!ENTITY newCard.accesskey "n">
<!ENTITY newListCmd.label ".Mailing List">
<!ENTITY newListCmd.accesskey "l">
<!ENTITY newAddressBookCmd.label "Address Book">
<!ENTITY newAddressBookCmd.accesskey "b">
<!ENTITY newDirectoryCmd.label ".Directory">
<!ENTITY newDirectoryCmd.accesskey "d">
<!ENTITY importCmd.label "Import...">
<!ENTITY exportCmd.label ".Export...">
<!ENTITY printPreviewCmd.label ".Print Preview">
<!ENTITY printCardViewCmd.label ".Print Card View...">
<!ENTITY printCardViewCmd.key "P">
<!ENTITY printAddressBook.label ".Print Address Book...">
<!-- Edit Menu -->
<!ENTITY deleteAbCmd.label "Delete Address Book">
<!ENTITY deleteCardCmd.label "Delete Card">
<!ENTITY deleteCardsCmd.label "Delete Selected Cards">
<!ENTITY editCardCmd.label "Edit Card...">
<!ENTITY editCardCmd.accesskey "e">
<!ENTITY htmlDomainCmd.label ".HTML Domains...">
<!ENTITY htmlDomainCmd.accesskey "h">
<!-- View Menu -->
<!ENTITY showAbToolbarCmd.label "Show Address Book Toolbar">
<!ENTITY showAbToolbarCmd.accesskey "a">
<!ENTITY showCardPane.label ".Card Pane">
<!ENTITY sortMenu.label "Sort">
<!ENTITY sortByNameCmd.label "by Name">
<!ENTITY sortByEmailCmd.label "by Email">
<!ENTITY sortByOrganizationCmd.label ".by Organization">
<!ENTITY sortByNicknameCmd.label ".by Nickname">
<!ENTITY sortByPhoneCmd.label "by Phone Number">
<!ENTITY sortByCityCmd.label ".by City">
<!ENTITY sortAscendingCmd.label ".Ascending">
<!ENTITY sortDescendingCmd.label ".Descending">
<!ENTITY stopSearchingCmd.label ".Stop Searching">
<!-- Toolbar items -->
<!ENTITY newcardButton.img "chrome://addressbook/skin/newcard.gif">
<!ENTITY newcardButton.label "New Card">
<!ENTITY newlistButton.img "chrome://addressbook/skin/newlist.gif">
<!ENTITY newlistButton.label ".New List">
<!ENTITY editButton.img "chrome://addressbook/skin/property.gif">
<!ENTITY editButton.label "Edit">
<!ENTITY newmsgButton.img "chrome://addressbook/skin/abnewmsg.gif">
<!ENTITY newmsgButton.label "New Msg">
<!ENTITY deleteButton.img "chrome://messenger/skin/trash.gif">
<!ENTITY deleteButton.label "Delete">
<!ENTITY stopButton.img "resource:/res/toolbar/TB_Stop.gif">
<!ENTITY stopButton.label ".Stop">
<!ENTITY searchButton.img "resource:/res/toolbar/TB_Search.gif">
<!ENTITY searchButton.label ".Search">
<!ENTITY showNames.label "Show names containing:">
<!ENTITY throbber.img "resource:/res/throbber/anims00.gif">
<!ENTITY throbber.url "http://www.mozilla.org/">

View File

@@ -1,24 +0,0 @@
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<!-- Title -->
<!ENTITY editcardWindow.title "New Card">
<!-- Labels -->
<!ENTITY chooseAddressBook.label "Add to: ">

View File

@@ -1,25 +0,0 @@
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<!-- Column Headings -->
<!ENTITY nameColumn.label "Name">
<!ENTITY emailColumn.label "Email">
<!-- LOCALIZATION NOTE (phoneColumn.label): "#" means "number" -->
<!ENTITY phoneColumn.label "Phone#">

View File

@@ -1,40 +0,0 @@
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<!-- Title -->
<!ENTITY selectAddressWindow.title "Select Addresses">
<!-- Buttons -->
<!ENTITY toButton.label "To:">
<!ENTITY ccButton.label "Cc:">
<!ENTITY bccButton.label "Bcc:">
<!ENTITY stopButton.label ".Stop">
<!ENTITY searchButton.label ".Search...">
<!ENTITY newButton.label "New...">
<!ENTITY editButton.label "Edit...">
<!ENTITY viewButton.label ".View">
<!ENTITY removeButton.label "Remove">
<!ENTITY okButton.label "OK">
<!ENTITY cancelButton.label "Cancel">
<!ENTITY helpButton.label ".Help">
<!-- Toolbar items -->
<!ENTITY search.label "Show names containing:">

View File

@@ -1,43 +0,0 @@
#!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=..\..\..\..\..
include <$(DEPTH)\config\rules.mak>
DISTBROWSER=$(DIST)\bin\chrome\addressbook\locale\en-US
install::
$(MAKE_INSTALL) abAddressBookNameDialog.dtd $(DISTBROWSER)
$(MAKE_INSTALL) abCardOverlay.dtd $(DISTBROWSER)
$(MAKE_INSTALL) abCardViewOverlay.dtd $(DISTBROWSER)
$(MAKE_INSTALL) abDirTreeOverlay.dtd $(DISTBROWSER)
$(MAKE_INSTALL) abMainWindow.dtd $(DISTBROWSER)
$(MAKE_INSTALL) abNewCardDialog.dtd $(DISTBROWSER)
$(MAKE_INSTALL) abResultsTreeOverlay.dtd $(DISTBROWSER)
$(MAKE_INSTALL) abSelectAddressesDialog.dtd $(DISTBROWSER)
clobber::
rm -f $(DIST)\bin\chrome\addressbook\locale\en-US\abAddressBookNameDialog.dtd
rm -f $(DIST)\bin\chrome\addressbook\locale\en-US\abCardOverlay.dtd
rm -f $(DIST)\bin\chrome\addressbook\locale\en-US\abCardViewOverlay.dtd
rm -f $(DIST)\bin\chrome\addressbook\locale\en-US\abDirTreeOverlay.dtd
rm -f $(DIST)\bin\chrome\addressbook\locale\en-US\abMainWindow.dtd
rm -f $(DIST)\bin\chrome\addressbook\locale\en-US\abNewCardDialog.dtd
rm -f $(DIST)\bin\chrome\addressbook\locale\en-US\abResultsTreeOverlay.dtd
rm -f $(DIST)\bin\chrome\addressbook\locale\en-US\abSelectAddressesDialog.dtd

View File

@@ -1,22 +0,0 @@
#!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=..\..\..\..
DIRS= en-US
include <$(DEPTH)\config\rules.mak>

View File

@@ -1,22 +0,0 @@
#!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=..\..\..
DIRS= content locale skin
include <$(DEPTH)\config\rules.mak>

View File

@@ -1,27 +0,0 @@
# 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.
#
# This is a list of local files which get copied to the res\mailnews\messenger directory
#
addressbook.css
newcard.gif
newlist.gif
property.gif
abnewmsg.gif
person.gif
list.gif
myaddrbk.gif

View File

@@ -1,44 +0,0 @@
#
# 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
SAMPLES_DIR = $(DIST)/bin/chrome/addressbook/skin/default
EXPORT_RESOURCE_SAMPLES = \
addressbook.css \
newcard.gif \
newlist.gif \
property.gif \
abnewmsg.gif \
person.gif \
list.gif \
myaddrbk.gif \
$(NULL)
include $(topsrcdir)/config/rules.mk
GARBAGE += $(addprefix $(SAMPLES_DIR)/, $(EXPORT_RESOURCE_SAMPLES))
install::
$(INSTALL) $(addprefix $(srcdir)/, $(EXPORT_RESOURCE_SAMPLES)) $(SAMPLES_DIR)

Some files were not shown because too many files have changed in this diff Show More