diff --git a/lib/pretty_text.rb b/lib/pretty_text.rb index b1329ee7f6c..4bc0f10ea62 100644 --- a/lib/pretty_text.rb +++ b/lib/pretty_text.rb @@ -77,6 +77,7 @@ module PrettyText end @mutex = Mutex.new + @ctx_init = Mutex.new def self.mention_matcher Regexp.new("(\@[a-zA-Z0-9_]{#{User.username_length.begin},#{User.username_length.end}})") @@ -86,14 +87,13 @@ module PrettyText Rails.root end - def self.v8 - return @ctx unless @ctx.nil? + def self.create_new_context + ctx = V8::Context.new - @ctx = V8::Context.new + ctx["helpers"] = Helpers.new - @ctx["helpers"] = Helpers.new - - ctx_load( "app/assets/javascripts/external/md5.js", + ctx_load(ctx, + "app/assets/javascripts/external/md5.js", "app/assets/javascripts/external/lodash.js", "app/assets/javascripts/external/Markdown.Converter.js", "app/assets/javascripts/external/twitter-text-1.5.0.js", @@ -101,27 +101,40 @@ module PrettyText "app/assets/javascripts/external/rsvp.js", Rails.configuration.ember.handlebars_location) - @ctx.eval("var Discourse = {}; Discourse.SiteSettings = #{SiteSetting.client_settings_json};") - @ctx.eval("var window = {}; window.devicePixelRatio = 2;") # hack to make code think stuff is retina - @ctx.eval("var I18n = {}; I18n.t = function(a,b){ return helpers.t(a,b); }"); + ctx.eval("var Discourse = {}; Discourse.SiteSettings = #{SiteSetting.client_settings_json};") + ctx.eval("var window = {}; window.devicePixelRatio = 2;") # hack to make code think stuff is retina + ctx.eval("var I18n = {}; I18n.t = function(a,b){ return helpers.t(a,b); }"); - ctx_load( "app/assets/javascripts/discourse/components/bbcode.js", + ctx_load(ctx, + "app/assets/javascripts/discourse/components/bbcode.js", "app/assets/javascripts/discourse/components/utilities.js", "app/assets/javascripts/discourse/components/markdown.js") # Load server side javascripts if DiscoursePluginRegistry.server_side_javascripts.present? DiscoursePluginRegistry.server_side_javascripts.each do |ssjs| - @ctx.load(ssjs) + ctx.load(ssjs) end end - @ctx['quoteTemplate'] = File.open(app_root + 'app/assets/javascripts/discourse/templates/quote.js.shbrs') {|f| f.read} - @ctx['quoteEmailTemplate'] = File.open(app_root + 'lib/assets/quote_email.js.shbrs') {|f| f.read} - @ctx.eval("HANDLEBARS_TEMPLATES = { + ctx['quoteTemplate'] = File.open(app_root + 'app/assets/javascripts/discourse/templates/quote.js.shbrs') {|f| f.read} + ctx['quoteEmailTemplate'] = File.open(app_root + 'lib/assets/quote_email.js.shbrs') {|f| f.read} + ctx.eval("HANDLEBARS_TEMPLATES = { 'quote': Handlebars.compile(quoteTemplate), 'quote_email': Handlebars.compile(quoteEmailTemplate), };") + + ctx + end + + def self.v8 + return @ctx if @ctx + + # ensure we only init one of these + @ctx_init.synchronize do + return @ctx if @ctx + @ctx = create_new_context + end @ctx end @@ -263,9 +276,9 @@ module PrettyText protected - def self.ctx_load(*files) + def self.ctx_load(ctx, *files) files.each do |file| - @ctx.load(app_root + file) + ctx.load(app_root + file) end end