Bug 598289 - Unable to paste CF_HTML from clipboard if StartHTML/EndHTML is -1. r=ehsan

This commit is contained in:
Brian R. Bondy
2011-09-21 13:22:53 -04:00
parent 8501d68732
commit 065844a717

View File

@@ -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) +