Change public statuses pages to mount the web UI (#19301)

This commit is contained in:
Eugen Rochko 2022-10-06 02:26:34 +02:00 committed by GitHub
parent 58d5b28cb0
commit 62782babd0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 42 additions and 89 deletions

View file

@ -0,0 +1,18 @@
# frozen_string_literal: true
module WebAppControllerConcern
extend ActiveSupport::Concern
included do
before_action :set_body_classes
before_action :set_referrer_policy_header
end
def set_body_classes
@body_classes = 'app-body'
end
def set_referrer_policy_header
response.headers['Referrer-Policy'] = 'origin'
end
end

View file

@ -1,13 +1,12 @@
# frozen_string_literal: true # frozen_string_literal: true
class HomeController < ApplicationController class HomeController < ApplicationController
include WebAppControllerConcern
before_action :redirect_unauthenticated_to_permalinks! before_action :redirect_unauthenticated_to_permalinks!
before_action :set_referrer_policy_header
before_action :set_instance_presenter before_action :set_instance_presenter
def index def index; end
@body_classes = 'app-body'
end
private private
@ -19,10 +18,6 @@ class HomeController < ApplicationController
redirect_to(redirect_path) if redirect_path.present? redirect_to(redirect_path) if redirect_path.present?
end end
def set_referrer_policy_header
response.headers['Referrer-Policy'] = 'origin'
end
def set_instance_presenter def set_instance_presenter
@instance_presenter = InstancePresenter.new @instance_presenter = InstancePresenter.new
end end

View file

@ -5,17 +5,15 @@ class StatusesController < ApplicationController
include SignatureAuthentication include SignatureAuthentication
include Authorization include Authorization
include AccountOwnedConcern include AccountOwnedConcern
include WebAppControllerConcern
layout 'public'
before_action :require_account_signature!, only: [:show, :activity], if: -> { request.format == :json && authorized_fetch_mode? } before_action :require_account_signature!, only: [:show, :activity], if: -> { request.format == :json && authorized_fetch_mode? }
before_action :set_status before_action :set_status
before_action :set_instance_presenter before_action :set_instance_presenter
before_action :set_link_headers before_action :set_link_headers
before_action :redirect_to_original, only: :show before_action :redirect_to_original, only: :show
before_action :set_referrer_policy_header, only: :show
before_action :set_cache_headers before_action :set_cache_headers
before_action :set_body_classes before_action :set_body_classes, only: :embed
skip_around_action :set_locale, if: -> { request.format == :json } skip_around_action :set_locale, if: -> { request.format == :json }
skip_before_action :require_functional!, only: [:show, :embed], unless: :whitelist_mode? skip_before_action :require_functional!, only: [:show, :embed], unless: :whitelist_mode?
@ -28,8 +26,6 @@ class StatusesController < ApplicationController
respond_to do |format| respond_to do |format|
format.html do format.html do
expires_in 10.seconds, public: true if current_account.nil? expires_in 10.seconds, public: true if current_account.nil?
set_ancestors
set_descendants
end end
format.json do format.json do
@ -77,8 +73,4 @@ class StatusesController < ApplicationController
def redirect_to_original def redirect_to_original
redirect_to ActivityPub::TagManager.instance.url_for(@status.reblog) if @status.reblog? redirect_to ActivityPub::TagManager.instance.url_for(@status.reblog) if @status.reblog?
end end
def set_referrer_policy_header
response.headers['Referrer-Policy'] = 'origin' unless @status.distributable?
end
end end

View file

@ -1,20 +1,4 @@
- content_for :header_tags do - content_for :header_tags do
- if user_signed_in?
= preload_pack_asset 'features/getting_started.js', crossorigin: 'anonymous'
= preload_pack_asset 'features/compose.js', crossorigin: 'anonymous'
= preload_pack_asset 'features/home_timeline.js', crossorigin: 'anonymous'
= preload_pack_asset 'features/notifications.js', crossorigin: 'anonymous'
= render partial: 'shared/og' = render partial: 'shared/og'
%meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key} = render 'shared/web_app'
= render_initial_state
= javascript_pack_tag 'application', crossorigin: 'anonymous'
.notranslate.app-holder#mastodon{ data: { props: Oj.dump(default_props) } }
%noscript
= image_pack_tag 'logo.svg', alt: 'Mastodon'
%div
= t('errors.noscript_html', apps_path: 'https://joinmastodon.org/apps')

View file

@ -0,0 +1,17 @@
- content_for :header_tags do
- if user_signed_in?
= preload_pack_asset 'features/compose.js', crossorigin: 'anonymous'
= preload_pack_asset 'features/home_timeline.js', crossorigin: 'anonymous'
= preload_pack_asset 'features/notifications.js', crossorigin: 'anonymous'
%meta{ name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key }
= render_initial_state
= javascript_pack_tag 'application', crossorigin: 'anonymous'
.notranslate.app-holder#mastodon{ data: { props: Oj.dump(default_props) } }
%noscript
= image_pack_tag 'logo.svg', alt: 'Mastodon'
%div
= t('errors.noscript_html', apps_path: 'https://joinmastodon.org/apps')

View file

@ -17,9 +17,4 @@
= render 'og_description', activity: @status = render 'og_description', activity: @status
= render 'og_image', activity: @status, account: @account = render 'og_image', activity: @status, account: @account
.grid = render 'shared/web_app'
.column-0
.activity-stream.h-entry
= render partial: 'status', locals: { status: @status, include_threads: true }
.column-1
= render 'application/sidebar'

View file

@ -15,54 +15,6 @@ describe 'statuses/show.html.haml', without_verify_partial_doubles: true do
assign(:instance_presenter, InstancePresenter.new) assign(:instance_presenter, InstancePresenter.new)
end end
it 'has valid author h-card and basic data for a detailed_status' do
alice = Fabricate(:account, username: 'alice', display_name: 'Alice')
bob = Fabricate(:account, username: 'bob', display_name: 'Bob')
status = Fabricate(:status, account: alice, text: 'Hello World')
media = Fabricate(:media_attachment, account: alice, status: status, type: :video)
reply = Fabricate(:status, account: bob, thread: status, text: 'Hello Alice')
assign(:status, status)
assign(:account, alice)
assign(:descendant_threads, [])
render
mf2 = Microformats.parse(rendered)
expect(mf2.entry.url.to_s).not_to be_empty
expect(mf2.entry.author.name.to_s).to eq alice.display_name
expect(mf2.entry.author.url.to_s).not_to be_empty
end
it 'has valid h-cites for p-in-reply-to and p-comment' do
alice = Fabricate(:account, username: 'alice', display_name: 'Alice')
bob = Fabricate(:account, username: 'bob', display_name: 'Bob')
carl = Fabricate(:account, username: 'carl', display_name: 'Carl')
status = Fabricate(:status, account: alice, text: 'Hello World')
media = Fabricate(:media_attachment, account: alice, status: status, type: :video)
reply = Fabricate(:status, account: bob, thread: status, text: 'Hello Alice')
comment = Fabricate(:status, account: carl, thread: reply, text: 'Hello Bob')
assign(:status, reply)
assign(:account, alice)
assign(:ancestors, reply.ancestors(1, bob))
assign(:descendant_threads, [{ statuses: reply.descendants(1) }])
render
mf2 = Microformats.parse(rendered)
expect(mf2.entry.url.to_s).not_to be_empty
expect(mf2.entry.comment.url.to_s).not_to be_empty
expect(mf2.entry.comment.author.name.to_s).to eq carl.display_name
expect(mf2.entry.comment.author.url.to_s).not_to be_empty
expect(mf2.entry.in_reply_to.url.to_s).not_to be_empty
expect(mf2.entry.in_reply_to.author.name.to_s).to eq alice.display_name
expect(mf2.entry.in_reply_to.author.url.to_s).not_to be_empty
end
it 'has valid opengraph tags' do it 'has valid opengraph tags' do
alice = Fabricate(:account, username: 'alice', display_name: 'Alice') alice = Fabricate(:account, username: 'alice', display_name: 'Alice')
status = Fabricate(:status, account: alice, text: 'Hello World') status = Fabricate(:status, account: alice, text: 'Hello World')