From 49da6702b16031c40d63e5618de03a32ff6c197e Mon Sep 17 00:00:00 2001 From: Peter Kvitek Date: Fri, 27 Jul 2018 19:02:38 +0000 Subject: [PATCH] Implemented headless browser redirection tests. Change-Id: I1e772fc31ede9a85d6cea1726c3c7fa9d3cd34ca Reviewed-on: https://chromium-review.googlesource.com/1147741 Reviewed-by: Andrey Kosyakov Commit-Queue: Peter Kvitek Cr-Commit-Position: refs/heads/master@{#578737} --- .../helpers/frame-navigation-helper.js | 2 +- .../data/protocol/helpers/http-interceptor.js | 74 +++++++++++++- .../protocol/helpers/renderer-test-helper.js | 7 +- .../renderer-content-security-policy.js | 6 -- .../renderer-css-url-filter-expected.txt | 2 +- .../sanity/renderer-css-url-filter.js | 2 +- .../renderer-double-redirect-expected.txt | 12 +++ .../sanity/renderer-double-redirect.js | 42 ++++++++ .../renderer-frame-load-events-expected.txt | 31 ++++++ .../sanity/renderer-frame-load-events.js | 31 +++++- ...enderer-frames-redirect-chain-expected.txt | 30 ++++++ .../sanity/renderer-frames-redirect-chain.js | 99 +++++++++++++++++++ ...nderer-in-cross-origin-object-expected.txt | 6 ++ .../sanity/renderer-in-cross-origin-object.js | 10 +- .../renderer-javascript-console-errors.js | 7 -- ...renderer-mixed-redirect-chain-expected.txt | 7 ++ .../sanity/renderer-mixed-redirect-chain.js | 52 ++++++++++ ...renderer-redirect-303-put-get-expected.txt | 9 ++ .../sanity/renderer-redirect-303-put-get.js | 52 ++++++++++ ...erer-redirect-307-post-method-expected.txt | 16 +++ .../renderer-redirect-307-post-method.js | 41 ++++++++ ...derer-redirect-307-put-method-expected.txt | 9 ++ .../renderer-redirect-307-put-method.js | 52 ++++++++++ ...rer-redirect-after-completion-expected.txt | 10 ++ .../renderer-redirect-after-completion.js | 39 ++++++++ .../renderer-redirect-base-url-expected.txt | 4 + .../sanity/renderer-redirect-base-url.js | 29 ++++++ .../renderer-redirect-empty-url-expected.txt | 3 + .../sanity/renderer-redirect-empty-url.js | 29 ++++++ ...renderer-redirect-invalid-url-expected.txt | 2 + .../sanity/renderer-redirect-invalid-url.js | 26 +++++ ...derer-redirect-keeps-fragment-expected.txt | 5 + .../renderer-redirect-keeps-fragment.js | 41 ++++++++ ...enderer-redirect-new-fragment-expected.txt | 5 + .../sanity/renderer-redirect-new-fragment.js | 41 ++++++++ ...nderer-redirect-non-ascii-url-expected.txt | 5 + .../sanity/renderer-redirect-non-ascii-url.js | 40 ++++++++ .../renderer-redirect-post-chain-expected.txt | 22 +++++ .../sanity/renderer-redirect-post-chain.js | 52 ++++++++++ ...er-redirect-replaces-fragment-expected.txt | 5 + .../renderer-redirect-replaces-fragment.js | 41 ++++++++ ...enderer-server-redirect-chain-expected.txt | 6 ++ .../sanity/renderer-server-redirect-chain.js | 35 +++++++ ...erver-redirect-relative-chain-expected.txt | 5 + ...renderer-server-redirect-relative-chain.js | 32 ++++++ ...er-server-redirect-to-failure-expected.txt | 4 + .../renderer-server-redirect-to-failure.js | 31 ++++++ ...rer-window-location-fragments-expected.txt | 5 + .../renderer-window-location-fragments.js | 41 ++++++++ .../test/headless_protocol_browsertest.cc | 51 +++++++++- 50 files changed, 1170 insertions(+), 38 deletions(-) create mode 100644 headless/test/data/protocol/sanity/renderer-double-redirect-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-double-redirect.js create mode 100644 headless/test/data/protocol/sanity/renderer-frames-redirect-chain-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-frames-redirect-chain.js create mode 100644 headless/test/data/protocol/sanity/renderer-mixed-redirect-chain-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-mixed-redirect-chain.js create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-303-put-get-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-303-put-get.js create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-307-post-method-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-307-post-method.js create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-307-put-method-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-307-put-method.js create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-after-completion-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-after-completion.js create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-base-url-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-base-url.js create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-empty-url-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-empty-url.js create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-invalid-url-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-invalid-url.js create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-keeps-fragment-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-keeps-fragment.js create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-new-fragment-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-new-fragment.js create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-non-ascii-url-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-non-ascii-url.js create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-post-chain-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-post-chain.js create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-replaces-fragment-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-redirect-replaces-fragment.js create mode 100644 headless/test/data/protocol/sanity/renderer-server-redirect-chain-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-server-redirect-chain.js create mode 100644 headless/test/data/protocol/sanity/renderer-server-redirect-relative-chain-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-server-redirect-relative-chain.js create mode 100644 headless/test/data/protocol/sanity/renderer-server-redirect-to-failure-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-server-redirect-to-failure.js create mode 100644 headless/test/data/protocol/sanity/renderer-window-location-fragments-expected.txt create mode 100644 headless/test/data/protocol/sanity/renderer-window-location-fragments.js diff --git a/headless/test/data/protocol/helpers/frame-navigation-helper.js b/headless/test/data/protocol/helpers/frame-navigation-helper.js index 1d5091694c8dcb..260a96aad524d8 100644 --- a/headless/test/data/protocol/helpers/frame-navigation-helper.js +++ b/headless/test/data/protocol/helpers/frame-navigation-helper.js @@ -99,7 +99,7 @@ } getFrameId_(frameId) { - return frameId === this.mainFrameId_ ? 'MainFrame' : frameId + return frameId === this.mainFrameId_ ? 'MainFrame' : `<${typeof frameId}>` } }); diff --git a/headless/test/data/protocol/helpers/http-interceptor.js b/headless/test/data/protocol/helpers/http-interceptor.js index 4721c5330ad3b0..c599b668cbf5c1 100644 --- a/headless/test/data/protocol/helpers/http-interceptor.js +++ b/headless/test/data/protocol/helpers/http-interceptor.js @@ -15,7 +15,10 @@ constructor(testRunner, dp) { this.testRunner_ = testRunner; this.dp_ = dp; + this.disabledRequestedUrlsLogging = false; this.responses_ = new Map(); + this.requestedUrls_ = []; + this.requestedMethods_ = []; } /** @@ -29,9 +32,17 @@ { patterns: [{ urlPattern: '*' }] }); this.dp_.Network.onRequestIntercepted(event => { - const url = event.params.request.url; + const method = event.params.request.method; + this.requestedMethods_.push(method); + + const url = event.params.request.url + + (event.params.request.urlFragment || ''); + this.requestedUrls_.push(url); + if (this.responses_.has(url)) { - this.testRunner_.log(`requested url: ${url}`); + if (!this.disabledRequestedUrlsLogging) { + this.testRunner_.log(`requested url: ${url}`); + } } else { this.testRunner_.log(`requested url: ${url} is not known`); this.logResponses(); @@ -48,15 +59,74 @@ return this; } + /** + * Prevents requested urls from being logged. This helps to stabilize tests + * that request urls in arbitrary order. Use hasRequestedUrls(urls) function + * to check if expected urls has been requested. + * + * @param {boolean} value True if requested url logging is disabled, false + * otherwise. + */ + setDisableRequestedUrlsLogging(value) { + this.disabledRequestedUrlsLogging = value; + } + + /** + * Adds request response. + * + * @param {!string} url Request url, including #fragment. + * @param {?string} body Request response body, optional. + * @param {?[string]} headers Request response headers, optional. + */ addResponse(url, body, headers) { this.responses_.set(url, {body, headers}); } + /** + * Logs registered request responses. + */ logResponses() { + this.testRunner_.log(`Responses: ${this.responses_.size}`); for (const [url, value] of this.responses_.entries()) { this.testRunner_.log( `url=${url}\nbody=${value.body}\nheaders=${value.headers}`); } } + /** + * Logs requested methods in the order requests have been received. + */ + logRequestedMethods() { + this.testRunner_.log(`Requested methods: ${this.requestedMethods_.length}`); + for (const method of this.requestedMethods_) { + this.testRunner_.log(` ${method}`); + } + } + + /** + * Logs requested urls in the order requests have been received. + */ + logRequestedUrls() { + this.testRunner_.log(`Requested urls: ${this.requestedUrls_.length}`); + for (const url of this.requestedUrls_) { + this.testRunner_.log(` ${url}`); + } + } + + /** + * Checks if specified urls have been requested. + * + * @param {[string]} urls Array of urls to check against requested urls. + */ + hasRequestedUrls(urls) { + this.testRunner_.log(`Expected requested urls:`); + for (const url of urls) { + if (this.requestedUrls_.indexOf(url) >= 0) { + this.testRunner_.log(` ${url}`); + } else { + this.testRunner_.log(` ${url} is MISSING`); + } + } + } + }); diff --git a/headless/test/data/protocol/helpers/renderer-test-helper.js b/headless/test/data/protocol/helpers/renderer-test-helper.js index 1568fb68f5157e..d977688ae0414c 100644 --- a/headless/test/data/protocol/helpers/renderer-test-helper.js +++ b/headless/test/data/protocol/helpers/renderer-test-helper.js @@ -24,7 +24,6 @@ * virtualTimeController references. */ async init() { - await this.dp_.Target.enable(); await this.dp_.Page.enable(); let HttpInterceptor = await this.testRunner_.loadScript( @@ -45,6 +44,12 @@ let virtualTimeController = new VirtualTimeController(this.testRunner_, this.dp_, 25); + this.dp_.Runtime.enable(); + this.dp_.Runtime.onConsoleAPICalled(data => { + const text = data.params.args[0].value; + this.testRunner_.log(text); + }); + return {httpInterceptor, frameNavigationHelper, virtualTimeController}; } diff --git a/headless/test/data/protocol/sanity/renderer-content-security-policy.js b/headless/test/data/protocol/sanity/renderer-content-security-policy.js index af749c5ed1f1da..d16cc916d925ad 100644 --- a/headless/test/data/protocol/sanity/renderer-content-security-policy.js +++ b/headless/test/data/protocol/sanity/renderer-content-security-policy.js @@ -11,12 +11,6 @@ let {httpInterceptor, frameNavigationHelper, virtualTimeController} = await (new RendererTestHelper(testRunner, dp, page)).init(); - dp.Runtime.enable(); - dp.Runtime.onConsoleAPICalled(data => { - const text = data.params.args[0].value; - testRunner.log(text); - }); - // Only first 3 scripts of 4 on the page are white listed for execution. // Therefore only 3 lines in the log are expected. httpInterceptor.addResponse(`http://example.com/`, diff --git a/headless/test/data/protocol/sanity/renderer-css-url-filter-expected.txt b/headless/test/data/protocol/sanity/renderer-css-url-filter-expected.txt index b8e97a0b6db5fc..b66cf45ca36d31 100644 --- a/headless/test/data/protocol/sanity/renderer-css-url-filter-expected.txt +++ b/headless/test/data/protocol/sanity/renderer-css-url-filter-expected.txt @@ -1,7 +1,7 @@ Tests renderer: canvas. requested url: http://www.example.com/ requested url: http://www.example.com/circle.svg -requested url: http://www.example.com/blur.svg +requested url: http://www.example.com/blur.svg#blur Screenshot size: 100 x 100 rgba @(0,0): 163,163,163,255 rgba @(1,1): 222,225,231,255 diff --git a/headless/test/data/protocol/sanity/renderer-css-url-filter.js b/headless/test/data/protocol/sanity/renderer-css-url-filter.js index 72a1a495cec8c5..4f690c2e9e7af6 100644 --- a/headless/test/data/protocol/sanity/renderer-css-url-filter.js +++ b/headless/test/data/protocol/sanity/renderer-css-url-filter.js @@ -46,7 +46,7 @@ // A blur filter stored inside an svg file. httpInterceptor.addResponse( - `http://www.example.com/blur.svg`, + `http://www.example.com/blur.svg#blur`, ` diff --git a/headless/test/data/protocol/sanity/renderer-double-redirect-expected.txt b/headless/test/data/protocol/sanity/renderer-double-redirect-expected.txt new file mode 100644 index 00000000000000..9554f6eb18d947 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-double-redirect-expected.txt @@ -0,0 +1,12 @@ +Tests renderer: double redirection. +requested url: http://www.example.com/ +requested url: http://www.example.com/2 +

