TheDeskのTweetDeck連携が使用できなくなっていたが、それを使用可能にした。
なお、実際に利用可能になるのは次期リリース(時期未定)以降である。

TheDesk TweetDeck連携とは

TheDeskというMastodonクライアントは、TweetDeckを広めのカラムの1つとして出すことができる。

Electron製なのでiframeのようなものなのだが、中でコードを埋め込むためにwebviewというタグを使用している。
とはいえElectronのwebviewはiframeのラッパーなのでそこまで違いは無い。

Electronのwebviewタグは既に非推奨になっており、あまり使うべきものではない。また、BrowserWindowを立ち上げるときに明示的にwebPreferences.webviewTagをtrueにしなければ使えないようになっている。もちろんセキュリティリスクがあるためである。Electronはただのブラウザよりレンダラーに権限を与えているため、XSSされた場合ブラウザより総じて被害が大きい。
TheDeskはこの問題に対処するためNodeIntegrationをオフにしているが、webviewタグはこれを上書きできる可能性がある。一言で言うととても危険なのである。

ここ数年はTheDeskでXSSは発掘されていないが、昔はいくつもあったし、NodeIntegrationもオンであった。今考えると恐ろしい話である。

ある日突然使えなくなった

webviewもiframeラッパーなので、埋め込み先のX-Frame-Options(MDN)の影響を受ける。
昔は特に問題は無かったのだが、いつからか mobile.twitter.com がFrame Optionsでdenyを返すようになった。 tweetdeck.twitter.com では問題無いが、ログインするときに mobile.twitter.com (デスクトップであっても、今は全てmobile.である)にリダイレクトされるため、ログインできなくなってしまっていた。

これを関知してから、上記のセキュリティ面の不安もあって機能自体を廃止したが、それでもたまに使えないのか?という質問を受けるので相応の需要を感じていた。なお、廃止時点では特に原因を調査してなかった。

X-Frame-Optionsはwebviewタグにdisablewebsecurity属性を付与すれば回避できると思われたが、全く不可能であった。そもそも属性一つでセキュリティにボコボコ穴を開けられるのも考えものだが、とにかくWebセキュリティの問題ではないらしい。(ただ、webviewはChromiumのいろいろに追従できそうにないという理由で非推奨であり、仕様上そうであってもdisablewebsecurityでは無効化できない可能性もある)

TweetDeckであれば普通に表示できる
TweetDeckであれば普通に表示できる

次に考えられるのはログインだけ別のBrowserWindowで行うことだ。Electron内ではBrowserWindowが違っていてもセッションは共有されるためログイン情報は維持できる。
結局、webviewをdid-navigateイベントで追って、URLが mobile.twitter.com/login であれば(この時点でwebviewエリアはポリシーにより何も描画されない)メインプロセスにpreload経由でメッセージを送り、 /login をloadURLしたBrowserWindowを作成する。

このBrowserWindowでもdid-navigateイベントを使用し、 tweetdeck.twitter.com に戻った時点でこのウィンドウをクローズした。ついでにメッセージをレンダラーに送ってwebviewタグに tweetdeck.twitter.com をloadURLして一件落着かと思われたが、そこまで甘くは無かった。

loadURLやreload等をwebviewに用いるともれなくElectronがクラッシュする。GitHubのIssuesをたどっても、「Electronはブラウザじゃねぇんだからそんな使い方をするな」とかいう面白コメントしか出てこず、どうしようも無い。loadURLが以前にロードしたものだと確実にクラッシュするようで、 google.co.jp を指定するとクラッシュしないこともあった(クラッシュすることもある)

結局、BrowserWindowがTweetDeckに戻った時点でレンダラー全体を再読み込みすることでそれらしく解決させておいたが、根本的な解決には至っていない。

独自アプリみたいに別ウィンドウで表示される
独自アプリみたいに別ウィンドウで表示される

ついでに

先述の通りwebviewタグには危険なポイントがたくさんある。なので、設定でwebviewタグの使用自体をオプトインするようにした。TweetDeck連携を使用したいのであれば、セキュリティリスクを理解した上でオンにしていただければ、再起動後からwebviewタグが使えるようになり、TweetDeckカラムも追加できる。

設定でWebviewタグの使用を許可する。デフォルトは「いいえ」
設定でWebviewタグの使用を許可する。デフォルトは「いいえ」

途中でオフに戻した場合、既に追加されているカラムは何も描画されないただの空き地になる。また、新たに追加することはできなくなる(カラム追加にTweetDeckが表示されなくなる)。