2011-10-21 13 views
1

私はこれを行うために5つの方法を集めましたが、いずれもパネル内では機能しません。 Firefoxは、基本的なタスクへのアクセスをブロックするのに驚くほど効果的です。Firefox Addonパネル内から現在のURLを取得

  • 試み1:

    var url = window.top.getBrowser().selectedBrowser.contentWindow.location.href; 
    

    エラー:window.top.getBrowserは関数ではありません

  • 試み2:

    をここで

    は、私が試したものです

    var url = window.content.document.location; 
    

    エラー:許可プロパティにアクセスするために拒否された '文書'

  • 試み3:

    var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
           .getInterface(Components.interfaces.nsIWebNavigation) 
           .QueryInterface(Components.interfaces.nsIDocShellTreeItem) 
           .rootTreeItem 
           .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
           .getInterface(Components.interfaces.nsIDOMWindow); 
    var url = mainWindow.getBrowser().selectedBrowser.contentWindow.location.href; 
    

    エラー:

    var url = window.content.location.href; 
    
    :クラスUnnamedClass

  • 試み4のオブジェクトのラッパーを作成する権限拒否

    エラー:プロパティ 'href'へのアクセスが拒否されました

  • 試み5:

    var currentWindow = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow("navigator:browser"); 
    var currBrowser = currentWindow.getBrowser(); 
    var url = currBrowser.currentURI.spec; 
    

    エラー:クロームのためにこれをコーディングプロパティXPCComponents.classes

を取得するために拒否されたアクセス許可が風でした。なぜこれがFFのためにとても厳しいのか分かりません。

誰でも解決策がありますか?

+0

https://developer.mozilla.org/en/Code_snippets/Tabbed_browser&uは 'alert' URLにしてみてくださいでした? – linguini

+1

エラーメッセージは、特権のないコードを実行していることを示しています(通常、試行3が正しい方法です)。特権を持たないコードは、ブラウザのユーザーインターフェイスの期間にアクセスすることはできません。このコードをどのように実行しているのかを説明すると、誰かが特権を持たない理由を教えてくれるかもしれません。 –

答えて

1

「Firefox Addonパネル」は、Addon SDKのpanelモジュールを指していると思いますか?

もしそうなら、おそらくcontent scriptでこれらのスニペットを使用しようとしています。代わりに、メインのアドオンのコード(example)にイベントを送信する必要があり、主アドオンのコードでtabs module使用:

require("tabs").activeTab.url 

私の作品[更新]完全なテストケース、:

// http://stackoverflow.com/questions/7856282/get-current-url-from-within-a-firefox-addon-panel 
exports.main = function() { 
    var panel = require("panel").Panel({ 
    contentURL: "data:text/html,<input type=button value='click me' id='b'>", 
    contentScript: "document.getElementById('b').onclick = " + 
        "function() {" + 
        " self.port.emit('myEvent');" + 
        "}" 
    }); 
    panel.port.on("myEvent", function() { 
    console.log(require("tabs").activeTab.url) 
    }) 
    require("widget").Widget({ 
    id: "my-panel", 
    contentURL: "http://www.google.com/favicon.ico", 
    label: "Test Widget", 
    panel: panel 
    }); 
}; 
+0

はい、Panelモジュールを指します。しかし、あなたが提供した行は、たとえ私がメインのアドオンのコードに置いても、content-proxy.jsファイルに関連するエラーを引き起こします。現在のURLを取得するためにどのように使用するかを正確に表示できますか? –

+0

@ChrisKohout:「エラーのスルー」についてより具体的にすると、今あなたに答えるのを助けることができます。それがなければ、アドオンビルダーでコードを試す必要があります(後で)。 – Nickolay

+0

@ChrisKohout:更新された回答を参照 – Nickolay

2

私はあなたがFirefoxのローカルオブジェクトを使用することができると思う:

var url = gBrowser.contentDocument.location; 
関連する問題