⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 243821 in webkit


Ignore:
Timestamp:
Apr 3, 2019, 1:08:34 PM (7 years ago)
Author:
Chris Dumez
Message:

HTML fragment serialization should not strip whitespace from URL attribute values
https://bugs.webkit.org/show_bug.cgi?id=196551

Reviewed by Ryosuke Niwa.

LayoutTests/imported/w3c:

Rebaseline WPT test now that all checks are passing. This test was already passing
in Gecko and Blink.

  • web-platform-tests/domparsing/innerhtml-mxss.sub-expected.txt:

Source/WebCore:

HTML fragment serialization should not strip whitespace from URL attribute values as per:

WebKit was stripping such whitespace, Gecko and Blink are not. Align WebKit with other
browser engines and the specification.

No new tests, rebaselined existing test.

  • editing/MarkupAccumulator.cpp:

(WebCore::MarkupAccumulator::appendQuotedURLAttributeValue):

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r243817 r243821  
     12019-04-03  Chris Dumez  <cdumez@apple.com>
     2
     3        HTML fragment serialization should not strip whitespace from URL attribute values
     4        https://bugs.webkit.org/show_bug.cgi?id=196551
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        Rebaseline WPT test now that all checks are passing. This test was already passing
     9        in Gecko and Blink.
     10
     11        * web-platform-tests/domparsing/innerhtml-mxss.sub-expected.txt:
     12
    1132019-04-03  Chris Dumez  <cdumez@apple.com>
    214
  • trunk/LayoutTests/imported/w3c/web-platform-tests/domparsing/innerhtml-mxss.sub-expected.txt

    r222307 r243821  
    11Linkfoo
    22
    3 FAIL innerHTML before setter: 1680 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     3PASS innerHTML before setter: 1680
    44PASS href before setter: 1680
    5 FAIL innerHTML after setter: 1680 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    6 FAIL href after setter: 1680 assert_equals: expected "http://localhost:8800/domparsing/%E1%9A%80javascript:alert(1)" but got "javascript:alert(1)"
    7 FAIL innerHTML before setter: 2000 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     5PASS innerHTML after setter: 1680
     6PASS href after setter: 1680
     7PASS innerHTML before setter: 2000
    88PASS href before setter: 2000
    9 FAIL innerHTML after setter: 2000 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    10 FAIL href after setter: 2000 assert_equals: expected "http://localhost:8800/domparsing/%E2%80%80javascript:alert(1)" but got "javascript:alert(1)"
    11 FAIL innerHTML before setter: 2001 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     9PASS innerHTML after setter: 2000
     10PASS href after setter: 2000
     11PASS innerHTML before setter: 2001
    1212PASS href before setter: 2001
    13 FAIL innerHTML after setter: 2001 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    14 FAIL href after setter: 2001 assert_equals: expected "http://localhost:8800/domparsing/%E2%80%81javascript:alert(1)" but got "javascript:alert(1)"
    15 FAIL innerHTML before setter: 2002 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     13PASS innerHTML after setter: 2001
     14PASS href after setter: 2001
     15PASS innerHTML before setter: 2002
    1616PASS href before setter: 2002
    17 FAIL innerHTML after setter: 2002 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    18 FAIL href after setter: 2002 assert_equals: expected "http://localhost:8800/domparsing/%E2%80%82javascript:alert(1)" but got "javascript:alert(1)"
    19 FAIL innerHTML before setter: 2003 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     17PASS innerHTML after setter: 2002
     18PASS href after setter: 2002
     19PASS innerHTML before setter: 2003
    2020PASS href before setter: 2003
    21 FAIL innerHTML after setter: 2003 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    22 FAIL href after setter: 2003 assert_equals: expected "http://localhost:8800/domparsing/%E2%80%83javascript:alert(1)" but got "javascript:alert(1)"
    23 FAIL innerHTML before setter: 2004 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     21PASS innerHTML after setter: 2003
     22PASS href after setter: 2003
     23PASS innerHTML before setter: 2004
    2424PASS href before setter: 2004
    25 FAIL innerHTML after setter: 2004 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    26 FAIL href after setter: 2004 assert_equals: expected "http://localhost:8800/domparsing/%E2%80%84javascript:alert(1)" but got "javascript:alert(1)"
    27 FAIL innerHTML before setter: 2005 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     25PASS innerHTML after setter: 2004
     26PASS href after setter: 2004
     27PASS innerHTML before setter: 2005
    2828PASS href before setter: 2005
    29 FAIL innerHTML after setter: 2005 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    30 FAIL href after setter: 2005 assert_equals: expected "http://localhost:8800/domparsing/%E2%80%85javascript:alert(1)" but got "javascript:alert(1)"
    31 FAIL innerHTML before setter: 2006 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     29PASS innerHTML after setter: 2005
     30PASS href after setter: 2005
     31PASS innerHTML before setter: 2006
    3232PASS href before setter: 2006
    33 FAIL innerHTML after setter: 2006 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    34 FAIL href after setter: 2006 assert_equals: expected "http://localhost:8800/domparsing/%E2%80%86javascript:alert(1)" but got "javascript:alert(1)"
    35 FAIL innerHTML before setter: 2007 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     33PASS innerHTML after setter: 2006
     34PASS href after setter: 2006
     35PASS innerHTML before setter: 2007
    3636PASS href before setter: 2007
    37 FAIL innerHTML after setter: 2007 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    38 FAIL href after setter: 2007 assert_equals: expected "http://localhost:8800/domparsing/%E2%80%87javascript:alert(1)" but got "javascript:alert(1)"
    39 FAIL innerHTML before setter: 2008 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     37PASS innerHTML after setter: 2007
     38PASS href after setter: 2007
     39PASS innerHTML before setter: 2008
    4040PASS href before setter: 2008
    41 FAIL innerHTML after setter: 2008 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    42 FAIL href after setter: 2008 assert_equals: expected "http://localhost:8800/domparsing/%E2%80%88javascript:alert(1)" but got "javascript:alert(1)"
    43 FAIL innerHTML before setter: 2009 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     41PASS innerHTML after setter: 2008
     42PASS href after setter: 2008
     43PASS innerHTML before setter: 2009
    4444PASS href before setter: 2009
    45 FAIL innerHTML after setter: 2009 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    46 FAIL href after setter: 2009 assert_equals: expected "http://localhost:8800/domparsing/%E2%80%89javascript:alert(1)" but got "javascript:alert(1)"
    47 FAIL innerHTML before setter: 200a assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     45PASS innerHTML after setter: 2009
     46PASS href after setter: 2009
     47PASS innerHTML before setter: 200a
    4848PASS href before setter: 200a
    49 FAIL innerHTML after setter: 200a assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    50 FAIL href after setter: 200a assert_equals: expected "http://localhost:8800/domparsing/%E2%80%8Ajavascript:alert(1)" but got "javascript:alert(1)"
    51 FAIL innerHTML before setter: 2028 assert_equals: expected "<a href=\"
    52 javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     49PASS innerHTML after setter: 200a
     50PASS href after setter: 200a
     51PASS innerHTML before setter: 2028
    5352PASS href before setter: 2028
    54 FAIL innerHTML after setter: 2028 assert_equals: expected "<a href=\"
    55 javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    56 FAIL href after setter: 2028 assert_equals: expected "http://localhost:8800/domparsing/%E2%80%A8javascript:alert(1)" but got "javascript:alert(1)"
    57 FAIL innerHTML before setter: 205f assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     53PASS innerHTML after setter: 2028
     54PASS href after setter: 2028
     55PASS innerHTML before setter: 205f
    5856PASS href before setter: 205f
    59 FAIL innerHTML after setter: 205f assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    60 FAIL href after setter: 205f assert_equals: expected "http://localhost:8800/domparsing/%E2%81%9Fjavascript:alert(1)" but got "javascript:alert(1)"
    61 FAIL innerHTML before setter: 3000 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>" but got "<a href=\"javascript:alert(1)\">Link</a>"
     57PASS innerHTML after setter: 205f
     58PASS href after setter: 205f
     59PASS innerHTML before setter: 3000
    6260PASS href before setter: 3000
    63 FAIL innerHTML after setter: 3000 assert_equals: expected "<a href=\" javascript:alert(1)\">Link</a>foo" but got "<a href=\"javascript:alert(1)\">Link</a>foo"
    64 FAIL href after setter: 3000 assert_equals: expected "http://localhost:8800/domparsing/%E3%80%80javascript:alert(1)" but got "javascript:alert(1)"
     61PASS innerHTML after setter: 3000
     62PASS href after setter: 3000
    6563
  • trunk/Source/WebCore/ChangeLog

    r243820 r243821  
     12019-04-03  Chris Dumez  <cdumez@apple.com>
     2
     3        HTML fragment serialization should not strip whitespace from URL attribute values
     4        https://bugs.webkit.org/show_bug.cgi?id=196551
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        HTML fragment serialization should not strip whitespace from URL attribute values as per:
     9        - https://html.spec.whatwg.org/multipage/parsing.html#html-fragment-serialisation-algorithm
     10
     11        WebKit was stripping such whitespace, Gecko and Blink are not. Align WebKit with other
     12        browser engines and the specification.
     13
     14        No new tests, rebaselined existing test.
     15
     16        * editing/MarkupAccumulator.cpp:
     17        (WebCore::MarkupAccumulator::appendQuotedURLAttributeValue):
     18
    1192019-04-02  Ryosuke Niwa  <rniwa@webkit.org>
    220
  • trunk/Source/WebCore/editing/MarkupAccumulator.cpp

    r238771 r243821  
    293293{
    294294    ASSERT(element.isURLAttribute(attribute));
    295     const String resolvedURLString = resolveURLIfNeeded(element, attribute.value());
     295    String resolvedURLString = resolveURLIfNeeded(element, attribute.value());
    296296    UChar quoteChar = '"';
    297     String strippedURLString = resolvedURLString.stripWhiteSpace();
    298     if (WTF::protocolIsJavaScript(strippedURLString)) {
     297    if (WTF::protocolIsJavaScript(resolvedURLString)) {
    299298        // minimal escaping for javascript urls
    300         if (strippedURLString.contains('"')) {
    301             if (strippedURLString.contains('\''))
    302                 strippedURLString.replaceWithLiteral('"', "&quot;");
     299        if (resolvedURLString.contains('"')) {
     300            if (resolvedURLString.contains('\''))
     301                resolvedURLString.replaceWithLiteral('"', "&quot;");
    303302            else
    304303                quoteChar = '\'';
    305304        }
    306305        result.append(quoteChar);
    307         result.append(strippedURLString);
     306        result.append(resolvedURLString);
    308307        result.append(quoteChar);
    309308        return;
Note: See TracChangeset for help on using the changeset viewer.