Changeset 229363 in webkit


Ignore:
Timestamp:
Mar 7, 2018 9:44:06 AM (6 years ago)
Author:
Yusuke Suzuki
Message:

HTML pattern attribute should set u flag for regular expressions
https://bugs.webkit.org/show_bug.cgi?id=151598

Reviewed by Chris Dumez.

Source/JavaScriptCore:

Add UnicodeMode for JSC::Yarr::RegularExpression.

  • yarr/RegularExpression.cpp:

(JSC::Yarr::RegularExpression::Private::create):
(JSC::Yarr::RegularExpression::Private::Private):
(JSC::Yarr::RegularExpression::Private::compile):
(JSC::Yarr::RegularExpression::RegularExpression):

  • yarr/RegularExpression.h:

Source/WebCore:

This patch attaches "u" flag to the RegExp compiled for HTML "pattern" attribute[1].

[1]: https://html.spec.whatwg.org/multipage/forms.html#the-pattern-attribute

  • html/BaseTextInputType.cpp:

(WebCore::BaseTextInputType::patternMismatch const):

LayoutTests:

  • fast/forms/ValidityState-patternMismatch-expected.txt:
  • fast/forms/ValidityState-patternMismatch.html:
Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r229361 r229363  
     12018-03-07  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        HTML `pattern` attribute should set `u` flag for regular expressions
     4        https://bugs.webkit.org/show_bug.cgi?id=151598
     5
     6        Reviewed by Chris Dumez.
     7
     8        * fast/forms/ValidityState-patternMismatch-expected.txt:
     9        * fast/forms/ValidityState-patternMismatch.html:
     10
    1112018-03-07  Frederic Wang  <fwang@igalia.com>
    212
  • trunk/LayoutTests/fast/forms/ValidityState-patternMismatch-expected.txt

    r149151 r229363  
    2929PASS patternMismatchFor("match-19") is false
    3030PASS patternMismatchFor("match-20") is false
     31PASS patternMismatchFor("match-21") is false
     32PASS patternMismatchFor("match-22") is false
    3133PASS patternMismatchFor("wrong-gray-or-grey") is true
    3234PASS patternMismatchFor("gray") is false
     
    5456PASS patternMismatchFor("mismatch-20") is true
    5557PASS patternMismatchFor("mismatch-21") is true
     58PASS patternMismatchFor("mismatch-22") is true
    5659PASS patternMismatchFor("empty-pattern-match") is false
    5760PASS patternMismatchFor("empty-pattern-mismatch") is true
     
    6265PASS patternMismatchFor("invalid-05") is false
    6366PASS patternMismatchFor("invalid-06") is false
     67PASS patternMismatchFor("invalid-07") is false
     68PASS patternMismatchFor("invalid-08") is false
    6469PASS patternMismatchFor("disabled") is false
    6570PASS successfullyParsed is true
  • trunk/LayoutTests/fast/forms/ValidityState-patternMismatch.html

    r155268 r229363  
    3333<input id="match-19" type="text" pattern="10|11|12|[0-9]" value="12" />
    3434<input id="match-20" type="text" pattern="f(o|e)\1" value="foo" />
     35<input id="match-21" type="text" pattern="a.b" value="a&#x1D306;b" />
     36<input id="match-22" type="text" pattern="a..b" value="a&#x1D306;b" />
    3537<input id="empty-pattern-match" type="text" pattern="" value="" />
    3638<input id="wrong-gray-or-grey" type="text" pattern="gr[ae]y" value="Wrong!"
     
    5860/><input id="mismatch-19" type="text" pattern="^" value="wrong"
    5961/><input id="mismatch-20" type="text" pattern="$" value="wrong"
    60 /><input id="mismatch-21" type="text" pattern="f(o|e)\1" value="foe"/>
     62/><input id="mismatch-21" type="text" pattern="f(o|e)\1" value="foe"
     63/><input id="mismatch-22" type="text" pattern="a...b" value="a&#x1D306;b" />
    6164
    6265<input id="invalid-01" type="text" pattern=")foo(" value="foo"/>
     
    6669<input id="invalid-05" type="text" pattern="[0-9" value="1"/>
    6770<input id="invalid-06" type="text" pattern="[0-9" value="a"/>
     71<input id="invalid-07" type="text" pattern="foo\'bar" value="foo'bar"/>
     72<input id="invalid-08" type="text" pattern="foo\'bar" value="foo"/>
    6873
    6974<input id="empty-pattern-mismatch" type="text" pattern="" value="Lorem Ipsum"
     
    102107shouldBeFalse('patternMismatchFor("match-19")');
    103108shouldBeFalse('patternMismatchFor("match-20")');
     109shouldBeFalse('patternMismatchFor("match-21")');
     110shouldBeFalse('patternMismatchFor("match-22")');
    104111
    105112shouldBeTrue('patternMismatchFor("wrong-gray-or-grey")');
     
    129136shouldBeTrue('patternMismatchFor("mismatch-20")');
    130137shouldBeTrue('patternMismatchFor("mismatch-21")');
     138shouldBeTrue('patternMismatchFor("mismatch-22")');
    131139
    132140shouldBeFalse('patternMismatchFor("empty-pattern-match")');
     
    139147shouldBeFalse('patternMismatchFor("invalid-05")');
    140148shouldBeFalse('patternMismatchFor("invalid-06")');
     149shouldBeFalse('patternMismatchFor("invalid-07")');
     150shouldBeFalse('patternMismatchFor("invalid-08")');
    141151
    142152shouldBeFalse('patternMismatchFor("disabled")');
  • trunk/Source/JavaScriptCore/ChangeLog

    r229362 r229363  
     12018-03-07  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        HTML `pattern` attribute should set `u` flag for regular expressions
     4        https://bugs.webkit.org/show_bug.cgi?id=151598
     5
     6        Reviewed by Chris Dumez.
     7
     8        Add UnicodeMode for JSC::Yarr::RegularExpression.
     9
     10        * yarr/RegularExpression.cpp:
     11        (JSC::Yarr::RegularExpression::Private::create):
     12        (JSC::Yarr::RegularExpression::Private::Private):
     13        (JSC::Yarr::RegularExpression::Private::compile):
     14        (JSC::Yarr::RegularExpression::RegularExpression):
     15        * yarr/RegularExpression.h:
     16
    1172018-03-07  Yusuke Suzuki  <utatane.tea@gmail.com>
    218
  • trunk/Source/JavaScriptCore/yarr/RegularExpression.cpp

    r226128 r229363  
    3838class RegularExpression::Private : public RefCounted<RegularExpression::Private> {
    3939public:
    40     static Ref<Private> create(const String& pattern, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode)
     40    static Ref<Private> create(const String& pattern, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode, UnicodeMode unicodeMode)
    4141    {
    42         return adoptRef(*new Private(pattern, caseSensitivity, multilineMode));
     42        return adoptRef(*new Private(pattern, caseSensitivity, multilineMode, unicodeMode));
    4343    }
    4444
     
    4949
    5050private:
    51     Private(const String& pattern, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode)
    52         : m_regExpByteCode(compile(pattern, caseSensitivity, multilineMode))
     51    Private(const String& pattern, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode, UnicodeMode unicodeMode)
     52        : m_regExpByteCode(compile(pattern, caseSensitivity, multilineMode, unicodeMode))
    5353    {
    5454    }
    5555
    56     std::unique_ptr<JSC::Yarr::BytecodePattern> compile(const String& patternString, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode)
     56    std::unique_ptr<JSC::Yarr::BytecodePattern> compile(const String& patternString, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode, UnicodeMode unicodeMode)
    5757    {
    5858        RegExpFlags flags = NoFlags;
     
    6363        if (multilineMode == MultilineEnabled)
    6464            flags = static_cast<RegExpFlags>(flags | FlagMultiline);
     65
     66        if (unicodeMode == UnicodeAwareMode)
     67            flags = static_cast<RegExpFlags>(flags | FlagUnicode);
    6568
    6669        JSC::Yarr::YarrPattern pattern(patternString, flags, m_constructionErrorCode);
     
    7982};
    8083
    81 RegularExpression::RegularExpression(const String& pattern, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode)
    82     : d(Private::create(pattern, caseSensitivity, multilineMode))
     84RegularExpression::RegularExpression(const String& pattern, TextCaseSensitivity caseSensitivity, MultilineMode multilineMode, UnicodeMode unicodeMode)
     85    : d(Private::create(pattern, caseSensitivity, multilineMode, unicodeMode))
    8386{
    8487}
  • trunk/Source/JavaScriptCore/yarr/RegularExpression.h

    r225117 r229363  
    3232enum MultilineMode { MultilineDisabled, MultilineEnabled };
    3333enum TextCaseSensitivity { TextCaseSensitive, TextCaseInsensitive };
     34enum UnicodeMode { UnicodeUnawareMode, UnicodeAwareMode };
    3435
    3536class JS_EXPORT_PRIVATE RegularExpression {
    3637    WTF_MAKE_FAST_ALLOCATED;
    3738public:
    38     explicit RegularExpression(const String&, TextCaseSensitivity = TextCaseSensitive, MultilineMode = MultilineDisabled);
     39    explicit RegularExpression(const String&, TextCaseSensitivity = TextCaseSensitive, MultilineMode = MultilineDisabled, UnicodeMode = UnicodeUnawareMode);
    3940    ~RegularExpression();
    4041
  • trunk/Source/WebCore/ChangeLog

    r229361 r229363  
     12018-03-07  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        HTML `pattern` attribute should set `u` flag for regular expressions
     4        https://bugs.webkit.org/show_bug.cgi?id=151598
     5
     6        Reviewed by Chris Dumez.
     7
     8        This patch attaches "u" flag to the RegExp compiled for HTML "pattern" attribute[1].
     9
     10        [1]: https://html.spec.whatwg.org/multipage/forms.html#the-pattern-attribute
     11
     12        * html/BaseTextInputType.cpp:
     13        (WebCore::BaseTextInputType::patternMismatch const):
     14
    1152018-03-07  Frederic Wang  <fwang@igalia.com>
    216
  • trunk/Source/WebCore/html/BaseTextInputType.cpp

    r228218 r229363  
    4040bool BaseTextInputType::patternMismatch(const String& value) const
    4141{
     42    // FIXME: We should execute RegExp parser first to check validity instead of creating an actual RegularExpression.
     43    // https://bugs.webkit.org/show_bug.cgi?id=183361
    4244    const AtomicString& rawPattern = element().attributeWithoutSynchronization(patternAttr);
    43     if (rawPattern.isNull() || value.isEmpty() || !JSC::Yarr::RegularExpression(rawPattern).isValid())
     45    if (rawPattern.isNull() || value.isEmpty() || !JSC::Yarr::RegularExpression(rawPattern, JSC::Yarr::TextCaseSensitive, JSC::Yarr::MultilineDisabled, JSC::Yarr::UnicodeAwareMode).isValid())
    4446        return false;
    4547    String pattern = "^(?:" + rawPattern + ")$";
    4648    int matchLength = 0;
    4749    int valueLength = value.length();
    48     int matchOffset = JSC::Yarr::RegularExpression(pattern).match(value, 0, &matchLength);
     50    int matchOffset = JSC::Yarr::RegularExpression(pattern, JSC::Yarr::TextCaseSensitive, JSC::Yarr::MultilineDisabled, JSC::Yarr::UnicodeAwareMode).match(value, 0, &matchLength);
    4951    return matchOffset || matchLength != valueLength;
    5052}
Note: See TracChangeset for help on using the changeset viewer.