1

Я хочу попытаться улучшить способ, которым консоль Firefox открывает диалоговые окна информации о сети. Я попробовал наложение:Как подключиться к всплывающей подсказке сети Firefox?

overlay chrome://browser/content/NetworkPanel.xhtml chrome://devtooltweaks/content/netWinOverlay.xul 

но он не работает. Я посмотрел в источнике, и the file выглядит так: нет кода для отображения элементов, другая форма должна его называть. Мне интересно, есть ли простой способ добавить функции в это всплывающее окно из расширения Firefox?

--Update--

Я нашел соответствующий код в NetworkPanel.jsm:

// Set the document object and update the content once the panel is loaded. 
    this.iframe.addEventListener("load", function onLoad() { 
    if (!self.iframe) { 
     return; 
    } 

    self.iframe.removeEventListener("load", onLoad, true); 
    self.update(); 
    }, true); 

К сожалению, это не похоже, есть ли простой способ для создания слушателя, как это из аддон код. Я пытался сделать магазин оригинал-функция и заменить трюк, он работает, но это, кажется, не называть исходную функцию в правильном контексте как-то:

<?xml version="1.0" encoding="utf-8"?> 
<overlay id="helloworldOverlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 
<script> 
var origOpenNetPanel = WebConsoleFrame.prototype.openNetworkPanel; 
WebConsoleFrame.prototype.openNetworkPanel = function WCF_openNetworkPanel(aNode, aHttpActivity) { 
    //Run the original, in its natural ('this') environment: 
    var netPanel = origOpenNetPanel.call(this, aNode, aHttpActivity); 
    //todo: add modification. 
    return netPanel; 
} 
</script> 
</overlay> 

^я первоначально пытался .call(WebConsoleFrame и .call(WebConsoleFrame.prototype. Обычно это должно работать, это может быть какое-то особое обстоятельство в коде хром?

Этот код выше работает с этой накладкой:

overlay chrome://browser/content/devtools/webconsole.xul chrome://devtooltweaks/content/netWinOverlay.xul 
+0

Вы не можете накладывать HTML-документы, этот механизм работает только для XUL. –

+0

@WladimirPalant Это имеет смысл. Интересно, есть ли хороший способ подключиться к функции открытия окна, называемой здесь. – NoBugs

ответ

0

Это работает! Он показывает довольно-печатный JSON в всплывающих окнах веб-консоли. К сожалению, если вы выберете текст JSON, выбор будет проходить повсеместно. (в Firefox 21). Я не уверен, что это лучшее решение, заменив функцию DevTools. Аддон доступен here.

WebConsoleFrame.prototype.origOpenNP = WebConsoleFrame.prototype.openNetworkPanel; 
WebConsoleFrame.prototype.openNetworkPanel = function WCF_openNetworkPanel(aNode, aHttpActivity) { 
    //Run the original, in its natural ('this') environment: 
    var netPanel = WebConsoleFrame.prototype.origOpenNP.call(
        this, aNode, aHttpActivity); 
    netPanel.iframe.addEventListener('load',function(event) { 
     //for(a in netPanel.iframe) {dump(a+"\n");} 
     var doc = event.originalTarget; 
     doc.body.style.backgroundColor='blue'; 
     var respDiv = doc.getElementById('responseBody'); 
     if (!respDiv) { 
      respDiv = doc.getElementById('responseBodyCached'); 
     } 
     if (respDiv) { 
      var a = doc.createElement('button'); 
      a.appendChild(doc.createTextNode('JSON')); 
      respDiv.childNodes[1].appendChild(a); 
      a.addEventListener('click',function() { 
       var fetch = doc.getElementById('responseBodyFetchLink'); 
       if (fetch) { 
        var evt = doc.createEvent("MouseEvents"); 
        evt.initMouseEvent("mousedown", true, true, doc.parentWindow, 
         0, 0, 0, 0, 0, false, false, false, false, 0, null); 
        fetch.dispatchEvent(evt); 
       } 
       for (let i=0; i<respDiv.children.length; i++) { 
        if (respDiv.children[i].nodeName == 'table') { 
         var resp = respDiv.children[i].textContent; 
         let obj = JSON.parse(resp); 
         let str = JSON.stringify(obj, undefined, 4); 
         respDiv.children[i].innerHTML = window.netWinTweak.syntaxHighlight(str); 
         break; 
        } 
       } 
      }); 
     } 
    },true); 

    return netPanel; 
} 

var netWinTweak = netWinTweak || {}; 
// From http://stackoverflow.com/questions/4810841/json-pretty-print-using-javascript 
netWinTweak.syntaxHighlight = function(json) { 
    json = json.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;'); 
    return '<style>pre {outline: 1px solid #ccc; padding: 5px; margin: 5px; }'+ 
'.string { color: green; }'+ 
'.number { color: darkorange; }'+ 
'.boolean { color: blue; }'+ 
'.null { color: magenta; }'+ 
'.key { color: red; } </style>'+ 
'<pre>'+json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) { 
     var cls = 'number'; 
     if (/^"/.test(match)) { 
      if (/:$/.test(match)) { 
       cls = 'key'; 
      } else { 
       cls = 'string'; 
      } 
     } else if (/true|false/.test(match)) { 
      cls = 'boolean'; 
     } else if (/null/.test(match)) { 
      cls = 'null'; 
     } 
     return '<span class="' + cls + '">' + match + '</span>'; 
    })+'</pre>'; 
} 
Смежные вопросы