mercury-rails 0.2.0 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/POST_INSTALL +15 -0
  2. data/README.md +27 -6
  3. data/VERSION +1 -1
  4. data/app/controllers/mercury_controller.rb +4 -4
  5. data/app/views/layouts/mercury.html.erb +14 -3
  6. data/app/views/mercury/panels/snippets.html +1 -1
  7. data/app/views/mercury/snippets/{example_options.html.erb → example/options.html.erb} +0 -0
  8. data/app/views/mercury/snippets/{example.html.erb → example/preview.html.erb} +0 -0
  9. data/config/routes.rb +2 -2
  10. data/features/loading/loading.feature +22 -0
  11. data/features/loading/navigating.feature +77 -0
  12. data/features/loading/user_interface.feature +67 -0
  13. data/features/regions/editable/advanced_editing.feature +0 -0
  14. data/features/regions/editable/basic_editing.feature +195 -0
  15. data/features/regions/editable/inserting_links.feature +98 -0
  16. data/features/regions/editable/inserting_media.feature +110 -0
  17. data/features/regions/editable/inserting_snippets.feature +103 -0
  18. data/features/regions/editable/inserting_special_characters.feature +24 -0
  19. data/features/regions/editable/inserting_tables.feature +109 -0
  20. data/features/regions/editable/pasting.feature +0 -0
  21. data/features/regions/editable/uploading_images.feature +0 -0
  22. data/features/regions/markupable/advanced_editing.feature +0 -0
  23. data/features/regions/markupable/basic_editing.feature +0 -0
  24. data/features/regions/markupable/inserting_links.feature +0 -0
  25. data/features/regions/markupable/inserting_media.feature +0 -0
  26. data/features/regions/markupable/inserting_snippets.feature +0 -0
  27. data/features/regions/markupable/inserting_special_characters.feature +0 -0
  28. data/features/regions/markupable/inserting_tables.feature +0 -0
  29. data/features/regions/markupable/uploading_images.feature +0 -0
  30. data/features/regions/snippetable/advanced_editing.feature +0 -0
  31. data/features/regions/snippetable/basic_editing.feature +0 -0
  32. data/features/regions/snippetable/inserting_snippets.feature +0 -0
  33. data/features/saving/saving.feature +33 -0
  34. data/features/step_definitions/debug_steps.rb +2 -2
  35. data/features/step_definitions/mercury_steps.rb +441 -0
  36. data/features/support/env.rb +3 -3
  37. data/features/support/mercury_contents.rb +25 -0
  38. data/features/support/mercury_selectors.rb +147 -0
  39. data/features/support/paths.rb +20 -18
  40. data/features/support/selectors.rb +5 -3
  41. data/lib/generators/mercury/install/install_generator.rb +14 -0
  42. data/mercury-rails.gemspec +50 -20
  43. data/spec/javascripts/mercury/lightview_spec.js.coffee +55 -27
  44. data/spec/javascripts/mercury/mercury_spec.js.coffee +3 -3
  45. data/spec/javascripts/mercury/modal_spec.js.coffee +2 -2
  46. data/spec/javascripts/mercury/native_extensions_spec.js.coffee +0 -24
  47. data/spec/javascripts/mercury/page_editor_spec.js.coffee +148 -67
  48. data/spec/javascripts/mercury/panel_spec.js.coffee +2 -2
  49. data/spec/javascripts/mercury/region_spec.js.coffee +10 -7
  50. data/spec/javascripts/mercury/regions/editable_spec.js.coffee +0 -20
  51. data/spec/javascripts/mercury/snippet_toolbar_spec.js.coffee +2 -2
  52. data/spec/javascripts/mercury/toolbar.button_group_spec.js.coffee +1 -1
  53. data/spec/javascripts/mercury/toolbar.expander_spec.js.coffee +1 -1
  54. data/spec/javascripts/templates/mercury/page_editor.html +3 -3
  55. data/vendor/assets/images/mercury/close.png +0 -0
  56. data/vendor/assets/javascripts/mercury.js +140 -73
  57. data/vendor/assets/javascripts/{mercury_dependencies → mercury/dependencies}/jquery-1.6.js +0 -0
  58. data/vendor/assets/javascripts/{mercury_dependencies → mercury/dependencies}/jquery-ui-1.8.13.custom.js +0 -0
  59. data/vendor/assets/javascripts/{mercury_dependencies → mercury/dependencies}/jquery.additions.js +0 -0
  60. data/vendor/assets/javascripts/mercury/dependencies/jquery.htmlClean.js +527 -0
  61. data/vendor/assets/javascripts/{mercury_dependencies → mercury/dependencies}/liquidmetal.js +0 -0
  62. data/vendor/assets/javascripts/{mercury_dependencies → mercury/dependencies}/showdown.js +0 -0
  63. data/vendor/assets/javascripts/mercury/lightview.js.coffee +5 -2
  64. data/vendor/assets/javascripts/mercury/mercury.js.coffee +9 -8
  65. data/vendor/assets/javascripts/mercury/modals/htmleditor.js.coffee +3 -1
  66. data/vendor/assets/javascripts/mercury/modals/inserttable.js.coffee +2 -2
  67. data/vendor/assets/javascripts/mercury/native_extensions.js.coffee +6 -17
  68. data/vendor/assets/javascripts/mercury/page_editor.js.coffee +29 -8
  69. data/vendor/assets/javascripts/mercury/plugins/save_as_xml/mercury/page_editor.js.coffee +27 -0
  70. data/vendor/assets/javascripts/mercury/plugins/save_as_xml/plugin.js +9 -0
  71. data/vendor/assets/javascripts/mercury/region.js.coffee +2 -2
  72. data/vendor/assets/javascripts/mercury/regions/editable.js.coffee +89 -93
  73. data/vendor/assets/javascripts/mercury/regions/markupable.js.coffee +1 -1
  74. data/vendor/assets/javascripts/mercury/support/history.js +1 -0
  75. data/vendor/assets/javascripts/mercury/uploader.js.coffee +0 -1
  76. data/vendor/assets/javascripts/mercury_loader.js +4 -4
  77. data/vendor/assets/stylesheets/mercury/lightview.css +8 -0
  78. data/vendor/assets/stylesheets/mercury/mercury.css +12 -0
  79. data/vendor/assets/stylesheets/mercury/modal.css +0 -12
  80. data/vendor/assets/stylesheets/mercury/toolbar.css +1 -0
  81. data/vendor/assets/stylesheets/mercury_overrides.css +17 -0
  82. metadata +73 -45
  83. data/app/views/mercury/lightviews/imageprocessor.html +0 -3
  84. data/app/views/mercury/modals/sanitizer.html +0 -9
  85. data/features/editing/basic.feature +0 -11
  86. data/vendor/assets/images/mercury/clippy.png +0 -0
