現在のページを操作する(基本的にはボタンを追加する)Google Chrome拡張機能を書いています。
コンテンツスクリプトで、Facebook Graph APIをロードします。
$fbDiv = $(document.createElement('div')).attr('id', 'fb-root');
$fbScript = $(document.createElement('script')).attr('src', 'https://connect.facebook.net/en_US/all.js');
$(body).append($fbDiv);
$(body).append($fbScript);
console.log("fbScript: " + typeof $fbScript.get(0));
console.log("fbScript parent: " + typeof $fbScript.parent().get(0));
console.log("find through body: " + typeof $(body).find($fbScript.get(0)).get(0));
ただし、スクリプトはbody
に追加されていないようです。ここにコンソールログがあります:
fbScript: object
fbScript parent: undefined
find through body: undefined
私が間違っていることについてのアイデアはありますか?
問題は、コンテンツスクリプト内のJavaScriptが独自のサンドボックス環境で実行され、次の2つの方法のいずれかでロードされた他のJavaScriptにしかアクセスできないことです。
manifest を使用:
{
"name": "My extension",
...
"content_scripts": [
{
"js": ["https://connect.facebook.net/en_US/all.js"]
}
],
...
}
または プログラムによる注入 を使用:
/* in background.html */
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.executeScript(null,
{file:"https://connect.facebook.net/en_US/all.js"});
});
マニフェストのアクセス許可を必ず更新してください。
/* in manifest.json */
"permissions": [
"tabs", "https://connect.facebook.net"
],
スクリプトタグを追加すると、JavaScriptがアクセスできるJavaScriptサンドボックスの外で、含まれているページのコンテキストでJavaScriptが実際に評価されます。
また、FBスクリプトでは「fb-root」がDOM内にある必要があるため、おそらくプログラムによるアプローチを使用して、最初にDOMを要素で更新し、次に メッセージを渡す にする必要があります。 =バックグラウンドページに戻ってFacebookスクリプトをロードし、コンテンツスクリプトにロードされているJavaScriptからアクセスできるようにします。
Google Chrome拡張機能では、外部コードを直接挿入することはできなくなりましたが、Ajax呼び出しを使用してコードをダウンロードし、コードブロックのようにインジェクターにフィードすることができます。
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
$.get("http://127.0.0.1:8000/static/plugin/somesite.js", function(result) {
chrome.tabs.executeScript(tabs[0].id, {code: result});
}, "text");
});