2016-12-20 11 views
0

私は、JSライブラリへの呼び出しがjavascriptコードを通過するように、関数の書き換えを利用するいくつかのjavascriptコードを分析しようとしています。私のJavaScriptコードはChrome拡張機能の一部であり、Chrome拡張機能を使用してコンテンツスクリプトを使用してターゲットページのDOMにインストール/挿入します。 これは、ページの読み込み後に誘導され、ライブラリ呼び出しが自分の関数を通過するような関数でうまく動作します。しかし、実際にページがロードされている間に実行されるJavaScriptコードがあります(DOMがレンダリングされている間)。これは私のカスタムスクリプトが注入される前に起こります。こうすることで、カスタムスクリプトが挿入される前の関数呼び出しが失われたり、JS呼び出しが関数を経由したりすることはありません。 コンテンツスクリプトを使用して、実際に他のJavaScriptを挿入するには、下記のリンクに記載されているようにDOMに追加します。私はDOMの開始/終了になるようにコンテンツスクリプトのロード時間を扱うことができるが、これは私がターゲットページのDOMに追加し、私にはない別のスクリプトファイルである知っているコンテンツスクリプトがインストールされる前にjavascriptを停止する

Insert code into the page context using a content script

それを制御する方法を理解しているようです。 誰の助力も大歓迎です。ありがとうございました。

編集: Is it possible to run a script in context of a webpage, before any of the webpage's scripts run, using a chrome extension? で説明した問題はまったく同じですが、解決策が機能していないようです。私の意図は、Webページからjsコードが実行される前に、挿入されたスクリプトを実行することです。 manifest.jsonでdocument_startを指定すると、コンテンツスクリプトの実行はWebページの前で実行できますが、コンテンツスクリプトから挿入するスクリプト(最初のリンクで説明したようにスクリプトを挿入します)では実行できません。この注入されたスクリプトは、ウェブページ

EDIT 2に対する任意の特定の方法で実行されていない。

manifest.jsonをマニフェストファイルは、コンテンツスクリプトがdocument_startで添加content.js有します。そのため、content.jsはターゲットWebページ(基本ページ)が実行される前に実行されます。

"content_scripts":[ 
    { 
    "matches":["<all_urls>"],    
    "js":["content.js"], 
    "run_at":"document_start", 
    "all_frames":false 
    } 
], 

content.js

content.js私は実際にターゲットページの環境にあるのJavaScriptと相互作用することができるしていますように、私はDOMにmain.jsを追加していると、以下のコードを持っています。私はコンテンツ・スクリプトを使ってターゲット・ページのJavaScriptと相互作用することができないため、別のファイルからこれを行い、DOMにアタッチします。なぜなら、相互に干渉しないからです。 さらに説明すると、main.jsには、JSの実行中にターゲットページでJS呼び出しをインターセプトするJavaScriptがいくつかあります。 JSのターゲットページではライブラリへの呼び出しが行われ、これらのライブラリ関数にラッパーを記述するつもりです。

var u = document.createElement('script'); 
u.src = chrome.extension.getURL('main.js'); 
(document.head||document.documentElement).appendChild(u); 
u.onload = function() { 
    u.parentNode.removeChild(u); 
}; 

私はdocument_startで実行されるコンテンツスクリプトを通してそれを注入するのでmain.jsは、ターゲットページのドメインと対象ページ内のスクリプトのいずれかで利用可能であることを期待しています。 私はターゲットページのhtmlでsomeJSCall()がターゲットページのドメインによって定義されているように、このようないくつかのJS関数を呼び出すと仮定します。このシナリオmain.jsで

(コードは私のクロム拡張を介して注入)すでに利用可能です。したがって、someJSCall関数からJSライブラリを呼び出すと、main.jsラッパー関数が呼び出されます。 これは正常に動作します。

問題は、ターゲットページのJSで定義されたIIFE(直ちに呼び出される関数式)がある場合です。これらのIIFEコールがライブラリ呼び出しを行う場合、これは私のmain.jsインターセプトを経由しません。 Chrome Dev Toolsを使用してブラウザに読み込まれたファイルを見ると、IIFE呼び出しの実行中にmain.jsがまだ読み込まれていないことがわかります。

私はこの問題を詳細に説明してくれることを願っています。まだ明らかでない場合は教えてください。

ありがとうございます。

+0

トピックにする質問を編集してください:**完全な** [mcve]を含めると*問題が複製されます*。 * manifest.json *、背景/コンテンツ/ポップアップスクリプト/ HTMLの一部を含みます。デバッグの助けを求める質問(「**なぜこのコードは動作しないのですか?**」)には、以下が含まれていなければなりません:►必要な動作、►特定の問題またはエラー*、および►問題を再現するのに必要な最短コード自体**。明確な問題文がない質問は、他の読者にとって有用ではありません。参照してください: "**どのように[mcve] **を作成するか"、[ここで私はどんな話題を聞くことができますか?](http://stackoverflow.com/help/on-topic)、[ask] – Makyen

+2

クロム拡張を使用して、ウェブページのスクリプトが実行される前に、ウェブページのコンテキストでスクリプトを実行することはできますか?](http://stackoverflow.com/questions/13540636/is-it-possible – rsanchez

+0

これは重複していない理由について、不明瞭な説明をいくつか提出しています。これは、Webページの前にあるWebページの文脈で実行中のスクリプトです。ただし、トピックに関するデバッグの質問をするために必要なものはまだ提供していません。リストの私の最初のコメントを参照してください。ここにないものの大部分は** [mcve] **です。あなたが持っている問題を複製し、リンクされた複製の解決策があなたの問題を解決しない理由を具体的に示す[mcve]がなければ、私たちはあなたを助けることができません。私たちが助けたくないというわけではありません。私たちができるように十分な情報を提供していないということです。 – Makyen

答えて

0

あなたは「DOMの開始時/終了時にコンテンツスクリプトの読み込み時間を処理できる」と述べていますが、なぜあなたがあなたの問題を解決できないのかを明確にしていないコンテンツのスクリプトはdocument_startです。

あなたのスクリプトが前に、あなたのmanifest.jsoncontent_scriptsエントリにrun_atプロパティのdocument_startを指定することによって構築さの中に注入し、またはchrome.tabs.executeScript()に渡さrunAtオプションのされているページに注入することができます。これを行うと、document.headdocument.bodyの両方がnullのときにスクリプトが実行されます。ページに追加する内容を制御できます。

chrome.tabs.executeScript()の場合、スクリプトを実行するタイミングは、ページをロードするプロセスに関してchrome.tabs.executeScript()を実行するタイミングによって異なります。処理の非同期性のために(あなたのバックグラウンドスクリプトは通常異なるプロセスで実行されています)、document.headdocument.bodyが両方ともnullの場合、スクリプトを一貫して注入するのは困難です。私が達成した最善の方法は、そのような場合にスクリプトを注入させ、時にはページが移植された後、他のリソースが取得される前にスクリプトを注入させることです。このタイミングはほとんどの場合有効ですが、ページが存在する前にスクリプトを実際に実行する必要がある場合は、manifest.jsoncontent_scriptsというエントリを使用する必要があります。

headbodyが存在する前にコンテンツスクリプトを実行している場合、最初に挿入されるものを制御できます。したがって、他のページの前にあなたの<script>を挿入することができます。これにより、ページコンテキスト内の他のスクリプトの前にスクリプトが実行されるはずです。

+0

あなたのご意見ありがとうございます。私が実際に直面している問題は、jsライブラリへの呼び出しがjavascript(関数の書き換え、ライブラリ呼び出しの周りのアドバイスなど)を通過するようにしたいということです。コンテンツスクリプトは通常のJS呼び出しを妨害しないので、私は以前に提供したリンクで説明されている方法を使用してWebページコンテキストに注入します。それはDOMに追加することです。問題は –

+0

です。問題は、HTMLページのjsのロード時に自分自身を呼び出すIIFE呼び出しに遭遇したときです。ライブラリー呼び出しが実行されていれば、うまく動作し、私の周りのアドバイスが既に注入されています。しかし、IIFEを使用するとき、私の周りのアドバイスJSが注入される前に実行されます。私は私の質問が以前よりも少しはっきりしていることを願っています、もう一度ありがとう –

関連する問題