// Mocks generated by Mockito 5.3.2 from annotations
// in webview_flutter_web/test/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/types/types.dart' as _i8;
import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'
    as _i9;
import 'package:webview_flutter_web/webview_flutter_web.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 mounted => (super.noSuchMethod(
        Invocation.getter(#mounted),
        returnValue: false,
      ) as bool);
  @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);
}
