home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / lib / libmocha / lm.h < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  25.8 KB  |  754 lines

  1. /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "NPL"); you may not use this file except in
  5.  * compliance with the NPL.  You may obtain a copy of the NPL at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the NPL is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
  10.  * for the specific language governing rights and limitations under the
  11.  * NPL.
  12.  *
  13.  * The Initial Developer of this code under the NPL is Netscape
  14.  * Communications Corporation.  Portions created by Netscape are
  15.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  16.  * Reserved.
  17.  */
  18.  
  19. #ifndef lm_h___
  20. #define lm_h___
  21. /*
  22.  * JS in the Navigator library-private interface.
  23.  */
  24. #include "xp.h"         /* for uint and PA_Block */
  25. #include "prlong.h"    /* for int64 time type used below */
  26. #include "libevent.h"    /* until its a stand-alone */
  27. #include "libmocha.h"
  28.  
  29. /*
  30.  * Shared string constants for common property names.
  31.  */
  32. extern char lm_argc_err_str[];          /* "incorrect number of arguments" */
  33.  
  34. extern char lm_unknown_origin_str[];    /* "[unknown origin]" */
  35.  
  36. extern char lm_onLoad_str[];            /* "onLoad" */
  37. extern char lm_onUnload_str[];          /* "onUnload" */
  38. extern char lm_onAbort_str[];           /* "onAbort" */
  39. extern char lm_onError_str[];           /* "onError" */
  40. extern char lm_onScroll_str[];          /* "onScroll" */
  41. extern char lm_onFocus_str[];           /* "onFocus" */
  42. extern char lm_onBlur_str[];            /* "onBlur" */
  43. extern char lm_onSelect_str[];          /* "onSelect" */
  44. extern char lm_onChange_str[];          /* "onChange" */
  45. extern char lm_onReset_str[];           /* "onReset" */
  46. extern char lm_onSubmit_str[];          /* "onSubmit" */
  47. extern char lm_onClick_str[];           /* "onClick" */
  48. extern char lm_onMouseDown_str[];       /* "onMouseDown" */
  49. extern char lm_onMouseOver_str[];       /* "onMouseOver" */
  50. extern char lm_onMouseOut_str[];        /* "onMouseOut" */
  51. extern char lm_onMouseUp_str[];         /* "onMouseUp" */
  52. extern char lm_onLocate_str[];          /* "onLocate" */
  53. extern char lm_onHelp_str[];            /* "onHelp" [EA] */
  54.  
  55. extern char lm_focus_str[];             /* "focus" */
  56. extern char lm_blur_str[];              /* "blur" */
  57. extern char lm_select_str[];            /* "select" */
  58. extern char lm_click_str[];             /* "click" */
  59. extern char lm_scroll_str[];            /* "scroll" */
  60. extern char lm_enable_str[];            /* "enable" */
  61. extern char lm_disable_str[];           /* "disable" */
  62.  
  63. extern char lm_toString_str[];          /* "toString" */
  64. extern char lm_length_str[];            /* "length" */
  65. extern char lm_document_str[];          /* "document" */
  66. extern char lm_forms_str[];             /* "forms" */
  67. extern char lm_links_str[];             /* "links" */
  68. extern char lm_anchors_str[];           /* "anchors" */
  69. extern char lm_applets_str[];           /* "applets" */
  70. extern char lm_embeds_str[];            /* "embeds" */
  71. extern char lm_plugins_str[];           /* "plugins" */
  72. extern char lm_images_str[];            /* "images" */
  73. extern char lm_layers_str[];            /* "layers" */
  74. extern char lm_location_str[];          /* "location" */
  75. extern char lm_navigator_str[];         /* "navigator" */
  76. extern char lm_netcaster_str[];         /* "netcaster" */
  77. extern char lm_components_str[];        /* "components" */
  78.  
  79. extern char lm_parentLayer_str[];       /* "parentLayer" */
  80. extern char lm_opener_str[];            /* "opener" */
  81. extern char lm_closed_str[];            /* "closed" */
  82. extern char lm_assign_str[];            /* "assign" */
  83. extern char lm_reload_str[];            /* "reload" */
  84. extern char lm_replace_str[];           /* "replace" */
  85. extern char lm_event_str[];             /* "event" */
  86. extern char lm_methodPrefix_str[];      /* "#method" */
  87. extern char lm_methodArgc_str[];      /* "#method" */
  88. extern char lm_methodArgv_str[];      /* "#method" */
  89. extern char lm_getPrefix_str[];         /* "#get_" */
  90. extern char lm_setPrefix_str[];         /* "#set_" */
  91. extern char lm_typePrefix_str[];        /* "#type_" */
  92. extern const char *lm_event_argv[];     /* {lm_event_str} */
  93.  
  94. extern PRThread            *lm_InterpretThread;
  95. extern PRThread            *mozilla_thread;
  96. extern PRThread            *lm_js_lock_previous_owner;
  97.  
  98. extern JSContext *lm_writing_context;
  99.  
  100. /*
  101.  * Timeout structure threaded on MochaDecoder.timeouts for cleanup.
  102.  */
  103. struct JSTimeout {
  104.     int32               ref_count;      /* reference count to shared usage */
  105.     char                *expr;          /* the JS expression to evaluate */
  106.     JSObject            *funobj;        /* or function to call, if !expr */
  107.     jsval               *argv;          /* function actual arguments */
  108.     void                *toid;          /* Identifier, used internally only */
  109.     uint32              public_id;      /* Returned as value of setTimeout() */
  110.     uint16              argc;           /* and argument count */
  111.     uint16              spare;          /* alignment padding */
  112.     int32        doc_id;           /* document this is for */
  113.     int32               interval;       /* Non-zero if repetitive timeout */
  114.     int64               when;           /* nominal time to run this timeout */
  115.     JSVersion        version;    /* Version of JavaScript to execute */
  116.     JSPrincipals        *principals;    /* principals with which to execute */
  117.     char                *filename;      /* filename of setTimeout call */
  118.     uint32              lineno;         /* line number of setTimeout call */
  119.     JSTimeout           *next;          /* next timeout in list */
  120. };
  121.  
  122. extern void             lm_ClearWindowTimeouts(MochaDecoder *decoder);
  123.  
  124. struct JSNestingUrl {
  125.     JSNestingUrl     *next;
  126.     char                *str;
  127. };
  128.  
  129. /*
  130.  * Event queue stack madness to handle doc.write("<script>doc.write...").
  131.  */
  132. typedef struct QueueStackElement {
  133.     PREventQueue        * queue;
  134.     MWContext                * context;
  135.     int32              doc_id;
  136.     struct QueueStackElement    * up;
  137.     struct QueueStackElement    * down;
  138.     PRPackedBool          done;
  139.     PRPackedBool          discarding;
  140.     PRPackedBool          inherit_parent;
  141.     void                        * retval;
  142. } QueueStackElement;
  143.  
  144. extern void
  145. et_SubEventLoop(QueueStackElement * qse);
  146.  
  147. /*
  148.  * Stack size per window context, plus one for the navigator.
  149.  */
  150. #define LM_STACK_SIZE   8192
  151.  
  152. extern JSRuntime        *lm_runtime;
  153. extern MochaDecoder     *lm_crippled_decoder;
  154. extern JSClass        lm_window_class;
  155. extern JSClass        lm_layer_class;
  156. extern JSClass        lm_document_class;
  157. extern JSClass        lm_event_class;
  158.  
  159. extern JSBool           lm_SaveParamString(JSContext *cx, PA_Block *bp,
  160.                                            const char *str);
  161. extern MochaDecoder     *lm_NewWindow(MWContext *context);
  162. extern void             lm_DestroyWindow(MochaDecoder *decoder);
  163.  
  164. /*
  165.  * Hold and drop the reference count for tree back-edges that go from object
  166.  * private data to the containing decoder.  These refs do not keep the object
  167.  * tree under decoder alive from the GC, but they do keep decoder from being
  168.  * destroyed and some out of order finalizer tripping over its freed memory.
  169.  */
  170. #ifdef DEBUG
  171. extern MochaDecoder     *lm_HoldBackCount(MochaDecoder *decoder);
  172. extern void             lm_DropBackCount(MochaDecoder *decoder);
  173.  
  174. #define HOLD_BACK_COUNT(decoder) lm_HoldBackCount(decoder)
  175. #define DROP_BACK_COUNT(decoder) lm_DropBackCount(decoder)
  176. #else
  177. #define HOLD_BACK_COUNT(decoder)                                             \
  178.     (((decoder) ? (decoder)->back_count++ : 0), (decoder))
  179. #define DROP_BACK_COUNT(decoder)                                             \
  180.     (((decoder) && --(decoder)->back_count <= 0 && !(decoder)->forw_count)   \
  181.      ? lm_DestroyWindow(decoder)                         \
  182.      : (void)0)
  183. #endif
  184.  
  185. extern JSBool           lm_InitWindowContent(MochaDecoder *decoder);
  186. extern JSBool           lm_DefineWindowProps(JSContext *cx,
  187.                                              MochaDecoder *decoder);
  188. extern JSBool           lm_ResolveWindowProps(JSContext *cx,
  189.                                               MochaDecoder *decoder,
  190.                                               JSObject *obj,
  191.                                               jsval id);
  192. extern void             lm_FreeWindowContent(MochaDecoder *decoder,
  193.                          JSBool fromDiscard);
  194. extern JSBool           lm_SetInputStream(JSContext *cx,
  195.                       MochaDecoder *decoder,
  196.                       NET_StreamClass *stream,
  197.                       URL_Struct *url_struct,
  198.                                           JSBool free_stream_on_close);
  199. extern JSObject         *lm_DefineDocument(MochaDecoder *decoder,
  200.                                            int32 layer_id);
  201. extern JSObject         *lm_DefineHistory(MochaDecoder *decoder);
  202. extern JSObject         *lm_DefineLocation(MochaDecoder *decoder);
  203. extern JSObject         *lm_DefineNavigator(MochaDecoder *decoder);
  204. extern JSObject         *lm_DefineComponents(MochaDecoder *decoder);
  205. extern JSObject         *lm_DefineCrypto(MochaDecoder *decoder);
  206. extern JSObject         *lm_DefineScreen(MochaDecoder *decoder,
  207.                                          JSObject *parent);
  208. extern JSObject         *lm_DefineHardware(MochaDecoder *decoder,
  209.                                          JSObject *parent);
  210. extern JSBool           lm_DefinePluginClasses(MochaDecoder *decoder);
  211. extern JSBool           lm_DefineBarClasses(MochaDecoder *decoder);
  212. extern JSBool           lm_ResolveBar(JSContext *cx, MochaDecoder *decoder,
  213.                       const char *name);
  214. extern JSBool           lm_DefineTriggers(void);
  215. extern JSObject         *lm_NewPluginList(JSContext *cx, JSObject *parent_obj);
  216. extern JSObject         *lm_NewMIMETypeList(JSContext *cx);
  217. extern JSObject         *lm_GetDocumentFromLayerId(MochaDecoder *decoder,
  218.                                                    int32 layer_id);
  219. extern JSObject         *lm_DefinePkcs11(MochaDecoder *decoder);
  220. /*
  221.  * Get (create if needed) document's form, link, and named anchor arrays.
  222.  */
  223. extern JSObject         *lm_GetFormArray(MochaDecoder *decoder,
  224.                                          JSObject *document);
  225. extern JSObject         *lm_GetLinkArray(MochaDecoder *decoder,
  226.                                          JSObject *document);
  227. extern JSObject         *lm_GetNameArray(MochaDecoder *decoder,
  228.                                          JSObject *document);
  229. extern JSObject         *lm_GetAppletArray(MochaDecoder *decoder,
  230.                                            JSObject *document);
  231. extern JSObject         *lm_GetEmbedArray(MochaDecoder *decoder,
  232.                                           JSObject *document);
  233. extern JSObject         *lm_GetImageArray(MochaDecoder *decoder,
  234.                                           JSObject *document);
  235. extern JSObject         *lm_GetDocumentLayerArray(MochaDecoder *decoder,
  236.                                                   JSObject *document);
  237.  
  238.  
  239. /*
  240.  * dummy object for applets and embeds that can't be reflected
  241.  */
  242. extern JSObject *lm_DummyObject;
  243. extern void lm_InitDummyObject(JSContext *cx);
  244.  
  245. /* bit vector for handlers */
  246. typedef enum  {
  247.     HANDLER_ONCLICK = 1 << 0,
  248.     HANDLER_ONFOCUS = 1 << 1,
  249.     HANDLER_ONBLUR = 1 << 2,
  250.     HANDLER_ONCHANGE = 1 << 3,
  251.     HANDLER_ONSELECT = 1 << 4,
  252.     HANDLER_ONSCROLL = 1 << 5,
  253.     HANDLER_ONMOUSEDOWN = 1 << 6,
  254.     HANDLER_ONMOUSEUP = 1 << 7,
  255.     HANDLER_ONKEYDOWN = 1 << 8,
  256.     HANDLER_ONKEYUP = 1 << 9,
  257.     HANDLER_ONKEYPRESS = 1 << 10,
  258.     HANDLER_ONDBLCLICK = 1 << 11
  259. } JSHandlersBitVector;
  260.  
  261. /*
  262.  * Base class of all JS input private object data structures.
  263.  */
  264. typedef struct JSInputBase {
  265.     MochaDecoder        *decoder;       /* this window's JS decoder */
  266.     int32               type;           /* layout form element type */
  267.     JSHandlersBitVector    handlers;    /* bit vector for handlers */
  268. } JSInputBase;
  269.  
  270. /*
  271.  * Base class of event-handling elements like layers and documents.
  272.  */
  273. typedef struct JSInputHandler {
  274.     JSInputBase     base;           /* decoder and type */
  275.     JSObject        *object;        /* this input handler's JS object */
  276.     uint32          event_mask;     /* mask of events in progress */
  277. } JSInputHandler;
  278.  
  279. /*
  280.  * Base class of input event-capturing elements like layers and documents.
  281.  */
  282. typedef struct JSEventReceiver {
  283.     JSObject        *object;        /* this event receiver's JS object */
  284.     uint32          event_mask;     /* mask of events in progress */
  285. } JSEventReceiver;
  286.  
  287. /*
  288.  * Base class of input event-handling elements like anchors and form inputs.
  289.  */
  290. typedef struct JSEventCapturer {
  291.     JSEventReceiver base;        /* this event capturer's receiver base */
  292.     uint32          event_bit;        /* mask of events being captured */
  293. } JSEventCapturer;
  294.  
  295. #define base_decoder    base.decoder
  296. #define base_type       base.type
  297. #define base_handlers    base.handlers
  298.  
  299. /*
  300.  * JS URL object.
  301.  *
  302.  * Location is a special URL: when you set one of its properties, your client
  303.  * window goes to the newly formed address.
  304.  */
  305. typedef struct JSURL {
  306.     JSInputHandler  handler;
  307.     int32           layer_id;
  308.     uint32          index;
  309.     JSString        *href;
  310.     JSString        *target;
  311.     JSString        *text;
  312. } JSURL;
  313.  
  314. /* JS Document Object
  315.  * Documents exist per-window and per-layer
  316.  */
  317. typedef struct JSDocument {
  318.     JSEventCapturer    capturer;
  319.     MochaDecoder        *decoder;
  320.     JSObject            *object;
  321.     int32               layer_id;     /* The containing layer's id */
  322.     JSObject            *forms;
  323.     JSObject            *links;
  324.     JSObject            *anchors;
  325.     JSObject            *applets;
  326.     JSObject            *embeds;
  327.     JSObject            *images;
  328.     JSObject            *layers;
  329. } JSDocument;
  330.  
  331. #define URL_NOT_INDEXED ((uint32)-1)
  332.  
  333. #define url_decoder     handler.base_decoder
  334. #define url_type        handler.base_type
  335. #define url_object      handler.object
  336. #define url_event_mask  handler.event_mask
  337.  
  338. extern JSURL *
  339. lm_NewURL(JSContext *cx, MochaDecoder *decoder,
  340.           LO_AnchorData *anchor_data, JSObject *document);
  341.  
  342. extern void
  343. lm_ReplaceURL(MWContext *context, URL_Struct *url_struct);
  344.  
  345. extern JSBool
  346. lm_GetURL(JSContext *cx, MochaDecoder *decoder, URL_Struct *url_struct);
  347.  
  348. extern const char *
  349. lm_CheckURL(JSContext *cx, const char *url_string, JSBool checkFile);
  350.  
  351. extern JSBool
  352. lm_CheckWindowName(JSContext *cx, const char *window_name);
  353.  
  354. extern PRHashTable *
  355. lm_GetIdToObjectMap(MochaDecoder *decoder);
  356.  
  357. extern JSBool PR_CALLBACK
  358. lm_BranchCallback(JSContext *cx, JSScript *script);
  359.  
  360. extern void PR_CALLBACK
  361. lm_ErrorReporter(JSContext *cx, const char *message,
  362.                  JSErrorReport *report);
  363.  
  364. extern JSObject *
  365. lm_GetFormObjectByID(MWContext *context, int32 layer_id, uint form_id);
  366.  
  367. extern LO_FormElementStruct *
  368. lm_GetFormElementByIndex(JSContext * cx, JSObject *form_obj, int32 index);
  369.  
  370. extern JSObject *
  371. lm_GetFormElementFromMapping(JSContext *cx, JSObject *form_obj, uint32 index);
  372.  
  373. extern JSBool
  374. lm_AddFormElement(JSContext *cx, JSObject *form, JSObject *obj,
  375.                   char *name, uint index);
  376.  
  377. extern JSBool
  378. lm_ReflectRadioButtonArray(MWContext *context, int32 layer_id, intn form_id,
  379.                            const char *name, PA_Tag * tag);
  380.  
  381. extern JSBool
  382. lm_SendEvent(MWContext *context, JSObject *obj, JSEvent *event,
  383.              jsval *result);
  384.  
  385. extern JSBool
  386. lm_HandleEvent(JSContext *cx, JSObject *obj, JSObject *eventObj,
  387.            jsval funval, jsval *result);
  388.  
  389. extern JSBool
  390. lm_FindEventHandler(MWContext *context, JSObject *obj, JSObject *eventObj,
  391.              jsval funval, jsval *result);
  392.  
  393. extern JSObject *
  394. lm_NewEventObject(MochaDecoder * decoder, JSEvent * pEvent);
  395.  
  396. typedef struct JSEventNames {
  397.     const char *lowerName;
  398.     const char *mixedName;
  399. } JSEventNames;
  400.  
  401. extern const char *
  402. lm_EventName(uint32 event_bit);
  403.  
  404. extern JSEventNames *
  405. lm_GetEventNames(uint32 event_bit);
  406.  
  407. /*
  408.  * Compile the given attribute and attach it to the JSObject
  409.  */
  410. extern JSBool
  411. lm_CompileEventHandler(MochaDecoder * decoder, PA_Block id, PA_Block data, 
  412.                int newline_count, JSObject *object, const char *name, 
  413.                PA_Block block);
  414.  
  415. extern uint32
  416. lm_FindEventInMWContext(MWContext *context);
  417.  
  418. /*
  419.  * Remember the current form object that we are processing
  420.  */
  421. extern void
  422. lm_SetActiveForm(MWContext * context, int32 id);
  423.  
  424. /*
  425.  * Called when we want to get rid of the old contents of a layer
  426.  * and create a new document.
  427.  */
  428. extern void
  429. lm_NewLayerDocument(MochaDecoder *decoder, int32 layer_id);
  430.  
  431. /*
  432.  * Called to set the source URL as a result of a document.open() on the
  433.  * layer's document.
  434.  */
  435. JSBool
  436. lm_SetLayerSourceURL(MochaDecoder *decoder, int32 layer_id, char *url);
  437.  
  438. /*
  439.  * Get a layer obj from a parent id and a layer name. Used for lazy reflection.
  440.  */
  441. extern JSObject *
  442. lm_GetNamedLayer(MochaDecoder *decoder, int32 parent_layer_id, 
  443.                  const char *name);
  444.  
  445. extern const char *
  446. lm_GetLayerOriginURL(JSContext *cx, JSObject *obj);
  447.  
  448.  
  449. /* Clears out object references from the doc private data */
  450. extern void
  451. lm_CleanUpDocumentRoots(MochaDecoder *decoder, JSObject *obj);
  452.  
  453. /* Calls CleanUpDocumentRoots for a layer's document */
  454. extern void
  455. lm_DestroyLayer(MWContext *context, JSObject *obj);
  456.  
  457. /* 
  458.  * Called when the content associated with a document is destroyed,
  459.  * but the document itself may not be. Cleans out object references
  460.  * from doc private data (so that the objects can be collected). Also
  461.  * deals with correctly relinquishing event capture.
  462.  */
  463. extern void
  464. lm_CleanUpDocument(MochaDecoder *decoder, JSObject *document);
  465.  
  466. extern NET_StreamClass *
  467. lm_ClearDecoderStream(MochaDecoder *decoder, JSBool fromDiscard);
  468.  
  469. extern void
  470. lm_ProcessImageEvent(MWContext *context, JSObject *obj,
  471.                      LM_ImageEvent event);
  472.  
  473. extern JSObject *
  474. lm_NewImage(JSContext *cx, LO_ImageStruct *image_data);
  475.  
  476. extern JSObject *
  477. lm_NewSoftupObject(JSContext *cx, MochaDecoder *decoder, const char *jarargs);
  478.  
  479. extern void
  480. lm_RegisterComponent(const char *targetName, ETBoolPtrFunc active_callback, 
  481.              ETVoidPtrFunc startup_callback);
  482.  
  483. extern void
  484. lm_RegisterComponentProp(const char *comp, const char *targetName, 
  485.              uint8 retType, ETCompPropSetterFunc setter, 
  486.              ETCompPropGetterFunc getter);
  487.  
  488. extern void
  489. lm_RegisterComponentMethod(const char *comp, const char *targetName, 
  490.                uint8 retType, ETCompMethodFunc method, int32 nargs);
  491.  
  492. /*
  493.  * Class initializers (the wave of the future).
  494.  */
  495. extern JSBool
  496. lm_InitDocumentClass(MochaDecoder *decoder);
  497.  
  498. extern JSBool
  499. lm_InitImageClass(MochaDecoder *decoder);
  500.  
  501. extern JSBool
  502. lm_InitAnchorClass(MochaDecoder *decoder);
  503.  
  504. extern JSBool
  505. lm_InitLayerClass(MochaDecoder *decoder);
  506.  
  507. extern JSBool
  508. lm_InitInputClasses(MochaDecoder *decoder);
  509.  
  510. extern JSBool
  511. lm_InitEventClasses(MochaDecoder *decoder);
  512.  
  513. extern JSBool
  514. lm_InitRectClass(MochaDecoder *decoder);
  515.  
  516. /* Create an image context for anonymous images. */
  517. extern JSBool
  518. lm_NewImageContext(MWContext *context, MochaDecoder *decoder);
  519.  
  520. /* 
  521.  * Called to save and restore timeouts across a resize_reload.
  522.  */
  523. void
  524. lm_SaveWindowTimeouts(MochaDecoder *decoder);
  525.  
  526. void
  527. lm_RestoreWindowTimeouts(MochaDecoder *decoder);
  528.  
  529. /*
  530.  * Call this function from LO_ResetForm() to let the form's onReset attribute
  531.  * event handler run and do specialized form element data reinitialization.
  532.  * Returns JS_TRUE if the form reset should continue, JS_FALSE if it
  533.  * should be aborted.
  534.  */
  535. extern JSBool
  536. lm_SendOnReset(MWContext *context, JSEvent *event, LO_Element *element);
  537.  
  538. /*
  539.  * See if our outer object is the current form or the document
  540.  */
  541. extern JSObject *
  542. lm_GetOuterObject(MochaDecoder * decoder);
  543.  
  544. /*
  545.  * Entry point for the netlib to notify JS of load and unload events.
  546.  */
  547. extern void
  548. lm_SendLoadEvent(MWContext *context, int32 event, JSBool resize_reload);
  549.  
  550. /*
  551.  * Load or unload event for a layer
  552.  */
  553. extern void
  554. lm_SendLayerLoadEvent(MWContext *context, int32 event, int32 layer_id, JSBool resize_reload);
  555.  
  556. /*
  557.  * This one should be called when a form is submitted.  If there is an
  558.  * INPUT tag of type "submit", the JS author could write an "onClick"
  559.  * handler property of the submit button, but for forms that auto-submit
  560.  * we want an "onSubmit" form property handler.
  561.  *
  562.  * Returns JS_TRUE if the submit should continue, JS_FALSE if it
  563.  * should be aborted.
  564.  */
  565. extern JSBool
  566. lm_SendOnSubmit(MWContext *context, JSEvent *event, LO_Element *element);
  567.  
  568. extern JSBool
  569. lm_InputEvent(MWContext *context, LO_Element *element, JSEvent *pEvent,
  570.             jsval *rval);
  571.  
  572. extern JSBool
  573. lm_KeyInputEvent(MWContext *context, LO_Element *element, JSEvent *pEvent,
  574.             jsval *rval);
  575.  
  576. extern JSBool
  577. lm_MouseInputEvent(MWContext *context, LO_Element *element, JSEvent *pEvent,
  578.             jsval *rval);
  579.  
  580. extern NET_StreamClass *
  581. lm_DocCacheConverter(MWContext * context, URL_Struct * url,
  582.              const char * wysiwyg_url);
  583.  
  584. extern char *
  585. lm_MakeWysiwygUrl(JSContext *cx, MochaDecoder *decoder, int32 layer_id,
  586.                   JSPrincipals *principals);
  587.  
  588. typedef struct JSObjectArray {
  589.     MochaDecoder        *decoder;
  590.     jsint        length;
  591.     int32               layer_id;
  592. } JSObjectArray;
  593.  
  594. extern JSBool
  595. lm_AddObjectToArray(JSContext * cx, JSObject * array_obj,
  596.              const char * name, jsint index, JSObject * obj);
  597.  
  598. /* Version Information; sits on top of JS_SetVersion and JS_GetVersion */
  599. extern void
  600. lm_SetVersion(MochaDecoder *decoder, JSVersion version);
  601.  
  602. #define lm_GetVersion(decoder) JS_GetVersion((decoder)->js_context)
  603.  
  604. /* 
  605.  * Security -----------------------------------
  606.  */
  607.  
  608. typedef enum JSTarget {
  609.     JSTARGET_UNIVERSAL_BROWSER_READ,
  610.     JSTARGET_UNIVERSAL_BROWSER_WRITE,
  611.     JSTARGET_UNIVERSAL_SEND_MAIL,
  612.     JSTARGET_UNIVERSAL_FILE_READ,
  613.     JSTARGET_UNIVERSAL_FILE_WRITE,
  614.     JSTARGET_UNIVERSAL_PREFERENCES_READ,
  615.     JSTARGET_UNIVERSAL_PREFERENCES_WRITE,
  616.     JSTARGET_MAX
  617. } JSTarget;
  618.  
  619. extern const char *
  620. lm_GetSubjectOriginURL(JSContext *cx);
  621.  
  622. extern const char *
  623. lm_GetObjectOriginURL(JSContext *cx, JSObject *object);
  624.  
  625. extern const char *
  626. lm_SetObjectOriginURL(JSContext *cx, JSObject *object, const char *origin);
  627.  
  628. extern JSPrincipals *
  629. lm_GetPrincipalsFromStackFrame(JSContext *cx);
  630.  
  631. extern JSPrincipals *
  632. lm_GetCompilationPrincipals(MochaDecoder *decoder, 
  633.                             JSPrincipals *layoutPrincipals);
  634.  
  635. extern JSBool
  636. lm_CanAccessTarget(JSContext *cx, JSTarget target);
  637.  
  638. extern JSBool
  639. lm_CheckPermissions(JSContext *cx, JSObject *obj, JSTarget target);
  640.  
  641. extern JSBool
  642. lm_GetCrossOriginEnabled(void);
  643.  
  644. extern JSBool
  645. lm_CheckContainerAccess(JSContext *cx, JSObject *obj, MochaDecoder *decoder,
  646.                         JSTarget target);
  647.  
  648. /* 
  649.  * Get the innermost (in the sense of the parent scope chain of "obj") 
  650.  * nonnull principals. Will create principals at the window level if 
  651.  * none exist. Will always return nonnull principals except in the case 
  652.  * of memory failure. 
  653.  * Argument "container" specifies the start of the search, the 
  654.  * container where the principals were found will be stored into 
  655.  * "foundIn" if "foundIn" is nonnull. 
  656.  */
  657. extern JSPrincipals *
  658. lm_GetInnermostPrincipals(JSContext *cx, JSObject *container, 
  659.                           JSObject **foundIn);
  660.  
  661. extern JSPrincipals *
  662. lm_GetContainerPrincipals(JSContext *cx, JSObject *container);
  663.  
  664. extern void
  665. lm_SetContainerPrincipals(JSContext *cx, JSObject *container, 
  666.                           JSPrincipals *principals);
  667.  
  668. extern JSBool 
  669. lm_CanCaptureEvent(JSContext *cx, JSFunction *fun, JSEvent *event);
  670.  
  671. extern void
  672. lm_SetExternalCapture(JSContext *cx, JSPrincipals *principals, 
  673.                       JSBool b);
  674.  
  675. extern JSBool
  676. lm_AddSetParentSecurityCheck(JSContext *cx, JSObject *obj);
  677.  
  678. extern JSBool
  679. lm_SetDocumentDomain(JSContext *cx, JSPrincipals *principals, 
  680.                      const char *newDomain);
  681.  
  682. extern void
  683. lm_InvalidateCertPrincipals(MochaDecoder *decoder, JSPrincipals *principals);
  684.  
  685. extern void
  686. lm_DestroyPrincipalsList(JSContext *cx, JSPrincipalsList *list);
  687.  
  688. /* 
  689.  * --------------------------------------------
  690.  */
  691.  
  692. /* For when mozilla needs to call LM_PutMochaDecoder in the mocha thread. */
  693. extern void
  694. et_PutMochaDecoder(MWContext *context, MochaDecoder *decoder);
  695.  
  696. /* This function is private to libmocha, so don't stuff it in libevent.h, chouck ! */
  697. extern int32
  698. ET_PostCreateLayer(MWContext *context, int32 wrap_width, int32 parent_layer_id);
  699.  
  700. extern void
  701. lm_RestoreLayerState(MWContext *context, int32 layer_id, 
  702.                      LO_BlockInitializeStruct *param);
  703.  
  704. extern PRHashNumber 
  705. lm_KeyHash(const void *key);
  706.  
  707. extern JSBool
  708. lm_jsval_to_rgb(JSContext *cx, jsval *vp, LO_Color **rgbp);
  709.  
  710. extern JSBool
  711. layer_setBgColorProperty(JSContext *cx, JSObject *obj, jsval *vp);
  712.  
  713. extern JSObject *
  714. lm_GetActiveContainer(MochaDecoder *decoder);
  715.  
  716. extern JSBool
  717. lm_GetPrincipalsCompromise(JSContext *cx, JSObject *obj);
  718.  
  719. extern char *
  720. lm_FixNewlines(JSContext *cx, const char *value, JSBool formElement);
  721.  
  722. extern JSBool PR_CALLBACK
  723. win_open(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval);
  724.  
  725.  
  726. /* defined in libmocha.h */
  727. #ifdef JSDEBUGGER   
  728.  
  729. extern void
  730. lm_InitJSDebug(JSRuntime *jsruntime);
  731.  
  732. extern void
  733. lm_ExitJSDebug(JSRuntime *jsruntime);
  734.  
  735. #endif
  736.  
  737. #define IS_MESSAGE_WINDOW(context)                                           \
  738. (((context)->type == MWContextMail)      ||                                  \
  739.  ((context)->type == MWContextNews)      ||                                  \
  740.  ((context)->type == MWContextMailMsg)   ||                                  \
  741.  ((context)->type == MWContextNewsMsg))
  742.  
  743. /* INTL support */
  744.  
  745. extern char *
  746. lm_StrToLocalEncoding(MWContext * context, JSString * str);
  747.  
  748. extern JSString *
  749. lm_LocalEncodingToStr(MWContext * context, char * bytes);
  750.  
  751. /* end INTL support */
  752.  
  753. #endif /* lm_h___ */
  754.