Pass

+Frames: 1 + frameId=MainFrame + url=http://www.example.com/ + url=http://www.example.com/2 +ScheduledNavigations: 1 + frameId=MainFrame + url=http://www.example.com/1 reason=scriptInitiated + url=http://www.example.com/2 reason=scriptInitiated \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-double-redirect.js b/headless/test/data/protocol/sanity/renderer-double-redirect.js new file mode 100644 index 00000000000000..a2a4fba028e967 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-double-redirect.js @@ -0,0 +1,42 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: double redirection.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + // Two navigations have been scheduled while the document was loading, but + // only the second one was started. It canceled the first one. + httpInterceptor.addResponse('http://www.example.com/', + ` + + Hello, World 1 + + + http://www.example.com/1 + `); + + httpInterceptor.addResponse('http://www.example.com/2', + '

Pass

'); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate('document.body.innerHTML')); + frameNavigationHelper.logFrames(); + frameNavigationHelper.logScheduledNavigations(); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-frame-load-events-expected.txt b/headless/test/data/protocol/sanity/renderer-frame-load-events-expected.txt index e69de29bb2d1d6..8b334f7083cd9d 100644 --- a/headless/test/data/protocol/sanity/renderer-frame-load-events-expected.txt +++ b/headless/test/data/protocol/sanity/renderer-frame-load-events-expected.txt @@ -0,0 +1,31 @@ +Tests renderer: frame load events. +FRAME A 1 +IFRAME 1 +Frames: 4 + frameId=MainFrame + url=http://example.com/1 + frameId= + url=http://example.com/frameA/ + url=http://example.com/frameA/1 + frameId= + url=http://example.com/frameB/ + url=http://example.com/frameB/1 + frameId= + url=http://example.com/frameB/1/iframe/ + url=http://example.com/frameB/1/iframe/1 +ScheduledNavigations: 3 + frameId= + url=http://example.com/frameA/1 reason=scriptInitiated + frameId= + url=http://example.com/frameB/1 reason=scriptInitiated + frameId= + url=http://example.com/frameB/1/iframe/1 reason=scriptInitiated +Expected requested urls: + http://example.com/ + http://example.com/1 + http://example.com/frameA/ + http://example.com/frameA/1 + http://example.com/frameB/ + http://example.com/frameB/1 + http://example.com/frameB/1/iframe/ + http://example.com/frameB/1/iframe/1 \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-frame-load-events.js b/headless/test/data/protocol/sanity/renderer-frame-load-events.js index de2c55ac37140f..210f1e2f23fb8c 100644 --- a/headless/test/data/protocol/sanity/renderer-frame-load-events.js +++ b/headless/test/data/protocol/sanity/renderer-frame-load-events.js @@ -4,7 +4,7 @@ (async function(testRunner) { let {page, session, dp} = await testRunner.startBlank( - 'Tests renderer: content security policy.'); + 'Tests renderer: frame load events.'); let RendererTestHelper = await testRunner.loadScript('../helpers/renderer-test-helper.js'); @@ -16,8 +16,8 @@ httpInterceptor.addResponse(`http://example.com/1`, ` - - + + `); httpInterceptor.addResponse(`http://example.com/frameA/`, @@ -35,7 +35,7 @@ httpInterceptor.addResponse(`http://example.com/frameB/1`, `FRAME B 1 - + `); httpInterceptor.addResponse(`http://example.com/frameB/1/iframe/`, @@ -46,12 +46,33 @@ httpInterceptor.addResponse(`http://example.com/frameB/1/iframe/1`, `IFRAME 1`); + // Frame redirection requests are handled in an arbitrary order, so disable + // requested url logging to ensure test's stability. + httpInterceptor.setDisableRequestedUrlsLogging(true); + await virtualTimeController.grantInitialTime(500, 1000, null, async () => { - testRunner.log(await session.evaluate('document.body.innerHTML')); + testRunner.log(await session.evaluate( + `document.getElementById('frameA').contentDocument.body.innerText`)); + testRunner.log(await session.evaluate( + `document.getElementById('frameB').contentDocument.` + + `getElementById('iframe').contentDocument.body.innerHTML`)); + frameNavigationHelper.logFrames(); frameNavigationHelper.logScheduledNavigations(); + + httpInterceptor.hasRequestedUrls([ + 'http://example.com/', + 'http://example.com/1', + 'http://example.com/frameA/', + 'http://example.com/frameA/1', + 'http://example.com/frameB/', + 'http://example.com/frameB/1', + 'http://example.com/frameB/1/iframe/', + 'http://example.com/frameB/1/iframe/1' + ]); + testRunner.completeTest(); } ); diff --git a/headless/test/data/protocol/sanity/renderer-frames-redirect-chain-expected.txt b/headless/test/data/protocol/sanity/renderer-frames-redirect-chain-expected.txt new file mode 100644 index 00000000000000..137c180860d890 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-frames-redirect-chain-expected.txt @@ -0,0 +1,30 @@ +Tests renderer: frames redirection chain. +

FRAME A

+

IFRAME B

+Frames: 4 + frameId=MainFrame + url=http://www.example.com/1 + frameId= + url=http://www.example.com/frameA/ + url=http://www.example.com/frameA/2 + frameId= + url=http://www.example.com/frameB/ + frameId= + url=http://www.example.com/iframe/ + url=http://www.example.com/iframe/3 +ScheduledNavigations: 2 + frameId= + url=http://www.example.com/frameA/1 reason=scriptInitiated + frameId= + url=http://www.example.com/iframe/1 reason=scriptInitiated +Expected requested urls: + http://www.example.com/ + http://www.example.com/1 + http://www.example.com/frameA/ + http://www.example.com/frameA/1 + http://www.example.com/frameA/2 + http://www.example.com/frameB/ + http://www.example.com/iframe/ + http://www.example.com/iframe/1 + http://www.example.com/iframe/2 + http://www.example.com/iframe/3 \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-frames-redirect-chain.js b/headless/test/data/protocol/sanity/renderer-frames-redirect-chain.js new file mode 100644 index 00000000000000..b958d814baea1d --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-frames-redirect-chain.js @@ -0,0 +1,99 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: frames redirection chain.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/', null, + ['HTTP/1.1 302 Found', 'Location: http://www.example.com/1']); + + httpInterceptor.addResponse('http://www.example.com/1', + ` + + + + + `); + + // Frame A + httpInterceptor.addResponse('http://www.example.com/frameA/', + ` + + + + HELLO WORLD 1 + `); + + httpInterceptor.addResponse('http://www.example.com/frameA/1', null, + ['HTTP/1.1 301 Moved', 'Location: /frameA/2']); + + httpInterceptor.addResponse('http://www.example.com/frameA/2', + `

FRAME A

`); + + // Frame B + httpInterceptor.addResponse('http://www.example.com/frameB/', + ` + HELLO WORLD 2 + + + + `); + + httpInterceptor.addResponse('http://www.example.com/iframe/', + ` + + + + HELLO WORLD 1 + `); + + httpInterceptor.addResponse('http://www.example.com/iframe/1', null, + ['HTTP/1.1 302 Found', 'Location: /iframe/2']); + + httpInterceptor.addResponse('http://www.example.com/iframe/2', null, + ['HTTP/1.1 301 Moved', 'Location: 3']); + + httpInterceptor.addResponse('http://www.example.com/iframe/3', + `

IFRAME B

`); + + // Frame redirection requests are handled in an arbitrary order, so disable + // requested url logging to ensure test's stability. + httpInterceptor.setDisableRequestedUrlsLogging(true); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate( + `document.getElementById('frameA').contentDocument.body.innerHTML`)); + testRunner.log(await session.evaluate( + `document.getElementById('frameB').contentDocument.` + + `getElementById('iframe').contentDocument.body.innerHTML`)); + + frameNavigationHelper.logFrames(); + frameNavigationHelper.logScheduledNavigations(); + + httpInterceptor.hasRequestedUrls([ + 'http://www.example.com/', + 'http://www.example.com/1', + 'http://www.example.com/frameA/', + 'http://www.example.com/frameA/1', + 'http://www.example.com/frameA/2', + 'http://www.example.com/frameB/', + 'http://www.example.com/iframe/', + 'http://www.example.com/iframe/1', + 'http://www.example.com/iframe/2', + 'http://www.example.com/iframe/3']); + + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-in-cross-origin-object-expected.txt b/headless/test/data/protocol/sanity/renderer-in-cross-origin-object-expected.txt index e69de29bb2d1d6..eef4a3d1b8e324 100644 --- a/headless/test/data/protocol/sanity/renderer-in-cross-origin-object-expected.txt +++ b/headless/test/data/protocol/sanity/renderer-in-cross-origin-object-expected.txt @@ -0,0 +1,6 @@ +Tests renderer: in cross origin object. +requested url: http://foo.com/ +requested url: http://bar.com/ +Blocked a frame with origin "http://foo.com" from accessing a cross-origin frame. + +Pass \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-in-cross-origin-object.js b/headless/test/data/protocol/sanity/renderer-in-cross-origin-object.js index 461075445c0f90..bacc5c42626655 100644 --- a/headless/test/data/protocol/sanity/renderer-in-cross-origin-object.js +++ b/headless/test/data/protocol/sanity/renderer-in-cross-origin-object.js @@ -11,12 +11,6 @@ let {httpInterceptor, frameNavigationHelper, virtualTimeController} = await (new RendererTestHelper(testRunner, dp, page)).init(); - dp.Runtime.enable(); - dp.Runtime.onConsoleAPICalled(data => { - const text = data.params.args[0].value; - testRunner.log(text); - }); - httpInterceptor.addResponse( `http://foo.com/`, ` @@ -24,11 +18,10 @@ @@ -43,7 +36,6 @@ await virtualTimeController.grantInitialTime(500, 1000, null, async () => { - testRunner.log(await session.evaluate('document.title')); testRunner.log(await session.evaluate('document.body.innerText')); testRunner.completeTest(); } diff --git a/headless/test/data/protocol/sanity/renderer-javascript-console-errors.js b/headless/test/data/protocol/sanity/renderer-javascript-console-errors.js index 0e615ef88e2189..c3f131d87d5011 100644 --- a/headless/test/data/protocol/sanity/renderer-javascript-console-errors.js +++ b/headless/test/data/protocol/sanity/renderer-javascript-console-errors.js @@ -36,13 +36,6 @@ `); - await dp.Runtime.enable(); - - dp.Runtime.onConsoleAPICalled(data => { - const text = data.params.args[0].value; - testRunner.log(`${text}`); - }); - dp.Runtime.onExceptionThrown(data => { const details = data.params.exceptionDetails; testRunner.log( diff --git a/headless/test/data/protocol/sanity/renderer-mixed-redirect-chain-expected.txt b/headless/test/data/protocol/sanity/renderer-mixed-redirect-chain-expected.txt new file mode 100644 index 00000000000000..24369d4077a923 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-mixed-redirect-chain-expected.txt @@ -0,0 +1,7 @@ +Tests renderer: mixed redirection chain. +requested url: http://www.example.com/ +requested url: http://www.example.com/1 +requested url: http://www.example.com/2 +requested url: http://www.example.com/3 +requested url: http://www.example.com/4 +

