whowish_word 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/README.md +17 -5
  2. data/lib/whowish_word/rails/public/javascripts/0_class.js +64 -64
  3. data/lib/whowish_word/rails/public/javascripts/1_jquery.escape.js +23 -23
  4. data/lib/whowish_word/rails/public/javascripts/1_jquery.sizes.min.js +7 -7
  5. data/lib/whowish_word/rails/public/javascripts/2_whowish_word_variables.js +4 -42
  6. data/lib/whowish_word/rails/public/javascripts/3_whowish_word_helper.js +28 -9
  7. data/lib/whowish_word/rails/public/javascripts/4_whowish_word.js +45 -43
  8. data/lib/whowish_word/rails/public/javascripts/4_whowish_word_content_handler.js +15 -15
  9. data/lib/whowish_word/rails/public/javascripts/4_whowish_word_creator.js +10 -6
  10. data/lib/whowish_word/rails/public/javascripts/5_whowish_word_common_creator.js +50 -48
  11. data/lib/whowish_word/rails/public/javascripts/6_whowish_word_element_creator.js +57 -81
  12. data/lib/whowish_word/rails/public/javascripts/6_whowish_word_element_guard.js +32 -0
  13. data/lib/whowish_word/rails/public/javascripts/6_whowish_word_html_creator.js +18 -18
  14. data/lib/whowish_word/rails/public/javascripts/6_whowish_word_html_guard.js +12 -0
  15. data/lib/whowish_word/rails/public/javascripts/6_whowish_word_select_creator.js +10 -10
  16. data/lib/whowish_word/rails/public/javascripts/6_whowish_word_text_creator.js +19 -19
  17. data/lib/whowish_word/rails/public/javascripts/6_whowish_word_text_guard.js +10 -0
  18. data/lib/whowish_word/rails/public/javascripts/6_whowish_word_value_creator.js +19 -19
  19. data/lib/whowish_word/rails/public/javascripts/6_whowish_word_value_guard_and_sanitizer.js +24 -0
  20. data/lib/whowish_word/rails/public/javascripts/7_whowish_word_attribute_handler.js +24 -24
  21. data/lib/whowish_word/rails/public/javascripts/7_whowish_word_html_handler.js +14 -14
  22. data/lib/whowish_word/rails/public/javascripts/7_whowish_word_text_handler.js +14 -14
  23. data/lib/whowish_word/rails/public/javascripts/7_whowish_word_value_handler.js +24 -18
  24. data/lib/whowish_word/rails/public/stylesheets/whowish_word.css +197 -197
  25. data/rails/Gemfile.lock +130 -130
  26. data/rails/Rakefile +7 -7
  27. data/rails/app/assets/javascripts/integration.js +2 -2
  28. data/rails/app/assets/javascripts/test_javascript.js +2 -2
  29. data/rails/app/assets/javascripts/test_word_for.js +2 -2
  30. data/rails/app/assets/stylesheets/integration.css +4 -4
  31. data/rails/app/assets/stylesheets/test_javascript.css +4 -4
  32. data/rails/app/assets/stylesheets/test_word_for.css +4 -4
  33. data/rails/app/controllers/integration_controller.rb +5 -5
  34. data/rails/app/controllers/test_javascript_controller.rb +11 -11
  35. data/rails/app/controllers/test_word_for_controller.rb +5 -5
  36. data/rails/app/helpers/integration_helper.rb +2 -2
  37. data/rails/app/helpers/test_javascript_helper.rb +2 -2
  38. data/rails/app/helpers/test_word_for_helper.rb +2 -2
  39. data/rails/app/views/test_javascript/replace_with_html.html.erb +96 -0
  40. data/rails/public/jasmine/MIT.LICENSE +20 -20
  41. data/rails/public/jasmine/jasmine-html.js +190 -190
  42. data/rails/public/jasmine/jasmine.css +166 -166
  43. data/rails/public/jasmine/jasmine.js +2476 -2476
  44. data/rails/public/javascripts/jquery-1.6.4.js +9046 -9046
  45. data/rails/public/javascripts/jquery.loading_button.js +72 -0
  46. data/rails/public/sinonjs/sinonjs.js +2821 -2821
  47. data/rails/public/stylesheets/main.css +26 -21
  48. data/whowish_word.gemspec +1 -1
  49. metadata +9 -3
@@ -1,2 +1,2 @@
1
- // Place all the behaviors and hooks related to the matching controller here.
2
- // All this logic will automatically be available in application.js.
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -1,2 +1,2 @@
1
- // Place all the behaviors and hooks related to the matching controller here.
2
- // All this logic will automatically be available in application.js.
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -1,2 +1,2 @@
1
- // Place all the behaviors and hooks related to the matching controller here.
2
- // All this logic will automatically be available in application.js.
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -1,4 +1,4 @@
1
- /*
2
- Place all the styles related to the matching controller here.
3
- They will automatically be included in application.css.
4
- */
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -1,4 +1,4 @@
1
- /*
2
- Place all the styles related to the matching controller here.
3
- They will automatically be included in application.css.
4
- */
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -1,4 +1,4 @@
1
- /*
2
- Place all the styles related to the matching controller here.
3
- They will automatically be included in application.css.
4
- */
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -1,5 +1,5 @@
1
- class IntegrationController < ApplicationController
2
-
3
- layout "integration"
4
-
5
- end
1
+ class IntegrationController < ApplicationController
2
+
3
+ layout "integration"
4
+
5
+ end
@@ -1,11 +1,11 @@
1
- class TestJavascriptController < ApplicationController
2
-
3
- layout "test_javascript"
4
-
5
- before_filter :always_activate_whowish_word
6
-
7
- def always_activate_whowish_word
8
- activate_whowish_word_edit_mode
9
- end
10
-
11
- end
1
+ class TestJavascriptController < ApplicationController
2
+
3
+ layout "test_javascript"
4
+
5
+ before_filter :always_activate_whowish_word
6
+
7
+ def always_activate_whowish_word
8
+ activate_whowish_word_edit_mode
9
+ end
10
+
11
+ end
@@ -1,5 +1,5 @@
1
- class TestWordForController < ApplicationController
2
-
3
- layout "nested_test_word_for"
4
-
5
- end
1
+ class TestWordForController < ApplicationController
2
+
3
+ layout "nested_test_word_for"
4
+
5
+ end
@@ -1,2 +1,2 @@
1
- module IntegrationHelper
2
- end
1
+ module IntegrationHelper
2
+ end
@@ -1,2 +1,2 @@
1
- module TestJavascriptHelper
2
- end
1
+ module TestJavascriptHelper
2
+ end
@@ -1,2 +1,2 @@
1
- module TestWordForHelper
2
- end
1
+ module TestWordForHelper
2
+ end
@@ -0,0 +1,96 @@
1
+ <span style="width:600px;">
2
+ <p>This page tests replacing, hiding and showing content with raw html.</p>
3
+
4
+ <p>
5
+ I have found that if we move content by raw html, some variables bound with the element will be deleted.
6
+ This is because the elements are deleted and recreated.
7
+
8
+ WhowishWord solves that problem by storing all needed data in its hash instead with the element's id as a key.
9
+ </p>
10
+
11
+ </span>
12
+ <div id="all_elements">
13
+ <span>
14
+ <b>Text: </b> <dfn>__whowishWord_______text_text|name,value_____text</dfn>
15
+ </span>
16
+ <span>
17
+ <b>Label: </b> <label for="some_textbox">__whowishWord_______text_label|name,value_____text</label>
18
+ <input type="text" name="some_textbox">
19
+ </span>
20
+ <span>
21
+ <b>Textbox: </b> <input type="textbox"
22
+ title="__whowishWord_______title_textbox|name,value_____title"
23
+ value="__whowishWord_______value_textbox|name,value_____value"
24
+ placeholder="__whowishWord_______placeholder_textbox|name,value_____placeholder">
25
+ </span>
26
+ <span>
27
+ <b>Textarea: </b> <textarea
28
+ title="__whowishWord_______title_textarea|name,value_____title"
29
+ placeholder="__whowishWord_______placeholder_textarea|name,value_____placeholder">__whowishWord_______value_textarea|name,value_____value</textarea>
30
+ </span>
31
+ <span>
32
+ <b>Checkbox: </b> <input type="checkbox"
33
+ title="__whowishWord_______title_checkbox|name,value_____title"
34
+ value="__whowishWord_______value_checkbox|name,value_____value">
35
+ </span>
36
+ <span>
37
+ <b>Radio: </b> <input type="radio"
38
+ title="__whowishWord_______title_radio|name,value_____title"
39
+ value="__whowishWord_______value_radio|name,value_____value">
40
+ </span>
41
+ <span>
42
+ <b>Select: </b> <select title="__whowishWord_______title_select|name,value_____title">
43
+ <option value="__whowishWord_______option_value_0|name,value_____value_0">__whowishWord_______option_text_0_____text_0</option>
44
+ <option value="__whowishWord_______option_value_1|name,value_____value_1">__whowishWord_______option_text_1_____text_1</option>
45
+ </select>
46
+ </span>
47
+ <span>
48
+ <b>Button(Input): </b> <input type="button"
49
+ title="__whowishWord_______title_input_button|name,value_____title"
50
+ value="__whowishWord_______value_input_button|name,value_____value" >
51
+ </span>
52
+ <span>
53
+ <b>Submit(Input): </b> <input type="submit"
54
+ title="__whowishWord_______title_input_submit|name,value_____title"
55
+ value="__whowishWord_______value_input_submit|name,value_____value" >
56
+ </span>
57
+ <span>
58
+ <b>Button: </b> <button title="__whowishWord_______title_button|name,value_____title">__whowishWord_______value_button|name,value_____value</button>
59
+ </span>
60
+ <span>
61
+ <b>Late Text: </b> <span id="late_text"></span>
62
+
63
+ <script type="text/javascript">
64
+
65
+ setTimeout(function() {
66
+ $('#late_text').html("<dfn>__whowishWord_______text_late_text|name,value_____text</dfn>");
67
+ },5000);
68
+
69
+ </script>
70
+ </span>
71
+ <span>
72
+ <b>Late Textbox: </b> <input type="textbox" id="late_textbox"
73
+ title="title"
74
+ value="value"
75
+ placeholder="placeholder">
76
+
77
+ <script type="text/javascript">
78
+
79
+ setTimeout(function() {
80
+ $('#late_textbox').attr("title","__whowishWord_______title_late_textbox|name,value_____title");
81
+ $('#late_textbox').attr("value","__whowishWord_______value_late_textbox|name,value_____value");
82
+ $('#late_textbox').attr("placeholder","__whowishWord_______placeholder_late_textbox|name,value_____placeholder");
83
+ },5000);
84
+
85
+ </script>
86
+ </span>
87
+ </div><br/>
88
+ <input type="button" value="Replace all contents" onclick="replace_all_content();">
89
+ <script type="text/javascript">
90
+ function replace_all_content() {
91
+ $('#all_elements').html($('#all_elements').html());
92
+ }
93
+ </script>
94
+
95
+
96
+
@@ -1,20 +1,20 @@
1
- Copyright (c) 2008-2011 Pivotal Labs
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1
+ Copyright (c) 2008-2011 Pivotal Labs
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,190 +1,190 @@
1
- jasmine.TrivialReporter = function(doc) {
2
- this.document = doc || document;
3
- this.suiteDivs = {};
4
- this.logRunningSpecs = false;
5
- };
6
-
7
- jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
8
- var el = document.createElement(type);
9
-
10
- for (var i = 2; i < arguments.length; i++) {
11
- var child = arguments[i];
12
-
13
- if (typeof child === 'string') {
14
- el.appendChild(document.createTextNode(child));
15
- } else {
16
- if (child) { el.appendChild(child); }
17
- }
18
- }
19
-
20
- for (var attr in attrs) {
21
- if (attr == "className") {
22
- el[attr] = attrs[attr];
23
- } else {
24
- el.setAttribute(attr, attrs[attr]);
25
- }
26
- }
27
-
28
- return el;
29
- };
30
-
31
- jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
32
- var showPassed, showSkipped;
33
-
34
- this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
35
- this.createDom('div', { className: 'banner' },
36
- this.createDom('div', { className: 'logo' },
37
- this.createDom('span', { className: 'title' }, "Jasmine"),
38
- this.createDom('span', { className: 'version' }, runner.env.versionString())),
39
- this.createDom('div', { className: 'options' },
40
- "Show ",
41
- showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
42
- this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
43
- showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
44
- this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
45
- )
46
- ),
47
-
48
- this.runnerDiv = this.createDom('div', { className: 'runner running' },
49
- this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
50
- this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
51
- this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
52
- );
53
-
54
- this.document.body.appendChild(this.outerDiv);
55
-
56
- var suites = runner.suites();
57
- for (var i = 0; i < suites.length; i++) {
58
- var suite = suites[i];
59
- var suiteDiv = this.createDom('div', { className: 'suite' },
60
- this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
61
- this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
62
- this.suiteDivs[suite.id] = suiteDiv;
63
- var parentDiv = this.outerDiv;
64
- if (suite.parentSuite) {
65
- parentDiv = this.suiteDivs[suite.parentSuite.id];
66
- }
67
- parentDiv.appendChild(suiteDiv);
68
- }
69
-
70
- this.startedAt = new Date();
71
-
72
- var self = this;
73
- showPassed.onclick = function(evt) {
74
- if (showPassed.checked) {
75
- self.outerDiv.className += ' show-passed';
76
- } else {
77
- self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
78
- }
79
- };
80
-
81
- showSkipped.onclick = function(evt) {
82
- if (showSkipped.checked) {
83
- self.outerDiv.className += ' show-skipped';
84
- } else {
85
- self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
86
- }
87
- };
88
- };
89
-
90
- jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
91
- var results = runner.results();
92
- var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
93
- this.runnerDiv.setAttribute("class", className);
94
- //do it twice for IE
95
- this.runnerDiv.setAttribute("className", className);
96
- var specs = runner.specs();
97
- var specCount = 0;
98
- for (var i = 0; i < specs.length; i++) {
99
- if (this.specFilter(specs[i])) {
100
- specCount++;
101
- }
102
- }
103
- var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
104
- message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
105
- this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
106
-
107
- this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
108
- };
109
-
110
- jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
111
- var results = suite.results();
112
- var status = results.passed() ? 'passed' : 'failed';
113
- if (results.totalCount === 0) { // todo: change this to check results.skipped
114
- status = 'skipped';
115
- }
116
- this.suiteDivs[suite.id].className += " " + status;
117
- };
118
-
119
- jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
120
- if (this.logRunningSpecs) {
121
- this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
122
- }
123
- };
124
-
125
- jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
126
- var results = spec.results();
127
- var status = results.passed() ? 'passed' : 'failed';
128
- if (results.skipped) {
129
- status = 'skipped';
130
- }
131
- var specDiv = this.createDom('div', { className: 'spec ' + status },
132
- this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
133
- this.createDom('a', {
134
- className: 'description',
135
- href: '?spec=' + encodeURIComponent(spec.getFullName()),
136
- title: spec.getFullName()
137
- }, spec.description));
138
-
139
-
140
- var resultItems = results.getItems();
141
- var messagesDiv = this.createDom('div', { className: 'messages' });
142
- for (var i = 0; i < resultItems.length; i++) {
143
- var result = resultItems[i];
144
-
145
- if (result.type == 'log') {
146
- messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
147
- } else if (result.type == 'expect' && result.passed && !result.passed()) {
148
- messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
149
-
150
- if (result.trace.stack) {
151
- messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
152
- }
153
- }
154
- }
155
-
156
- if (messagesDiv.childNodes.length > 0) {
157
- specDiv.appendChild(messagesDiv);
158
- }
159
-
160
- this.suiteDivs[spec.suite.id].appendChild(specDiv);
161
- };
162
-
163
- jasmine.TrivialReporter.prototype.log = function() {
164
- var console = jasmine.getGlobal().console;
165
- if (console && console.log) {
166
- if (console.log.apply) {
167
- console.log.apply(console, arguments);
168
- } else {
169
- console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
170
- }
171
- }
172
- };
173
-
174
- jasmine.TrivialReporter.prototype.getLocation = function() {
175
- return this.document.location;
176
- };
177
-
178
- jasmine.TrivialReporter.prototype.specFilter = function(spec) {
179
- var paramMap = {};
180
- var params = this.getLocation().search.substring(1).split('&');
181
- for (var i = 0; i < params.length; i++) {
182
- var p = params[i].split('=');
183
- paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
184
- }
185
-
186
- if (!paramMap.spec) {
187
- return true;
188
- }
189
- return spec.getFullName().indexOf(paramMap.spec) === 0;
190
- };
1
+ jasmine.TrivialReporter = function(doc) {
2
+ this.document = doc || document;
3
+ this.suiteDivs = {};
4
+ this.logRunningSpecs = false;
5
+ };
6
+
7
+ jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
8
+ var el = document.createElement(type);
9
+
10
+ for (var i = 2; i < arguments.length; i++) {
11
+ var child = arguments[i];
12
+
13
+ if (typeof child === 'string') {
14
+ el.appendChild(document.createTextNode(child));
15
+ } else {
16
+ if (child) { el.appendChild(child); }
17
+ }
18
+ }
19
+
20
+ for (var attr in attrs) {
21
+ if (attr == "className") {
22
+ el[attr] = attrs[attr];
23
+ } else {
24
+ el.setAttribute(attr, attrs[attr]);
25
+ }
26
+ }
27
+
28
+ return el;
29
+ };
30
+
31
+ jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
32
+ var showPassed, showSkipped;
33
+
34
+ this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
35
+ this.createDom('div', { className: 'banner' },
36
+ this.createDom('div', { className: 'logo' },
37
+ this.createDom('span', { className: 'title' }, "Jasmine"),
38
+ this.createDom('span', { className: 'version' }, runner.env.versionString())),
39
+ this.createDom('div', { className: 'options' },
40
+ "Show ",
41
+ showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
42
+ this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
43
+ showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
44
+ this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
45
+ )
46
+ ),
47
+
48
+ this.runnerDiv = this.createDom('div', { className: 'runner running' },
49
+ this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
50
+ this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
51
+ this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
52
+ );
53
+
54
+ this.document.body.appendChild(this.outerDiv);
55
+
56
+ var suites = runner.suites();
57
+ for (var i = 0; i < suites.length; i++) {
58
+ var suite = suites[i];
59
+ var suiteDiv = this.createDom('div', { className: 'suite' },
60
+ this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
61
+ this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
62
+ this.suiteDivs[suite.id] = suiteDiv;
63
+ var parentDiv = this.outerDiv;
64
+ if (suite.parentSuite) {
65
+ parentDiv = this.suiteDivs[suite.parentSuite.id];
66
+ }
67
+ parentDiv.appendChild(suiteDiv);
68
+ }
69
+
70
+ this.startedAt = new Date();
71
+
72
+ var self = this;
73
+ showPassed.onclick = function(evt) {
74
+ if (showPassed.checked) {
75
+ self.outerDiv.className += ' show-passed';
76
+ } else {
77
+ self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
78
+ }
79
+ };
80
+
81
+ showSkipped.onclick = function(evt) {
82
+ if (showSkipped.checked) {
83
+ self.outerDiv.className += ' show-skipped';
84
+ } else {
85
+ self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
86
+ }
87
+ };
88
+ };
89
+
90
+ jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
91
+ var results = runner.results();
92
+ var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
93
+ this.runnerDiv.setAttribute("class", className);
94
+ //do it twice for IE
95
+ this.runnerDiv.setAttribute("className", className);
96
+ var specs = runner.specs();
97
+ var specCount = 0;
98
+ for (var i = 0; i < specs.length; i++) {
99
+ if (this.specFilter(specs[i])) {
100
+ specCount++;
101
+ }
102
+ }
103
+ var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
104
+ message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
105
+ this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
106
+
107
+ this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
108
+ };
109
+
110
+ jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
111
+ var results = suite.results();
112
+ var status = results.passed() ? 'passed' : 'failed';
113
+ if (results.totalCount === 0) { // todo: change this to check results.skipped
114
+ status = 'skipped';
115
+ }
116
+ this.suiteDivs[suite.id].className += " " + status;
117
+ };
118
+
119
+ jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
120
+ if (this.logRunningSpecs) {
121
+ this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
122
+ }
123
+ };
124
+
125
+ jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
126
+ var results = spec.results();
127
+ var status = results.passed() ? 'passed' : 'failed';
128
+ if (results.skipped) {
129
+ status = 'skipped';
130
+ }
131
+ var specDiv = this.createDom('div', { className: 'spec ' + status },
132
+ this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
133
+ this.createDom('a', {
134
+ className: 'description',
135
+ href: '?spec=' + encodeURIComponent(spec.getFullName()),
136
+ title: spec.getFullName()
137
+ }, spec.description));
138
+
139
+
140
+ var resultItems = results.getItems();
141
+ var messagesDiv = this.createDom('div', { className: 'messages' });
142
+ for (var i = 0; i < resultItems.length; i++) {
143
+ var result = resultItems[i];
144
+
145
+ if (result.type == 'log') {
146
+ messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
147
+ } else if (result.type == 'expect' && result.passed && !result.passed()) {
148
+ messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
149
+
150
+ if (result.trace.stack) {
151
+ messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
152
+ }
153
+ }
154
+ }
155
+
156
+ if (messagesDiv.childNodes.length > 0) {
157
+ specDiv.appendChild(messagesDiv);
158
+ }
159
+
160
+ this.suiteDivs[spec.suite.id].appendChild(specDiv);
161
+ };
162
+
163
+ jasmine.TrivialReporter.prototype.log = function() {
164
+ var console = jasmine.getGlobal().console;
165
+ if (console && console.log) {
166
+ if (console.log.apply) {
167
+ console.log.apply(console, arguments);
168
+ } else {
169
+ console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
170
+ }
171
+ }
172
+ };
173
+
174
+ jasmine.TrivialReporter.prototype.getLocation = function() {
175
+ return this.document.location;
176
+ };
177
+
178
+ jasmine.TrivialReporter.prototype.specFilter = function(spec) {
179
+ var paramMap = {};
180
+ var params = this.getLocation().search.substring(1).split('&');
181
+ for (var i = 0; i < params.length; i++) {
182
+ var p = params[i].split('=');
183
+ paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
184
+ }
185
+
186
+ if (!paramMap.spec) {
187
+ return true;
188
+ }
189
+ return spec.getFullName().indexOf(paramMap.spec) === 0;
190
+ };