// Mocks generated by Mockito 5.3.2 from annotations
// in webview_flutter_android/test/android_webview_controller_test.dart.
// Do not manually edit this file.

// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i9;
import 'dart:typed_data' as _i15;
import 'dart:ui' as _i4;

import 'package:flutter/foundation.dart' as _i12;
import 'package:flutter/gestures.dart' as _i13;
import 'package:flutter/material.dart' as _i14;
import 'package:flutter/services.dart' as _i7;
import 'package:mockito/mockito.dart' as _i1;
import 'package:webview_flutter_android/src/android_navigation_delegate.dart'
    as _i8;
import 'package:webview_flutter_android/src/android_proxy.dart' as _i11;
import 'package:webview_flutter_android/src/android_webview.dart' as _i2;
import 'package:webview_flutter_android/src/android_webview_controller.dart'
    as _i10;
import 'package:webview_flutter_android/src/instance_manager.dart' as _i5;
import 'package:webview_flutter_android/src/platform_views_service_proxy.dart'
    as _i6;
import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'
    as _i3;

// 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 _FakeWebChromeClient_0 extends _i1.SmartFake
    implements _i2.WebChromeClient {
  _FakeWebChromeClient_0(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

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

class _FakePlatformNavigationDelegateCreationParams_3 extends _i1.SmartFake
    implements _i3.PlatformNavigationDelegateCreationParams {
  _FakePlatformNavigationDelegateCreationParams_3(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePlatformWebViewControllerCreationParams_4 extends _i1.SmartFake
    implements _i3.PlatformWebViewControllerCreationParams {
  _FakePlatformWebViewControllerCreationParams_4(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

class _FakeOffset_6 extends _i1.SmartFake implements _i4.Offset {
  _FakeOffset_6(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

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

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

class _FakeInstanceManager_10 extends _i1.SmartFake
    implements _i5.InstanceManager {
  _FakeInstanceManager_10(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePlatformViewsServiceProxy_11 extends _i1.SmartFake
    implements _i6.PlatformViewsServiceProxy {
  _FakePlatformViewsServiceProxy_11(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePlatformWebViewController_12 extends _i1.SmartFake
    implements _i3.PlatformWebViewController {
  _FakePlatformWebViewController_12(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeSize_13 extends _i1.SmartFake implements _i4.Size {
  _FakeSize_13(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeExpensiveAndroidViewController_14 extends _i1.SmartFake
    implements _i7.ExpensiveAndroidViewController {
  _FakeExpensiveAndroidViewController_14(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeSurfaceAndroidViewController_15 extends _i1.SmartFake
    implements _i7.SurfaceAndroidViewController {
  _FakeSurfaceAndroidViewController_15(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

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

/// A class which mocks [AndroidNavigationDelegate].
///
/// See the documentation for Mockito's code generation for more information.
class MockAndroidNavigationDelegate extends _i1.Mock
    implements _i8.AndroidNavigationDelegate {
  @override
  _i2.WebChromeClient get androidWebChromeClient => (super.noSuchMethod(
        Invocation.getter(#androidWebChromeClient),
        returnValue: _FakeWebChromeClient_0(
          this,
          Invocation.getter(#androidWebChromeClient),
        ),
        returnValueForMissingStub: _FakeWebChromeClient_0(
          this,
          Invocation.getter(#androidWebChromeClient),
        ),
      ) as _i2.WebChromeClient);
  @override
  _i2.WebViewClient get androidWebViewClient => (super.noSuchMethod(
        Invocation.getter(#androidWebViewClient),
        returnValue: _FakeWebViewClient_1(
          this,
          Invocation.getter(#androidWebViewClient),
        ),
        returnValueForMissingStub: _FakeWebViewClient_1(
          this,
          Invocation.getter(#androidWebViewClient),
        ),
      ) as _i2.WebViewClient);
  @override
  _i2.DownloadListener get androidDownloadListener => (super.noSuchMethod(
        Invocation.getter(#androidDownloadListener),
        returnValue: _FakeDownloadListener_2(
          this,
          Invocation.getter(#androidDownloadListener),
        ),
        returnValueForMissingStub: _FakeDownloadListener_2(
          this,
          Invocation.getter(#androidDownloadListener),
        ),
      ) as _i2.DownloadListener);
  @override
  _i3.PlatformNavigationDelegateCreationParams get params =>
      (super.noSuchMethod(
        Invocation.getter(#params),
        returnValue: _FakePlatformNavigationDelegateCreationParams_3(
          this,
          Invocation.getter(#params),
        ),
        returnValueForMissingStub:
            _FakePlatformNavigationDelegateCreationParams_3(
          this,
          Invocation.getter(#params),
        ),
      ) as _i3.PlatformNavigationDelegateCreationParams);
  @override
  _i9.Future<void> setOnLoadRequest(_i8.LoadRequestCallback? onLoadRequest) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnLoadRequest,
          [onLoadRequest],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setOnNavigationRequest(
          _i3.NavigationRequestCallback? onNavigationRequest) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnNavigationRequest,
          [onNavigationRequest],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setOnPageStarted(_i3.PageEventCallback? onPageStarted) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnPageStarted,
          [onPageStarted],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setOnPageFinished(_i3.PageEventCallback? onPageFinished) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnPageFinished,
          [onPageFinished],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setOnProgress(_i3.ProgressCallback? onProgress) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnProgress,
          [onProgress],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setOnWebResourceError(
          _i3.WebResourceErrorCallback? onWebResourceError) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnWebResourceError,
          [onWebResourceError],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
}

/// A class which mocks [AndroidWebViewController].
///
/// See the documentation for Mockito's code generation for more information.
class MockAndroidWebViewController extends _i1.Mock
    implements _i10.AndroidWebViewController {
  @override
  _i3.PlatformWebViewControllerCreationParams get params => (super.noSuchMethod(
        Invocation.getter(#params),
        returnValue: _FakePlatformWebViewControllerCreationParams_4(
          this,
          Invocation.getter(#params),
        ),
        returnValueForMissingStub:
            _FakePlatformWebViewControllerCreationParams_4(
          this,
          Invocation.getter(#params),
        ),
      ) as _i3.PlatformWebViewControllerCreationParams);
  @override
  _i9.Future<void> loadFile(String? absoluteFilePath) => (super.noSuchMethod(
        Invocation.method(
          #loadFile,
          [absoluteFilePath],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> loadFlutterAsset(String? key) => (super.noSuchMethod(
        Invocation.method(
          #loadFlutterAsset,
          [key],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> loadHtmlString(
    String? html, {
    String? baseUrl,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #loadHtmlString,
          [html],
          {#baseUrl: baseUrl},
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> loadRequest(_i3.LoadRequestParams? params) =>
      (super.noSuchMethod(
        Invocation.method(
          #loadRequest,
          [params],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<String?> currentUrl() => (super.noSuchMethod(
        Invocation.method(
          #currentUrl,
          [],
        ),
        returnValue: _i9.Future<String?>.value(),
        returnValueForMissingStub: _i9.Future<String?>.value(),
      ) as _i9.Future<String?>);
  @override
  _i9.Future<bool> canGoBack() => (super.noSuchMethod(
        Invocation.method(
          #canGoBack,
          [],
        ),
        returnValue: _i9.Future<bool>.value(false),
        returnValueForMissingStub: _i9.Future<bool>.value(false),
      ) as _i9.Future<bool>);
  @override
  _i9.Future<bool> canGoForward() => (super.noSuchMethod(
        Invocation.method(
          #canGoForward,
          [],
        ),
        returnValue: _i9.Future<bool>.value(false),
        returnValueForMissingStub: _i9.Future<bool>.value(false),
      ) as _i9.Future<bool>);
  @override
  _i9.Future<void> goBack() => (super.noSuchMethod(
        Invocation.method(
          #goBack,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> goForward() => (super.noSuchMethod(
        Invocation.method(
          #goForward,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> reload() => (super.noSuchMethod(
        Invocation.method(
          #reload,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> clearCache() => (super.noSuchMethod(
        Invocation.method(
          #clearCache,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> clearLocalStorage() => (super.noSuchMethod(
        Invocation.method(
          #clearLocalStorage,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setPlatformNavigationDelegate(
          _i3.PlatformNavigationDelegate? handler) =>
      (super.noSuchMethod(
        Invocation.method(
          #setPlatformNavigationDelegate,
          [handler],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> runJavaScript(String? javaScript) => (super.noSuchMethod(
        Invocation.method(
          #runJavaScript,
          [javaScript],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<Object> runJavaScriptReturningResult(String? javaScript) =>
      (super.noSuchMethod(
        Invocation.method(
          #runJavaScriptReturningResult,
          [javaScript],
        ),
        returnValue: _i9.Future<Object>.value(_FakeObject_5(
          this,
          Invocation.method(
            #runJavaScriptReturningResult,
            [javaScript],
          ),
        )),
        returnValueForMissingStub: _i9.Future<Object>.value(_FakeObject_5(
          this,
          Invocation.method(
            #runJavaScriptReturningResult,
            [javaScript],
          ),
        )),
      ) as _i9.Future<Object>);
  @override
  _i9.Future<void> addJavaScriptChannel(
          _i3.JavaScriptChannelParams? javaScriptChannelParams) =>
      (super.noSuchMethod(
        Invocation.method(
          #addJavaScriptChannel,
          [javaScriptChannelParams],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> removeJavaScriptChannel(String? javaScriptChannelName) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeJavaScriptChannel,
          [javaScriptChannelName],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<String?> getTitle() => (super.noSuchMethod(
        Invocation.method(
          #getTitle,
          [],
        ),
        returnValue: _i9.Future<String?>.value(),
        returnValueForMissingStub: _i9.Future<String?>.value(),
      ) as _i9.Future<String?>);
  @override
  _i9.Future<void> scrollTo(
    int? x,
    int? y,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #scrollTo,
          [
            x,
            y,
          ],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> scrollBy(
    int? x,
    int? y,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #scrollBy,
          [
            x,
            y,
          ],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<_i4.Offset> getScrollPosition() => (super.noSuchMethod(
        Invocation.method(
          #getScrollPosition,
          [],
        ),
        returnValue: _i9.Future<_i4.Offset>.value(_FakeOffset_6(
          this,
          Invocation.method(
            #getScrollPosition,
            [],
          ),
        )),
        returnValueForMissingStub: _i9.Future<_i4.Offset>.value(_FakeOffset_6(
          this,
          Invocation.method(
            #getScrollPosition,
            [],
          ),
        )),
      ) as _i9.Future<_i4.Offset>);
  @override
  _i9.Future<void> enableZoom(bool? enabled) => (super.noSuchMethod(
        Invocation.method(
          #enableZoom,
          [enabled],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setBackgroundColor(_i4.Color? color) => (super.noSuchMethod(
        Invocation.method(
          #setBackgroundColor,
          [color],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setJavaScriptMode(_i3.JavaScriptMode? javaScriptMode) =>
      (super.noSuchMethod(
        Invocation.method(
          #setJavaScriptMode,
          [javaScriptMode],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setUserAgent(String? userAgent) => (super.noSuchMethod(
        Invocation.method(
          #setUserAgent,
          [userAgent],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setMediaPlaybackRequiresUserGesture(bool? require) =>
      (super.noSuchMethod(
        Invocation.method(
          #setMediaPlaybackRequiresUserGesture,
          [require],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
}

/// A class which mocks [AndroidWebViewProxy].
///
/// See the documentation for Mockito's code generation for more information.
class MockAndroidWebViewProxy extends _i1.Mock
    implements _i11.AndroidWebViewProxy {
  @override
  _i2.WebView Function({required bool useHybridComposition})
      get createAndroidWebView => (super.noSuchMethod(
            Invocation.getter(#createAndroidWebView),
            returnValue: ({required bool useHybridComposition}) =>
                _FakeWebView_7(
              this,
              Invocation.getter(#createAndroidWebView),
            ),
            returnValueForMissingStub: ({required bool useHybridComposition}) =>
                _FakeWebView_7(
              this,
              Invocation.getter(#createAndroidWebView),
            ),
          ) as _i2.WebView Function({required bool useHybridComposition}));
  @override
  _i2.WebChromeClient Function(
      {void Function(
        _i2.WebView,
        int,
      )?
          onProgressChanged}) get createAndroidWebChromeClient =>
      (super.noSuchMethod(
        Invocation.getter(#createAndroidWebChromeClient),
        returnValue: (
                {void Function(
                  _i2.WebView,
                  int,
                )?
                    onProgressChanged}) =>
            _FakeWebChromeClient_0(
          this,
          Invocation.getter(#createAndroidWebChromeClient),
        ),
        returnValueForMissingStub: (
                {void Function(
                  _i2.WebView,
                  int,
                )?
                    onProgressChanged}) =>
            _FakeWebChromeClient_0(
          this,
          Invocation.getter(#createAndroidWebChromeClient),
        ),
      ) as _i2.WebChromeClient Function(
          {void Function(
            _i2.WebView,
            int,
          )?
              onProgressChanged}));
  @override
  _i2.WebViewClient Function({
    void Function(
      _i2.WebView,
      String,
    )?
        onPageFinished,
    void Function(
      _i2.WebView,
      String,
    )?
        onPageStarted,
    void Function(
      _i2.WebView,
      int,
      String,
      String,
    )?
        onReceivedError,
    void Function(
      _i2.WebView,
      _i2.WebResourceRequest,
      _i2.WebResourceError,
    )?
        onReceivedRequestError,
    void Function(
      _i2.WebView,
      _i2.WebResourceRequest,
    )?
        requestLoading,
    void Function(
      _i2.WebView,
      String,
    )?
        urlLoading,
  }) get createAndroidWebViewClient => (super.noSuchMethod(
        Invocation.getter(#createAndroidWebViewClient),
        returnValue: ({
          void Function(
            _i2.WebView,
            String,
          )?
              onPageFinished,
          void Function(
            _i2.WebView,
            String,
          )?
              onPageStarted,
          void Function(
            _i2.WebView,
            int,
            String,
            String,
          )?
              onReceivedError,
          void Function(
            _i2.WebView,
            _i2.WebResourceRequest,
            _i2.WebResourceError,
          )?
              onReceivedRequestError,
          void Function(
            _i2.WebView,
            _i2.WebResourceRequest,
          )?
              requestLoading,
          void Function(
            _i2.WebView,
            String,
          )?
              urlLoading,
        }) =>
            _FakeWebViewClient_1(
          this,
          Invocation.getter(#createAndroidWebViewClient),
        ),
        returnValueForMissingStub: ({
          void Function(
            _i2.WebView,
            String,
          )?
              onPageFinished,
          void Function(
            _i2.WebView,
            String,
          )?
              onPageStarted,
          void Function(
            _i2.WebView,
            int,
            String,
            String,
          )?
              onReceivedError,
          void Function(
            _i2.WebView,
            _i2.WebResourceRequest,
            _i2.WebResourceError,
          )?
              onReceivedRequestError,
          void Function(
            _i2.WebView,
            _i2.WebResourceRequest,
          )?
              requestLoading,
          void Function(
            _i2.WebView,
            String,
          )?
              urlLoading,
        }) =>
            _FakeWebViewClient_1(
          this,
          Invocation.getter(#createAndroidWebViewClient),
        ),
      ) as _i2.WebViewClient Function({
        void Function(
          _i2.WebView,
          String,
        )?
            onPageFinished,
        void Function(
          _i2.WebView,
          String,
        )?
            onPageStarted,
        void Function(
          _i2.WebView,
          int,
          String,
          String,
        )?
            onReceivedError,
        void Function(
          _i2.WebView,
          _i2.WebResourceRequest,
          _i2.WebResourceError,
        )?
            onReceivedRequestError,
        void Function(
          _i2.WebView,
          _i2.WebResourceRequest,
        )?
            requestLoading,
        void Function(
          _i2.WebView,
          String,
        )?
            urlLoading,
      }));
  @override
  _i2.FlutterAssetManager Function() get createFlutterAssetManager =>
      (super.noSuchMethod(
        Invocation.getter(#createFlutterAssetManager),
        returnValue: () => _FakeFlutterAssetManager_8(
          this,
          Invocation.getter(#createFlutterAssetManager),
        ),
        returnValueForMissingStub: () => _FakeFlutterAssetManager_8(
          this,
          Invocation.getter(#createFlutterAssetManager),
        ),
      ) as _i2.FlutterAssetManager Function());
  @override
  _i2.JavaScriptChannel Function(
    String, {
    required void Function(String) postMessage,
  }) get createJavaScriptChannel => (super.noSuchMethod(
        Invocation.getter(#createJavaScriptChannel),
        returnValue: (
          String channelName, {
          required void Function(String) postMessage,
        }) =>
            _FakeJavaScriptChannel_9(
          this,
          Invocation.getter(#createJavaScriptChannel),
        ),
        returnValueForMissingStub: (
          String channelName, {
          required void Function(String) postMessage,
        }) =>
            _FakeJavaScriptChannel_9(
          this,
          Invocation.getter(#createJavaScriptChannel),
        ),
      ) as _i2.JavaScriptChannel Function(
        String, {
        required void Function(String) postMessage,
      }));
  @override
  _i2.DownloadListener Function(
      {required void Function(
        String,
        String,
        String,
        String,
        int,
      )
          onDownloadStart}) get createDownloadListener => (super.noSuchMethod(
        Invocation.getter(#createDownloadListener),
        returnValue: (
                {required void Function(
                  String,
                  String,
                  String,
                  String,
                  int,
                )
                    onDownloadStart}) =>
            _FakeDownloadListener_2(
          this,
          Invocation.getter(#createDownloadListener),
        ),
        returnValueForMissingStub: (
                {required void Function(
                  String,
                  String,
                  String,
                  String,
                  int,
                )
                    onDownloadStart}) =>
            _FakeDownloadListener_2(
          this,
          Invocation.getter(#createDownloadListener),
        ),
      ) as _i2.DownloadListener Function(
          {required void Function(
            String,
            String,
            String,
            String,
            int,
          )
              onDownloadStart}));
  @override
  _i9.Future<void> setWebContentsDebuggingEnabled(bool? enabled) =>
      (super.noSuchMethod(
        Invocation.method(
          #setWebContentsDebuggingEnabled,
          [enabled],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
}

/// A class which mocks [AndroidWebViewWidgetCreationParams].
///
/// See the documentation for Mockito's code generation for more information.
// ignore: must_be_immutable
class MockAndroidWebViewWidgetCreationParams extends _i1.Mock
    implements _i10.AndroidWebViewWidgetCreationParams {
  @override
  _i5.InstanceManager get instanceManager => (super.noSuchMethod(
        Invocation.getter(#instanceManager),
        returnValue: _FakeInstanceManager_10(
          this,
          Invocation.getter(#instanceManager),
        ),
        returnValueForMissingStub: _FakeInstanceManager_10(
          this,
          Invocation.getter(#instanceManager),
        ),
      ) as _i5.InstanceManager);
  @override
  _i6.PlatformViewsServiceProxy get platformViewsServiceProxy =>
      (super.noSuchMethod(
        Invocation.getter(#platformViewsServiceProxy),
        returnValue: _FakePlatformViewsServiceProxy_11(
          this,
          Invocation.getter(#platformViewsServiceProxy),
        ),
        returnValueForMissingStub: _FakePlatformViewsServiceProxy_11(
          this,
          Invocation.getter(#platformViewsServiceProxy),
        ),
      ) as _i6.PlatformViewsServiceProxy);
  @override
  bool get displayWithHybridComposition => (super.noSuchMethod(
        Invocation.getter(#displayWithHybridComposition),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  _i3.PlatformWebViewController get controller => (super.noSuchMethod(
        Invocation.getter(#controller),
        returnValue: _FakePlatformWebViewController_12(
          this,
          Invocation.getter(#controller),
        ),
        returnValueForMissingStub: _FakePlatformWebViewController_12(
          this,
          Invocation.getter(#controller),
        ),
      ) as _i3.PlatformWebViewController);
  @override
  _i4.TextDirection get layoutDirection => (super.noSuchMethod(
        Invocation.getter(#layoutDirection),
        returnValue: _i4.TextDirection.rtl,
        returnValueForMissingStub: _i4.TextDirection.rtl,
      ) as _i4.TextDirection);
  @override
  Set<_i12.Factory<_i13.OneSequenceGestureRecognizer>> get gestureRecognizers =>
      (super.noSuchMethod(
        Invocation.getter(#gestureRecognizers),
        returnValue: <_i12.Factory<_i13.OneSequenceGestureRecognizer>>{},
        returnValueForMissingStub: <
            _i12.Factory<_i13.OneSequenceGestureRecognizer>>{},
      ) as Set<_i12.Factory<_i13.OneSequenceGestureRecognizer>>);
}

/// A class which mocks [ExpensiveAndroidViewController].
///
/// See the documentation for Mockito's code generation for more information.
class MockExpensiveAndroidViewController extends _i1.Mock
    implements _i7.ExpensiveAndroidViewController {
  @override
  bool get requiresViewComposition => (super.noSuchMethod(
        Invocation.getter(#requiresViewComposition),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  int get viewId => (super.noSuchMethod(
        Invocation.getter(#viewId),
        returnValue: 0,
        returnValueForMissingStub: 0,
      ) as int);
  @override
  bool get awaitingCreation => (super.noSuchMethod(
        Invocation.getter(#awaitingCreation),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  _i7.PointTransformer get pointTransformer => (super.noSuchMethod(
        Invocation.getter(#pointTransformer),
        returnValue: (_i4.Offset position) => _FakeOffset_6(
          this,
          Invocation.getter(#pointTransformer),
        ),
        returnValueForMissingStub: (_i4.Offset position) => _FakeOffset_6(
          this,
          Invocation.getter(#pointTransformer),
        ),
      ) as _i7.PointTransformer);
  @override
  set pointTransformer(_i7.PointTransformer? transformer) => super.noSuchMethod(
        Invocation.setter(
          #pointTransformer,
          transformer,
        ),
        returnValueForMissingStub: null,
      );
  @override
  bool get isCreated => (super.noSuchMethod(
        Invocation.getter(#isCreated),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  List<_i7.PlatformViewCreatedCallback> get createdCallbacks =>
      (super.noSuchMethod(
        Invocation.getter(#createdCallbacks),
        returnValue: <_i7.PlatformViewCreatedCallback>[],
        returnValueForMissingStub: <_i7.PlatformViewCreatedCallback>[],
      ) as List<_i7.PlatformViewCreatedCallback>);
  @override
  _i9.Future<void> setOffset(_i4.Offset? off) => (super.noSuchMethod(
        Invocation.method(
          #setOffset,
          [off],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> create({
    _i4.Size? size,
    _i4.Offset? position,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #create,
          [],
          {
            #size: size,
            #position: position,
          },
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<_i4.Size> setSize(_i4.Size? size) => (super.noSuchMethod(
        Invocation.method(
          #setSize,
          [size],
        ),
        returnValue: _i9.Future<_i4.Size>.value(_FakeSize_13(
          this,
          Invocation.method(
            #setSize,
            [size],
          ),
        )),
        returnValueForMissingStub: _i9.Future<_i4.Size>.value(_FakeSize_13(
          this,
          Invocation.method(
            #setSize,
            [size],
          ),
        )),
      ) as _i9.Future<_i4.Size>);
  @override
  _i9.Future<void> sendMotionEvent(_i7.AndroidMotionEvent? event) =>
      (super.noSuchMethod(
        Invocation.method(
          #sendMotionEvent,
          [event],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  void addOnPlatformViewCreatedListener(
          _i7.PlatformViewCreatedCallback? listener) =>
      super.noSuchMethod(
        Invocation.method(
          #addOnPlatformViewCreatedListener,
          [listener],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void removeOnPlatformViewCreatedListener(
          _i7.PlatformViewCreatedCallback? listener) =>
      super.noSuchMethod(
        Invocation.method(
          #removeOnPlatformViewCreatedListener,
          [listener],
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i9.Future<void> setLayoutDirection(_i4.TextDirection? layoutDirection) =>
      (super.noSuchMethod(
        Invocation.method(
          #setLayoutDirection,
          [layoutDirection],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> dispatchPointerEvent(_i14.PointerEvent? event) =>
      (super.noSuchMethod(
        Invocation.method(
          #dispatchPointerEvent,
          [event],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> clearFocus() => (super.noSuchMethod(
        Invocation.method(
          #clearFocus,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> dispose() => (super.noSuchMethod(
        Invocation.method(
          #dispose,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
}

/// A class which mocks [FlutterAssetManager].
///
/// See the documentation for Mockito's code generation for more information.
class MockFlutterAssetManager extends _i1.Mock
    implements _i2.FlutterAssetManager {
  @override
  _i9.Future<List<String?>> list(String? path) => (super.noSuchMethod(
        Invocation.method(
          #list,
          [path],
        ),
        returnValue: _i9.Future<List<String?>>.value(<String?>[]),
        returnValueForMissingStub: _i9.Future<List<String?>>.value(<String?>[]),
      ) as _i9.Future<List<String?>>);
  @override
  _i9.Future<String> getAssetFilePathByName(String? name) =>
      (super.noSuchMethod(
        Invocation.method(
          #getAssetFilePathByName,
          [name],
        ),
        returnValue: _i9.Future<String>.value(''),
        returnValueForMissingStub: _i9.Future<String>.value(''),
      ) as _i9.Future<String>);
}

/// A class which mocks [JavaScriptChannel].
///
/// See the documentation for Mockito's code generation for more information.
class MockJavaScriptChannel extends _i1.Mock implements _i2.JavaScriptChannel {
  @override
  String get channelName => (super.noSuchMethod(
        Invocation.getter(#channelName),
        returnValue: '',
        returnValueForMissingStub: '',
      ) as String);
  @override
  void Function(String) get postMessage => (super.noSuchMethod(
        Invocation.getter(#postMessage),
        returnValue: (String message) {},
        returnValueForMissingStub: (String message) {},
      ) as void Function(String));
  @override
  _i2.JavaScriptChannel copy() => (super.noSuchMethod(
        Invocation.method(
          #copy,
          [],
        ),
        returnValue: _FakeJavaScriptChannel_9(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
        returnValueForMissingStub: _FakeJavaScriptChannel_9(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
      ) as _i2.JavaScriptChannel);
}

/// A class which mocks [PlatformViewsServiceProxy].
///
/// See the documentation for Mockito's code generation for more information.
// ignore: must_be_immutable
class MockPlatformViewsServiceProxy extends _i1.Mock
    implements _i6.PlatformViewsServiceProxy {
  @override
  _i7.ExpensiveAndroidViewController initExpensiveAndroidView({
    required int? id,
    required String? viewType,
    required _i4.TextDirection? layoutDirection,
    dynamic creationParams,
    _i7.MessageCodec<dynamic>? creationParamsCodec,
    _i4.VoidCallback? onFocus,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #initExpensiveAndroidView,
          [],
          {
            #id: id,
            #viewType: viewType,
            #layoutDirection: layoutDirection,
            #creationParams: creationParams,
            #creationParamsCodec: creationParamsCodec,
            #onFocus: onFocus,
          },
        ),
        returnValue: _FakeExpensiveAndroidViewController_14(
          this,
          Invocation.method(
            #initExpensiveAndroidView,
            [],
            {
              #id: id,
              #viewType: viewType,
              #layoutDirection: layoutDirection,
              #creationParams: creationParams,
              #creationParamsCodec: creationParamsCodec,
              #onFocus: onFocus,
            },
          ),
        ),
        returnValueForMissingStub: _FakeExpensiveAndroidViewController_14(
          this,
          Invocation.method(
            #initExpensiveAndroidView,
            [],
            {
              #id: id,
              #viewType: viewType,
              #layoutDirection: layoutDirection,
              #creationParams: creationParams,
              #creationParamsCodec: creationParamsCodec,
              #onFocus: onFocus,
            },
          ),
        ),
      ) as _i7.ExpensiveAndroidViewController);
  @override
  _i7.SurfaceAndroidViewController initSurfaceAndroidView({
    required int? id,
    required String? viewType,
    required _i4.TextDirection? layoutDirection,
    dynamic creationParams,
    _i7.MessageCodec<dynamic>? creationParamsCodec,
    _i4.VoidCallback? onFocus,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #initSurfaceAndroidView,
          [],
          {
            #id: id,
            #viewType: viewType,
            #layoutDirection: layoutDirection,
            #creationParams: creationParams,
            #creationParamsCodec: creationParamsCodec,
            #onFocus: onFocus,
          },
        ),
        returnValue: _FakeSurfaceAndroidViewController_15(
          this,
          Invocation.method(
            #initSurfaceAndroidView,
            [],
            {
              #id: id,
              #viewType: viewType,
              #layoutDirection: layoutDirection,
              #creationParams: creationParams,
              #creationParamsCodec: creationParamsCodec,
              #onFocus: onFocus,
            },
          ),
        ),
        returnValueForMissingStub: _FakeSurfaceAndroidViewController_15(
          this,
          Invocation.method(
            #initSurfaceAndroidView,
            [],
            {
              #id: id,
              #viewType: viewType,
              #layoutDirection: layoutDirection,
              #creationParams: creationParams,
              #creationParamsCodec: creationParamsCodec,
              #onFocus: onFocus,
            },
          ),
        ),
      ) as _i7.SurfaceAndroidViewController);
}

/// A class which mocks [SurfaceAndroidViewController].
///
/// See the documentation for Mockito's code generation for more information.
class MockSurfaceAndroidViewController extends _i1.Mock
    implements _i7.SurfaceAndroidViewController {
  @override
  bool get requiresViewComposition => (super.noSuchMethod(
        Invocation.getter(#requiresViewComposition),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  int get viewId => (super.noSuchMethod(
        Invocation.getter(#viewId),
        returnValue: 0,
        returnValueForMissingStub: 0,
      ) as int);
  @override
  bool get awaitingCreation => (super.noSuchMethod(
        Invocation.getter(#awaitingCreation),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  _i7.PointTransformer get pointTransformer => (super.noSuchMethod(
        Invocation.getter(#pointTransformer),
        returnValue: (_i4.Offset position) => _FakeOffset_6(
          this,
          Invocation.getter(#pointTransformer),
        ),
        returnValueForMissingStub: (_i4.Offset position) => _FakeOffset_6(
          this,
          Invocation.getter(#pointTransformer),
        ),
      ) as _i7.PointTransformer);
  @override
  set pointTransformer(_i7.PointTransformer? transformer) => super.noSuchMethod(
        Invocation.setter(
          #pointTransformer,
          transformer,
        ),
        returnValueForMissingStub: null,
      );
  @override
  bool get isCreated => (super.noSuchMethod(
        Invocation.getter(#isCreated),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  List<_i7.PlatformViewCreatedCallback> get createdCallbacks =>
      (super.noSuchMethod(
        Invocation.getter(#createdCallbacks),
        returnValue: <_i7.PlatformViewCreatedCallback>[],
        returnValueForMissingStub: <_i7.PlatformViewCreatedCallback>[],
      ) as List<_i7.PlatformViewCreatedCallback>);
  @override
  _i9.Future<void> setOffset(_i4.Offset? off) => (super.noSuchMethod(
        Invocation.method(
          #setOffset,
          [off],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> create({
    _i4.Size? size,
    _i4.Offset? position,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #create,
          [],
          {
            #size: size,
            #position: position,
          },
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<_i4.Size> setSize(_i4.Size? size) => (super.noSuchMethod(
        Invocation.method(
          #setSize,
          [size],
        ),
        returnValue: _i9.Future<_i4.Size>.value(_FakeSize_13(
          this,
          Invocation.method(
            #setSize,
            [size],
          ),
        )),
        returnValueForMissingStub: _i9.Future<_i4.Size>.value(_FakeSize_13(
          this,
          Invocation.method(
            #setSize,
            [size],
          ),
        )),
      ) as _i9.Future<_i4.Size>);
  @override
  _i9.Future<void> sendMotionEvent(_i7.AndroidMotionEvent? event) =>
      (super.noSuchMethod(
        Invocation.method(
          #sendMotionEvent,
          [event],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  void addOnPlatformViewCreatedListener(
          _i7.PlatformViewCreatedCallback? listener) =>
      super.noSuchMethod(
        Invocation.method(
          #addOnPlatformViewCreatedListener,
          [listener],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void removeOnPlatformViewCreatedListener(
          _i7.PlatformViewCreatedCallback? listener) =>
      super.noSuchMethod(
        Invocation.method(
          #removeOnPlatformViewCreatedListener,
          [listener],
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i9.Future<void> setLayoutDirection(_i4.TextDirection? layoutDirection) =>
      (super.noSuchMethod(
        Invocation.method(
          #setLayoutDirection,
          [layoutDirection],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> dispatchPointerEvent(_i14.PointerEvent? event) =>
      (super.noSuchMethod(
        Invocation.method(
          #dispatchPointerEvent,
          [event],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> clearFocus() => (super.noSuchMethod(
        Invocation.method(
          #clearFocus,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> dispose() => (super.noSuchMethod(
        Invocation.method(
          #dispose,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
}

/// A class which mocks [WebChromeClient].
///
/// See the documentation for Mockito's code generation for more information.
class MockWebChromeClient extends _i1.Mock implements _i2.WebChromeClient {
  @override
  _i2.WebChromeClient copy() => (super.noSuchMethod(
        Invocation.method(
          #copy,
          [],
        ),
        returnValue: _FakeWebChromeClient_0(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
        returnValueForMissingStub: _FakeWebChromeClient_0(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
      ) as _i2.WebChromeClient);
}

/// A class which mocks [WebSettings].
///
/// See the documentation for Mockito's code generation for more information.
class MockWebSettings extends _i1.Mock implements _i2.WebSettings {
  @override
  _i9.Future<void> setDomStorageEnabled(bool? flag) => (super.noSuchMethod(
        Invocation.method(
          #setDomStorageEnabled,
          [flag],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setJavaScriptCanOpenWindowsAutomatically(bool? flag) =>
      (super.noSuchMethod(
        Invocation.method(
          #setJavaScriptCanOpenWindowsAutomatically,
          [flag],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setSupportMultipleWindows(bool? support) =>
      (super.noSuchMethod(
        Invocation.method(
          #setSupportMultipleWindows,
          [support],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setJavaScriptEnabled(bool? flag) => (super.noSuchMethod(
        Invocation.method(
          #setJavaScriptEnabled,
          [flag],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setUserAgentString(String? userAgentString) =>
      (super.noSuchMethod(
        Invocation.method(
          #setUserAgentString,
          [userAgentString],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setMediaPlaybackRequiresUserGesture(bool? require) =>
      (super.noSuchMethod(
        Invocation.method(
          #setMediaPlaybackRequiresUserGesture,
          [require],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setSupportZoom(bool? support) => (super.noSuchMethod(
        Invocation.method(
          #setSupportZoom,
          [support],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setLoadWithOverviewMode(bool? overview) =>
      (super.noSuchMethod(
        Invocation.method(
          #setLoadWithOverviewMode,
          [overview],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setUseWideViewPort(bool? use) => (super.noSuchMethod(
        Invocation.method(
          #setUseWideViewPort,
          [use],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setDisplayZoomControls(bool? enabled) => (super.noSuchMethod(
        Invocation.method(
          #setDisplayZoomControls,
          [enabled],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setBuiltInZoomControls(bool? enabled) => (super.noSuchMethod(
        Invocation.method(
          #setBuiltInZoomControls,
          [enabled],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setAllowFileAccess(bool? enabled) => (super.noSuchMethod(
        Invocation.method(
          #setAllowFileAccess,
          [enabled],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i2.WebSettings copy() => (super.noSuchMethod(
        Invocation.method(
          #copy,
          [],
        ),
        returnValue: _FakeWebSettings_16(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
        returnValueForMissingStub: _FakeWebSettings_16(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
      ) as _i2.WebSettings);
}

/// A class which mocks [WebView].
///
/// See the documentation for Mockito's code generation for more information.
class MockWebView extends _i1.Mock implements _i2.WebView {
  @override
  bool get useHybridComposition => (super.noSuchMethod(
        Invocation.getter(#useHybridComposition),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  _i2.WebSettings get settings => (super.noSuchMethod(
        Invocation.getter(#settings),
        returnValue: _FakeWebSettings_16(
          this,
          Invocation.getter(#settings),
        ),
        returnValueForMissingStub: _FakeWebSettings_16(
          this,
          Invocation.getter(#settings),
        ),
      ) as _i2.WebSettings);
  @override
  _i9.Future<void> loadData({
    required String? data,
    String? mimeType,
    String? encoding,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #loadData,
          [],
          {
            #data: data,
            #mimeType: mimeType,
            #encoding: encoding,
          },
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> loadDataWithBaseUrl({
    String? baseUrl,
    required String? data,
    String? mimeType,
    String? encoding,
    String? historyUrl,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #loadDataWithBaseUrl,
          [],
          {
            #baseUrl: baseUrl,
            #data: data,
            #mimeType: mimeType,
            #encoding: encoding,
            #historyUrl: historyUrl,
          },
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> loadUrl(
    String? url,
    Map<String, String>? headers,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #loadUrl,
          [
            url,
            headers,
          ],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> postUrl(
    String? url,
    _i15.Uint8List? data,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #postUrl,
          [
            url,
            data,
          ],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<String?> getUrl() => (super.noSuchMethod(
        Invocation.method(
          #getUrl,
          [],
        ),
        returnValue: _i9.Future<String?>.value(),
        returnValueForMissingStub: _i9.Future<String?>.value(),
      ) as _i9.Future<String?>);
  @override
  _i9.Future<bool> canGoBack() => (super.noSuchMethod(
        Invocation.method(
          #canGoBack,
          [],
        ),
        returnValue: _i9.Future<bool>.value(false),
        returnValueForMissingStub: _i9.Future<bool>.value(false),
      ) as _i9.Future<bool>);
  @override
  _i9.Future<bool> canGoForward() => (super.noSuchMethod(
        Invocation.method(
          #canGoForward,
          [],
        ),
        returnValue: _i9.Future<bool>.value(false),
        returnValueForMissingStub: _i9.Future<bool>.value(false),
      ) as _i9.Future<bool>);
  @override
  _i9.Future<void> goBack() => (super.noSuchMethod(
        Invocation.method(
          #goBack,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> goForward() => (super.noSuchMethod(
        Invocation.method(
          #goForward,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> reload() => (super.noSuchMethod(
        Invocation.method(
          #reload,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> clearCache(bool? includeDiskFiles) => (super.noSuchMethod(
        Invocation.method(
          #clearCache,
          [includeDiskFiles],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<String?> evaluateJavascript(String? javascriptString) =>
      (super.noSuchMethod(
        Invocation.method(
          #evaluateJavascript,
          [javascriptString],
        ),
        returnValue: _i9.Future<String?>.value(),
        returnValueForMissingStub: _i9.Future<String?>.value(),
      ) as _i9.Future<String?>);
  @override
  _i9.Future<String?> getTitle() => (super.noSuchMethod(
        Invocation.method(
          #getTitle,
          [],
        ),
        returnValue: _i9.Future<String?>.value(),
        returnValueForMissingStub: _i9.Future<String?>.value(),
      ) as _i9.Future<String?>);
  @override
  _i9.Future<void> scrollTo(
    int? x,
    int? y,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #scrollTo,
          [
            x,
            y,
          ],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> scrollBy(
    int? x,
    int? y,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #scrollBy,
          [
            x,
            y,
          ],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<int> getScrollX() => (super.noSuchMethod(
        Invocation.method(
          #getScrollX,
          [],
        ),
        returnValue: _i9.Future<int>.value(0),
        returnValueForMissingStub: _i9.Future<int>.value(0),
      ) as _i9.Future<int>);
  @override
  _i9.Future<int> getScrollY() => (super.noSuchMethod(
        Invocation.method(
          #getScrollY,
          [],
        ),
        returnValue: _i9.Future<int>.value(0),
        returnValueForMissingStub: _i9.Future<int>.value(0),
      ) as _i9.Future<int>);
  @override
  _i9.Future<_i4.Offset> getScrollPosition() => (super.noSuchMethod(
        Invocation.method(
          #getScrollPosition,
          [],
        ),
        returnValue: _i9.Future<_i4.Offset>.value(_FakeOffset_6(
          this,
          Invocation.method(
            #getScrollPosition,
            [],
          ),
        )),
        returnValueForMissingStub: _i9.Future<_i4.Offset>.value(_FakeOffset_6(
          this,
          Invocation.method(
            #getScrollPosition,
            [],
          ),
        )),
      ) as _i9.Future<_i4.Offset>);
  @override
  _i9.Future<void> setWebViewClient(_i2.WebViewClient? webViewClient) =>
      (super.noSuchMethod(
        Invocation.method(
          #setWebViewClient,
          [webViewClient],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> addJavaScriptChannel(
          _i2.JavaScriptChannel? javaScriptChannel) =>
      (super.noSuchMethod(
        Invocation.method(
          #addJavaScriptChannel,
          [javaScriptChannel],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> removeJavaScriptChannel(
          _i2.JavaScriptChannel? javaScriptChannel) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeJavaScriptChannel,
          [javaScriptChannel],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setDownloadListener(_i2.DownloadListener? listener) =>
      (super.noSuchMethod(
        Invocation.method(
          #setDownloadListener,
          [listener],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setWebChromeClient(_i2.WebChromeClient? client) =>
      (super.noSuchMethod(
        Invocation.method(
          #setWebChromeClient,
          [client],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setBackgroundColor(_i4.Color? color) => (super.noSuchMethod(
        Invocation.method(
          #setBackgroundColor,
          [color],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i2.WebView copy() => (super.noSuchMethod(
        Invocation.method(
          #copy,
          [],
        ),
        returnValue: _FakeWebView_7(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
        returnValueForMissingStub: _FakeWebView_7(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
      ) as _i2.WebView);
}

/// A class which mocks [WebViewClient].
///
/// See the documentation for Mockito's code generation for more information.
class MockWebViewClient extends _i1.Mock implements _i2.WebViewClient {
  @override
  _i9.Future<void> setSynchronousReturnValueForShouldOverrideUrlLoading(
          bool? value) =>
      (super.noSuchMethod(
        Invocation.method(
          #setSynchronousReturnValueForShouldOverrideUrlLoading,
          [value],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i2.WebViewClient copy() => (super.noSuchMethod(
        Invocation.method(
          #copy,
          [],
        ),
        returnValue: _FakeWebViewClient_1(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
        returnValueForMissingStub: _FakeWebViewClient_1(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
      ) as _i2.WebViewClient);
}

/// A class which mocks [WebStorage].
///
/// See the documentation for Mockito's code generation for more information.
class MockWebStorage extends _i1.Mock implements _i2.WebStorage {
  @override
  _i9.Future<void> deleteAllData() => (super.noSuchMethod(
        Invocation.method(
          #deleteAllData,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i2.WebStorage copy() => (super.noSuchMethod(
        Invocation.method(
          #copy,
          [],
        ),
        returnValue: _FakeWebStorage_17(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
        returnValueForMissingStub: _FakeWebStorage_17(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
      ) as _i2.WebStorage);
}

/// A class which mocks [InstanceManager].
///
/// See the documentation for Mockito's code generation for more information.
class MockInstanceManager extends _i1.Mock implements _i5.InstanceManager {
  @override
  void Function(int) get onWeakReferenceRemoved => (super.noSuchMethod(
        Invocation.getter(#onWeakReferenceRemoved),
        returnValue: (int __p0) {},
        returnValueForMissingStub: (int __p0) {},
      ) as void Function(int));
  @override
  set onWeakReferenceRemoved(void Function(int)? _onWeakReferenceRemoved) =>
      super.noSuchMethod(
        Invocation.setter(
          #onWeakReferenceRemoved,
          _onWeakReferenceRemoved,
        ),
        returnValueForMissingStub: null,
      );
  @override
  int addDartCreatedInstance(_i5.Copyable? instance) => (super.noSuchMethod(
        Invocation.method(
          #addDartCreatedInstance,
          [instance],
        ),
        returnValue: 0,
        returnValueForMissingStub: 0,
      ) as int);
  @override
  int? removeWeakReference(_i5.Copyable? instance) => (super.noSuchMethod(
        Invocation.method(
          #removeWeakReference,
          [instance],
        ),
        returnValueForMissingStub: null,
      ) as int?);
  @override
  T? remove<T extends _i5.Copyable>(int? identifier) => (super.noSuchMethod(
        Invocation.method(
          #remove,
          [identifier],
        ),
        returnValueForMissingStub: null,
      ) as T?);
  @override
  T? getInstanceWithWeakReference<T extends _i5.Copyable>(int? identifier) =>
      (super.noSuchMethod(
        Invocation.method(
          #getInstanceWithWeakReference,
          [identifier],
        ),
        returnValueForMissingStub: null,
      ) as T?);
  @override
  int? getIdentifier(_i5.Copyable? instance) => (super.noSuchMethod(
        Invocation.method(
          #getIdentifier,
          [instance],
        ),
        returnValueForMissingStub: null,
      ) as int?);
  @override
  void addHostCreatedInstance(
    _i5.Copyable? instance,
    int? identifier,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #addHostCreatedInstance,
          [
            instance,
            identifier,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  bool containsIdentifier(int? identifier) => (super.noSuchMethod(
        Invocation.method(
          #containsIdentifier,
          [identifier],
        ),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
}
