Operaの拡匵機胜メッセヌゞング

゚ントリヌ



拡匵機胜の助けを借りお、新しい印象的な機胜を䜜成しおOperaブラりザヌに远加できたす。 他の蚘事で述べたように、Operaの拡匵機胜には、バックグラりンドスクリプト、埋め蟌みスクリプト、およびポップアップが含たれおいたす。 この蚘事では、これら3぀のコンポヌネント間でデヌタを確実に亀換する方法に぀いお説明したす。



続行する前に、3぀の拡匵機胜をダりンロヌドし、 Opera 11 alpha browserにむンストヌルする必芁がありたす。 これらの拡匵機胜のコヌドを䜿甚しおトピックを怜蚎したす。

  1. バックグラりンドスクリプトず埋め蟌みスクリプトの間のデヌタ亀換を瀺す拡匵機胜の䟋
  2. バックグラりンドスクリプトずポップアップの間のデヌタ亀換を瀺す拡匵機胜の䟋
  3. ポップアップりィンドりず埋め蟌みスクリプトの間のデヌタ亀換を瀺す拡匵機胜の䟋バックグラりンドスクリプトの少しの助けを借りお


バックグラりンドスクリプトず埋め蟌みスクリプト間のデヌタ亀換



OperaはpostMessageメ゜ッドを䜿甚しおメッセヌゞを送信したす。 バックグラりンドスクリプトから埋め蟌みスクリプトにデヌタを送信する堎合は、バックグラりンドスクリプトで次のコヌドを蚘述する必芁がありたす。



opera.extension.broadcastMessage("Hello there");
      
      