Pass

\ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-mixed-redirect-chain.js b/headless/test/data/protocol/sanity/renderer-mixed-redirect-chain.js new file mode 100644 index 00000000000000..7970bd9b701992 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-mixed-redirect-chain.js @@ -0,0 +1,52 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: mixed redirection chain.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/', + ` + + + Hello, World 0 + + http://www.example.com/ + `); + + httpInterceptor.addResponse('http://www.example.com/1', + ` + + Hello, World 1 + + + http://www.example.com/1 + `); + + httpInterceptor.addResponse('http://www.example.com/2', null, + ['HTTP/1.1 302 Found', 'Location: 3']); + + httpInterceptor.addResponse('http://www.example.com/3', null, + ['HTTP/1.1 301 Moved', 'Location: http://www.example.com/4']); + + httpInterceptor.addResponse('http://www.example.com/4', + `

Pass

`); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate('document.body.innerHTML')); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-redirect-303-put-get-expected.txt b/headless/test/data/protocol/sanity/renderer-redirect-303-put-get-expected.txt new file mode 100644 index 00000000000000..c3f60d8e257354 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-303-put-get-expected.txt @@ -0,0 +1,9 @@ +Tests renderer: redirect 303 put get. +requested url: http://www.example.com/ +requested url: http://www.example.com/1 +requested url: http://www.example.com/2 +

Pass

+Requested methods: 3 + GET + PUT + GET \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-redirect-303-put-get.js b/headless/test/data/protocol/sanity/renderer-redirect-303-put-get.js new file mode 100644 index 00000000000000..ac649d5682d73e --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-303-put-get.js @@ -0,0 +1,52 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: redirect 303 put get.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/', + ` + + + + +

+ + `); + + httpInterceptor.addResponse('http://www.example.com/1', null, + ['HTTP/1.1 303 See Other', 'Location: /2']); + + httpInterceptor.addResponse('http://www.example.com/2', + '

Pass

', + ['Content-Type: text/plain']); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate('document.body.innerText')); + httpInterceptor.logRequestedMethods(); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-redirect-307-post-method-expected.txt b/headless/test/data/protocol/sanity/renderer-redirect-307-post-method-expected.txt new file mode 100644 index 00000000000000..5792aca7b0dea8 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-307-post-method-expected.txt @@ -0,0 +1,16 @@ +Tests renderer: redirection 307 post method. +requested url: http://www.example.com/ +requested url: http://www.example.com/1 +requested url: http://www.example.com/2 +

Pass

+Requested methods: 3 + GET + POST + POST +Frames: 1 + frameId=MainFrame + url=http://www.example.com/ + url=http://www.example.com/2 +ScheduledNavigations: 1 + frameId=MainFrame + url=http://www.example.com/1 reason=formSubmissionPost \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-redirect-307-post-method.js b/headless/test/data/protocol/sanity/renderer-redirect-307-post-method.js new file mode 100644 index 00000000000000..786afc70e68499 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-307-post-method.js @@ -0,0 +1,41 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: redirection 307 post method.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/', + ` + +
+ +
+ + `); + + httpInterceptor.addResponse('http://www.example.com/1', null, + ['HTTP/1.1 307 Temporary Redirect', 'Location: /2']); + + httpInterceptor.addResponse('http://www.example.com/2', + '

Pass

'); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate('document.body.innerHTML')); + httpInterceptor.logRequestedMethods(); + frameNavigationHelper.logFrames(); + frameNavigationHelper.logScheduledNavigations(); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-redirect-307-put-method-expected.txt b/headless/test/data/protocol/sanity/renderer-redirect-307-put-method-expected.txt new file mode 100644 index 00000000000000..d645cc59681238 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-307-put-method-expected.txt @@ -0,0 +1,9 @@ +Tests renderer: redirect 307 put method. +requested url: http://www.example.com/ +requested url: http://www.example.com/1 +requested url: http://www.example.com/2 +

Pass

+Requested methods: 3 + GET + PUT + PUT \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-redirect-307-put-method.js b/headless/test/data/protocol/sanity/renderer-redirect-307-put-method.js new file mode 100644 index 00000000000000..4ea467324e5f61 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-307-put-method.js @@ -0,0 +1,52 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: redirect 307 put method.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/', + ` + + + + +

+ + `); + + httpInterceptor.addResponse('http://www.example.com/1', null, + ['HTTP/1.1 307 Temporary Redirect', 'Location: /2']); + + httpInterceptor.addResponse('http://www.example.com/2', + '

Pass

', + ['Content-Type: text/plain']); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate('document.body.innerText')); + httpInterceptor.logRequestedMethods(); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-redirect-after-completion-expected.txt b/headless/test/data/protocol/sanity/renderer-redirect-after-completion-expected.txt new file mode 100644 index 00000000000000..c7c43fd4efb283 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-after-completion-expected.txt @@ -0,0 +1,10 @@ +Tests renderer: redirection after completion. +requested url: http://www.example.com/ +

Pass

+ +Frames: 1 + frameId=MainFrame + url=http://www.example.com/ +ScheduledNavigations: 1 + frameId=MainFrame + url=http://www.example.com/1 reason=metaTagRefresh \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-redirect-after-completion.js b/headless/test/data/protocol/sanity/renderer-redirect-after-completion.js new file mode 100644 index 00000000000000..321ecf641307c7 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-after-completion.js @@ -0,0 +1,39 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: redirection after completion.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + // While the document was loading, one navigation has been scheduled, but + // because of the timeout, it has not been started yet. + httpInterceptor.addResponse('http://www.example.com/', + ` + + + +

Pass

