From 40d7e66f408eaaa66efd8d7934ab2eb3324236a1 Mon Sep 17 00:00:00 2001 From: Elliott Sprehn Date: Sun, 24 Oct 2010 14:14:45 -0700 Subject: Lots of bug fixes in the scenario runner and a bunch of new features. - By default the runner now creates multiple output formats as it runs. Nodes are created in the DOM with ids: json, xml, and html. ex. $('#json').html() => json output of the runner ex. $('#xml').html() => json output of the runner $result is also an object tree result. The permitted formats are html,json,xml,object. If you don't want certain formats you can select specific ones with the new ng:scenario-output attribute on the script tag. + diff --git a/scenario/widgets-scenario.js b/scenario/widgets-scenario.js index 0d604fc9..ba3ef3cf 100644 --- a/scenario/widgets-scenario.js +++ b/scenario/widgets-scenario.js @@ -36,6 +36,9 @@ describe('widgets', function() { element('input[type="image"]').click(); expect(binding('button').fromJson()).toEqual({'count': 4}); + element('#navigate a').click(); + expect(binding('$location.hash')).toEqual('route'); + /** * Custom value parser for futures. */ diff --git a/scenario/widgets.html b/scenario/widgets.html index 8960f5f4..a520a326 100644 --- a/scenario/widgets.html +++ b/scenario/widgets.html @@ -2,7 +2,6 @@ - @@ -94,6 +93,11 @@ + + navigate + Go to #route + {{$location.hash}} + diff --git a/src/scenario/Application.js b/src/scenario/Application.js index 4ee0dd03..e2d34551 100644 --- a/src/scenario/Application.js +++ b/src/scenario/Application.js @@ -1,51 +1,84 @@ /** * Represents the application currently being tested and abstracts usage * of iframes or separate windows. + * + * @param {Object} context jQuery wrapper around HTML context. */ angular.scenario.Application = function(context) { this.context = context; - context.append('

Current URL: None

'); + context.append( + '

Current URL: None

' + + '
' + ); }; /** * Gets the jQuery collection of frames. Don't use this directly because * frames may go stale. * + * @private * @return {Object} jQuery collection */ -angular.scenario.Application.prototype.getFrame = function() { - return this.context.find('> iframe'); +angular.scenario.Application.prototype.getFrame_ = function() { + return this.context.find('#test-frames iframe:last'); }; /** - * Gets the window of the test runner frame. Always favor executeAction() + * Gets the window of the test runner frame. Always favor executeAction() * instead of this method since it prevents you from getting a stale window. * + * @private * @return {Object} the window of the frame */ -angular.scenario.Application.prototype.getWindow = function() { - var contentWindow = this.getFrame().attr('contentWindow'); +angular.scenario.Application.prototype.getWindow_ = function() { + var contentWindow = this.getFrame_().attr('contentWindow'); if (!contentWindow) - throw 'No window available because frame not loaded.'; + throw 'Frame window is not accessible.'; return contentWindow; }; /** * Changes the location of the frame. + * + * @param {string} url The URL. If it begins with a # then only the + * hash of the page is changed. + * @param {Function} onloadFn function($window, $document) */ angular.scenario.Application.prototype.navigateTo = function(url, onloadFn) { - this.getFrame().remove(); - this.context.append(''); + var self = this; + var frame = this.getFrame_(); + if (url.charAt(0) === '#') { + url = frame.attr('src').split('#')[0] + url; + frame.attr('src', url); + this.executeAction(onloadFn); + } else { + frame.css('display', 'none').attr('src', 'about:blank'); + this.context.find('#test-frames').append('