Commit 01fd8522 authored by Kent Tamura's avatar Kent Tamura Committed by Commit Bot

XPath: Fix normalize-space()

It should handle only XML white spaces; #x20, #x9, #xD, and #xA.
We incorrectly handled other white spaces such as U+3000.

Bug: 893929
Change-Id: I59708f978ba1c23141f748de7a8f4c58d58c7acf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1974713
Commit-Queue: Daniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#726557}
parent 925f57c7
......@@ -583,13 +583,11 @@ Value FunStringLength::Evaluate(EvaluationContext& context) const {
}
Value FunNormalizeSpace::Evaluate(EvaluationContext& context) const {
if (!ArgCount()) {
String s = Value(context.node.Get()).ToString();
return s.SimplifyWhiteSpace();
}
String s = Arg(0)->Evaluate(context).ToString();
return s.SimplifyWhiteSpace();
// https://www.w3.org/TR/1999/REC-xpath-19991116/#function-normalize-space
String s =
(ArgCount() == 0 ? Value(context.node.Get()) : Arg(0)->Evaluate(context))
.ToString();
return s.SimplifyWhiteSpace(IsXMLSpace);
}
Value FunTranslate::Evaluate(EvaluationContext& context) const {
......
......@@ -84,5 +84,9 @@ bool IsValidContextNode(Node* node) {
return false;
}
bool IsXMLSpace(UChar ch) {
return ch <= 0x20 && (ch == 0x20 || ch == 0x09 || ch == 0x0D || ch == 0x0A);
}
} // namespace xpath
} // namespace blink
......@@ -28,6 +28,7 @@
#define THIRD_PARTY_BLINK_RENDERER_CORE_XML_XPATH_UTIL_H_
#include "third_party/blink/renderer/platform/wtf/forward.h"
#include "third_party/blink/renderer/platform/wtf/text/unicode.h"
namespace blink {
......@@ -45,6 +46,9 @@ String StringValue(Node*);
// @return whether the given node is a valid context node
bool IsValidContextNode(Node*);
// https://www.w3.org/TR/REC-xml/#NT-S
bool IsXMLSpace(UChar ch);
} // namespace xpath
} // namespace blink
......
<!DOCTYPE html>
<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-normalize-space">
<link rel="help" href="https://www.w3.org/TR/xpath-functions-31/#func-normalize-space">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<div id="target"> a <br> b</div>
<script>
function normalizeSpace(exp) {
return document.evaluate(`normalize-space("${exp}")`, document).stringValue;
}
test(() => {
assert_equals(document.evaluate('normalize-space()', document.querySelector('#target')).stringValue, 'a b');
}, 'normalize-space() without arguments');
test(() => {
assert_equals(normalizeSpace(' a \t b\r\nc '), 'a b c');
assert_equals(normalizeSpace('y\x0B\x0C\x0E\x0Fz'), 'y\x0b\x0c\x0e\x0fz');
assert_equals(normalizeSpace('\xA0 \u3000'), '\xA0 \u3000');
}, 'normalize-space() should handle only #x20, #x9, #xD, and #xA');
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment