Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: lib/aardvark.js

Issue 29366552: Issue 2879 - Make "view source" command work again (Closed) Base URL: https://hg.adblockplus.org/elemhidehelper
Patch Set: Created Dec. 1, 2016, 10:49 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | lib/child/commands.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(/"/, "&quot;") + '"', "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(/"/, "&quot;") + '"', "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, "&amp;")
- .replace(/</g, "&lt;")
- .replace(/>/g, "&gt;");
- }
- text = text.replace(/\t/g, " ");
- if (type == "cdata")
- text = "<![CDATA[" + text + "]]>";
- else if (type == "comment")
+ text = text.replace(/&/g, "&amp;")
+ .replace(/</g, "&lt;")
+ .replace(/>/g, "&gt;")
+ .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();
« no previous file with comments | « no previous file | lib/child/commands.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld