midas 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. data/.bundle/config +2 -0
  2. data/.document +5 -0
  3. data/.gitignore +32 -0
  4. data/Gemfile +12 -0
  5. data/LICENSE +20 -0
  6. data/README.textile +21 -0
  7. data/Rakefile +84 -0
  8. data/VERSION +1 -0
  9. data/features/step_definitions/editor_steps.rb +16 -0
  10. data/features/step_definitions/web_steps.rb +205 -0
  11. data/features/support/env.rb +39 -0
  12. data/features/support/paths.rb +29 -0
  13. data/features/view_editor.feature +8 -0
  14. data/generators/midas/midas_generator.rb +1 -0
  15. data/lib/midas.rb +1 -0
  16. data/midas.gemspec +131 -0
  17. data/public/images/midas/toolbars/actions/_background.png +0 -0
  18. data/public/images/midas/toolbars/actions/_background_radio.png +0 -0
  19. data/public/images/midas/toolbars/actions/_separator.png +0 -0
  20. data/public/images/midas/toolbars/actions/extra/prefspane.png +0 -0
  21. data/public/images/midas/toolbars/actions/extra/todospane.png +0 -0
  22. data/public/images/midas/toolbars/actions/historypanel.png +0 -0
  23. data/public/images/midas/toolbars/actions/insertcharacter.png +0 -0
  24. data/public/images/midas/toolbars/actions/insertlink.png +0 -0
  25. data/public/images/midas/toolbars/actions/insertmedia.png +0 -0
  26. data/public/images/midas/toolbars/actions/insertobject.png +0 -0
  27. data/public/images/midas/toolbars/actions/inserttable.png +0 -0
  28. data/public/images/midas/toolbars/actions/inspectorpanel.png +0 -0
  29. data/public/images/midas/toolbars/actions/notespanel.png +0 -0
  30. data/public/images/midas/toolbars/actions/preview.png +0 -0
  31. data/public/images/midas/toolbars/actions/redo.png +0 -0
  32. data/public/images/midas/toolbars/actions/save.png +0 -0
  33. data/public/images/midas/toolbars/actions/undo.png +0 -0
  34. data/public/images/midas/toolbars/htmleditor/_background.png +0 -0
  35. data/public/images/midas/toolbars/htmleditor/_line_separator.png +0 -0
  36. data/public/images/midas/toolbars/htmleditor/_separator.png +0 -0
  37. data/public/images/midas/toolbars/htmleditor/buttons.png +0 -0
  38. data/public/javascripts/midas/config.js +181 -0
  39. data/public/javascripts/midas/dialog.js +9 -0
  40. data/public/javascripts/midas/midas.js +307 -0
  41. data/public/javascripts/midas/native_extensions.js +43 -0
  42. data/public/javascripts/midas/palette.js +108 -0
  43. data/public/javascripts/midas/region.js +194 -0
  44. data/public/javascripts/midas/statusbar.js +84 -0
  45. data/public/javascripts/midas/toolbar.js +255 -0
  46. data/public/javascripts/prototype.js +6001 -0
  47. data/public/midas/backcolor.html +97 -0
  48. data/public/midas/examples/bundled.html +60 -0
  49. data/public/midas/examples/iframe.html +73 -0
  50. data/public/midas/examples/index.html +73 -0
  51. data/public/midas/examples/javascript_archive.js +111 -0
  52. data/public/midas/forecolor.html +97 -0
  53. data/public/stylesheets/midas/dialog.css +2 -0
  54. data/public/stylesheets/midas/midas.css +9 -0
  55. data/public/stylesheets/midas/palette.css +50 -0
  56. data/public/stylesheets/midas/region.css +16 -0
  57. data/public/stylesheets/midas/statusbar.css +17 -0
  58. data/public/stylesheets/midas/toolbar.css +262 -0
  59. data/rails/init.rb +1 -0
  60. data/spec/javascripts/dialog_spec.js +7 -0
  61. data/spec/javascripts/fixtures/midas_fixture.html +27 -0
  62. data/spec/javascripts/fixtures/midas_styles.css +14 -0
  63. data/spec/javascripts/fixtures/native_extensions_fixture.html +5 -0
  64. data/spec/javascripts/helpers/browser_detection.js +15 -0
  65. data/spec/javascripts/helpers/event_simulation.js +505 -0
  66. data/spec/javascripts/helpers/spec_helper.js +125 -0
  67. data/spec/javascripts/midas_spec.js +284 -0
  68. data/spec/javascripts/native_extensions_spec.js +39 -0
  69. data/spec/javascripts/palette_spec.js +59 -0
  70. data/spec/javascripts/region_spec.js +441 -0
  71. data/spec/javascripts/statusbar_spec.js +61 -0
  72. data/spec/javascripts/support/jasmine.yml +82 -0
  73. data/spec/javascripts/support/jasmine_config.rb +39 -0
  74. data/spec/javascripts/support/jasmine_runner.rb +19 -0
  75. data/spec/javascripts/toolbar_spec.js +149 -0
  76. data/spec/ruby/helpers/spec_helper.rb +9 -0
  77. data/spec/ruby/midas_spec.rb +9 -0
  78. data/spec/spec.opts +1 -0
  79. data/tasks/midas_tasks.rake +105 -0
  80. metadata +166 -0
@@ -0,0 +1,2 @@
1
+ /* Dialog
2
+ *----------------------------------------------------------------------------*/
@@ -0,0 +1,9 @@
1
+ /* Midas IFRAME setup
2
+ *----------------------------------------------------------------------------*/
3
+ .midas-iframe-container {
4
+ position: absolute;
5
+ z-index: 10000;
6
+ background: #FFF;
7
+ }
8
+ .midas-iframe-window {
9
+ }
@@ -0,0 +1,50 @@
1
+ /* Palette
2
+ *----------------------------------------------------------------------------*/
3
+ .midas-palette {
4
+ position: fixed;
5
+ background: #E2E1E2;
6
+ border: 1px solid #727272;
7
+ margin-top: -1px;
8
+ -moz-box-shadow: 1px 1px 4px rgba(0, 0, 0, .5);
9
+ -webkit-box-shadow: 1px 1px 4px rgba(0, 0, 0, .5);
10
+ box-shadow: 1px 1px 4px rgba(0, 0, 0, .5);
11
+ }
12
+ .midas-htmleditorbar .midas-button-forecolor,
13
+ .midas-htmleditorbar .midas-button-backcolor {
14
+ background-position: 0 -54px;
15
+ }
16
+ .midas-htmleditorbar .midas-button-forecolor {
17
+ background-color: #000;
18
+ }
19
+
20
+ #midas_forecolor_selector,
21
+ #midas_backcolor_selector {
22
+ width: 170px;
23
+ padding: 1px;
24
+ }
25
+ #midas_forecolor_selector div,
26
+ #midas_backcolor_selector div {
27
+ float: left;
28
+ border: 1px solid #E2E1E2;
29
+ width: 15px;
30
+ height: 15px;
31
+ cursor: pointer;
32
+ }
33
+ #midas_forecolor_selector div:hover,
34
+ #midas_backcolor_selector div:hover {
35
+ border: 1px solid #333;
36
+ }
37
+ #midas_forecolor_selector div#midas_forecolor_last_picked,
38
+ #midas_backcolor_selector div#midas_backcolor_last_picked {
39
+ border: 1px solid #333;
40
+ width: 166px;
41
+ clear: left;
42
+ text-align: center;
43
+ margin: 1px 1px 2px 1px;
44
+ position: relative;
45
+ top: 1px;
46
+ float: none;
47
+ line-height: 15px;
48
+ font-family: Helvetica, Tahoma, Arial, sans-serif;
49
+ font-size: 8.5pt;
50
+ }
@@ -0,0 +1,16 @@
1
+ /* Region
2
+ *----------------------------------------------------------------------------*/
3
+ .midas-region {
4
+ outline: 1px dotted #F00;
5
+ }
6
+ .midas-region .midas-page-break {
7
+ height: 5px;
8
+ background: #EEE;
9
+ overflow: hidden;
10
+ border: 1px dotted #999;
11
+ border-width: 1px 0;
12
+ margin: 2px 0;
13
+ }
14
+ .midas-region .midas-page-break em {
15
+ display: none;
16
+ }
@@ -0,0 +1,17 @@
1
+ /* Statusbar
2
+ *----------------------------------------------------------------------------*/
3
+ .midas-statusbar {
4
+ position: fixed;
5
+ z-index: 10001;
6
+ padding: 5px 10px 4px 10px;
7
+ background: #E2E1E2;
8
+ border-top: 1px solid #727272;
9
+ bottom: 0;
10
+ left: 0;
11
+ width: 100%;
12
+ font-family: Helvetica, Tahoma, Arial, sans-serif;
13
+ font-size: 8.5pt;
14
+ }
15
+ .midas-statusbar span {
16
+ margin-right: 25px;
17
+ }
@@ -0,0 +1,262 @@
1
+ /* Toolbar
2
+ *----------------------------------------------------------------------------*/
3
+ .midas-toolbar {
4
+ position: fixed;
5
+ z-index: 10001;
6
+ top: 0;
7
+ left: 0;
8
+ width: 100%;
9
+ overflow: hidden;
10
+ }
11
+
12
+ .midas-actionsbar {
13
+ width: 10000px;
14
+ text-shadow: #EEE 0 1px 0;
15
+ height: 60px;
16
+ padding-right: 10px;
17
+ background: #E2E1E2 url(../../images/midas/toolbars/actions/_background.png) repeat-x bottom;
18
+ }
19
+ .midas-actionsbar .midas-button {
20
+ display: block;
21
+ float: left;
22
+ margin-left: 7px;
23
+ background-repeat: no-repeat;
24
+ background-position: 50% 7px;
25
+ height: 10px;
26
+ min-width: 30px;
27
+ text-align: center;
28
+ padding: 43px 5px 0 5px;
29
+ white-space: nowrap;
30
+ text-decoration: none;
31
+ outline: none;
32
+ font-family: Helvetica, Tahoma, Arial, sans-serif;
33
+ }
34
+ .midas-actionsbar .midas-button em {
35
+ display: block;
36
+ margin: 0 -5px;
37
+ font-style: normal;
38
+ color: #222;
39
+ font-size: 8.5pt;
40
+ }
41
+ .midas-actionsbar .midas-separator,
42
+ .midas-actionsbar .midas-line-separator,
43
+ .midas-actionsbar .midas-flex-separator {
44
+ display: block;
45
+ float: left;
46
+ border: 0;
47
+ height: 47px;
48
+ padding: 0 20px;
49
+ background: url(../../images/midas/toolbars/actions/_separator.png) no-repeat;
50
+ }
51
+ .midas-actionsbar .midas-button-save { background-image: url(../../images/midas/toolbars/actions/save.png); }
52
+ .midas-actionsbar .midas-button-preview { background-image: url(../../images/midas/toolbars/actions/preview.png); }
53
+ .midas-actionsbar .midas-button-undo { background-image: url(../../images/midas/toolbars/actions/undo.png); }
54
+ .midas-actionsbar .midas-button-redo { background-image: url(../../images/midas/toolbars/actions/redo.png); }
55
+ .midas-actionsbar .midas-button-insertlink { background-image: url(../../images/midas/toolbars/actions/insertlink.png); }
56
+ .midas-actionsbar .midas-button-insertmedia { background-image: url(../../images/midas/toolbars/actions/insertmedia.png); }
57
+ .midas-actionsbar .midas-button-inserttable { background-image: url(../../images/midas/toolbars/actions/inserttable.png); }
58
+ .midas-actionsbar .midas-button-insertobject { background-image: url(../../images/midas/toolbars/actions/insertobject.png); }
59
+ .midas-actionsbar .midas-button-insertcharacter { background-image: url(../../images/midas/toolbars/actions/insertcharacter.png); }
60
+ .midas-actionsbar .midas-button-inspectorpanel { background-image: url(../../images/midas/toolbars/actions/inspectorpanel.png); }
61
+ .midas-actionsbar .midas-button-notespanel { background-image: url(../../images/midas/toolbars/actions/notespanel.png); }
62
+ .midas-actionsbar .midas-button-historypanel { background-image: url(../../images/midas/toolbars/actions/historypanel.png); }
63
+
64
+ /* Editor menu bar
65
+ *----------------------------------------------------------------------------*/
66
+ .midas-htmleditorbar {
67
+ padding: 3px 13px 1px 10px;
68
+ background: #D2D2D1 url(../../images/midas/toolbars/htmleditor/_background.png) repeat-x bottom;
69
+ }
70
+ .midas-htmleditorbar:after {
71
+ content: ".";
72
+ display: block;
73
+ clear: both;
74
+ visibility: hidden;
75
+ line-height: 0;
76
+ height: 0;
77
+ }
78
+
79
+ .midas-htmleditorbar .midas-separator,
80
+ .midas-htmleditorbar .midas-line-separator,
81
+ .midas-htmleditorbar .midas-flex-separator {
82
+ display: block;
83
+ float: left;
84
+ border: 0;
85
+ height: 18px;
86
+ padding: 0;
87
+ margin: 0 7px 0 0;
88
+ width: 1px;
89
+ background: url(../../images/midas/toolbars/htmleditor/_separator.png) no-repeat;
90
+ }
91
+ .midas-htmleditorbar .midas-line-separator {
92
+ background: url(../../images/midas/toolbars/htmleditor/_line_separator.png) no-repeat;
93
+ }
94
+ .midas-htmleditorbar .midas-button {
95
+ display: block;
96
+ outline: none;
97
+ float: left;
98
+ height: 18px;
99
+ width: 23px;
100
+ margin: 0 7px 4px 0;
101
+ background-image: url(../../images/midas/toolbars/htmleditor/buttons.png);
102
+ }
103
+ .midas-htmleditorbar .midas-button em {
104
+ display: none;
105
+ }
106
+ .midas-htmleditorbar .midas-group {
107
+ float: left;
108
+ }
109
+ .midas-htmleditorbar .midas-group .midas-separator,
110
+ .midas-htmleditorbar .midas-group .midas-line-separator,
111
+ .midas-htmleditorbar .midas-group .midas-flex-separator {
112
+ margin-left: 7px;
113
+ }
114
+
115
+ .midas-htmleditorbar .midas-group .midas-button {
116
+ width: 22px;
117
+ margin-left: 0;
118
+ margin-right: 0;
119
+ }
120
+ .midas-htmleditorbar .midas-group .midas-button:first-child {
121
+ width: 23px;
122
+ }
123
+ /*menu#edit command.select {*/
124
+ /*width: auto;*/
125
+ /*padding-right: 14px;*/
126
+ /*background: url(/images/protosite_editor/edit/buttons.gif) no-repeat right top;*/
127
+ /*}*/
128
+ /*menu#edit command.select.disabled, .disabled command.select {*/
129
+ /*background-position: right bottom !important;*/
130
+ /*}*/
131
+ /*menu#edit command.select.disabled label, .disabled command.select label {*/
132
+ /*background-position: left bottom !important;*/
133
+ /*text-indent: -1000px;*/
134
+ /*}*/
135
+ /*menu#edit #style { margin-right: 5px }*/
136
+ /*menu#edit #style label { width: 100px }*/
137
+ /*menu#edit #size label { width: 30px }*/
138
+
139
+ .midas-htmleditorbar .midas-button-bold { background-position: -68px 0 }
140
+ .midas-htmleditorbar .midas-button-bold.active { background-position: -68px -18px }
141
+ .midas-htmleditorbar .midas-button-bold.disabled,
142
+ .disabled .midas-button-bold { background-position: -68px -36px !important }
143
+
144
+ .midas-htmleditorbar .midas-button-italic { background-position: -91px 0 }
145
+ .midas-htmleditorbar .midas-button-italic.active { background-position: -91px -18px }
146
+ .midas-htmleditorbar .midas-button-italic.disabled,
147
+ .disabled .midas-button-italic { background-position: -91px -36px !important }
148
+
149
+ .midas-htmleditorbar .midas-button-overline { background-position: -113px 0 }
150
+ .midas-htmleditorbar .midas-button-overline.active { background-position: -113px -18px }
151
+ .midas-htmleditorbar .midas-button-overline.disabled,
152
+ .disabled .midas-button-overline { background-position: -113px -36px !important }
153
+
154
+ .midas-htmleditorbar .midas-button-strikethrough { background-position: -135px 0 }
155
+ .midas-htmleditorbar .midas-button-strikethrough.active { background-position: -135px -18px }
156
+ .midas-htmleditorbar .midas-button-strikethrough.disabled,
157
+ .disabled .midas-button-strikethrough { background-position: -135px -36px !important }
158
+
159
+ .midas-htmleditorbar .midas-button-underline { background-position: -157px 0 }
160
+ .midas-htmleditorbar .midas-button-underline.active { background-position: -157px -18px }
161
+ .midas-htmleditorbar .midas-button-underline.disabled,
162
+ .disabled .midas-button-underline { background-position: -157px -36px !important }
163
+
164
+ .midas-htmleditorbar .midas-button-subscript { background-position: -180px 0 }
165
+ .midas-htmleditorbar .midas-button-subscript.active { background-position: -180px -18px }
166
+ .midas-htmleditorbar .midas-button-subscript.disabled,
167
+ .disabled .midas-button-subscript { background-position: -180px -36px !important }
168
+
169
+ .midas-htmleditorbar .midas-button-superscript { background-position: -203px 0 }
170
+ .midas-htmleditorbar .midas-button-superscript.active { background-position: -203px -18px }
171
+ .midas-htmleditorbar .midas-button-superscript.disabled,
172
+ .disabled .midas-button-superscript { background-position: -203px -36px !important }
173
+
174
+ .midas-htmleditorbar .midas-button-justifyleft { background-position: -226px 0 }
175
+ .midas-htmleditorbar .midas-button-justifyleft.active { background-position: -226px -18px }
176
+ .midas-htmleditorbar .midas-button-justifyleft.disabled,
177
+ .disabled .midas-button-justifyleft { background-position: -226px -36px !important }
178
+
179
+ .midas-htmleditorbar .midas-button-justifycenter { background-position: -249px 0 }
180
+ .midas-htmleditorbar .midas-button-justifycenter.active { background-position: -249px -18px }
181
+ .midas-htmleditorbar .midas-button-justifycenter.disabled,
182
+ .disabled .midas-button-justifycenter { background-position: -249px -36px !important }
183
+
184
+ .midas-htmleditorbar .midas-button-justifyright { background-position: -271px 0 }
185
+ .midas-htmleditorbar .midas-button-justifyright.active { background-position: -271px -18px }
186
+ .midas-htmleditorbar .midas-button-justifyright.disabled,
187
+ .disabled .midas-button-justifyright { background-position: -271px -36px !important }
188
+
189
+ .midas-htmleditorbar .midas-button-justifyfull { background-position: -293px 0 }
190
+ .midas-htmleditorbar .midas-button-justifyfull.active { background-position: -293px -18px }
191
+ .midas-htmleditorbar .midas-button-justifyfull.disabled,
192
+ .disabled .midas-button-justifyfull { background-position: -293px -36px !important }
193
+
194
+ .midas-htmleditorbar .midas-button-insertunorderedlist { background-position: -316px 0 }
195
+ .midas-htmleditorbar .midas-button-insertunorderedlist.active { background-position: -316px -18px }
196
+ .midas-htmleditorbar .midas-button-insertunorderedlist.disabled,
197
+ .disabled .midas-button-insertunorderedlist { background-position: -316px -36px !important }
198
+
199
+ .midas-htmleditorbar .midas-button-insertorderedlist { background-position: -339px 0 }
200
+ .midas-htmleditorbar .midas-button-insertorderedlist.active { background-position: -339px -18px }
201
+ .midas-htmleditorbar .midas-button-insertorderedlist.disabled,
202
+ .disabled .midas-button-insertorderedlist { background-position: -339px -36px !important }
203
+
204
+ .midas-htmleditorbar .midas-button-outdent { background-position: -362px 0 }
205
+ .midas-htmleditorbar .midas-button-outdent.active { background-position: -362px -18px }
206
+ .midas-htmleditorbar .midas-button-outdent.disabled,
207
+ .disabled .midas-button-outdent { background-position: -362px -36px !important }
208
+
209
+ .midas-htmleditorbar .midas-button-indent { background-position: -385px 0 }
210
+ .midas-htmleditorbar .midas-button-indent.active { background-position: -385px -18px }
211
+ .midas-htmleditorbar .midas-button-indent.disabled,
212
+ .disabled .midas-button-indent { background-position: -385px -36px !important }
213
+
214
+ .midas-htmleditorbar .midas-button-insertrowbefore { background-position: -408px 0 }
215
+ .midas-htmleditorbar .midas-button-insertrowbefore.active { background-position: -408px -18px }
216
+ .midas-htmleditorbar .midas-button-insertrowbefore.disabled,
217
+ .disabled .midas-button-insertrowbefore { background-position: -408px -36px !important }
218
+
219
+ .midas-htmleditorbar .midas-button-insertrowafter { background-position: -431px 0 }
220
+ .midas-htmleditorbar .midas-button-insertrowafter.active { background-position: -431px -18px }
221
+ .midas-htmleditorbar .midas-button-insertrowafter.disabled,
222
+ .disabled .midas-button-insertrowafter { background-position: -431px -36px !important }
223
+
224
+ .midas-htmleditorbar .midas-button-deleterow { background-position: -453px 0 }
225
+ .midas-htmleditorbar .midas-button-deleterow.active { background-position: -453px -18px }
226
+ .midas-htmleditorbar .midas-button-deleterow.disabled,
227
+ .disabled .midas-button-deleterow { background-position: -453px -36px !important }
228
+
229
+ .midas-htmleditorbar .midas-button-insertcolumnbefore { background-position: -475px 0 }
230
+ .midas-htmleditorbar .midas-button-insertcolumnbefore.active { background-position: -475px -18px }
231
+ .midas-htmleditorbar .midas-button-insertcolumnbefore.disabled,
232
+ .disabled .midas-button-insertcolumnbefore { background-position: -475px -36px !important }
233
+
234
+ .midas-htmleditorbar .midas-button-insertcolumnafter { background-position: -497px 0 }
235
+ .midas-htmleditorbar .midas-button-insertcolumnafter.active { background-position: -497px -18px }
236
+ .midas-htmleditorbar .midas-button-insertcolumnafter.disabled,
237
+ .disabled .midas-button-insertcolumnafter { background-position: -497px -36px !important }
238
+
239
+ .midas-htmleditorbar .midas-button-deletecolumn { background-position: -519px 0 }
240
+ .midas-htmleditorbar .midas-button-deletecolumn.active { background-position: -519px -18px }
241
+ .midas-htmleditorbar .midas-button-deletecolumn.disabled,
242
+ .disabled .midas-button-deletecolumn { background-position: -519px -36px !important }
243
+
244
+ .midas-htmleditorbar .midas-button-horizontalrule { background-position: -542px 0 }
245
+ .midas-htmleditorbar .midas-button-horizontalrule.active { background-position: -542px -18px }
246
+ .midas-htmleditorbar .midas-button-horizontalrule.disabled,
247
+ .disabled .midas-button-horizontalrule { background-position: -542px -36px !important }
248
+
249
+ .midas-htmleditorbar .midas-button-pagebreak { background-position: -565px 0 }
250
+ .midas-htmleditorbar .midas-button-pagebreak.active { background-position: -565px -18px }
251
+ .midas-htmleditorbar .midas-button-pagebreak.disabled,
252
+ .disabled .midas-button-pagebreak { background-position: -565px -36px !important }
253
+
254
+ .midas-htmleditorbar .midas-button-removeformatting { background-position: -588px 0 }
255
+ .midas-htmleditorbar .midas-button-removeformatting.active { background-position: -588px -18px }
256
+ .midas-htmleditorbar .midas-button-removeformatting.disabled,
257
+ .disabled .midas-button-removeformatting { background-position: -588px -36px !important }
258
+
259
+ .midas-htmleditorbar .midas-button-html { background-position: -612px 0 }
260
+ .midas-htmleditorbar .midas-button-html.active { background-position: -588px -18px }
261
+ .midas-htmleditorbar .midas-button-html.disabled,
262
+ .disabled .midas-button-html { background-position: -588px -36px !important }
@@ -0,0 +1 @@
1
+ # initialize for rails
@@ -0,0 +1,7 @@
1
+ describe('Midas.Dialog', function() {
2
+
3
+ beforeEach(function() {
4
+ jasmine.loadFixture('midas_fixture');
5
+ });
6
+
7
+ });
@@ -0,0 +1,27 @@
1
+ <div id="toolbar">toolbar</div>
2
+ <div id="statusbar">statusbar</div>
3
+ <div id="palette_button">palette button</div>
4
+
5
+ <div id="region1" class="editable">
6
+ region1
7
+ </div>
8
+ <div id="region2" class="editable">
9
+ region2
10
+ </div>
11
+ <div id="region3" class="not-editable">
12
+
13
+ </div>
14
+ <div id="region4" class="editable">
15
+ <div id="action">action in region4</div>
16
+ <div id="div1">div1 <div id="div4">in</div> region4</div>
17
+ <div id="div2">
18
+ <div id="div3">th<em>e</em>re is <big>no</big> html here</div>
19
+ </div>
20
+ <div id="div5">
21
+ <ul>
22
+ <li>first li</li>
23
+ <li><span>this is in a li</span></li>
24
+ </ul>
25
+ </div>
26
+ <div id="div6"><span>this isn't in a li</span></div>
27
+ </div>
@@ -0,0 +1,14 @@
1
+ .midas-toolbar {
2
+ visibility: hidden;
3
+ position: absolute;
4
+ }
5
+ .editable {
6
+ height: 200px;
7
+ }
8
+
9
+ #div6 {
10
+ font-weight: bold;
11
+ }
12
+ #div3 {
13
+ font-style: italic;
14
+ }
@@ -0,0 +1,5 @@
1
+ <div id="div1">thi<span>s is</span> a <div>test</div></div>
2
+ <div id="div2">banana</div>
3
+ <div id="div3">thi<span>s </span><em>a </em><span>test</span></div>
4
+ <div id="div4">thi<blockquote>s is</blockquote> a <span>test</span><table><tr><td>aa</td></tr></table></div>
5
+ <iframe src="about:blank" id="iframe1"></iframe>
@@ -0,0 +1,15 @@
1
+ jasmine.browser = (function(){
2
+ var ua = navigator.userAgent;
3
+ var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
4
+ var isWebKit = ua.indexOf('AppleWebKit/') > -1;
5
+
6
+ return {
7
+ IE: !!window.attachEvent && !isOpera,
8
+ Opera: isOpera,
9
+ WebKit: isWebKit,
10
+ AppleWebKit: isWebKit && ua.indexOf('Chrome') < 0,
11
+ ChromeWebKit: isWebKit && ua.indexOf('Chrome') > -1,
12
+ Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
13
+ MobileSafari: /Apple.*Mobile/.test(ua)
14
+ }
15
+ })();
@@ -0,0 +1,505 @@
1
+ jasmine.simulate = {
2
+
3
+ /**
4
+ * Simulates a key event using the given event information to populate
5
+ * the generated event object. This method does browser-equalizing
6
+ * calculations to account for differences in the DOM and IE event models
7
+ * as well as different browser quirks. Note: keydown causes Safari 2.x to
8
+ * crash.
9
+ *
10
+ * @param {HTMLElement} target The target of the given event.
11
+ * @param {String} type The type of event to fire. This can be any one of
12
+ * the following: keyup, keydown, and keypress.
13
+ * @param {Boolean} bubbles (Optional) Indicates if the event can be
14
+ * bubbled up. DOM Level 3 specifies that all key events bubble by
15
+ * default. The default is true.
16
+ * @param {Boolean} cancelable (Optional) Indicates if the event can be
17
+ * canceled using preventDefault(). DOM Level 3 specifies that all
18
+ * key events can be cancelled. The default
19
+ * is true.
20
+ * @param {Window} view (Optional) The view containing the target. This is
21
+ * typically the window object. The default is window.
22
+ * @param {Boolean} ctrlKey (Optional) Indicates if one of the CTRL keys
23
+ * is pressed while the event is firing. The default is false.
24
+ * @param {Boolean} altKey (Optional) Indicates if one of the ALT keys
25
+ * is pressed while the event is firing. The default is false.
26
+ * @param {Boolean} shiftKey (Optional) Indicates if one of the SHIFT keys
27
+ * is pressed while the event is firing. The default is false.
28
+ * @param {Boolean} metaKey (Optional) Indicates if one of the META keys
29
+ * is pressed while the event is firing. The default is false.
30
+ * @param {int} keyCode (Optional) The code for the key that is in use.
31
+ * The default is 0.
32
+ * @param {int} charCode (Optional) The Unicode code for the character
33
+ * associated with the key being used. The default is 0.
34
+ * @static
35
+ */
36
+ keyEvent: function (target, type, bubbles, cancelable, view, ctrlKey, altKey, shiftKey, metaKey, keyCode, charCode) {
37
+ if (!target) throw('simulateKeyEvent(): Invalid target.');
38
+ if (typeof(type) != 'string') throw('simulateKeyEvent(): Event type must be a string.');
39
+
40
+ type = type.toLowerCase();
41
+ switch(type) {
42
+ case 'keyup':
43
+ case 'keydown':
44
+ case 'keypress':
45
+ break;
46
+ case 'textevent': // DOM Level 3
47
+ type = 'keypress';
48
+ break;
49
+ default: throw("simulateKeyEvent(): Event type '" + type + "' not supported.");
50
+ }
51
+
52
+ // setup default values
53
+ if (typeof(bubbles) == 'undefined') bubbles = true; // all key events bubble
54
+ if (typeof(cancelable) == 'undefined') cancelable = true; // all key events can be cancelled
55
+ if (typeof(view) == 'undefined') view = window;
56
+ if (typeof(ctrlKey) == 'undefined') ctrlKey = false;
57
+ if (typeof(altKey) == 'undefined') altKey = false;
58
+ if (typeof(shiftKey) == 'undefined') shiftKey = false;
59
+ if (typeof(metaKey) == 'undefined') metaKey = false;
60
+ if (typeof(keyCode) == 'undefined') keyCode = 0;
61
+ if (typeof(charCode) == 'undefined') charCode = 0;
62
+
63
+ // try to create a mouse event
64
+ var customEvent = null;
65
+
66
+ // check for DOM-compliant browsers first
67
+ if (typeof(document.createEvent) == 'function') {
68
+ try {
69
+ customEvent = document.createEvent('KeyEvents');
70
+ // Interesting problem: Firefox implemented a non-standard version
71
+ // of initKeyEvent() based on DOM Level 2 specs. Key event was
72
+ // removed from DOM Level 2 and re-introduced in DOM Level 3 with a
73
+ // different interface. Firefox is the only browser with any
74
+ // implementation of Key Events, so for now, assume it's Firefox if
75
+ // the above line doesn't error.
76
+ // TODO: Decipher between Firefox's implementation and a correct one.
77
+ customEvent.initKeyEvent(type, bubbles, cancelable, view, ctrlKey, altKey, shiftKey, metaKey, keyCode, charCode);
78
+ } catch (ex) {
79
+ // If we got here, that means key events aren't officially supported.
80
+ // Safari/WebKit is a real problem now. WebKit 522 won't let you set
81
+ // keyCode, charCode, or other properties if you use a UIEvent, so we
82
+ // first must try to create a generic event. The fun part is that
83
+ // this will throw an error on Safari 2.x. The end result is that we
84
+ // need another try...catch statement just to deal with this mess.
85
+ try {
86
+ // try to create generic event - will fail in Safari 2.x
87
+ customEvent = document.createEvent('Events');
88
+ } catch (uierror) {
89
+ // the above failed, so create a UIEvent for Safari 2.x
90
+ customEvent = document.createEvent('UIEvents');
91
+ } finally {
92
+ customEvent.initEvent(type, bubbles, cancelable);
93
+ customEvent.view = view;
94
+ customEvent.altKey = altKey;
95
+ customEvent.ctrlKey = ctrlKey;
96
+ customEvent.shiftKey = shiftKey;
97
+ customEvent.metaKey = metaKey;
98
+ customEvent.keyCode = keyCode;
99
+ customEvent.charCode = charCode;
100
+ }
101
+ }
102
+ // fire the event
103
+ target.dispatchEvent(customEvent);
104
+ } else if (typeof(document.createEventObject) == 'object') {
105
+ //create an IE event object
106
+ customEvent = document.createEventObject();
107
+ customEvent.bubbles = bubbles;
108
+ customEvent.cancelable = cancelable;
109
+ customEvent.view = view;
110
+ customEvent.ctrlKey = ctrlKey;
111
+ customEvent.altKey = altKey;
112
+ customEvent.shiftKey = shiftKey;
113
+ customEvent.metaKey = metaKey;
114
+
115
+ // IE doesn't support charCode explicitly. CharCode should take
116
+ // precedence over any keyCode value for accurate representation.
117
+ customEvent.keyCode = (charCode > 0) ? charCode : keyCode;
118
+
119
+ // fire the event
120
+ target.fireEvent('on' + type, customEvent);
121
+ } else {
122
+ throw('simulateKeyEvent(): No event simulation framework present.');
123
+ }
124
+ },
125
+
126
+ /**
127
+ * Simulates a mouse event using the given event information to populate
128
+ * the generated event object. This method does browser-equalizing
129
+ * calculations to account for differences in the DOM and IE event models
130
+ * as well as different browser quirks.
131
+ *
132
+ * @param {HTMLElement} target The target of the given event.
133
+ * @param {String} type The type of event to fire. This can be any one of
134
+ * the following: click, dblclick, mousedown, mouseup, mouseout,
135
+ * mouseover, and mousemove.
136
+ * @param {Boolean} bubbles (Optional) Indicates if the event can be
137
+ * bubbled up. DOM Level 2 specifies that all mouse events bubble by
138
+ * default. The default is true.
139
+ * @param {Boolean} cancelable (Optional) Indicates if the event can be
140
+ * canceled using preventDefault(). DOM Level 2 specifies that all
141
+ * mouse events except mousemove can be cancelled. The default
142
+ * is true for all events except mousemove, for which the default
143
+ * is false.
144
+ * @param {Window} view (Optional) The view containing the target. This is
145
+ * typically the window object. The default is window.
146
+ * @param {int} detail (Optional) The number of times the mouse button has
147
+ * been used. The default value is 1.
148
+ * @param {int} screenX (Optional) The x-coordinate on the screen at which
149
+ * point the event occured. The default is 0.
150
+ * @param {int} screenY (Optional) The y-coordinate on the screen at which
151
+ * point the event occured. The default is 0.
152
+ * @param {int} clientX (Optional) The x-coordinate on the client at which
153
+ * point the event occured. The default is 0.
154
+ * @param {int} clientY (Optional) The y-coordinate on the client at which
155
+ * point the event occured. The default is 0.
156
+ * @param {Boolean} ctrlKey (Optional) Indicates if one of the CTRL keys
157
+ * is pressed while the event is firing. The default is false.
158
+ * @param {Boolean} altKey (Optional) Indicates if one of the ALT keys
159
+ * is pressed while the event is firing. The default is false.
160
+ * @param {Boolean} shiftKey (Optional) Indicates if one of the SHIFT keys
161
+ * is pressed while the event is firing. The default is false.
162
+ * @param {Boolean} metaKey (Optional) Indicates if one of the META keys
163
+ * is pressed while the event is firing. The default is false.
164
+ * @param {int} button (Optional) The button being pressed while the event
165
+ * is executing. The value should be 0 for the primary mouse button
166
+ * (typically the left button), 1 for the terciary mouse button
167
+ * (typically the middle button), and 2 for the secondary mouse button
168
+ * (typically the right button). The default is 0.
169
+ * @param {HTMLElement} relatedTarget (Optional) For mouseout events,
170
+ * this is the element that the mouse has moved to. For mouseover
171
+ * events, this is the element that the mouse has moved from. This
172
+ * argument is ignored for all other events. The default is null.
173
+ * @static
174
+ */
175
+ mouseEvent: function(target, type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
176
+ if (!target) throw('simulateMouseEvent(): Invalid target.');
177
+ if (typeof(type) != 'string') throw('simulateMouseEvent(): Event type must be a string.');
178
+
179
+ type = type.toLowerCase();
180
+ switch(type){
181
+ case 'mouseover':
182
+ case 'mouseout':
183
+ case 'mousedown':
184
+ case 'mouseup':
185
+ case 'click':
186
+ case 'dblclick':
187
+ case 'mousemove':
188
+ break;
189
+ default: throw("simulateMouseEvent(): Event type '" + type + "' not supported.");
190
+ }
191
+
192
+ //setup default values
193
+ if (typeof(bubbles) == 'undefined') bubbles = true; // all mouse events bubble
194
+ if (typeof(cancelable) == 'undefined') cancelable = (type != "mousemove"); // mousemove is the only one that can't be cancelled
195
+ if (typeof(view) == 'undefined') view = window; // view is typically window
196
+ if (typeof(detail) == 'undefined') detail = 1; // number of mouse clicks must be at least one
197
+ if (typeof(screenX) == 'undefined') screenX = 0;
198
+ if (typeof(screenY) == 'undefined') screenY = 0;
199
+ if (typeof(clientX) == 'undefined') clientX = 0;
200
+ if (typeof(clientY) == 'undefined') clientY = 0;
201
+ if (typeof(ctrlKey) == 'undefined') ctrlKey = false;
202
+ if (typeof(altKey) == 'undefined') altKey = false;
203
+ if (typeof(shiftKey) == 'undefined') shiftKey = false;
204
+ if (typeof(metaKey) == 'undefined') metaKey = false;
205
+ if (typeof(button) == 'undefined') button = 0;
206
+
207
+ // try to create a mouse event
208
+ var customEvent = null;
209
+
210
+ // check for DOM-compliant browsers first
211
+ if (typeof(document.createEvent) == 'function') {
212
+ customEvent = document.createEvent("MouseEvents");
213
+
214
+ // Safari 2.x (WebKit 418) still doesn't implement initMouseEvent()
215
+ if (customEvent.initMouseEvent) {
216
+ customEvent.initMouseEvent(type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
217
+ } else {
218
+ // the closest thing available in Safari 2.x is UIEvents
219
+ customEvent = document.createEvent("UIEvents");
220
+ customEvent.initEvent(type, bubbles, cancelable);
221
+ customEvent.view = view;
222
+ customEvent.detail = detail;
223
+ customEvent.screenX = screenX;
224
+ customEvent.screenY = screenY;
225
+ customEvent.clientX = clientX;
226
+ customEvent.clientY = clientY;
227
+ customEvent.ctrlKey = ctrlKey;
228
+ customEvent.altKey = altKey;
229
+ customEvent.metaKey = metaKey;
230
+ customEvent.shiftKey = shiftKey;
231
+ customEvent.button = button;
232
+ customEvent.relatedTarget = relatedTarget;
233
+ }
234
+
235
+ // Check to see if relatedTarget has been assigned. Firefox versions
236
+ // less than 2.0 don't allow it to be assigned via initMouseEvent()
237
+ // and the property is readonly after event creation, so in order to
238
+ // keep YAHOO.util.getRelatedTarget() working, assign to the IE
239
+ // proprietary toElement property for mouseout event and fromElement
240
+ // property for mouseover event.
241
+ if (relatedTarget && !customEvent.relatedTarget) {
242
+ if (type == "mouseout") {
243
+ customEvent.toElement = relatedTarget;
244
+ } else if (type == "mouseover") {
245
+ customEvent.fromElement = relatedTarget;
246
+ }
247
+ }
248
+
249
+ //fire the event
250
+ target.dispatchEvent(customEvent);
251
+ } else if (typeof(document.createEventObject) == 'object') {
252
+ //create an IE event object
253
+ customEvent = document.createEventObject();
254
+ customEvent.bubbles = bubbles;
255
+ customEvent.cancelable = cancelable;
256
+ customEvent.view = view;
257
+ customEvent.detail = detail;
258
+ customEvent.screenX = screenX;
259
+ customEvent.screenY = screenY;
260
+ customEvent.clientX = clientX;
261
+ customEvent.clientY = clientY;
262
+ customEvent.ctrlKey = ctrlKey;
263
+ customEvent.altKey = altKey;
264
+ customEvent.metaKey = metaKey;
265
+ customEvent.shiftKey = shiftKey;
266
+ //fix button property for IE's wacky implementation
267
+ switch(button) {
268
+ case 0: customEvent.button = 1; break;
269
+ case 1: customEvent.button = 4; break;
270
+ case 2: break; // leave as is
271
+ default: customEvent.button = 0;
272
+ }
273
+ // Have to use relatedTarget because IE won't allow assignment to
274
+ // toElement or fromElement on generic events. This keeps
275
+ // YAHOO.util.customEvent.getRelatedTarget() functional.
276
+ customEvent.relatedTarget = relatedTarget;
277
+
278
+ //fire the event
279
+ target.fireEvent("on" + type, customEvent);
280
+ } else {
281
+ throw('simulateMouseEvent(): No event simulation framework present.');
282
+ }
283
+ },
284
+
285
+ //--------------------------------------------------------------------------
286
+ // Mouse events
287
+ //--------------------------------------------------------------------------
288
+
289
+ /**
290
+ * Simulates a mouse event on a particular element.
291
+ *
292
+ * @param {HTMLElement} target The element to click on.
293
+ * @param {String} type The type of event to fire. This can be any one of
294
+ * the following: click, dblclick, mousedown, mouseup, mouseout,
295
+ * mouseover, and mousemove.
296
+ * @param {Object} options Additional event options (use DOM standard names).
297
+ * @static
298
+ */
299
+ fireMouseEvent: function(type, target, options) {
300
+ options = options || {};
301
+ this.mouseEvent(target, type, options.bubbles,
302
+ options.cancelable, options.view, options.detail, options.screenX,
303
+ options.screenY, options.clientX, options.clientY, options.ctrlKey,
304
+ options.altKey, options.shiftKey, options.metaKey, options.button,
305
+ options.relatedTarget);
306
+ },
307
+
308
+ /**
309
+ * Simulates a click on a particular element.
310
+ *
311
+ * @param {HTMLElement} target The element to click on.
312
+ * @param {Object} options Additional event options (use DOM standard names).
313
+ * @static
314
+ */
315
+ click: function(target, options) {
316
+ this.fireMouseEvent('click', target, options);
317
+ },
318
+
319
+ /**
320
+ * Simulates a double click on a particular element.
321
+ *
322
+ * @param {HTMLElement} target The element to double click on.
323
+ * @param {Object} options Additional event options (use DOM standard names).
324
+ * @static
325
+ */
326
+ dblclick: function(target, options) {
327
+ this.fireMouseEvent('dblclick', target, options);
328
+ },
329
+
330
+ /**
331
+ * Simulates a mousedown on a particular element.
332
+ *
333
+ * @param {HTMLElement} target The element to act on.
334
+ * @param {Object} options Additional event options (use DOM standard names).
335
+ * @static
336
+ */
337
+ mousedown: function(target, options) {
338
+ this.fireMouseEvent('mousedown', target, options);
339
+ },
340
+
341
+ /**
342
+ * Simulates a mousemove on a particular element.
343
+ *
344
+ * @param {HTMLElement} target The element to act on.
345
+ * @param {Object} options Additional event options (use DOM standard names).
346
+ * @static
347
+ */
348
+ mousemove: function(target, options) {
349
+ this.fireMouseEvent('mousemove', target, options);
350
+ },
351
+
352
+ /**
353
+ * Simulates a mouseout event on a particular element. Use 'relatedTarget'
354
+ * on the options object to specify where the mouse moved to.
355
+ *
356
+ * Quirks: Firefox less than 2.0 doesn't set relatedTarget properly, so
357
+ * toElement is assigned in its place. IE doesn't allow toElement to be
358
+ * be assigned, so relatedTarget is assigned in its place. Both of these
359
+ * concessions allow YAHOO.util.Event.getRelatedTarget() to work correctly
360
+ * in both browsers.
361
+ *
362
+ * @param {HTMLElement} target The element to act on.
363
+ * @param {Object} options Additional event options (use DOM standard names).
364
+ * @static
365
+ */
366
+ mouseout: function(target, options) {
367
+ this.fireMouseEvent('mouseout', target, options);
368
+ },
369
+
370
+ /**
371
+ * Simulates a mouseover event on a particular element. Use 'relatedTarget'
372
+ * on the options object to specify where the mouse moved from.
373
+ *
374
+ * Quirks: Firefox less than 2.0 doesn't set relatedTarget properly, so
375
+ * fromElement is assigned in its place. IE doesn't allow fromElement to be
376
+ * be assigned, so relatedTarget is assigned in its place. Both of these
377
+ * concessions allow YAHOO.util.Event.getRelatedTarget() to work correctly
378
+ * in both browsers.
379
+ *
380
+ * @param {HTMLElement} target The element to act on.
381
+ * @param {Object} options Additional event options (use DOM standard names).
382
+ * @static
383
+ */
384
+ mouseover: function(target, options) {
385
+ this.fireMouseEvent('mouseover', target, options);
386
+ },
387
+
388
+ /**
389
+ * Simulates a mouseup on a particular element.
390
+ *
391
+ * @param {HTMLElement} target The element to act on.
392
+ * @param {Object} options Additional event options (use DOM standard names).
393
+ * @static
394
+ */
395
+ mouseup: function(target, options) {
396
+ this.fireMouseEvent('mouseup', target, options);
397
+ },
398
+
399
+ //--------------------------------------------------------------------------
400
+ // Key events
401
+ //--------------------------------------------------------------------------
402
+
403
+ /**
404
+ * Fires an event that normally would be fired by the keyboard (keyup,
405
+ * keydown, keypress). Make sure to specify either keyCode or charCode as
406
+ * an option.
407
+ *
408
+ * @param {String} type The type of event ("keyup", "keydown" or "keypress").
409
+ * @param {HTMLElement} target The target of the event.
410
+ * @param {Object} options Options for the event. Either keyCode or charCode are required.
411
+ * @static
412
+ */
413
+ fireKeyEvent: function(type, target, options) {
414
+ options = options || {};
415
+ this.keyEvent(target, type, options.bubbles,
416
+ options.cancelable, options.view, options.ctrlKey,
417
+ options.altKey, options.shiftKey, options.metaKey,
418
+ options.keyCode, options.charCode);
419
+ },
420
+
421
+ /**
422
+ * Simulates a keydown event on a particular element.
423
+ *
424
+ * @param {HTMLElement} target The element to act on.
425
+ * @param {Object} options Additional event options (use DOM standard names).
426
+ * @static
427
+ */
428
+ keydown: function(target, options) {
429
+ this.fireKeyEvent('keydown', target, options);
430
+ },
431
+
432
+ /**
433
+ * Simulates a keypress on a particular element.
434
+ *
435
+ * @param {HTMLElement} target The element to act on.
436
+ * @param {Object} options Additional event options (use DOM standard names).
437
+ * @static
438
+ */
439
+ keypress: function(target, options) {
440
+ this.fireKeyEvent('keypress', target, options);
441
+ },
442
+
443
+ /**
444
+ * Simulates a keyup event on a particular element.
445
+ *
446
+ * @param {HTMLElement} target The element to act on.
447
+ * @param {Object} options Additional event options (use DOM standard names).
448
+ * @static
449
+ */
450
+ keyup: function(target, options) {
451
+ this.fireKeyEvent('keyup', target, options);
452
+ },
453
+
454
+ //--------------------------------------------------------------------------
455
+ // Other events
456
+ //--------------------------------------------------------------------------
457
+
458
+ /**
459
+ * Emulates a selection.. This doesn't simulate moving the mouse to make a
460
+ * selection, or using the arrow keys with shift, but it does create a
461
+ * selection that contains whatever target element you pass to it.
462
+ *
463
+ * @param {HTMLElement} target The element to select.
464
+ * @static
465
+ */
466
+ selection: function(target) {
467
+ var selection = window.getSelection();
468
+ var range = document.createRange();
469
+ range.selectNode(target);
470
+ selection.removeAllRanges();
471
+ selection.addRange(range);
472
+ },
473
+
474
+ /**
475
+ * Emulates pressing the tab button.
476
+ *
477
+ * @param {HTMLElement} target The element to press tab in.
478
+ * @static
479
+ */
480
+ tab: function(target) {
481
+ this.keypress(target, {keyCode: 9});
482
+ },
483
+
484
+ /**
485
+ * Executes a focus event
486
+ * -- not simulated, but it seems like the right place to put it.
487
+ *
488
+ * @param {HTMLElement} target The element to act on.
489
+ * @static
490
+ */
491
+ focus: function(target) {
492
+ target.focus();
493
+ },
494
+
495
+ /**
496
+ * Executes a focus event
497
+ * -- not simulated, but it seems like the right place to put it.
498
+ *
499
+ * @param {HTMLElement} target The element to act on.
500
+ * @static
501
+ */
502
+ blur: function(target) {
503
+ target.blur();
504
+ }
505
+ };