Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / http / tests / local / serviceworker / fetch-request-body-file.html
1 <!DOCTYPE html>
2 <script src="../../resources/testharness.js"></script>
3 <script src="../../resources/testharnessreport.js"></script>
4 <script src="../../serviceworker/resources/test-helpers.js"></script>
5 <body>
6 <script>
7 var ORIGIN = get_host_info()['HTTP_ORIGIN'];
8 var IFRAME_BASE_URL = ORIGIN + '/local/serviceworker/resources/fetch-request-body-file-iframe.html';
9 var SCOPE = ORIGIN + '/local/serviceworker/resources/fetch-request-body-file-test';
10
11 function register() {
12   return new Promise(function(resolve, reject) {
13       with_iframe(IFRAME_BASE_URL + '?register')
14         .then(function(frame) {
15             var channel = new MessageChannel;
16             channel.port1.onmessage = function(msg) {
17                 if (msg.data.msg == 'registered') {
18                   unload_iframe(frame);
19                   resolve();
20                 } else {
21                   reject(msg.data.msg);
22                 }
23               };
24             frame.contentWindow.postMessage({}, [channel.port2], "*");
25           });
26     });
27 }
28
29 function unregister_and_done(t) {
30   return new Promise(function(resolve, reject) {
31       with_iframe(IFRAME_BASE_URL + '?unregister')
32         .then(function(frame) {
33             var channel = new MessageChannel;
34             channel.port1.onmessage = function(msg) {
35                 if (msg.data.msg == 'unregistered') {
36                   unload_iframe(frame);
37                   t.done();
38                 } else {
39                   reject(msg.data.msg);
40                 }
41               };
42             frame.contentWindow.postMessage({}, [channel.port2], "*");
43           });
44     });
45 }
46
47 function get_boundary(headers) {
48   var reg = new RegExp('multipart\/form-data; boundary=(.*)');
49   for (var i = 0; i < headers.length; ++i) {
50     if (headers[i][0] != 'content-type') {
51       continue;
52     }
53     var regResult = reg.exec(headers[i][1]);
54     if (!regResult) {
55       continue;
56     }
57     return regResult[1];
58   }
59   return '';
60 }
61
62 function send_post_frame_promise(action) {
63   return new Promise(function(resolve) {
64       var frame_name = 'frame_name';
65       var frame = document.createElement('iframe');
66       frame.name = frame_name;
67       document.body.appendChild(frame);
68       var form = document.createElement('form');
69       form.target = frame_name;
70       form.enctype = 'multipart/form-data';
71       form.action = SCOPE + '?' + action;
72       form.method = 'post';
73       var input1 = document.createElement('input');
74       input1.type = 'text';
75       input1.value = 'testValue1';
76       input1.name = 'testName1'
77       form.appendChild(input1);
78       var input2 = document.createElement('input');
79       input2.type = 'text';
80       input2.value = 'testValue2';
81       input2.name = 'testName2'
82       form.appendChild(input2);
83       var input3 = document.createElement('input');
84       input3.type = 'file';
85       input3.name = 'testFile'
86       form.appendChild(input3);
87       document.body.appendChild(form);
88       eventSender.beginDragWithFiles(
89         ["../resources/file-for-drag-to-send.txt"]);
90       eventSender.mouseMoveTo(input3.offsetLeft + input3.offsetWidth / 2,
91                               input3.offsetTop + input3.offsetHeight / 2);
92       eventSender.mouseUp();
93       frame.onload = function() {
94         document.body.removeChild(form);
95         resolve(frame);
96       };
97       form.submit();
98     });
99 }
100
101 function create_expected_body(boundary) {
102   return '--' + boundary + '\r\n' +
103          'Content-Disposition: form-data; name="testName1"\r\n' +
104          '\r\n' +
105          'testValue1\r\n' +
106          '--' + boundary + '\r\n' +
107          'Content-Disposition: form-data; name="testName2"\r\n' +
108          '\r\n' +
109          'testValue2\r\n' +
110          '--' + boundary + '\r\n' +
111          'Content-Disposition: form-data; name="testFile"; filename="file-for-drag-to-send.txt"\r\n' +
112          'Content-Type: text/plain\r\n' +
113          '\r\n' +
114          '1234567890\r\n' +
115          '--' + boundary + '--\r\n';
116 }
117
118 function as_text_test_frame_check(frame) {
119   var data = JSON.parse(frame.contentDocument.body.textContent);
120   unload_iframe(frame);
121   assert_equals(data.method, 'POST');
122   var boundary = get_boundary(data.headers);
123   var expected_body = create_expected_body(boundary);
124   assert_equals(data.body, expected_body);
125 }
126
127 function as_blob_test_frame_check(frame) {
128   var data = JSON.parse(frame.contentDocument.body.textContent);
129   unload_iframe(frame);
130   assert_equals(data.method, 'POST');
131   var boundary = get_boundary(data.headers);
132   var expected_body = create_expected_body(boundary);
133   assert_equals(data.body_size, expected_body.length);
134 }
135
136 async_test(function(t) {
137     register()
138       .then(function() { return send_post_frame_promise('asText'); })
139       .then(as_text_test_frame_check)
140       .then(function() { return send_post_frame_promise('asBlob'); })
141       .then(as_blob_test_frame_check)
142       .then(function() { return unregister_and_done(t); })
143       .catch(unreached_rejection(t));
144   }, 'Service Worker fetch request body with file.');
145 </script>
146 </body>