@@ -12,16 +12,16 @@ describe "Mercury", ->
12
12
 
13
13
  describe "#bind", ->
14
14
 
15
- it "binds an event prefixed with 'mercury:' to document", ->
15
+ it "binds an event prefixed with 'mercury:' to the top window", ->
16
16
  callCount = 0
17
17
  Mercury.bind('test', -> callCount += 1)
18
- $(document).trigger("mercury:test")
18
+ $(top).trigger("mercury:test")
19
19
  expect(callCount).toEqual(1)
20
20
 
21
21
 
22
22
  describe "#trigger", ->
23
23
 
24
- it "triggers an event prefixed with 'mercury:' on document", ->
24
+ it "triggers an event prefixed with 'mercury:' on the top window", ->
25
25
  argsForCall = []
26
26
  callCount = 0
27
27
  Mercury.bind('test', -> argsForCall[callCount] = arguments; callCount += 1)
@@ -11,8 +11,8 @@ describe "Mercury.modal", ->
11
11
  afterEach ->
12
12
  Mercury.modal.initialized = false
13
13
  Mercury.modal.visible = false
14
- $(document).unbind('mercury:refresh')
15
- $(document).unbind('mercury:resize')
14
+ $(window).unbind('mercury:refresh')
15
+ $(window).unbind('mercury:resize')
16
16
  $(document).unbind('keydown')
17
17
 
18
18
  describe "singleton method", ->
@@ -15,30 +15,6 @@ describe "String", ->
15
15
  expect('rgb(255, 255, 0)'.toHex()).toEqual('#FFFF00')
16
16
 
17
17
 
18
- describe "#singleDiff", ->
19
-
20
- it "takes a string to compare against, and returns the first diff it comes to", ->
21
- expect('abcdefg'.singleDiff('ab[diff]cdefg')).toEqual('[diff]')
22
- expect('abcd/e\\f.g'.singleDiff('ab[diff]cd/e\\f.g')).toEqual('[diff]')
23
-
24
-
25
- describe "#regExpEscape", ->
26
-
27
- it "escapes characters used in regular expressions", ->
28
- expect('/.*+?|()[]{}\\'.regExpEscape()).toEqual('\\/\\.\\*\\+\\?\\|\\(\\)\\[\\]\\{\\}\\\\')
29
-
30
- describe "#sanitizeHTML", ->
31
-
32
- it "removes style tags", ->
33
- expect('123<style></style>456'.sanitizeHTML()).toEqual('123456')
34
-
35
- it "removes comment tags", ->
36
- expect('123<!--this is a comment-->456'.sanitizeHTML()).toEqual('123456')
37
-
38
- it "replaces new lines with br tags", ->
39
- expect('123\n456'.sanitizeHTML()).toEqual('123<br/>456')
40
-
41
-
42
18
  describe "Number", ->
43
19
 
44
20
  describe "#toHex", ->
@@ -4,17 +4,20 @@ describe "Mercury.PageEditor", ->
4
4
 
5
5
  template 'mercury/page_editor.html'
6
6
 
7
+ beforeEach ->
8
+ Mercury.config.regionClass = 'custom-region-class'
9
+
7
10
  afterEach ->
8
11
  @pageEditor = null
9
12
  delete(@pageEditor)
10
13
  window.mercuryInstance = null
11
- $(document).unbind('mercury:initialize:frame')
12
- $(document).unbind('mercury:focus:frame')
13
- $(document).unbind('mercury:focus:window')
14
- $(document).unbind('mercury:toggle:interface')
15
- $(document).unbind('mercury:action')
16
- $(document).unbind('mousedown')
14
+ $(window).unbind('mercury:initialize:frame')
15
+ $(window).unbind('mercury:focus:frame')
16
+ $(window).unbind('mercury:focus:window')
17
+ $(window).unbind('mercury:toggle:interface')
18
+ $(window).unbind('mercury:action')
17
19
  $(window).unbind('resize')
20
+ $(document).unbind('mousedown')
18
21
 
19
22
  describe "constructor", ->
20
23
 
@@ -76,7 +79,7 @@ describe "Mercury.PageEditor", ->
76
79
 
77
80
  it "builds a focusable element (so we can get focus off the iframe)", ->
78
81
  @pageEditor = new Mercury.PageEditor('', {appendTo: $('#test')})
79
- expect($('input[type=text]').length).toEqual(1)
82
+ expect($('input.mercury-focusable[type=text]').length).toEqual(1)
80
83
 
81
84
  it "builds an iframe", ->
82
85
  @pageEditor = new Mercury.PageEditor('', {appendTo: $('#test')})
@@ -130,7 +133,13 @@ describe "Mercury.PageEditor", ->
130
133
  it "injects mercury namespace into the iframe", ->
131
134
  @finalizeInterfaceSpy.andCallFake(=>)
132
135
  @pageEditor.initializeFrame()
133
- expect(@pageEditor.iframe.get(0).contentWindow.Mercury).toEqual(Mercury)
136
+ expect(@pageEditor.iframe.get(0).contentWindow.Mercury).toEqual(window.Mercury)
137
+
138
+ it "provides the iframe with History (history.js)", ->
139
+ @finalizeInterfaceSpy.andCallFake(=>)
140
+ window.History = {Adapter: 'foo'}
141
+ @pageEditor.initializeFrame()
142
+ expect(@pageEditor.iframe.get(0).contentWindow.History).toEqual(window.History)
134
143
 
135
144
  it "calls bindEvents", ->
136
145
  @finalizeInterfaceSpy.andCallFake(=>)
@@ -152,13 +161,37 @@ describe "Mercury.PageEditor", ->
152
161
  @pageEditor.initializeFrame()
153
162
  expect(@finalizeInterfaceSpy.callCount).toEqual(1)
154
163
 
155
- it "fires the ready event", ->
164
+ it "fires the ready event (Mercury.trigger)", ->
156
165
  spy = spyOn(Mercury, 'trigger').andCallFake(=>)
157
166
  @finalizeInterfaceSpy.andCallFake(=>)
158
167
  @pageEditor.initializeFrame()
159
168
  expect(spy.callCount).toEqual(1)
160
169
  expect(spy.argsForCall[0]).toEqual(['ready'])
