Bug 598289 - Unable to paste CF_HTML from clipboard if StartHTML/EndHTML is -1. r=ehsan
This commit is contained in:
@@ -139,7 +139,8 @@ static NS_DEFINE_CID(kCParserCID, NS_PARSER_CID);
|
|||||||
#define NS_FOUND_TARGET NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_EDITOR, 3)
|
#define NS_FOUND_TARGET NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_EDITOR, 3)
|
||||||
|
|
||||||
// some little helpers
|
// some little helpers
|
||||||
static PRInt32 FindPositiveIntegerAfterString(const char *aLeadingString, nsCString &aCStr);
|
static PRBool FindIntegerAfterString(const char *aLeadingString,
|
||||||
|
nsCString &aCStr, PRInt32 &foundNumber);
|
||||||
static nsresult RemoveFragComments(nsCString &theStr);
|
static nsresult RemoveFragComments(nsCString &theStr);
|
||||||
static void RemoveBodyAndHead(nsIDOMNode *aNode);
|
static void RemoveBodyAndHead(nsIDOMNode *aNode);
|
||||||
static nsresult FindTargetNode(nsIDOMNode *aStart, nsCOMPtr<nsIDOMNode> &aResult);
|
static nsresult FindTargetNode(nsIDOMNode *aStart, nsCOMPtr<nsIDOMNode> &aResult);
|
||||||
@@ -1149,22 +1150,24 @@ NS_IMETHODIMP nsHTMLEditor::PrepareHTMLTransferable(nsITransferable **aTransfera
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
PRInt32
|
PRBool
|
||||||
FindPositiveIntegerAfterString(const char *aLeadingString, nsCString &aCStr)
|
FindIntegerAfterString(const char *aLeadingString,
|
||||||
|
nsCString &aCStr, PRInt32 &foundNumber)
|
||||||
{
|
{
|
||||||
// first obtain offsets from cfhtml str
|
// first obtain offsets from cfhtml str
|
||||||
PRInt32 numFront = aCStr.Find(aLeadingString);
|
PRInt32 numFront = aCStr.Find(aLeadingString);
|
||||||
if (numFront == -1)
|
if (numFront == -1)
|
||||||
return -1;
|
return PR_FALSE;
|
||||||
numFront += strlen(aLeadingString);
|
numFront += strlen(aLeadingString);
|
||||||
|
|
||||||
PRInt32 numBack = aCStr.FindCharInSet(CRLF, numFront);
|
PRInt32 numBack = aCStr.FindCharInSet(CRLF, numFront);
|
||||||
if (numBack == -1)
|
if (numBack == -1)
|
||||||
return -1;
|
return PR_FALSE;
|
||||||
|
|
||||||
nsCAutoString numStr(Substring(aCStr, numFront, numBack-numFront));
|
nsCAutoString numStr(Substring(aCStr, numFront, numBack-numFront));
|
||||||
PRInt32 errorCode;
|
PRInt32 errorCode;
|
||||||
return numStr.ToInteger(&errorCode);
|
foundNumber = numStr.ToInteger(&errorCode);
|
||||||
|
return PR_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
@@ -1191,14 +1194,36 @@ RemoveFragComments(nsCString & aStr)
|
|||||||
nsresult
|
nsresult
|
||||||
nsHTMLEditor::ParseCFHTML(nsCString & aCfhtml, PRUnichar **aStuffToPaste, PRUnichar **aCfcontext)
|
nsHTMLEditor::ParseCFHTML(nsCString & aCfhtml, PRUnichar **aStuffToPaste, PRUnichar **aCfcontext)
|
||||||
{
|
{
|
||||||
// first obtain offsets from cfhtml str
|
// First obtain offsets from cfhtml str.
|
||||||
PRInt32 startHTML = FindPositiveIntegerAfterString("StartHTML:", aCfhtml);
|
PRInt32 startHTML, endHTML, startFragment, endFragment;
|
||||||
PRInt32 endHTML = FindPositiveIntegerAfterString("EndHTML:", aCfhtml);
|
if (!FindIntegerAfterString("StartHTML:", aCfhtml, startHTML) ||
|
||||||
PRInt32 startFragment = FindPositiveIntegerAfterString("StartFragment:", aCfhtml);
|
startHTML < -1)
|
||||||
PRInt32 endFragment = FindPositiveIntegerAfterString("EndFragment:", aCfhtml);
|
|
||||||
|
|
||||||
if ((startHTML<0) || (endHTML<0) || (startFragment<0) || (endFragment<0))
|
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
|
if (!FindIntegerAfterString("EndHTML:", aCfhtml, endHTML) ||
|
||||||
|
endHTML < -1)
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
if (!FindIntegerAfterString("StartFragment:", aCfhtml, startFragment) ||
|
||||||
|
startFragment < 0)
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
if (!FindIntegerAfterString("EndFragment:", aCfhtml, endFragment) ||
|
||||||
|
startFragment < 0)
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
// The StartHTML and EndHTML markers are allowed to be -1 to include everything.
|
||||||
|
// See Reference: MSDN doc entitled "HTML Clipboard Format"
|
||||||
|
// http://msdn.microsoft.com/en-us/library/aa767917(VS.85).aspx#unknown_854
|
||||||
|
if (startHTML == -1) {
|
||||||
|
startHTML = aCfhtml.Find("<!--StartFragment-->");
|
||||||
|
if (startHTML == -1)
|
||||||
|
return PR_FALSE;
|
||||||
|
}
|
||||||
|
if (endHTML == -1) {
|
||||||
|
const char endFragmentMarker[] = "<!--EndFragment-->";
|
||||||
|
endHTML = aCfhtml.Find(endFragmentMarker);
|
||||||
|
if (endHTML == -1)
|
||||||
|
return PR_FALSE;
|
||||||
|
endHTML += NS_ARRAY_LENGTH(endFragmentMarker) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
// create context string
|
// create context string
|
||||||
nsCAutoString contextUTF8(Substring(aCfhtml, startHTML, startFragment - startHTML) +
|
nsCAutoString contextUTF8(Substring(aCfhtml, startHTML, startFragment - startHTML) +
|
||||||
|
|||||||
Reference in New Issue
Block a user