ただそれを取っお背景ペヌゞに戻るこずはできたせん

クロスドメむンセキュリティポリシヌがすべおです。 他のタブのペヌゞたたは拡匵機胜のバックグラりンドペヌゞぞのアクセスは、他のドメむンのペヌゞず芋なされ、他の人のりィンドりやフレヌムず同様に、スクリプト環境ぞの盎接アクセスに制限があるため、意図的に制限されたす。 メッセヌゞメカニズムは、フレヌム間のクロスドメむンアクセス、および拡匵ペヌゞバックグラりンド、蚭定、ポップアップなどぞのアクセスず同様に「保存」されたす。



ブラりザ拡匵機胜では、Google ChromeおよびChromiumが機胜䞊最も重芁です-バックグラりンドペヌゞ。 chrome-extensionずいう圢匏の特別なURLがありたす。// ciegcibjokpkcklhgbpnmnikpkmkhbjk /。ここで、長いドメむン名はブラりザヌの腞で䜜成されたランダムな名前であり、OSサヌビスフォルダヌ内の拡匵ディレクトリも参照したす。 コンテンツスクリプトブラりザペヌゞで実行されるナヌザヌスクリプトに類䌌から、ファむルおよび拡匵機胜画像にアクセスできたす。 しかし、倚くの機胜を実行するこずは䞍可胜です。そのパスはバックグラりンドペヌゞにありたす。実際のドメむン名のグルヌプに関連するストレヌゞを配眮したす。 拡匵機胜党䜓に共通の拡匵機胜蚭定を保存したす。 Mordorのバックグラりンドペヌゞにアクセスするだけです。 ただし、URLだけではできたせん。



この説明は、Chromeのドキュメントのペヌゞにはありたせん。 むしろ存圚したすが、「他のいく぀かの」メ゜ッドずオブゞェクトのために、実際には修正されるたで、それは意味したせん。 説明したメッセヌゞングオブゞェクトの動䜜は、StackOverflowぞの応答のいく぀かの䟋で確認されおいたす。 毎回異なる䟋で答えを探すのは骚が折れるので、この混乱を終わらせるために、ここで1か所に集めおみたしょう。 ダむレクトコヌルバックずコヌルバックの4぀の組み合わせはすべお列挙されおいるため、目の前には垞にそれらの動䜜パタヌンがありたす。



テストずデモを行うには、3぀のファむルmanifest.json、script.js、background.jsをコピヌたたは䜜成し、Chromeで開発者モヌドでテスト拡匵機胜を䜜成し、コン゜ヌルのメッセヌゞを2ペヌゞ埋め蟌みスクリプトスクリプトのあるブラりザヌりィンドりで確認する必芁がありたす。 jsおよびbackgroundbackground.jsバックグラりンドコン゜ヌルを芋る-chrome// extensions /の[ビュヌモヌドを確認_generated_background_page.html]リンクをクリックしおください。 蚘事のコヌドの2぀のフラグメントをペヌゞに配眮しお実行するず、既補の拡匵機胜でも同じこずが機胜したす。



Habréでは、2012幎11月にhabrahabr.ru/post/159145で同様の問題が適甚目的で解決されたした。暗黙の修正ず䜿甚ず同じ知識源です。 ロシア語のむンタヌネットでは、同様の問題が2012幎6月の蚘事で説明されおいたす。GoogleChromeブラりザヌの拡匵スクリプトで実行されるずいう事実を考慮しお、そのような問題を解決するために䜿甚されるメカニズムを説明したす。


同じドメむンのりィンドりずフレヌムのペヌゞ別のスクリプト環境のりィンドりなどに盎接アクセスできる堎合、バックグラりンドペヌゞ、および他のタブずブラりザヌペヌゞは、他のドメむンのペヌゞずしお機胜したす。 メッセヌゞを送信しお、匱く接続されたプロシヌゞャのパタヌンを実珟し、 シリアル化できるオブゞェクトのみを送信できたす。DOM、環境、その他の耇雑なオブゞェクトは送信できたせん。



背景ペヌゞのために努力するこずがありたす。 スクリプトたたはナヌザヌスクリプトでは考えられない機胜を実行したす。 すべおのペヌゞに共通のメモリだけではありたせん。 developer.chrome.com/extensions/api_index.htmlで説明されおいる倚くのむンタヌフェヌスの実装があり、将来さらに倚くのむンタヌフェヌスが期埅されおいたす。 わずかなメッセヌゞむンタヌフェヌスには、コヌルバック関数があり、䞎えられた堎合、呌び出し偎の関数の環境偎で実行されたすが、結果パラメヌタヌは反察偎から枡されたす。



これらはすべお、JavaScriptのpostMessage環境のむンタヌフェむスをわずかに倉曎したもので、クロスドメむンアクセス芏制の問題を解決するためにブラりザヌで䜜成されたのはそれほど前ではありたせん。 これは通垞、りィンドりずフレヌムの間でスクリプトを通信するために䜿甚され、ペヌゞのドメむンが異なる堎合の唯䞀の䟿利な通信手段です。 以前は、この問題を解決するために、䜿甚されおいるオブゞェクトのキヌワヌドに埓っお、コヌド名「window.name」の䞋で「束葉杖」が䜿甚されおいたした。 珟圚は動䜜したすが、耇雑であり、代わりのpostMessageメ゜ッドず比范しお明らかに遅いです。 通垞のpostMessageメカニズムは、Chrome拡匵機胜のデヌタ亀換のメカニズムに基づいおいるため、どのように機胜するかを思い出しおください。



PostMessageむンタヌフェヌスクロスブラりザヌ、IE8 +



メッセヌゞの開始ペヌゞは、カスタムむベント「メッセヌゞ」を䜜成したす。メッセヌゞを送信したす。これは、そのドメむンからではなく、アクセスしたいものから行いたす。 IE8には制限がありたす-フレヌムの芪りィンドりのみにアクセスしたす。

otherWindow.postMessage(message, targetOrigin); //message -    __  //targetOrigin -     otherWindow,  " "
      
      





ドメむン名が掚枬されるず、メッセヌゞが送信されたす。 otherWindowりィンドりで受信するには、いく぀かの条件を満たす必芁がありたす。

1むベントハンドラヌがありたす。

2ハンドラヌは送信ドメむンからのメッセヌゞを「埅機」し、2番目の匕数でこれを確認したす。

 window.addEventListener('message', function(event){ //  if(event.origin !== 'URL_-') // , , 'http://example.org' return; ...// event.data,  message  .postMessage ...// event.source - -  ,  //       }, false);
      
      







りィンドりから背景ペヌゞにメッセヌゞを送信するChrome



拡匵機胜では、コヌルバックを远加し、ドメむンチェックを自動化するこずにより、postMessageフレヌムワヌクが若干再蚭蚈されたした。 レンガからメッセヌゞを収集する堎合よりも䟿利になりたした。 最埌に、利甚可胜なツヌルを䜿甚しお、次のsendMessageたたはsendRequestに魔法がないこずを瀺す暙準のpostMessageのコヌドを瀺したす。これは単なるシェルです。 しかし、特別なプロトコル「chrome-extension// *」でフレヌムを䜜成するための拡匵暩限が䞍十分であるため、postMessageを完了できたせんでした。これに぀いおは、マニフェストファむル圢匏も䜕も認識せず、問題は官僚的な遅延にinれたした 。 これは、なぜ圌らが亀換機胜を考え出さなければならなかったのかずいう質問に察する答えです。



䞊蚘の䟋は、 Chrome拡匵機胜のむンストヌルペヌゞ spmbt.kodingen.com/bgMessageXmp/index.htmから動䜜を確認、テスト、調査できたす。 拡匵機胜がむンストヌルされおいない堎合、5぀のリンクをクリックするず、拡匵機胜がないこずが瀺されたす。 むンストヌル埌拡匵子内-必芁なファむルは3぀のみ、クリックするず以䞋に説明する䟋を実行したす。



むンストヌル方法 1アヌカむブをダりンロヌド、2解凍たたはすぐにむンストヌル、3Chromeで//拡匵機胜/「開発者モヌド」に移動、4「展開された拡匵機胜をダりンロヌド...」を実行し、アヌカむブからディレクトリを遞択、 5拡匵機胜のダりンロヌド元のペヌゞを曎新したす。 5぀のリンクでサンプルを実行できたす。 実行埌、chrome// extensions /を䜿甚しおスクリプトを削陀するだけで十分です。 このサンプルスクリプトは、拡匵機胜をテストたたは䜜成するためのフレヌムワヌクずしお䜿甚できたす。 この蚘事では、テキストからスクリプトをデバッグし、タむプミスを排陀するのを手䌝いたした。


䟋1

タブからバックグラりンドペヌゞに送信しおそこで終了する必芁がある堎合、単玔なメッセヌゞ圢匏が䜿甚されたす。

  chrome.extension.sendMessage('   ');
      
      





メッセヌゞはバックグラりンドたたは他のペヌゞで受け入れられたす

 chrome.extension.onMessage.addListener(function(request){ if(request=='   ') //,        console.log('1. : ', request); });
      
      







䟋2

この機胜のペアは、フィヌドバックの亀換に適合しおいたす。 スクリプトからパラメヌタヌを远加したす。

 chrome.extension.sendMessage(' backMsg', function(backMessage){ console.log('2.    :', backMessage); });
      
      





背景ペヌゞから

 chrome.extension.onMessage.addListener(function(request, sender, f_callback){ if(request==' backMsg'){ //,        console.log('2.   : ', request); f_callback('backMsg'); //  } });
      
      





f_callback-バックグラりンドペヌゞではなく スクリプトで実行されたすが、バックグラりンドでパラメヌタヌが指定されおいたす。

送信者オブゞェクトの圢匏は次のずおりです。

 { active: true highlighted: true id: 34 //id  ()  incognito: false index: 0 pinned: false selected: true status: "complete" title: "HabrAjax by spmbt" //document.title url: "http://spmbt.kodingen.com/habrahabr/habrAjax/index.htm" //location.href windowId: 1 //id   }
      
      





したがっお、メッセヌゞの送信者に぀いお圌から䜕かがわかりたす。 送信者からの倀は䜿甚したせんが、メッセヌゞがどのタブたたはりィンドりから来たかを远跡し、他のタブにある堎合は他のコンテンツスクリプトに倉曎を送信するこずができたす。

䟋2の終わり



より耇雑なものを枡す必芁がある堎合-文字列の代わりにハッシュたたは配列を埋め蟌むこずは問題ありたせん。 匕数のセットの代わりにハッシュを枡す-䞀般に、より高床な圢匏の亀換-は1぀の匕数を取り、キヌで自己文曞化するため読みやすくなりたす。ハッシュ倀は芁玠ごずに再配眮および削陀されたす-順序を芚える必芁がなく、倀が欠萜する心配がありたせん



匕数をハッシュに眮き換える手法では、すべおに3぀の匕数で十分であり、それぞれがその圹割を果たしたす。 さらに進むず、キヌ{request...、sender...、callbackf{...}};を持぀1぀の匕数に眮き換えるこずができたす。 なぜそうしなかったのですか どうやら、圌らは3぀の議論を考慮した-これは非垞に玳士的な制限であり、芚えおそしおさらに解読するために恥ずかしいこずではありたせん。 さらに、シンボルは自己文曞化に費やされたす。 匕数が2〜3の堎合、遞択肢は䜍眮匕数に傟いおいたす。



たずえば、コマンド名だけでなく、デヌタを含むハッシュも送信する必芁がありたす。 スクリプトから蚘述したす。

 var data ='From page '; chrome.extension.sendMessage({cmd:'exec1', h:{data1: data, dataX: d+1}, function(backMessage) console.log(backMessage); }});
      
      





背景ペヌゞから

 chrome.extension.onMessage.addListener(function(request, sender, callback){ if(request.cmd =='exec1'){ callback('backMsg'); //  console.log('Tis message in background page printed after' +' receive of data1 = ', request.h.data1, '; URL= ',sender.url); });
      
      





コンテンツペヌゞから頻繁に繰り返される呌び出しを短瞮したす。

 var inBg = function(cmd, h, f_back){ h.cmd = cmd; chrome.extension.sendMessage(h, f_back); }); ... inBg('exec1', {data1: data, dataX: d+1}, function(){ ... });
      
      







 䜕らかの理由で、 3番目のコヌルバックは提䟛されたせん...管理は2回だけ再デプロむされたす。



背景ペヌゞからりィンドりにメッセヌゞを送信するChrome



䟋3

逆のタスクがある堎合、バックグラりンドペヌゞから、たずえばアクティブなタブにメッセヌゞを送信したす。

バックグラりンドで次のように蚘述したす。

 chrome.tabs.getSelected(null, function(tab){ //   ,     chrome.tabs.sendRequest(tab.id,{msg:"msg01"}); //   });
      
      





コンテンツ内

 chrome.extension.onRequest.addListener(function(req){ //   background console.log('3.   :', req.msg); //   });
      
      





最初のケヌスではsendMessage-onMessageペアを䜿甚し、2番目のケヌスではsendRequest-onRequestを䜿甚するこずが重芁ですか いいえ、1぀のペアからのものである堎合、どの方法でも機胜したす。



䟋4

逆コヌルバックでメッセヌゞを送信する必芁がある堎合、バックグラりンドで次のように蚘述したす。

 var inBack = function(tabId, cmd, h, f_back){ h.cmd = cmd; chrome.tabs.sendMessage(tabId, h, f_back); }; chrome.tabs.getSelected(null, function(tab){ inBack(tab.id,'exec0', {dat:'h'}, function(backMessage){ console.log('4.    : ', backMessage); }); });
      
      





コンテンツペヌゞで

 chrome.extension.onMessage.addListener(function(request, sender, callback){ if(request.cmd =='exec0'){ // console.log('4.  :', request.dat); callback('12w3'); } });
      
      







あなたが芋るこずができるように、それは実行されたす-ドキュメントに蚘茉されおいたが、developer.chrome.com/extensions/messaging.htmlのわずかに異なるオブゞェクトchrome.runtimeに察しお、chrome.runtimeはこのタスクでは機胜したせん-メ゜ッドがありたせんsendMessage。



暙準postMessageでの送信倱敗



吊定的な結果にもかかわらず、この転送の詊みは、 postMessageの存圚にもかかわらず、開発者が拡匵機胜で独自のデヌタ転送機胜を凊理しなければならなかった理由を掚枬したす。



コンテンツスクリプトで実行可胜な数少ない特別な拡匵メ゜ッドの1぀はchrome.extension.getURL 'path'です。 拡匵リ゜ヌスぞのパスを返したす。 それを開くず、拡匵リ゜ヌスディレクトリではなくを取埗したす-それから画像ずテキストを取埗したす。 ここでは別のドメむンが圹割を果たしたす。ペヌゞスクリプトに囲たれたテキストを取埗するには、クロスドメむンAjaxを実行する必芁がありたす。 たたは、メッセヌゞメカニズムを䜿甚しおドメむンりォヌル経由でテキストを受信する方が簡単です。



䟋5

定矩枈みのプロトコル「chrome-extension」を䜿甚しおドメむン「// ciegcibjokpkcklhgbpnmnikpkmkhbjk」などを䜿甚しおメッセヌゞを送信したす。

 var bgUrl = chrome.extension.getURL(''); console.log(bgUrl); // 
      
      





しかし、すべおが単玔なわけではありたせん。 コンテンツスクリプトには、バックグラりンドペヌゞりィンドりぞのアクセス暩がありたせん。 メ゜ッドは次のずおりです。

 chrome.extension.getBackgroundPage();
      
      





ただし、アクセスできたせん。

䞍明な゚ラヌ「getBackgroundPage」は拡匵プロセスでのみ䜿甚できたす。 詳现に぀いおは、コンテンツスクリプトのドキュメントを参照しおください。

コマンドヌは萜胆しおいたせん。 簡単に亀換するには、フレヌムを䜜成する必芁がありたす。 フレヌムの䜜成を劚げるものは䜕もありたせん。

 var ifr = document.createElement('iframe'); ifr.id ='ifr1'; ifr.src = bgUrl; document.body.appendChild(ifr);
      
      





゚ラヌが発生したした

chrome-extensionのロヌドを拒吊// ciegcibjokpkcklhgbpnmnikpkmkhbjk / 。 拡匵機胜の倖郚のペヌゞでロヌドするには、リ゜ヌスがweb_accessible_resourcesマニフェストキヌにリストされおいる必芁がありたす。

マニフェストにアクセス蚱可を远加したすchrome.extension.sendMessageを䜿甚するず、これは䞍芁になりたした。

「蚱可」["chrome-extension// *"、...]

Chromeで゚ラヌが発生したした//拡匵機胜/

拡匵機胜をむンストヌルするずきに、譊告がありたした

暩限「chrome-extension//」が䞍明であるか、URLパタヌンの圢匏が正しくありたせん。

アクセスが拒吊されなかった堎合、実行されたたたになりたす。

 ifr.postMessage('Yep', bgUrl.replace(/\/$/,'') );
      
      





そしおバックグラりンドで-

 window.addEventListener('message', function(ev){ console.log('origin: ', ev.origin); },!1);
      
      







これで䟋を終了するこずができたす-他の理由で暙準機胜を介したアクセスが閉じられたこずを瀺したした-バックグラりンドペヌゞをフレヌムで衚瀺する必芁があるためです明らかに「manifest_version」2。 そのため、Chrome拡匵機胜では、構文の最適化ず双方向亀換の理由から、特別なメッセヌゞング方法が考案されたした。



䟋は、バックグラりンドペヌゞぞのメッセヌゞ送信に特別なトリックがないこずを瀺したした。 ただし、拡匵機胜にはない特別な暩限が必芁です。 chrome.extensionオブゞェクトのメ゜ッドのprivate郚分は冷静にこれを行いたすが、他のものは提䟛したせん。 sandbox.htmlでこれを行う必芁がありたす。背景ペヌゞを含むフレヌムを䜜成できたすか。



テスト拡匵機胜ずテストペヌゞをむンストヌルしたす。



All Articles