161
170
 
171
+ it "fires the ready event (jQuery.trigger)", ->
172
+ spy = spyOn(jQuery.fn, 'trigger').andCallFake(=>)
173
+ @finalizeInterfaceSpy.andCallFake(=>)
174
+ @pageEditor.initializeFrame()
175
+ expect(spy.callCount).toEqual(2)
176
+ expect(spy.argsForCall[0]).toEqual(['mercury:ready', undefined])
177
+
178
+ it "fires the ready event (Event.fire)", ->
179
+ @finalizeInterfaceSpy.andCallFake(=>)
180
+ iframeWindow = @pageEditor.iframe.get(0).contentWindow
181
+ iframeWindow.Event = {fire: ->}
182
+ spy = spyOn(iframeWindow.Event, 'fire').andCallFake(=>)
183
+ @pageEditor.initializeFrame()
184
+ expect(spy.callCount).toEqual(1)
185
+ expect(spy.argsForCall[0][1]).toEqual('mercury:ready')
186
+
187
+ it "calls onMercuryReady in the iframe", ->
188
+ @finalizeInterfaceSpy.andCallFake(=>)
189
+ iframeWindow = @pageEditor.iframe.get(0).contentWindow
190
+ iframeWindow.onMercuryReady = ->
191
+ spy = spyOn(iframeWindow, 'onMercuryReady').andCallFake(=>)
192
+ @pageEditor.initializeFrame()
193
+ expect(spy.callCount).toEqual(1)
194
+
162
195
  it "shows the iframe", ->
163
196
  @pageEditor.iframe.css({visibility: 'visible'})
164
197
  @finalizeInterfaceSpy.andCallFake(=>)
@@ -228,7 +261,11 @@ describe "Mercury.PageEditor", ->
228
261
  @pageEditor = new Mercury.PageEditor('', {appendTo: $('#test')})
229
262
  @highjackLinksAndFormsSpy = spyOn(Mercury.PageEditor.prototype, 'hijackLinksAndForms').andCallFake(=>)
230
263
 
231
- it "it builds a snippetToolbar", ->
264
+ it "injects an sanitizing element used for sanitizing content", ->
265
+ @pageEditor.finalizeInterface()
266
+ expect($('#mercury_sanitizer[contenteditable]').length).toEqual(1)
267
+
268
+ it "builds a snippetToolbar", ->
232
269
  @pageEditor.finalizeInterface()
233
270
  expect(@pageEditor.snippetToolbar).toEqual({snippetToolbar: true})
234
271
 
@@ -403,7 +440,6 @@ describe "Mercury.PageEditor", ->
403
440
 
404
441
  it "resizes the iframe", ->
405
442
  @pageEditor.resize()
406
- expect($('.mercury-iframe').css('top')).toEqual('100px')
407
443
  expect($('.mercury-iframe').css('height')).toEqual("#{500 - 100}px")
408
444
 
409
445
  it "triggers a resize event", ->
@@ -486,7 +522,7 @@ describe "Mercury.PageEditor", ->
486
522
  expect(@pageEditor.beforeUnload()).toEqual(null)
487
523
 
488
524
 
489
- describe "#save", ->
525
+ describe "#getRegionByName", ->
490
526
 
491
527
  beforeEach ->
492
528
  Mercury.PageEditor.prototype.initializeInterface = ->
@@ -494,69 +530,114 @@ describe "Mercury.PageEditor", ->
494
530
  @iframeSrcSpy = spyOn(Mercury.PageEditor.prototype, 'iframeSrc').andCallFake(=> '/foo/baz')
495
531
  @ajaxSpy = spyOn($, 'ajax')
496
532
 
