Skip to content

Commit 5775d2e

Browse files
ThomasAunvikditman
authored andcommitted
Attempt to fix tests
1 parent 61b792d commit 5775d2e

File tree

8 files changed

+677
-67
lines changed

8 files changed

+677
-67
lines changed

packages/webview_flutter/webview_flutter_web/lib/src/http_request_factory.dart

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
// Copyright 2013 The Flutter Authors. All rights reserved.
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
4-
import 'package:web/web.dart';
4+
import 'dart:typed_data';
5+
6+
import 'package:http/browser_client.dart';
7+
import 'package:http/http.dart' as http;
58

69
/// Factory class for creating [HttpRequest] instances.
710
class HttpRequestFactory {
@@ -60,21 +63,33 @@ class HttpRequestFactory {
6063
/// when the file cannot be found.
6164
///
6265
/// See also: [authorization headers](http://en.wikipedia.org/wiki/Basic_access_authentication).
63-
Future<XMLHttpRequest> request(String url,
64-
{String? method,
65-
bool? withCredentials,
66-
String? responseType,
67-
String? mimeType,
68-
Map<String, String>? requestHeaders,
69-
dynamic sendData,
70-
void Function(ProgressEvent e)? onProgress}) {
71-
return HttpRequest.request(url,
72-
method: method,
73-
withCredentials: withCredentials,
74-
responseType: responseType,
75-
mimeType: mimeType,
76-
requestHeaders: requestHeaders,
77-
sendData: sendData,
78-
onProgress: onProgress);
66+
Future<http.StreamedResponse> request(
67+
String url, {
68+
String? method,
69+
bool? withCredentials,
70+
String? mimeType,
71+
Map<String, String>? requestHeaders,
72+
Uint8List? sendData,
73+
}) {
74+
final BrowserClient client = BrowserClient();
75+
if (withCredentials != null) {
76+
client.withCredentials = withCredentials;
77+
}
78+
79+
final http.Request request = http.Request(method ?? 'GET', Uri.parse(url));
80+
81+
if (sendData != null) {
82+
request.bodyBytes = sendData.toList();
83+
}
84+
85+
if (mimeType != null) {
86+
request.headers['content-type'] = mimeType;
87+
}
88+
89+
if (requestHeaders != null) {
90+
request.headers.addAll(requestHeaders);
91+
}
92+
93+
return client.send(request);
7994
}
8095
}

packages/webview_flutter/webview_flutter_web/lib/src/web_webview_controller.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:ui_web' as ui_web;
77

88
import 'package:flutter/cupertino.dart';
99
import 'package:web/web.dart' as html;
10+
import 'package:http/http.dart' as http;
1011
import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart';
1112

1213
import 'content_type.dart';
@@ -86,22 +87,23 @@ class WebWebViewController extends PlatformWebViewController {
8687

8788
/// Performs an AJAX request defined by [params].
8889
Future<void> _updateIFrameFromXhr(LoadRequestParams params) async {
89-
final html.XMLHttpRequest httpReq =
90+
final http.StreamedResponse httpReq =
9091
await _webWebViewParams.httpRequestFactory.request(
9192
params.uri.toString(),
9293
method: params.method.serialize(),
9394
requestHeaders: params.headers,
9495
sendData: params.body,
9596
);
9697

97-
final String header =
98-
httpReq.getResponseHeader('content-type') ?? 'text/html';
98+
final String header = httpReq.headers['content-type'] ?? 'text/html';
9999
final ContentType contentType = ContentType.parse(header);
100100
final Encoding encoding = Encoding.getByName(contentType.charset) ?? utf8;
101101

102+
final http.Response response = await http.Response.fromStream(httpReq);
103+
102104
// ignore: unsafe_html
103105
_webWebViewParams.iFrame.src = Uri.dataFromString(
104-
httpReq.responseText,
106+
response.body,
105107
mimeType: contentType.mimeType,
106108
encoding: encoding,
107109
).toString();

packages/webview_flutter/webview_flutter_web/lib/src/webview_flutter_web_legacy.dart

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import 'package:flutter/foundation.dart';
1010
import 'package:flutter/gestures.dart';
1111
import 'package:flutter/widgets.dart';
1212
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
13+
import 'package:http/src/streamed_response.dart';
1314
import 'package:web/web.dart' as html;
15+
import 'package:http/http.dart' as http;
1416
// ignore: implementation_imports
1517
import 'package:webview_flutter_platform_interface/src/webview_flutter_platform_interface_legacy.dart';
1618

@@ -46,8 +48,8 @@ class WebWebViewPlatform implements WebViewPlatform {
4648
if (onWebViewPlatformCreated == null) {
4749
return;
4850
}
49-
final html.HTMLIFrameElement element =
50-
html.document.getElementById('webview-$viewId')! as html.HTMLIFrameElement;
51+
final html.HTMLIFrameElement element = html.document
52+
.getElementById('webview-$viewId')! as html.HTMLIFrameElement;
5153

5254
final String? initialUrl = creationParams.initialUrl;
5355
if (initialUrl != null) {
@@ -202,16 +204,18 @@ class WebWebViewPlatformController implements WebViewPlatformController {
202204
if (!request.uri.hasScheme) {
203205
throw ArgumentError('WebViewRequest#uri is required to have a scheme.');
204206
}
205-
final html.XMLHttpRequest httpReq = await _httpRequestFactory.request(
207+
final http.StreamedResponse httpReq = await _httpRequestFactory.request(
206208
request.uri.toString(),
207209
method: request.method.serialize(),
208210
requestHeaders: request.headers,
209211
sendData: request.body);
210-
final String contentType =
211-
httpReq.getResponseHeader('content-type') ?? 'text/html';
212-
// ignore: unsafe_html
212+
213+
final String contentType = httpReq.headers['content-type'] ?? 'text/html';
214+
215+
final http.Response response = await http.Response.fromStream(httpReq);
216+
213217
_element.src = Uri.dataFromString(
214-
httpReq.responseText,
218+
response.body,
215219
mimeType: contentType,
216220
encoding: utf8,
217221
).toString();

packages/webview_flutter/webview_flutter_web/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ dependencies:
2121
sdk: flutter
2222
flutter_web_plugins:
2323
sdk: flutter
24+
http: ^1.2.1
2425
web: ^0.5.1
2526
webview_flutter_platform_interface: ^2.0.0
2627

packages/webview_flutter/webview_flutter_web/test/legacy/webview_flutter_web_test.dart

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
6-
import 'package:web/helpers.dart';
7-
import 'package:web/web.dart' as html;
85
import 'dart:typed_data';
96

107
import 'package:flutter/material.dart';
118
import 'package:flutter_test/flutter_test.dart';
9+
import 'package:http/http.dart' as http;
1210
import 'package:mockito/annotations.dart';
1311
import 'package:mockito/mockito.dart';
12+
import 'package:web/web.dart' as html;
1413
import 'package:webview_flutter_platform_interface/src/webview_flutter_platform_interface_legacy.dart';
1514
import 'package:webview_flutter_web/src/http_request_factory.dart';
1615
import 'package:webview_flutter_web/src/webview_flutter_web_legacy.dart';
@@ -23,7 +22,7 @@ import 'webview_flutter_web_test.mocks.dart';
2322
CreationParams,
2423
WebViewPlatformCallbacksHandler,
2524
HttpRequestFactory,
26-
html.XMLHttpRequest,
25+
http.StreamedResponse,
2726
])
2827
void main() {
2928
TestWidgetsFlutterBinding.ensureInitialized();
@@ -47,7 +46,7 @@ void main() {
4746
group('WebWebViewPlatformController', () {
4847
test('loadUrl sets url on iframe src attribute', () {
4948
// Setup
50-
final MockIFrameElement mockElement = MockIFrameElement();
49+
final html.HTMLIFrameElement mockElement = html.HTMLIFrameElement();
5150
final WebWebViewPlatformController controller =
5251
WebWebViewPlatformController(
5352
mockElement,
@@ -61,7 +60,7 @@ void main() {
6160
group('loadHtmlString', () {
6261
test('loadHtmlString loads html into iframe', () {
6362
// Setup
64-
final MockIFrameElement mockElement = MockIFrameElement();
63+
final html.HTMLIFrameElement mockElement = html.HTMLIFrameElement();
6564
final WebWebViewPlatformController controller =
6665
WebWebViewPlatformController(
6766
mockElement,
@@ -75,22 +74,22 @@ void main() {
7574

7675
test('loadHtmlString escapes "#" correctly', () {
7776
// Setup
78-
final MockIFrameElement mockElement = MockIFrameElement();
77+
final html.HTMLIFrameElement mockElement = html.HTMLIFrameElement();
7978
final WebWebViewPlatformController controller =
8079
WebWebViewPlatformController(
8180
mockElement,
8281
);
8382
// Run
8483
controller.loadHtmlString('#');
8584
// Verify
86-
verify(mockElement.src = argThat(contains('%23')));
85+
verify(mockElement.src = argThat(contains('%23')) ?? '');
8786
});
8887
});
8988

9089
group('loadRequest', () {
9190
test('loadRequest throws ArgumentError on missing scheme', () {
9291
// Setup
93-
final MockIFrameElement mockElement = MockIFrameElement();
92+
final html.HTMLIFrameElement mockElement = html.HTMLIFrameElement();
9493
final WebWebViewPlatformController controller =
9594
WebWebViewPlatformController(
9695
mockElement,
@@ -109,23 +108,26 @@ void main() {
109108
test('loadRequest makes request and loads response into iframe',
110109
() async {
111110
// Setup
112-
final MockIFrameElement mockElement = MockIFrameElement();
111+
final html.HTMLIFrameElement mockElement = html.HTMLIFrameElement();
113112
final WebWebViewPlatformController controller =
114113
WebWebViewPlatformController(
115114
mockElement,
116115
);
117-
final MockHttpRequest mockHttpRequest = MockHttpRequest();
118-
when(mockHttpRequest.getResponseHeader('content-type'))
119-
.thenReturn('text/plain');
120-
when(mockHttpRequest.responseText).thenReturn('test data');
116+
final MockStreamedResponse mockHttpRequest = MockStreamedResponse();
117+
when(mockHttpRequest.headers['content-type']).thenReturn('text/plain');
118+
119+
final http.Response res =
120+
await http.Response.fromStream(mockHttpRequest);
121+
when(res.body).thenReturn('test data');
121122
final MockHttpRequestFactory mockHttpRequestFactory =
122123
MockHttpRequestFactory();
123124
when(mockHttpRequestFactory.request(
124125
any,
125126
method: anyNamed('method'),
126127
requestHeaders: anyNamed('requestHeaders'),
127128
sendData: anyNamed('sendData'),
128-
)).thenAnswer((_) => Future<XMLHttpRequest>.value(mockHttpRequest));
129+
)).thenAnswer(
130+
(_) => Future<http.StreamedResponse>.value(mockHttpRequest));
129131
controller.httpRequestFactory = mockHttpRequestFactory;
130132
// Run
131133
await controller.loadRequest(
@@ -148,23 +150,26 @@ void main() {
148150

149151
test('loadRequest escapes "#" correctly', () async {
150152
// Setup
151-
final MockIFrameElement mockElement = MockIFrameElement();
153+
final html.HTMLIFrameElement mockElement = html.HTMLIFrameElement();
152154
final WebWebViewPlatformController controller =
153155
WebWebViewPlatformController(
154156
mockElement,
155157
);
156-
final MockHttpRequest mockHttpRequest = MockHttpRequest();
157-
when(mockHttpRequest.getResponseHeader('content-type'))
158-
.thenReturn('text/html');
159-
when(mockHttpRequest.responseText).thenReturn('#');
158+
final MockStreamedResponse mockHttpRequest = MockStreamedResponse();
159+
when(mockHttpRequest.headers['content-type']).thenReturn('text/html');
160+
161+
final http.Response res =
162+
await http.Response.fromStream(mockHttpRequest);
163+
when(res.body).thenReturn('#');
160164
final MockHttpRequestFactory mockHttpRequestFactory =
161165
MockHttpRequestFactory();
162166
when(mockHttpRequestFactory.request(
163167
any,
164168
method: anyNamed('method'),
165169
requestHeaders: anyNamed('requestHeaders'),
166170
sendData: anyNamed('sendData'),
167-
)).thenAnswer((_) => Future<XMLHttpRequest>.value(mockHttpRequest));
171+
)).thenAnswer(
172+
(_) => Future<http.StreamedResponse>.value(mockHttpRequest));
168173
controller.httpRequestFactory = mockHttpRequestFactory;
169174
// Run
170175
await controller.loadRequest(
@@ -175,7 +180,7 @@ void main() {
175180
headers: <String, String>{'Foo': 'Bar'}),
176181
);
177182
// Verify
178-
verify(mockElement.src = argThat(contains('%23')));
183+
verify(mockElement.src = argThat(contains('%23')) ?? '');
179184
});
180185
});
181186
});

0 commit comments

Comments
 (0)