2010-11-15 07:39:52 +00:00
/ *
2011-11-08 16:40:44 +00:00
Copyright ( c ) 2004 - 2011 , The Dojo Foundation All Rights Reserved .
2010-11-15 07:39:52 +00:00
Available via Academic Free License >= 2.1 OR the modified BSD license .
see : http : //dojotoolkit.org/license for details
* /
2011-03-04 16:02:28 +00:00
if ( ! dojo . _hasResource [ "dojo.robotx" ] ) { //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo . _hasResource [ "dojo.robotx" ] = true ;
2010-11-15 07:39:52 +00:00
dojo . provide ( "dojo.robotx" ) ;
dojo . require ( "dojo.robot" ) ;
2011-11-08 16:40:44 +00:00
2010-11-15 07:39:52 +00:00
dojo . experimental ( "dojo.robotx" ) ;
2011-03-04 16:02:28 +00:00
// loads an external app into an iframe and points dojo.doc to the iframe document, allowing the robot to control it
// to use: set robotURL in djConfig to the URL you want to load
// dojo.require this file
2010-11-15 07:39:52 +00:00
( function ( ) {
2011-03-04 16:02:28 +00:00
2011-11-08 16:40:44 +00:00
var iframe = null ;
2011-03-04 16:02:28 +00:00
var groupStarted = dojo . connect ( doh , '_groupStarted' , function ( ) {
dojo . disconnect ( groupStarted ) ;
iframe . style . visibility = "visible" ;
2010-11-15 07:39:52 +00:00
} ) ;
2011-03-04 16:02:28 +00:00
2011-11-08 16:40:44 +00:00
var attachIframe = function ( ) {
dojo . addOnLoad ( function ( ) {
var emptyStyle = {
overflow : dojo . isWebKit ? 'hidden' : 'visible' ,
margin : '0px' ,
borderWidth : '0px' ,
height : '100%' ,
width : '100%'
} ;
dojo . style ( document . documentElement , emptyStyle ) ;
dojo . style ( document . body , emptyStyle ) ;
document . body . appendChild ( iframe ) ;
var base = document . createElement ( 'base' ) ;
base . href = iframe . src ;
document . getElementsByTagName ( "head" ) [ 0 ] . appendChild ( base ) ;
} ) ;
} ;
// Prevent race conditions between iframe loading and robot init.
// If iframe is allowed to load while the robot is typing, sync XHRs can prevent the robot from completing its initialization.
var robotReady = false ;
var robotFrame = null ;
var _run = doh . robot . _run ;
doh . robot . _run = function ( frame ) {
// Called from robot when the robot completed its initialization.
robotReady = true ;
robotFrame = frame ;
doh . robot . _run = _run ;
// If initRobot was already called, then attach the iframe.
if ( iframe . src ) { attachIframe ( ) ; }
}
2011-03-04 16:02:28 +00:00
var onIframeLoad = function ( ) {
2011-11-08 16:40:44 +00:00
// initial load handler: update the document and start the tests
2011-03-04 16:02:28 +00:00
doh . robot . _updateDocument ( ) ;
onIframeLoad = null ;
var scrollRoot = ( document . compatMode == 'BackCompat' ) ? document . body : document . documentElement ;
var consoleHeight = document . getElementById ( 'robotconsole' ) . offsetHeight ;
if ( consoleHeight ) {
iframe . style . height = ( scrollRoot . clientHeight - consoleHeight ) + "px" ;
}
2011-11-08 16:40:44 +00:00
// If dojo is present in the test case, then at least make a best effort to wait for it to load.
// The test must handle other race conditions like initial data queries by itself.
if ( iframe . contentWindow . dojo ) {
iframe . contentWindow . dojo . addOnLoad ( function ( ) {
doh . robot . _run ( robotFrame ) ;
} ) ;
} else {
doh . robot . _run ( robotFrame ) ;
}
2010-11-15 07:39:52 +00:00
} ;
2011-03-04 16:02:28 +00:00
var iframeLoad = function ( ) {
if ( onIframeLoad ) {
onIframeLoad ( ) ;
}
var unloadConnect = dojo . connect ( dojo . body ( ) , 'onunload' , function ( ) {
dojo . global = window ;
dojo . doc = document ;
dojo . disconnect ( unloadConnect ) ;
} ) ;
2010-11-15 07:39:52 +00:00
} ;
2011-03-04 16:02:28 +00:00
// write the firebug console to a place it will fit
dojo . config . debugContainerId = "robotconsole" ;
dojo . config . debugHeight = dojo . config . debugHeight || 200 ;
document . write ( '<div id="robotconsole" style="position:absolute;left:0px;bottom:0px;width:100%;"></div>' ) ;
// write the iframe
//document.writeln('<iframe id="robotapplication" style="visibility:hidden; border:0px none; padding:0px; margin:0px; position:absolute; left:0px; top:0px; width:100%; height:100%; z-index: 1;" src="'+dojo.config.robotURL+'" onload="iframeLoad();" ></iframe>');
iframe = document . createElement ( 'iframe' ) ;
iframe . setAttribute ( "ALLOWTRANSPARENCY" , "true" ) ;
iframe . scrolling = dojo . isIE ? "yes" : "auto" ;
dojo . style ( iframe , { visibility : 'hidden' , border : '0px none' , padding : '0px' , margin : '0px' , position : 'absolute' , left : '0px' , top : '0px' , width : '100%' , height : '100%' } ) ;
if ( iframe [ 'attachEvent' ] !== undefined ) {
iframe . attachEvent ( 'onload' , iframeLoad ) ;
2010-11-15 07:39:52 +00:00
} else {
2011-03-04 16:02:28 +00:00
dojo . connect ( iframe , 'onload' , iframeLoad ) ;
2010-11-15 07:39:52 +00:00
}
2011-03-04 16:02:28 +00:00
2011-11-08 16:40:44 +00:00
2011-03-04 16:02:28 +00:00
dojo . mixin ( doh . robot , {
_updateDocument : function ( ) {
dojo . setContext ( iframe . contentWindow , iframe . contentWindow . document ) ;
var win = dojo . global ;
if ( win [ "dojo" ] ) {
// allow the tests to subscribe to topics published by the iframe
dojo . _topics = win . dojo . _topics ;
}
} ,
initRobot : function ( /*String*/ url ) {
// summary:
// Opens the application at the specified URL for testing, redirecting dojo to point to the application environment instead of the test environment.
//
// url:
// URL to open. Any of the test's dojo.doc calls (e.g. dojo.byId()), and any dijit.registry calls (e.g. dijit.byId()) will point to elements and widgets inside this application.
//
2011-11-08 16:40:44 +00:00
2011-03-04 16:02:28 +00:00
iframe . src = url ;
2011-11-08 16:40:44 +00:00
// see above note about race conditions
if ( robotReady ) {
attachIframe ( ) ;
}
2011-03-04 16:02:28 +00:00
} ,
waitForPageToLoad : function ( /*Function*/ submitActions ) {
// summary:
// Notifies DOH that the doh.robot is about to make a page change in the application it is driving,
// returning a doh.Deferred object the user should return in their runTest function as part of a DOH test.
//
// description:
// Notifies DOH that the doh.robot is about to make a page change in the application it is driving,
// returning a doh.Deferred object the user should return in their runTest function as part of a DOH test.
// Example:
// runTest:function(){
// return waitForPageLoad(function(){ doh.robot.keyPress(dojo.keys.ENTER, 500); });
// }
//
// submitActions:
// The doh.robot will execute the actions the test passes into the submitActions argument (like clicking the submit button),
// expecting these actions to create a page change (like a form submit).
// After these actions execute and the resulting page loads, the next test will start.
//
var d = new doh . Deferred ( ) ;
// create iframe event handler to track submit progress
onIframeLoad = function ( ) {
onIframeLoad = null ;
// set dojo.doc on every page change to point to the iframe doc so the robot works
doh . robot . _updateDocument ( ) ;
d . callback ( true ) ;
} ;
submitActions ( ) ;
return d ;
}
2010-11-15 07:39:52 +00:00
} ) ;
} ) ( ) ;
2011-03-04 16:02:28 +00:00
2010-11-15 07:39:52 +00:00
}