Revision 03b7db51f21ce2a157454020bb46301b825152a5 authored by Alex Moshchuk on 13 April 2018, 23:12:06 UTC, committed by Chromium WPT Sync on 13 April 2018, 23:12:06 UTC
Changes from first reland attempt at https://crrev.com/c/1011287:
- fix an additional source of flakiness in ChromeOS login tests

Changes from original attempt at https://crrev.com/c/999182:
- fix flakiness in two additional ChromeOS login tests
- fix CSP WPT tests to not depend on ordering between iframe's onload
  and postMessage - see https://crbug.com/832319.

Previously, we sent the IPC to forward a cross-process postMessage
immediately.  This caused a behavioral difference from the
same-process case where the postMessage is always scheduled.  Namely,
in a scenario like this:

  frame.postMessage(...);
  doSomethingThatSendsIPCsToFrame(frame);

the IPCs from JS following the postMessage would've been ordered
incorrectly, causing |frame| to see their side effects after the
postMessage dispatch in the cross-process case, whereas they would be
seen before the postMessage dispatch in the same-process case.  One
example of this is frame.focus(), and another is a frame element
onload event (dispatched via FrameHostMsg_DispatchLoad) arriving after
a postMessage dispatched from an inline script while the frame was
still loading.

To resolve these ordering concerns, this CL changes cross-process
postMessage to do a PostTask on the sender side before sending the
message to the browser process.  This improves the current state of
the world, but does not yet achieve a perfect match for the IPC
ordering in the same-process case - see discussion on the bug.

Bug: 828529
Tbr: dcheng@chromium.org
Change-Id: If2cc6591db31471adff0d84ec0b689905e21cdf1
Reviewed-on: https://chromium-review.googlesource.com/999182
Reviewed-by: Xiyuan Xia <xiyuan@chromium.org>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Commit-Queue: Alex Moshchuk <alexmos@chromium.org>
Cr-Original-Original-Commit-Position: refs/heads/master@{#550284}
Reviewed-on: https://chromium-review.googlesource.com/1011287
Cr-Original-Commit-Position: refs/heads/master@{#550621}
Reviewed-on: https://chromium-review.googlesource.com/1012472
Cr-Commit-Position: refs/heads/master@{#550769}
1 parent ae86013
Raw File
response-headers.htm
<!DOCTYPE html>
<meta charset=utf-8>
<title>CORS - Response headers</title>
<meta name=author title="Odin Hørthe Omdal" href="mailto:odiho@opera.com">

<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=support.js?pipe=sub></script>

<h1>Response headers</h1>
<div id=log></div>
<script>

/*
 * Response Headers
 */

function check_response_header(head, value, desc) {
    test(function() {
        var client = new XMLHttpRequest()
        client.open('GET', CROSSDOMAIN + 'resources/cors-headers.asis', false)
        client.send(null)

        if (typeof value === 'function')
            value(client, head)
        else
            assert_equals(client.getResponseHeader(head), value, head)
    },
    desc)
}
check_response_header('X-Custom-Header-Comma', '1, 2', 'getResponseHeader: Expose Access-Control-Expose-Headers (x-custom-header-comma)')
check_response_header('X-Second-Expose', 'flyingpig', 'getResponseHeader: Expose second Access-Control-Expose-Headers (x-second-expose)')
check_response_header(' x-custom-header', null, 'getResponseHeader: Don\'t trim whitespace')
check_response_header('x-custom-header-bytes', "\xE2\x80\xA6", 'getResponseHeader: x-custom-header bytes')
check_response_header('Date',
    function(client, head) { assert_true(client.getResponseHeader(head).length > 2) },
    'getResponseHeader: Exposed server field readable (Date)')

function default_readable(head, value) {
    check_response_header(head, value, 'getResponseHeader: '+head+': readable by default')
}
default_readable("Cache-Control", "no-cache");
default_readable("Content-Language", "nn");
default_readable("Expires", "Thu, 01 Dec 1994 16:00:00 GMT");
default_readable("Last-Modified", "Thu, 01 Dec 1994 10:00:00 GMT");
default_readable("Pragma", "no-cache");


function default_unreadable(head) {
    check_response_header(head, null, 'getResponseHeader: '+head+': unreadable by default')
}
default_unreadable("Server")
default_unreadable("X-Powered-By")


async_test("getResponseHeader: Combined testing of cors response headers")
.step(function()
{
    var client = new XMLHttpRequest();
    client.open("GET", CROSSDOMAIN + 'resources/cors-headers.asis')
    window.c=client;
    client.onreadystatechange = this.step_func(function()
    {
        if (client.readyState == 1)
        {
            assert_equals(client.getResponseHeader("x-custom-header"), null, 'x-custom-header')
        }
        if (client.readyState > 1)
        {
            assert_equals(client.getResponseHeader("x-custom-header"), "test, test", 'x-custom-header')
            assert_equals(client.getResponseHeader("x-custom-header-empty"), "", 'x-custom-header-empty')
            assert_equals(client.getResponseHeader("set-cookie"), null)
            assert_equals(client.getResponseHeader("set-cookie2"), null)
            assert_equals(client.getResponseHeader("x-non-existent-header"), null)
            assert_equals(client.getResponseHeader("x-nonexposed"), null)
        }
        if (client.readyState == 4)
        {
            this.done()
        }
    })
    client.send()
})

test(function() {
    var client = new XMLHttpRequest()
    client.open('GET', CROSSDOMAIN + 'resources/cors-headers.asis', false)
    client.send(null)
    assert_equals(client.getResponseHeader("x-custom-header"), "test, test", 'x-custom-header')
    assert_equals(client.getResponseHeader("x-nonexposed"), null, 'x-nonexposed')
}, "getResponse: don't expose x-nonexposed")

test(function() {
    var client = new XMLHttpRequest()
    client.open('GET', CROSSDOMAIN + 'resources/cors-headers.asis', false)
    client.send(null)

    h = client.getAllResponseHeaders().toLowerCase()
    assert_true( h.indexOf('x-custom-header') >= 0, 'x-custom-header present')
    assert_true( h.indexOf('x-nonexposed') === -1, 'x-nonexposed not present')
}, "getAllResponseHeaders: don't expose x-nonexposed")

</script>
back to top