mercury-rails 0.2.0 → 0.2.3

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 (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