// 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 _i7;
import 'dart:typed_data' as _i12;
import 'dart:ui' as _i4;

import 'package:flutter/foundation.dart' as _i10;
import 'package:flutter/gestures.dart' as _i11;
import 'package:mockito/mockito.dart' as _i1;
import 'package:webview_flutter_android/src/android_navigation_delegate.dart'
    as _i6;
import 'package:webview_flutter_android/src/android_proxy.dart' as _i9;
import 'package:webview_flutter_android/src/android_webview.dart' as _i2;
import 'package:webview_flutter_android/src/android_webview_controller.dart'
    as _i8;
import 'package:webview_flutter_android/src/instance_manager.dart' as _i5;
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 _FakePlatformWebViewController_11 extends _i1.SmartFake
    implements _i3.PlatformWebViewController {
  _FakePlatformWebViewController_11(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

class _FakeWebStorage_13 extends _i1.SmartFake implements _i2.WebStorage {
  _FakeWebStorage_13(
    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 _i6.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
  _i7.Future<void> setOnLoadRequest(_i6.LoadRequestCallback? onLoadRequest) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnLoadRequest,
          [onLoadRequest],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setOnNavigationRequest(
          _i3.NavigationRequestCallback? onNavigationRequest) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnNavigationRequest,
          [onNavigationRequest],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setOnPageStarted(_i3.PageEventCallback? onPageStarted) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnPageStarted,
          [onPageStarted],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setOnPageFinished(_i3.PageEventCallback? onPageFinished) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnPageFinished,
          [onPageFinished],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setOnProgress(_i3.ProgressCallback? onProgress) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnProgress,
          [onProgress],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setOnWebResourceError(
          _i3.WebResourceErrorCallback? onWebResourceError) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnWebResourceError,
          [onWebResourceError],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
}

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

/// A class which mocks [AndroidWebViewProxy].
///
/// See the documentation for Mockito's code generation for more information.
class MockAndroidWebViewProxy extends _i1.Mock
    implements _i9.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
  _i7.Future<void> setWebContentsDebuggingEnabled(bool? enabled) =>
      (super.noSuchMethod(
        Invocation.method(
          #setWebContentsDebuggingEnabled,
          [enabled],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.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 _i8.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
  _i3.PlatformWebViewController get controller => (super.noSuchMethod(
        Invocation.getter(#controller),
        returnValue: _FakePlatformWebViewController_11(
          this,
          Invocation.getter(#controller),
        ),
        returnValueForMissingStub: _FakePlatformWebViewController_11(
          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<_i10.Factory<_i11.OneSequenceGestureRecognizer>> get gestureRecognizers =>
      (super.noSuchMethod(
        Invocation.getter(#gestureRecognizers),
        returnValue: <_i10.Factory<_i11.OneSequenceGestureRecognizer>>{},
        returnValueForMissingStub: <
            _i10.Factory<_i11.OneSequenceGestureRecognizer>>{},
      ) as Set<_i10.Factory<_i11.OneSequenceGestureRecognizer>>);
}

/// 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
  _i7.Future<List<String?>> list(String? path) => (super.noSuchMethod(
        Invocation.method(
          #list,
          [path],
        ),
        returnValue: _i7.Future<List<String?>>.value(<String?>[]),
        returnValueForMissingStub: _i7.Future<List<String?>>.value(<String?>[]),
      ) as _i7.Future<List<String?>>);
  @override
  _i7.Future<String> getAssetFilePathByName(String? name) =>
      (super.noSuchMethod(
        Invocation.method(
          #getAssetFilePathByName,
          [name],
        ),
        returnValue: _i7.Future<String>.value(''),
        returnValueForMissingStub: _i7.Future<String>.value(''),
      ) as _i7.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 [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
  _i7.Future<void> setDomStorageEnabled(bool? flag) => (super.noSuchMethod(
        Invocation.method(
          #setDomStorageEnabled,
          [flag],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setJavaScriptCanOpenWindowsAutomatically(bool? flag) =>
      (super.noSuchMethod(
        Invocation.method(
          #setJavaScriptCanOpenWindowsAutomatically,
          [flag],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setSupportMultipleWindows(bool? support) =>
      (super.noSuchMethod(
        Invocation.method(
          #setSupportMultipleWindows,
          [support],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setJavaScriptEnabled(bool? flag) => (super.noSuchMethod(
        Invocation.method(
          #setJavaScriptEnabled,
          [flag],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setUserAgentString(String? userAgentString) =>
      (super.noSuchMethod(
        Invocation.method(
          #setUserAgentString,
          [userAgentString],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setMediaPlaybackRequiresUserGesture(bool? require) =>
      (super.noSuchMethod(
        Invocation.method(
          #setMediaPlaybackRequiresUserGesture,
          [require],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setSupportZoom(bool? support) => (super.noSuchMethod(
        Invocation.method(
          #setSupportZoom,
          [support],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setLoadWithOverviewMode(bool? overview) =>
      (super.noSuchMethod(
        Invocation.method(
          #setLoadWithOverviewMode,
          [overview],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setUseWideViewPort(bool? use) => (super.noSuchMethod(
        Invocation.method(
          #setUseWideViewPort,
          [use],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setDisplayZoomControls(bool? enabled) => (super.noSuchMethod(
        Invocation.method(
          #setDisplayZoomControls,
          [enabled],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setBuiltInZoomControls(bool? enabled) => (super.noSuchMethod(
        Invocation.method(
          #setBuiltInZoomControls,
          [enabled],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setAllowFileAccess(bool? enabled) => (super.noSuchMethod(
        Invocation.method(
          #setAllowFileAccess,
          [enabled],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i2.WebSettings copy() => (super.noSuchMethod(
        Invocation.method(
          #copy,
          [],
        ),
        returnValue: _FakeWebSettings_12(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
        returnValueForMissingStub: _FakeWebSettings_12(
          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_12(
          this,
          Invocation.getter(#settings),
        ),
        returnValueForMissingStub: _FakeWebSettings_12(
          this,
          Invocation.getter(#settings),
        ),
      ) as _i2.WebSettings);
  @override
  _i7.Future<void> loadData({
    required String? data,
    String? mimeType,
    String? encoding,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #loadData,
          [],
          {
            #data: data,
            #mimeType: mimeType,
            #encoding: encoding,
          },
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.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: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> loadUrl(
    String? url,
    Map<String, String>? headers,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #loadUrl,
          [
            url,
            headers,
          ],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> postUrl(
    String? url,
    _i12.Uint8List? data,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #postUrl,
          [
            url,
            data,
          ],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<String?> getUrl() => (super.noSuchMethod(
        Invocation.method(
          #getUrl,
          [],
        ),
        returnValue: _i7.Future<String?>.value(),
        returnValueForMissingStub: _i7.Future<String?>.value(),
      ) as _i7.Future<String?>);
  @override
  _i7.Future<bool> canGoBack() => (super.noSuchMethod(
        Invocation.method(
          #canGoBack,
          [],
        ),
        returnValue: _i7.Future<bool>.value(false),
        returnValueForMissingStub: _i7.Future<bool>.value(false),
      ) as _i7.Future<bool>);
  @override
  _i7.Future<bool> canGoForward() => (super.noSuchMethod(
        Invocation.method(
          #canGoForward,
          [],
        ),
        returnValue: _i7.Future<bool>.value(false),
        returnValueForMissingStub: _i7.Future<bool>.value(false),
      ) as _i7.Future<bool>);
  @override
  _i7.Future<void> goBack() => (super.noSuchMethod(
        Invocation.method(
          #goBack,
          [],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> goForward() => (super.noSuchMethod(
        Invocation.method(
          #goForward,
          [],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> reload() => (super.noSuchMethod(
        Invocation.method(
          #reload,
          [],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> clearCache(bool? includeDiskFiles) => (super.noSuchMethod(
        Invocation.method(
          #clearCache,
          [includeDiskFiles],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<String?> evaluateJavascript(String? javascriptString) =>
      (super.noSuchMethod(
        Invocation.method(
          #evaluateJavascript,
          [javascriptString],
        ),
        returnValue: _i7.Future<String?>.value(),
        returnValueForMissingStub: _i7.Future<String?>.value(),
      ) as _i7.Future<String?>);
  @override
  _i7.Future<String?> getTitle() => (super.noSuchMethod(
        Invocation.method(
          #getTitle,
          [],
        ),
        returnValue: _i7.Future<String?>.value(),
        returnValueForMissingStub: _i7.Future<String?>.value(),
      ) as _i7.Future<String?>);
  @override
  _i7.Future<void> scrollTo(
    int? x,
    int? y,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #scrollTo,
          [
            x,
            y,
          ],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> scrollBy(
    int? x,
    int? y,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #scrollBy,
          [
            x,
            y,
          ],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<int> getScrollX() => (super.noSuchMethod(
        Invocation.method(
          #getScrollX,
          [],
        ),
        returnValue: _i7.Future<int>.value(0),
        returnValueForMissingStub: _i7.Future<int>.value(0),
      ) as _i7.Future<int>);
  @override
  _i7.Future<int> getScrollY() => (super.noSuchMethod(
        Invocation.method(
          #getScrollY,
          [],
        ),
        returnValue: _i7.Future<int>.value(0),
        returnValueForMissingStub: _i7.Future<int>.value(0),
      ) as _i7.Future<int>);
  @override
  _i7.Future<_i4.Offset> getScrollPosition() => (super.noSuchMethod(
        Invocation.method(
          #getScrollPosition,
          [],
        ),
        returnValue: _i7.Future<_i4.Offset>.value(_FakeOffset_6(
          this,
          Invocation.method(
            #getScrollPosition,
            [],
          ),
        )),
        returnValueForMissingStub: _i7.Future<_i4.Offset>.value(_FakeOffset_6(
          this,
          Invocation.method(
            #getScrollPosition,
            [],
          ),
        )),
      ) as _i7.Future<_i4.Offset>);
  @override
  _i7.Future<void> setWebViewClient(_i2.WebViewClient? webViewClient) =>
      (super.noSuchMethod(
        Invocation.method(
          #setWebViewClient,
          [webViewClient],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> addJavaScriptChannel(
          _i2.JavaScriptChannel? javaScriptChannel) =>
      (super.noSuchMethod(
        Invocation.method(
          #addJavaScriptChannel,
          [javaScriptChannel],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> removeJavaScriptChannel(
          _i2.JavaScriptChannel? javaScriptChannel) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeJavaScriptChannel,
          [javaScriptChannel],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setDownloadListener(_i2.DownloadListener? listener) =>
      (super.noSuchMethod(
        Invocation.method(
          #setDownloadListener,
          [listener],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setWebChromeClient(_i2.WebChromeClient? client) =>
      (super.noSuchMethod(
        Invocation.method(
          #setWebChromeClient,
          [client],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i7.Future<void> setBackgroundColor(_i4.Color? color) => (super.noSuchMethod(
        Invocation.method(
          #setBackgroundColor,
          [color],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.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
  _i7.Future<void> setSynchronousReturnValueForShouldOverrideUrlLoading(
          bool? value) =>
      (super.noSuchMethod(
        Invocation.method(
          #setSynchronousReturnValueForShouldOverrideUrlLoading,
          [value],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.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
  _i7.Future<void> deleteAllData() => (super.noSuchMethod(
        Invocation.method(
          #deleteAllData,
          [],
        ),
        returnValue: _i7.Future<void>.value(),
        returnValueForMissingStub: _i7.Future<void>.value(),
      ) as _i7.Future<void>);
  @override
  _i2.WebStorage copy() => (super.noSuchMethod(
        Invocation.method(
          #copy,
          [],
        ),
        returnValue: _FakeWebStorage_13(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
        returnValueForMissingStub: _FakeWebStorage_13(
          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);
}
