Rails/LinkToBlank Copの改善を試みた
Rails/LinkToBlank
RailsのViewではlink_toというメソッドを呼び出すことができ、これはHTMLにおけるa要素に相当する文字列を出力します。このとき、引数が target: '_blank'
のように指定されていると、target="_blank"
のようにa要素に属性が付与されます。
さて、この手の target="_blank"
が付けられたa要素から遷移した先のページでは、遷移元のページを制御することができ、ともすればセキュリティリスクになり得ます(アダルト系の広告等でこの手の技が利用されることが多いですね)。そこで、rel="noopener"
という属性を同時に付けておくことで、遷移先のページから制御されることを防げます。link_toメソッドにおいては、rel: 'noopener'
というように引数を付けることで対応できます。
link_toメソッドに target: '_blank'
が指定されているとき、同時に rel: 'noopener'
が指定されているかどうかを検査するために、RuboCopにRails/LinkToBlankというCopがあります。
https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Rails/LinkToBlank
targetがSymbolだとauto-correct結果がおかしい
RuboCop v0.65.0からv0.66.0にアップデートしたことにより、これまで検知できていなかったRails/LinkToBlankへの違反がより正確に検知できるようになりました。そして手元のプロジェクトでRails/LinkToBlankへの違反が見つかったため、RuboCop v0.66.0でauto-correctを利用して修正を試みたところ、構文エラーが発生するコードが出力されてしまいました。
どうやら target: :_blank
のようにtarget属性がSymbolリテラルで指定されているときにauto-correctに失敗してしまうようです。
Symbolでの指定自体がRuboCop的にサポートしていない状況だったらどうしようかと思いましたが、targetがSymbolでも違反を正しく検知できるというテストケースが書かれているのを発見したので、多分サポート範囲内だろうということでauto-correctの修正を試みました。
https://github.com/rubocop-hq/rubocop/pull/6868
relがSymbolだと誤検知される
前述のPull Requestがmergeされると、target: :_blank
が指定されているときはauto-correctによって rel: :noopener
が指定されるようになるのですが、検査時にはrelは文字列リテラルであることしか想定されていないようで、自動修正後のコードから違反が誤検出されるようになってしまいました。そこで、relにSymbolリテラルも許可するように修正を試みました。