diff --git a/wagtail/wagtailcore/blocks/field_block.py b/wagtail/wagtailcore/blocks/field_block.py
index ddc740a21..4e953702b 100644
--- a/wagtail/wagtailcore/blocks/field_block.py
+++ b/wagtail/wagtailcore/blocks/field_block.py
@@ -261,8 +261,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 str(value)
+
+ def value_for_form(self, value):
+ # need to explicitly mark as unsafe, or it'll output unescaped HTML in the textarea
+ return str(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 a4d38ce2e..7f4524d95 100644
--- a/wagtail/wagtailcore/tests/test_blocks.py
+++ b/wagtail/wagtailcore/tests/test_blocks.py
@@ -4,6 +4,7 @@ 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, SafeText
from wagtail.wagtailcore import blocks
from wagtail.wagtailcore.models import Page
@@ -267,6 +268,77 @@ 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.assertTrue(isinstance(default_value, SafeText))
+
+ def test_get_default_with_none(self):
+ default_value = blocks.RawHTMLBlock(default=None).get_default()
+ self.assertEqual(default_value, '')
+ self.assertTrue(isinstance(default_value, SafeText))
+
+ def test_get_default_with_empty_string(self):
+ default_value = blocks.RawHTMLBlock(default='').get_default()
+ self.assertEqual(default_value, '')
+ self.assertTrue(isinstance(default_value, SafeText))
+
+ def test_get_default_with_nonempty_string(self):
+ default_value = blocks.RawHTMLBlock(default='').get_default()
+ self.assertEqual(default_value, '')
+ self.assertTrue(isinstance(default_value, SafeText))
+
+ def test_serialize(self):
+ block = blocks.RawHTMLBlock()
+ result = block.get_prep_value(mark_safe(''))
+ self.assertEqual(result, '')
+
+ def test_deserialize(self):
+ block = blocks.RawHTMLBlock()
+ result = block.to_python('')
+ self.assertEqual(result, '')
+ self.assertTrue(isinstance(result, SafeText))
+
+ def test_render(self):
+ block = blocks.RawHTMLBlock()
+ result = block.render(mark_safe(''))
+ self.assertEqual(result, '')
+ self.assertTrue(isinstance(result, SafeText))
+
+ def test_render_form(self):
+ block = blocks.RawHTMLBlock()
+ result = block.render_form(mark_safe(''), prefix='rawhtml')
+ self.assertIn('