follow me on Twitter

    MozREPL e Firefox 3: access unsafe properties from chrome

    Ci sono dei tool senza i quali mi sentirei disarmato… come farebbe il muratore senza la “cardarina” o la “livella” :-DDDD

    Nello sviluppo in Javascript il tool a cui non riesco assolutamente a rinunciare è MozREPL!!!

    La sensazione di controllo che mi da potermi collegare in telnet (comodamente dal mio emacs) dentro il browser a navigare nella mia applicazione e relativo codice Javascript è ineguagliabile.

    Certo c’e’ Firebug… ma vuoi mettere… ssh con vnc? :-D

    non c’e’ confronto :-P

    Purtroppo le notevoli rivoluzioni avvenute tra Firefox 2 a Firefox 3 hanno introdotto tutta una serie di policy aggiuntive di sicurezza che hanno reso il porting faticoso (o meglio fastidioso :-P) per lo sviluppatore del progetto.

    Per la gioia di tutti bard ha preso la volpe per le corna (:-PPP) e bypassato tutta una serie di complicazioni introdotte da queste nuove policy, ridandoci MozREPL in tutto il suo splendore anche su Firefox 3.

    Colpo di scena

    Giocavo un po’ con ExtJS come passatempo domenicale e ad un certo punto ho avuto bisogno di vedere alcuni dettagli da più vicino … attivo MozREPL!

    Navigando nel DOM mi accorgo di qualcosa di strano:

      repl> repl.enter(content)
      [object XPCWrappedNative [object Window]] ...
      repl> repl.look()
      ...
      this.Ext= undefined
      ...
      ...
      repl>
    

    uhm… strano… l’object che dovrebbe contenere tutti gli oggetti di ExtJS è presente nell’elenco delle proprietà di window ma risulta undefined.

    uhm… dopo averne discusso brevemente con bard l’occhio salta improvvisamente qualche riga sopra:

      repl> repl.enter(content)
      [obejct XPCWrappedNative [object Window]] ...
    

    Azz… window risulta wrapped… in altre parole per evitare di accedere inavvertitamente a codice insicuro Firefox 3 ricopre gli oggetti provenienti dal content con una interfaccia di protezione quando ci accediamo da chrome :-(

    e ora?!?!?!

    WebSurfing

    Non bisogna mai disperare… chi cerca trova:

    Secondo quanto scritto nella documentazione mozilla:

     If unsafe access to a property is required for some reason, this can 
     be accomplished via the wrappedJSObject property of the wrapper.

    bene bene bene… quindi:

    Workaround

      repl> repl.enter(content.wrappedJSObject)
      [object Window] ...
    

    perfetto!!! ora le proprietà sono nuovamente accessibili :-D

    Soluzione

    Beh che c’e’ di meglio per una domenica pomeriggio dell’eliminare un workaround :-D

    Il codice di MozREPL è veramente pulitissimo, di conseguenza sono bastati pochi minuti per identificare il punto in cui intervenire ed introdurre la modifica:

     // CONTEXT NAVIGATION
     // ----------------------------------------------------------------------
     
    -function enter(context) {
    +function enter(context, wrapped) {
    +    if (wrapped != true && context.wrappedJSObject != undefined) 
    +      context = context.wrappedJSObject;
    +
         this._contextHistory.push(this._workContext);
     
         if(isTopLevel(context))
    

    Ohhh ora tutto è tornato come prima e ho di nuovo la mia “livella” :-D

    0 commenti:

    View Luca Greco"s profile on LinkedIn

    Rpl

    La mia foto
    Lecce, Italy
    Fulltime Coder and *nix BOFH