2015-03-13 200 views
1

我們有一個遺留的Web應用程序。在不同的地方,它會在Firefox上的Privilege Manager的幫助下打開一個窗口,以獲得所需的結果。 其中一些窗口打開Java小程序或PDF文檔。 客戶端計算機正在更新Firefox,並且特權管理器不見了。HTML瞬態模態窗口

最簡單的方法是什麼? 的問題是:

  1. 必須有隻有一個人時彈出的實例。這可以通過在window.open()呼叫上選擇適當的窗口名稱來完成。

  2. 如果再次打開窗口(通過用戶操作),它不應該重新加載,而只是集中將它放到前臺(我已經看到我可以保留對JavaScript的引用來做到這一點)

  3. 它基本上必須是臨時的/模態的,這樣客戶端才能在不關閉子窗口的情況下不離開當前頁面或重新加載或與父窗口進行任何其他類型的交互(除了打開/重新對焦子窗口)。我不知道該怎麼做。

有沒有人有一個想法如何做到這一點?

在Linux上,客戶端只是Firefox(它在特殊的信息亭配置中工作)。

我讀了一些地方,我可以以某種方式寫一個擴展名,但我基本上無法知道擴展和它的API。

EDIT1:

的(簡化的)遺留碼爲例。不確定是否需要所有權限,但是這是它:此函數打開一個窗口,該窗口保留在父窗口之上,並阻止用戶與父窗口進行任何交互。

function fWindowOpen(url, name) { 
    netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); 
    netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite"); 
    netscape.security.PrivilegeManager 
      .enablePrivilege("CapabilityPreferencesAccess"); 
    netscape.security.PrivilegeManager 
      .enablePrivilege("UniversalPreferencesWrite"); 
    netscape.security.PrivilegeManager 
      .enablePrivilege("UniversalPreferencesRead"); 
    netscape.security.PrivilegeManager.enablePrivilege("UniversalFileRead"); 
    netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 
    window.open(
     url, 
     name, 
     "screenX=70,dependent=yes,menubar=0,toolbar=0,width=900,height=700,modal=1,dialog=1" 
     ); 
} 

function fnCapture(){ 
    fWindowOpen("/path/to/document_or_japplet/page","_blank");      
} 

HTML:

<button value="Capture" property="btnCapture" onclick="javascript:fnCapture();"/> 

EDIT2:溶液

在典型的擴展,在第XUL代碼,定義該JavaScript代碼:

var dialogExt = { 
listener: function(evt) { 
    // Do work with parameters read through evt.target.getAttribute("attribute_name") 
    window.openDialog(evt.target.getAttribute("url"), evt.target.getAttribute("name"), evt.target.getAttribute("features")); 
} 
} 
// from examples 
document.addEventListener("dialogExtEvent", function(e){ dialogExt.listener(e); }, false, true); 

然後,在網絡上頁碼:

var element = document.createElement("dialogExtElement"); 
element.setAttribute("url", url); 
element.setAttribute("name", name); 
element.setAttribute("features", features); 
document.documentElement.appendChild(element); 
var evt = document.createEvent("Events"); 
evt.initEvent("dialogExtEvent", true, false); 
element.dispatchEvent(evt); 

現在,也許我錯過了一些安全檢查,以便代碼在源自同一主機的情況下可以正常工作,以及如何處理對話框窗口與對話窗口之間的交互方式以請求對話框的文檔的引用。

+0

你能發表一箇舊代碼在做什麼的例子嗎?並且會在模態對話框可以接受的情況下自動關閉失焦? – the8472 2015-03-13 17:33:59

+0

我已經添加了一個簡化的遺留代碼示例。不知道失去焦點時自動關閉。我想如果他在孩子窗口上做了一些工作,這可能會成爲用戶的一個謎,但對我來說這似乎是一個可行的妥協。一個實際的瞬態/模式窗口將是更可取的,但如果我知道如何使用擴展完成它以及如何在html文檔/ javascript和擴展之間進行交互。 – dabicho 2015-03-13 18:23:39

+0

您是否真的需要**新窗口來模擬Firefox *的全部內容,或者只是您所在的頁面/您控制的頁面?如果您只能爲您所在的頁面或您控制的網頁使用模式,則不需要提升特權。如果它只是您控制的頁面的模式,那麼可以使用普通的非特權JavaScript來完成。 – Makyen 2015-03-13 20:36:26

回答

2

Privilege Managerdeprecated in Firefox 12 and removed in Firefox 17briefly restored)。您可能需要查看Window.showModalDialog()。但是,它已被淘汰,預計將在一年內消失,或者在2016年使用Firefox 38的擴展服務版本(ESR)。在開發擴展時,這可能是一個臨時解決方案。

爲了完成同樣的任務,你需要編寫一個擴展,並要求用戶安裝它(從Bypassing Security Restrictions and Signing Code,有關權限管理器中的舊信息):需要額外的權限

場所應現在要求Firefox用戶安裝一個extension,如果需要的話,它可以是interact with non-privileged pages

它可以寫出這樣使用任何三種不同擴展類型的擴展:

  1. XUL overlay
  2. Restartless/Bootstrap
  3. Add-on SDK

對於前兩種類型,你會使用window.open()modal選項在"Features requiring privileges"。你可能也想看看Window.openDialog()

對於附加SDK,您通常會在SDK的window/utils模塊中使用open()函數。在這裏,再一次,你可能會想看看openDialog()

看來您可能會打開這些模式窗口中從網絡提供的內容。您不太可能會獲得批准在AMO上託管的擴展程序,該擴展程序會在未包含在附加發行版中的此類窗口中打開內容。這並不意味着您無法開發擴展並將其安裝在自助終端客戶端上,而無需將其託管在AMO上。但是,今年Firefox的開發還存在其他限制,這會使得這個問題變得更加困難,請參閱:"Introducing Extension Signing: A Safer Add-on Experience"

+0

謝謝。沒有擔心在什麼地方託管擴展。它不會通過互聯網使用,而只能在私人網絡中使用。這些quioscs隨瀏覽器配置而來。但很高興知道。謝謝你們的簽名。我們用java處理類似的情況。我希望它不會太麻煩。 – dabicho 2015-03-13 22:35:02

+0

非常感謝。中途在那裏。我仍然需要將「打開」對話框的窗口中的引用傳遞給子窗口。 – dabicho 2015-03-18 00:07:45

1

您應該能夠看到類似window.open的行爲,包括對sdk的window/utils模塊的modal選項的支持。

您將不得不安裝onclick監聽器並使用content script,通過其端口向addon-main發送消息,然後從addon main打開該窗口。

+0

謝謝。我正在閱讀。 – dabicho 2015-03-13 20:16:48