Evaluación de Javascript en semi-sandboxing

Fondo: Estoy trabajando en un marco / biblioteca que se utilizará para un sitio específico en coordinación con greasemonkey / userscripts. Este marco / biblioteca permitirá soporte adicional. La forma en que funcionará es que un complemento se registre con la biblioteca que enumera las páginas requeridas, los recursos, el ectera y la biblioteca esperará hasta que se cumplan todas las críticas para llamar al complementoload() función.

La cuestión: En esta lista de 'cosas necesarias' quiero que los desarrolladores de complementos puedan especificar javascript (como cadena) para que se evalúen como un 'recurso requerido'. Por ejemplo'document.getElementById("banana")'. Lo que quiero hacer es hacer una evaluación de 'recurso requerido' en semi sandbox para que la evaluación pueda acceder a los objetos de ventana y DOM, pero no puede alterarlos directamente. También me gustaría hacer que eval, y evalJS sean inaccesibles desde el sandbox.


Ejemplos:

document.getElementById("banana") -> válidodocument.getElementById("apple).id = "orange" -> inválidowindow.grape -> válidowindow.grape = 'potato' -> inválido(someObj.applesCount > 0 ? 'some' : 'none') -> válido


Lo que tengo hasta ahora:

function safeEval(input) {

    // Remove eval and evalJS from the window:
    var e = [window.eval, window.evalJS], a;
    window.eval = function(){};
    window.evalJS = function(){};

    try {

        /* More sanition needed before being passed to eval */

        // Eval the input, stuffed into an annonomous function
        // so the code to be evalued can not access the stored
        // eval functions:
        a = (e[0])("(function(){return "+input+"}())");
    } catch(ex){}

    // Return eval and evalJS to the window:
    window.eval = e[0];
    window.evalJS = e[1];

    // Return the eval'd result
    return a;
}


Notas:
Este es un Greasemonkey / userscript. No tengo acceso directo para modificar el sitio, o es javascript.
La entrada parasafeEval() puede ser cualquier javascript válido, ya sea una consulta de DOM o evaluaciones simples siempre que no altere el objeto de la ventana o DOM.

Respuestas a la pregunta(4)

Su respuesta a la pregunta