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 + -
显示快捷键?