Pin Chrome's shortcut to the Win10 Start menu on install and OS upgrade.
[chromium-blink-merge.git] / chrome / test / data / extensions / api_test / mime_handler_view / index.js
blob6a142356dde283e5cca9c4548fa6b681c23eb261
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 'use strict';
7 // Tests don't start running until an async call to
8 // chrome.mimeHandlerPrivate.getStreamInfo() completes, so queue any messages
9 // received until that point.
10 var queuedMessages = [];
12 function queueMessage(event) {
13   queuedMessages.push(event);
16 window.addEventListener('message', queueMessage, false);
18 var streamDetails;
20 function fetchUrl(url) {
21   return new Promise(function(resolve, reject) {
22     var request = new XMLHttpRequest();
23     request.onreadystatechange = function() {
24       if (request.readyState == 4) {
25         resolve({
26           status: request.status,
27           data: request.responseText,
28         });
29       }
30     };
31     request.open('GET', streamDetails.streamUrl, true);
32     request.send();
33   });
36 function expectSuccessfulRead(response) {
37   chrome.test.assertEq(200, response.status);
38   chrome.test.assertEq('content to read\n', response.data);
41 function expectSuccessfulReadLong(response) {
42   chrome.test.assertEq(200, response.status);
43   chrome.test.assertTrue(response.data.indexOf('content to read\n') === 0);
46 function checkStreamDetails(name, embedded) {
47   checkStreamDetailsNoFile();
48   chrome.test.assertEq(embedded, streamDetails.embedded);
49   chrome.test.assertTrue(streamDetails.originalUrl.indexOf(name) != -1);
50   chrome.test.assertEq('text/csv',
51                        streamDetails.responseHeaders['Content-Type']);
54 function checkStreamDetailsNoFile() {
55   chrome.test.assertEq('text/csv', streamDetails.mimeType);
56   chrome.test.assertTrue(streamDetails.tabId != -1);
59 var tests = [
60   function testBasic() {
61     checkStreamDetails('testBasic.csv', false);
62     fetchUrl(streamDetails.streamUrl)
63         .then(expectSuccessfulRead)
64         .then(chrome.test.succeed);
65   },
67   function testEmbedded() {
68     checkStreamDetails('testEmbedded.csv', true);
69     fetchUrl(streamDetails.streamUrl)
70         .then(expectSuccessfulRead)
71         .then(chrome.test.succeed);
72   },
74   function testIframe() {
75     checkStreamDetails('testIframe.csv', true);
76     var printMessageArrived = new Promise(function(resolve, reject) {
77       window.addEventListener('message', function(event) {
78         chrome.test.assertEq('print', event.data.type);
79         resolve();
80       }, false);
81     });
82     var contentRead = fetchUrl(streamDetails.streamUrl)
83         .then(expectSuccessfulRead);
84     Promise.all([printMessageArrived, contentRead]).then(chrome.test.succeed);
85   },
87   function testAbort() {
88     checkStreamDetails('testAbort.csv', false);
89     chrome.mimeHandlerPrivate.abortStream(function() {
90       fetchUrl(streamDetails.streamUrl).then(function(response) {
91         chrome.test.assertEq(404, response.status);
92         chrome.test.assertEq('', response.data);
93         chrome.test.succeed();
94       });
95     });
96   },
98   function testNonAsciiHeaders() {
99     checkStreamDetails('testNonAsciiHeaders.csv', false);
100     chrome.test.assertEq(undefined,
101                          streamDetails.responseHeaders['Content-Disposition']);
102     chrome.test.assertEq(undefined,
103                          streamDetails.responseHeaders['ΓΌ']);
104     chrome.test.succeed();
105   },
107   function testPostMessage() {
108     var expectedMessages = ['hey', 100, 25.0];
109     var messagesReceived = 0;
110     function handleMessage(event) {
111       if (event.data == 'succeed' &&
112           messagesReceived == expectedMessages.length) {
113         chrome.test.succeed();
114       } else if (event.data == 'fail') {
115         chrome.test.fail();
116       } else if (event.data == expectedMessages[messagesReceived]) {
117         event.source.postMessage(event.data, '*');
118         messagesReceived++;
119       } else {
120         chrome.test.fail('unexpected message ' + event.data);
121       }
122     }
123     window.addEventListener('message', handleMessage, false);
124     while (queuedMessages.length) {
125       handleMessage(queuedMessages.shift());
126     }
127   },
129   function testDataUrl() {
130     // TODO(raymes): have separate checks for embedded/unembedded data URLs.
131     checkStreamDetailsNoFile();
132     fetchUrl(streamDetails.streamUrl)
133         .then(expectSuccessfulRead)
134         .then(chrome.test.succeed);
135   },
137   function testDataUrlLong() {
138     checkStreamDetailsNoFile();
139     fetchUrl(streamDetails.streamUrl)
140         .then(expectSuccessfulReadLong)
141         .then(chrome.test.succeed);
142   },
144   function testResizeBeforeAttach() {
145     checkStreamDetails('testResizeBeforeAttach.csv', true);
146     chrome.test.succeed();
147   }
150 var testsByName = {};
151 for (let i = 0; i < tests.length; i++) {
152   testsByName[tests[i].name] = tests[i];
155 chrome.mimeHandlerPrivate.getStreamInfo(function(streamInfo) {
156   if (!streamInfo)
157     return;
159   // If the name of the file we're handling matches the name of a test, run that
160   // test.
161   var urlComponents = streamInfo.originalUrl.split('/');
162   var test = urlComponents[urlComponents.length - 1].split('.')[0];
163   streamDetails = streamInfo;
164   if (testsByName[test]) {
165     window.removeEventListener('message', queueMessage);
166     chrome.test.runTests([testsByName[test]]);
167   }
169   // Run the test for data URLs.
170   if (streamInfo.originalUrl.indexOf("data:") === 0) {
171     window.removeEventListener('message', queueMessage);
172     // Long data URLs get truncated.
173     if (streamInfo.originalUrl == "data:")
174       chrome.test.runTests([testsByName['testDataUrlLong']]);
175     else
176       chrome.test.runTests([testsByName['testDataUrl']]);
177   }