15

状況:どのページでも動作するクロムエクステンションを作成しています。FacebookでjQueryが読み込まれないのはなぜですか?

問題質問:FacebookにjQueryを読み込むことができず、何が起こっているのか理解したいと思います。

仮説:Facebookは何とか両方を検出し、いくつかの超高度なハイテク所持:jQueryのは 表向き別の JSVMの実行コンテキストにおけるChromeの拡張機能を経由してロードされると

  1. を、Facebookは は何とか知っているメガマインドこれについては、表面上はとなり、別の JSVM実行 というコンテキストがあります。 jQueryのはscript.srcとブロックを経由してロードされていることを
  2. それは (私はHTTPSを介して提供GoogleのCDNの代わりではない方法2つの作品、を行いますが 答えには十分ではありません jQueryのものを使用)。

DATA

私はjQueryのロードされていない方法を知っていますか?

I Chromeでコンソールを起動するにはJ。私がやる時:

> jQuery 
    >> ReferenceError : jQuery is not defined. 
    > $('body') 
    >> Error : Tried to get element "body" but it is not present on the page. 

がどのように私はFacebookの中にjQueryをロードしようとしていますか?

方法1(必要なく、失敗した)

"content_scripts"   : [ 
            { 
            "matches" : ["<all_urls>"], 
            "js"  : [ 
                "javascript/jq/jquery-1.9.1.min.js",            
                "javascript/jq/non-standard.js" 
                ], 
            "all_frames": true // (or false, same failure) 
            } 
           ] 

方法2(作品が、insufficent)

manifest.jsonをファイルに次のコード経由

このSO答え(load jQuery into console)に記載されている方法を使用して、正しいプロトコルを許可するように変更しました。

var jq = document.createElement('script'); 
    jq.src = "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"; 
    document.getElementsByTagName('head')[0].appendChild(jq); 
    jQuery.noConflict(); 

概要

仮説1は過乗って、Webブラウザの個別の実行コンテキストは、重大なセキュリティ上の脆弱性になるので(そのサンドボックスを壊す)、非常に考えにくい、とする可能性がありません認可された。したがって、私は恐らく不自然になり、明らかに見落としているでしょう。うまくいけばあなたの一人が見るでしょう。

付録(他の関連コード)

非standard.jsの全て:

$.fn.in_groups_of = function(countPerGroup) { 
     var groups = [], offset = 0, $group; 
     while (($group = this.slice(offset, (countPerGroup + offset))).length) { 
      groups.push($group); 
      offset += countPerGroup; 
     } 
     return groups; 
    }; 

詳細のmanifest.jsonを

"manifest_version"  : 2, 
"permissions"    : [ 
            "http://*/", 
            "https://*/", 
            "tabs", 
            "storage", 
            "unlimitedStorage" 
           ], 
+0

拡張機能はFacebook以外のサイトでも動作していますか? –

+1

@SimonBoudrias大きな質問です。実は違う。私はStackoverflowをチェックしました(しかし、彼らは自分のjQueryをロードしているようですので、私は偽陽性です)。私の拡張機能はGoogleでも動作しません。いい視点ね!おそらく私は質問のタイトルを変更する必要がありますが、それは今は気を散らすことができます。 –

+3

彼らが実装したその小さな$関数は面白いですが、何かをしているように振る舞いますが、実際にはちょうど欺きのエラーメッセージです。おそらく、彼らはfacebookの勇気を掘り起こそうとしている人々の群れをしようとしている。 – brysgo

答えて

43

Chromeコンソールでは、コンテンツスクリプトの実行コンテキストにアクセスできないようです。

間違っています。

Animation of how-to get access to the execution environment of the Chromne extension

前のスクリーンキャストは、Chromeデベロッパーツールの[コンソール]タブがための実行環境を変更するために使用することができます下に2つのドロップダウンボックスを持っていることを示しています。あなたは正しい場所を見てする必要があります開発ツールのコンソール。
左側はフレームコンテキスト(上部フレーム、iframeなど)を変更するために使用でき、右側はスクリプトコンテキスト(ページ、コンテンツスクリプトなど)を変更するために使用できます。

+4

これは私が今まで見た中で最も素晴らしい答えです。それは完全に質問に答えて5つの新しいもののように私に教えたオントピックアニメーションGIFのために10,000回upvotedする必要があります。どのようにGIFをやったのですか? –

+3

@CrisStringfellow私はByzanzを使用しています。このツールを起動するシェルスクリプトについては、[この回答はAsk Ubuntu](http://askubuntu.com/a/201018/45058)を参照してください。生成されたGIFは、妥当な品質とサイズを持っています。たとえば、[このアニメーション](https://rob.lekensteyn.nl/youtubelyrics/screenshots/40seconds.gif)をご覧ください。それは40秒の持続時間を持ち、それは* 3.7Mbだけです。 –

2

回答者

私の「実験方法」に欠陥があるようです。 Chromeコンソールの全般性についての前提は正しくありません。 Chromeコンソールでは、コンテンツスクリプトの実行コンテキストにアクセスできないようです。したがって、コンソールはjQueryがページへのアクセス権を持っていないと報告していましたが、実際にはコンテンツスクリプトの実行コンテキストから実行されました。

これはmanifest.jsonをし、test.jsをコンテンツスクリプトを追加することによって確認した。

"content_scripts"   : [ 
            { 
            "matches" : ["<all_urls>"], 
            "js"  : [ 
                "javascript/jq/jquery-1.9.1.min.js", 
                "javascript/jq/non-standard.js", 
                "javascript/test.js" // <-- add 
                ], 

test.jsの内容は次のとおりです。

var jtest = $('body'); 
    alert(jtest); 
    alert(jtest.text()); 

今、私は何にナビゲートページ2つの警告ボックスが期待どおりにポップアップします。

0

あなたはこれまでにこれらのすべてを知っているかもしれませんが、誰かがまだこれらの役に立つと思っています。 Chromeの拡張機能で

あなたは、いくつかの "スクリプトの世界" があります。

  • オリジナルページのスクリプト:ページ自体のスクリプトを。
  • コンテンツスクリプト:これらのスクリプトを作成し、ページ上で実行します。
  • ポップアップスクリプト:ポップアップスクリプト:ポップアップページがある場合、ポップアップスクリプトが実行されます。
  • バックグラウンドスクリプト:グローバル背景ページで実行します。

グーグルはドキュメント上で優れた仕事をしているので、これらのスクリプトに関するすべてのドキュメントはたくさんありますhttps://developer.chrome.com/extensions

あなたの場合、ページスクリプトとコンテンツスクリプトは別々の世界に存在し、DOMといくつかのChromeネイティブオブジェクトを共有しますが、作成する変数(オブジェクト)は共有しません。

この場合、コンテンツスクリプトにjQueryがある場合、コンテンツスクリプトで$とjQueryを使用できるようになります。 DOMを照会するために使用することができます(一部のjQueryイベントは期待通りに機能しないかもしれません)。 しかし、このページでは、$とjQueryはありません($があるかもしれませんが、jQueryではありません^^)。

上記の2の方法では、実際にjQueryがページに挿入され、そのjQueryがページスクリプトになります。また、コンテンツスクリプトで$またはjQueryを使用することはできません。

両方のメソッドを同時に使用する場合は、ページスクリプトでjQuery 1を、コンテンツスクリプトでjQuery 2を使用できます。これらは2つの異なるjQueryインスタンスです。混乱の原因になるかもしれませんが、私はいつもそうしています。

関連する問題