JSURL * lm_NewURL(JSContext *cx, MochaDecoder *decoder, LO_AnchorData *anchor_data, JSObject *document) { JSObject *obj; JSURL *url; JSString *str; if (!decoder->url_prototype) { obj = JS_InitClass(cx, decoder->window_object, decoder->event_receiver_prototype, &lm_url_class, Url, 0, url_props, NULL, NULL, NULL); if (!obj) return NULL; decoder->url_prototype = obj; } url = JS_malloc(cx, sizeof *url); if (!url) return NULL; XP_BZERO(url, sizeof *url); obj = JS_NewObject(cx, &lm_url_class, decoder->url_prototype, lm_GetOuterObject(decoder)); if (!obj || !JS_SetPrivate(cx, obj, url)) { JS_free(cx, url); return NULL; } if (!JS_DefineFunctions(cx, obj, url_methods)) return NULL; url->url_decoder = HOLD_BACK_COUNT(decoder); url->url_type = FORM_TYPE_NONE; url->index = URL_NOT_INDEXED; url->url_object = obj; str = JS_NewStringCopyZ(cx, (char *) anchor_data->anchor); if (!str) return NULL; url->href = str; if (!JS_AddNamedRoot(cx, &url->href, "url.href")) return NULL; if (anchor_data->target) { str = JS_NewStringCopyZ(cx, (char *) anchor_data->target); if (!str) return NULL; url->target = str; } if (!JS_AddNamedRoot(cx, &url->target, "url.target")) return NULL; if (anchor_data->element && anchor_data->element->type == LO_TEXT) { str = lm_LocalEncodingToStr(decoder->window_context, (char *) anchor_data->element->lo_text.text); if (!str) return NULL; url->text = str; } if (!JS_AddNamedRoot(cx, &url->text, "url.text")) return NULL; return url; }
JSObject * LM_ReflectEmbed(MWContext *context, LO_EmbedStruct *lo_embed, PA_Tag * tag, int32 layer_id, uint index) { JSObject *obj, *array_obj, *outer_obj, *document; MochaDecoder *decoder; JSContext *cx; char *name; int i; obj = lo_embed->mocha_object; if (obj) return obj; decoder = LM_GetMochaDecoder(context); if (!decoder) return NULL; cx = decoder->js_context; /* get the name */ name = 0; for (i = 0; i < lo_embed->attribute_cnt; i++) { if (!XP_STRCASECMP(lo_embed->attribute_list[i], "name")) { name = strdup(lo_embed->value_list[i]); break; } } /* Get the document object that will hold this applet */ document = lm_GetDocumentFromLayerId(decoder, layer_id); if (!document) { LM_PutMochaDecoder(decoder); return NULL; } array_obj = lm_GetEmbedArray(decoder, document); if (!array_obj) { LM_PutMochaDecoder(decoder); return NULL; } /* XXX should pass thru ReallyReflectApplet to whatever calls NewObject */ outer_obj = lm_GetOuterObject(decoder); /* this function does the real work */ obj = lm_ReallyReflectEmbed(context, lo_embed, layer_id, index); if (!obj) goto out; /* put it in the embed array */ if (!lm_AddObjectToArray(cx, array_obj, name, index, obj)) { obj = NULL; goto out; } /* put it in the document scope */ if (name && !JS_DefineProperty(cx, outer_obj, name, OBJECT_TO_JSVAL(obj), NULL, NULL, JSPROP_ENUMERATE | JSPROP_READONLY)) { PR_LOG(Moja, warn, ("failed to define embed 0x%x as %s\n", lo_embed, name)); /* XXX remove it altogether? */ } /* cache it in layout data structure */ lo_embed->mocha_object = obj; out: LM_PutMochaDecoder(decoder); return obj; }