forked from cybrespace/mastodon
Fix blurhash and autoplay not working on public pages (#11585)
This commit is contained in:
parent
70da6d6630
commit
e5cee8062f
|
@ -3,7 +3,6 @@
|
||||||
class HomeController < ApplicationController
|
class HomeController < ApplicationController
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
before_action :set_referrer_policy_header
|
before_action :set_referrer_policy_header
|
||||||
before_action :set_initial_state_json
|
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@body_classes = 'app-body'
|
@body_classes = 'app-body'
|
||||||
|
@ -39,21 +38,6 @@ class HomeController < ApplicationController
|
||||||
redirect_to(matches ? tag_path(CGI.unescape(matches[:tag])) : default_redirect_path)
|
redirect_to(matches ? tag_path(CGI.unescape(matches[:tag])) : default_redirect_path)
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_initial_state_json
|
|
||||||
serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer)
|
|
||||||
@initial_state_json = serializable_resource.to_json
|
|
||||||
end
|
|
||||||
|
|
||||||
def initial_state_params
|
|
||||||
{
|
|
||||||
settings: Web::Setting.find_by(user: current_user)&.data || {},
|
|
||||||
push_subscription: current_account.user.web_push_subscription(current_session),
|
|
||||||
current_account: current_account,
|
|
||||||
token: current_session.token,
|
|
||||||
admin: Account.find_local(Setting.site_contact_username.strip.gsub(/\A@/, '')),
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def default_redirect_path
|
def default_redirect_path
|
||||||
if request.path.start_with?('/web') || whitelist_mode?
|
if request.path.start_with?('/web') || whitelist_mode?
|
||||||
new_user_session_path
|
new_user_session_path
|
||||||
|
|
|
@ -8,12 +8,7 @@ class PublicTimelinesController < ApplicationController
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
before_action :set_instance_presenter
|
before_action :set_instance_presenter
|
||||||
|
|
||||||
def show
|
def show; end
|
||||||
@initial_state_json = ActiveModelSerializers::SerializableResource.new(
|
|
||||||
InitialStatePresenter.new(settings: { known_fediverse: Setting.show_known_fediverse_at_about_page }, token: current_session&.token),
|
|
||||||
serializer: InitialStateSerializer
|
|
||||||
).to_json
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
|
|
@ -6,26 +6,10 @@ class SharesController < ApplicationController
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
|
|
||||||
def show
|
def show; end
|
||||||
serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer)
|
|
||||||
@initial_state_json = serializable_resource.to_json
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def initial_state_params
|
|
||||||
text = [params[:title], params[:text], params[:url]].compact.join(' ')
|
|
||||||
|
|
||||||
{
|
|
||||||
settings: Web::Setting.find_by(user: current_user)&.data || {},
|
|
||||||
push_subscription: current_account.user.web_push_subscription(current_session),
|
|
||||||
current_account: current_account,
|
|
||||||
token: current_session.token,
|
|
||||||
admin: Account.find_local(Setting.site_contact_username.strip.gsub(/\A@/, '')),
|
|
||||||
text: text,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_body_classes
|
def set_body_classes
|
||||||
@body_classes = 'modal-layout compose-standalone'
|
@body_classes = 'modal-layout compose-standalone'
|
||||||
end
|
end
|
||||||
|
|
|
@ -17,11 +17,6 @@ class TagsController < ApplicationController
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html do
|
format.html do
|
||||||
expires_in 0, public: true
|
expires_in 0, public: true
|
||||||
|
|
||||||
@initial_state_json = ActiveModelSerializers::SerializableResource.new(
|
|
||||||
InitialStatePresenter.new(settings: {}, token: current_session&.token),
|
|
||||||
serializer: InitialStateSerializer
|
|
||||||
).to_json
|
|
||||||
end
|
end
|
||||||
|
|
||||||
format.rss do
|
format.rss do
|
||||||
|
|
|
@ -122,4 +122,25 @@ module ApplicationHelper
|
||||||
text = word_wrap(text, line_width: line_width - 2, break_sequence: break_sequence)
|
text = word_wrap(text, line_width: line_width - 2, break_sequence: break_sequence)
|
||||||
text.split("\n").map { |line| '> ' + line }.join("\n")
|
text.split("\n").map { |line| '> ' + line }.join("\n")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def render_initial_state
|
||||||
|
state_params = {
|
||||||
|
settings: {
|
||||||
|
known_fediverse: Setting.show_known_fediverse_at_about_page,
|
||||||
|
},
|
||||||
|
|
||||||
|
text: [params[:title], params[:text], params[:url]].compact.join(' '),
|
||||||
|
}
|
||||||
|
|
||||||
|
if user_signed_in?
|
||||||
|
state_params[:settings] = state_params[:settings].merge(Web::Setting.find_by(user: current_user)&.data || {})
|
||||||
|
state_params[:push_subscription] = current_account.user.web_push_subscription(current_session)
|
||||||
|
state_params[:current_account] = current_account
|
||||||
|
state_params[:token] = current_session.token
|
||||||
|
state_params[:admin] = Account.find_local(Setting.site_contact_username.strip.gsub(/\A@/, ''))
|
||||||
|
end
|
||||||
|
|
||||||
|
json = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(state_params), serializer: InitialStateSerializer).to_json
|
||||||
|
content_tag(:script, json_escape(json).html_safe, id: 'initial-state', type: 'application/json')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -38,6 +38,11 @@ class InitialStateSerializer < ActiveModel::Serializer
|
||||||
store[:use_pending_items] = object.current_account.user.setting_use_pending_items
|
store[:use_pending_items] = object.current_account.user.setting_use_pending_items
|
||||||
store[:is_staff] = object.current_account.user.staff?
|
store[:is_staff] = object.current_account.user.staff?
|
||||||
store[:trends] = Setting.trends && object.current_account.user.setting_trends
|
store[:trends] = Setting.trends && object.current_account.user.setting_trends
|
||||||
|
else
|
||||||
|
store[:auto_play_gif] = Setting.auto_play_gif
|
||||||
|
store[:display_media] = Setting.display_media
|
||||||
|
store[:reduce_motion] = Setting.reduce_motion
|
||||||
|
store[:use_blurhash] = Setting.use_blurhash
|
||||||
end
|
end
|
||||||
|
|
||||||
store
|
store
|
||||||
|
|
|
@ -5,8 +5,7 @@
|
||||||
= preload_link_tag asset_pack_path('features/notifications.js'), crossorigin: 'anonymous'
|
= preload_link_tag asset_pack_path('features/notifications.js'), crossorigin: 'anonymous'
|
||||||
|
|
||||||
%meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key}
|
%meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key}
|
||||||
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json)
|
= render_initial_state
|
||||||
|
|
||||||
= javascript_pack_tag 'application', integrity: true, crossorigin: 'anonymous'
|
= javascript_pack_tag 'application', integrity: true, crossorigin: 'anonymous'
|
||||||
|
|
||||||
.app-holder#mastodon{ data: { props: Oj.dump(default_props) } }
|
.app-holder#mastodon{ data: { props: Oj.dump(default_props) } }
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
- content_for :header_tags do
|
- content_for :header_tags do
|
||||||
|
= render_initial_state
|
||||||
= javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous'
|
= javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous'
|
||||||
|
|
||||||
- content_for :content do
|
- content_for :content do
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
- content_for :header_tags do
|
- content_for :header_tags do
|
||||||
%meta{ name: 'robots', content: 'noindex' }/
|
%meta{ name: 'robots', content: 'noindex' }/
|
||||||
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json)
|
|
||||||
= javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous'
|
= javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous'
|
||||||
|
|
||||||
.page-header
|
.page-header
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- content_for :header_tags do
|
- content_for :header_tags do
|
||||||
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json)
|
= render_initial_state
|
||||||
= javascript_pack_tag 'share', integrity: true, crossorigin: 'anonymous'
|
= javascript_pack_tag 'share', integrity: true, crossorigin: 'anonymous'
|
||||||
|
|
||||||
#mastodon-compose{ data: { props: Oj.dump(default_props) } }
|
#mastodon-compose{ data: { props: Oj.dump(default_props) } }
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
%meta{ name: 'robots', content: 'noindex' }/
|
%meta{ name: 'robots', content: 'noindex' }/
|
||||||
%link{ rel: 'alternate', type: 'application/rss+xml', href: tag_url(@tag, format: 'rss') }/
|
%link{ rel: 'alternate', type: 'application/rss+xml', href: tag_url(@tag, format: 'rss') }/
|
||||||
|
|
||||||
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json)
|
|
||||||
= javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous'
|
= javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous'
|
||||||
= render 'og'
|
= render 'og'
|
||||||
|
|
||||||
|
|
|
@ -27,16 +27,6 @@ RSpec.describe HomeController, type: :controller do
|
||||||
subject
|
subject
|
||||||
expect(assigns(:body_classes)).to eq 'app-body'
|
expect(assigns(:body_classes)).to eq 'app-body'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'assigns @initial_state_json' do
|
|
||||||
subject
|
|
||||||
initial_state_json = json_str_to_hash(assigns(:initial_state_json))
|
|
||||||
expect(initial_state_json[:meta]).to_not be_nil
|
|
||||||
expect(initial_state_json[:compose]).to_not be_nil
|
|
||||||
expect(initial_state_json[:accounts]).to_not be_nil
|
|
||||||
expect(initial_state_json[:settings]).to_not be_nil
|
|
||||||
expect(initial_state_json[:media_attachments]).to_not be_nil
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,15 +7,12 @@ describe SharesController do
|
||||||
before { sign_in user }
|
before { sign_in user }
|
||||||
|
|
||||||
describe 'GTE #show' do
|
describe 'GTE #show' do
|
||||||
subject(:initial_state_json) { JSON.parse(assigns(:initial_state_json), symbolize_names: true) }
|
|
||||||
subject(:body_classes) { assigns(:body_classes) }
|
subject(:body_classes) { assigns(:body_classes) }
|
||||||
|
|
||||||
before { get :show, params: { title: 'test title', text: 'test text', url: 'url1 url2' } }
|
before { get :show, params: { title: 'test title', text: 'test text', url: 'url1 url2' } }
|
||||||
|
|
||||||
it 'assigns json' do
|
it 'returns http success' do
|
||||||
expect(response).to have_http_status :ok
|
expect(response).to have_http_status :ok
|
||||||
expect(initial_state_json[:compose][:text]).to eq 'test title test text url1 url2'
|
|
||||||
expect(initial_state_json[:meta][:me]).to eq user.account.id.to_s
|
|
||||||
expect(body_classes).to eq 'modal-layout compose-standalone'
|
expect(body_classes).to eq 'modal-layout compose-standalone'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue