質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

281閲覧

WindowsのFirefoxでTampermonkeyの動作がおかしい

CTRL-S

総合スコア182

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

1クリップ

投稿2024/11/13 15:33

編集2024/11/15 04:52

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モードになってしまいました。
数回試してみましたが、同じ挙動となりました。

また、よくわからない挙動になってますます混乱気味です。

Lhankor_Mhy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2024/11/13 16:42

WindowsのchromeやFirefoxでTampermonkeyがしばしば反応しない(リロードを繰り返すとそのうち動作する)というのは経験しています。Tampermonkeyの先頭にconsole.logを書いても出力されないので、スクリプトの問題ではないと判明しています。もし同じ状況であれば、現状では、致し方ないということかと思います。h
CTRL-S

2024/11/13 17:01

それはブラウザを立ち上げた直後の話ではないでしょうか? ブラウザを立ち上げてからTampermonkeyがロードされるまでに開いたページでは当然UserScriptは反応しません。 そういのではなく、Tampermonkeyのダッシュボードが開ける状態になってからの話になります。
otn

2024/11/13 17:36 編集

> それはブラウザを立ち上げた直後の話ではないでしょうか? > ブラウザを立ち上げてからTampermonkeyがロードされるまでに開いたページでは当然UserScriptは反応しません。 いえ。そういうケースではありません。ブラウザ起動後数時間とか、数日後にも、しばしば発生していますよ。 数回リロードすれば、そのうちに反応するので、余り深く追求はしていませんが。
CTRL-S

2024/11/13 17:49

そうですか。 私もブラウザは起動しっぱなしですが、そういう経験が無いので、otnさんの件についてはよくわからないです。 とりあえず、私の件はUserScriptが実行される、されないの話ではなく、実行はされてるが「unsafeWindow.XMLHttpRequest !== window.XMLHttpRequest」となってしまうのは何故か?という話なので別問題ですね。
Lhankor_Mhy

2024/11/14 08:49

ご提示のコードを試してみましたが、ご提示の3つのケースについていずれも、true true 'raw' でした。 Win10 Firefox 132.0.2 Tampermonkey5.3.2 です。 ご参考になれば幸いです。
CTRL-S

2024/11/14 09:20

Lhankor_Mhyさんへ 「ご提示の3つのケース」とは「確認用UserScriptでtrueとなる条件」の事ですよね。 trueとなるのは問題ないケースです。 普通に新規タブで開いた時や、通常のリロード後はfalse false jsになります。これが問題ありのケースになります。
CTRL-S

2024/11/14 09:23

念の為、補足しておくとログイン状態でテストしています。
Lhankor_Mhy

2024/11/14 09:25

あ、逆だったのですね。では、通常の読み込みでも true true 'raw' となることを申し添えておきます。
CTRL-S

2024/11/14 09:32

え!、そうなんですね。 という事は他のアドオンとかの影響なのかな。 他にfalseとなる方はいますでしょうか?
CTRL-S

2024/11/14 18:11

Lhankor_Mhyさんへ 試したこと(3)を追記したのですが、そちらで検証したのはこれに該当しませんか?
Lhankor_Mhy

2024/11/15 01:03

行き違いのないように実施したことを箇条書きします。 1. ご質問のスクリプトをコピー 2. Tampermonkey の新スクリプトを開いてペースト 3. 「console.log('✅GM_info:', GM_info);」を17行目にペーストして保存 4. ご質問のリンクから https://x.com/i/bookmarks を新規タブ(右クリック>リンクを新しいタブで開く)で開く 5. 開いたタブをアクティブにしてf12、コンソールを閲覧(なお、すでにログイン状態) 6. true true 'raw' を確認 7. f5 8. true true 'raw' を確認 9. 7~8を5回繰り返した 10. タブを複製して、5,6を実施
CTRL-S

2024/11/15 05:01

Lhankor_Mhyさんへ つまり https://x.com/i/bookmarks だけで検証していたのですね。 このページでは私も問題が発生しません。 何度もお手数をお掛けしますが、 https://x.com/home ではどうでしょうか? 補足情報が誤解を招く書き方だったので修正しました。 問題が発生しない方がレアケースなのでそちらを書いていたのですが紛らわしかったですね。
Lhankor_Mhy

2024/11/15 05:24

ああ、なるほど、であれば問題は再現しますね。把握しました。
CTRL-S

2024/11/15 05:28

何度もありがとうございます とりあえず、私の環境だけの問題でない事はわかりました。
guest

回答1

0

ベストアンサー

コンソールのエラーメッセージを見てみたところ、違いがありました。

https://x.com/home
イメージ説明

https://x.com/i/bookmarks
イメージ説明

Firefoxのバグなのかその他のブラウザのバグなのかわかりませんが、後者の方はCSPが正しく動作していないようです。
ヘッダを見ると、CTRL-Sさんがおっしゃるようにナンスが2回記述してあるほか、区切り文字であるホワイトスペースが末尾に2つあることも気になりました。CSPの仕様にまで当たっていませんが、もしかしたら文法上のエラーがあるのかもしれません。


つまりこのIssueに書かれている通り、動作しないことが正しいのだろうと思います。
Cannot inject functions into unsafeWindow on Twitter · Issue #2223 · Tampermonkey/tampermonkey

投稿2024/11/15 06:36

Lhankor_Mhy

総合スコア36898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2024/11/15 06:49

と思ったんですが、2つのページにスクリプト挿入を試してみたら、どちらも拒否されました。 CSP が関係しているのは間違いなさそうですが、Tampermonkey が Firefox のCSP処理に丸投げしているのではなくて独自実装をしているのであれば、Tampermonkey が CSP のパースに失敗しているなどしているのかもしれません。 回答のように単純な話ではないかもしれないですね。
CTRL-S

2024/11/15 10:24

回答ありがとうございます。 今時間が取れないので後でじっくり読ませてもらいます。
CTRL-S

2024/11/16 19:12

CSPが原因でしたか。 CSPエラーを完全に見落としてました。 Chromeでは10か月ほど問題無く動作しているので x.com側はブロックする意思は(現時点では)無いと思います。 となると、 ・x.comのCSPの設定に問題がありFirefoxが誤認している。 ・CSPの設定に問題は無いが、Firefoxのバグで誤認している。 のどちらかでしょうね。 どちらにしろ、UserScriptやTampermonkey側で対処できる問題では無いという事になるかな。 CSP回避は以前色々試してみたけど、ことごとく潰されていたので諦めました。 原因がはっきりしてちょっとスッキリしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問