Tampermonkeyで個人的なツールを作って使用しているのですが、
1月23日にFirefoxをアップデートしてから動作がおかしくなりました。
具体的には、
x.comでXMLHttpRequestやJSONのオーバーライドしている処理が反応しなくなりました。
但し、条件次第では期待通り動作します。(この詳細は後述)
色々試してみた結果、windowとunsafeWindowとでXMLHttpRequestやJSONが異なる時に発生している事がわかりました。
確認用UserScript
JavaScript
1// ==UserScript== 2// @name テスト 3// @version 0.1 4// @description テスト 5// @match https://x.com/* 6// @match https://www.instagram.com/* 7// @run-at document-start 8// @sandbox raw 9// @noframes 10// @grant unsafeWindow 11// ==/UserScript== 12 13(function() { 14 'use strict'; 15 console.log('✅JSON:', unsafeWindow.JSON === window.JSON); 16 console.log('✅XMLHttpRequest:', unsafeWindow.XMLHttpRequest === window.XMLHttpRequest); 17})();
// @grant unsafeWindow
は入れても入れなくても同じでした。
期待通りに動作する時はtrue、反応しない時はfalse
試したこと
XMLHttpRequest
の処理を
unsafeWindow.XMLHttpRequest
に変えるとx.com側のスクリプトがRistrictエラーになり停止してしまいます。
補足情報(FW/ツールのバージョンなど)
確認用UserScriptでtrue(問題が発生しない)となる条件は
・スーパーリロードする。※JavaScriptで location.reload(true) でもOK。
・https://x.com/i/bookmarks を新規タブで開く。
・プライベートウィンドウ(非ログイン)で開く。
上記以外はfalse(問題が発生する)となります。
例えば https://x.com/home を新規タブで開いた時は常に発生します。
Instagramも複数のタブを一気に開いた時にたまにfalseになります。
でも最近は発生してないかな。
Chrome、EdgeではMV2版、MV3版共に問題ありません。
FirefoxのTampermonkeyがMV3対応になっても変化はありませんでした。
実現したいこと
現在はスーパーリロードして使用していますが、ちょっと面倒なので
根本的な解決をしたいと思っています。
原因が分かる方はいますでしょうか?
解決方法、または解決の糸口を教えて頂ければ幸いです。
試したこと(追記)
確認用UserScriptに「console.log('✅GM_info:', GM_info);」を入れて確認した所
スーパーリロード後は
GM_info.sandboxMode === "raw"
ですが、リロード後は
GM_info.sandboxMode === "js"
となっていました。
GM_info.options.sandboxはどちらも"raw"なのに何故変わってしまうのか??
これが原因なのは間違いなさそうですが、何故そうなるのかは不明のままです。
追記
https://www.tampermonkey.net/changelog.php?locale=en&more=true&show=fcmf#v4.20.6187
には
In Firefox, if the page CSP blocks injection, userscripts are now injected into a JavaScript-mode @sandbox, which may require cloneInto and friends for unsafeWindow property modification
という記述がありました。
CSPでブロックされた場合はJavaScriptモードで実行する。という意味なのかな。
という事で、リロード時とスーパーリロード時のCSPを比べてみましたが結果はほぼ同じでした。
script-src のリストの最後の「nonce-~」がリロード時は先頭にも同じものが追加されてる(意味あるの?)。
という一点のみでした。
なのでCSPは関係ない?のかなと思います。
試したこと(2)
他のアドオンが関係しているかもしれない件を検証
Tampermonkey以外のアドオンを全て無効にしてみましたが、変化はありませんでした。
試したこと(3)
x.com、twitter.comのキャッシュを削除してみる。
x.comを開きログインしたセションではrawで実行されました。
また通常のリロードをしてもrawで実行されました。
しかし、rawで実行されるのはそのセションだけで
別のセション(別タブで新たにx.comを開く)だと、jsモードになってしまいました。
数回試してみましたが、同じ挙動となりました。
また、よくわからない挙動になってますます混乱気味です。
回答1件
あなたの回答
tips
プレビュー