source: Dev/branches/rest-dojo-ui/client/dojo/robotx.js @ 256

Last change on this file since 256 was 256, checked in by hendrikvanantwerpen, 13 years ago

Reworked project structure based on REST interaction and Dojo library. As
soon as this is stable, the old jQueryUI branch can be removed (it's
kept for reference).

File size: 5.5 KB
Line 
1define(["dojo", "dojo/robot"], function(dojo) {
2
3dojo.experimental("dojo.robotx");
4
5// loads an external app into an iframe and points dojo.doc to the iframe document, allowing the robot to control it
6// to use: set robotURL in djConfig to the URL you want to load
7// dojo.require this file
8
9var iframe = null;
10
11var groupStarted=dojo.connect(doh, '_groupStarted', function(){
12        dojo.disconnect(groupStarted);
13        iframe.style.visibility="visible";
14});
15
16var attachIframe = function(){
17        dojo.addOnLoad(function(){
18                var emptyStyle = {
19                        overflow: dojo.isWebKit? 'hidden' : 'visible',
20                        margin: '0px',
21                        borderWidth: '0px',
22                        height: '100%',
23                        width: '100%'
24                };
25                dojo.style(document.documentElement, emptyStyle);
26                dojo.style(document.body, emptyStyle);
27                document.body.appendChild(iframe);
28                var base=document.createElement('base');
29                base.href=iframe.src;
30                document.getElementsByTagName("head")[0].appendChild(base);
31        });
32};
33
34// Prevent race conditions between iframe loading and robot init.
35// If iframe is allowed to load while the robot is typing, sync XHRs can prevent the robot from completing its initialization.
36var robotReady=false;
37var robotFrame=null;
38var _run=doh.robot._run;
39doh.robot._run = function(frame){
40        // Called from robot when the robot completed its initialization.
41        robotReady = true;
42        robotFrame = frame;
43        doh.robot._run = _run;
44        // If initRobot was already called, then attach the iframe.
45        if(iframe.src){
46                attachIframe();
47        }
48};
49
50var onIframeLoad=function(){
51        // initial load handler: update the document and start the tests
52        doh.robot._updateDocument();
53        onIframeLoad = null;
54        var scrollRoot = (document.compatMode == 'BackCompat')? document.body : document.documentElement;
55        var consoleHeight = document.getElementById('robotconsole').offsetHeight;
56        if(consoleHeight){
57                iframe.style.height = (scrollRoot.clientHeight - consoleHeight)+"px";
58        }
59        // If dojo is present in the test case, then at least make a best effort to wait for it to load.
60        // The test must handle other race conditions like initial data queries by itself.
61        if(iframe.contentWindow.dojo){
62                iframe.contentWindow.dojo.addOnLoad(function(){
63                        doh.robot._run(robotFrame);
64                });
65        }else{
66                doh.robot._run(robotFrame);
67        }
68};
69
70var iframeLoad=function(){
71        if(onIframeLoad){
72                onIframeLoad();
73        }
74        var unloadConnect = dojo.connect(dojo.body(), 'onunload', function(){
75                dojo.global = window;
76                dojo.doc = document;
77                dojo.disconnect(unloadConnect);
78        });
79};
80
81// write the firebug console to a place it will fit
82dojo.config.debugContainerId = "robotconsole";
83dojo.config.debugHeight = dojo.config.debugHeight || 200;
84document.write('<div id="robotconsole" style="position:absolute;left:0px;bottom:0px;width:100%;"></div>');
85
86// write the iframe
87//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>');
88iframe = document.createElement('iframe');
89iframe.setAttribute("ALLOWTRANSPARENCY","true");
90iframe.scrolling = dojo.isIE? "yes" : "auto";
91dojo.style(iframe,{visibility:'hidden', border:'0px none', padding:'0px', margin:'0px', position:'absolute', left:'0px', top:'0px', width:'100%', height:'100%'});
92if(iframe['attachEvent'] !== undefined){
93        iframe.attachEvent('onload', iframeLoad);
94}else{
95        dojo.connect(iframe, 'onload', iframeLoad);
96}
97
98dojo.mixin(doh.robot,{
99        _updateDocument: function(){
100                dojo.setContext(iframe.contentWindow, iframe.contentWindow.document);
101                var win = dojo.global;
102                if(win.dojo){
103                        // allow the tests to subscribe to topics published by the iframe
104                        dojo.publish = win.dojo.publish;
105                        dojo.subscribe = win.dojo.subscribe;
106                        dojo.connectPublisher = win.dojo.connectPublisher; 
107                }
108
109        },
110
111        initRobot: function(/*String*/ url){
112                // summary:
113                //              Opens the application at the specified URL for testing, redirecting dojo to point to the application environment instead of the test environment.
114                //
115                // url:
116                //              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.
117                //
118
119                iframe.src=url;
120                // see above note about race conditions
121                if(robotReady){
122                        attachIframe();
123
124                }
125        },
126
127        waitForPageToLoad: function(/*Function*/ submitActions){
128                // summary:
129                //              Notifies DOH that the doh.robot is about to make a page change in the application it is driving,
130                //              returning a doh.Deferred object the user should return in their runTest function as part of a DOH test.
131                //
132                // description:
133                //              Notifies DOH that the doh.robot is about to make a page change in the application it is driving,
134                //              returning a doh.Deferred object the user should return in their runTest function as part of a DOH test.
135                //              Example:
136                //                      runTest:function(){
137                //                              return waitForPageLoad(function(){ doh.robot.keyPress(dojo.keys.ENTER, 500); });
138                //                      }
139                //
140                // submitActions:
141                //              The doh.robot will execute the actions the test passes into the submitActions argument (like clicking the submit button),
142                //              expecting these actions to create a page change (like a form submit).
143                //              After these actions execute and the resulting page loads, the next test will start.
144                //
145
146                var d = new doh.Deferred();
147                // create iframe event handler to track submit progress
148                onIframeLoad = function(){
149                        onIframeLoad = null;
150                        // set dojo.doc on every page change to point to the iframe doc so the robot works
151                        doh.robot._updateDocument();
152                        d.callback(true);
153                };
154                submitActions();
155                return d;
156        }
157
158});
159
160return doh.robot;
161});
Note: See TracBrowser for help on using the repository browser.