mgjs_document.cpp

来自「monqueror一个很具有参考价值的源玛」· C++ 代码 · 共 438 行

CPP
438
字号
#include "mgjs_main.h"#include <htmltags.h>#define TEMPSTRINGMAX 512static JSBool GetDocumentProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);static JSBool SetDocumentProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);static JSBool HTMLDOCUMENT_Write(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);static JSBool HTMLDOCUMENT_Writeln(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);static JSBool HTMLDOCUMENT_GetElementById(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);static JSBool HTMLDOCUMENT_GetElementsByName(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);static JSBool HTMLDOCUMENT_Open(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);static JSBool HTMLDOCUMENT_Close(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);static JSBool HTMLDOCUMENT_GetElementByIdCommon(JSContext *cx, JSObject *obj, DOMString elementId,jsval *rval);static JSBool HTMLDOCUMENT_GetElementByNameCommon(JSContext *cx, JSObject *obj, DOMString elementName,jsval *rval);static JSBool NSHTMLDocumentCaptureEvents(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);static JSBool NSHTMLDocumentReleaseEvents(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);static JSBool NSHTMLDocumentRouteEvent(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);bool HTMLDOCUMENT_IsInternalMethod(char s[]);		enum Document_slots { 	HTMLDOCUMENT_TITLE,	HTMLDOCUMENT_REFERRER,	HTMLDOCUMENT_DOMAIN,	HTMLDOCUMENT_URL,	HTMLDOCUMENT_BODY,	HTMLDOCUMENT_IMAGES,	HTMLDOCUMENT_APPLETS,	HTMLDOCUMENT_LINKS,  	HTMLDOCUMENT_FORMS,	HTMLDOCUMENT_ANCHORS,	HTMLDOCUMENT_COOKIE,	//NOTE: following properties are netscape's.	NSHTMLDOCUMENT_WIDTH ,	NSHTMLDOCUMENT_HEIGHT ,	NSHTMLDOCUMENT_ALINKCOLOR ,	NSHTMLDOCUMENT_LINKCOLOR ,	NSHTMLDOCUMENT_VLINKCOLOR ,	NSHTMLDOCUMENT_BGCOLOR ,	NSHTMLDOCUMENT_FGCOLOR ,	NSHTMLDOCUMENT_LASTMODIFIED ,	NSHTMLDOCUMENT_EMBEDS 				};static JSBool GetDocumentProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp){	DOM::HTMLDocumentImpl *pDoc;	pDoc=mgJSGetDoc(cx);		DOMString ds;		JSObject *newObj;	DOM::HTMLCollectionImpl *hCollectionImpl;	HTMLElementImpl *eImpl;	char s[TEMPSTRINGMAX+1];	JSString *jss;	bool bIsInternalMethod;	JSObject *proto=mgJSGetElementObj(cx);	if (JSVAL_IS_INT(id)) {        switch (JSVAL_TO_INT(id)) {		case HTMLDOCUMENT_TITLE:			*vp=STRING_TO_JSVAL (JS_NewStringCopyZ (cx,"This is my Document property."));		  	break;		case HTMLDOCUMENT_FORMS:			hCollectionImpl=new HTMLCollectionImpl((NodeImpl *)pDoc->body(), HTMLCollectionImpl::DOC_FORMS);			eImpl=(HTMLElementImpl*)(hCollectionImpl->item(0));			delete hCollectionImpl;			newObj=NewScriptHTMLFormElement(cx,proto,0,eImpl);			*vp=OBJECT_TO_JSVAL(newObj);			break;		case HTMLDOCUMENT_IMAGES:			hCollectionImpl=new HTMLCollectionImpl((NodeImpl *)pDoc->body(), HTMLCollectionImpl::DOC_IMAGES);			eImpl=(HTMLElementImpl*)(hCollectionImpl->item(0));			delete hCollectionImpl;			newObj=NewScriptHTMLImageElement(cx,proto,0,eImpl);			*vp=OBJECT_TO_JSVAL(newObj);			break;		case HTMLDOCUMENT_APPLETS:			hCollectionImpl=new HTMLCollectionImpl((NodeImpl *)pDoc->body(), HTMLCollectionImpl::DOC_APPLETS);			eImpl=(HTMLElementImpl*)(hCollectionImpl->item(0));			delete hCollectionImpl;			newObj=NewScriptHTMLAppletElement(cx,proto,0,eImpl);			*vp=OBJECT_TO_JSVAL(newObj);			break;		case HTMLDOCUMENT_LINKS:			hCollectionImpl=new HTMLCollectionImpl((NodeImpl *)pDoc->body(), HTMLCollectionImpl::DOC_LINKS);			eImpl=(HTMLElementImpl*)(hCollectionImpl->item(0));			delete hCollectionImpl;			newObj=NewScriptHTMLLinkElement(cx,proto,0,eImpl);			*vp=OBJECT_TO_JSVAL(newObj);			break;		case HTMLDOCUMENT_ANCHORS:			hCollectionImpl=new HTMLCollectionImpl((NodeImpl *)pDoc->body(), HTMLCollectionImpl::DOC_ANCHORS);			eImpl=(HTMLElementImpl*)(hCollectionImpl->item(0));			delete hCollectionImpl;			newObj=NewScriptHTMLAnchorElement(cx,proto,0,eImpl);			*vp=OBJECT_TO_JSVAL(newObj);			break;		case HTMLDOCUMENT_BODY:			newObj=NewScriptHTMLBodyElement(cx,proto,0,0);			*vp=OBJECT_TO_JSVAL(newObj);			break;		case HTMLDOCUMENT_DOMAIN:			ds=pDoc->domain();			*vp=STRING_TO_JSVAL (JS_NewStringCopyZ (cx,ds.string()));			break;		case HTMLDOCUMENT_COOKIE:			//TODO://			ds=pDoc->cookie();//			*vp=STRING_TO_JSVAL (JS_NewStringCopyZ (cx,ds.string()));			break;		case HTMLDOCUMENT_URL:			ds=pDoc->URL();			*vp=STRING_TO_JSVAL (JS_NewStringCopyZ (cx,ds.string()));			break;		case HTMLDOCUMENT_REFERRER:			ds=pDoc->referrer();			*vp=STRING_TO_JSVAL (JS_NewStringCopyZ (cx,ds.string()));			break;					case NSHTMLDOCUMENT_WIDTH :			break;		case NSHTMLDOCUMENT_HEIGHT :			break;		case NSHTMLDOCUMENT_ALINKCOLOR :			break;		case NSHTMLDOCUMENT_LINKCOLOR :			break;		case NSHTMLDOCUMENT_VLINKCOLOR :			break;		case NSHTMLDOCUMENT_BGCOLOR :			break;		case NSHTMLDOCUMENT_FGCOLOR :			break;		case NSHTMLDOCUMENT_LASTMODIFIED :			*vp=STRING_TO_JSVAL (JS_NewStringCopyZ (cx,"2001.4.25"));			break;		case NSHTMLDOCUMENT_EMBEDS :			break;		}	}	else		{		if (!(jss = JS_ValueToString (cx, id)))return JS_FALSE;  		strncpy(s,(const char*)JS_GetStringBytes(jss),TEMPSTRINGMAX);		bIsInternalMethod=HTMLDOCUMENT_IsInternalMethod(s);		if(!bIsInternalMethod)			return HTMLDOCUMENT_GetElementByNameCommon(cx,obj,s,vp);		}	return JS_TRUE;}static JSBool SetDocumentProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp){#if 0	MGHTMLView* view;	HWND hWnd;	HDC hdc;#endif	WNDCLASS wndClass;	if (JSVAL_IS_INT(id)) {		switch (JSVAL_TO_INT(id)) {		case HTMLDOCUMENT_TITLE:			//TODO:			break;		case HTMLDOCUMENT_BODY:			//TODO:			break;		case HTMLDOCUMENT_COOKIE:			//TODO:			break;#if 0		//readonly					case HTMLDOCUMENT_REFERRER:			break;		case HTMLDOCUMENT_DOMAIN:			break;		case HTMLDOCUMENT_URL:			break;		case HTMLDOCUMENT_IMAGES:			break;		case HTMLDOCUMENT_APPLETS:			break;		case HTMLDOCUMENT_LINKS:			break;		case HTMLDOCUMENT_FORMS:			break;		case HTMLDOCUMENT_ANCHORS:			break;#endif					case NSHTMLDOCUMENT_WIDTH :			break;		case NSHTMLDOCUMENT_HEIGHT :			break;		case NSHTMLDOCUMENT_ALINKCOLOR :			break;		case NSHTMLDOCUMENT_LINKCOLOR :			break;		case NSHTMLDOCUMENT_VLINKCOLOR :			break;		case NSHTMLDOCUMENT_BGCOLOR :			//gal_pixel GUIAPI SetBkColor (HDC hdc, gal_pixel color);/*			view=mgJSGetView(cx);			hWnd=mgJSGethWnd(cx);			hWnd=view->getParent();			hdc=GetDC(hWnd);			SetBkColor (hdc,COLOR_red);			ReleaseDC(hdc);*/			GetWindowClassInfo (&wndClass);			wndClass.iBkColor=COLOR_red;			SetWindowClassInfo ((const WNDCLASS*)(&wndClass));//BOOL GUIAPI GetWindowClassInfo (PWNDCLASS pWndClass);//BOOL GUIAPI SetWindowClassInfo (const WNDCLASS* pWndClass);fprintf(stderr,"\n====document.bgColor\n");						break;		case NSHTMLDOCUMENT_FGCOLOR :			break;		case NSHTMLDOCUMENT_LASTMODIFIED :			break;		case NSHTMLDOCUMENT_EMBEDS :			break;		}	}	return JS_TRUE;}static JSBool HTMLDOCUMENT_Write(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	char stext[TEMPSTRINGMAX+1];	JSString *jss;	DOM::HTMLDocumentImpl *pDoc;		pDoc=mgJSGetDoc(cx);	if(!pDoc)return JS_FALSE;		if(argc<1)return JS_FALSE;	if(JSVAL_IS_OBJECT(argv[0]))	{		pDoc->write((QString)"Object");		return JS_TRUE;	}    if(!(jss = JS_ValueToString (cx, argv[0])))return JS_FALSE;	strncpy(stext,(const char*)JS_GetStringBytes (jss),TEMPSTRINGMAX);	pDoc->write((QString)stext);	return JS_TRUE;}static JSBool HTMLDOCUMENT_Writeln(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	char stext[TEMPSTRINGMAX+1];	JSString *jss;	DOM::HTMLDocumentImpl *pDoc;	pDoc=mgJSGetDoc(cx);	if(pDoc==NULL)return JS_FALSE;	if(argc<1)return JS_FALSE;	if(JSVAL_IS_OBJECT(argv[0]))	{		pDoc->write((QString)"Object");		return JS_TRUE;	}	if (!(jss = JS_ValueToString (cx, argv[0])))return JS_FALSE;  	strncpy( stext, JS_GetStringBytes (jss), TEMPSTRINGMAX );	pDoc->writeln( (QString)stext );	return JS_TRUE;}static JSBool HTMLDOCUMENT_GetElementById(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	DOMString elementId;	JSString *jss;    if (!(jss = JS_ValueToString (cx, argv[0])))return JS_FALSE;  	elementId = (const char*)JS_GetStringBytes (jss);	return HTMLDOCUMENT_GetElementByIdCommon(cx,obj,elementId,rval);}static JSBool HTMLDOCUMENT_GetElementsByName(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	DOM::HTMLDocumentImpl *pDoc;	pDoc=mgJSGetDoc(cx);	NodeListImpl *eImpl;	DOMString elementName;	JSString *jss;    if (!(jss = JS_ValueToString (cx, argv[0])))return JS_FALSE;  	elementName = (const char*)JS_GetStringBytes (jss);	eImpl=pDoc->getElementsByName(elementName);		*rval=STRING_TO_JSVAL (JS_NewStringCopyZ (cx,"This is get by name methods."));	return JS_TRUE;}static JSBool HTMLDOCUMENT_Open(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	DOM::HTMLDocumentImpl *pDoc;	pDoc=mgJSGetDoc(cx);	pDoc->open();		return JS_TRUE;}	static JSBool HTMLDOCUMENT_Close(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	DOM::HTMLDocumentImpl *pDoc;	pDoc=mgJSGetDoc(cx);	pDoc->close();	return JS_TRUE;}		static JSBool NSHTMLDocumentCaptureEvents(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	MGHTMLView *view = mgJSGetView(cx);	int32 b0;	if(argc<1)return JS_FALSE;	if (!JS_ValueToInt32(cx, argv[0], (int32 *)&b0)) 		return JS_FALSE;	view->m_JsEventTypeToCapture |= b0;	return JS_TRUE;}static JSBool NSHTMLDocumentReleaseEvents(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	MGHTMLView *view = mgJSGetView(cx);	int32 b0;	if(argc<1)return JS_FALSE;	if (!JS_ValueToInt32(cx, argv[0], (int32 *)&b0)) 		return JS_FALSE;	view->m_JsEventTypeToCapture &= ~b0;		return JS_TRUE;}static JSBool NSHTMLDocumentRouteEvent(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	return JS_TRUE;}	static JSPropertySpec DocumentProperties[] ={  {"title",HTMLDOCUMENT_TITLE,    JSPROP_ENUMERATE },  {"referrer",HTMLDOCUMENT_REFERRER,    JSPROP_ENUMERATE | JSPROP_READONLY},  {"domain",HTMLDOCUMENT_DOMAIN,    JSPROP_ENUMERATE | JSPROP_READONLY},  {"URL",HTMLDOCUMENT_URL,    JSPROP_ENUMERATE | JSPROP_READONLY},  {"body",HTMLDOCUMENT_BODY,    JSPROP_ENUMERATE },  {"images",    HTMLDOCUMENT_IMAGES,    JSPROP_ENUMERATE | JSPROP_READONLY},  {"applets",    HTMLDOCUMENT_APPLETS,    JSPROP_ENUMERATE | JSPROP_READONLY},  {"links",HTMLDOCUMENT_LINKS,    JSPROP_ENUMERATE | JSPROP_READONLY},  {"forms",HTMLDOCUMENT_FORMS,    JSPROP_ENUMERATE | JSPROP_READONLY},  {"anchors",HTMLDOCUMENT_ANCHORS,    JSPROP_ENUMERATE | JSPROP_READONLY},  {"cookie",    HTMLDOCUMENT_COOKIE,    JSPROP_ENUMERATE},    //following properties are NetScape's.  {"width",    NSHTMLDOCUMENT_WIDTH,    JSPROP_ENUMERATE | JSPROP_READONLY},  {"height",    NSHTMLDOCUMENT_HEIGHT,    JSPROP_ENUMERATE | JSPROP_READONLY},  {"alinkColor",    NSHTMLDOCUMENT_ALINKCOLOR,    JSPROP_ENUMERATE},  {"linkColor",    NSHTMLDOCUMENT_LINKCOLOR,    JSPROP_ENUMERATE},  {"vlinkColor",    NSHTMLDOCUMENT_VLINKCOLOR,    JSPROP_ENUMERATE},  {"bgColor",    NSHTMLDOCUMENT_BGCOLOR,    JSPROP_ENUMERATE},  {"fgColor",    NSHTMLDOCUMENT_FGCOLOR,    JSPROP_ENUMERATE},  {"lastModified",    NSHTMLDOCUMENT_LASTMODIFIED,    JSPROP_ENUMERATE | JSPROP_READONLY},  {"embeds",    NSHTMLDOCUMENT_EMBEDS,    JSPROP_ENUMERATE | JSPROP_READONLY},  {0}};static JSClass DocumentClass = {  "Document", JSCLASS_HAS_PRIVATE,  JS_PropertyStub,  JS_PropertyStub,  GetDocumentProperty,  SetDocumentProperty,  JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub };static JSFunctionSpec DocumentMethods[] = {	{"write",HTMLDOCUMENT_Write,1},	{"writeln",HTMLDOCUMENT_Writeln,1},	{"getElementById",HTMLDOCUMENT_GetElementById,1},	{"getElementsByName",HTMLDOCUMENT_GetElementsByName,1},	{"open",HTMLDOCUMENT_Open,0},	{"close",HTMLDOCUMENT_Close,0},#if 0	{"javaEnabled",          DocumentJavaEnabled,     0},	{"taintEnabled",          DocumentTaintEnabled,     0},	{"preference",          DocumentPreference,     0},#endif#if 0	//following properties are NetScape's.	{"getSelection",          NSHTMLDocumentGetSelection,     0},	{"namedItem",          NSHTMLDocumentNamedItem,     0},	{"clear",          NSHTMLDocumentClear,     0},#endif		{"captureEvents",          NSHTMLDocumentCaptureEvents,     1},	{"releaseEvents",          NSHTMLDocumentReleaseEvents,     1},	{"routeEvent",          NSHTMLDocumentRouteEvent,     1},	{0}};JSObject* InitDocumentClass(JSContext *cx,JSObject *globalObj,JSObject *proto){	JSObject *Obj;	Obj = JS_DefineObject (cx,globalObj, "document", &DocumentClass,proto,JSPROP_ENUMERATE);    JS_DefineProperties (cx,Obj,DocumentProperties);    JS_DefineFunctions (cx,Obj,DocumentMethods);	return Obj;}		static JSBool HTMLDOCUMENT_GetElementByNameCommon(JSContext *cx, JSObject *obj, DOMString elementName,jsval *rval){	DOM::HTMLDocumentImpl *pDoc;	pDoc=mgJSGetDoc(cx);	ElementImpl *eImpl;	JSObject *protoObj=mgJSGetElementObj(cx);	JSObject *parentObj=obj;	eImpl=(ElementImpl*)((pDoc->getElementsByName(elementName))->item(0));		return HTML_NewObjectByElementCommon(cx,obj,protoObj,parentObj,eImpl,rval);}static JSBool HTMLDOCUMENT_GetElementByIdCommon(JSContext *cx, JSObject *obj, DOMString elementId,jsval *rval){	DOM::HTMLDocumentImpl *pDoc;	pDoc=mgJSGetDoc(cx);	ElementImpl *eImpl;	eImpl=pDoc->getElementById(elementId);#if DEBUG_BY_XHTANGfprintf(stderr,"doc.cpp ID:%s eImpl:%p\n",(const char*)elementId.string(),eImpl);#endif	JSObject *protoObj=mgJSGetElementObj(cx);	JSObject *parentObj=obj;	return HTML_NewObjectByElementCommon(cx,obj,protoObj,parentObj,eImpl,rval);}bool HTMLDOCUMENT_IsInternalMethod(char s[]){	return !strcmp(s,"write")||!strcmp(s,"writeln")			||!strcmp(s,"getElementById")||!strcmp(s,"getElementsByName")			||!strcmp(s,"open")||!strcmp(s,"close")			||!strcmp(s,"javaEnabled")||!strcmp(s,"taintEnabled")			||!strcmp(s,"preference");}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?