mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
eliminate a class of v8 initialization bugs due to concurrency in sidekiq
This commit is contained in:
parent
a7eea65d53
commit
883db5798b
@ -77,6 +77,7 @@ module PrettyText
|
|||||||
end
|
end
|
||||||
|
|
||||||
@mutex = Mutex.new
|
@mutex = Mutex.new
|
||||||
|
@ctx_init = Mutex.new
|
||||||
|
|
||||||
def self.mention_matcher
|
def self.mention_matcher
|
||||||
Regexp.new("(\@[a-zA-Z0-9_]{#{User.username_length.begin},#{User.username_length.end}})")
|
Regexp.new("(\@[a-zA-Z0-9_]{#{User.username_length.begin},#{User.username_length.end}})")
|
||||||
@ -86,14 +87,13 @@ module PrettyText
|
|||||||
Rails.root
|
Rails.root
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.v8
|
def self.create_new_context
|
||||||
return @ctx unless @ctx.nil?
|
ctx = V8::Context.new
|
||||||
|
|
||||||
@ctx = V8::Context.new
|
ctx["helpers"] = Helpers.new
|
||||||
|
|
||||||
@ctx["helpers"] = Helpers.new
|
ctx_load(ctx,
|
||||||
|
"app/assets/javascripts/external/md5.js",
|
||||||
ctx_load( "app/assets/javascripts/external/md5.js",
|
|
||||||
"app/assets/javascripts/external/lodash.js",
|
"app/assets/javascripts/external/lodash.js",
|
||||||
"app/assets/javascripts/external/Markdown.Converter.js",
|
"app/assets/javascripts/external/Markdown.Converter.js",
|
||||||
"app/assets/javascripts/external/twitter-text-1.5.0.js",
|
"app/assets/javascripts/external/twitter-text-1.5.0.js",
|
||||||
@ -101,27 +101,40 @@ module PrettyText
|
|||||||
"app/assets/javascripts/external/rsvp.js",
|
"app/assets/javascripts/external/rsvp.js",
|
||||||
Rails.configuration.ember.handlebars_location)
|
Rails.configuration.ember.handlebars_location)
|
||||||
|
|
||||||
@ctx.eval("var Discourse = {}; Discourse.SiteSettings = #{SiteSetting.client_settings_json};")
|
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 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 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/utilities.js",
|
||||||
"app/assets/javascripts/discourse/components/markdown.js")
|
"app/assets/javascripts/discourse/components/markdown.js")
|
||||||
|
|
||||||
# Load server side javascripts
|
# Load server side javascripts
|
||||||
if DiscoursePluginRegistry.server_side_javascripts.present?
|
if DiscoursePluginRegistry.server_side_javascripts.present?
|
||||||
DiscoursePluginRegistry.server_side_javascripts.each do |ssjs|
|
DiscoursePluginRegistry.server_side_javascripts.each do |ssjs|
|
||||||
@ctx.load(ssjs)
|
ctx.load(ssjs)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ctx['quoteTemplate'] = File.open(app_root + 'app/assets/javascripts/discourse/templates/quote.js.shbrs') {|f| f.read}
|
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['quoteEmailTemplate'] = File.open(app_root + 'lib/assets/quote_email.js.shbrs') {|f| f.read}
|
||||||
@ctx.eval("HANDLEBARS_TEMPLATES = {
|
ctx.eval("HANDLEBARS_TEMPLATES = {
|
||||||
'quote': Handlebars.compile(quoteTemplate),
|
'quote': Handlebars.compile(quoteTemplate),
|
||||||
'quote_email': Handlebars.compile(quoteEmailTemplate),
|
'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
|
@ctx
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -263,9 +276,9 @@ module PrettyText
|
|||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def self.ctx_load(*files)
|
def self.ctx_load(ctx, *files)
|
||||||
files.each do |file|
|
files.each do |file|
|
||||||
@ctx.load(app_root + file)
|
ctx.load(app_root + file)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user