497
- it "makes an ajax request", ->
498
- @ajaxSpy.andCallFake(=>)
499
- @pageEditor.save()
500
- expect(@ajaxSpy.callCount).toEqual(1)
501
-
502
- it "uses the save url passed in via options, the configured save url, or the iframe src", ->
503
- @ajaxSpy.andCallFake(=>)
504
- @pageEditor.saveUrl = '/foo/bar'
505
- @pageEditor.save()
506
- expect(@ajaxSpy.argsForCall[0][0]).toEqual('/foo/bar')
507
-
508
- @pageEditor.saveUrl = null
509
- Mercury.saveURL = '/foo/bit'
510
- @pageEditor.save()
511
- expect(@ajaxSpy.argsForCall[1][0]).toEqual('/foo/bit')
512
-
513
- @pageEditor.saveUrl = null
514
- Mercury.saveURL = null
515
- @pageEditor.save()
516
- expect(@ajaxSpy.argsForCall[2][0]).toEqual('/foo/baz')
517
-
518
- it "serializes the data in json", ->
519
- @ajaxSpy.andCallFake(=>)
520
- Mercury.config.saveStyle = 'json'
521
- spyOn(Mercury.PageEditor.prototype, 'serialize').andCallFake(=> {region1: 'region1'})
522
- @pageEditor.save()
523
- expect(@ajaxSpy.argsForCall[0][1]['data']).toEqual({content: '{"region1":"region1"}' })
524
-
525
- it "can serialize as form values", ->
526
- @ajaxSpy.andCallFake(=>)
527
- @pageEditor.options.saveStyle = 'form'
528
- spyOn(Mercury.PageEditor.prototype, 'serialize').andCallFake(=> {region1: 'region1'})
529
- @pageEditor.save()
530
- expect(@ajaxSpy.argsForCall[0][1]['data']).toEqual({content: {region1: 'region1'}})
531
-
532
- it "sets headers by calling #saveHeaders", ->
533
- @ajaxSpy.andCallFake(=>)
534
- spyOn(Mercury.PageEditor.prototype, 'serialize').andCallFake(=> {region1: 'region1'})
535
- spy = spyOn(Mercury.PageEditor.prototype, 'saveHeaders').andCallFake(=> {'X-CSRFToken': 'f00'})
536
- @pageEditor.save()
537
- expect(@ajaxSpy.argsForCall[0][1]['headers']).toEqual({'X-CSRFToken': 'f00'})
538
-
539
- describe "on successful ajax request", ->
533
+ it "returns the region if a match is found", ->
534
+ @pageEditor.regions = [{name: 'foo'}, {name: 'bar'}, {name: 'baz'}]
535
+ expect(@pageEditor.getRegionByName('foo')).toEqual(@pageEditor.regions[0])
536
+ expect(@pageEditor.getRegionByName('baz')).toEqual(@pageEditor.regions[2])
540
537
 
541
- beforeEach ->
542
- @ajaxSpy.andCallFake((url, options) => options.success('data') )
538
+ it "returns null if no match was found", ->
539
+ @pageEditor.regions = [{name: 'bar'}]
540
+ expect(@pageEditor.getRegionByName('foo')).toEqual(null)
543
541
 
544
- it "sets changes back to false", ->
545
- Mercury.changes = true
546
- @pageEditor.save()
547
- expect(Mercury.changes).toEqual(false)
548
542
 
549
- describe "on failed ajax request", ->
543
+ describe "#save", ->
550
544
 
545
+ describe "POST", ->
551
546
  beforeEach ->
552
- @ajaxSpy.andCallFake((url, options) => options.error() )
547
+ Mercury.PageEditor.prototype.initializeInterface = ->
548
+ @pageEditor = new Mercury.PageEditor('', {appendTo: $('#test'), saveDataType: 'text'})
549
+ @iframeSrcSpy = spyOn(Mercury.PageEditor.prototype, 'iframeSrc').andCallFake(=> '/foo/baz')
550
+ @ajaxSpy = spyOn($, 'ajax')
551
+
552
+ it "doesn't set the _method in the request data", ->
553
+ @ajaxSpy.andCallFake(=>)
554
+ spyOn(Mercury.PageEditor.prototype, 'serialize').andCallFake(=> {region1: 'region1'})
555
+ @pageEditor.save()
556
+ expect(@ajaxSpy.argsForCall[0][1]['data']['_method']).toEqual(undefined)
553
557
 
554
- it "alerts with the url", ->
555
- spy = spyOn(window, 'alert').andCallFake(=>)
558
+ it "makes an ajax request", ->
559
+ @ajaxSpy.andCallFake(=>)
560
+ @pageEditor.save()
561
+ expect(@ajaxSpy.callCount).toEqual(1)
562
+
563
+ it "uses the save url passed in via options, the configured save url, or the iframe src", ->
564
+ @ajaxSpy.andCallFake(=>)
556
565
  @pageEditor.saveUrl = '/foo/bar'
557
566
  @pageEditor.save()
558
- expect(spy.callCount).toEqual(1)
559
- expect(spy.argsForCall[0]).toEqual(['Mercury was unable to save to the url: /foo/bar'])
567
+ expect(@ajaxSpy.argsForCall[0][0]).toEqual('/foo/bar')
568
+
569
+ @pageEditor.saveUrl = null
570
+ Mercury.saveURL = '/foo/bit'
571
+ @pageEditor.save()
572
+ expect(@ajaxSpy.argsForCall[1][0]).toEqual('/foo/bit')
573
+
574
+ @pageEditor.saveUrl = null
575
+ Mercury.saveURL = null
576
+ @pageEditor.save()
577
+ expect(@ajaxSpy.argsForCall[2][0]).toEqual('/foo/baz')
578
+
579
+ it "serializes the data in json", ->
580
+ @ajaxSpy.andCallFake(=>)
581
+ Mercury.config.saveStyle = 'json'
582
+ spyOn(Mercury.PageEditor.prototype, 'serialize').andCallFake(=> {region1: 'region1'})
583
+ @pageEditor.save()
584
+ expect(@ajaxSpy.argsForCall[0][1]['data']).toEqual({content: '{"region1":"region1"}' })
585
+
586
+ it "can serialize as form values", ->
587
+ @ajaxSpy.andCallFake(=>)
588
+ @pageEditor.options.saveStyle = 'form'
589
+ spyOn(Mercury.PageEditor.prototype, 'serialize').andCallFake(=> {region1: 'region1'})
590
+ @pageEditor.save()
591
+ expect(@ajaxSpy.argsForCall[0][1]['data']).toEqual({content: {region1: 'region1'}})
592
+
593
+ it "sets headers by calling #saveHeaders", ->
594
+ @ajaxSpy.andCallFake(=>)
595
+ spyOn(Mercury.PageEditor.prototype, 'serialize').andCallFake(=> {region1: 'region1'})
596
+ spy = spyOn(Mercury.PageEditor.prototype, 'saveHeaders').andCallFake(=> {'X-CSRFToken': 'f00'})
597
+ @pageEditor.save()
598
+ expect(@ajaxSpy.argsForCall[0][1]['headers']).toEqual({'X-CSRFToken': 'f00'})
599
+
600
+ it "sets the data type from options", ->
601
+ @ajaxSpy.andCallFake(=>)
602
+ spyOn(Mercury.PageEditor.prototype, 'serialize').andCallFake(=> {region1: 'region1'})
603
+ @pageEditor.save()
604
+ expect(@ajaxSpy.argsForCall[0][1]['dataType']).toEqual('text')
605
+
606
+ describe "on successful ajax request", ->
607
+
608
+ beforeEach ->
609
+ @ajaxSpy.andCallFake((url, options) => options.success('data') )
610
+
611
+ it "sets changes back to false", ->
612
+ Mercury.changes = true
613
+ @pageEditor.save()
614
+ expect(Mercury.changes).toEqual(false)
615
+
616
+ describe "on failed ajax request", ->
617
+
618
+ beforeEach ->
619
+ @ajaxSpy.andCallFake((url, options) => options.error() )
620
+
621
+ it "alerts with the url", ->
622
+ spy = spyOn(window, 'alert').andCallFake(=>)
623
+ @pageEditor.saveUrl = '/foo/bar'
624
+ @pageEditor.save()
625
+ expect(spy.callCount).toEqual(1)
626
+ expect(spy.argsForCall[0]).toEqual(['Mercury was unable to save to the url: /foo/bar'])
627
+
628
+ describe "PUT", ->
629
+
630
+ beforeEach ->
631
+ Mercury.PageEditor.prototype.initializeInterface = ->
632
+ @pageEditor = new Mercury.PageEditor('', {appendTo: $('#test'), saveMethod: 'PUT'})
633
+ @iframeSrcSpy = spyOn(Mercury.PageEditor.prototype, 'iframeSrc').andCallFake(=> '/foo/baz')
634
+ @ajaxSpy = spyOn($, 'ajax')
635
+
636
+ it "sets the _method in the request", ->
637
+ @ajaxSpy.andCallFake(=>)
638
+ spyOn(Mercury.PageEditor.prototype, 'serialize').andCallFake(=> {region1: 'region1'})
639
+ @pageEditor.save()
640
+ expect(@ajaxSpy.argsForCall[0][1]['data']['_method']).toEqual('PUT')
560
641
 
561
642
 
562
643
  describe "#serialize", ->
@@ -11,8 +11,8 @@ describe "Mercury.Panel", ->
11
11
  afterEach ->
12
12
  @panel = null
13
13
  delete(@panel)
14
- $(document).unbind('mercury:resize')
15
- $(document).unbind('mercury:hide:panels')
14
+ $(window).unbind('mercury:resize')
15
+ $(window).unbind('mercury:hide:panels')
16
16
 
17
17
  describe "#build", ->
18
18
 
@@ -4,12 +4,15 @@ describe "Mercury.Region", ->
4
4
 
5
5
  template 'mercury/region.html'
6
6
 
7
+ beforeEach ->
8
+ Mercury.config.regionClass = 'custom-region-class'
9
+
7
10
  afterEach ->
8
11
  @region = null
9
12
  delete(@region)
10
- $(document).unbind('mercury:mode')
11
- $(document).unbind('mercury:focus:frame')
12
- $(document).unbind('mercury:action')
13
+ $(window).unbind('mercury:mode')
14
+ $(window).unbind('mercury:focus:frame')
15
+ $(window).unbind('mercury:action')
13
16
 
14
17
  describe "constructor", ->
15
18
 
@@ -185,8 +188,8 @@ describe "Mercury.Region", ->
185
188
  expect(@region.previewing).toEqual(true)
186
189
 
187
190
  it "swaps classes on the element", ->
188
- expect(@region.element.hasClass('mercury-region')).toEqual(false)
189
- expect(@region.element.hasClass('mercury-region-preview')).toEqual(true)
191
+ expect(@region.element.hasClass('custom-region-class')).toEqual(false)
192
+ expect(@region.element.hasClass('custom-region-class-preview')).toEqual(true)
190
193
 
191
194
  it "triggers a blur event", ->
192
195
  expect(@triggerSpy.callCount).toEqual(1)
@@ -202,8 +205,8 @@ describe "Mercury.Region", ->
202
205
  expect(@region.previewing).toEqual(false)
203
206
 
204
207
  it "swaps classes on the element", ->
205
- expect(@region.element.hasClass('mercury-region-preview')).toEqual(false)
206
- expect(@region.element.hasClass('mercury-region')).toEqual(true)
208
+ expect(@region.element.hasClass('custom-region-class-preview')).toEqual(false)
209
+ expect(@region.element.hasClass('custom-region-class')).toEqual(true)
207
210
 
208
211
  it "calls focus if it's the active region", ->
209
212
  expect(@focusSpy.callCount).toEqual(1)
@@ -326,26 +326,6 @@ describe "Mercury.Regions.Editable", ->
326
326
 
327
327
  describe "#handlePaste", ->
328
328
 
329
- it "removes any regions that might have been pasted", ->
330
-
331
- describe "when it looks like MS word content", ->
332
-
333
- it "calls the native undo to remove the pasted content", ->
334
-
335
- it "inserts the cleaned content (which is the text version of what was pasted)", ->
336
-
337
- describe "when undo throws an exception", ->
338
-
339
- it "sets the content to what it was before the paste", ->
340
-
341
- it "opens a modal (featuring clippy)", ->
342
-
343
- describe "when it's configured to strip styles", ->
344
-
345
- it "calls the native undo to remove the pasted content", ->
346
-
347
- it "strips style attributes from the pasted content and inserts the cleaned html", ->
348
-
349
329
 
350
330
 
351
331
  describe "Mercury.Regions.Editable.actions", ->
@@ -10,8 +10,8 @@ describe "Mercury.SnippetToolbar", ->
10
10
  afterEach ->
11
11
  @snippetToolbar = null
12
12
  delete(@snippetToolbar)
13
- $(document).unbind('mercury:hide:toolbar')
14
- $(document).unbind('mercury:show:toolbar')
13
+ $(window).unbind('mercury:hide:toolbar')
14
+ $(window).unbind('mercury:show:toolbar')
15
15
 
16
16
  describe "constructor", ->
17
17
 
@@ -14,7 +14,7 @@ describe "Mercury.Toolbar.ButtonGroup", ->
14
14
  afterEach ->
15
15
  @buttonGroup = null
16
16
  delete(@buttonGroup)
17
- $(document).unbind('mercury:region:update')
17
+ $(window).unbind('mercury:region:update')
18
18
 
19
19
  describe "constructor", ->
20
20