#62 ✓resolved
Thatcher

platform/rhino.js should allow document.write during html script tag parsing

Reported by Thatcher | March 24th, 2009 @ 04:24 PM | in 1.0 Release

again thanks to justin meyer for this. I really wasnt aware of this behavior.

the parser should allow the document.write function to append text as hmtl(xml) fragments when parsing a script tag.

and any other use of document.write in say a callback will replace the document entirely.

I quote:



//add parser to calls to loadLocalScript, overwrite document.write, and insert written text into parser
$env.loadLocalScript = function(script, p){
print("loading script ");
var types, type, src, i, base;
try{
if(script.type){
     types = script.type?script.type.split(";"):[];
     for(i=0;i<types.length;i++){
        if($env.scriptTypes[types[i]]){
if(script.src){
                   print("loading allowed external script :" + script.src);
                   base = "" + window.location;
                   var docWrites = [];
document.write = function(text){
docWrites.push(text);
}
load($env.location(script.src.match(/([^\?#]*)/)[1], base ));
if(p){
var start = p.m_xml.slice(0,p.m_iP);
var end = p.m_xml.slice(p.m_iP);
p.m_xml = start+docWrites.join('')+end;
}
               }else{
                    $env.loadInlineScript(script);
               }
          }else{
                if(!script.src && script.type == "text/javascript"){
                            $env.loadInlineScript(script);
                }
          }
       }
   }else{
                //anonymous type and anonymous src means inline
                if(!script.src){
                    $env.loadInlineScript(script);
                }
            }
        }catch(e){
            print("Error loading script.");
            print(e);
        }
    };

If a script tag, call load script with the parser
else if(iEvt == XMLP._ELM_E) {                  // End-Element Event
      
 var oldParent = iNodeParent;
 iNodeParent = iNodeParent.parentNode;         // ascend one level of the DOM Tree
 //handle script tag
 if(oldParent.nodeName.toLowerCase() == 'script'){
$policy.loadScript(oldParent, p);
 }
 
    }

Comments and changes to this ticket

  • Thatcher

    Thatcher March 24th, 2009 @ 04:27 PM

    the solution is based entirely on justins method but a little cleaner due to my familiarity with the code base.

    I added a method the the xml parser 'appendFragment' and since document.write and document.writeln are already stubbed we simple alias them in $env.loadScript and return them to the original fuinction after each script parse.

  • Thatcher

    Thatcher September 9th, 2009 @ 04:29 PM

    • State changed from “new” to “resolved”

    should have been marked closed awhile ago

Please Sign in or create a free account to add a new ticket.

With your very own profile, you can contribute to projects, track your activity, watch tickets, receive and update tickets through your email and much more.

New-ticket Create new ticket

Create your profile

Help contribute to this project by taking a few moments to create your personal profile. Create your profile »

a javascript browser environment

People watching this ticket

Pages