예제 #1
0
        public void eval(string text)
        {
                        #if EVAL_ENABLED
            NitroCode script = new NitroCode(text, UI.BaseCodeType, UI.SecurityDomain);

            UICode codeInstance = script.Instance();
            codeInstance.BaseScript = script;

            if (codeInstance != null)
            {
                codeInstance.document = document;
                codeInstance.window   = window;
                codeInstance.OnWindowLoaded();
                codeInstance.Start();
                // Standard method that must be called.
                // Any code outside of functions gets dropped in here:
                codeInstance.OnScriptReady();
            }
                        #else
            Console.Warn("Eval currently disconnected in order to make sure people are aware of iOS and some platform restrictions (and also for security). Some platforms don't allow eval. Tick the enable eval box in Nitro settings.");
                        #endif
        }
예제 #2
0
        /// <summary>Attempts to compile the code then run OnWindowLoaded. It's only successful if there are no nulls in the code buffer.</summary>
        /// <returns>Returns false if we're still waiting on code to download.</returns>
        public bool TryCompile()
        {
            if (CodeBuffer == null)
            {
                return(true);
            }

            if (CodeBuffer.Length == 0)
            {
                CodeBuffer = null;
                return(true);
            }

            for (int i = 0; i < CodeBuffer.Length; i++)
            {
                if (CodeBuffer[i] == null)
                {
                    return(false);
                }
            }

                        #if !NoNitroRuntime
            // Iframe security check - can code from this domain run at all?
            // We have the Nitro runtime so it could run unwanted code.
            if (window.parent != null && location != null && !location.fullAccess)
            {
                // It's an iframe to some unsafe location. We must have a security domain for this to be allowed at all.
                if (SecurityDomain == null || !SecurityDomain.AllowAccess(location.Protocol, location.host, location.ToString()))
                {
                    Wrench.Log.Add("Warning: blocked Nitro on a webpage - You must use a security domain to allow this. See http://help.kulestar.com/nitro-security/ for more.");
                    return(true);
                }
            }
                        #endif

            // Good to go!
            FinishedParsing = false;
            string codeToCompile = "";

            for (int i = 0; i < CodeBuffer.Length; i++)
            {
                codeToCompile += CodeBuffer[i] + "\n";
            }

            CodeBuffer = null;

            if (!AotDocument)
            {
                CodeInstance = NitroCache.TryGetScript(codeToCompile);
            }

            try{
                                #if !NoNitroRuntime
                string aotFile         = null;
                string aotAssemblyName = null;

                if (AotDocument)
                {
                    aotFile = "";
                    string[] pieces = ScriptLocation.Split('.');
                    for (int i = 0; i < pieces.Length - 1; i++)
                    {
                        if (i != 0)
                        {
                            aotFile += ".";
                        }
                        aotFile += pieces[i];
                    }
                    aotFile        += "-nitro-aot.dll";
                    aotAssemblyName = NitroCache.GetCodeSeed(codeToCompile) + ".ntro";
                }

                if (CodeInstance == null)
                {
                    NitroCode script = new NitroCode(codeToCompile, UI.BaseCodeType, SecurityDomain, aotFile, aotAssemblyName);
                    if (AotDocument)
                    {
                        // Internally the constructor will write it to the named file.
                        return(true);
                    }
                    CodeInstance            = (UICode)script.Instance();
                    CodeInstance.BaseScript = script;
                }
                                #endif

                if (CodeInstance != null)
                {
                    CodeInstance.document = this;
                    CodeInstance.window   = window;
                    CodeInstance.OnWindowLoaded();
                    CodeInstance.Start();
                    // Standard method that must be called.
                    // Any code outside of functions gets dropped in here:
                    CodeInstance.OnScriptReady();
                }
            }catch (Exception e) {
                string scriptLocation = ScriptLocation;

                if (string.IsNullOrEmpty(scriptLocation))
                {
                    // Use document.location instead:
                    scriptLocation = location.ToString();
                }

                if (!string.IsNullOrEmpty(scriptLocation))
                {
                    scriptLocation = " (At " + scriptLocation + ")";
                }

                Wrench.Log.Add("Script error" + scriptLocation + ": " + e);
            }
            return(true);
        }
예제 #3
0
 /// <summary>Clears all code.</summary>
 public void ClearCode()
 {
     CodeBuffer      = null;
     CodeInstance    = null;
     FinishedParsing = false;
 }
