mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-23 23:57:31 +09:00
Check ScriptExtensions property of combining marks when available.
This commit is contained in:
parent
490fdb990a
commit
ce02714e1f
1 changed files with 34 additions and 3 deletions
|
|
@ -26,6 +26,7 @@
|
||||||
const bool kIDNA2008_TransitionalProcessing = false;
|
const bool kIDNA2008_TransitionalProcessing = false;
|
||||||
|
|
||||||
#include "ICUUtils.h"
|
#include "ICUUtils.h"
|
||||||
|
#include "unicode/uscript.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
using namespace mozilla::unicode;
|
using namespace mozilla::unicode;
|
||||||
|
|
@ -835,8 +836,8 @@ bool nsIDNService::isLabelSafe(const nsAString &label)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for mixed numbering systems
|
// Check for mixed numbering systems
|
||||||
if (GetGeneralCategory(ch) ==
|
auto genCat = GetGeneralCategory(ch);
|
||||||
HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) {
|
if (genCat == HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) {
|
||||||
uint32_t zeroCharacter = ch - GetNumericValue(ch);
|
uint32_t zeroCharacter = ch - GetNumericValue(ch);
|
||||||
if (savedNumberingSystem == 0) {
|
if (savedNumberingSystem == 0) {
|
||||||
// If we encounter a decimal number, save the zero character from that
|
// If we encounter a decimal number, save the zero character from that
|
||||||
|
|
@ -847,11 +848,41 @@ bool nsIDNService::isLabelSafe(const nsAString &label)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetGeneralCategory(ch) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) {
|
if (genCat == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) {
|
||||||
// Check for consecutive non-spacing marks
|
// Check for consecutive non-spacing marks
|
||||||
if (previousChar != 0 && previousChar == ch) {
|
if (previousChar != 0 && previousChar == ch) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// Check for marks whose expected script doesn't match the base script.
|
||||||
|
if (lastScript != Script::INVALID) {
|
||||||
|
const size_t kMaxScripts = 32; // more than ample for current values
|
||||||
|
// of ScriptExtensions property
|
||||||
|
UScriptCode scripts[kMaxScripts];
|
||||||
|
UErrorCode errorCode = U_ZERO_ERROR;
|
||||||
|
int nScripts = uscript_getScriptExtensions(ch, scripts, kMaxScripts,
|
||||||
|
&errorCode);
|
||||||
|
MOZ_ASSERT(U_SUCCESS(errorCode), "uscript_getScriptExtensions failed");
|
||||||
|
if (U_FAILURE(errorCode)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// nScripts will always be >= 1, because even for undefined characters
|
||||||
|
// uscript_getScriptExtensions will return Script::INVALID.
|
||||||
|
// If the mark just has script=COMMON or INHERITED, we can't check any
|
||||||
|
// more carefully, but if it has specific scriptExtension codes, then
|
||||||
|
// assume those are the only valid scripts to use it with.
|
||||||
|
if (nScripts > 1 ||
|
||||||
|
(Script(scripts[0]) != Script::COMMON &&
|
||||||
|
Script(scripts[0]) != Script::INHERITED)) {
|
||||||
|
while (--nScripts >= 0) {
|
||||||
|
if (Script(scripts[nScripts]) == lastScript) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nScripts == -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// Check for diacritics on dotless-i or dotless-j, which would be
|
// Check for diacritics on dotless-i or dotless-j, which would be
|
||||||
// indistinguishable from normal accented letter.
|
// indistinguishable from normal accented letter.
|
||||||
if ((baseChar == 0x0237 || baseChar == 0x0131) &&
|
if ((baseChar == 0x0237 || baseChar == 0x0131) &&
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue