JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
fix loading css for editable content
[peach-html5-editor.git] / editor.coffee
index 66d1dfe..a5cd8d6 100644 (file)
@@ -24,6 +24,19 @@ next_frame = (cb) ->
        else
                timeout 16, cb
 
+this_url_sans_path = ->
+       ret = "#{window.location.href}"
+       clip = ret.lastIndexOf '#'
+       if clip > -1
+               ret = ret.substr 0, clip
+       clip = ret.lastIndexOf '?'
+       if clip > -1
+               ret = ret.substr 0, clip
+       clip = ret.lastIndexOf '/'
+       if clip > -1
+               ret = ret.substr 0, clip + 1
+       return ret
+
 # xml 1.0 spec, chromium and firefox accept these, plus lots of unicode chars
 valid_attr_regex = new RegExp '^[a-zA-Z_:][-a-zA-Z0-9_:.]*$'
 # html5 spec is much more lax, but chromium won't let me make at attribute with the name "4"
@@ -587,6 +600,7 @@ tree_dedup_space = (tree) ->
 class PeachHTML5Editor
        # Options: (all optional)
        #   editor_id: "id" attribute for outer-most element created by/for editor
+       #   css_file: filename of a css file to style editable content
        #   on_init: callback for when the editable content is in place
        constructor: (in_el, options) ->
                @options = options ? {}
@@ -619,7 +633,7 @@ class PeachHTML5Editor
                                domify @outer_idoc, text: css
                        ]
                        @outer_idoc.head.appendChild icss
-                       @iframe = domify @outer_idoc, iframe: {}
+                       @iframe = domify @outer_idoc, iframe: sandbox: 'allow-same-origin allow-scripts'
                        @iframe.onload = =>
                                @init()
                        setTimeout (=> @init() unless @inited), 200 # firefox never fires this onload
@@ -661,9 +675,12 @@ class PeachHTML5Editor
                @outer_idoc.body.onkeypress = (e) =>
                        @have_focus()
                        return event_return e, @onkeypress e
-               if @options.stylesheet
+               # chromium doesn't resolve relative urls as though they were at the same domain
+               # so add a <base> tag
+               @idoc.head.appendChild domify @idoc, base: href: this_url_sans_path()
+               if @options.css_file
                        # TODO test this
-                       @idoc.head.appendChild domify @idoc, style: src: @options.stylesheet
+                       @idoc.head.appendChild domify @idoc, link: rel: 'stylesheet', type: 'text/css', href: @options.css_file
                @load_html @in_el.value
                @inited = true
                if @options.on_init?