CSPを導入しようとして、まず様子見でcontent_security_policy_report_only = true
としていろいろ試していたらテストが落ちるようになった。content_security_policy_report_only = true
だとjsやcssは普通に適用されるはずなのにおかしい。
落ちているテストをよく見ると、flashメッセージを表示する箇所がほとんどだった。サーバのログを見るとなぜか同じページに2回アクセスしている。
いろいろ追いかけた結果、次の行が原因なのを突き止めた。
javascript_pack_tag 'application', 'data-turbolinks-track': 'reload', defer: true, nonce: true
CSP用にnonce: true
を追加した。これにより、毎回scriptタグのnonce属性が変更される。turbolinksで'data-turbolinks-track': 'reload'
としていると、リソースのURLが変更されたときにページがフルにリロードされる仕様。なのだけど、これがURLだけではなくてどの属性が変更されてもフルでリロードされるようになっていた。
turbolinks/snapshot_renderer.ts at master · turbolinks/turbolinks
'data-turbolinks-track': 'reload'
を削除したら落ちたテストが通るようになった。でもこれがよい解決策かというと微妙な気がする…
追記
テストは通るようになり、ページが毎回フルでリロードされることはなくなったけど、nonceが変更されたことでturbolinksが「新しいscriptタグが挿入された」と解釈するのかページアクセスのたびにjsが実行されてしまう><
更に追記
とりあえずIssueを立てておきました。