 Issue 29366552:
  Issue 2879 - Make "view source" command work again  (Closed) 
  Base URL: https://hg.adblockplus.org/elemhidehelper
    
  
    Issue 29366552:
  Issue 2879 - Make "view source" command work again  (Closed) 
  Base URL: https://hg.adblockplus.org/elemhidehelper| Index: lib/aardvark.js | 
| =================================================================== | 
| --- a/lib/aardvark.js | 
| +++ b/lib/aardvark.js | 
| @@ -10,34 +10,60 @@ let {Prefs} = require("prefs"); | 
| let messageManager = Cc["@mozilla.org/parentprocessmessagemanager;1"] | 
| .getService(Ci.nsIMessageListenerManager) | 
| .QueryInterface(Ci.nsIMessageBroadcaster); | 
| // To be replaced when selection starts | 
| function E(id) {return null;} | 
| +messageManager.addMessageListener("ElemHideHelper:Response", | 
| + messageResponse); | 
| messageManager.addMessageListener("ElemHideHelper:SelectionStarted", | 
| selectionStarted); | 
| messageManager.addMessageListener("ElemHideHelper:SelectionSucceeded", | 
| selectionSucceeded); | 
| messageManager.addMessageListener("ElemHideHelper:SelectionStopped", | 
| selectionStopped); | 
| onShutdown.add(() => | 
| { | 
| + messageManager.removeMessageListener("ElemHideHelper:Response", | 
| + messageResponse); | 
| messageManager.removeMessageListener("ElemHideHelper:SelectionStarted", | 
| selectionStarted); | 
| messageManager.removeMessageListener("ElemHideHelper:SelectionSucceeded", | 
| selectionSucceeded); | 
| messageManager.removeMessageListener("ElemHideHelper:SelectionStopped", | 
| selectionStopped); | 
| selectionStopped(); | 
| }); | 
| +let maxMessageId = 0; | 
| +let messageCallbacks = new Map(); | 
| + | 
| +function sendMessageWithResponse(messageName, data, callback) | 
| +{ | 
| + if (!data) | 
| + data = {}; | 
| + data.messageId = ++maxMessageId; | 
| + messageCallbacks.set(data.messageId, callback); | 
| + messageManager.broadcastAsyncMessage(messageName, data); | 
| +} | 
| + | 
| +function messageResponse(message) | 
| +{ | 
| + let callback = messageCallbacks.get(message.data.messageId); | 
| + if (callback) | 
| + { | 
| + messageCallbacks.delete(message.data.messageId); | 
| + callback(message.data); | 
| + } | 
| +} | 
| + | 
| function selectionStarted(message) | 
| { | 
| Aardvark.selectionStarted(); | 
| } | 
| function selectionSucceeded(message) | 
| { | 
| Aardvark.selectionSucceeded(message.data); | 
| @@ -268,42 +294,43 @@ let Aardvark = exports.Aardvark = | 
| "lock", | 
| "quit", | 
| "blinkElement", | 
| "viewSource", | 
| "viewSourceWindow", | 
| "showMenu" | 
| ], | 
| - viewSource: function(elem) | 
| + viewSource: function() | 
| { | 
| - if (!elem) | 
| - return false; | 
| - | 
| - var sourceBox = E("ehh-viewsource"); | 
| + let sourceBox = E("ehh-viewsource"); | 
| if (sourceBox.state == "open") | 
| { | 
| sourceBox.hidePopup(); | 
| return true; | 
| } | 
| - sourceBox.hidePopup(); | 
| - | 
| - while (sourceBox.firstElementChild) | 
| - sourceBox.removeChild(sourceBox.firstElementChild); | 
| - this.getOuterHtmlFormatted(elem, sourceBox); | 
| - let anchor = this.window.document.documentElement; | 
| - let x = this.mouseX; | 
| - let y = this.mouseY; | 
| - this.viewSourceTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); | 
| - this.viewSourceTimer.initWithCallback(function() | 
| + sendMessageWithResponse("ElemHideHelper:SerializeSelected", null, data => | 
| { | 
| - sourceBox.showPopup(anchor, x, y, "tooltip", "topleft", "topleft"); | 
| - Aardvark.viewSourceTimer = null; | 
| - }, 500, Ci.nsITimer.TYPE_ONE_SHOT); | 
| + sourceBox.hidePopup(); | 
| + | 
| + while (sourceBox.firstElementChild) | 
| + sourceBox.removeChild(sourceBox.firstElementChild); | 
| + this.getOuterHtmlFormatted(data.serialized, sourceBox); | 
| + | 
| + let anchor = this.window.document.documentElement; | 
| + let x = this.mouseX; | 
| + let y = this.mouseY; | 
| + this.viewSourceTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); | 
| + this.viewSourceTimer.initWithCallback(function() | 
| + { | 
| + sourceBox.showPopup(anchor, x, y, "tooltip", "topleft", "topleft"); | 
| + Aardvark.viewSourceTimer = null; | 
| + }, 500, Ci.nsITimer.TYPE_ONE_SHOT); | 
| + }); | 
| return true; | 
| }, | 
| viewSourceWindow: function(elem) | 
| { | 
| if (!elem) | 
| return false; | 
| @@ -333,92 +360,73 @@ let Aardvark = exports.Aardvark = | 
| null, null, selection, "selection" | 
| ); | 
| } | 
| return true; | 
| }, | 
| getOuterHtmlFormatted: function(node, container) | 
| { | 
| - var type = null; | 
| - switch (node.nodeType) | 
| + let type = node.type; | 
| + if (type == "element") | 
| { | 
| - case node.ELEMENT_NODE: | 
| - var box = this.window.document.createElement("vbox"); | 
| - box.className = "elementBox"; | 
| - | 
| - var startTag = this.window.document.createElement("hbox"); | 
| - startTag.className = "elementStartTag"; | 
| - if (!node.firstChild) | 
| - startTag.className += " elementEndTag"; | 
| - | 
| - this.appendDescription(startTag, "<", null); | 
| - this.appendDescription(startTag, node.tagName, "tagName"); | 
| - | 
| - for (var i = 0; i < node.attributes.length; i++) | 
| - { | 
| - var attr = node.attributes[i]; | 
| - this.appendDescription(startTag, attr.name, "attrName"); | 
| - if (attr.value != "") | 
| - { | 
| - this.appendDescription(startTag, "=", null); | 
| - this.appendDescription(startTag, '"' + attr.value.replace(/"/, """) + '"', "attrValue"); | 
| - } | 
| - } | 
| + let box = this.window.document.createElement("vbox"); | 
| + box.className = "elementBox"; | 
| - this.appendDescription(startTag, node.firstChild ? ">" : " />", null); | 
| - box.appendChild(startTag); | 
| - | 
| - if (node.firstChild) | 
| - { | 
| - for (var child = node.firstChild; child; child = child.nextSibling) | 
| - this.getOuterHtmlFormatted(child, box); | 
| + let startTag = this.window.document.createElement("hbox"); | 
| + startTag.className = "elementStartTag"; | 
| + if (!node.children.length) | 
| + startTag.className += " elementEndTag"; | 
| - var endTag = this.window.document.createElement("hbox"); | 
| - endTag.className = "elementEndTag"; | 
| - this.appendDescription(endTag, "<", null); | 
| - this.appendDescription(endTag, "/" + node.tagName, "tagName"); | 
| - this.appendDescription(endTag, ">", null); | 
| - box.appendChild(endTag); | 
| - } | 
| - container.appendChild(box); | 
| - return; | 
| + this.appendDescription(startTag, "<", null); | 
| + this.appendDescription(startTag, node.tagName, "tagName"); | 
| - case node.TEXT_NODE: | 
| - type = "text"; | 
| - break; | 
| - case node.CDATA_SECTION_NODE: | 
| - type = "cdata"; | 
| - break; | 
| - case node.COMMENT_NODE: | 
| - type = "comment"; | 
| - break; | 
| - default: | 
| - return; | 
| + for (let {name, value} of node.attributes) | 
| + { | 
| + this.appendDescription(startTag, name, "attrName"); | 
| + if (value != "") | 
| + { | 
| + this.appendDescription(startTag, "=", null); | 
| + this.appendDescription(startTag, '"' + value.replace(/"/, """) + '"', "attrValue"); | 
| 
saroyanm
2016/12/05 17:51:47
Detail: exceeds 80 characters.
 
Wladimir Palant
2016/12/08 13:11:29
Done.
 | 
| + } | 
| + } | 
| + | 
| + this.appendDescription(startTag, node.children.length ? ">" : " />", null); | 
| + box.appendChild(startTag); | 
| + | 
| + if (node.children.length) | 
| + { | 
| + for (let child of node.children) | 
| + this.getOuterHtmlFormatted(child, box); | 
| + | 
| + let endTag = this.window.document.createElement("hbox"); | 
| + endTag.className = "elementEndTag"; | 
| + this.appendDescription(endTag, "<", null); | 
| + this.appendDescription(endTag, "/" + node.tagName, "tagName"); | 
| + this.appendDescription(endTag, ">", null); | 
| + box.appendChild(endTag); | 
| + } | 
| + container.appendChild(box); | 
| + return; | 
| } | 
| - var text = node.nodeValue.replace(/\r/g, '').replace(/^\s+/, '').replace(/\s+$/, ''); | 
| + let text = node.text.replace(/\r/g, "").trim(); | 
| if (text == "") | 
| return; | 
| - if (type != "cdata") | 
| - { | 
| - text = text.replace(/&/g, "&") | 
| - .replace(/</g, "<") | 
| - .replace(/>/g, ">"); | 
| - } | 
| - text = text.replace(/\t/g, " "); | 
| - if (type == "cdata") | 
| - text = "<![CDATA[" + text + "]]>"; | 
| - else if (type == "comment") | 
| + text = text.replace(/&/g, "&") | 
| + .replace(/</g, "<") | 
| + .replace(/>/g, ">") | 
| + .replace(/\t/g, " "); | 
| + if (type == "comment") | 
| text = "<!--" + text + "-->"; | 
| - var lines = text.split("\n"); | 
| - for (var i = 0; i < lines.length; i++) | 
| - this.appendDescription(container, lines[i].replace(/^\s+/, '').replace(/\s+$/, ''), type); | 
| + let lines = text.split("\n"); | 
| 
saroyanm
2016/12/05 17:51:47
detail: we can move this inside of for statement,
 
Wladimir Palant
2016/12/08 13:11:29
Done.
 | 
| + for (let line of lines) | 
| + this.appendDescription(container, line.trim(), type); | 
| }, | 
| showMenu: function() | 
| { | 
| var helpBox = E("ehh-helpbox"); | 
| if (helpBox.state == "open") | 
| { | 
| helpBox.hidePopup(); |