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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Firefox WebExtensions

Firefox WebExtensionsは、Firefox向けアドオンをクロスブラウザで開発するためのAPIおよび技術。Google Chrome/Operaでサポートされているextension API との互換性を持ちます。

Firefox

Mozilla Foundationによって作られた無料、オープンソース、クロスプラットフォームなウェブブラウザ

JavaScript

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

Q&A

0回答

343閲覧

編集が完了するまでHTTPリクエストの送信をブロックしたい(Firefox WebExtensions)

biggieboo

総合スコア12

Firefox WebExtensions

Firefox WebExtensionsは、Firefox向けアドオンをクロスブラウザで開発するためのAPIおよび技術。Google Chrome/Operaでサポートされているextension API との互換性を持ちます。

Firefox

Mozilla Foundationによって作られた無料、オープンソース、クロスプラットフォームなウェブブラウザ

JavaScript

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

0グッド

0クリップ

投稿2019/09/04 06:10

編集2019/09/04 06:12

前提

諸事情でFirefoxのWebExtensionsを作成しております。
内容は、任意のURLに対するリクエストをブロックして、リクエストヘッダを改変して送信を再開するといったようなものです。イメージとしてはBurpSuiteやOwaspZAPなどのInterceptorの簡易版です。以下にソースコードを提示いたします。

該当のソースコード

manifest.json

JSON

1{ 2 "description": "test request", 3 "manifest_version": 2, 4 "name": "requests", 5 "version": "1.0", 6 "permissions": [ 7 "webRequest", 8 "webRequestBlocking", 9 "<all_urls>" 10 ], 11 "background": { 12 "scripts": ["background.js"] 13 }, 14 "content_scripts": [ 15 { 16 "matches": ["<all_urls>"], 17 "js": ["content_script.js"] 18 } 19 ] 20} 21

content_script.js

javascript

1function doSomething(headers) { 2 return headers; 3} 4 5var p = browser.runtime.connect({name:"test-requets"}); 6p.onMessage.addListener((m) => { 7 console.log("From background:"); 8 console.dir(m.headers); 9 edited_headers = doSomething(m.headers); 10 p.postMessage({edited_headers:edited_headers}); 11});

background.js

javascript

1var p = undefined; 2 3function modifyRequest(e) { 4 let edited_headers = undefined; 5 p.postMessage({headers:e.requestHeaders}); 6 p.onMessage.addListener((m) => { 7 console.log("From content_script:"); 8 console.dir(m.edited_headers); 9 edited_headers = m.edited_headers; 10 }); 11 // ここでcontent_scriptからのメッセージが届くまで待ちたい 12 if (edited_headers===undefined) { 13 console.log("Can't wait!"); 14 } 15 return {requestHeaders: edited_headers}; 16} 17 18browser.webRequest.onBeforeSendHeaders.addListener( 19 modifyRequest, 20 {urls: ["<all_urls>"]}, 21 ["blocking", "requestHeaders"] 22); 23 24browser.runtime.onConnect.addListener((csPort) => { 25 p = csPort; 26});

フロー

  1. backgroundとcontent_scriptを接続
  2. backgroundでキャプチャしたリクエストヘッダをcontent_scriptへ送信
  3. content_scriptでヘッダを改変(doSomething)し、backgroundへ送り返す
  4. 編集済のヘッダを返して、リクエストを再開

質問

  1. backgroundから送信した後、非同期処理のためにcontent_scriptからのメッセージを受信する前にヘッダを返してしまいます。ここでなんとかcontent_scriptからのメッセージが届くまで待てないでしょうか。
  2. そもそもfirefoxの拡張機能でやれる範疇を越えているのでしょうか。

他なにかご指摘等ございましたら、お伝えいただけると幸いです。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問