Changeset 176902 in webkit


Ignore:
Timestamp:
Dec 5, 2014 9:09:11 PM (9 years ago)
Author:
commit-queue@webkit.org
Message:

Implement parser for :lang pseudo class selector arguments that contain wildcard '*' subtags
https://bugs.webkit.org/show_bug.cgi?id=139014

Patch by Dhi Aurrahman <diorahman@rockybars.com> on 2014-12-05
Reviewed by Benjamin Poulain.

Source/WebCore:

Consider each language range in :lang() that consists of an asterisk
immediately followed by an identifier beginning with an ASCII hyphen
as a valid input for the selector as specified in [1].

[1] http://dev.w3.org/csswg/selectors4/#the-lang-pseudo

Test: fast/css/parsing-css-lang.html

  • css/CSSGrammar.y.in:
  • css/CSSParser.cpp:

(WebCore::CSSParser::realLex):

LayoutTests:

  • fast/css/css-selector-text-expected.txt: Updated for asterisk containing input.
  • fast/css/css-selector-text.html: Updated for asterisk containing input.
  • fast/css/parsing-css-lang-expected.txt: Added.
  • fast/css/parsing-css-lang.html: Added.
Location:
trunk
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r176864 r176902  
     12014-12-05  Dhi Aurrahman  <diorahman@rockybars.com>
     2
     3        Implement parser for :lang pseudo class selector arguments that contain wildcard '*' subtags
     4        https://bugs.webkit.org/show_bug.cgi?id=139014
     5
     6        Reviewed by Benjamin Poulain.
     7
     8        * fast/css/css-selector-text-expected.txt: Updated for asterisk containing input.
     9        * fast/css/css-selector-text.html: Updated for asterisk containing input.
     10        * fast/css/parsing-css-lang-expected.txt: Added.
     11        * fast/css/parsing-css-lang.html: Added.
     12
    1132014-12-05  Benjamin Poulain  <bpoulain@apple.com>
    214
  • trunk/LayoutTests/fast/css/css-selector-text-expected.txt

    r176545 r176902  
    4747PASS parseThenSerializeRule(':target { }') is ':target { }'
    4848PASS parseThenSerializeRule(':visited { }') is ':visited { }'
     49
     50PASS parseThenSerializeRule(':lang(*-) { }') is ':lang(*-) { }'
     51PASS parseThenSerializeRule(':lang(*--) { }') is ':lang(*--) { }'
     52PASS parseThenSerializeRule(':lang(*---) { }') is ':lang(*---) { }'
     53PASS parseThenSerializeRule(':lang(*----) { }') is ':lang(*----) { }'
     54
     55PASS parseThenSerializeRule(':lang(*-ab) { }') is ':lang(*-ab) { }'
     56PASS parseThenSerializeRule(':lang(*-ab-) { }') is ':lang(*-ab-) { }'
     57PASS parseThenSerializeRule(':lang(*-1996) { }') is ':lang(*-1996) { }'
     58PASS parseThenSerializeRule(':lang(*-DE-1996) { }') is ':lang(*-DE-1996) { }'
    4959
    5060PASS parseThenSerializeRule(':lang(a) { }') is ':lang(a) { }'
     
    295305PASS parseThenSerializeRule(':lang(    en,en,en    ) { }') is ':lang(en, en, en) { }'
    296306
     307PASS parseThenSerializeRule(':lang(*-DE, *-CH, *-EN) { }') is ':lang(*-DE, *-CH, *-EN) { }'
     308PASS parseThenSerializeRule(':lang(*-DE,*-CH,*-EN) { }') is ':lang(*-DE, *-CH, *-EN) { }'
     309PASS parseThenSerializeRule(':lang(   *-DE  ,  *-CH  ,  *-EN  ) { }') is ':lang(*-DE, *-CH, *-EN) { }'
     310
     311PASS parseThenSerializeRule(':lang(\\*) { }') is ':lang(*) { }'
     312PASS parseThenSerializeRule(':lang(*-\\*) { }') is ':lang(*-*) { }'
     313PASS parseThenSerializeRule(':lang(*-\\*-\\*) { }') is ':lang(*-*-*) { }'
     314PASS parseThenSerializeRule(':lang(*-\\*-\\*-\\*) { }') is ':lang(*-*-*-*) { }'
     315
     316PASS parseThenSerializeRule(':lang(ab-\\*) { }') is ':lang(ab-*) { }'
     317PASS parseThenSerializeRule(':lang(*-ab-\\*) { }') is ':lang(*-ab-*) { }'
     318PASS parseThenSerializeRule(':lang(*-ab-\\*-) { }') is ':lang(*-ab-*-) { }'
     319PASS parseThenSerializeRule(':lang(*-foo-\\3A) { }') is ':lang(*-foo-:) { }'
     320PASS parseThenSerializeRule(':lang(*-foo-\\3A\\`\\)) { }') is ':lang(*-foo-:`)) { }'
     321PASS parseThenSerializeRule(':lang(*-foo-\\*) { }') is ':lang(*-foo-*) { }'
     322PASS parseThenSerializeRule(':lang(*-foo-\\0072 aisin) { }') is ':lang(*-foo-raisin) { }'
     323PASS parseThenSerializeRule(':lang(*-foo-\\0062 \\0061 r) { }') is ':lang(*-foo-bar) { }'
     324PASS parseThenSerializeRule(':lang(*-foo-col\\6Fr) { }') is ':lang(*-foo-color) { }'
     325
     326PASS parseThenSerializeRule(':lang(\\*    ) { }') is ':lang(*) { }'
     327PASS parseThenSerializeRule(':lang(*-    ) { }') is ':lang(*-) { }'
     328PASS parseThenSerializeRule(':lang(*-en    ) { }') is ':lang(*-en) { }'
     329PASS parseThenSerializeRule(':lang(*-en-\\*    ) { }') is ':lang(*-en-*) { }'
     330PASS parseThenSerializeRule(':lang(*-en-\\*-fr    ) { }') is ':lang(*-en-*-fr) { }'
     331PASS parseThenSerializeRule(':lang(*-en-\\*-fr,br    ) { }') is ':lang(*-en-*-fr, br) { }'
     332PASS parseThenSerializeRule(':lang(*-en-\\*-fr, br    ) { }') is ':lang(*-en-*-fr, br) { }'
     333PASS parseThenSerializeRule(':lang(*-en-\\*-fr,   br    ) { }') is ':lang(*-en-*-fr, br) { }'
     334PASS parseThenSerializeRule(':lang(  *-en-\\*-fr,   br    ) { }') is ':lang(*-en-*-fr, br) { }'
     335PASS parseThenSerializeRule(':lang(    *-en-\\*-fr,   br    ) { }') is ':lang(*-en-*-fr, br) { }'
     336PASS parseThenSerializeRule(':lang(    *-en-\\*-fr  ,   br    ) { }') is ':lang(*-en-*-fr, br) { }'
     337PASS parseThenSerializeRule(':lang(*-en-\\*-fr,*-br-zh    ) { }') is ':lang(*-en-*-fr, *-br-zh) { }'
     338PASS parseThenSerializeRule(':lang(*-en-\\*-fr, *-br-zh    ) { }') is ':lang(*-en-*-fr, *-br-zh) { }'
     339PASS parseThenSerializeRule(':lang(*-en-\\*-fr,   *-br-zh    ) { }') is ':lang(*-en-*-fr, *-br-zh) { }'
     340PASS parseThenSerializeRule(':lang(*-en-\\*-fr,     *-br-zh    ) { }') is ':lang(*-en-*-fr, *-br-zh) { }'
     341PASS parseThenSerializeRule(':lang(*-en-\\*-fr,       *-br-zh    ) { }') is ':lang(*-en-*-fr, *-br-zh) { }'
     342
     343PASS parseThenSerializeRule(':lang(*-en-\\*-fr,br-\\*-zh    ) { }') is ':lang(*-en-*-fr, br-*-zh) { }'
     344PASS parseThenSerializeRule(':lang(*-en-\\*-fr, br-\\*-zh    ) { }') is ':lang(*-en-*-fr, br-*-zh) { }'
     345PASS parseThenSerializeRule(':lang(*-en-\\*-fr,   br-\\*-zh    ) { }') is ':lang(*-en-*-fr, br-*-zh) { }'
     346PASS parseThenSerializeRule(':lang(*-en-\\*-fr,      br-\\*-zh    ) { }') is ':lang(*-en-*-fr, br-*-zh) { }'
     347PASS parseThenSerializeRule(':lang(  *-en-\\*-fr,      br-\\*-zh    ) { }') is ':lang(*-en-*-fr, br-*-zh) { }'
     348PASS parseThenSerializeRule(':lang(  *-en-\\*-fr ,      br-\\*-zh    ) { }') is ':lang(*-en-*-fr, br-*-zh) { }'
     349PASS parseThenSerializeRule(':lang(  *-en-\\*-fr  ,      br-\\*-zh    ) { }') is ':lang(*-en-*-fr, br-*-zh) { }'
     350
     351PASS parseThenSerializeRule(':lang(\\*) { }') is ':lang(*) { }'
     352PASS parseThenSerializeRule(':lang(\\* ) { }') is ':lang(*) { }'
     353PASS parseThenSerializeRule(':lang(\\*   ) { }') is ':lang(*) { }'
     354PASS parseThenSerializeRule(':lang( \\*   ) { }') is ':lang(*) { }'
     355PASS parseThenSerializeRule(':lang(  \\*) { }') is ':lang(*) { }'
     356PASS parseThenSerializeRule(':lang(   \\*   ) { }') is ':lang(*) { }'
     357
     358PASS parseThenSerializeRule(':lang(   \\*,id-\\*-sumatra   ) { }') is ':lang(*, id-*-sumatra) { }'
     359PASS parseThenSerializeRule(':lang(   \\* ,id-\\*-sumatra) { }') is ':lang(*, id-*-sumatra) { }'
     360PASS parseThenSerializeRule(':lang(   \\*  ,  id-\\*-sumatra  ) { }') is ':lang(*, id-*-sumatra) { }'
     361PASS parseThenSerializeRule(':lang(   \\*   ,    id-\\*-sumatra  ) { }') is ':lang(*, id-*-sumatra) { }'
     362
     363PASS parseThenSerializeRule(':lang(*-1996) { }') is ':lang(*-1996) { }'
     364PASS parseThenSerializeRule(':lang(*-1996, *-1997) { }') is ':lang(*-1996, *-1997) { }'
     365PASS parseThenSerializeRule(':lang(*-1996, *-1997 ) { }') is ':lang(*-1996, *-1997) { }'
     366PASS parseThenSerializeRule(':lang(   *-1996   ,  *-1997   ) { }') is ':lang(*-1996, *-1997) { }'
     367PASS parseThenSerializeRule(':lang(   *-1996   ,*-1997   ) { }') is ':lang(*-1996, *-1997) { }'
     368PASS parseThenSerializeRule(':lang(   *-1996,*-1997   ) { }') is ':lang(*-1996, *-1997) { }'
     369
     370PASS parseThenSerializeRule(':lang(en-\\*) { }') is ':lang(en-*) { }'
     371PASS parseThenSerializeRule(':lang(en-\\*, fr-\\*) { }') is ':lang(en-*, fr-*) { }'
     372PASS parseThenSerializeRule(':lang(en-\\*, fr-\\* ) { }') is ':lang(en-*, fr-*) { }'
     373PASS parseThenSerializeRule(':lang(   en-\\*   ,  fr-\\*   ) { }') is ':lang(en-*, fr-*) { }'
     374PASS parseThenSerializeRule(':lang(   en-\\*   ,fr-\\*   ) { }') is ':lang(en-*, fr-*) { }'
     375PASS parseThenSerializeRule(':lang(   en-\\*,fr-\\*   ) { }') is ':lang(en-*, fr-*) { }'
     376
    297377PASS parseThenSerializeRule(':lang() { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
    298378PASS parseThenSerializeRule(':lang(12, b, c) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     
    317397PASS parseThenSerializeRule(':lang([]) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
    318398PASS parseThenSerializeRule(':lang(@media screen {}) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     399PASS parseThenSerializeRule(':lang(*)') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     400PASS parseThenSerializeRule(':lang(**)') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     401PASS parseThenSerializeRule(':lang(-*-)') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     402PASS parseThenSerializeRule(':lang(*-*) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     403PASS parseThenSerializeRule(':lang(de-*)') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     404PASS parseThenSerializeRule(':lang(*-en-*) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     405PASS parseThenSerializeRule(':lang(*-en-fr-*) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     406PASS parseThenSerializeRule(':lang(*-en-*fr) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     407PASS parseThenSerializeRule(':lang(*-*en-fr) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     408PASS parseThenSerializeRule(':lang(*-1997)') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     409PASS parseThenSerializeRule(':lang(*-1997-*)') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     410PASS parseThenSerializeRule(':lang(*a*) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     411PASS parseThenSerializeRule(':lang(*a) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     412PASS parseThenSerializeRule(':lang(a*) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     413PASS parseThenSerializeRule(':lang(*-a, a*) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     414PASS parseThenSerializeRule(':lang(*-a, a**) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     415PASS parseThenSerializeRule(':lang(*-a, *a) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     416PASS parseThenSerializeRule(':lang(*-a, **a) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     417PASS parseThenSerializeRule(':lang(*- a*) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     418PASS parseThenSerializeRule(':lang(*-a, br fr) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     419PASS parseThenSerializeRule(':lang(*-a, br fr en *) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
    319420
    320421PASS parseThenSerializeRule(':role(a) { }') is ':role(a) { }'
  • trunk/LayoutTests/fast/css/css-selector-text.html

    r176545 r176902  
    8181debug('');
    8282
     83testSelectorRoundTrip(":lang(*-)");
     84testSelectorRoundTrip(":lang(*--)");
     85testSelectorRoundTrip(":lang(*---)");
     86testSelectorRoundTrip(":lang(*----)");
     87
     88debug('');
     89
     90testSelectorRoundTrip(":lang(*-ab)");
     91testSelectorRoundTrip(":lang(*-ab-)");
     92testSelectorRoundTrip(":lang(*-1996)");
     93testSelectorRoundTrip(":lang(*-DE-1996)");
     94
     95debug('');
     96
    8397testSelectorRoundTrip(":lang(a)");
    8498testSelectorRoundTrip(":lang(a, b, c)");
     
    89103testSelectorRoundTrip(":lang(de-DE, de-DE-1996, de-Latn-DE, de-Latf-DE, de-Latn-DE-1996, de-CH, it-CH, fr-CH, rm-CH)");
    90104
    91 debug('')
     105debug('');
    92106
    93107testSelectorRoundTrip(":lang(a, a, a)");
     
    376390debug('');
    377391
     392shouldBe("parseThenSerializeRule(':lang(*-DE, *-CH, *-EN) { }')", "':lang(*-DE, *-CH, *-EN) { }'");
     393shouldBe("parseThenSerializeRule(':lang(*-DE,*-CH,*-EN) { }')", "':lang(*-DE, *-CH, *-EN) { }'");
     394shouldBe("parseThenSerializeRule(':lang(   *-DE  ,  *-CH  ,  *-EN  ) { }')", "':lang(*-DE, *-CH, *-EN) { }'");
     395
     396debug('');
     397
     398shouldBe("parseThenSerializeRule(':lang(\\\\*) { }')", "':lang(*) { }'");
     399shouldBe("parseThenSerializeRule(':lang(*-\\\\*) { }')", "':lang(*-*) { }'");
     400shouldBe("parseThenSerializeRule(':lang(*-\\\\*-\\\\*) { }')", "':lang(*-*-*) { }'");
     401shouldBe("parseThenSerializeRule(':lang(*-\\\\*-\\\\*-\\\\*) { }')", "':lang(*-*-*-*) { }'");
     402
     403debug('');
     404
     405shouldBe("parseThenSerializeRule(':lang(ab-\\\\*) { }')", "':lang(ab-*) { }'");
     406shouldBe("parseThenSerializeRule(':lang(*-ab-\\\\*) { }')", "':lang(*-ab-*) { }'");
     407shouldBe("parseThenSerializeRule(':lang(*-ab-\\\\*-) { }')", "':lang(*-ab-*-) { }'");
     408
     409shouldBe("parseThenSerializeRule(':lang(*-foo-\\\\3A) { }')", "':lang(*-foo-:) { }'");
     410shouldBe("parseThenSerializeRule(':lang(*-foo-\\\\3A\\\\`\\\\)) { }')", "':lang(*-foo-:`)) { }'");
     411shouldBe("parseThenSerializeRule(':lang(*-foo-\\\\*) { }')", "':lang(*-foo-*) { }'");
     412
     413shouldBe("parseThenSerializeRule(':lang(*-foo-\\\\0072 aisin) { }')", "':lang(*-foo-raisin) { }'");
     414shouldBe("parseThenSerializeRule(':lang(*-foo-\\\\0062 \\\\0061 r) { }')", "':lang(*-foo-bar) { }'");
     415shouldBe("parseThenSerializeRule(':lang(*-foo-col\\\\6Fr) { }')", "':lang(*-foo-color) { }'");
     416
     417debug('');
     418
     419shouldBe("parseThenSerializeRule(':lang(\\\\*    ) { }')", "':lang(*) { }'");
     420shouldBe("parseThenSerializeRule(':lang(*-    ) { }')", "':lang(*-) { }'");
     421shouldBe("parseThenSerializeRule(':lang(*-en    ) { }')", "':lang(*-en) { }'");
     422shouldBe("parseThenSerializeRule(':lang(*-en-\\\\*    ) { }')", "':lang(*-en-*) { }'");
     423shouldBe("parseThenSerializeRule(':lang(*-en-\\\\*-fr    ) { }')", "':lang(*-en-*-fr) { }'");
     424shouldBe("parseThenSerializeRule(':lang(*-en-\\\\*-fr,br    ) { }')", "':lang(*-en-*-fr, br) { }'");
     425shouldBe("parseThenSerializeRule(':lang(*-en-\\\\*-fr, br    ) { }')", "':lang(*-en-*-fr, br) { }'");
     426shouldBe("parseThenSerializeRule(':lang(*-en-\\\\*-fr,   br    ) { }')", "':lang(*-en-*-fr, br) { }'");
     427shouldBe("parseThenSerializeRule(':lang(  *-en-\\\\*-fr,   br    ) { }')", "':lang(*-en-*-fr, br) { }'");
     428shouldBe("parseThenSerializeRule(':lang(    *-en-\\\\*-fr,   br    ) { }')", "':lang(*-en-*-fr, br) { }'");
     429shouldBe("parseThenSerializeRule(':lang(    *-en-\\\\*-fr  ,   br    ) { }')", "':lang(*-en-*-fr, br) { }'");
     430shouldBe("parseThenSerializeRule(':lang(*-en-\\\\*-fr,*-br-zh    ) { }')", "':lang(*-en-*-fr, *-br-zh) { }'");
     431shouldBe("parseThenSerializeRule(':lang(*-en-\\\\*-fr, *-br-zh    ) { }')", "':lang(*-en-*-fr, *-br-zh) { }'");
     432shouldBe("parseThenSerializeRule(':lang(*-en-\\\\*-fr,   *-br-zh    ) { }')", "':lang(*-en-*-fr, *-br-zh) { }'");
     433shouldBe("parseThenSerializeRule(':lang(*-en-\\\\*-fr,     *-br-zh    ) { }')", "':lang(*-en-*-fr, *-br-zh) { }'");
     434shouldBe("parseThenSerializeRule(':lang(*-en-\\\\*-fr,       *-br-zh    ) { }')", "':lang(*-en-*-fr, *-br-zh) { }'");
     435
     436debug('');
     437
     438shouldBe("parseThenSerializeRule(':lang(*-en-\\\\*-fr,br-\\\\*-zh    ) { }')", "':lang(*-en-*-fr, br-*-zh) { }'");
     439shouldBe("parseThenSerializeRule(':lang(*-en-\\\\*-fr, br-\\\\*-zh    ) { }')", "':lang(*-en-*-fr, br-*-zh) { }'");
     440shouldBe("parseThenSerializeRule(':lang(*-en-\\\\*-fr,   br-\\\\*-zh    ) { }')", "':lang(*-en-*-fr, br-*-zh) { }'");
     441shouldBe("parseThenSerializeRule(':lang(*-en-\\\\*-fr,      br-\\\\*-zh    ) { }')", "':lang(*-en-*-fr, br-*-zh) { }'");
     442shouldBe("parseThenSerializeRule(':lang(  *-en-\\\\*-fr,      br-\\\\*-zh    ) { }')", "':lang(*-en-*-fr, br-*-zh) { }'");
     443shouldBe("parseThenSerializeRule(':lang(  *-en-\\\\*-fr ,      br-\\\\*-zh    ) { }')", "':lang(*-en-*-fr, br-*-zh) { }'");
     444shouldBe("parseThenSerializeRule(':lang(  *-en-\\\\*-fr  ,      br-\\\\*-zh    ) { }')", "':lang(*-en-*-fr, br-*-zh) { }'");
     445
     446debug('');
     447
     448shouldBe("parseThenSerializeRule(':lang(\\\\*) { }')", "':lang(*) { }'");
     449shouldBe("parseThenSerializeRule(':lang(\\\\* ) { }')", "':lang(*) { }'");
     450shouldBe("parseThenSerializeRule(':lang(\\\\*   ) { }')", "':lang(*) { }'");
     451shouldBe("parseThenSerializeRule(':lang( \\\\*   ) { }')", "':lang(*) { }'");
     452shouldBe("parseThenSerializeRule(':lang(  \\\\*) { }')", "':lang(*) { }'");
     453shouldBe("parseThenSerializeRule(':lang(   \\\\*   ) { }')", "':lang(*) { }'");
     454
     455debug('');
     456
     457shouldBe("parseThenSerializeRule(':lang(   \\\\*,id-\\\\*-sumatra   ) { }')", "':lang(*, id-*-sumatra) { }'");
     458shouldBe("parseThenSerializeRule(':lang(   \\\\* ,id-\\\\*-sumatra) { }')", "':lang(*, id-*-sumatra) { }'");
     459shouldBe("parseThenSerializeRule(':lang(   \\\\*  ,  id-\\\\*-sumatra  ) { }')", "':lang(*, id-*-sumatra) { }'");
     460shouldBe("parseThenSerializeRule(':lang(   \\\\*   ,    id-\\\\*-sumatra  ) { }')", "':lang(*, id-*-sumatra) { }'");
     461
     462debug('');
     463
     464shouldBe("parseThenSerializeRule(':lang(*-1996) { }')", "':lang(*-1996) { }'");
     465shouldBe("parseThenSerializeRule(':lang(*-1996, *-1997) { }')", "':lang(*-1996, *-1997) { }'");
     466shouldBe("parseThenSerializeRule(':lang(*-1996, *-1997 ) { }')", "':lang(*-1996, *-1997) { }'");
     467shouldBe("parseThenSerializeRule(':lang(   *-1996   ,  *-1997   ) { }')", "':lang(*-1996, *-1997) { }'");
     468shouldBe("parseThenSerializeRule(':lang(   *-1996   ,*-1997   ) { }')", "':lang(*-1996, *-1997) { }'");
     469shouldBe("parseThenSerializeRule(':lang(   *-1996,*-1997   ) { }')", "':lang(*-1996, *-1997) { }'");
     470
     471debug('');
     472
     473shouldBe("parseThenSerializeRule(':lang(en-\\\\*) { }')", "':lang(en-*) { }'");
     474shouldBe("parseThenSerializeRule(':lang(en-\\\\*, fr-\\\\*) { }')", "':lang(en-*, fr-*) { }'");
     475shouldBe("parseThenSerializeRule(':lang(en-\\\\*, fr-\\\\* ) { }')", "':lang(en-*, fr-*) { }'");
     476shouldBe("parseThenSerializeRule(':lang(   en-\\\\*   ,  fr-\\\\*   ) { }')", "':lang(en-*, fr-*) { }'");
     477shouldBe("parseThenSerializeRule(':lang(   en-\\\\*   ,fr-\\\\*   ) { }')", "':lang(en-*, fr-*) { }'");
     478shouldBe("parseThenSerializeRule(':lang(   en-\\\\*,fr-\\\\*   ) { }')", "':lang(en-*, fr-*) { }'");
     479
     480debug('');
     481
    378482shouldThrow("parseThenSerializeRule(':lang() { }')");
    379483shouldThrow("parseThenSerializeRule(':lang(12, b, c) { }')");
     
    399503shouldThrow("parseThenSerializeRule(':lang(@media screen {}) { }')");
    400504
     505shouldThrow("parseThenSerializeRule(':lang(*)')");
     506shouldThrow("parseThenSerializeRule(':lang(**)')");
     507shouldThrow("parseThenSerializeRule(':lang(-*-)')");
     508shouldThrow("parseThenSerializeRule(':lang(*-*) { }')");
     509shouldThrow("parseThenSerializeRule(':lang(de-*)')");
     510shouldThrow("parseThenSerializeRule(':lang(*-en-*) { }')");
     511shouldThrow("parseThenSerializeRule(':lang(*-en-fr-*) { }')");
     512shouldThrow("parseThenSerializeRule(':lang(*-en-*fr) { }')");
     513shouldThrow("parseThenSerializeRule(':lang(*-*en-fr) { }')");
     514shouldThrow("parseThenSerializeRule(':lang(*-1997)')");
     515shouldThrow("parseThenSerializeRule(':lang(*-1997-*)')");
     516shouldThrow("parseThenSerializeRule(':lang(*a*) { }')");
     517shouldThrow("parseThenSerializeRule(':lang(*a) { }')");
     518shouldThrow("parseThenSerializeRule(':lang(a*) { }')");
     519shouldThrow("parseThenSerializeRule(':lang(*-a, a*) { }')");
     520shouldThrow("parseThenSerializeRule(':lang(*-a, a**) { }')");
     521shouldThrow("parseThenSerializeRule(':lang(*-a, *a) { }')");
     522shouldThrow("parseThenSerializeRule(':lang(*-a, **a) { }')");
     523shouldThrow("parseThenSerializeRule(':lang(*- a*) { }')");
     524shouldThrow("parseThenSerializeRule(':lang(*-a, br fr) { }')");
     525shouldThrow("parseThenSerializeRule(':lang(*-a, br fr en *) { }')");
     526
    401527debug('');
    402528
  • trunk/Source/WebCore/ChangeLog

    r176899 r176902  
     12014-12-05  Dhi Aurrahman  <diorahman@rockybars.com>
     2
     3        Implement parser for :lang pseudo class selector arguments that contain wildcard '*' subtags
     4        https://bugs.webkit.org/show_bug.cgi?id=139014
     5
     6        Reviewed by Benjamin Poulain.
     7
     8        Consider each language range in :lang() that consists of an asterisk
     9        immediately followed by an identifier beginning with an ASCII hyphen
     10        as a valid input for the selector as specified in [1].
     11
     12        [1] http://dev.w3.org/csswg/selectors4/#the-lang-pseudo
     13
     14        Test: fast/css/parsing-css-lang.html
     15
     16        * css/CSSGrammar.y.in:
     17        * css/CSSParser.cpp:
     18        (WebCore::CSSParser::realLex):
     19
    1202014-12-05  Simon Fraser  <simon.fraser@apple.com>
    221
  • trunk/Source/WebCore/css/CSSGrammar.y.in

    r176545 r176902  
    235235#if ENABLE_CSS_SELECTORS_LEVEL4
    236236%token <string> DIRFUNCTION
     237%token <string> LANGRANGE
    237238%token <string> LANGFUNCTION
    238239%token <string> ROLEFUNCTION
     
    336337
    337338#if ENABLE_CSS_SELECTORS_LEVEL4
     339%type <string> lang_range
    338340%union { Vector<CSSParserString>* stringList; }
    339 %type <stringList> comma_separated_identifiers
    340 %destructor { delete $$; } comma_separated_identifiers
     341%type <stringList> comma_separated_lang_ranges
     342%destructor { delete $$; } comma_separated_lang_ranges
    341343#endif
    342344
     
    11031105
    11041106#if ENABLE_CSS_SELECTORS_LEVEL4
    1105 comma_separated_identifiers:
    1106     IDENT %prec UNIMPORTANT_TOK {
     1107lang_range: LANGRANGE | IDENT
     1108
     1109comma_separated_lang_ranges:
     1110    lang_range %prec UNIMPORTANT_TOK {
    11071111        $$ = new Vector<CSSParserString>;
    11081112        $$->append($1);
    11091113    }
    1110     | comma_separated_identifiers maybe_space ',' maybe_space IDENT %prec UNIMPORTANT_TOK {
     1114    | comma_separated_lang_ranges maybe_space ',' maybe_space lang_range %prec UNIMPORTANT_TOK {
    11111115        $$ = $1;
    11121116        if ($$)
    11131117            $1->append($5);
    11141118    }
    1115     | comma_separated_identifiers error {
     1119    | comma_separated_lang_ranges error {
    11161120        $$ = nullptr;
    11171121        delete $1;
     
    13891393    }
    13901394
    1391     | ':' LANGFUNCTION maybe_space comma_separated_identifiers maybe_space ')' {
     1395    | ':' LANGFUNCTION maybe_space comma_separated_lang_ranges maybe_space ')' {
    13921396        $$ = nullptr;
    13931397        if ($4) {
  • trunk/Source/WebCore/css/CSSParser.cpp

    r176722 r176902  
    1148711487            ++currentCharacter<SrcCharacterType>();
    1148811488            m_token = CONTAINS;
     11489        } else if (*currentCharacter<SrcCharacterType>() == '-') {
     11490            result = currentCharacter<SrcCharacterType>();
     11491
     11492            CSSParserString parsedIdentifier;
     11493            parseIdentifier(result, parsedIdentifier, hasEscape);
     11494
     11495            StringBuilder parsedLangRange;
     11496            parsedLangRange.append('*');
     11497            parsedLangRange.append(parsedIdentifier);
     11498
     11499            m_token = LANGRANGE;
     11500            yylval->string.init(parsedLangRange.toString());
    1148911501        }
    1149011502        break;
Note: See TracChangeset for help on using the changeset viewer.