1

アドオンにマップを追加する必要があり、ここで行ったように、「一般的なWebページ」で必要なことを行う方法を知っています: http://jsfiddle.net/hCymP/6/

問題は、Firefox アドオンで同じことを行う方法が本当にわからないことです。LoadSubScriptを使用してスクリプトをインポートしようとしましたが、次の行でクロム html を追加しようとしました:

<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script>

しかし、何も機能しません。私が見つけた最良の解決策は、このファイルのコードの一部(スクリプト src のコード) を関数に追加し、このファイルloadSubScriptでインポートすることでした。すべての関数が実行されますが、空の div が返されます。

Components.utils.import("resource://gre/modules/Services.jsm");

window.google = {};
window.google.maps = {};
window.google.maps.modules = {};
var modules = window.google.maps.modules;
var loadScriptTime = (new window.Date).getTime();

window.google.maps.__gjsload__ = function(name, text) { modules[name] = text;};
window.google.maps.Load = function(apiLoad) {
    delete window.google.maps.Load;
    apiLoad([0.009999999776482582,[[["https://mts0.googleapis.com/vt?lyrs=m@227000000\u0026src=api\u0026hl=en-US\u0026","https://mts1.googleapis.com/vt?lyrs=m@227000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"m@227000000"],[["https://khms0.googleapis.com/kh?v=134\u0026hl=en-US\u0026","https://khms1.googleapis.com/kh?v=134\u0026hl=en-US\u0026"],null,null,null,1,"134"],[["https://mts0.googleapis.com/vt?lyrs=h@227000000\u0026src=api\u0026hl=en-US\u0026","https://mts1.googleapis.com/vt?lyrs=h@227000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"h@227000000"],[["https://mts0.googleapis.com/vt?lyrs=t@131,r@227000000\u0026src=api\u0026hl=en-US\u0026","https://mts1.googleapis.com/vt?lyrs=t@131,r@227000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"t@131,r@227000000"],null,null,[["https://cbks0.googleapis.com/cbk?","https://cbks1.googleapis.com/cbk?"]],[["https://khms0.googleapis.com/kh?v=80\u0026hl=en-US\u0026","https://khms1.googleapis.com/kh?v=80\u0026hl=en-US\u0026"],null,null,null,null,"80"],[["https://mts0.googleapis.com/mapslt?hl=en-US\u0026","https://mts1.googleapis.com/mapslt?hl=en-US\u0026"]],[["https://mts0.googleapis.com/mapslt/ft?hl=en-US\u0026","https://mts1.googleapis.com/mapslt/ft?hl=en-US\u0026"]],[["https://mts0.googleapis.com/vt?hl=en-US\u0026","https://mts1.googleapis.com/vt?hl=en-US\u0026"]],[["https://mts0.googleapis.com/mapslt/loom?hl=en-US\u0026","https://mts1.googleapis.com/mapslt/loom?hl=en-US\u0026"]],[["https://mts0.googleapis.com/mapslt?hl=en-US\u0026","https://mts1.googleapis.com/mapslt?hl=en-US\u0026"]],[["https://mts0.googleapis.com/mapslt/ft?hl=en-US\u0026","https://mts1.googleapis.com/mapslt/ft?hl=en-US\u0026"]]],["en-US","US",null,0,null,null,"https://maps.gstatic.com/mapfiles/","https://csi.gstatic.com","https://maps.googleapis.com","https://maps.googleapis.com"],["https://maps.gstatic.com/intl/en_us/mapfiles/api-3/13/11","3.13.11"],[3047554353],1.0,null,null,null,null,1,"",null,null,1,"https://khms.googleapis.com/mz?v=134\u0026",null,"https://earthbuilder.googleapis.com","https://earthbuilder.googleapis.com",null,"https://mts.googleapis.com/vt/icon"], loadScriptTime);
};


//I can't use document.write but use loadSubScript insthead
Services.scriptloader.loadSubScript("chrome://googleMaps/content/Google-Maps-V3.js", window, "utf8"); //chrome://MoWA/content/Google-Maps-V3.js", window, "utf8");

var mapContainer = window.content.document.createElement('canvas');
    mapContainer.setAttribute('id', "map");
    mapContainer.setAttribute('style',"width: 500px; height: 300px");
    mapContainer.style.backgroundColor = "red";

var mapOptions = {
    center: new window.google.maps.LatLng(latitude, longitude),
    zoom: 5,
    mapTypeId: window.google.maps.MapTypeId.ROADMAP
}

var map = new window.google.maps.Map(mapContainer,mapOptions);
return mapContainer;

手伝って頂けますか?私は「Firefox for Android」アドオンを開発しています。そのため、 *window.content.*document.createElement などの操作を行う必要があります。これは、ドキュメントが宣言されておらず、ウィンドウのみであり、それが問題である可能性があると思います...しかし、私はGoogle マップが何を使用しているかを知らなければ、すべてを宣言することはできません。

追加: また、Google Maps API チームには、メイン スクリプトをローカルにコピーすることを禁止する特定のコードがあることも読みました。特に、そのコードは数時間ごとに「期限切れ」になります。私はこのスクリプトの一部を結合しています: https : //maps.googleapis.com/maps/api/js ?v=3.exp&sensor=falseインターフェイス HTMLDocument を実装しない)。だから他に選択肢がない!

4

1 に答える 1

1

Web コンテンツを表示するには、iframe(XUL の場合は type=content) を使用します。そこには、好きなスクリプトを含めることができます。のコンテンツにはiframe特別な権限はありません。少なくとも、そうすべきではありません。コードの特権アドオン部分と通信する必要がある場合は、通常の HTML イベント ( createEventaddEventListenerおよびフレンド) または postMessageWeb API を使用してメッセージを渡すことができます。

リモート コードを他のページに直接ロードしようとしないでください。最悪の場合、ブラウザーにロードしようとしないでください。これは互換性とセキュリティ上の悪夢です。リモート コードのロードおよび/またはコードが特権コンテキストで実行するために適切にレビューされていないため、プラットフォームは、loadSubScript などを介してリモート ソース (http など) からそのようなスクリプトをロードすることを拒否します。

後で addons.mozilla.org でアドオンをホストし、特権コードにリモート スクリプトを含めたい場合、修正するまでアドオンは拒否されることに注意してください。また、アドオンガイドラインに従って、アドオンに既知のセキュリティ脆弱性があることが判明した場合、他の場所でホストしていても、mozilla はアドオンをブロックリストに登録することがあります。

于 2013-08-10T19:58:10.963 に答える