예제 #4
0
		/// <summary>Attempts to compile the code then run OnWindowLoaded. It's only successful if there are no nulls in the code buffer.</summary>
		/// <returns>Returns false if we're still waiting on code to download.</returns>
		public bool TryCompile(){
			
			if(CodeBuffer==null){
				return true;
			}
			
			if(CodeBuffer.Length==0){
				CodeBuffer=null;
				return true;
			}
			
			for(int i=0;i<CodeBuffer.Length;i++){
				if(CodeBuffer[i]==null){
					return false;
				}
			}
			
			#if !NoNitroRuntime
			// Iframe security check - can code from this domain run at all?
			// We have the Nitro runtime so it could run unwanted code.
			if(window.parent!=null && location!=null && !location.fullAccess){
				
				// It's an iframe to some unsafe location. We must have a security domain for this to be allowed at all.
				if(SecurityDomain==null || !SecurityDomain.AllowAccess(location.Protocol,location.host,location.ToString())){
					Wrench.Log.Add("Warning: blocked Nitro on a webpage - You must use a security domain to allow this. See http://help.kulestar.com/nitro-security/ for more.");
					return true;
				}
				
			}
			#endif
			
			// Good to go!
			FinishedParsing=false;
			string codeToCompile="";
			
			for(int i=0;i<CodeBuffer.Length;i++){
				codeToCompile+=CodeBuffer[i]+"\n";
			}
			
			CodeBuffer=null;
			
			if(!AotDocument){
				CodeInstance=NitroCache.TryGetScript(codeToCompile);
			}
			
			try{
				#if !NoNitroRuntime
				string aotFile=null;
				string aotAssemblyName=null;
				
				if(AotDocument){
					aotFile="";
					string[] pieces=ScriptLocation.Split('.');
					for(int i=0;i<pieces.Length-1;i++){
						if(i!=0){
							aotFile+=".";
						}
						aotFile+=pieces[i];
					}
					aotFile+="-nitro-aot.dll";
					aotAssemblyName=NitroCache.GetCodeSeed(codeToCompile)+".ntro";
				}
			
				if(CodeInstance==null){
					
					NitroCode script=new NitroCode(codeToCompile,UI.BaseCodeType,SecurityDomain,aotFile,aotAssemblyName);
					if(AotDocument){
						// Internally the constructor will write it to the named file.
						return true;
					}
					CodeInstance=(UICode)script.Instance();
					CodeInstance.BaseScript=script;
				}
				#endif
				
				if(CodeInstance!=null){
					CodeInstance.document=this;
					CodeInstance.window=window;
					CodeInstance.OnWindowLoaded();
					CodeInstance.Start();
					// Standard method that must be called.
					// Any code outside of functions gets dropped in here:
					CodeInstance.OnScriptReady();
				}
			}catch(Exception e){
				string scriptLocation=ScriptLocation;
				
				if(string.IsNullOrEmpty(scriptLocation)){
					// Use document.location instead:
					scriptLocation=location.ToString();
				}
				
				if(!string.IsNullOrEmpty(scriptLocation)){
					scriptLocation=" (At "+scriptLocation+")";
				}
				
				Wrench.Log.Add("Script error"+scriptLocation+": "+e);
			}
			return true;
		}
예제 #5
0
		/// <summary>Clears all code.</summary>
		public void ClearCode(){
			CodeBuffer=null;
			CodeInstance=null;
			FinishedParsing=false;
		}
예제 #6
0
        protected override void Compile(string codeToCompile)
        {
            if (!AotDocument)
            {
                CodeInstance = NitroCache.TryGetScript(codeToCompile);
            }

            try{
                                #if !NoNitroRuntime
                string aotFile         = null;
                string aotAssemblyName = null;

                if (AotDocument)
                {
                    aotFile = "";
                    string[] pieces = htmlDocument.ScriptLocation.Split('.');
                    for (int i = 0; i < pieces.Length - 1; i++)
                    {
                        if (i != 0)
                        {
                            aotFile += ".";
                        }
                        aotFile += pieces[i];
                    }
                    aotFile        += "-nitro-aot.dll";
                    aotAssemblyName = NitroCache.GetCodeSeed(codeToCompile) + ".ntro";
                }

                if (CodeInstance == null)
                {
                    NitroCode script = new NitroCode(codeToCompile, UI.BaseCodeType, SecurityDomain, aotFile, aotAssemblyName);
                    if (AotDocument)
                    {
                        // Internally the constructor will write it to the named file.
                        return;
                    }
                    CodeInstance            = (UICode)script.Instance();
                    CodeInstance.BaseScript = script;
                }
                                #endif

                if (CodeInstance != null)
                {
                    CodeInstance.document = htmlDocument;
                    CodeInstance.window   = htmlDocument.window;

                    // Trigger an event to say Nitro is about to start:
                    Dom.Event e = new Dom.Event("scriptenginestart");
                    htmlDocument.dispatchEvent(e);


                    CodeInstance.OnWindowLoaded();
                    CodeInstance.Start();
                    // Standard method that must be called.
                    // Any code outside of functions gets dropped in here:
                    CodeInstance.OnScriptReady();
                }
            }catch (Exception e) {
                string scriptLocation = htmlDocument.ScriptLocation;

                if (string.IsNullOrEmpty(scriptLocation))
                {
                    // Use document.basepath instead:
                    scriptLocation = Document.basepath.ToString();
                }

                if (!string.IsNullOrEmpty(scriptLocation))
                {
                    scriptLocation = " (At " + scriptLocation + ")";
                }

                Dom.Log.Add("Script error" + scriptLocation + ": " + e);
            }
        }