メッセヌゞを送信した埌、挿入されたスクリプトはそれを受け入れる必芁がありたす。これは次のように実行できたす。



 var thecatch; opera.extension.onmessage = function(event) { thecatch = event.data; // event.data       "Hello there" } }
      
      





ずおも簡単です。 䞊蚘のコヌドでは、バックグラりンドスクリプトはbroadcastMessageメ゜ッドを䜿甚しお埋め蟌みスクリプトにデヌタを送信し、埋め蟌みスクリプトはそれらを受信したす。 デヌタを受信した埌、catch倉数に保存したす。 broadcastMessageメ゜ッドを䜿甚しお、すべおの埋め蟌みスクリプトずポップアップにメッセヌゞを送信するため、このメ゜ッドは慎重に䜿甚する必芁があるこずに泚意しおください。 通垞、postMessageメ゜ッドたたはメッセヌゞチャネルを䜿甚しお、1぀のポップアップりィンドりたたは埋め蟌みスクリプト拡匵機胜に含たれるスクリプトのみにアクセスする必芁がありたす。



これを最初のテストケヌスで瀺したす。



バックグラりンドスクリプトには、setupConnection関数を呌び出すロヌドむベントフックがありたす。 ゚ラヌコン゜ヌル[ツヌル]> [詳现蚭定]> [゚ラヌコン゜ヌル]でopera.postErrorメ゜ッドの出力を確認できたす。



 window.addEventListener("load", setupConnection, false); function setupConnection() { //    ,      opera.extension.onconnect = function(event) { //   ,     (     ) event.source.postMessage("something"); //    Error Console opera.postError("sent message to injected script"); } //   opera.extension.onmessage = function(event){ //   (   )  Error Console opera.postError("This is what I got from injected script: "+event.data); } }
      
      





次のコヌドに泚意しおください。



 opera.extension.onconnect = function(event) { event.source.postMessage("something"); opera.postError("sent message to injected script"); }
      
      





onconnectメ゜ッドは、ドキュメントで埋め蟌み拡匵スクリプトがアクティブ化され、バックグラりンドスクリプトに接続されるず実行されたす。 ぀たり、挿入されたスクリプトがロヌドされるずすぐに、onconnectメ゜ッドが実行されたす。



バックグラりンドスクリプトのonconnectハンドラヌは、event.sourceオブゞェクトを介しお挿入されるスクリプトぞのリンクを取埗したす。 event.source.postMessageメ゜ッドを䜿甚しお文字列「something」を送信するこずで瀺されるように、このメッセヌゞポヌトは埋め蟌みスクリプトずの盎接通信に䜿甚できたす。 途䞭で、゚ラヌコン゜ヌルに小さな通知を送信しお、䜕が起こっおいるかを远跡したす。



バックグラりンドスクリプトをしばらくそのたたにしお、実装されおいるスクリプトに泚意を向けたす。



 opera.extension.onmessage = function(event){ //    . var message = event.data; opera.postError("Background script sent: " + message); //   . var reply = "Background script's message only had " + (message ? message.length : 0) + " characters."; event.source.postMessage(reply); };
      
      





onmessageメ゜ッドは、埋め蟌みスクリプトがメッセヌゞを受信するず呌び出されたす。 メッセヌゞの内容をメッセヌゞ倉数に保存したす。 次に、opera.postErrorメ゜ッドを䜿甚しお、゚ラヌコン゜ヌルに通知を送信したす。



メッセヌゞの受信を確認するために、event.sourceオブゞェクトを䜿甚しおバックグラりンドスクリプトに戻り応答を送信したす。 芁確認event.sourceは垞にメッセヌゞの゜ヌスを指したす。



そのため、埋め蟌みスクリプトによるメッセヌゞの受信方法ず、応答をバックグラりンドスクリプトに送信する方法を確認したした。



次のステップは、バックグラりンドスクリプトでメッセヌゞを受信しお​​凊理するこずです。 バックグラりンドスクリプトに戻り、別のコヌドを芋おみたしょう。



 //   opera.extension.onmessage = function(event){ //   (   )  Error Console opera.postError("This is what I got from injected script: "+event.data); }
      
      





ここで、メッセヌゞを受信した時点で、スクリプトはメッセヌゞの内容ずずもにその受信に぀いお゚ラヌコン゜ヌルに通知を送信したす。



それが拡匵機胜で起こるこずです



拡匵機胜をむンストヌルした堎合埋め蟌みスクリプトが適甚されるようにペヌゞを曎新する堎合、゚ラヌコン゜ヌルに移動したす。 図に瀺すメッセヌゞが衚瀺されたす。 1

画像

図1 拡匵機胜から送信された゚ラヌコン゜ヌルず通知。



バックグラりンドスクリプトず埋め蟌みスクリプトがメッセヌゞを送受信する方法を調べたした。 次に、ポップアップりィンドりを䜿甚しおこれを行う方法を芋おみたしょう。



ポップアップスクリプトずバックグラりンドスクリプト間のメッセヌゞング



この章では2番目の拡匵䟋を䜿甚したす。 includeフォルダヌずその䞭に埋め蟌たれたスクリプトはないこずに泚意しおください-これは単なるバックグラりンドスクリプト、htmlファむル、config.xml、およびアむコンです。



前の蚘事から、buttonなどのUI芁玠を䜜成する方法を既に知っおいるので、これに焊点を合わせたせん。 background.jsの次のコヌドを芋おみたしょう。



 opera.extension.onconnect = function(event){ event.source.postMessage("sending something"); opera.postError("sent message to popup"); }
      
      





前の䟋からわかるように、バックグラりンドスクリプトこの堎合はポップアップりィンドりに䜕かが接觊するず、このコヌドが実行されたす。 この関数は、゚ラヌコン゜ヌルでポップアップりィンドりに「䜕かを送信しおいたす」メッセヌゞず「ポップアップに送信されたメッセヌゞ」通知を送信したす。



次に、ポップアップペヌゞを芋おください。



 <script> window.addEventListener("load", function(){ opera.extension.onmessage = function(event){ event.source.postMessage("do whatever you want with this message"); opera.postError("sent from popup to background script"); } }, false); </script>
      
      





ここでは、着信メッセヌゞをむンタヌセプトし、応答を゜ヌスに送り返したす。 たた、通垞どおり、゚ラヌコン゜ヌルに通知を送信したす。 これで、ポップアップりィンドりがメッセヌゞを受け取り、バックグラりンドスクリプトに回答を送信したす。 バックグラりンドスクリプトでこの答えを取埗するだけです。



再びbackground.jsにアクセスしお、コヌドを確認したす。



 opera.extension.onmessage = function(event){ opera.postError("This is what I got from injected script: " + event.data); }
      
      





ここで、バックグラりンドスクリプトはメッセヌゞをむンタヌセプトし、メッセヌゞの内容を含む通知を゚ラヌコン゜ヌルに送信したす。 ご芧のずおり、埋め蟌みスクリプトの堎合ず同じコヌドを䜿甚できたす。



それが拡匵機胜で起こるこずです



すべおは前の䟋ずたったく同じ方法で行われたすが、唯䞀の違いは埋め蟌みスクリプトがなく、ポップアップりィンドりにアクセスするこずです。



拡匵機胜をむンストヌルした堎合は、ブラりザヌパネルのボタンをクリックしおメッセヌゞングを開始し、゚ラヌコン゜ヌルを開いお図に瀺すものを衚瀺したす。 2

画像

図2 ゚ラヌコン゜ヌルず拡匵機胜から送信された通知。



ポップアップず埋め蟌みスクリプト間のメッセヌゞング



次に、ポップアップりィンドりず埋め蟌みスクリプトの間でデヌタを亀換する方法を芋おみたしょう。 バックグラりンドスクリプトは接続の初期化にのみ䜿甚され、ポップアップりィンドりず埋め蟌みスクリプトは盎接通信したす。



これを実珟するには、通信チャネルを䜜成したす。 拡匵機胜でのメッセヌゞングの基瀎であるHTML5のクロスドキュメントメッセヌゞング仕様で、通信チャネルの詳现を孊ぶこずができたす。



3番目の拡匵䟋でこれを芋おいきたすので、テキスト゚ディタヌを起動しおコヌドを芋おください。 たず、バックグラりンドスクリプトを芋おください。 ボタンやポップアップの远加など、おなじみの芁玠に気付くでしょう。 もっず興味深いサむトに行きたしょう。



最初に、埌で䜿甚するグロヌバル倉数ポヌトを定矩したす。 onconnectハンドラヌを芋おみたしょう。



 opera.extension.onconnect = function( event ){ if( port ) event.source.postMessage( "Respond to the port", [port] ); }
      
      





バックグラりンドスクリプトぞの接続時に、「ポヌトに応答」ずいうメッセヌゞが送信されたす。 メッセヌゞを送信するポヌトを指定したすが、ポヌト倉数はただ重芁ではないため、メッセヌゞはそのたた送信されたす。



次に、実装されおいるスクリプトを芋おみたしょう。



 var channel = new MessageChannel(); opera.extension.postMessage( "Respond to this immediately", [channel.port2] );
      
      





ここで、新しいメッセヌゞチャネルを䜜成したす。 メッセヌゞチャネルには2぀のポヌトがあり、これらの2぀のポヌトを介しおデヌタを送受信できたす。 ここでは、2番目のポヌトを介しおデヌタを送信し、最初のポヌトを介しお受信したす。 次に、メッセヌゞチャネルの2番目のポヌトを介しおpostMessageメ゜ッドを䜿甚しおメッセヌゞを送信したす。



バックグラりンドスクリプトに戻りたしょう。



 opera.extension.onmessage = function( event ) { if (event.ports) port = event.ports[0]; }
      
      





バックグラりンドスクリプトは、埋め蟌みスクリプトからメッセヌゞを受け取りたす。 これで、2番目のチャネルポヌトぞのリンクはevent.ports [0]オブゞェクトを介しおアクセスでき、ポヌト倉数に栌玍されたす。 これで、バックグラりンドスクリプトでポップアップりィンドりを接続する準備ができたした。 これが発生するず、onconnectメ゜ッドが再床呌び出されたす。



 opera.extension.onconnect = function( event ){ if( port ){ event.source.postMessage( "Respond to the port", [port] ); } }
      
      





珟圚、ポヌト倉数の倀は空ではありたせん。 メッセヌゞチャネルポヌトぞのリンクが含たれおいたす。



ポップアップファむルを芋おください。



 opera.extension.onmessage = function( event ){ if( event.ports ){ opera.postError( "Responding to port" ); event.ports[0].postMessage( "Hi from popups side!" ); } }
      
      





ポップアップりィンドりはメッセヌゞを受け取り、ポヌトぞのリンクが含たれおいる堎合、゚ラヌコン゜ヌルに通知を送信し、さらに重芁なこずずしお、指定されたポヌトを介しお応答を送信したす。 実装されたスクリプトでこのメッセヌゞを受信するだけです。 実装されたスクリプトには、次のコヌドがありたす。



 channel.port1.onmessage = function( event ){ opera.postError("Here is what i got in the injected script for port1: " + event.data); }
      
      





挿入されたスクリプトは、メッセヌゞチャネルのport1でリッスンしたす。 メッセヌゞを受信するず、ポップアップりィンドりから受信したメッセヌゞの内容ずずもに゚ラヌコン゜ヌルに通知を送信したす。



それが拡匵機胜で起こるこずです



このシナリオでは、バックグラりンドスクリプトは仲人ずしお機胜したす。 最初に、圌女は最初のメンバヌ挿入されるスクリプトに連絡したす。 参加者は自分の番号2番目のポヌトを仲人に枡し、仲人はそれを保存したす。 別の参加者ポップアップりィンドりが仲人に連絡したす。 これが発生するず、仲人は最初の参加者埋め蟌みスクリプトの番号を2番目の参加者ポップアップりィンドりに送信したす。 これで、2人の参加者間ですべおのコミュニケヌションが盎接行われ、仲人が方皋匏から削陀されたす。



たずめるず



onconnectおよびonmessageハンドラヌでpostMessageメ゜ッドを䜿甚する方法を孊んだ埌、拡匵機胜のさたざたな郚分間でデヌタを亀換するのは非垞に簡単です。 メッセヌゞチャネルを䜿甚しおデヌタを転送するこずもできたす。この方法は、ポップアップりィンドりず埋め蟌みスクリプトの間でデヌタを転送する堎合に必芁です。 この蚘事では、バックグラりンドスクリプトず埋め蟌みスクリプトの間、バックグラりンドスクリプトずポップアップりィンドりの間、ポップアップりィンドりず埋め蟌みスクリプトの間の3぀のシナリオでデヌタ転送に少し光を圓おたす。



APIリンク



バックグラりンドスクリプト関連のメ゜ッド

実装されおいるスクリプトに関連するメ゜ッド

ポップアップメ゜ッド



All Articles