簡體   English   中英

從Firefox擴展中調用NPAPI插件功能

[英]Invoking NPAPI plugin functionality from Firefox extension

我已經編寫了一個NPAPI插件,該插件實現了所需的所有邏輯,現在我正在編寫一個擴展程序,該擴展程序應使用該插件中提供的功能。 這種架構為我提供了為Mozilla Firefox和Google Chrome編寫相同的C ++代碼的機會。

在Chrome中,我通過將<embed ...>結構寫入擴展名所擁有的單獨文檔中來實例化插件中定義的對象(它自動提供給Chrome插件)。 那行得通。 在C ++代碼中,我執行了插件對象的構造函數中所需的所有工作。

我無法輕松地使解決方案適應Firefox中的使用,因為該擴展名沒有任何單獨的文檔支持,並且該擴展名沒有寫任何已經呈現的文檔的權限。

最常見的形式是我的主要問題是如何多次使用插件提供的功能,並在用戶單擊按鈕或在下拉菜單中選擇我的條目時將參數列表傳遞給本機函數(即使用參數應在特定事件之后而不是僅在任意時間調用)?

“補充”問題是:

如何在Mozilla Firefox中實例化插件? 我在哪里可以得到FF“解釋”的文檔,以便該擴展名可以寫入該文檔?

我自己不知道該怎么做,但這是一個開源的Firefox擴展,可以做到這一點: https : //github.com/kylehuff/webpg-firefox

您的Firefox擴展程序需要使用“ 瀏覽器覆蓋 ”。 對於瀏覽器的各個部分,有多種類型的疊加層,它們會在chrome.manifest文件中定義的指定文檔內加載(疊加)。

例如,以下內容將覆蓋層應用於“ browser.xul”文件(這是瀏覽器主窗口)

overlay     chrome://browser/content/browser.xul            content/firefoxOverlay.xul

現在,在該覆蓋文件中,您可以加載插件對象並調用插件提供的方法。

這是一個示例XUL文件,除了加載內容類型為“ application / x-example-plugin”的NPAPI插件,並將該插件對象分配給變量“ myPlugin”外,它沒有做其他事情

<script type="text/javascript">
    myPlugin = document.getElementById("myPlugin");
</script>
<?xml version="1.0" encoding="UTF-8"?>
<overlay id="myOverlay" xmlns:html="http://www.w3.org/1999/xhtml" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <script type="text/javascript">
        myPlugin = document.getElementById("myPlugin");
        alert(myPlugin.someFunction());
    </scrpit>
    <window id="main-window">
        <vbox collapsed="true">
            <html:object id="myPlugin" type="application/x-example-plugin" height="1" width="1" style="visibility:hidden;"></html:object>
        </vbox>
    </window>
</overlay>

一些重要的注意事項

  1. “ xmlns:html = ...”聲明很關鍵,因為插件對象正在html:object中加載,並且該聲明告訴XUL解析器如何呈現該對象。
  2. 窗口的ID(“主窗口”)很重要,因為這是XUL解析器將覆蓋項目的方式(在“主”窗口內)
  3. 對象ID(在此示例中為“ myPlugin”)是您稍后如何通過JavaScript引用插件對象的方式。
  4. 因為我們不顯示插件的內容,而只是調用其提供的公共方法,所以使CSS可見性“隱藏”且大小為1x1像素非常重要。 如果不這樣做,最終可能會在瀏覽器UI中呈現大量空白。 此外,使用CSS的“可見性”屬性而不是 “顯示”屬性也很重要。 如果將display屬性設置為“ none”,則實際在疊加層中初始化插件時會遇到問題。
  5. 在擴展install.rdf文件中,必須將“ unpack”屬性指定為“ true”,即: <em:unpack>true</em:unpack>

一旦您的疊加層在瀏覽器XUL的上下文中加載,並且插件在主瀏覽器窗口中初始化,您就可以在主窗口范圍內通過將變量分配給您的變量來引用插件(在此,“ myPlugin”例)。

我不會在這里深入了解如何獲取主窗口的上下文(請參閱下面的鏈接),但是一旦有了引用,就可以從內容腳本,側邊欄,工具欄等中調用公開的方法。

參考鏈接-

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM