浏览器环境自吐模块

发布时间 2023-04-03 16:40:07作者: 守护式等待

https://github.com/daisixuan/r0chrome

使用chromium查看js使用那些环境

 

dtavm = {}
dtavm.log = console.log
dtavm.proxy = function (obj, objname, type){
    function getMethodHandler(WatchName, target_obj) {
    let methodhandler = {
        apply(target, thisArg, argArray) {
			if (this.target_obj){
				thisArg = this.target_obj
			}
            let result = Reflect.apply(target, thisArg, argArray)
            if (target.name !== "toString"){
                if (target.name === "addEventListener"){
                    dtavm.log(`[${WatchName}] apply function name is [${target.name}], argArray is [${argArray[0]}], result is [${result}].`)
                }else if (WatchName === "window.console"){
                }else {
                    dtavm.log(`[${WatchName}] apply function name is [${target.name}], argArray is [${argArray}], result is [${result}].`)
                }
            }else{
                dtavm.log(`[${WatchName}] apply function name is [${target.name}], argArray is [${argArray}], result is [${result}].`)
            }
			return result
        },
        construct(target, argArray, newTarget) {
            var result = Reflect.construct(target, argArray, newTarget)
            dtavm.log(`[${WatchName}] construct function name is [${target.name}], argArray is [${argArray}], result is [${(result)}].`)
            return result;
        }
    }
	methodhandler.target_obj = target_obj
    return methodhandler
}

    function getObjhandler(WatchName) {
    let handler = {
        get(target, propKey, receiver) {
            let result = target[propKey]
            if (result instanceof Object) {
                if (typeof result === "function") {
                    dtavm.log(`[${WatchName}] getting propKey is [${propKey}] , it is function`)
                    return new Proxy(result,getMethodHandler(WatchName, target))
                }
                else {
                    dtavm.log(`[${WatchName}] getting propKey is [${propKey}], result is [${(result)}]`);
                }
                return new Proxy(result, getObjhandler(`${WatchName}.${propKey}`))
            }
            if(typeof(propKey) !== "symbol"){
                dtavm.log(`[${WatchName}] getting propKey is [${propKey?.description ?? propKey}], result is [${result}]`);
            }
            return result;
        },
        set(target, propKey, value, receiver) {
            if (value instanceof Object) {
                dtavm.log(`[${WatchName}] setting propKey is [${propKey}], value is [${(value)}]`);
            } else {
                dtavm.log(`[${WatchName}] setting propKey is [${propKey}], value is [${value}]`);
            }
            return Reflect.set(target, propKey, value, receiver);
        },
        has(target, propKey) {
            var result = Reflect.has(target, propKey);
            dtavm.log(`[${WatchName}] has propKey [${propKey}], result is [${result}]`)
            return result;
        },
        deleteProperty(target, propKey) {
            var result = Reflect.deleteProperty(target, propKey);
            dtavm.log(`[${WatchName}] delete propKey [${propKey}], result is [${result}]`)
            return result;
        },
        defineProperty(target, propKey, attributes) {
            var result = Reflect.defineProperty(target, propKey, attributes);
            dtavm.log(`[${WatchName}] defineProperty propKey [${propKey}] attributes is [${(attributes)}], result is [${result}]`)
            return result
        },
        getPrototypeOf(target) {
            var result = Reflect.getPrototypeOf(target)
            dtavm.log(`[${WatchName}] getPrototypeOf result is [${(result)}]`)
            return result;
        },
        setPrototypeOf(target, proto) {
            dtavm.log(`[${WatchName}] setPrototypeOf proto is [${(proto)}]`)
            return Reflect.setPrototypeOf(target, proto);
        },
        preventExtensions(target) {
            dtavm.log(`[${WatchName}] preventExtensions`)
            return Reflect.preventExtensions(target);
        },
        isExtensible(target) {
            var result = Reflect.isExtensible(target)
            dtavm.log(`[${WatchName}] isExtensible, result is [${result}]`)
            return result;
        },
    }
    return handler;
}

    if (type === "method"){
        return new Proxy(obj, getMethodHandler(objname, obj));
    }
    return new Proxy(obj, getObjhandler(objname));
}

Object.defineProperties(globalThis, {
    'window': {
        configurable: false,
        enumerable: true,
        get: function get() {
            return dtavm.proxy(window_dta, "window")
        },
        set: undefined
    },
    'navigator': {
        configurable: true,
        enumerable: true,
        get: function get() {
            return dtavm.proxy(navigator_dta, "navigator")
        },
        set: undefined
    },
	'document': {
        configurable: false,
        enumerable: true,
        get: function get() {
            return dtavm.proxy(document_dta, "document")
        },
        set: undefined
    },
	'history': {
        configurable: true,
        enumerable: true,
        get: function get() {
            return dtavm.proxy(history_dta, "history")
        },
        set: undefined
    },
})
screen = dtavm.proxy(screen_dta, "screen")

成功监控对象