diff --git a/wagtail/wagtailcore/blocks/field_block.py b/wagtail/wagtailcore/blocks/field_block.py
index d01141d46..4b65f770e 100644
--- a/wagtail/wagtailcore/blocks/field_block.py
+++ b/wagtail/wagtailcore/blocks/field_block.py
@@ -1,6 +1,7 @@
from __future__ import absolute_import, unicode_literals
import datetime
+import six
from django import forms
from django.db.models.fields import BLANK_CHOICE_DASH
@@ -282,8 +283,23 @@ class RawHTMLBlock(FieldBlock):
widget=forms.Textarea)
super(RawHTMLBlock, self).__init__(**kwargs)
- def render_basic(self, value):
- return mark_safe(value) # if it isn't safe, that's the site admin's problem for allowing raw HTML blocks in the first place...
+ def get_default(self):
+ return mark_safe(self.meta.default or '')
+
+ def to_python(self, value):
+ return mark_safe(value)
+
+ def get_prep_value(self, value):
+ # explicitly convert to a plain string, just in case we're using some serialisation method
+ # that doesn't cope with SafeText values correctly
+ return six.text_type(value)
+
+ def value_for_form(self, value):
+ # need to explicitly mark as unsafe, or it'll output unescaped HTML in the textarea
+ return six.text_type(value)
+
+ def value_from_form(self, value):
+ return mark_safe(value)
class Meta:
icon = 'code'
diff --git a/wagtail/wagtailcore/tests/test_blocks.py b/wagtail/wagtailcore/tests/test_blocks.py
index e51d5b8ec..b47f279d2 100644
--- a/wagtail/wagtailcore/tests/test_blocks.py
+++ b/wagtail/wagtailcore/tests/test_blocks.py
@@ -1,9 +1,13 @@
+# -*- coding: utf-8 -*
+from __future__ import unicode_literals
+
import unittest
from django import forms
from django.forms.utils import ErrorList
from django.core.exceptions import ValidationError
from django.test import TestCase
+from django.utils.safestring import mark_safe, SafeData
from wagtail.wagtailcore import blocks
from wagtail.wagtailcore.rich_text import RichText
@@ -308,6 +312,78 @@ class TestChoiceBlock(unittest.TestCase):
)
+class TestRawHTMLBlock(unittest.TestCase):
+ def test_get_default_with_fallback_value(self):
+ default_value = blocks.RawHTMLBlock().get_default()
+ self.assertEqual(default_value, '')
+ self.assertIsInstance(default_value, SafeData)
+
+ def test_get_default_with_none(self):
+ default_value = blocks.RawHTMLBlock(default=None).get_default()
+ self.assertEqual(default_value, '')
+ self.assertIsInstance(default_value, SafeData)
+
+ def test_get_default_with_empty_string(self):
+ default_value = blocks.RawHTMLBlock(default='').get_default()
+ self.assertEqual(default_value, '')
+ self.assertIsInstance(default_value, SafeData)
+
+ def test_get_default_with_nonempty_string(self):
+ default_value = blocks.RawHTMLBlock(default='').get_default()
+ self.assertEqual(default_value, '')
+ self.assertIsInstance(default_value, SafeData)
+
+ def test_serialize(self):
+ block = blocks.RawHTMLBlock()
+ result = block.get_prep_value(mark_safe(''))
+ self.assertEqual(result, '')
+ self.assertNotIsInstance(result, SafeData)
+
+ def test_deserialize(self):
+ block = blocks.RawHTMLBlock()
+ result = block.to_python('')
+ self.assertEqual(result, '')
+ self.assertIsInstance(result, SafeData)
+
+ def test_render(self):
+ block = blocks.RawHTMLBlock()
+ result = block.render(mark_safe(''))
+ self.assertEqual(result, '')
+ self.assertIsInstance(result, SafeData)
+
+ def test_render_form(self):
+ block = blocks.RawHTMLBlock()
+ result = block.render_form(mark_safe(''), prefix='rawhtml')
+ self.assertIn('