From e4a493a90c10c4b9e92ec1bde6090ce0dcfb25f9 Mon Sep 17 00:00:00 2001 From: Masayuki Nakano Date: Mon, 25 Feb 2019 03:30:50 +0000 Subject: [PATCH] Bug 1529190 - Make `execCommand("createLink")` and `execCommand("insertImage")` aware of URL including non-ASCII characters r=m_kato `InsertTagCommand::DoCommandParams()` inserts given URL to `href` of `` or `src` of ``. However, it treats the given URL includes only ASCII characters. Therefore, we cannot insert URL including non-ASCII characters with `execCommand("createLink")` nor `execCommand("insertImage")`. This patch makes `nsHTMLDocument::ExecCommand()` set the param as `nsString` and makes `InsertTagCommand::DoCommandParams()` retrieve it with `GetString()`. Differential Revision: https://phabricator.services.mozilla.com/D20615 --HG-- extra : moz-landing-system : lando --- dom/html/nsHTMLDocument.cpp | 4 +++- editor/libeditor/HTMLEditorCommands.cpp | 18 +++++------------- .../tests/editing/data/createlink.js | 9 +++++++-- .../tests/editing/data/insertimage.js | 7 ++++++- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/dom/html/nsHTMLDocument.cpp b/dom/html/nsHTMLDocument.cpp index a47368bc3730..ba747aafd384 100644 --- a/dom/html/nsHTMLDocument.cpp +++ b/dom/html/nsHTMLDocument.cpp @@ -2855,7 +2855,9 @@ bool nsHTMLDocument::ExecCommand(const nsAString& commandID, bool doShowUI, RefPtr params = new nsCommandParams(); if (isBool) { rv = params->SetBool("state_attribute", boolVal); - } else if (cmdToDispatch.EqualsLiteral("cmd_fontFace")) { + } else if (cmdToDispatch.EqualsLiteral("cmd_fontFace") || + cmdToDispatch.EqualsLiteral("cmd_insertImageNoUI") || + cmdToDispatch.EqualsLiteral("cmd_insertLinkNoUI")) { rv = params->SetString("state_attribute", value); } else if (cmdToDispatch.EqualsLiteral("cmd_insertHTML") || cmdToDispatch.EqualsLiteral("cmd_insertText")) { diff --git a/editor/libeditor/HTMLEditorCommands.cpp b/editor/libeditor/HTMLEditorCommands.cpp index 6cef0f27bc12..345f3aab584f 100644 --- a/editor/libeditor/HTMLEditorCommands.cpp +++ b/editor/libeditor/HTMLEditorCommands.cpp @@ -1404,19 +1404,11 @@ InsertTagCommand::DoCommandParams(const char* aCommandName, return NS_ERROR_FAILURE; } - // Don't use nsAutoCString here because nsCommandParams stores c-string member - // with nsCString*. Therefore, nsAutoCString always needs to copy the storage - // but nsCString may avoid it. - // TODO: This does not aware of URL which includes non-ASCII characters. - // A follow up bug will fix this. - nsCString asciiValue; - // do we have an href to use for creating link? - nsresult rv = - aParams->AsCommandParams()->GetCString(STATE_ATTRIBUTE, asciiValue); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - NS_ConvertASCIItoUTF16 value(asciiValue); + // Don't use nsAutoString here because nsCommandParams stores string member + // with nsString*. Therefore, nsAutoString always needs to copy the storage + // but nsString may avoid it. + nsString value; + nsresult rv = aParams->AsCommandParams()->GetString(STATE_ATTRIBUTE, value); if (NS_WARN_IF(value.IsEmpty())) { return NS_ERROR_INVALID_ARG; } diff --git a/testing/web-platform/tests/editing/data/createlink.js b/testing/web-platform/tests/editing/data/createlink.js index 87e59d281e5a..10734d950bb8 100644 --- a/testing/web-platform/tests/editing/data/createlink.js +++ b/testing/web-platform/tests/editing/data/createlink.js @@ -239,5 +239,10 @@ var browserTests = [ [["createlink",""]], "foo[bar]baz", [false], - {"createlink":[false,false,"",false,false,""]}] -] + {"createlink":[false,false,"",false,false,""]}], +["foo[bar]baz", + [["createlink","http://www.google.com/\u65E5\u672C\u8A9E\u30D1\u30B9"]], + "foo[bar]baz", + [true], + {"createlink":[false,false,"",false,false,""]}], +] \ No newline at end of file diff --git a/testing/web-platform/tests/editing/data/insertimage.js b/testing/web-platform/tests/editing/data/insertimage.js index c2e26cb56d46..b18388a7971d 100644 --- a/testing/web-platform/tests/editing/data/insertimage.js +++ b/testing/web-platform/tests/editing/data/insertimage.js @@ -349,5 +349,10 @@ var browserTests = [ [["insertimage","/img/lion.svg"]], "
foo

bar{}baz

", [true], - {"insertimage":[false,false,"",false,false,""]}] + {"insertimage":[false,false,"",false,false,""]}], +["foo[]bar", + [["insertimage","/\u65E5\u672C\u8A9E\u30D1\u30B9/lion.svg"]], + "foo{}bar", + [true], + {"insertimage":[false,false,"",false,false,""]}], ]