| // 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; |
| } |