// Mocks generated by Mockito 5.3.2 from annotations
// in webview_flutter_web/test/legacy/webview_flutter_web_test.dart.
// Do not manually edit this file.

// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i6;
import 'dart:html' as _i2;
import 'dart:math' as _i3;

import 'package:flutter/foundation.dart' as _i5;
import 'package:flutter/src/widgets/notification_listener.dart' as _i7;
import 'package:flutter/widgets.dart' as _i4;
import 'package:mockito/mockito.dart' as _i1;
import 'package:webview_flutter_platform_interface/src/legacy/platform_interface/webview_platform_callbacks_handler.dart'
    as _i9;
import 'package:webview_flutter_platform_interface/src/legacy/types/types.dart'
    as _i8;
import 'package:webview_flutter_web/src/http_request_factory.dart' as _i10;

// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
// ignore_for_file: implementation_imports
// ignore_for_file: invalid_use_of_visible_for_testing_member
// ignore_for_file: prefer_const_constructors
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class

class _FakeCssClassSet_0 extends _i1.SmartFake implements _i2.CssClassSet {
  _FakeCssClassSet_0(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRectangle_1<T extends num> extends _i1.SmartFake
    implements _i3.Rectangle<T> {
  _FakeRectangle_1(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCssRect_2 extends _i1.SmartFake implements _i2.CssRect {
  _FakeCssRect_2(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePoint_3<T extends num> extends _i1.SmartFake
    implements _i3.Point<T> {
  _FakePoint_3(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeElementEvents_4 extends _i1.SmartFake implements _i2.ElementEvents {
  _FakeElementEvents_4(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCssStyleDeclaration_5 extends _i1.SmartFake
    implements _i2.CssStyleDeclaration {
  _FakeCssStyleDeclaration_5(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeElementStream_6<T extends _i2.Event> extends _i1.SmartFake
    implements _i2.ElementStream<T> {
  _FakeElementStream_6(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeElementList_7<T extends _i2.Element> extends _i1.SmartFake
    implements _i2.ElementList<T> {
  _FakeElementList_7(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeScrollState_8 extends _i1.SmartFake implements _i2.ScrollState {
  _FakeScrollState_8(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeAnimation_9 extends _i1.SmartFake implements _i2.Animation {
  _FakeAnimation_9(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeElement_10 extends _i1.SmartFake implements _i2.Element {
  _FakeElement_10(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeShadowRoot_11 extends _i1.SmartFake implements _i2.ShadowRoot {
  _FakeShadowRoot_11(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeDocumentFragment_12 extends _i1.SmartFake
    implements _i2.DocumentFragment {
  _FakeDocumentFragment_12(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeNode_13 extends _i1.SmartFake implements _i2.Node {
  _FakeNode_13(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeWidget_14 extends _i1.SmartFake implements _i4.Widget {
  _FakeWidget_14(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );

  @override
  String toString({_i5.DiagnosticLevel? minLevel = _i5.DiagnosticLevel.info}) =>
      super.toString();
}

class _FakeInheritedWidget_15 extends _i1.SmartFake
    implements _i4.InheritedWidget {
  _FakeInheritedWidget_15(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );

  @override
  String toString({_i5.DiagnosticLevel? minLevel = _i5.DiagnosticLevel.info}) =>
      super.toString();
}

class _FakeDiagnosticsNode_16 extends _i1.SmartFake
    implements _i5.DiagnosticsNode {
  _FakeDiagnosticsNode_16(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );

  @override
  String toString({
    _i5.TextTreeConfiguration? parentConfiguration,
    _i5.DiagnosticLevel? minLevel = _i5.DiagnosticLevel.info,
  }) =>
      super.toString();
}

class _FakeHttpRequest_17 extends _i1.SmartFake implements _i2.HttpRequest {
  _FakeHttpRequest_17(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeHttpRequestUpload_18 extends _i1.SmartFake
    implements _i2.HttpRequestUpload {
  _FakeHttpRequestUpload_18(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeEvents_19 extends _i1.SmartFake implements _i2.Events {
  _FakeEvents_19(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

/// A class which mocks [IFrameElement].
///
/// See the documentation for Mockito's code generation for more information.
class MockIFrameElement extends _i1.Mock implements _i2.IFrameElement {
  MockIFrameElement() {
    _i1.throwOnMissingStub(this);
  }

  @override
  set allow(String? value) => super.noSuchMethod(
        Invocation.setter(
          #allow,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set allowFullscreen(bool? value) => super.noSuchMethod(
        Invocation.setter(
          #allowFullscreen,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set allowPaymentRequest(bool? value) => super.noSuchMethod(
        Invocation.setter(
          #allowPaymentRequest,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set csp(String? value) => super.noSuchMethod(
        Invocation.setter(
          #csp,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set height(String? value) => super.noSuchMethod(
        Invocation.setter(
          #height,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set name(String? value) => super.noSuchMethod(
        Invocation.setter(
          #name,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set referrerPolicy(String? value) => super.noSuchMethod(
        Invocation.setter(
          #referrerPolicy,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set src(String? value) => super.noSuchMethod(
        Invocation.setter(
          #src,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set srcdoc(String? value) => super.noSuchMethod(
        Invocation.setter(
          #srcdoc,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set width(String? value) => super.noSuchMethod(
        Invocation.setter(
          #width,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set nonce(String? value) => super.noSuchMethod(
        Invocation.setter(
          #nonce,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  Map<String, String> get attributes => (super.noSuchMethod(
        Invocation.getter(#attributes),
        returnValue: <String, String>{},
      ) as Map<String, String>);
  @override
  set attributes(Map<String, String>? value) => super.noSuchMethod(
        Invocation.setter(
          #attributes,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  List<_i2.Element> get children => (super.noSuchMethod(
        Invocation.getter(#children),
        returnValue: <_i2.Element>[],
      ) as List<_i2.Element>);
  @override
  set children(List<_i2.Element>? value) => super.noSuchMethod(
        Invocation.setter(
          #children,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i2.CssClassSet get classes => (super.noSuchMethod(
        Invocation.getter(#classes),
        returnValue: _FakeCssClassSet_0(
          this,
          Invocation.getter(#classes),
        ),
      ) as _i2.CssClassSet);
  @override
  set classes(Iterable<String>? value) => super.noSuchMethod(
        Invocation.setter(
          #classes,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  Map<String, String> get dataset => (super.noSuchMethod(
        Invocation.getter(#dataset),
        returnValue: <String, String>{},
      ) as Map<String, String>);
  @override
  set dataset(Map<String, String>? value) => super.noSuchMethod(
        Invocation.setter(
          #dataset,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i3.Rectangle<num> get client => (super.noSuchMethod(
        Invocation.getter(#client),
        returnValue: _FakeRectangle_1<num>(
          this,
          Invocation.getter(#client),
        ),
      ) as _i3.Rectangle<num>);
  @override
  _i3.Rectangle<num> get offset => (super.noSuchMethod(
        Invocation.getter(#offset),
        returnValue: _FakeRectangle_1<num>(
          this,
          Invocation.getter(#offset),
        ),
      ) as _i3.Rectangle<num>);
  @override
  String get localName => (super.noSuchMethod(
        Invocation.getter(#localName),
        returnValue: '',
      ) as String);
  @override
  _i2.CssRect get contentEdge => (super.noSuchMethod(
        Invocation.getter(#contentEdge),
        returnValue: _FakeCssRect_2(
          this,
          Invocation.getter(#contentEdge),
        ),
      ) as _i2.CssRect);
  @override
  _i2.CssRect get paddingEdge => (super.noSuchMethod(
        Invocation.getter(#paddingEdge),
        returnValue: _FakeCssRect_2(
          this,
          Invocation.getter(#paddingEdge),
        ),
      ) as _i2.CssRect);
  @override
  _i2.CssRect get borderEdge => (super.noSuchMethod(
        Invocation.getter(#borderEdge),
        returnValue: _FakeCssRect_2(
          this,
          Invocation.getter(#borderEdge),
        ),
      ) as _i2.CssRect);
  @override
  _i2.CssRect get marginEdge => (super.noSuchMethod(
        Invocation.getter(#marginEdge),
        returnValue: _FakeCssRect_2(
          this,
          Invocation.getter(#marginEdge),
        ),
      ) as _i2.CssRect);
  @override
  _i3.Point<num> get documentOffset => (super.noSuchMethod(
        Invocation.getter(#documentOffset),
        returnValue: _FakePoint_3<num>(
          this,
          Invocation.getter(#documentOffset),
        ),
      ) as _i3.Point<num>);
  @override
  set innerHtml(String? html) => super.noSuchMethod(
        Invocation.setter(
          #innerHtml,
          html,
        ),
        returnValueForMissingStub: null,
      );
  @override
  String get innerText => (super.noSuchMethod(
        Invocation.getter(#innerText),
        returnValue: '',
      ) as String);
  @override
  set innerText(String? value) => super.noSuchMethod(
        Invocation.setter(
          #innerText,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i2.ElementEvents get on => (super.noSuchMethod(
        Invocation.getter(#on),
        returnValue: _FakeElementEvents_4(
          this,
          Invocation.getter(#on),
        ),
      ) as _i2.ElementEvents);
  @override
  int get offsetHeight => (super.noSuchMethod(
        Invocation.getter(#offsetHeight),
        returnValue: 0,
      ) as int);
  @override
  int get offsetLeft => (super.noSuchMethod(
        Invocation.getter(#offsetLeft),
        returnValue: 0,
      ) as int);
  @override
  int get offsetTop => (super.noSuchMethod(
        Invocation.getter(#offsetTop),
        returnValue: 0,
      ) as int);
  @override
  int get offsetWidth => (super.noSuchMethod(
        Invocation.getter(#offsetWidth),
        returnValue: 0,
      ) as int);
  @override
  int get scrollHeight => (super.noSuchMethod(
        Invocation.getter(#scrollHeight),
        returnValue: 0,
      ) as int);
  @override
  int get scrollLeft => (super.noSuchMethod(
        Invocation.getter(#scrollLeft),
        returnValue: 0,
      ) as int);
  @override
  set scrollLeft(int? value) => super.noSuchMethod(
        Invocation.setter(
          #scrollLeft,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  int get scrollTop => (super.noSuchMethod(
        Invocation.getter(#scrollTop),
        returnValue: 0,
      ) as int);
  @override
  set scrollTop(int? value) => super.noSuchMethod(
        Invocation.setter(
          #scrollTop,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  int get scrollWidth => (super.noSuchMethod(
        Invocation.getter(#scrollWidth),
        returnValue: 0,
      ) as int);
  @override
  String get contentEditable => (super.noSuchMethod(
        Invocation.getter(#contentEditable),
        returnValue: '',
      ) as String);
  @override
  set contentEditable(String? value) => super.noSuchMethod(
        Invocation.setter(
          #contentEditable,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set dir(String? value) => super.noSuchMethod(
        Invocation.setter(
          #dir,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  bool get draggable => (super.noSuchMethod(
        Invocation.getter(#draggable),
        returnValue: false,
      ) as bool);
  @override
  set draggable(bool? value) => super.noSuchMethod(
        Invocation.setter(
          #draggable,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  bool get hidden => (super.noSuchMethod(
        Invocation.getter(#hidden),
        returnValue: false,
      ) as bool);
  @override
  set hidden(bool? value) => super.noSuchMethod(
        Invocation.setter(
          #hidden,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set inert(bool? value) => super.noSuchMethod(
        Invocation.setter(
          #inert,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set inputMode(String? value) => super.noSuchMethod(
        Invocation.setter(
          #inputMode,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set lang(String? value) => super.noSuchMethod(
        Invocation.setter(
          #lang,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set spellcheck(bool? value) => super.noSuchMethod(
        Invocation.setter(
          #spellcheck,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i2.CssStyleDeclaration get style => (super.noSuchMethod(
        Invocation.getter(#style),
        returnValue: _FakeCssStyleDeclaration_5(
          this,
          Invocation.getter(#style),
        ),
      ) as _i2.CssStyleDeclaration);
  @override
  set tabIndex(int? value) => super.noSuchMethod(
        Invocation.setter(
          #tabIndex,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set title(String? value) => super.noSuchMethod(
        Invocation.setter(
          #title,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set translate(bool? value) => super.noSuchMethod(
        Invocation.setter(
          #translate,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  String get className => (super.noSuchMethod(
        Invocation.getter(#className),
        returnValue: '',
      ) as String);
  @override
  set className(String? value) => super.noSuchMethod(
        Invocation.setter(
          #className,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  int get clientHeight => (super.noSuchMethod(
        Invocation.getter(#clientHeight),
        returnValue: 0,
      ) as int);
  @override
  int get clientWidth => (super.noSuchMethod(
        Invocation.getter(#clientWidth),
        returnValue: 0,
      ) as int);
  @override
  String get id => (super.noSuchMethod(
        Invocation.getter(#id),
        returnValue: '',
      ) as String);
  @override
  set id(String? value) => super.noSuchMethod(
        Invocation.setter(
          #id,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set slot(String? value) => super.noSuchMethod(
        Invocation.setter(
          #slot,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  String get tagName => (super.noSuchMethod(
        Invocation.getter(#tagName),
        returnValue: '',
      ) as String);
  @override
  _i2.ElementStream<_i2.Event> get onAbort => (super.noSuchMethod(
        Invocation.getter(#onAbort),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onAbort),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onBeforeCopy => (super.noSuchMethod(
        Invocation.getter(#onBeforeCopy),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onBeforeCopy),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onBeforeCut => (super.noSuchMethod(
        Invocation.getter(#onBeforeCut),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onBeforeCut),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onBeforePaste => (super.noSuchMethod(
        Invocation.getter(#onBeforePaste),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onBeforePaste),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onBlur => (super.noSuchMethod(
        Invocation.getter(#onBlur),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onBlur),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onCanPlay => (super.noSuchMethod(
        Invocation.getter(#onCanPlay),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onCanPlay),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onCanPlayThrough => (super.noSuchMethod(
        Invocation.getter(#onCanPlayThrough),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onCanPlayThrough),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onChange => (super.noSuchMethod(
        Invocation.getter(#onChange),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onChange),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onClick => (super.noSuchMethod(
        Invocation.getter(#onClick),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onClick),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onContextMenu => (super.noSuchMethod(
        Invocation.getter(#onContextMenu),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onContextMenu),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.ClipboardEvent> get onCopy => (super.noSuchMethod(
        Invocation.getter(#onCopy),
        returnValue: _FakeElementStream_6<_i2.ClipboardEvent>(
          this,
          Invocation.getter(#onCopy),
        ),
      ) as _i2.ElementStream<_i2.ClipboardEvent>);
  @override
  _i2.ElementStream<_i2.ClipboardEvent> get onCut => (super.noSuchMethod(
        Invocation.getter(#onCut),
        returnValue: _FakeElementStream_6<_i2.ClipboardEvent>(
          this,
          Invocation.getter(#onCut),
        ),
      ) as _i2.ElementStream<_i2.ClipboardEvent>);
  @override
  _i2.ElementStream<_i2.Event> get onDoubleClick => (super.noSuchMethod(
        Invocation.getter(#onDoubleClick),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onDoubleClick),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onDrag => (super.noSuchMethod(
        Invocation.getter(#onDrag),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onDrag),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onDragEnd => (super.noSuchMethod(
        Invocation.getter(#onDragEnd),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onDragEnd),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onDragEnter => (super.noSuchMethod(
        Invocation.getter(#onDragEnter),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onDragEnter),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onDragLeave => (super.noSuchMethod(
        Invocation.getter(#onDragLeave),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onDragLeave),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onDragOver => (super.noSuchMethod(
        Invocation.getter(#onDragOver),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onDragOver),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onDragStart => (super.noSuchMethod(
        Invocation.getter(#onDragStart),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onDragStart),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onDrop => (super.noSuchMethod(
        Invocation.getter(#onDrop),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onDrop),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.Event> get onDurationChange => (super.noSuchMethod(
        Invocation.getter(#onDurationChange),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onDurationChange),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onEmptied => (super.noSuchMethod(
        Invocation.getter(#onEmptied),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onEmptied),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onEnded => (super.noSuchMethod(
        Invocation.getter(#onEnded),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onEnded),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onError => (super.noSuchMethod(
        Invocation.getter(#onError),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onError),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onFocus => (super.noSuchMethod(
        Invocation.getter(#onFocus),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onFocus),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onInput => (super.noSuchMethod(
        Invocation.getter(#onInput),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onInput),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onInvalid => (super.noSuchMethod(
        Invocation.getter(#onInvalid),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onInvalid),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.KeyboardEvent> get onKeyDown => (super.noSuchMethod(
        Invocation.getter(#onKeyDown),
        returnValue: _FakeElementStream_6<_i2.KeyboardEvent>(
          this,
          Invocation.getter(#onKeyDown),
        ),
      ) as _i2.ElementStream<_i2.KeyboardEvent>);
  @override
  _i2.ElementStream<_i2.KeyboardEvent> get onKeyPress => (super.noSuchMethod(
        Invocation.getter(#onKeyPress),
        returnValue: _FakeElementStream_6<_i2.KeyboardEvent>(
          this,
          Invocation.getter(#onKeyPress),
        ),
      ) as _i2.ElementStream<_i2.KeyboardEvent>);
  @override
  _i2.ElementStream<_i2.KeyboardEvent> get onKeyUp => (super.noSuchMethod(
        Invocation.getter(#onKeyUp),
        returnValue: _FakeElementStream_6<_i2.KeyboardEvent>(
          this,
          Invocation.getter(#onKeyUp),
        ),
      ) as _i2.ElementStream<_i2.KeyboardEvent>);
  @override
  _i2.ElementStream<_i2.Event> get onLoad => (super.noSuchMethod(
        Invocation.getter(#onLoad),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onLoad),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onLoadedData => (super.noSuchMethod(
        Invocation.getter(#onLoadedData),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onLoadedData),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onLoadedMetadata => (super.noSuchMethod(
        Invocation.getter(#onLoadedMetadata),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onLoadedMetadata),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onMouseDown => (super.noSuchMethod(
        Invocation.getter(#onMouseDown),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onMouseDown),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onMouseEnter => (super.noSuchMethod(
        Invocation.getter(#onMouseEnter),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onMouseEnter),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onMouseLeave => (super.noSuchMethod(
        Invocation.getter(#onMouseLeave),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onMouseLeave),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onMouseMove => (super.noSuchMethod(
        Invocation.getter(#onMouseMove),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onMouseMove),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onMouseOut => (super.noSuchMethod(
        Invocation.getter(#onMouseOut),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onMouseOut),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onMouseOver => (super.noSuchMethod(
        Invocation.getter(#onMouseOver),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onMouseOver),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.MouseEvent> get onMouseUp => (super.noSuchMethod(
        Invocation.getter(#onMouseUp),
        returnValue: _FakeElementStream_6<_i2.MouseEvent>(
          this,
          Invocation.getter(#onMouseUp),
        ),
      ) as _i2.ElementStream<_i2.MouseEvent>);
  @override
  _i2.ElementStream<_i2.WheelEvent> get onMouseWheel => (super.noSuchMethod(
        Invocation.getter(#onMouseWheel),
        returnValue: _FakeElementStream_6<_i2.WheelEvent>(
          this,
          Invocation.getter(#onMouseWheel),
        ),
      ) as _i2.ElementStream<_i2.WheelEvent>);
  @override
  _i2.ElementStream<_i2.ClipboardEvent> get onPaste => (super.noSuchMethod(
        Invocation.getter(#onPaste),
        returnValue: _FakeElementStream_6<_i2.ClipboardEvent>(
          this,
          Invocation.getter(#onPaste),
        ),
      ) as _i2.ElementStream<_i2.ClipboardEvent>);
  @override
  _i2.ElementStream<_i2.Event> get onPause => (super.noSuchMethod(
        Invocation.getter(#onPause),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onPause),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onPlay => (super.noSuchMethod(
        Invocation.getter(#onPlay),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onPlay),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onPlaying => (super.noSuchMethod(
        Invocation.getter(#onPlaying),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onPlaying),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onRateChange => (super.noSuchMethod(
        Invocation.getter(#onRateChange),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onRateChange),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onReset => (super.noSuchMethod(
        Invocation.getter(#onReset),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onReset),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onResize => (super.noSuchMethod(
        Invocation.getter(#onResize),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onResize),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onScroll => (super.noSuchMethod(
        Invocation.getter(#onScroll),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onScroll),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onSearch => (super.noSuchMethod(
        Invocation.getter(#onSearch),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onSearch),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onSeeked => (super.noSuchMethod(
        Invocation.getter(#onSeeked),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onSeeked),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onSeeking => (super.noSuchMethod(
        Invocation.getter(#onSeeking),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onSeeking),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onSelect => (super.noSuchMethod(
        Invocation.getter(#onSelect),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onSelect),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onSelectStart => (super.noSuchMethod(
        Invocation.getter(#onSelectStart),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onSelectStart),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onStalled => (super.noSuchMethod(
        Invocation.getter(#onStalled),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onStalled),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onSubmit => (super.noSuchMethod(
        Invocation.getter(#onSubmit),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onSubmit),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onSuspend => (super.noSuchMethod(
        Invocation.getter(#onSuspend),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onSuspend),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onTimeUpdate => (super.noSuchMethod(
        Invocation.getter(#onTimeUpdate),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onTimeUpdate),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.TouchEvent> get onTouchCancel => (super.noSuchMethod(
        Invocation.getter(#onTouchCancel),
        returnValue: _FakeElementStream_6<_i2.TouchEvent>(
          this,
          Invocation.getter(#onTouchCancel),
        ),
      ) as _i2.ElementStream<_i2.TouchEvent>);
  @override
  _i2.ElementStream<_i2.TouchEvent> get onTouchEnd => (super.noSuchMethod(
        Invocation.getter(#onTouchEnd),
        returnValue: _FakeElementStream_6<_i2.TouchEvent>(
          this,
          Invocation.getter(#onTouchEnd),
        ),
      ) as _i2.ElementStream<_i2.TouchEvent>);
  @override
  _i2.ElementStream<_i2.TouchEvent> get onTouchEnter => (super.noSuchMethod(
        Invocation.getter(#onTouchEnter),
        returnValue: _FakeElementStream_6<_i2.TouchEvent>(
          this,
          Invocation.getter(#onTouchEnter),
        ),
      ) as _i2.ElementStream<_i2.TouchEvent>);
  @override
  _i2.ElementStream<_i2.TouchEvent> get onTouchLeave => (super.noSuchMethod(
        Invocation.getter(#onTouchLeave),
        returnValue: _FakeElementStream_6<_i2.TouchEvent>(
          this,
          Invocation.getter(#onTouchLeave),
        ),
      ) as _i2.ElementStream<_i2.TouchEvent>);
  @override
  _i2.ElementStream<_i2.TouchEvent> get onTouchMove => (super.noSuchMethod(
        Invocation.getter(#onTouchMove),
        returnValue: _FakeElementStream_6<_i2.TouchEvent>(
          this,
          Invocation.getter(#onTouchMove),
        ),
      ) as _i2.ElementStream<_i2.TouchEvent>);
  @override
  _i2.ElementStream<_i2.TouchEvent> get onTouchStart => (super.noSuchMethod(
        Invocation.getter(#onTouchStart),
        returnValue: _FakeElementStream_6<_i2.TouchEvent>(
          this,
          Invocation.getter(#onTouchStart),
        ),
      ) as _i2.ElementStream<_i2.TouchEvent>);
  @override
  _i2.ElementStream<_i2.TransitionEvent> get onTransitionEnd =>
      (super.noSuchMethod(
        Invocation.getter(#onTransitionEnd),
        returnValue: _FakeElementStream_6<_i2.TransitionEvent>(
          this,
          Invocation.getter(#onTransitionEnd),
        ),
      ) as _i2.ElementStream<_i2.TransitionEvent>);
  @override
  _i2.ElementStream<_i2.Event> get onVolumeChange => (super.noSuchMethod(
        Invocation.getter(#onVolumeChange),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onVolumeChange),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onWaiting => (super.noSuchMethod(
        Invocation.getter(#onWaiting),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onWaiting),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onFullscreenChange => (super.noSuchMethod(
        Invocation.getter(#onFullscreenChange),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onFullscreenChange),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.Event> get onFullscreenError => (super.noSuchMethod(
        Invocation.getter(#onFullscreenError),
        returnValue: _FakeElementStream_6<_i2.Event>(
          this,
          Invocation.getter(#onFullscreenError),
        ),
      ) as _i2.ElementStream<_i2.Event>);
  @override
  _i2.ElementStream<_i2.WheelEvent> get onWheel => (super.noSuchMethod(
        Invocation.getter(#onWheel),
        returnValue: _FakeElementStream_6<_i2.WheelEvent>(
          this,
          Invocation.getter(#onWheel),
        ),
      ) as _i2.ElementStream<_i2.WheelEvent>);
  @override
  List<_i2.Node> get nodes => (super.noSuchMethod(
        Invocation.getter(#nodes),
        returnValue: <_i2.Node>[],
      ) as List<_i2.Node>);
  @override
  set nodes(Iterable<_i2.Node>? value) => super.noSuchMethod(
        Invocation.setter(
          #nodes,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  List<_i2.Node> get childNodes => (super.noSuchMethod(
        Invocation.getter(#childNodes),
        returnValue: <_i2.Node>[],
      ) as List<_i2.Node>);
  @override
  int get nodeType => (super.noSuchMethod(
        Invocation.getter(#nodeType),
        returnValue: 0,
      ) as int);
  @override
  set text(String? value) => super.noSuchMethod(
        Invocation.setter(
          #text,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  String? getAttribute(String? name) => (super.noSuchMethod(Invocation.method(
        #getAttribute,
        [name],
      )) as String?);
  @override
  String? getAttributeNS(
    String? namespaceURI,
    String? name,
  ) =>
      (super.noSuchMethod(Invocation.method(
        #getAttributeNS,
        [
          namespaceURI,
          name,
        ],
      )) as String?);
  @override
  bool hasAttribute(String? name) => (super.noSuchMethod(
        Invocation.method(
          #hasAttribute,
          [name],
        ),
        returnValue: false,
      ) as bool);
  @override
  bool hasAttributeNS(
    String? namespaceURI,
    String? name,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #hasAttributeNS,
          [
            namespaceURI,
            name,
          ],
        ),
        returnValue: false,
      ) as bool);
  @override
  void removeAttribute(String? name) => super.noSuchMethod(
        Invocation.method(
          #removeAttribute,
          [name],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void removeAttributeNS(
    String? namespaceURI,
    String? name,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #removeAttributeNS,
          [
            namespaceURI,
            name,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void setAttribute(
    String? name,
    Object? value,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #setAttribute,
          [
            name,
            value,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void setAttributeNS(
    String? namespaceURI,
    String? name,
    Object? value,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #setAttributeNS,
          [
            namespaceURI,
            name,
            value,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i2.ElementList<T> querySelectorAll<T extends _i2.Element>(
          String? selectors) =>
      (super.noSuchMethod(
        Invocation.method(
          #querySelectorAll,
          [selectors],
        ),
        returnValue: _FakeElementList_7<T>(
          this,
          Invocation.method(
            #querySelectorAll,
            [selectors],
          ),
        ),
      ) as _i2.ElementList<T>);
  @override
  _i6.Future<_i2.ScrollState> setApplyScroll(String? nativeScrollBehavior) =>
      (super.noSuchMethod(
        Invocation.method(
          #setApplyScroll,
          [nativeScrollBehavior],
        ),
        returnValue: _i6.Future<_i2.ScrollState>.value(_FakeScrollState_8(
          this,
          Invocation.method(
            #setApplyScroll,
            [nativeScrollBehavior],
          ),
        )),
      ) as _i6.Future<_i2.ScrollState>);
  @override
  _i6.Future<_i2.ScrollState> setDistributeScroll(
          String? nativeScrollBehavior) =>
      (super.noSuchMethod(
        Invocation.method(
          #setDistributeScroll,
          [nativeScrollBehavior],
        ),
        returnValue: _i6.Future<_i2.ScrollState>.value(_FakeScrollState_8(
          this,
          Invocation.method(
            #setDistributeScroll,
            [nativeScrollBehavior],
          ),
        )),
      ) as _i6.Future<_i2.ScrollState>);
  @override
  Map<String, String> getNamespacedAttributes(String? namespace) =>
      (super.noSuchMethod(
        Invocation.method(
          #getNamespacedAttributes,
          [namespace],
        ),
        returnValue: <String, String>{},
      ) as Map<String, String>);
  @override
  _i2.CssStyleDeclaration getComputedStyle([String? pseudoElement]) =>
      (super.noSuchMethod(
        Invocation.method(
          #getComputedStyle,
          [pseudoElement],
        ),
        returnValue: _FakeCssStyleDeclaration_5(
          this,
          Invocation.method(
            #getComputedStyle,
            [pseudoElement],
          ),
        ),
      ) as _i2.CssStyleDeclaration);
  @override
  void appendText(String? text) => super.noSuchMethod(
        Invocation.method(
          #appendText,
          [text],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void appendHtml(
    String? text, {
    _i2.NodeValidator? validator,
    _i2.NodeTreeSanitizer? treeSanitizer,
  }) =>
      super.noSuchMethod(
        Invocation.method(
          #appendHtml,
          [text],
          {
            #validator: validator,
            #treeSanitizer: treeSanitizer,
          },
        ),
        returnValueForMissingStub: null,
      );
  @override
  void attached() => super.noSuchMethod(
        Invocation.method(
          #attached,
          [],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void detached() => super.noSuchMethod(
        Invocation.method(
          #detached,
          [],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void enteredView() => super.noSuchMethod(
        Invocation.method(
          #enteredView,
          [],
        ),
        returnValueForMissingStub: null,
      );
  @override
  List<_i3.Rectangle<num>> getClientRects() => (super.noSuchMethod(
        Invocation.method(
          #getClientRects,
          [],
        ),
        returnValue: <_i3.Rectangle<num>>[],
      ) as List<_i3.Rectangle<num>>);
  @override
  void leftView() => super.noSuchMethod(
        Invocation.method(
          #leftView,
          [],
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i2.Animation animate(
    Iterable<Map<String, dynamic>>? frames, [
    dynamic timing,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #animate,
          [
            frames,
            timing,
          ],
        ),
        returnValue: _FakeAnimation_9(
          this,
          Invocation.method(
            #animate,
            [
              frames,
              timing,
            ],
          ),
        ),
      ) as _i2.Animation);
  @override
  void attributeChanged(
    String? name,
    String? oldValue,
    String? newValue,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #attributeChanged,
          [
            name,
            oldValue,
            newValue,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void scrollIntoView([_i2.ScrollAlignment? alignment]) => super.noSuchMethod(
        Invocation.method(
          #scrollIntoView,
          [alignment],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void insertAdjacentText(
    String? where,
    String? text,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #insertAdjacentText,
          [
            where,
            text,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void insertAdjacentHtml(
    String? where,
    String? html, {
    _i2.NodeValidator? validator,
    _i2.NodeTreeSanitizer? treeSanitizer,
  }) =>
      super.noSuchMethod(
        Invocation.method(
          #insertAdjacentHtml,
          [
            where,
            html,
          ],
          {
            #validator: validator,
            #treeSanitizer: treeSanitizer,
          },
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i2.Element insertAdjacentElement(
    String? where,
    _i2.Element? element,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #insertAdjacentElement,
          [
            where,
            element,
          ],
        ),
        returnValue: _FakeElement_10(
          this,
          Invocation.method(
            #insertAdjacentElement,
            [
              where,
              element,
            ],
          ),
        ),
      ) as _i2.Element);
  @override
  bool matches(String? selectors) => (super.noSuchMethod(
        Invocation.method(
          #matches,
          [selectors],
        ),
        returnValue: false,
      ) as bool);
  @override
  bool matchesWithAncestors(String? selectors) => (super.noSuchMethod(
        Invocation.method(
          #matchesWithAncestors,
          [selectors],
        ),
        returnValue: false,
      ) as bool);
  @override
  _i2.ShadowRoot createShadowRoot() => (super.noSuchMethod(
        Invocation.method(
          #createShadowRoot,
          [],
        ),
        returnValue: _FakeShadowRoot_11(
          this,
          Invocation.method(
            #createShadowRoot,
            [],
          ),
        ),
      ) as _i2.ShadowRoot);
  @override
  _i3.Point<num> offsetTo(_i2.Element? parent) => (super.noSuchMethod(
        Invocation.method(
          #offsetTo,
          [parent],
        ),
        returnValue: _FakePoint_3<num>(
          this,
          Invocation.method(
            #offsetTo,
            [parent],
          ),
        ),
      ) as _i3.Point<num>);
  @override
  _i2.DocumentFragment createFragment(
    String? html, {
    _i2.NodeValidator? validator,
    _i2.NodeTreeSanitizer? treeSanitizer,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createFragment,
          [html],
          {
            #validator: validator,
            #treeSanitizer: treeSanitizer,
          },
        ),
        returnValue: _FakeDocumentFragment_12(
          this,
          Invocation.method(
            #createFragment,
            [html],
            {
              #validator: validator,
              #treeSanitizer: treeSanitizer,
            },
          ),
        ),
      ) as _i2.DocumentFragment);
  @override
  void setInnerHtml(
    String? html, {
    _i2.NodeValidator? validator,
    _i2.NodeTreeSanitizer? treeSanitizer,
  }) =>
      super.noSuchMethod(
        Invocation.method(
          #setInnerHtml,
          [html],
          {
            #validator: validator,
            #treeSanitizer: treeSanitizer,
          },
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i6.Future<void> requestFullscreen([Map<dynamic, dynamic>? options]) =>
      (super.noSuchMethod(
        Invocation.method(
          #requestFullscreen,
          [options],
        ),
        returnValue: _i6.Future<void>.value(),
        returnValueForMissingStub: _i6.Future<void>.value(),
      ) as _i6.Future<void>);
  @override
  void blur() => super.noSuchMethod(
        Invocation.method(
          #blur,
          [],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void click() => super.noSuchMethod(
        Invocation.method(
          #click,
          [],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void focus() => super.noSuchMethod(
        Invocation.method(
          #focus,
          [],
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i2.ShadowRoot attachShadow(Map<dynamic, dynamic>? shadowRootInitDict) =>
      (super.noSuchMethod(
        Invocation.method(
          #attachShadow,
          [shadowRootInitDict],
        ),
        returnValue: _FakeShadowRoot_11(
          this,
          Invocation.method(
            #attachShadow,
            [shadowRootInitDict],
          ),
        ),
      ) as _i2.ShadowRoot);
  @override
  _i2.Element? closest(String? selectors) =>
      (super.noSuchMethod(Invocation.method(
        #closest,
        [selectors],
      )) as _i2.Element?);
  @override
  List<_i2.Animation> getAnimations() => (super.noSuchMethod(
        Invocation.method(
          #getAnimations,
          [],
        ),
        returnValue: <_i2.Animation>[],
      ) as List<_i2.Animation>);
  @override
  List<String> getAttributeNames() => (super.noSuchMethod(
        Invocation.method(
          #getAttributeNames,
          [],
        ),
        returnValue: <String>[],
      ) as List<String>);
  @override
  _i3.Rectangle<num> getBoundingClientRect() => (super.noSuchMethod(
        Invocation.method(
          #getBoundingClientRect,
          [],
        ),
        returnValue: _FakeRectangle_1<num>(
          this,
          Invocation.method(
            #getBoundingClientRect,
            [],
          ),
        ),
      ) as _i3.Rectangle<num>);
  @override
  List<_i2.Node> getDestinationInsertionPoints() => (super.noSuchMethod(
        Invocation.method(
          #getDestinationInsertionPoints,
          [],
        ),
        returnValue: <_i2.Node>[],
      ) as List<_i2.Node>);
  @override
  List<_i2.Node> getElementsByClassName(String? classNames) =>
      (super.noSuchMethod(
        Invocation.method(
          #getElementsByClassName,
          [classNames],
        ),
        returnValue: <_i2.Node>[],
      ) as List<_i2.Node>);
  @override
  bool hasPointerCapture(int? pointerId) => (super.noSuchMethod(
        Invocation.method(
          #hasPointerCapture,
          [pointerId],
        ),
        returnValue: false,
      ) as bool);
  @override
  void releasePointerCapture(int? pointerId) => super.noSuchMethod(
        Invocation.method(
          #releasePointerCapture,
          [pointerId],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void requestPointerLock() => super.noSuchMethod(
        Invocation.method(
          #requestPointerLock,
          [],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void scroll([
    dynamic options_OR_x,
    num? y,
  ]) =>
      super.noSuchMethod(
        Invocation.method(
          #scroll,
          [
            options_OR_x,
            y,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void scrollBy([
    dynamic options_OR_x,
    num? y,
  ]) =>
      super.noSuchMethod(
        Invocation.method(
          #scrollBy,
          [
            options_OR_x,
            y,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void scrollIntoViewIfNeeded([bool? centerIfNeeded]) => super.noSuchMethod(
        Invocation.method(
          #scrollIntoViewIfNeeded,
          [centerIfNeeded],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void scrollTo([
    dynamic options_OR_x,
    num? y,
  ]) =>
      super.noSuchMethod(
        Invocation.method(
          #scrollTo,
          [
            options_OR_x,
            y,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void setPointerCapture(int? pointerId) => super.noSuchMethod(
        Invocation.method(
          #setPointerCapture,
          [pointerId],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void after(Object? nodes) => super.noSuchMethod(
        Invocation.method(
          #after,
          [nodes],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void before(Object? nodes) => super.noSuchMethod(
        Invocation.method(
          #before,
          [nodes],
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i2.Element? querySelector(String? selectors) =>
      (super.noSuchMethod(Invocation.method(
        #querySelector,
        [selectors],
      )) as _i2.Element?);
  @override
  void remove() => super.noSuchMethod(
        Invocation.method(
          #remove,
          [],
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i2.Node replaceWith(_i2.Node? otherNode) => (super.noSuchMethod(
        Invocation.method(
          #replaceWith,
          [otherNode],
        ),
        returnValue: _FakeNode_13(
          this,
          Invocation.method(
            #replaceWith,
            [otherNode],
          ),
        ),
      ) as _i2.Node);
  @override
  void insertAllBefore(
    Iterable<_i2.Node>? newNodes,
    _i2.Node? child,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #insertAllBefore,
          [
            newNodes,
            child,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i2.Node append(_i2.Node? node) => (super.noSuchMethod(
        Invocation.method(
          #append,
          [node],
        ),
        returnValue: _FakeNode_13(
          this,
          Invocation.method(
            #append,
            [node],
          ),
        ),
      ) as _i2.Node);
  @override
  _i2.Node clone(bool? deep) => (super.noSuchMethod(
        Invocation.method(
          #clone,
          [deep],
        ),
        returnValue: _FakeNode_13(
          this,
          Invocation.method(
            #clone,
            [deep],
          ),
        ),
      ) as _i2.Node);
  @override
  bool contains(_i2.Node? other) => (super.noSuchMethod(
        Invocation.method(
          #contains,
          [other],
        ),
        returnValue: false,
      ) as bool);
  @override
  _i2.Node getRootNode([Map<dynamic, dynamic>? options]) => (super.noSuchMethod(
        Invocation.method(
          #getRootNode,
          [options],
        ),
        returnValue: _FakeNode_13(
          this,
          Invocation.method(
            #getRootNode,
            [options],
          ),
        ),
      ) as _i2.Node);
  @override
  bool hasChildNodes() => (super.noSuchMethod(
        Invocation.method(
          #hasChildNodes,
          [],
        ),
        returnValue: false,
      ) as bool);
  @override
  _i2.Node insertBefore(
    _i2.Node? node,
    _i2.Node? child,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #insertBefore,
          [
            node,
            child,
          ],
        ),
        returnValue: _FakeNode_13(
          this,
          Invocation.method(
            #insertBefore,
            [
              node,
              child,
            ],
          ),
        ),
      ) as _i2.Node);
  @override
  void addEventListener(
    String? type,
    _i2.EventListener? listener, [
    bool? useCapture,
  ]) =>
      super.noSuchMethod(
        Invocation.method(
          #addEventListener,
          [
            type,
            listener,
            useCapture,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void removeEventListener(
    String? type,
    _i2.EventListener? listener, [
    bool? useCapture,
  ]) =>
      super.noSuchMethod(
        Invocation.method(
          #removeEventListener,
          [
            type,
            listener,
            useCapture,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  bool dispatchEvent(_i2.Event? event) => (super.noSuchMethod(
        Invocation.method(
          #dispatchEvent,
          [event],
        ),
        returnValue: false,
      ) as bool);
}

/// A class which mocks [BuildContext].
///
/// See the documentation for Mockito's code generation for more information.
class MockBuildContext extends _i1.Mock implements _i4.BuildContext {
  MockBuildContext() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i4.Widget get widget => (super.noSuchMethod(
        Invocation.getter(#widget),
        returnValue: _FakeWidget_14(
          this,
          Invocation.getter(#widget),
        ),
      ) as _i4.Widget);
  @override
  bool get debugDoingBuild => (super.noSuchMethod(
        Invocation.getter(#debugDoingBuild),
        returnValue: false,
      ) as bool);
  @override
  _i4.InheritedWidget dependOnInheritedElement(
    _i4.InheritedElement? ancestor, {
    Object? aspect,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #dependOnInheritedElement,
          [ancestor],
          {#aspect: aspect},
        ),
        returnValue: _FakeInheritedWidget_15(
          this,
          Invocation.method(
            #dependOnInheritedElement,
            [ancestor],
            {#aspect: aspect},
          ),
        ),
      ) as _i4.InheritedWidget);
  @override
  void visitAncestorElements(bool Function(_i4.Element)? visitor) =>
      super.noSuchMethod(
        Invocation.method(
          #visitAncestorElements,
          [visitor],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void visitChildElements(_i4.ElementVisitor? visitor) => super.noSuchMethod(
        Invocation.method(
          #visitChildElements,
          [visitor],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void dispatchNotification(_i7.Notification? notification) =>
      super.noSuchMethod(
        Invocation.method(
          #dispatchNotification,
          [notification],
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i5.DiagnosticsNode describeElement(
    String? name, {
    _i5.DiagnosticsTreeStyle? style = _i5.DiagnosticsTreeStyle.errorProperty,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #describeElement,
          [name],
          {#style: style},
        ),
        returnValue: _FakeDiagnosticsNode_16(
          this,
          Invocation.method(
            #describeElement,
            [name],
            {#style: style},
          ),
        ),
      ) as _i5.DiagnosticsNode);
  @override
  _i5.DiagnosticsNode describeWidget(
    String? name, {
    _i5.DiagnosticsTreeStyle? style = _i5.DiagnosticsTreeStyle.errorProperty,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #describeWidget,
          [name],
          {#style: style},
        ),
        returnValue: _FakeDiagnosticsNode_16(
          this,
          Invocation.method(
            #describeWidget,
            [name],
            {#style: style},
          ),
        ),
      ) as _i5.DiagnosticsNode);
  @override
  List<_i5.DiagnosticsNode> describeMissingAncestor(
          {required Type? expectedAncestorType}) =>
      (super.noSuchMethod(
        Invocation.method(
          #describeMissingAncestor,
          [],
          {#expectedAncestorType: expectedAncestorType},
        ),
        returnValue: <_i5.DiagnosticsNode>[],
      ) as List<_i5.DiagnosticsNode>);
  @override
  _i5.DiagnosticsNode describeOwnershipChain(String? name) =>
      (super.noSuchMethod(
        Invocation.method(
          #describeOwnershipChain,
          [name],
        ),
        returnValue: _FakeDiagnosticsNode_16(
          this,
          Invocation.method(
            #describeOwnershipChain,
            [name],
          ),
        ),
      ) as _i5.DiagnosticsNode);
}

/// A class which mocks [CreationParams].
///
/// See the documentation for Mockito's code generation for more information.
class MockCreationParams extends _i1.Mock implements _i8.CreationParams {
  MockCreationParams() {
    _i1.throwOnMissingStub(this);
  }

  @override
  Set<String> get javascriptChannelNames => (super.noSuchMethod(
        Invocation.getter(#javascriptChannelNames),
        returnValue: <String>{},
      ) as Set<String>);
  @override
  _i8.AutoMediaPlaybackPolicy get autoMediaPlaybackPolicy =>
      (super.noSuchMethod(
        Invocation.getter(#autoMediaPlaybackPolicy),
        returnValue:
            _i8.AutoMediaPlaybackPolicy.require_user_action_for_all_media_types,
      ) as _i8.AutoMediaPlaybackPolicy);
  @override
  List<_i8.WebViewCookie> get cookies => (super.noSuchMethod(
        Invocation.getter(#cookies),
        returnValue: <_i8.WebViewCookie>[],
      ) as List<_i8.WebViewCookie>);
}

/// A class which mocks [WebViewPlatformCallbacksHandler].
///
/// See the documentation for Mockito's code generation for more information.
class MockWebViewPlatformCallbacksHandler extends _i1.Mock
    implements _i9.WebViewPlatformCallbacksHandler {
  MockWebViewPlatformCallbacksHandler() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i6.FutureOr<bool> onNavigationRequest({
    required String? url,
    required bool? isForMainFrame,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #onNavigationRequest,
          [],
          {
            #url: url,
            #isForMainFrame: isForMainFrame,
          },
        ),
        returnValue: _i6.Future<bool>.value(false),
      ) as _i6.FutureOr<bool>);
  @override
  void onPageStarted(String? url) => super.noSuchMethod(
        Invocation.method(
          #onPageStarted,
          [url],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void onPageFinished(String? url) => super.noSuchMethod(
        Invocation.method(
          #onPageFinished,
          [url],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void onProgress(int? progress) => super.noSuchMethod(
        Invocation.method(
          #onProgress,
          [progress],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void onWebResourceError(_i8.WebResourceError? error) => super.noSuchMethod(
        Invocation.method(
          #onWebResourceError,
          [error],
        ),
        returnValueForMissingStub: null,
      );
}

/// A class which mocks [HttpRequestFactory].
///
/// See the documentation for Mockito's code generation for more information.
class MockHttpRequestFactory extends _i1.Mock
    implements _i10.HttpRequestFactory {
  MockHttpRequestFactory() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i6.Future<_i2.HttpRequest> request(
    String? url, {
    String? method,
    bool? withCredentials,
    String? responseType,
    String? mimeType,
    Map<String, String>? requestHeaders,
    dynamic sendData,
    void Function(_i2.ProgressEvent)? onProgress,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #request,
          [url],
          {
            #method: method,
            #withCredentials: withCredentials,
            #responseType: responseType,
            #mimeType: mimeType,
            #requestHeaders: requestHeaders,
            #sendData: sendData,
            #onProgress: onProgress,
          },
        ),
        returnValue: _i6.Future<_i2.HttpRequest>.value(_FakeHttpRequest_17(
          this,
          Invocation.method(
            #request,
            [url],
            {
              #method: method,
              #withCredentials: withCredentials,
              #responseType: responseType,
              #mimeType: mimeType,
              #requestHeaders: requestHeaders,
              #sendData: sendData,
              #onProgress: onProgress,
            },
          ),
        )),
      ) as _i6.Future<_i2.HttpRequest>);
}

/// A class which mocks [HttpRequest].
///
/// See the documentation for Mockito's code generation for more information.
class MockHttpRequest extends _i1.Mock implements _i2.HttpRequest {
  MockHttpRequest() {
    _i1.throwOnMissingStub(this);
  }

  @override
  Map<String, String> get responseHeaders => (super.noSuchMethod(
        Invocation.getter(#responseHeaders),
        returnValue: <String, String>{},
      ) as Map<String, String>);
  @override
  int get readyState => (super.noSuchMethod(
        Invocation.getter(#readyState),
        returnValue: 0,
      ) as int);
  @override
  String get responseType => (super.noSuchMethod(
        Invocation.getter(#responseType),
        returnValue: '',
      ) as String);
  @override
  set responseType(String? value) => super.noSuchMethod(
        Invocation.setter(
          #responseType,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set timeout(int? value) => super.noSuchMethod(
        Invocation.setter(
          #timeout,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i2.HttpRequestUpload get upload => (super.noSuchMethod(
        Invocation.getter(#upload),
        returnValue: _FakeHttpRequestUpload_18(
          this,
          Invocation.getter(#upload),
        ),
      ) as _i2.HttpRequestUpload);
  @override
  set withCredentials(bool? value) => super.noSuchMethod(
        Invocation.setter(
          #withCredentials,
          value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i6.Stream<_i2.Event> get onReadyStateChange => (super.noSuchMethod(
        Invocation.getter(#onReadyStateChange),
        returnValue: _i6.Stream<_i2.Event>.empty(),
      ) as _i6.Stream<_i2.Event>);
  @override
  _i6.Stream<_i2.ProgressEvent> get onAbort => (super.noSuchMethod(
        Invocation.getter(#onAbort),
        returnValue: _i6.Stream<_i2.ProgressEvent>.empty(),
      ) as _i6.Stream<_i2.ProgressEvent>);
  @override
  _i6.Stream<_i2.ProgressEvent> get onError => (super.noSuchMethod(
        Invocation.getter(#onError),
        returnValue: _i6.Stream<_i2.ProgressEvent>.empty(),
      ) as _i6.Stream<_i2.ProgressEvent>);
  @override
  _i6.Stream<_i2.ProgressEvent> get onLoad => (super.noSuchMethod(
        Invocation.getter(#onLoad),
        returnValue: _i6.Stream<_i2.ProgressEvent>.empty(),
      ) as _i6.Stream<_i2.ProgressEvent>);
  @override
  _i6.Stream<_i2.ProgressEvent> get onLoadEnd => (super.noSuchMethod(
        Invocation.getter(#onLoadEnd),
        returnValue: _i6.Stream<_i2.ProgressEvent>.empty(),
      ) as _i6.Stream<_i2.ProgressEvent>);
  @override
  _i6.Stream<_i2.ProgressEvent> get onLoadStart => (super.noSuchMethod(
        Invocation.getter(#onLoadStart),
        returnValue: _i6.Stream<_i2.ProgressEvent>.empty(),
      ) as _i6.Stream<_i2.ProgressEvent>);
  @override
  _i6.Stream<_i2.ProgressEvent> get onProgress => (super.noSuchMethod(
        Invocation.getter(#onProgress),
        returnValue: _i6.Stream<_i2.ProgressEvent>.empty(),
      ) as _i6.Stream<_i2.ProgressEvent>);
  @override
  _i6.Stream<_i2.ProgressEvent> get onTimeout => (super.noSuchMethod(
        Invocation.getter(#onTimeout),
        returnValue: _i6.Stream<_i2.ProgressEvent>.empty(),
      ) as _i6.Stream<_i2.ProgressEvent>);
  @override
  _i2.Events get on => (super.noSuchMethod(
        Invocation.getter(#on),
        returnValue: _FakeEvents_19(
          this,
          Invocation.getter(#on),
        ),
      ) as _i2.Events);
  @override
  void open(
    String? method,
    String? url, {
    bool? async,
    String? user,
    String? password,
  }) =>
      super.noSuchMethod(
        Invocation.method(
          #open,
          [
            method,
            url,
          ],
          {
            #async: async,
            #user: user,
            #password: password,
          },
        ),
        returnValueForMissingStub: null,
      );
  @override
  void abort() => super.noSuchMethod(
        Invocation.method(
          #abort,
          [],
        ),
        returnValueForMissingStub: null,
      );
  @override
  String getAllResponseHeaders() => (super.noSuchMethod(
        Invocation.method(
          #getAllResponseHeaders,
          [],
        ),
        returnValue: '',
      ) as String);
  @override
  String? getResponseHeader(String? name) =>
      (super.noSuchMethod(Invocation.method(
        #getResponseHeader,
        [name],
      )) as String?);
  @override
  void overrideMimeType(String? mime) => super.noSuchMethod(
        Invocation.method(
          #overrideMimeType,
          [mime],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void send([dynamic body_OR_data]) => super.noSuchMethod(
        Invocation.method(
          #send,
          [body_OR_data],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void setRequestHeader(
    String? name,
    String? value,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #setRequestHeader,
          [
            name,
            value,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void addEventListener(
    String? type,
    _i2.EventListener? listener, [
    bool? useCapture,
  ]) =>
      super.noSuchMethod(
        Invocation.method(
          #addEventListener,
          [
            type,
            listener,
            useCapture,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void removeEventListener(
    String? type,
    _i2.EventListener? listener, [
    bool? useCapture,
  ]) =>
      super.noSuchMethod(
        Invocation.method(
          #removeEventListener,
          [
            type,
            listener,
            useCapture,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  bool dispatchEvent(_i2.Event? event) => (super.noSuchMethod(
        Invocation.method(
          #dispatchEvent,
          [event],
        ),
        returnValue: false,
      ) as bool);
}
