-[[The message manager | MDN>https://developer.mozilla.org/ja/docs/The_message_manager]] --古いページなので内容は微妙だが、概要を日本語で読める。 -[[Multiprocess Firefox - Mozilla | MDN>https://developer.mozilla.org/en-US/Firefox/Multiprocess_Firefox]] -[[Working with multiprocess Firefox - Mozilla | MDN>https://developer.mozilla.org/en-US/Add-ons/Working_with_multiprocess_Firefox]] -[[Message manager - Mozilla | MDN>https://developer.mozilla.org/en-US/Firefox/Multiprocess_Firefox/Message_Manager]] -[[Latest topics > Firefoxアドオンのe10s(マルチプロセス)対応の方針について得られた知見 - outsider reflex>http://piro.sakura.ne.jp/latest/blosxom/mozilla/xul/2014-11-13_e10s.htm]] -e10s対応拡張機能を作成する際は、install.rdf に以下の記述をする。 <em:multiprocessCompatible>true</em:multiprocessCompatible> -これを記述していないと、互換性維持の為のラッパーである CPOWs が勝手に起動しておかしな動作をして悩む事になりかねない。 -e10sではChromeプロセスとContentプロセスに分離する。 -Chromeプロセスで動作するメインのスクリプトをChromeスクリプトと呼ぶ。これは今までの拡張機能そのままのもの。 -Contentプロセスの中で動作する、Webコンテンツに直接アクセスできるスクリプトの事をFrameスクリプトと呼ぶ。 -ChromeプロセスとContentプロセスを繋ぐのがメッセージマネージャ。 -メッセージマネージャは階層構造になってて、全体を・ウィンドウごとに・タブごとに、管理している。 -[[Message manager overview - Mozilla | MDN>https://developer.mozilla.org/en-US/Firefox/Multiprocess_Firefox/Message_Manager/Message_manager_overview]] -ContentプロセスにFrameスクリプトを読み込ませるには、Chromeスクリプト内でメッセージマネージャのloadFrameScriptを使う。 #highlight(javascript){{ // 全てのウィンドウ及びタブなら var globalMM = Cc["@mozilla.org/globalmessagemanager;1"].getService(Ci.nsIMessageListenerManager); // var globalMM = Services.mm; globalMM.loadFrameScript("chrome://sample/content/frame-script.js", true); // アクティブなウィンドウのみでなら var windowMM = window.messageManager; windowMM.loadFrameScript("chrome://sample/content/frame-script.js", true); // アクティブなウィンドウのアクティブなタブのみでなら var browserMM = gBrowser.selectedBrowser.messageManager; browserMM.loadFrameScript("chrome://sample/content/frame-script.js", true); }} -ChromeスクリプトとFrameスクリプトとの情報のやり取りはJSON、つまり文字列のみ。 -メッセージマネージャで情報のやりとりをする。 -[[Communicating with frame scripts - Mozilla | MDN>https://developer.mozilla.org/en-US/Firefox/Multiprocess_Firefox/Message_Manager/Communicating_with_frame_scripts]] -FrameスクリプトからChromeスクリプトへ情報を送る場合は #highlight(javascript){{ // frame script sendAsyncMessage("addon-id@sample", {}) sendSyncMessage("addon-id@sample", {}) }} #highlight(javascript){{ // chrome script messageManager.addMessageListener("addon-id@sample", listener); }} -ChromeスクリプトからFrameスクリプトへ情報を送る場合は #highlight(javascript){{ // chrome script globalMM.broadcastAsyncMessage("addon-id@sample", {}) windowMM.broadcastAsyncMessage("addon-id@sample", {}) browserMM.sendAsyncMessage("addon-id@sample", {}) }} #highlight(javascript){{ // frame script addMessageListener("addon-id@sample", listener); }}