+ `); + + httpInterceptor.addResponse('http://www.example.com/1', + '

FAIL

'); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate('document.body.innerHTML')); + frameNavigationHelper.logFrames(); + frameNavigationHelper.logScheduledNavigations(); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-redirect-base-url-expected.txt b/headless/test/data/protocol/sanity/renderer-redirect-base-url-expected.txt new file mode 100644 index 00000000000000..20feab4a7575d3 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-base-url-expected.txt @@ -0,0 +1,4 @@ +Tests renderer: redirect base url. +requested url: http://foo.com/ +requested url: http://bar.com/ +

Pass

\ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-redirect-base-url.js b/headless/test/data/protocol/sanity/renderer-redirect-base-url.js new file mode 100644 index 00000000000000..b2b594e79c562a --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-base-url.js @@ -0,0 +1,29 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: redirect base url.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://foo.com/', null, + ['HTTP/1.1 302 Found', 'Location: http://bar.com/']); + + httpInterceptor.addResponse('http://bar.com/', + `

Pass

`); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate('document.body.innerHTML')); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://foo.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-redirect-empty-url-expected.txt b/headless/test/data/protocol/sanity/renderer-redirect-empty-url-expected.txt new file mode 100644 index 00000000000000..6782b91700d352 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-empty-url-expected.txt @@ -0,0 +1,3 @@ +Tests renderer: redirect empty url. +requested url: http://www.example.com/ +

Pass

\ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-redirect-empty-url.js b/headless/test/data/protocol/sanity/renderer-redirect-empty-url.js new file mode 100644 index 00000000000000..be8723e8dfa200 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-empty-url.js @@ -0,0 +1,29 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: redirect empty url.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/', + `

Pass

`, + ['HTTP/1.1 302 Found', + 'Location: ', + 'Content-Type: text/html']); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate('document.body.innerHTML')); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-redirect-invalid-url-expected.txt b/headless/test/data/protocol/sanity/renderer-redirect-invalid-url-expected.txt new file mode 100644 index 00000000000000..15cce8a5e3c5ac --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-invalid-url-expected.txt @@ -0,0 +1,2 @@ +Tests renderer: redirect invalid url. +requested url: http://www.example.com/ \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-redirect-invalid-url.js b/headless/test/data/protocol/sanity/renderer-redirect-invalid-url.js new file mode 100644 index 00000000000000..fd8a6a1339192d --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-invalid-url.js @@ -0,0 +1,26 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: redirect invalid url.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/', + `

Pass

`, + ['HTTP/1.1 302 Found', 'Location: http://']); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-redirect-keeps-fragment-expected.txt b/headless/test/data/protocol/sanity/renderer-redirect-keeps-fragment-expected.txt new file mode 100644 index 00000000000000..2af0eb30dd24df --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-keeps-fragment-expected.txt @@ -0,0 +1,5 @@ +Tests renderer: redirect keeps fragment. +requested url: http://www.example.com/#foo +requested url: http://www.example.com/1#foo +requested url: http://www.example.com/2#foo +http://www.example.com/2#foo \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-redirect-keeps-fragment.js b/headless/test/data/protocol/sanity/renderer-redirect-keeps-fragment.js new file mode 100644 index 00000000000000..fa7bde5b8be637 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-keeps-fragment.js @@ -0,0 +1,41 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: redirect keeps fragment.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/#foo', null, + ['HTTP/1.1 302 Found', 'Location: /1']); + + httpInterceptor.addResponse('http://www.example.com/1#foo', null, + ['HTTP/1.1 302 Found', 'Location: /2']); + + httpInterceptor.addResponse('http://www.example.com/2#foo', + ` + +

+ + + `); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate( + `document.getElementById('content').innerText`)); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/#foo'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-redirect-new-fragment-expected.txt b/headless/test/data/protocol/sanity/renderer-redirect-new-fragment-expected.txt new file mode 100644 index 00000000000000..351ef3d10f5d6a --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-new-fragment-expected.txt @@ -0,0 +1,5 @@ +Tests renderer: redirect new fragment. +requested url: http://www.example.com/ +requested url: http://www.example.com/1#foo +requested url: http://www.example.com/2#foo +http://www.example.com/2#foo \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-redirect-new-fragment.js b/headless/test/data/protocol/sanity/renderer-redirect-new-fragment.js new file mode 100644 index 00000000000000..f5424c50a1193e --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-new-fragment.js @@ -0,0 +1,41 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: redirect new fragment.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/', null, + ['HTTP/1.1 302 Found', 'Location: /1#foo']); + + httpInterceptor.addResponse('http://www.example.com/1#foo', null, + ['HTTP/1.1 302 Found', 'Location: /2']); + + httpInterceptor.addResponse('http://www.example.com/2#foo', + ` + +

+ + + `); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate( + `document.getElementById('content').innerText`)); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-redirect-non-ascii-url-expected.txt b/headless/test/data/protocol/sanity/renderer-redirect-non-ascii-url-expected.txt new file mode 100644 index 00000000000000..9f1169d0d7b258 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-non-ascii-url-expected.txt @@ -0,0 +1,5 @@ +Tests renderer: redirect non ascii url. +requested url: http://www.example.com/ +requested url: http://www.example.com/%E4%B8%AD%E6%96%87 +requested url: http://www.example.com/pass#%E4%B8%AD%E6%96%87 +

Pass

\ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-redirect-non-ascii-url.js b/headless/test/data/protocol/sanity/renderer-redirect-non-ascii-url.js new file mode 100644 index 00000000000000..cff1be1c82df30 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-non-ascii-url.js @@ -0,0 +1,40 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: redirect non ascii url.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + // "中文" is 0xE4 0xB8 0xAD, 0xE6 0x96 0x87 + httpInterceptor.addResponse('http://www.example.com/', null, + ['HTTP/1.1 302 Found', + 'Location: http://www.example.com/%E4%B8%AD%E6%96%87']); + + httpInterceptor.addResponse('http://www.example.com/%E4%B8%AD%E6%96%87', null, + ['HTTP/1.1 303 Moved', + 'Location: http://www.example.com/pass#%E4%B8%AD%E6%96%87']); + + httpInterceptor.addResponse('http://www.example.com/pass#%E4%B8%AD%E6%96%87', + `

Pass

`); + + httpInterceptor.addResponse( + 'http://www.example.com/%C3%A4%C2%B8%C2%AD%C3%A6%C2%96%C2%87', + `Fail`, + ['HTTP/1.1 500 Bad Response', 'Content-Type: text/html']); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate('document.body.innerHTML')); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-redirect-post-chain-expected.txt b/headless/test/data/protocol/sanity/renderer-redirect-post-chain-expected.txt new file mode 100644 index 00000000000000..945d4d7cae7d32 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-post-chain-expected.txt @@ -0,0 +1,22 @@ +Tests renderer: post chain redirection. +requested url: http://www.example.com/ +requested url: http://www.example.com/1 +requested url: http://www.example.com/2 +requested url: http://www.example.com/3 +requested url: http://www.example.com/4 +

Pass

+Requested methods: 5 + GET + POST + POST + POST + POST +Frames: 1 + frameId=MainFrame + url=http://www.example.com/ + url=http://www.example.com/2 + url=http://www.example.com/4 +ScheduledNavigations: 1 + frameId=MainFrame + url=http://www.example.com/1 reason=formSubmissionPost + url=http://www.example.com/3 reason=formSubmissionPost \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-redirect-post-chain.js b/headless/test/data/protocol/sanity/renderer-redirect-post-chain.js new file mode 100644 index 00000000000000..959f13fd69ff3d --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-post-chain.js @@ -0,0 +1,52 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: post chain redirection.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/', + ` + +
+ +
+ + `); + + httpInterceptor.addResponse('http://www.example.com/1', null, + ['HTTP/1.1 307 Temporary Redirect', 'Location: /2']); + + httpInterceptor.addResponse('http://www.example.com/2', + ` + +
+
+ + `); + + httpInterceptor.addResponse('http://www.example.com/3', null, + ['HTTP/1.1 307 Temporary Redirect', 'Location: /4']); + + httpInterceptor.addResponse('http://www.example.com/4', + '

Pass

'); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate('document.body.innerHTML')); + httpInterceptor.logRequestedMethods(); + frameNavigationHelper.logFrames(); + frameNavigationHelper.logScheduledNavigations(); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-redirect-replaces-fragment-expected.txt b/headless/test/data/protocol/sanity/renderer-redirect-replaces-fragment-expected.txt new file mode 100644 index 00000000000000..da0f53590ec274 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-replaces-fragment-expected.txt @@ -0,0 +1,5 @@ +Tests renderer: redirect replaces fragment. +requested url: http://www.example.com/#foo +requested url: http://www.example.com/1#bar +requested url: http://www.example.com/2#bar +http://www.example.com/2#bar \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-redirect-replaces-fragment.js b/headless/test/data/protocol/sanity/renderer-redirect-replaces-fragment.js new file mode 100644 index 00000000000000..f732557c571f1b --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-redirect-replaces-fragment.js @@ -0,0 +1,41 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: redirect replaces fragment.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/#foo', null, + ['HTTP/1.1 302 Found', 'Location: /1#bar']); + + httpInterceptor.addResponse('http://www.example.com/1#bar', null, + ['HTTP/1.1 302 Found', 'Location: /2']); + + httpInterceptor.addResponse('http://www.example.com/2#bar', + ` + +

+ + + `); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate( + `document.getElementById('content').innerText`)); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/#foo'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-server-redirect-chain-expected.txt b/headless/test/data/protocol/sanity/renderer-server-redirect-chain-expected.txt new file mode 100644 index 00000000000000..ce91f31720ca00 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-server-redirect-chain-expected.txt @@ -0,0 +1,6 @@ +Tests renderer: server redirection chain. +requested url: http://www.example.com/ +requested url: http://www.example.com/1 +requested url: http://www.example.com/2 +requested url: http://www.example.com/3 +

Pass

\ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-server-redirect-chain.js b/headless/test/data/protocol/sanity/renderer-server-redirect-chain.js new file mode 100644 index 00000000000000..1f7fee6ae3ab18 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-server-redirect-chain.js @@ -0,0 +1,35 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: server redirection chain.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/', null, + ['HTTP/1.1 302 Found', 'Location: http://www.example.com/1']); + + httpInterceptor.addResponse('http://www.example.com/1', null, + ['HTTP/1.1 301 Moved', 'Location: http://www.example.com/2']); + + httpInterceptor.addResponse('http://www.example.com/2', null, + ['HTTP/1.1 302 Found', 'Location: http://www.example.com/3']); + + httpInterceptor.addResponse('http://www.example.com/3', + '

Pass

'); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate('document.body.innerHTML')); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-server-redirect-relative-chain-expected.txt b/headless/test/data/protocol/sanity/renderer-server-redirect-relative-chain-expected.txt new file mode 100644 index 00000000000000..843d66d498b01a --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-server-redirect-relative-chain-expected.txt @@ -0,0 +1,5 @@ +Tests renderer: relative server redirection chain. +requested url: http://www.example.com/ +requested url: http://www.mysite.com/1 +requested url: http://www.mysite.com/2 +

Pass

\ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-server-redirect-relative-chain.js b/headless/test/data/protocol/sanity/renderer-server-redirect-relative-chain.js new file mode 100644 index 00000000000000..870e43b7144f29 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-server-redirect-relative-chain.js @@ -0,0 +1,32 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: relative server redirection chain.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/', null, + ['HTTP/1.1 302 Found', 'Location: http://www.mysite.com/1']); + + httpInterceptor.addResponse('http://www.mysite.com/1', null, + ['HTTP/1.1 301 Moved', 'Location: /2']); + + httpInterceptor.addResponse('http://www.mysite.com/2', + `

Pass

`); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate('document.body.innerHTML')); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-server-redirect-to-failure-expected.txt b/headless/test/data/protocol/sanity/renderer-server-redirect-to-failure-expected.txt new file mode 100644 index 00000000000000..0ce0c8dd9a1c5d --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-server-redirect-to-failure-expected.txt @@ -0,0 +1,4 @@ +Tests renderer: server redirection to failure. +requested url: http://www.example.com/ +requested url: http://www.example.com/1 +requested url: http://www.example.com/FAIL \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-server-redirect-to-failure.js b/headless/test/data/protocol/sanity/renderer-server-redirect-to-failure.js new file mode 100644 index 00000000000000..2382f829aadb01 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-server-redirect-to-failure.js @@ -0,0 +1,31 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: server redirection to failure.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/', null, + ['HTTP/1.1 302 Found', 'Location: http://www.example.com/1']); + + httpInterceptor.addResponse('http://www.example.com/1', null, + ['HTTP/1.1 302 Found', 'Location: http://www.example.com/FAIL']); + + httpInterceptor.addResponse('http://www.example.com/FAIL', null, + ['HTTP/1.1 404 Not Found']); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/'); +}) diff --git a/headless/test/data/protocol/sanity/renderer-window-location-fragments-expected.txt b/headless/test/data/protocol/sanity/renderer-window-location-fragments-expected.txt new file mode 100644 index 00000000000000..91feb01b67aa8d --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-window-location-fragments-expected.txt @@ -0,0 +1,5 @@ +Tests renderer: window location fragments. +requested url: http://www.example.com/#fragment1 +requested url: http://www.example.com/iframe#fragment2 +requested url: http://www.example.com/pass +Pass \ No newline at end of file diff --git a/headless/test/data/protocol/sanity/renderer-window-location-fragments.js b/headless/test/data/protocol/sanity/renderer-window-location-fragments.js new file mode 100644 index 00000000000000..c5681875c9f554 --- /dev/null +++ b/headless/test/data/protocol/sanity/renderer-window-location-fragments.js @@ -0,0 +1,41 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + 'Tests renderer: window location fragments.'); + + let RendererTestHelper = + await testRunner.loadScript('../helpers/renderer-test-helper.js'); + let {httpInterceptor, frameNavigationHelper, virtualTimeController} = + await (new RendererTestHelper(testRunner, dp, page)).init(); + + httpInterceptor.addResponse('http://www.example.com/#fragment1', + ``); + + httpInterceptor.addResponse('http://www.example.com/iframe#fragment2', + `)`); + + httpInterceptor.addResponse('http://www.example.com/pass', + `

Pass

`); + + await virtualTimeController.grantInitialTime(1000, 1000, + null, + async () => { + testRunner.log(await session.evaluate( + `document.getElementById('frame').contentDocument.body.innerText`)); + testRunner.completeTest(); + } + ); + + await frameNavigationHelper.navigate('http://www.example.com/#fragment1'); +}) diff --git a/headless/test/headless_protocol_browsertest.cc b/headless/test/headless_protocol_browsertest.cc index f6aeb8f60143c8..bd0227c0eea3bb 100644 --- a/headless/test/headless_protocol_browsertest.cc +++ b/headless/test/headless_protocol_browsertest.cc @@ -341,6 +341,50 @@ HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererClientRedirectChain, HEADLESS_PROTOCOL_COMPOSITOR_TEST( RendererClientRedirectChainNoJs, "sanity/renderer-client-redirect-chain-no-js.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererServerRedirectChain, + "sanity/renderer-server-redirect-chain.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST( + RendererServerRedirectToFailure, + "sanity/renderer-server-redirect-to-failure.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST( + RendererServerRedirectRelativeChain, + "sanity/renderer-server-redirect-relative-chain.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererMixedRedirectChain, + "sanity/renderer-mixed-redirect-chain.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererFramesRedirectChain, + "sanity/renderer-frames-redirect-chain.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererDoubleRedirect, + "sanity/renderer-double-redirect.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST( + RendererRedirectAfterCompletion, + "sanity/renderer-redirect-after-completion.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST( + RendererRedirect307PostMethod, + "sanity/renderer-redirect-307-post-method.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererRedirectPostChain, + "sanity/renderer-redirect-post-chain.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererRedirect307PutMethod, + "sanity/renderer-redirect-307-put-method.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererRedirect303PutGet, + "sanity/renderer-redirect-303-put-get.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererRedirectBaseUrl, + "sanity/renderer-redirect-base-url.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererRedirectNonAsciiUrl, + "sanity/renderer-redirect-non-ascii-url.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererRedirectEmptyUrl, + "sanity/renderer-redirect-empty-url.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererRedirectInvalidUrl, + "sanity/renderer-redirect-invalid-url.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererRedirectKeepsFragment, + "sanity/renderer-redirect-keeps-fragment.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST( + RendererRedirectReplacesFragment, + "sanity/renderer-redirect-replaces-fragment.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererRedirectNewFragment, + "sanity/renderer-redirect-new-fragment.js"); +HEADLESS_PROTOCOL_COMPOSITOR_TEST( + RendererWindowLocationFragments, + "sanity/renderer-window-location-fragments.js"); HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererCookieSetFromJs, "sanity/renderer-cookie-set-from-js.js"); HEADLESS_PROTOCOL_COMPOSITOR_TEST( @@ -348,16 +392,13 @@ HEADLESS_PROTOCOL_COMPOSITOR_TEST( "sanity/renderer-cookie-set-from-js-no-cookies.js"); HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererCookieUpdatedFromJs, "sanity/renderer-cookie-updated-from-js.js"); - -// TODO(kvitekp): investigating... -HEADLESS_PROTOCOL_COMPOSITOR_TEST(DISABLED_RendererInCrossOriginObject, +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererInCrossOriginObject, "sanity/renderer-in-cross-origin-object.js"); HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererContentSecurityPolicy, "sanity/renderer-content-security-policy.js"); -// TODO(crbug.com/867274): frame navigation is currently broken. -HEADLESS_PROTOCOL_COMPOSITOR_TEST(DISABLED_RendererFrameLoadEvents, +HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererFrameLoadEvents, "sanity/renderer-frame-load-events.js"); HEADLESS_PROTOCOL_COMPOSITOR_TEST(RendererCssUrlFilter, "sanity/renderer-css-url-filter.js");