зеркало из https://github.com/mozilla/gecko-dev.git
Bug 242729 Copy in the right-click menu in the DOM inspector nodeName/nodeValue doesn't work
patch by jason_barnabe@fastmail.fm r=timeless sr=neil
This commit is contained in:
Родитель
dda9c69abf
Коммит
1059b8a1d2
|
@ -392,6 +392,7 @@
|
|||
<field name="mClipboard">null</field>
|
||||
<field name="mClipboardData">null</field>
|
||||
<field name="mClipboardFlavor">null</field>
|
||||
<field name="mClipboardHelper">null</field>
|
||||
|
||||
<property name="clipboardFlavor" readonly="true"
|
||||
onget="return this.mClipboardFlavor"/>
|
||||
|
@ -408,25 +409,28 @@
|
|||
]]></getter>
|
||||
</property>
|
||||
|
||||
<property name="clipboardHelper" readonly="true">
|
||||
<getter>
|
||||
<![CDATA[
|
||||
if (!this.mClipboardHelper) {
|
||||
this.mClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"]
|
||||
.getService(Components.interfaces.nsIClipboardHelper);
|
||||
}
|
||||
return this.mClipboardHelper;
|
||||
]]></getter>
|
||||
</property>
|
||||
|
||||
<method name="setClipboardData">
|
||||
<parameter name="aObject"/>
|
||||
<parameter name="aFlavor"/>
|
||||
<parameter name="aTextRepresentation"/>
|
||||
<body><![CDATA[
|
||||
if (aFlavor == "text/unicode") {
|
||||
var iid = Components.interfaces.nsISupportsString;
|
||||
var cid = "@mozilla.org/supports-string;1";
|
||||
data = Components.classes[cid].createInstance(iid);
|
||||
data.data = aObject;
|
||||
|
||||
iid = Components.interfaces.nsITransferable;
|
||||
cid = "@mozilla.org/widget/transferable;1";
|
||||
var trans = Components.classes[cid].createInstance(iid);
|
||||
trans.setTransferData(aFlavor, data, aObject.length*2);
|
||||
|
||||
const clip = Components.interfaces.nsIClipboard.kGlobalClipboard;
|
||||
this.clipboard.setData(trans, null, clip);
|
||||
// put the text representation on the system clipboard
|
||||
if (aTextRepresentation) {
|
||||
this.clipboardHelper.copyString(aTextRepresentation);
|
||||
}
|
||||
|
||||
// store the real object internally
|
||||
this.mClipboardData = aObject;
|
||||
this.mClipboardFlavor = aFlavor;
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
*
|
||||
* Contributor(s):
|
||||
* Joe Hewitt <hewitt@netscape.com> (original author)
|
||||
* Jason Barnabe <jason_barnabe@fastmail.fm>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
|
@ -50,6 +51,13 @@ const kInspectorNSURI = "http://www.mozilla.org/inspector#";
|
|||
const kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
||||
const kHTMLNSURI = "http://www.w3.org/1999/xhtml";
|
||||
const nsITransactionManager = Components.interfaces.nsITransactionManager;
|
||||
var gEntityConverter;
|
||||
const kCharTable = {
|
||||
'&': "&",
|
||||
'<': "<",
|
||||
'>': ">",
|
||||
'"': """
|
||||
};
|
||||
|
||||
var InsUtil = {
|
||||
/******************************************************************************
|
||||
|
@ -87,6 +95,42 @@ var InsUtil = {
|
|||
document.persist(aId, attrs[i]);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/******************************************************************************
|
||||
* Convenience function for escaping HTML strings.
|
||||
*******************************************************************************/
|
||||
unicodeToEntity: function(text)
|
||||
{
|
||||
const entityVersion = Components.interfaces.nsIEntityConverter.entityW3C;
|
||||
|
||||
function charTableLookup(letter) {
|
||||
return kCharTable[letter];
|
||||
}
|
||||
|
||||
function convertEntity(letter) {
|
||||
try {
|
||||
return gEntityConverter.ConvertToEntity(letter, entityVersion);
|
||||
} catch (ex) {
|
||||
return letter;
|
||||
}
|
||||
}
|
||||
|
||||
if (!gEntityConverter) {
|
||||
try {
|
||||
gEntityConverter =
|
||||
Components.classes["@mozilla.org/intl/entityconverter;1"]
|
||||
.createInstance(Components.interfaces.nsIEntityConverter);
|
||||
} catch (ex) { }
|
||||
}
|
||||
|
||||
// replace chars in our charTable
|
||||
text = text.replace(/[<>&"]/g, charTableLookup);
|
||||
|
||||
// replace chars > 0x7f via nsIEntityConverter
|
||||
text = text.replace(/[^\0-\u007f]/g, convertEntity);
|
||||
|
||||
return text;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
*
|
||||
* Contributor(s):
|
||||
* Joe Hewitt <hewitt@netscape.com> (original author)
|
||||
* Jason Barnabe <jason_barnabe@fastmail.fm>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
|
@ -43,7 +44,6 @@
|
|||
//////////// global variables /////////////////////
|
||||
|
||||
var viewer;
|
||||
var gEntityConverter;
|
||||
|
||||
//////////// global constants ////////////////////
|
||||
|
||||
|
@ -383,7 +383,7 @@ DOMViewer.prototype =
|
|||
|
||||
for (i = 0; i < aNode.attributes.length; ++i) {
|
||||
var a = aNode.attributes[i];
|
||||
var attr = " " + a.localName + '="' + unicodeToEntity(a.nodeValue) + '"';
|
||||
var attr = " " + a.localName + '="' + InsUtil.unicodeToEntity(a.nodeValue) + '"';
|
||||
if (line.length + attr.length > 80) {
|
||||
s += line + (i < aNode.attributes.length-1 ? "\n"+attrIndent : "");
|
||||
line = "";
|
||||
|
@ -402,9 +402,9 @@ DOMViewer.prototype =
|
|||
s += indent + "</" + aNode.localName + ">\n";
|
||||
}
|
||||
} else if (aNode.nodeType == Node.TEXT_NODE) {
|
||||
s += unicodeToEntity(aNode.data);
|
||||
s += InsUtil.unicodeToEntity(aNode.data);
|
||||
} else if (aNode.nodeType == Node.COMMENT_NODE) {
|
||||
s += line + "<!--" + unicodeToEntity(aNode.data) + "-->\n";
|
||||
s += line + "<!--" + InsUtil.unicodeToEntity(aNode.data) + "-->\n";
|
||||
}
|
||||
|
||||
return s;
|
||||
|
@ -895,7 +895,6 @@ cmdEditCut.prototype =
|
|||
undoTransaction: function()
|
||||
{
|
||||
this.cmdDelete.undoTransaction();
|
||||
this.cmdCopy.undoTransaction();
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -903,8 +902,6 @@ function cmdEditCopy() {}
|
|||
cmdEditCopy.prototype =
|
||||
{
|
||||
copiedNode: null,
|
||||
previousData: null,
|
||||
previousFlavor: null,
|
||||
|
||||
// remove this line for bug 179621, Phase Three
|
||||
txnType: "standard",
|
||||
|
@ -912,7 +909,7 @@ cmdEditCopy.prototype =
|
|||
// required for nsITransaction
|
||||
QueryInterface: txnQueryInterface,
|
||||
merge: txnMerge,
|
||||
isTransient: false,
|
||||
isTransient: true,
|
||||
redoTransaction: txnRedoTransaction,
|
||||
|
||||
doTransaction: function()
|
||||
|
@ -922,18 +919,11 @@ cmdEditCopy.prototype =
|
|||
copiedNode = viewer.selectedNode;
|
||||
if (copiedNode) {
|
||||
this.copiedNode = copiedNode;
|
||||
this.previousData = viewer.pane.panelset.getClipboardData();
|
||||
this.previousFlavor = viewer.pane.panelset.clipboardFlavor;
|
||||
}
|
||||
} else
|
||||
copiedNode = this.copiedNode;
|
||||
|
||||
viewer.pane.panelset.setClipboardData(copiedNode, "inspector/dom-node");
|
||||
},
|
||||
|
||||
undoTransaction: function()
|
||||
{
|
||||
viewer.pane.panelset.setClipboardData(this.previousData, this.previousFlavor);
|
||||
viewer.pane.panelset.setClipboardData(copiedNode, "inspector/dom-node", null);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1034,45 +1024,3 @@ function dumpDOM2(aNode)
|
|||
{
|
||||
dump(DOMViewer.prototype.toXML(aNode));
|
||||
}
|
||||
|
||||
function unicodeToEntity(text)
|
||||
{
|
||||
const charTable = {
|
||||
'&': "&",
|
||||
'<': "<",
|
||||
'>': ">",
|
||||
'"': """
|
||||
};
|
||||
|
||||
function charTableLookup(letter) {
|
||||
return charTable[letter];
|
||||
}
|
||||
|
||||
function convertEntity(letter) {
|
||||
try {
|
||||
return gEntityConverter.ConvertToEntity(letter, entityVersion);
|
||||
} catch (ex) {
|
||||
return letter;
|
||||
}
|
||||
}
|
||||
|
||||
if (!gEntityConverter) {
|
||||
try {
|
||||
gEntityConverter =
|
||||
Components.classes["@mozilla.org/intl/entityconverter;1"]
|
||||
.createInstance(Components.interfaces.nsIEntityConverter);
|
||||
} catch (ex) { }
|
||||
}
|
||||
|
||||
const entityVersion = Components.interfaces.nsIEntityConverter.entityW3C;
|
||||
|
||||
var str = text;
|
||||
|
||||
// replace chars in our charTable
|
||||
str = str.replace(/[<>&"]/g, charTableLookup);
|
||||
|
||||
// replace chars > 0x7f via nsIEntityConverter
|
||||
str = str.replace(/[^\0-\u007f]/g, convertEntity);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
*
|
||||
* Contributor(s):
|
||||
* Joe Hewitt <hewitt@netscape.com> (original author)
|
||||
* Jason Barnabe <jason_barnabe@fastmail.fm>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
|
@ -227,7 +228,6 @@ cmdEditCut.prototype =
|
|||
undoCommand: function()
|
||||
{
|
||||
this.cmdDelete.undoCommand();
|
||||
this.cmdCopy.undoCommand();
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -235,8 +235,6 @@ function cmdEditCopy() {}
|
|||
cmdEditCopy.prototype =
|
||||
{
|
||||
copiedAttr: null,
|
||||
previousData: null,
|
||||
previousFlavor: null,
|
||||
|
||||
doCommand: function()
|
||||
{
|
||||
|
@ -246,18 +244,12 @@ cmdEditCopy.prototype =
|
|||
if (!copiedAttr)
|
||||
return true;
|
||||
this.copiedAttr = copiedAttr;
|
||||
this.previousData = viewer.pane.panelset.getClipboardData();
|
||||
this.previousFlavor = viewer.pane.panelset.clipboardFlavor;
|
||||
} else
|
||||
copiedAttr = this.copiedAttr;
|
||||
|
||||
viewer.pane.panelset.setClipboardData(copiedAttr, "inspector/dom-node");
|
||||
return false;
|
||||
},
|
||||
|
||||
undoCommand: function()
|
||||
{
|
||||
viewer.pane.panelset.setClipboardData(this.previousData, this.previousFlavor);
|
||||
var text = copiedAttr.nodeName + "=\"" + InsUtil.unicodeToEntity(copiedAttr.nodeValue) + "\"";
|
||||
viewer.pane.panelset.setClipboardData(copiedAttr, "inspector/dom-node", text);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче