зеркало из https://github.com/mozilla/pjs.git
878 строки
29 KiB
C
878 строки
29 KiB
C
/* -*- 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" */
|
|
#ifdef DOM
|
|
extern char lm_spans_str[]; /* "spans" */
|
|
extern char lm_transclusions_str[]; /* "transclusions" */
|
|
#endif
|
|
|
|
|
|
extern char lm_builtins_str[];
|
|
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);
|
|
#ifdef NAV_HARDWARE
|
|
extern JSObject *lm_DefineHardware(MochaDecoder *decoder,
|
|
JSObject *parent);
|
|
#endif
|
|
extern JSObject *lm_DefineEnvironment(MochaDecoder *decoder);
|
|
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);
|
|
#ifdef DOM
|
|
extern JSObject *lm_GetSpanArray(MochaDecoder *decoder,
|
|
JSObject *document);
|
|
extern JSObject *lm_GetTransclusionArray(MochaDecoder *decoder,
|
|
JSObject *document);
|
|
extern JSObject *lm_DOMGetDocumentElement(MochaDecoder *decoder,
|
|
JSObject *document);
|
|
#endif
|
|
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);
|
|
|
|
extern JSBool lm_InitBuiltinClass(MochaDecoder *decoder);
|
|
extern JSObject *lm_GetBuiltinsArray(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;
|
|
#ifdef DOM
|
|
JSObject *spans;
|
|
JSObject *transclusions;
|
|
JSObject *dom_documentElement;
|
|
#endif
|
|
JSObject *builtins;
|
|
} 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_count, JSObject *object, const char *name,
|
|
PA_Block block);
|
|
|
|
extern uint32
|
|
lm_FindEventInMWContext(MWContext *context);
|
|
|
|
/*
|
|
* Remember the current form object that we are processing
|
|
*/
|
|
extern void
|
|
lm_SetActiveForm(MWContext * context, int32 id);
|
|
|
|
/*
|
|
* Called when we want to get rid of the old contents of a layer
|
|
* and create a new document.
|
|
*/
|
|
extern void
|
|
lm_NewLayerDocument(MochaDecoder *decoder, int32 layer_id);
|
|
|
|
/*
|
|
* Called to set the source URL as a result of a document.open() on the
|
|
* layer's document.
|
|
*/
|
|
JSBool
|
|
lm_SetLayerSourceURL(MochaDecoder *decoder, int32 layer_id, char *url);
|
|
|
|
/*
|
|
* Get a layer obj from a parent id and a layer name. Used for lazy reflection.
|
|
*/
|
|
extern JSObject *
|
|
lm_GetNamedLayer(MochaDecoder *decoder, int32 parent_layer_id,
|
|
const char *name);
|
|
|
|
extern const char *
|
|
lm_GetLayerOriginURL(JSContext *cx, JSObject *obj);
|
|
|
|
|
|
/* Clears out object references from the doc private data */
|
|
extern void
|
|
lm_CleanUpDocumentRoots(MochaDecoder *decoder, JSObject *obj);
|
|
|
|
/* Calls CleanUpDocumentRoots for a layer's document */
|
|
extern void
|
|
lm_DestroyLayer(MWContext *context, JSObject *obj);
|
|
|
|
/*
|
|
* Called when the content associated with a document is destroyed,
|
|
* but the document itself may not be. Cleans out object references
|
|
* from doc private data (so that the objects can be collected). Also
|
|
* deals with correctly relinquishing event capture.
|
|
*/
|
|
extern void
|
|
lm_CleanUpDocument(MochaDecoder *decoder, JSObject *document);
|
|
|
|
extern NET_StreamClass *
|
|
lm_ClearDecoderStream(MochaDecoder *decoder, JSBool fromDiscard);
|
|
|
|
extern void
|
|
lm_ProcessImageEvent(MWContext *context, JSObject *obj,
|
|
LM_ImageEvent event);
|
|
|
|
extern JSObject *
|
|
lm_NewImage(JSContext *cx, LO_ImageStruct *image_data);
|
|
|
|
extern JSObject *
|
|
lm_NewSoftupObject(JSContext *cx, MochaDecoder *decoder, const char *jarargs);
|
|
|
|
extern void
|
|
lm_RegisterComponent(const char *targetName, ETBoolPtrFunc active_callback,
|
|
ETVoidPtrFunc startup_callback);
|
|
|
|
extern void
|
|
lm_RegisterComponentProp(const char *comp, const char *targetName,
|
|
uint8 retType, ETCompPropSetterFunc setter,
|
|
ETCompPropGetterFunc getter);
|
|
|
|
extern void
|
|
lm_RegisterComponentMethod(const char *comp, const char *targetName,
|
|
uint8 retType, ETCompMethodFunc method, int32 nargs);
|
|
|
|
/*
|
|
* Class initializers (the wave of the future).
|
|
*/
|
|
extern JSBool
|
|
lm_InitSecurity(MochaDecoder *decoder);
|
|
|
|
extern JSBool
|
|
lm_InitDocumentClass(MochaDecoder *decoder);
|
|
|
|
extern JSBool
|
|
lm_InitImageClass(MochaDecoder *decoder);
|
|
|
|
extern JSBool
|
|
lm_InitAnchorClass(MochaDecoder *decoder);
|
|
|
|
#ifdef DOM
|
|
extern JSBool
|
|
lm_InitSpanClass(MochaDecoder *decoder);
|
|
|
|
extern JSBool
|
|
lm_InitTransclusionClass(MochaDecoder *decoder);
|
|
#endif
|
|
|
|
extern JSBool
|
|
lm_InitLayerClass(MochaDecoder *decoder);
|
|
|
|
extern JSBool
|
|
lm_InitInputClasses(MochaDecoder *decoder);
|
|
|
|
extern JSBool
|
|
lm_InitEventClasses(MochaDecoder *decoder);
|
|
|
|
extern JSBool
|
|
lm_InitRectClass(MochaDecoder *decoder);
|
|
|
|
extern JSBool
|
|
lm_InitBackgroundClass(MochaDecoder *decoder);
|
|
|
|
/* Create an image context for anonymous images. */
|
|
extern JSBool
|
|
lm_NewImageContext(MWContext *context, MochaDecoder *decoder);
|
|
|
|
/*
|
|
* Called to save and restore timeouts across a resize_reload.
|
|
*/
|
|
void
|
|
lm_SaveWindowTimeouts(MochaDecoder *decoder);
|
|
|
|
void
|
|
lm_RestoreWindowTimeouts(MochaDecoder *decoder);
|
|
|
|
/*
|
|
* Call this function from LO_ResetForm() to let the form's onReset attribute
|
|
* event handler run and do specialized form element data reinitialization.
|
|
* Returns JS_TRUE if the form reset should continue, JS_FALSE if it
|
|
* should be aborted.
|
|
*/
|
|
extern JSBool
|
|
lm_SendOnReset(MWContext *context, JSEvent *event, LO_Element *element);
|
|
|
|
/*
|
|
* See if our outer object is the current form or the document
|
|
*/
|
|
extern JSObject *
|
|
lm_GetOuterObject(MochaDecoder * decoder);
|
|
|
|
/*
|
|
* Entry point for the netlib to notify JS of load and unload events.
|
|
*/
|
|
extern void
|
|
lm_SendLoadEvent(MWContext *context, int32 event, JSBool resize_reload);
|
|
|
|
/*
|
|
* Load or unload event for a layer
|
|
*/
|
|
extern void
|
|
lm_SendLayerLoadEvent(MWContext *context, int32 event, int32 layer_id, JSBool resize_reload);
|
|
|
|
/*
|
|
* This one should be called when a form is submitted. If there is an
|
|
* INPUT tag of type "submit", the JS author could write an "onClick"
|
|
* handler property of the submit button, but for forms that auto-submit
|
|
* we want an "onSubmit" form property handler.
|
|
*
|
|
* Returns JS_TRUE if the submit should continue, JS_FALSE if it
|
|
* should be aborted.
|
|
*/
|
|
extern JSBool
|
|
lm_SendOnSubmit(MWContext *context, JSEvent *event, LO_Element *element);
|
|
|
|
extern JSBool
|
|
lm_InputEvent(MWContext *context, LO_Element *element, JSEvent *pEvent,
|
|
jsval *rval);
|
|
|
|
extern JSBool
|
|
lm_KeyInputEvent(MWContext *context, LO_Element *element, JSEvent *pEvent,
|
|
jsval *rval);
|
|
|
|
extern JSBool
|
|
lm_MouseInputEvent(MWContext *context, LO_Element *element, JSEvent *pEvent,
|
|
jsval *rval);
|
|
|
|
extern NET_StreamClass *
|
|
lm_DocCacheConverter(MWContext * context, URL_Struct * url,
|
|
const char * wysiwyg_url);
|
|
|
|
extern char *
|
|
lm_MakeWysiwygUrl(JSContext *cx, MochaDecoder *decoder, int32 layer_id,
|
|
JSPrincipals *principals);
|
|
|
|
typedef struct JSObjectArray {
|
|
MochaDecoder *decoder;
|
|
jsint length;
|
|
int32 layer_id;
|
|
} JSObjectArray;
|
|
|
|
extern JSBool
|
|
lm_AddObjectToArray(JSContext * cx, JSObject * array_obj,
|
|
const char * name, jsint index, JSObject * obj);
|
|
|
|
/* Version Information; sits on top of JS_SetVersion and JS_GetVersion */
|
|
extern void
|
|
lm_SetVersion(MochaDecoder *decoder, JSVersion version);
|
|
|
|
#define lm_GetVersion(decoder) JS_GetVersion((decoder)->js_context)
|
|
|
|
/*
|
|
* Security -----------------------------------
|
|
*/
|
|
|
|
typedef enum JSTarget {
|
|
JSTARGET_UNIVERSAL_BROWSER_READ,
|
|
JSTARGET_UNIVERSAL_BROWSER_WRITE,
|
|
JSTARGET_UNIVERSAL_SEND_MAIL,
|
|
JSTARGET_UNIVERSAL_FILE_READ,
|
|
JSTARGET_UNIVERSAL_FILE_WRITE,
|
|
JSTARGET_UNIVERSAL_PREFERENCES_READ,
|
|
JSTARGET_UNIVERSAL_PREFERENCES_WRITE,
|
|
JSTARGET_UNIVERSAL_DIALER_ACCESS,
|
|
JSTARGET_MAX
|
|
} JSTarget;
|
|
|
|
extern const char *
|
|
lm_GetSubjectOriginURL(JSContext *cx);
|
|
|
|
extern const char *
|
|
lm_GetObjectOriginURL(JSContext *cx, JSObject *object);
|
|
|
|
extern const char *
|
|
lm_SetObjectOriginURL(JSContext *cx, JSObject *object, const char *origin);
|
|
|
|
extern JSPrincipals *
|
|
lm_GetPrincipalsFromStackFrame(JSContext *cx);
|
|
|
|
extern JSPrincipals *
|
|
lm_GetCompilationPrincipals(MochaDecoder *decoder,
|
|
JSPrincipals *layoutPrincipals);
|
|
|
|
extern JSBool
|
|
lm_CanAccessTarget(JSContext *cx, JSTarget target);
|
|
|
|
extern JSBool
|
|
lm_CheckPermissions(JSContext *cx, JSObject *obj, JSTarget target);
|
|
|
|
extern JSBool
|
|
lm_GetCrossOriginEnabled(void);
|
|
|
|
extern JSBool
|
|
lm_GetUnsignedExecutionEnabled(void);
|
|
|
|
extern JSBool
|
|
lm_CheckContainerAccess(JSContext *cx, JSObject *obj, MochaDecoder *decoder,
|
|
JSTarget target);
|
|
|
|
/*
|
|
* Get the innermost (in the sense of the parent scope chain of "obj")
|
|
* nonnull principals. Will create principals at the window level if
|
|
* none exist. Will always return nonnull principals except in the case
|
|
* of memory failure.
|
|
* Argument "container" specifies the start of the search, the
|
|
* container where the principals were found will be stored into
|
|
* "foundIn" if "foundIn" is nonnull.
|
|
*/
|
|
extern JSPrincipals *
|
|
lm_GetInnermostPrincipals(JSContext *cx, JSObject *container,
|
|
JSObject **foundIn);
|
|
|
|
extern JSPrincipals *
|
|
lm_GetContainerPrincipals(JSContext *cx, JSObject *container);
|
|
|
|
extern void
|
|
lm_SetContainerPrincipals(JSContext *cx, JSObject *container,
|
|
JSPrincipals *principals);
|
|
|
|
extern JSBool
|
|
lm_CanCaptureEvent(JSContext *cx, JSFunction *fun, JSEvent *event);
|
|
|
|
extern void
|
|
lm_SetExternalCapture(JSContext *cx, JSPrincipals *principals,
|
|
JSBool b);
|
|
|
|
extern JSBool
|
|
lm_CheckSetParentSlot(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
|
|
|
|
extern JSBool
|
|
lm_SetDocumentDomain(JSContext *cx, JSPrincipals *principals,
|
|
const char *newDomain);
|
|
|
|
extern void
|
|
lm_InvalidateCertPrincipals(MochaDecoder *decoder, JSPrincipals *principals);
|
|
|
|
extern void
|
|
lm_DestroyPrincipalsList(JSContext *cx, JSPrincipalsList *list);
|
|
|
|
/*
|
|
* --------------------------------------------
|
|
*/
|
|
|
|
/* For when mozilla needs to call LM_PutMochaDecoder in the mocha thread. */
|
|
extern void
|
|
et_PutMochaDecoder(MWContext *context, MochaDecoder *decoder);
|
|
|
|
/* This function is private to libmocha, so don't stuff it in libevent.h, chouck ! */
|
|
extern int32
|
|
ET_PostCreateLayer(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);
|
|
|
|
extern char *
|
|
lm_StrToEncoding(JSContext *cx, uint16 charset, JSString * str);
|
|
|
|
extern JSString *
|
|
lm_EncodingToStr(JSContext *cx, uint16 charset, 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;
|
|
|
|
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 JSBool LM_LockJSByGroup(LMWindowGroup *grp, char **errp);
|
|
extern void LM_UnlockJSByGroup(LMWindowGroup *grp);
|
|
|
|
extern JSBool lm_inited(void);
|
|
|
|
/* See also LM_GetCrippledContext() in libmocha.h */
|
|
extern MochaDecoder *LM_GetCrippledDecoder(void);
|
|
extern void LM_SetCrippledDecoder(MochaDecoder *md);
|
|
extern JSBool LM_ShouldRunGC(JSContext *cx, JSGCStatus status);
|
|
|
|
/* MLM */
|
|
|
|
#endif /* lm_h___ */
|