| // Copyright 2014 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. |
| |
| 'use strict'; |
| |
| // Tests don't start running until an async call to |
| // chrome.mimeHandlerPrivate.getStreamInfo() completes, so queue any messages |
| // received until that point. |
| var queuedMessages = []; |
| |
| function queueMessage(event) { |
| queuedMessages.push(event); |
| } |
| |
| window.addEventListener('message', queueMessage, false); |
| |
| var streamDetails; |
| |
| function fetchUrl(url) { |
| return new Promise(function(resolve, reject) { |
| var request = new XMLHttpRequest(); |
| request.onload = function() { |
| resolve({ |
| status: request.status, |
| data: request.responseText, |
| }); |
| }; |
| request.onerror = function() { |
| resolve({ |
| status: request.status, |
| data: 'error', |
| }); |
| }; |
| request.open('GET', streamDetails.streamUrl, true); |
| request.send(); |
| }); |
| } |
| |
| function expectSuccessfulRead(response) { |
| chrome.test.assertEq('content to read\n', response.data); |
| } |
| |
| function expectSuccessfulReadLong(response) { |
| chrome.test.assertTrue(response.data.startsWith('content to read\n')); |
| } |
| |
| function checkStreamDetails(name, embedded) { |
| checkStreamDetailsNoFile(); |
| chrome.test.assertEq(embedded, streamDetails.embedded); |
| chrome.test.assertTrue(streamDetails.originalUrl.indexOf(name) != -1); |
| chrome.test.assertEq('text/csv', |
| streamDetails.responseHeaders['Content-Type']); |
| } |
| |
| function checkStreamDetailsNoFile() { |
| chrome.test.assertEq('text/csv', streamDetails.mimeType); |
| chrome.test.assertTrue(streamDetails.tabId != -1); |
| } |
| |
| // The following helper methods are used in BrowserPlugin-specific tests. |
| function dummyTouchStartHandler(e) { |
| } |
| |
| var tests = [ |
| function testBasic() { |
| checkStreamDetails('testBasic.csv', false); |
| fetchUrl(streamDetails.streamUrl) |
| .then(expectSuccessfulRead) |
| .then(chrome.test.succeed); |
| }, |
| |
| function testEmbedded() { |
| checkStreamDetails('testEmbedded.csv', true); |
| fetchUrl(streamDetails.streamUrl) |
| .then(expectSuccessfulRead) |
| .then(chrome.test.succeed); |
| }, |
| |
| function testIframe() { |
| checkStreamDetails('testIframe.csv', true); |
| var printMessageArrived = new Promise(function(resolve, reject) { |
| window.addEventListener('message', function(event) { |
| chrome.test.assertEq('print', event.data.type); |
| resolve(); |
| }, false); |
| }); |
| var contentRead = fetchUrl(streamDetails.streamUrl) |
| .then(expectSuccessfulRead); |
| Promise.all([printMessageArrived, contentRead]).then(chrome.test.succeed); |
| }, |
| |
| function testAbort() { |
| checkStreamDetails('testAbort.csv', false); |
| chrome.mimeHandlerPrivate.abortStream(function() { |
| fetchUrl(streamDetails.streamUrl).then(function(response) { |
| chrome.test.assertEq(0, response.status); |
| chrome.test.assertEq('error', response.data); |
| chrome.test.succeed(); |
| }); |
| }); |
| }, |
| |
| function testNonAsciiHeaders() { |
| checkStreamDetails('testNonAsciiHeaders.csv', false); |
| chrome.test.assertEq(undefined, |
| streamDetails.responseHeaders['Content-Disposition']); |
| chrome.test.assertEq(undefined, |
| streamDetails.responseHeaders['ΓΌ']); |
| chrome.test.succeed(); |
| }, |
| |
| function testPostMessage() { |
| var expectedMessages = ['hey', 100, 25.0]; |
| var messagesReceived = 0; |
| function handleMessage(event) { |
| if (event.data == 'succeed' && |
| messagesReceived == expectedMessages.length) { |
| chrome.test.succeed(); |
| } else if (event.data == 'fail') { |
| chrome.test.fail(); |
| } else if (event.data == expectedMessages[messagesReceived]) { |
| event.source.postMessage(event.data, '*'); |
| messagesReceived++; |
| } else if (event.data != 'initBeforeUnload') { |
| chrome.test.fail('unexpected message ' + event.data); |
| } |
| } |
| window.addEventListener('message', handleMessage, false); |
| while (queuedMessages.length) { |
| handleMessage(queuedMessages.shift()); |
| } |
| }, |
| |
| function testDataUrl() { |
| // TODO(raymes): have separate checks for embedded/unembedded data URLs. |
| checkStreamDetailsNoFile(); |
| fetchUrl(streamDetails.streamUrl) |
| .then(expectSuccessfulRead) |
| .then(chrome.test.succeed); |
| }, |
| |
| function testDataUrlLong() { |
| checkStreamDetailsNoFile(); |
| fetchUrl(streamDetails.streamUrl) |
| .then(expectSuccessfulReadLong) |
| .then(chrome.test.succeed); |
| }, |
| |
| function testResizeBeforeAttach() { |
| checkStreamDetails('testResizeBeforeAttach.csv', true); |
| chrome.test.succeed(); |
| }, |
| |
| function testFullscreen() { |
| function waitForFullscreenAnimation() { |
| return new Promise(resolve => { |
| chrome.runtime.getPlatformInfo(info => { |
| if (info.os != 'mac') { |
| resolve(); |
| return; |
| } |
| // Switching in and out of fullscreen doesn't finish until the |
| // animation finishes on Mac. |
| window.setTimeout(resolve, 1000); |
| }); |
| }); |
| } |
| checkStreamDetails('testFullscreen.csv', false); |
| var calls = 0; |
| var windowId; |
| window.addEventListener('webkitfullscreenchange', async e => { |
| switch (calls) { |
| case 0: // On fullscreen entered. |
| chrome.test.assertTrue(document.webkitIsFullScreen); |
| chrome.test.assertEq(document.body, document.webkitFullscreenElement); |
| await waitForFullscreenAnimation(); |
| chrome.tabs.get(streamDetails.tabId, tab => { |
| chrome.test.assertTrue(tab != null); |
| windowId = tab.windowId; |
| chrome.windows.get(windowId, currentWindow => { |
| chrome.test.assertEq('fullscreen', currentWindow.state); |
| // The mime handler decides to exit fullscreen. |
| document.webkitExitFullscreen(); |
| }); |
| }); |
| break; |
| case 1: // On fullscreen exited. |
| chrome.test.assertFalse(document.webkitIsFullScreen); |
| chrome.test.assertEq(null, document.webkitFullscreenElement); |
| await waitForFullscreenAnimation(); |
| chrome.windows.get(windowId, currentWindow => { |
| chrome.test.assertFalse('fullscreen' == currentWindow.state, |
| currentWindow.state); |
| chrome.test.runWithUserGesture( |
| () => document.body.webkitRequestFullscreen()); |
| }); |
| break; |
| case 2: // On fullscreen entered again. |
| chrome.test.assertTrue(document.webkitIsFullScreen); |
| chrome.test.assertEq(document.body, document.webkitFullscreenElement); |
| await waitForFullscreenAnimation(); |
| chrome.windows.get(windowId, currentWindow => { |
| chrome.test.assertEq('fullscreen', currentWindow.state); |
| // Emulate the user pressing escape to exit fullscreen. |
| chrome.windows.update(windowId, {state: 'normal'}); |
| }); |
| break; |
| case 3: // On fullscreen exited. |
| chrome.test.assertFalse(document.webkitIsFullScreen); |
| chrome.test.assertEq(null, document.webkitFullscreenElement); |
| await waitForFullscreenAnimation(); |
| chrome.windows.get(windowId, currentWindow => { |
| chrome.test.assertEq('normal', currentWindow.state); |
| chrome.test.succeed(); |
| }); |
| break; |
| } |
| calls++; |
| }); |
| chrome.test.runWithUserGesture( |
| () => document.body.webkitRequestFullscreen()); |
| }, |
| |
| function testBackgroundPage() { |
| checkStreamDetails('testBackgroundPage.csv', false); |
| chrome.runtime.getBackgroundPage(backgroundPage => { |
| backgroundPage.startBackgroundPageTest(() => { |
| // Fail if the background page receives an onSuspend event. |
| chrome.test.fail('Unexpected onSuspend'); |
| }); |
| // Wait for the background page to timeout. The timeouts are set to 1ms |
| // for this test, but give it 100ms just in case. |
| window.setTimeout(() => { |
| // If the background page has shut down, its window.localStorage will be |
| // null. |
| chrome.test.assertTrue(backgroundPage.window.localStorage != null); |
| backgroundPage.endBackgroundPageTest(); |
| chrome.test.succeed(); |
| }, 100); |
| }); |
| }, |
| |
| function testTargetBlankAnchor() { |
| checkStreamDetails('testTargetBlankAnchor.csv', false); |
| var anchor = document.createElement('a'); |
| anchor.href = 'about:blank'; |
| anchor.target = '_blank'; |
| document.body.appendChild(anchor); |
| anchor.click(); |
| chrome.test.succeed(); |
| }, |
| |
| function testBeforeUnloadNoDialog() { |
| checkStreamDetails('testBeforeUnloadNoDialog.csv', false); |
| chrome.mimeHandlerPrivate.setShowBeforeUnloadDialog( |
| false, chrome.test.succeed); |
| }, |
| |
| function testBeforeUnloadShowDialog() { |
| checkStreamDetails('testBeforeUnloadShowDialog.csv', false); |
| chrome.mimeHandlerPrivate.setShowBeforeUnloadDialog( |
| true, chrome.test.succeed); |
| }, |
| ]; |
| |
| var testsByName = {}; |
| for (let i = 0; i < tests.length; i++) { |
| testsByName[tests[i].name] = tests[i]; |
| } |
| |
| chrome.mimeHandlerPrivate.getStreamInfo(function(streamInfo) { |
| if (!streamInfo) |
| return; |
| |
| // If the name of the file we're handling matches the name of a test, run that |
| // test. |
| var urlComponents = streamInfo.originalUrl.split('/'); |
| var test = urlComponents[urlComponents.length - 1].split('.')[0]; |
| streamDetails = streamInfo; |
| if (testsByName[test]) { |
| window.removeEventListener('message', queueMessage); |
| chrome.test.runTests([testsByName[test]]); |
| } |
| |
| // Run the test for data URLs. |
| if (streamInfo.originalUrl.startsWith("data:")) { |
| window.removeEventListener('message', queueMessage); |
| // Long data URLs get truncated. |
| if (streamInfo.originalUrl == "data:") |
| chrome.test.runTests([testsByName['testDataUrlLong']]); |
| else |
| chrome.test.runTests([testsByName['testDataUrl']]); |
| } |
| }); |