flutter_flutter/packages/flutter/test/painting/_test_http_request.dart
Kate Lovett a04fb324be
Bump Dart to 3.8 and reformat (#171703)
Bumps the Dart version to 3.8 across the repo (excluding
engine/src/flutter/third_party) and applies formatting updates from Dart
3.8.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [ ] I listed at least one issue that this PR fixes in the description
above.
- [ ] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
2025-07-07 17:58:32 +00:00

174 lines
4.4 KiB
Dart

// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:js_interop';
import 'package:web/web.dart' as web;
/// Defines a new property on an Object.
@JS('Object.defineProperty')
external void objectDefineProperty(JSAny o, String symbol, JSAny desc);
void createGetter(JSAny mock, String key, JSAny? Function() get) {
objectDefineProperty(mock, key, <String, JSFunction>{'get': (() => get()).toJS}.jsify()!);
}
@JS()
@staticInterop
@anonymous
class DomXMLHttpRequestMock {
external factory DomXMLHttpRequestMock({
JSFunction? open,
JSString responseType,
JSNumber timeout,
JSBoolean withCredentials,
JSFunction? send,
JSFunction? setRequestHeader,
JSFunction addEventListener,
});
}
typedef _DartDomEventListener = JSVoid Function(web.Event event);
class TestHttpRequest {
TestHttpRequest() {
_mock = DomXMLHttpRequestMock(
open: open.toJS,
send: send.toJS,
setRequestHeader: setRequestHeader.toJS,
addEventListener: addEventListener.toJS,
);
final JSAny mock = _mock as JSAny;
createGetter(mock, 'headers', () => headers.jsify());
createGetter(mock, 'responseHeaders', () => responseHeaders.jsify());
createGetter(mock, 'status', () => status.toJS);
createGetter(mock, 'response', () => response.jsify());
}
late DomXMLHttpRequestMock _mock;
MockEvent? mockEvent;
Map<String, String> headers = <String, String>{};
int status = -1;
Object? response;
Map<String, String> get responseHeaders => headers;
JSVoid open(String method, String url, bool async) {}
JSVoid send() {}
JSVoid setRequestHeader(String name, String value) {
headers[name] = value;
}
JSVoid addEventListener(String type, web.EventListener listener) {
if (type == mockEvent?.type) {
final _DartDomEventListener dartListener =
(listener as JSExportedDartFunction).toDart as _DartDomEventListener;
dartListener(mockEvent!.event);
}
}
web.XMLHttpRequest getMock() => _mock as web.XMLHttpRequest;
}
class MockEvent {
MockEvent(this.type, this.event);
final String type;
final web.Event event;
}
@JS()
@staticInterop
@anonymous
class ImgElementMock {
external factory ImgElementMock({JSFunction? decode});
}
class TestImgElement {
TestImgElement() {
_mock = ImgElementMock(decode: decode.toJS);
final JSAny mock = _mock as JSAny;
objectDefineProperty(
mock,
'src',
<String, JSFunction>{
'get': (() => src).toJS,
'set': ((JSString newValue) {
src = newValue.toDart;
}).toJS,
}.jsify()!,
);
objectDefineProperty(
mock,
'naturalWidth',
<String, JSFunction>{
'get': (() => naturalWidth).toJS,
'set': ((JSNumber newValue) {
naturalWidth = newValue.toDartInt;
}).toJS,
}.jsify()!,
);
objectDefineProperty(
mock,
'naturalHeight',
<String, JSFunction>{
'get': (() => naturalHeight).toJS,
'set': ((JSNumber newValue) {
naturalHeight = newValue.toDartInt;
}).toJS,
}.jsify()!,
);
}
late ImgElementMock _mock;
String src = '';
int naturalWidth = -1;
int naturalHeight = -1;
// Either `decode` or `decodeSuccess/Failure` may be called first.
// The following fields allow properly handling either case.
bool _callbacksAssigned = false;
late final JSFunction _resolveFunc;
late final JSFunction _rejectFunc;
bool _resultAssigned = false;
late final bool _resultSuccessful;
JSPromise<JSAny?> decode() {
if (_resultAssigned) {
return switch (_resultSuccessful) {
true => Future<JSAny?>.value().toJS,
false => Future<JSAny?>.error(Error()).toJS,
};
}
_callbacksAssigned = true;
return JSPromise<JSAny?>(
(JSFunction resolveFunc, JSFunction rejectFunc) {
_resolveFunc = resolveFunc;
_rejectFunc = rejectFunc;
}.toJS,
);
}
void decodeSuccess() {
if (_callbacksAssigned) {
_resolveFunc.callAsFunction();
} else {
_resultAssigned = true;
_resultSuccessful = true;
}
}
void decodeFailure() {
if (_callbacksAssigned) {
_rejectFunc.callAsFunction();
} else {
_resultAssigned = true;
_resultSuccessful = false;
}
}
web.HTMLImageElement getMock() => _mock as web.HTMLImageElement;
}