summaryrefslogtreecommitdiff
path: root/lib/dojo/robotx.js
blob: 7f49b64a038cde6c8c098e62603d2b2e3d899197 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
	Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojo.robotx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dojo.robotx"] = true;
dojo.provide("dojo.robotx");
dojo.require("dojo.robot");
dojo.experimental("dojo.robotx");

// 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

(function(){
// have to wait for test page to load before testing!
doh.robot._runsemaphore.lock.push("dojo.robotx.lock");

var iframe = document.getElementById('robotapplication');

var groupStarted=dojo.connect(doh, '_groupStarted', function(){
	dojo.disconnect(groupStarted);
	iframe.style.visibility="visible";
});

var onIframeLoad=function(){
	//iframe = document.getElementById('robotapplication');
	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";
	}
	doh.run();
};

var iframeLoad=function(){
	if(onIframeLoad){
		onIframeLoad();
	}
	var unloadConnect = dojo.connect(dojo.body(), 'onunload', function(){
		dojo.global = window;
		dojo.doc = document;
		dojo.disconnect(unloadConnect);
	});
};

// 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);
}else{
	dojo.connect(iframe, 'onload', iframeLoad);
}

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.
		//
		iframe.src=url;
		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=url;
			document.getElementsByTagName("head")[0].appendChild(base);
		});
	},

	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;
	}

});

})();

}